| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632 | 
							- <?php
 
- namespace App\Service;
 
- use App\Model\Construction;
 
- use App\Model\ConstructionProductInfo;
 
- use App\Model\InOutRecord;
 
- use App\Model\InvoiceOrder;
 
- use App\Model\InvoiceOrderInfo;
 
- use App\Model\KqLeave;
 
- use App\Model\KqOvertime;
 
- use App\Model\OrderOperation;
 
- use App\Model\PaymentReceipt;
 
- use App\Model\PaymentReceiptInfo;
 
- use App\Model\ProductInventory;
 
- use App\Model\ProductInventorySet;
 
- use App\Model\PurchaseOrder;
 
- use App\Model\PurchaseOrderInfo;
 
- use App\Model\PurchaseOrderSpecial;
 
- use App\Model\PurchaseOrderSpecialInfo;
 
- use App\Model\ReturnExchangeOrder;
 
- use App\Model\ReturnExchangeOrderProductInfo;
 
- use App\Model\SalesOrder;
 
- use App\Model\SalesOrderInfo;
 
- use App\Model\SalesOrderOtherFee;
 
- use App\Model\SalesOrderProductInfo;
 
- use App\Model\SeeRange;
 
- use App\Model\SportsBag;
 
- use App\Model\Storehouse;
 
- use App\Model\Supplier;
 
- use App\Service\OaService;
 
- use Illuminate\Support\Facades\DB;
 
- class CheckService extends Service
 
