<?php
namespace app\common\model;

use app\hander\HelpHander;
use think\Db;
use think\Exception;
use think\Model;

class AssetDisposal extends Model
{
    public function advancedStartAssetDisposal($id,$orgId,$userId,$formJson,$extra){
        $formJson = json_decode($formJson,true);
        $data = [
            'org_id' => $orgId,
            'user_id' => $userId,
            'apply_id' => $id,
            'dep_id' => $extra['depId'],
            'create_time' => date('Y-m-d H:i:s'),
            'status' => 0,
        ];
        $items = [];
        foreach ($formJson as $k=>$v){
            if($v['componentName'] == 'ddassetdisposalfield'){
                foreach ($v['components'] as $key=>$val){
                    switch ($val['idx']){
                        case '0':
                            $items = json_decode($val['values'],true);
                            break;
                        case '1':
                            $data['remark'] = $val['values'];
                            break;
                    }
                }
                break;
            }
        }
        $amount = 0;
        foreach ($items as $k=>$v){
            $amount += $v['snums']*$v['price'];
        }
        $data['amount'] = $amount;
        $receiveId = Db::name('asset_disposal')->insertGetId($data);

        $sitems = [];
        foreach ($items as $k=>$v){
            $sitems[] = [
                'disposal_id' => $receiveId,
                'items_id' => $v['id'],
                'nums' => $v['snums']
            ];
        }

        $count = Db::name('asset_disposal_items')->insertAll($sitems);
        if($count != count($sitems)){
            return false;
        }

        return true;
    }

    public function advancedEndAssetDisposal($id,$orgId,$userId,$formJson){
        $data = [
            'update_time' => date('Y-m-d H:i:s'),
            'status' => 1
        ];

        $info = Db::name('asset_disposal')->where('apply_id',$id)->find();
        if(!$info || $info['status'] != 0){
            return false;
        }

        $ret = Db::name('asset_disposal')->where('apply_id',$id)->update($data);
        if(!$ret){
            return false;
        }

        // 删除使用者和使用部门
        $itemsids = Db::name('asset_disposal_items')->where('disposal_id',$info['id'])->column('items_id');
        Db::name('asset_items')->where('id','in',$itemsids)->update([
            'enable' => 5,
            'update_time' => date('Y-m-d H:i:s')
        ]);

        return $ret?true:false;
    }

    public function advancedDisagreeAssetDisposal($id){
        $data = [
            'update_time' => date('Y-m-d H:i:s'),
            'status' => 2
        ];
        $ret = Db::name('asset_disposal')->where('apply_id',$id)->update($data);
        if(!$ret){
            return false;
        }

        return true;
    }

    public function lists($page,$size,$title,$start,$end,$orgId){
        $map[] = ['or.org_id','=',$orgId];
        if($title){
            $map[] = ['ui.name','like','%'.$title.'%'];
        }
        if($start&&$end){
            $map[] = ['or.create_time','egt',$start];
            $map[] = ['or.create_time','elt',$end];
        }
        $lists = Db::name('asset_disposal')
            ->alias('or')
            ->join('user_info ui','ui.user_id = or.agent_user_id')
            ->field('or.*,ui.name as user_name')
            ->where($map)
            ->page($page,$size)
            ->order('or.id desc')
            ->select();
        $lists = $lists?$lists:[];
        foreach ($lists as $k=>$v){
            $lists[$k]['agent_dep_name'] = Db::name('dep')->where('id',$v['agent_dep_id'])->value('name');
            $lists[$k]['way_name'] = Db::name('asset_way')->where('id',$v['way_id'])->value('title');
        }

        $total = Db::name('asset_disposal')
            ->alias('or')
            ->join('user_info ui','ui.user_id = or.agent_user_id')
            ->where($map)->count();
        $data = [
            'total' => $total,
            'list' => $lists
        ];
        return $data;
    }

