<?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'); } }