- {
 
-     //特殊操作数
 
-     const minus_one = -1;//跳出库存流水
 
-     //审批操作对应的数值
 
-     const one = 1;
 
-     const two = 2;
 
-     const three = 3;
 
-     const four = 4;
 
-     const five = 5;
 
-     const six = 6;
 
-     const seven = 7;
 
-     const eight = 8;
 
-     const nine = 9;
 
-     const ten  = 10;
 
-     const eve  = 11;
 
-     const twl  = 12;
 
-     //中文对照
 
-     public $map = [
 
-         self::one => '请假申请',
 
-         self::two => '加班申请',
 
-         self::three => '',
 
-         self::four => '',
 
-         self::five => '',
 
-         self::six => '',
 
-         self::seven => '',
 
-         self::eight => '',
 
-         self::nine => '',
 
-         self::ten => '',
 
-         self::eve => '',
 
-         self::twl => '',
 
-     ];
 
-     //入库操作
 
-     public static $in_opt = [
 
-     ];
 
-     //出库操作
 
-     public static $out_opt = [
 
-     ];
 
-     const TYPE_ONE = 1;//通过
 
-     const TYPE_TWO = 2;//不通过
 
-     const TYPE_THREE = 3;//通过后驳回
 
-     //改为待审核状态
 
-     public static $opt_1case = [
 
-         self::one => 'leave',
 
-         self::two => 'overtime',
 
-     ];
 
-     //改为最终状态
 
-     public static $opt_case = [
 
-         self::one => 'leave_final',
 
-         self::two => 'overtime_final',
 
-     ];
 
-     //审核通过后 弃审
 
-     public static $opt_case_reject = [
 
-     ];
 
-     //直接完成
 
-     public static $finished = [
 
-     ];
 
-     //单据库存流水
 
-     public static $record = [
 
-     ];
 
-     //审核通过后 驳回 产生流水
 
-     public static $reject_record = [
 
-     ];
 
-     //旅程日志 同意
 
-     public static $operation_order = [
 
-         self::eight => OrderOperation::three,
 
-     ];
 
-     //旅程日志 驳回
 
-     public static $operation_order_reject = [
 
-         self::four => OrderOperation::four,
 
-     ];
 
-     //以下具体方法----------------------------------------------------------------------------------------
 
-     //改为待审核---------------------------------
 
-     public function leave($data){
 
-         $model = KqLeave::where('order_number',$data['order_number'])
 
-             ->where('del_time',0)
 
-             ->first();
 
-         if(empty($model)) return [false, '请假申请不存在或已被删除'];
 
-         if($model->state != KqLeave::STATE_ZERO) return [false, '请确认请假申请状态,操作失败'];
 
-         KqLeave::where('del_time',0)
 
-             ->where('id',$data['id'])
 
-             ->update(['state' => KqLeave::STATE_ONE]);
 
-         return [true, $model->toArray()];
 
-     }
 
-     public function overtime($data){
 
-         $model = KqOvertime::where('order_number',$data['order_number'])
 
-             ->where('del_time',0)
 
-             ->first();
 
-         if(empty($model)) return [false, '加班申请不存在或已被删除'];
 
-         if($model->state != KqOvertime::STATE_ZERO) return [false, '请确认加班申请状态,操作失败'];
 
-         KqOvertime::where('del_time',0)
 
-             ->where('id',$data['id'])
 
-             ->update(['state' => KqOvertime::STATE_ONE]);
 
-         return [true, $model->toArray()];
 
-     }
 
-     //改为待审核---------------------------------
 
-     //改为最终结果---------------------------------
 
-     public function leave_final($data){
 
-         $model = KqLeave::where('order_number',$data['order_number'])
 
-             ->where('del_time',0)
 
-             ->first();
 
-         if(empty($model)) return [false, '请假申请不存在或已被删除'];
 
-         if($model->state != KqLeave::STATE_ONE) return [false, '请确认请假申请的状态,操作失败'];
 
-         if($data['type'] == self::TYPE_ONE){
 
-             //通过
 
-             $model->state = KqLeave::STATE_TWO;
 
-             $model->save();
 
-         }else{
 
-             //驳回
 
-             $model->state = KqLeave::State_minus_one;
 
-             $model->save();
 
-         }
 
-         return [true, $model->toArray()];
 
-     }
 
-     public function overtime_final($data){
 
-         $model = KqOvertime::where('order_number',$data['order_number'])
 
-             ->where('del_time',0)
 
-             ->first();
 
-         if(empty($model)) return [false, '加班申请不存在或已被删除'];
 
-         if($model->state != KqLeave::STATE_ONE) return [false, '请确认加班申请的状态,操作失败'];
 
-         if($data['type'] == self::TYPE_ONE){
 
-             //通过
 
-             $model->state = KqOvertime::STATE_TWO;
 
-             $model->save();
 
-         }else{
 
-             //驳回
 
-             $model->state = KqOvertime::State_minus_one;
 
-             $model->save();
 
-         }
 
-         return [true, $model->toArray()];
 
-     }
 
-     //改为最终结果---------------------------------
 
-     //通过后弃审
 
-     //通过后弃审
 
-     public function getOrderDetail($data,$user){
 
-         if(empty($data['order_number'])) return [false,'必传参数不能为空'];
 
-         $array = [];
 
-         foreach (Construction::$prefix as $value){
 
-             $array[$value] = "\App\Service\\ConstructionService";
 
-         }
 
-         foreach (ReturnExchangeOrder::$prefix as $value){
 
-             $array[$value] = "\App\Service\\ReturnExchangeOrderService";
 
-         }
 
-         foreach (SalesOrder::$prefix as $value){
 
-             $array[$value] = "\App\Service\\SalesOrderService";
 
-         }
 
-         $status = true;
 
-         $msg = [];
 
-         foreach ($array as $key => $value){
 
-             if(strpos($data['order_number'],$key) !== false) {
 
-                 list($status, $msg) = (new $value)->detail($data);
 
-                 return [$status, $msg];
 
-             }
 
-         }
 
-         if(strpos($data['order_number'],PurchaseOrder::prefix) !== false){
 
-             $service = "\App\Service\\PurchaseOrderService";
 
-             list($status, $msg) = (new $service)->detail($data,$user);
 
-             return [$status, $msg];
 
-         }
 
-         return [$status, $msg];
 
-     }
 
-     public function checkAll($data,$user){
 
-         if(empty($data['id']) || empty($data['order_number'])|| empty($data['opt_case'])) return [false,'必传参数不能为空或者参数值错误!'];
 
-         list($status,$msg) = $this->limitingSendRequestBackgExpire($data['order_number'] . $data['opt_case']);
 
-         if(! $status) return [false,$msg];
 
-         //走审批流 单据状态改为待审批方法
 
-         $function = self::$opt_1case[$data['opt_case']] ?? '';
 
-         //单据不走审批流 直接完成
 
-         $function2 = self::$finished[$data['opt_case']] ?? '';
 
-         try{
 
-             DB::beginTransaction();
 
-             //不走审批流,更新完直接返回
 
-             if($function2) {
 
-                 list($bool,$msg) = $this->$function2($data,$user);
 
-                 if($bool) {
 
-                     $order = $msg;
 
-                     list($bool,$err) = $this->createRecordAndInventoryMy($data,$user,$order);
 
-                     if($bool){
 
-                         DB::commit();
 
-                         return [true, ''];
 
-                     }else{
 
-                         DB::rollBack();
 
-                         return [false, $err];
 
-                     }
 
-                 }else{
 
-                     DB::rollBack();
 
-                     return [false, $msg];
 
-                 }
 
-             }
 
-             //需要审批流,从未审核变成待审核
 
-             if($function){
 
-                 list($bool,$msg) = $this->$function($data);
 
-                 if(! $bool){
 
-                     DB::rollBack();
 
-                     return [false, $msg];
 
-                 }
 
-                 //创建审批流
 
-                 $args = [
 
-                     'order_no' => $data['order_number'],
 
-                     'menu_id' => $data['menu_id'] ?? 0,
 
-                     'opt_case' => $data['opt_case'],
 
-                     'order' => $msg,
 
-                 ];
 
-                 $oa = new OaService($user);
 
-                 list($bool,$msg) = $oa->createOaOrder($args);
 
-                 if(! $bool) {
 
-                     DB::rollBack();
 
-                     if($msg) return [false,$msg];
 
-                 }
 
-             }
 
-             DB::commit();
 
-             return [true, ''];
 
-         }catch (\Throwable $exception){
 
-             DB::rollBack();
 
-             return [false, $exception->getMessage() . $exception->getFile(). $exception->getLine()];
 
-         }
 
-     }
 
-     //更新库存
 
-     public function changeInventory($data,$order,$user){
 
-         $number_symbol = "";
 
-         if(in_array($data['opt_case'],self::$in_opt)){
 
-             $number_symbol = ">";
 
-         }elseif (in_array($data['opt_case'],self::$out_opt)){
 
-             $number_symbol = "<";
 
-         }
 
-         //获取单据最新数据时间 正常审核的数据
 
-         $latest = InOutRecord::where('del_time',0)
 
-             ->where('order_number',$order['order_number'])
 
-             ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
 
-                 return $query->where('number', $number_symbol,0);
 
-             })
 