    public function add(){
        $data = [
            'id' => input('id/d',0),
            'org_id' => input('orgId/d',0),
            'agent_user_id' => input('agentUserId/d',0),
            'agent_dep_id' => input('agentDepId/d',0),
            'way_id' => input('wayId/d',0),
            'reason' => input('reason','','trim'),
            'result' => input('result','','trim'),
            'remark' => input('remark','','trim'),
            'files' => input('files','','trim'),
            'items' => input('items','','trim')
        ];
        $result = validate('AssetDisposal')->check($data,[],'');
        if(true !== $result){
            HelpHander::error(validate('AssetDisposal')->getError());
        }
        $id = $data['id'];
        unset($data['id']);
        if($id > 0){
            $data['update_time'] = date('Y-m-d H:i:s');
            unset($data['items']);
            $ret = $this->allowField(true)->save($data,['id'=>$id]);
            if(!$ret){
                HelpHander::error('操作失败');
            }
        }else{
            $data['create_time'] = date('Y-m-d H:i:s');
            Db::startTrans();
            try{
                $data['sn'] = $this->getSn($data['org_id']);
                $items = json_decode($data['items'],true);
                unset($data['items']);

                $receiveId = Db::name('AssetDisposal')->insertGetId($data);
                if(!$receiveId){
                    \exception('操作失败');
                }

                $d = [];
                $itemids = [];
                foreach ($items as $k=>$v){
                    $iteminfo = Db::name('asset_items')
                        ->where('id',$v['id'])
                        ->field('id,user_id,dep_id')
                        ->find();
                    $d[] = [
                        'disposal_id' => $receiveId,
                        'items_id' => $v['id'],
                        'user_id' => $iteminfo['user_id'],
                        'dep_id' => $iteminfo['dep_id'],
                    ];
                    $itemids[] = $v['id'];
                }

                $res = Db::name('asset_disposal_items')->insertAll($d);
                if($res != count($d)){
                    \exception('操作失败');
                }

                $sd = [
                    'enable' => 5,
                    'update_time' => date('Y-m-d H:i:s')
                ];

                $res = Db::name('asset_items')->where('id','in',$itemids)->update($sd);
                if($res != count($itemids)){
                    \exception('操作失败');
                }

                Db::commit();
            }catch (Exception $e){
                Db::rollback();
                HelpHander::error($e->getMessage());
            }
        }

        return true;
    }

    public function getSn($orgId){
        $max = Db::name('asset_disposal')
            ->where('org_id',$orgId)
            ->where('create_time','>=',date('Y-m-d').' 00:00:00')
            ->order('id desc')
            ->value('sn');
        $maxinit = $max?$max:date('Ymd').'0000';
        return $maxinit + 1;
    }

    public function info($id){
        $info = $this->where('id',$id)->find();
        if(!$info){
            HelpHander::error('数据不存在');
        }
        $data = $info->toArray();
        $data['agentDepName'] = Db::name('dep')->where('id',$info['agent_dep_id'])->value('name');
        $data['agentUserName'] = Db::name('user_info')->where('user_id',$info['agent_user_id'])->value('name');
        $data['way_name'] = Db::name('asset_way')->where('id',$info['way_id'])->value('title');
        $items = Db::name('asset_disposal_items')
            ->alias('ari')
            ->join('asset_items ai','ai.id = ari.items_id')
            ->join('asset_unit au','au.id = ai.unit_id')
            ->where('ari.disposal_id',$id)
            ->field('ai.*,au.title as unitName')
            ->select();
        $data['items'] = $items?$items:[];

        $items = Db::name('asset_disposal_items')
            ->alias('ari')
            ->join('asset_items ai','ai.id = ari.items_id')
            ->join('asset_unit au','au.id = ai.unit_id')
            ->where('ari.disposal_id',$id)
            ->field('ai.*,au.title as unitName,ari.user_id as old_user_id,ari.dep_id as old_dep_id')
            ->select();
        foreach ($items as $k=>$v){
            $items[$k]['userName'] = Db::name('user_info')->where('user_id',$v['old_user_id'])->value('name');
            $items[$k]['depName'] = Db::name('dep')->where('id',$v['old_dep_id'])->value('name');
        }
        $data['items'] = $items?$items:[];

        return $data;
    }

}