<?php

namespace app\cxinv\controller;

use app\cxinv\model\FinancialTz;
use app\cxinv\model\ProductFz;
use app\cxinv\model\TzProduct;
use think\App;

class Adjust extends Base
{
    public function __construct(App $app)
    {
        parent::__construct($app);
        $this->model = new FinancialTz();
    }

    public function list()
    {
      $params = $this->request->param(["goodNo"=>"","goodType"=>"","status"=>"","start"=>"","end"=>"",'seller_code'=>"",
          "page"=>1,"size"=>15],"post","trim");
      $where=[];
      if($params['goodNo']!='') $where[]=['manager.goodNo','like','%'.$params['goodNo'].'%'];
      if($params['goodType']!='') $where[]=['manager.goodType','=',$params['goodType']];
      if($params['status']!='') $where[]=['financial_tz.status','=',$params['status']];
      if($params['start']!='') $where[]=['financial_tz.create_time','>=',startTime($params['start'])];
      if($params['end']!='') $where[]=['financial_tz.create_time','<=',startTime($params['end'])];
      if($params['seller_code']!='') $where[]=['manager.seller_code','=',$params['seller_code']];
      $list = $this->model
          ->with(["ProductTz"=>["Product"]])
          ->withJoin("Manager", "LEFT")
          ->where($where)
          ->order("financial_tz.id", "desc")
          ->paginate(['page'=>$params['page'],'list_rows'=>$params['size']]);
      return success("获取成功",["list"=>$list->items(),"count"=>$list->total()]);
    }

    public function info()
    {
        $ids = $this->request->param("id","0","int");
        if($ids==0) return error("参数错误");
        $info = $this->model
            ->with(["ProductTz"=>["Product"],"Manager"=>['ProductRela'=>['Product']]])
            ->findOrEmpty($ids);
        if($info->isEmpty()) return error("信息不存在");
        return success("获取成功",$info);
    }

    public function status()
    {
        $params = $this->request->param(["id","status","idArr"=>[],'fz_date'=>"","checkFee"=>"","isAddCheck"=>0],"post","trim");
        $validate = $this->validate($params,[
            'id|计提单ID'=>'require|number',
            'status|状态'=>'require|number|in:1,2,3,4',
            'fz_date|调整日期'=>'requireIf:status,2|max:255',
            'idArr|关联商品id'=>'requireIf:status,2|array',
            'checkFee|调整金额'=>'requireIf:status,2|float',
            'isAddCheck|是否添加至调整单'=>'number|in:0,1',
        ]);
        if($validate!==true) return error($validate);

        $info = $this->model->with(['Manager'])->findOrEmpty($params['id']);
        if($info->isEmpty()) return error("计提单信息不存在");
        if($info->status==2) return error("已审核,无法修改");
        $manager = $info->Manager;
        $companyCode= in_array($manager['type'],['2','4'])?$manager['seller_code']:$manager['buyer_code'];
        $fz_date = ProductFz::where(['company_code'=>$companyCode,'fz_date'=>$params['fz_date']])->findOrEmpty();
        if($fz_date->isEmpty()) return error("请先生成{$params['fz_date']}封账数据");
        if($fz_date->status!=0) return error("{$params['fz_date']}封账状态不可用");
        if($params['status']==2 && !empty($params['idArr'])){
            foreach ($params['idArr'] as $k=>$v){
                $vali=$this->validate($v,[
                    'id|商品id'=>'require|number',
                    'num|数量'=>'require|float',
                    'subunit_price|不含税单价'=>'require|float',
                    'unit_price|含税单价'=>'require|float',
                ]);
                if($vali!==true) return error($vali);
                $params['idArr'][$k]['ktCode']=$info->ktCode;
                $params['idArr'][$k]['type']=2;
                $params['idArr'][$k]['checkUid']=$this->uid;
                $params['idArr'][$k]['checkUname']=$this->uname;
                $params['idArr'][$k]['product_id']=$v['id'];
                unset($params['idArr'][$k]['id']);
            }
        }
        $info->status=$params['status'];
        $info->check_fee=$params['checkFee'];
        $info->is_checkOrder=$params['isAddCheck'];
        $info->fz_date=$params['fz_date'];
        $info->checkUid=$this->uid;
        $info->checkUname=$this->uname;
        $this->model->startTrans();
        try{
            $save=$info->save();
            if($save===false) throw new \Exception("保存失败");
            if($params['status']==2 && !empty($params['idArr'])){
                $key=(new TzProduct)->saveAll($params['idArr']);
                if($key->isEmpty()) throw new \Exception("保存商品信息失败");
            }
            $this->model->commit();
        }catch (\Exception $e){
            $this->model->rollback();
            return error($e->getMessage());
        }
        return success("操作成功");
    }

}