-             ->select('crt_time')
 
-             ->orderBy('crt_time', 'desc')
 
-             ->first();
 
-         $model = InOutRecord::where('del_time',0)
 
-             ->where('order_number',$order['order_number'])
 
-             ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
 
-                 return $query->where('number', $number_symbol,0);
 
-             })
 
-             ->select('number','crt_time','product_id','storehouse_id','top_depart_id');
 
-         if(! empty($latest)) {
 
-             $t = $latest->toArray();
 
-             $model->where('crt_time',$t['crt_time']);
 
-         }
 
-         $record = $model->get()->toArray();
 
-         if (empty($record)) return [false,'流水记录不存在'];
 
-         $top_depart_id = Storehouse::where('id', $order['storehouse_id'])->value('top_depart_id');
 
-         $result = $lock_number = [];
 
-         foreach ($record as $value){
 
-             $key = $value['product_id'] . $value['storehouse_id'];
 
-             if(isset($result[$key])){
 
-                 $result[$key]['number'] += $value['number'];
 
-             }else{
 
-                 $result[$key] = [
 
-                     'product_id' => $value['product_id'],
 
-                     'number' => $value['number'],
 
-                     'crt_time' => $value['crt_time'],
 
-                     'storehouse_id' => $value['storehouse_id'],
 
-                     'top_depart_id' => $top_depart_id,
 
-                 ];
 
-             }
 
-             if($value['number'] < 0){
 
-                 if(isset($lock_number[$key])){
 
-                     $lock_number[$key] += $value['number'];
 
-                 }else{
 
-                     $lock_number[$key] = $value['number'];
 
-                 }
 
-             }
 
-         }
 
-         //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
 
-         $lock = $user['is_check_stock'];
 
-         $result = array_values($result);
 
-         foreach ($result as $key => $value){
 
-             $keys = $value['product_id'] . $value['storehouse_id'];
 
-             $m = ProductInventory::where('product_id',$value['product_id'])
 
-                 ->where('storehouse_id',$value['storehouse_id'])
 
-                 ->select('product_id','number','storehouse_id')
 
-                 ->first();
 
-             if(empty($m)){
 
-                 ProductInventory::insert($result[$key]);
 
-             }else{
 
-                 //锁定数量
 
-                 $lock_number_tmp = 0;
 
-                 if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
 
-                 ProductInventory::where('product_id',$m->product_id)
 
-                     ->where('storehouse_id',$m->storehouse_id)
 
-                     ->lockForUpdate()
 
-                     ->update([
 
-                         'number' => DB::raw('number + ('. $value['number'] . ')'),
 
-                         'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
 
-                     ]);
 
-             }
 
-         }
 
