<?php
/**
 * Created by 2020/4/23.
 * User: Joneq
 * Info: 2020/4/23
 * Time: 上午10:57
 */

namespace App\Http\Model\Logic;

use App\Http\Controllers\Controller;
use App\Http\Model\CustomerModel;
use App\Http\Model\GoodsModel;
use App\Http\Model\OutStoreDetailModel;
use App\Http\Model\OutStoreModel;
use App\Http\Model\PickTaskDetailModel;
use App\Http\Model\PickTaskModel;
use App\Http\Model\StockModel;
use App\Http\Model\StoreModel;
use Illuminate\Support\Facades\DB;
use ScmWmsCommon\SnModel;

class OutStoreLogic
{


    static public $statusCn = [
        '1'=>'未发货',
        '2'=>'部分发货',
        '3'=>'已发货',
    ];

    static public $receiveStatusCn = [
        '1'=>'未收货',
        '2'=>'部分收货',
        '3'=>'全部收货',
    ];

    static public function getOutStoreStatus($status)
    {
        return array_get(self::$statusCn,$status,'状态异常!!');
    }

    static public function getReceiveStatus($status)
    {
        return array_get(self::$receiveStatusCn,$status,'状态异常!!');
    }


    static public function handleInsertData($data)
    {
        unset($data['unique']);

        CommonLogic::checkEmpty(['erp_client_sn','erp_store_sn'],$data);

        //判断该入库单号是否拥有
        if (!empty(OutStoreModel::where('warehousing_sn',$data['warehousing_sn'])->value('out_store_id'))){
            Controller::$level = 5;Controller::$errCode = 2;
            throw new \Exception('该入仓单号已经存在'.$data['warehousing_sn']);
        }

        //判断入库详情是否为空
        if(!isset($data['out_store_detail']) || empty($data['out_store_detail'])){
            Controller::$level = 5;
            Controller::$errCode = 3;
            throw new \Exception('入库详情为空');
        }

        if (empty($data['customer_id'] = CustomerModel::where('erp_client_sn',$data['erp_client_sn'])->value('customer_id'))){
            Controller::$level = 5;
            Controller::$errCode = 4;
            throw new \Exception('erp_client_sn 查询不到customer_id');
        }

        if (empty($data['store_id'] = StoreModel::where('erp_store_sn',$data['erp_store_sn'])->value('store_id'))){
            Controller::$level = 5;
            Controller::$errCode = 4;
            throw new \Exception('erp_store_sn 查询不到store_id');
        }

        $data['out_store_sn'] = self::getOutStoreSn();
        $data['add_time'] = time();
        unset($data['unique']);
        unset($data['erp_client_sn']);
        unset($data['erp_store_sn']);
        return $data;
    }


    //处理出库详情里面的插入数据
    static public function handleOutStoreDetailInsertData($value,$outStoreData)
    {
        //获取erp的goodsid
        if (!isset($value['erp_goods_id']) || empty($goodsInfo = GoodsModel::where('erp_goods_id',$value['erp_goods_id'])->first())){
            Controller::$level = 5;
            Controller::$errCode = 4;
            throw new \Exception('erp_goods_id 查询不到商品id');
        }
        unset($value['erp_goods_id']);


        //获取erp的goodsid
        if (empty($stockInfo = StockModel::where('goods_id',$goodsInfo->goods_id)->where('warehousing_sn',$outStoreData['warehousing_sn'])->orderBy('stock_id','desc')->first())){
            Controller::$level = 5;
            Controller::$errCode = 4;
            throw new \Exception('goods_id查询不到商品库存信息'.$goodsInfo->goods_id);
        }

        $value['goods_id'] = $goodsInfo->goods_id;
        $value['goods_name'] = $goodsInfo->goods_name;
        $value['brand_id'] = $goodsInfo->brand_id;


        //TODO 定位数据获取
        $value['box_id'] = $stockInfo->box_id;
        $value['pallet_id'] = $stockInfo->pallet_id;
        $value['location_id'] = $stockInfo->location_id;

        $value['country_code'] = $stockInfo->country_id;
        $value['batch'] = $stockInfo->batch;
        $value['dc'] = $stockInfo->dc;


        //获取入库单主单数据
        $value['out_store_id'] = $outStoreData['out_store_id'];
        $value['add_time'] = $outStoreData['add_time'];
        $value['warehousing_sn'] = $outStoreData['warehousing_sn'];
        $value['out_store_sn'] = $outStoreData['out_store_sn'];
        $value['is_apply_customs'] = $outStoreData['is_apply_customs'];
        $value['store_id'] = $outStoreData['store_id'];

        unset($value['brand_name']);
        return $value;
    }



