'请假申请', 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()]; } } } }