-         return [true,''];
 
-     }
 
-     //业务单据审批通过后 驳回 更新库存
 
-     public function changeInventoryReject($data,$order,$user){
 
-         $number_symbol = "";
 
-         if(in_array($data['opt_case'],self::$in_opt)){
 
-             $number_symbol = "<";
 
-         }elseif (in_array($data['opt_case'],self::$out_opt)){
 
-             $number_symbol = ">";
 
-         }
 
-         //获取单据最新数据时间 正常审核的数据
 
-         $latest = InOutRecord::where('del_time',0)
 
-             ->where('order_number',$order['order_number'])
 
-             ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
 
-                 return $query->where('number', $number_symbol,0);
 
-             })
 
-             ->select('crt_time')
 
-             ->orderBy('crt_time', 'desc')
 
-             ->first();
 
-         $model = InOutRecord::where('del_time',0)
 
-             ->where('order_number',$order['order_number'])
 
-             ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
 
-                 return $query->where('number', $number_symbol,0);
 
-             })
 
-             ->select('number','crt_time','product_id','storehouse_id','top_depart_id');
 
-         if(! empty($latest)) {
 
-             $t = $latest->toArray();
 
-             $model->where('crt_time',$t['crt_time']);
 
-         }
 
-         $record = $model->get()->toArray();
 
-         if (empty($record)) return [false,'流水记录不存在'];
 
-         $top_depart_id = Storehouse::where('id', $order['storehouse_id'])->value('top_depart_id');
 
-         $result = $lock_number = [];
 
-         foreach ($record as $value){
 
-             $key = $value['product_id'] . $value['storehouse_id'];
 
-             if(isset($result[$key])){
 
-                 $result[$key]['number'] += $value['number'];
 
-             }else{
 
-                 $result[$key] = [
 
-                     'product_id' => $value['product_id'],
 
-                     'number' => $value['number'],
 
-                     'crt_time' => $value['crt_time'],
 
-                     'storehouse_id' => $value['storehouse_id'],
 
-                     'top_depart_id' => $top_depart_id,
 
-                 ];
 
-             }
 
-             if($value['number'] > 0){
 
-                 if(isset($lock_number[$key])){
 
-                     $lock_number[$key] += $value['number'];
 
-                 }else{
 
-                     $lock_number[$key] = $value['number'];
 
-                 }
 
-             }
 
-         }
 
-         //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
 
-         $lock = $user['is_check_stock'];
 
-         $result = array_values($result);
 
-         foreach ($result as $key => $value){
 
-             $keys = $value['product_id'] . $value['storehouse_id'];
 
-             $m = ProductInventory::where('product_id',$value['product_id'])
 
-                 ->where('storehouse_id',$value['storehouse_id'])
 
-                 ->select('product_id','number','storehouse_id')
 
-                 ->first();
 
-             if(empty($m)){
 
-                 ProductInventory::insert($result[$key]);
 
-             }else{
 
-                 //锁定数量
 
-                 $lock_number_tmp = 0;
 
-                 if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
 
-                 ProductInventory::where('product_id',$m->product_id)
 
-                     ->where('storehouse_id',$m->storehouse_id)
 
-                     ->lockForUpdate()
 
-                     ->update([
 
-                         'number' => DB::raw('number + ('. $value['number'] . ')'),
 
-                         'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
 
-                     ]);
 
-             }
 
-         }
 
-         return [true,''];
 
-     }
 