    //增加数据
    static public function insertData($insertData)
    {

        DB::beginTransaction();

        try{

            //创建出库单已经出库任务
            $detailDaata = $insertData['out_store_detail'];
            unset($insertData['out_store_detail']);

            //新增出库单
            $outStoreId = $insertData['out_store_id']  = OutStoreModel::insertGetId($insertData);
            //新增出库任务

            //判断是否是报关单,是报关单就不生成
            if (empty($insertData['is_apply_customs'])){
                $pickTaskId = PickTaskModel::insertGetId([
                    'pick_task_sn'=>PickTaskLogic::getPickTaskSn(),'warehousing_sn'=>$insertData['warehousing_sn'],
                    'out_store_id'=>$outStoreId,'store_id'=>$insertData['store_id'],
                    'add_time'=>$insertData['add_time']
                ]);
            }else{
                $pickTaskId = 0;
            }



            //判断是否商检,只要一个是就就是
            $isInsp = 0;
            $pickTaskDetailIdArr = [];
            //新增出库单详情
            foreach ($detailDaata as $value){


                if ($value['is_insp']){
                    $isInsp = 1;
                }

                $value = array_merge(self::handleOutStoreDetailInsertData($value,$insertData),['pick_task_id'=>$pickTaskId]);
                $outStoreDetailId = OutStoreDetailModel::insertGetId($value);

                //is_apply_customs报关任务默认隐藏
                $pickTaskData = PickTaskLogic::handleInsertData([
                    'out_store_id'=>$outStoreId,'out_store_detail_id'=>$outStoreDetailId,'store_id'=>$insertData['store_id'],
                    'pick_task_id'=>$pickTaskId,'is_show'=>empty($insertData['is_apply_customs'])?1:0
                ],$value);

                foreach ($pickTaskData as $v){
                    $pickTaskDetailIdArr[] = PickTaskDetailModel::insertGetId($v);
                }
            }

            //一个是商检就这个出库单都是商检
            if ($isInsp){
                OutStoreModel::where('out_store_id',$outStoreId)->update(['is_insp'=>1]);
            }

            PickTaskLogic::changePickRemark(['pick_task_detail_id_arr'=>$pickTaskDetailIdArr]);

            DB::commit();
        }catch (\Exception $exception){
            DB::rollBack();
            Controller::$level = 5;
            Controller::$errCode = 5;
            throw new \Exception('插入出库事物错误数据为::: '.$exception->getMessage());
        }
        return [];
    }


    /*
     * 删除出库通知单
     * param1 warehousing_sn
     * 1 根据参数1查找出出库单ID
     * 2 根据出库单ID删除对应的出库单明细
     * where
     *      如果生成了拣货任务就不删除
     */
    public function deleteOutStore($data)
    {
        $outStoreInfo = OutStoreModel::where('warehousing_sn',$data['warehousing_sn'])->where('is_del',0)->select('out_store_id')->first();

        if (empty($outStoreInfo)){
            throw new \Exception('该入仓号号不存在');
        }

        if (PickTaskDetailModel::where('is_del',0)->where('is_show',1)->where('out_store_id',$outStoreInfo->out_store_id)->value('pick_task_detail_id')){
            throw new \Exception('仓库已收货或部份收货,不可删除');
        }

        OutStoreModel::where('out_store_id',$outStoreInfo->out_store_id)->where('is_del',0)->update(['is_del'=>1]);
        OutStoreDetailModel::where('out_store_id',$outStoreInfo->out_store_id)->where('is_del',0)->update(['is_del'=>1]);
        PickTaskDetailModel::where('out_store_id',$outStoreInfo->out_store_id)->where('is_del',0)->update(['is_del'=>1]);
        return [];
    }



    //获取出库仓号
    static public function getOutStoreSn()
    {
        //CK+年后两位+月两位+日两位+10000
//        $beginTime = strtotime(date('Y-m-d'));
//        $endTime = $beginTime +86400;
//
//        $todayNum = $outStoreSn = OutStoreModel::where('add_time','>=',$beginTime)->where('add_time','<=',$endTime)->count('out_store_id');
//
//        if (empty($todayNum)){
//            $todayNum = 100001;
//        }else{
//            $todayNum += 100001;
//        }
//
//        return 'CK'.substr(date('Ymd'),2,6).$todayNum;
        return (new SnModel())->generateNumber('out_store');
    }


}