'收货单', self::two => '发货单',//确认后出库 self::three => '采购单',//确认后入库 self::four => '销售订单', self::five => '施工单',//确认后出库 ]; //入库操作 public static $in_opt = [ self::three, ]; //出库操作 public static $out_opt = [ self::two, self::five, ]; const TYPE_ONE = 1;//通过 const TYPE_TWO = 2;//不通过 //单据操作 public static $opt_case = [ self::two => 'confirmInvoiceOrder', self::three => 'confirmPurchaseOrder', self::four => 'confirmSalesOrder', self::five => 'confirmConstruction', ]; //单据库存流水 public static $record = [ self::two => 'recordInvoiceOrder', self::three => 'recordPurchaseOrder', self::five => 'recordConstruction', ]; public function confirmInvoiceOrder($data){ $model = InvoiceOrder::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '发货单不存在或已被删除']; if($model->state != InvoiceOrder::STATE_ZERO) return [false, '请确认发货单状态,操作失败']; InvoiceOrder::where('del_time',0)->where('id',$data['id']) ->update(['state' => InvoiceOrder::STATE_ONE]); return [true, $model->toArray()]; } public function recordInvoiceOrder($data, $order){ $result = InvoiceOrderInfo::where('del_time',0) ->where('order_number',$order['order_number']) ->get()->toArray(); if(empty($result)) return [false,'发货单产品信息不存在或已被删除']; $insert = []; $time = time(); foreach ($result as $value){ if(isset($insert[$value['product_id']])){ $insert[$value['product_id']]['number'] += -($value['number']); }else{ $insert[$value['product_id']] = [ 'product_id' => $value['product_id'], 'number' => -($value['number']), 'order_type' => InvoiceOrder::prefix, 'order_number' => $order['order_number'], 'crt_time' => $time ]; } } $insert = array_values($insert); $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; return [true,'']; } public function confirmPurchaseOrder($data){ $model = PurchaseOrder::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '采购订单不存在或已被删除']; if($model->state != PurchaseOrder::STATE_ZERO) return [false, '请确认采购订单状态,操作失败']; PurchaseOrder::where('del_time',0)->where('id',$data['id']) ->update(['state' => PurchaseOrder::STATE_ONE]); return [true, $model->toArray()]; } public function recordPurchaseOrder($data, $order){ $result = PurchaseOrderInfo::where('del_time',0) ->where('order_number',$order['order_number']) ->get()->toArray(); if(empty($result)) return [false,'采购单产品信息不存在或已被删除']; $insert = []; $time = time(); foreach ($result as $value){ if(isset($insert[$value['product_id']])){ $insert[$value['product_id']]['number'] += $value['number']; }else{ $insert[$value['product_id']] = [ 'product_id' => $value['product_id'], 'number' => $value['number'], 'order_type' => PurchaseOrder::prefix, 'order_number' => $order['order_number'], 'crt_time' => $time ]; } } $insert = array_values($insert); $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; return [true,'']; } public function confirmSalesOrder($data){ $model = SalesOrder::where('id',$data['id'])->where('del_time',0)->first(); if(empty($model)) return [false, '销售订单不存在或已被删除']; if($data['type'] == self::TYPE_ONE){ if($model->state == SalesOrder::State_one) return [false,'已锁定,操作失败!']; $model->state = SalesOrder::State_one; }else{ if($model->state == SalesOrder::State_zero) return [false,'未锁定,操作失败!']; $model->state = SalesOrder::State_zero; } $model->save(); return [true,$model->toArray()]; } public function confirmConstruction($data){ $model = Construction::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '施工单不存在或已被删除']; if($model->state != Construction::STATE_ZERO) return [false, '请确认施工单状态,操作失败']; Construction::where('del_time',0)->where('id',$data['id']) ->update(['state' => Construction::STATE_ONE]); return [true, $model->toArray()]; } public function recordConstruction($data, $order){ $result = ConstructionProductInfo::where('del_time',0) ->where('construction_id',$order['id']) ->get()->toArray(); if(empty($result)) return [false,'施工单产品信息不存在或已被删除']; $insert = []; $time = time(); foreach ($result as $value){ if(isset($insert[$value['product_id']])){ $insert[$value['product_id']]['number'] += -($value['number']); }else{ $insert[$value['product_id']] = [ 'product_id' => $value['product_id'], 'number' => -($value['number']), 'order_type' => Construction::$prefix[$order['model_type']] ?? '', 'order_number' => $order['order_number'], 'crt_time' => $time ]; } } $insert = array_values($insert); $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; return [true,'']; } public function checkAll($data,$user){ if(empty($data['id']) || empty($data['opt_case'])) return [false,'必传参数不能为空或者参数值错误!']; //具体方法 $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($record) { //流水 $bool = $this->$record($data, $order); if(! $bool) { DB::rollBack(); return [false, $msg]; } //库存 $bool = $this->changeInventory($data, $order); if(! $bool) { DB::rollBack(); return [false, $msg]; } } DB::commit(); return [true, '']; }catch (\Throwable $exception){ DB::rollBack(); return [false, $exception->getMessage()]; } } //更新库存 public function changeInventory($data,$order){ $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']) ->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']) ->where('number',$number_symbol,0) ->select(DB::raw("sum(number) as number"),'crt_time','product_id'); if(! empty($latest)) { $t = $latest->toArray(); $model->where('crt_time',$t['crt_time']); } $result = $model->get()->toArray(); if (empty($result)) return [false,'流水记录不存在']; //是否锁定 $setting_map = Setting::where('setting_name','lock_number') ->pluck('setting_value','setting_name')->toArray(); foreach ($result as $key => $value){ $m = ProductInventory::where('product_id',$value['product_id']) ->select('product_id','number') ->first(); if(empty($m)){ ProductInventory::insert($result[$key]); }else{ $lock_number = 0; if(! empty($setting_map['lock_number']) && in_array($data['opt_case'],self::$out_opt)) $lock_number = $value['number']; ProductInventory::where('product_id',$m->product_id) ->lockForUpdate() ->update([ 'number' => DB::raw('number + ('. $value['number'] . ')'), 'lock_number' => DB::raw('lock_number + ('. $lock_number . ')') ]); } } return [true,'']; } }