-     public function createRecordAndInventory($data = []){
 
-         if(empty($data['type']) || empty($data['opt_case']) || empty($data['order_number'])) return [false, '传递参数缺少'];
 
-         $user = $data['user_data'] ?? [];
 
-         if($data['type'] == self::TYPE_THREE){
 
-             //通过后弃审
 
-             if(! isset(self::$opt_case_reject[$data['opt_case']])) return [false, '该操作不存在'];
 
-             //具体方法
 
-             $function = self::$opt_case_reject[$data['opt_case']];
 
-             //流水
 
-             $function2 = self::$reject_record[$data['opt_case']] ?? '';
 
-             try{
 
-                 DB::beginTransaction();
 
-                 //更新单据的状态
 
-                 list($bool,$msg) = $this->$function($data);
 
-                 if(! $bool){
 
-                     DB::rollBack();
 
-                     return [false, $msg];
 
-                 }
 
-                 $order = $msg;
 
-                 if($function2) {
 
-                     //流水
 
-                     list($boolean,$msg) = $this->$function2($data,$order);
 
-                     if(! $boolean) {
 
-                         DB::rollBack();
 
-                         return [false, $msg];
 
-                     }
 
-                     if($msg != self::minus_one){
 
-                         //库存
 
-                         list($bool,$msg) = $this->changeInventoryReject($data,$order,$user);
 
-                         if(! $bool){
 
-                             DB::rollBack();
 
-                             return [false, $msg];
 
-                         }
 
-                     }
 
-                 }
 
-                 if(! empty(self::$operation_order_reject[$data['opt_case']])){
 
-                     $type = self::$operation_order_reject[$data['opt_case']];
 
-                     (new OrderOperationService())->add([
 
-                         'order_number' => $order['order_number'],
 
-                         'msg' => OrderOperation::$type[$type],
 
-                         'type' => $type
 
-                     ],$user);
 
-                 }
 
-                 DB::commit();
 
-                 return [true, ''];
 
-             }catch (\Throwable $exception){
 
-                 DB::rollBack();
 
-                 return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
 
-             }
 
-         }else{
 
-             //具体方法
 
-             $function = self::$opt_case[$data['opt_case']] ?? "";
 
-             $record = self::$record[$data['opt_case']] ?? "";
 
-             try{
 
-                 DB::beginTransaction();
 
-                 list($bool,$msg) = $this->$function($data);
 
-                 if(! $bool){
 
-                     DB::rollBack();
 
-                     return [false, $msg];
 
-                 }
 
-                 $order = $msg;
 
-                 if($data['type'] == self::TYPE_ONE){
 
-                     if($record) {
 
-                         //流水
 
-                         list($bool,$msg) = $this->$record($data, $order);
 
-                         if(! $bool) {
 
-                             DB::rollBack();
 
-                             return [false, $msg];
 
-                         }
 
-                         if($msg != self::minus_one){
 
-                             //库存
 
-                             list($bool,$msg) = $this->changeInventory($data, $order, $user);
 
-                             if(! $bool) {
 
-                                 DB::rollBack();
 
-                                 return [false, $msg];
 
-                             }
 
-                         }
 
-                     }
 
-                 }
 
-                 if(! empty(self::$operation_order[$data['opt_case']])){
 
-                     $user = $data['user_data'] ?? [];
 
-                     $type = self::$operation_order[$data['opt_case']];
 
-                     (new OrderOperationService())->add([
 
-                         'order_number' => $order['order_number'],
 
-                         'msg' => OrderOperation::$type[$type],
 
-                         'type' => $type
 
-                     ],$user);
 
-                 }
 
-                 DB::commit();
 
-                 return [true, ''];
 
-             }catch (\Throwable $exception){
 
-                 DB::rollBack();
 
-                 return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
 
-             }
 
-         }
 
-     }
 
-     //不需要走审批流 直接调用
 
-     public function createRecordAndInventoryMy($data = [],$user = [],$order = []){
 
-         if(! empty($data['type']) && $data['type'] == self::TYPE_THREE){
 
-         }else{
 
-             //具体方法
 
-             $record = self::$record[$data['opt_case']] ?? "";
 
-             try{
 
-                 DB::beginTransaction();
 
-                 if($record) {
 
-                     //流水
 
-                     list($bool,$msg) = $this->$record($data, $order);
 
-                     if(! $bool) {
 
-                         DB::rollBack();
 
-                         return [false, $msg];
 
-                     }
 
-                     if($msg != self::minus_one){
 
-                         //库存
 
-                         list($bool,$msg) = $this->changeInventory($data, $order, $user);
 
-                         if(! $bool) {
 
-                             DB::rollBack();
 
-                             return [false, $msg];
 
-                         }
 
-                     }
 
-                 }
 
-                 if(! empty(self::$operation_order[$data['opt_case']])){
 
-                     $type = self::$operation_order[$data['opt_case']];
 
-                     (new OrderOperationService())->add([
 
-                         'order_number' => $order['order_number'],
 
-                         'msg' => OrderOperation::$type[$type],
 
-                         'type' => $type
 
-                     ],$user);
 
-                 }
 
-                 DB::commit();
 
-                 return [true, ''];
 
-             }catch (\Throwable $exception){
 
-                 DB::rollBack();
 
-                 return [false, $exception->getMessage() . $exception->getLine() . $exception->getFile()];
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |