'收货单', self::two => '发货单',//确认后出库 self::three => '采购单入库',//确认后入库 self::four => '公司完结', // 安装件 合同完结 self::five => '施工单',//确认后出库 self::six => '退换货单',//确认后出库或出库入库 self::seven => '采购单确认', self::eight => '合同确认', self::nine => '合同客户完结', self::ten => '收付款确认', self::eve => '接受门店派单', self::twl => '活动包', self::thi => '虚拟采购单', self::fourteen => '盘点单', self::fifteen => '放弃门店派单', self::sixteen => '出库单审核', ]; //入库操作 public static $in_opt = [ self::three, ]; //出库操作 public static $out_opt = [ self::two, self::five, self::sixteen, ]; const TYPE_ONE = 1;//通过 const TYPE_TWO = 2;//不通过 const TYPE_THREE = 3;//通过后驳回 //改为待审核状态 校验 public static $opt_1case_check = [ // self::five => 'checkConstruction',//施工单 ]; //改为待审核状态 public static $opt_1case = [ self::two => 'waitInvoice',//发货单 // self::three => 'waitPurchase',//采购单 入库 self::five => 'waitConstruction',//施工单 self::six => 'waitReturnExchange',//退换货单 self::seven => 'waitPurchaseConfirm', //采购单确认 self::eight => 'waitSales', // 合同安装件 合同确认 self::ten => 'waitPaymentReceipt', //收付款确认 self::twl => 'waitSportsBag', //活动包确认 self::thi => 'waitPurchaseSpecial', //虚拟采购单 self::fourteen => 'waitInventory', //盘点单 self::sixteen => 'waitOut', //出库单 ]; public static $finished = [ self::three => 'confirmPurchaseOrder',//采购单 入库 self::four => 'settleSalesOrder', // 合同 安装件 合同公司完结 self::nine => 'settleSalesOrderCustomer', // 合同 安装件 合同客户完结 self::eve => 'settleSalesOrderConfirm', // 合同 安装件 合同接收 self::fifteen => 'settleSalesOrderConfirmBack', // 合同 安装件 合同接收后放弃 ]; //单据操作 public static $opt_case = [ self::two => 'confirmInvoiceOrder', // self::three => 'confirmPurchaseOrder', self::five => 'confirmConstruction', self::six => 'confirmReturnExchangeOrder', self::seven => 'confirmPurchaseOrderState', self::eight => 'confirmSales', // 合同 安装件 合同确认 self::ten => 'confirmPaymentReceipt', // 确认收付款单 self::twl => 'confirmSportsBag', // 确认活动包 self::thi => 'confirmPurchaseSpecial', //虚拟采购单 self::fourteen => 'confirmInventory', //盘点单 self::sixteen => 'confirmOut', //出库单 ]; //单据库存流水 public static $record = [ // self::two => 'recordInvoiceOrder', self::three => 'recordPurchaseOrder', // self::five => 'recordConstruction', self::six => 'recordReturnExchangeOrder', self::fourteen => 'recordInventory', self::sixteen => 'recordOut', ]; //自动生成 public static $create = [ self::seven => 'createPurchaseOrderSales', //分社合同生成 self::four => 'createPurchaseOrder', // 派给分社的合同 公司完结以后生成虚拟采购单 ]; //自动生成的删除 public static $create_del = [ self::seven => 'delCreatePurchaseOrderSales', //分社合同生成(删除) // self::four => 'delCreatePurchaseOrder', // 派给分社的合同确认以后生成虚拟采购单 ]; //审核通过后 弃审 public static $opt_case_reject = [ self::four => 'reject_sales', // 合同 // self::three => 'reject_purchase', //采购入库 self::seven => 'reject_purchase_confirm', //采购确认驳回 self::five => 'reject_construction',//施工单 self::six => 'reject_return_exchange',//退换货 self::ten => 'reject_payment_receipt',//收付款单 self::twl => 'reject_sports_bag',//活动包 self::thi => 'reject_purchase_special',//虚拟采购单 ]; //审核通过后 驳回 产生流水 public static $reject_record = [ // self::five => 'reject_record_construction', //施工单驳回 self::three => 'reject_record_purchase', //采购 self::six => 'reject_record_return_exchange',//退换货 ]; //旅程日志 同意 public static $operation_order = [ self::eight => OrderOperation::three, //合同确认 self::two => OrderOperation::eight, //发货单确认 self::six => OrderOperation::nine, //退换货审核 self::five => OrderOperation::eve, //施工单 self::seven => OrderOperation::thi,//采购单确认 self::three => OrderOperation::fourteen,//采购单入库 self::ten => OrderOperation::twenty_one,//收付款单 self::twl => OrderOperation::twenty_one,//收付款单 self::thi => OrderOperation::twenty_nine,//虚拟采购单 self::sixteen => OrderOperation::thirty_three,//出库单 ]; //旅程日志 驳回 public static $operation_order_reject = [ self::four => OrderOperation::four, //合同弃审 self::six => OrderOperation::ten, //退换货弃审 self::five => OrderOperation::twl, //施工单弃审 self::three => OrderOperation::fif,//采购单入库弃审 self::seven => OrderOperation::twenty,//采购单确认弃审 self::ten => OrderOperation::twenty_two,//收付款单 self::twl => OrderOperation::twenty_eight,//活动包 self::thi => OrderOperation::thirty,//虚拟采购单 ]; //校验 不需要了 public function checkConstruction($data, $user){ $order = Construction::where('del_time',0) ->where('order_number',$data['order_number']) ->first(); if(empty($order)) return [false,'施工单不存在或已被删除']; $order = $order->toArray(); //总社id $head = $user['head'] ?? []; $head = $head['id'] ?? 0; //分社自己的施工单 直接返回 if($order['top_depart_id'] != $head) return [true, '']; //不校验库存 if($user['is_check_stock'] == ProductInventorySet::type_two) return [true,'']; //施工单产品 $sub = ConstructionProductInfo::where('construction_id',$order['id']) ->where('del_time',0) ->get()->toArray(); if(empty($sub)) return [false,'施工单产品不存在或已被删除']; $product_submit = $product_id = []; foreach ($sub as $value){ $product_id[] = $value['product_id']; $key = $value['product_id'] . ',' . $value['storehouse_id']; if(isset($product_save[$key])){ $product_submit[$key] += $value['number']; }else{ $product_submit[$key] = $value['number']; } } //比较库存 list($status,$msg) = (new ProductInventoryService())->compareStock($user,$product_id, $product_submit, []); if(! $status) return [false, $msg]; //锁定库存 // ProductInventoryService::changeLockNumber($user,$product_submit); return [true, '']; } //改为待审核--------------------------------- public function waitInvoice($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 waitPurchaseConfirm($data){ $model = PurchaseOrder::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false,'采购单不存在或已被删除']; if(! in_array($model->state, [PurchaseOrder::State_minus_one,PurchaseOrder::STATE_ZERO])) return [false, '请确认采购单状态,操作失败']; //待确认 PurchaseOrder::where('id',$data['id'])->update(['state' => PurchaseOrder::STATE_ONE]); return [true, $model->toArray()]; } public function waitPurchase($data){ $model = PurchaseOrder::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '采购订单不存在或已被删除']; if($model->state != PurchaseOrder::STATE_TWO) return [false, '请确认采购订单状态,操作失败']; //待入库 PurchaseOrder::where('del_time',0)->where('id',$data['id']) ->update(['state' => PurchaseOrder::STATE_Three]); return [true, $model->toArray()]; } public function waitPurchaseSpecial($data){ $model = PurchaseOrderSpecial::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '虚拟采购订单不存在或已被删除']; if($model->state > PurchaseOrderSpecial::STATE_ZERO) return [false, '请确认虚拟采购订单状态,操作失败']; //待入库 PurchaseOrderSpecial::where('del_time',0)->where('id',$data['id']) ->update(['state' => PurchaseOrder::STATE_ONE]); return [true, $model->toArray()]; } public function waitInventory($data){ $model = Inventory::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '盘点单不存在或已被删除']; if($model->state > Inventory::STATE_ZERO) return [false, '请确认盘点单状态,操作失败']; //待入库 Inventory::where('del_time',0)->where('id',$data['id']) ->update(['state' => Inventory::STATE_ONE]); return [true, $model->toArray()]; } public function waitOut($data){ $model = OutBoundOrder::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '出库单不存在或已被删除']; if($model->state > OutBoundOrder::STATE_ZERO) return [false, '请确认出库单状态,操作失败']; //待入库 OutBoundOrder::where('del_time',0)->where('id',$data['id']) ->update(['state' => OutBoundOrder::STATE_ONE]); return [true, $model->toArray()]; } public function waitConstruction($data){ $model = Construction::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '施工单不存在或已被删除']; if(! in_array($model->state, [Construction::State_minus_one,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 waitReturnExchange($data){ $model = ReturnExchangeOrder::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '退换货单不存在或已被删除']; if(! in_array($model->state, [ReturnExchangeOrder::State_minus_one,ReturnExchangeOrder::State_zero])) return [false, '请确认退换货单状态,操作失败']; //待确认 ReturnExchangeOrder::where('del_time',0)->where('id',$data['id']) ->update(['state' => ReturnExchangeOrder::State_one]); return [true, $model->toArray()]; } public function waitSales($data){ $model = SalesOrder::where('id', $data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '合同不存在或已被删除']; //安装件 if(! in_array($model->state, [SalesOrder::State_minus_one,SalesOrder::State_zero])) return [false, '请确认合同状态,操作失败']; SalesOrder::where('del_time',0)->where('id',$data['id']) ->update(['state' => SalesOrder::State_one]); return [true, $model->toArray()]; } public function waitPaymentReceipt($data){ $model = PaymentReceipt::where('id', $data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '收付款单不存在或已被删除']; if(! in_array($model->state, [PaymentReceipt::State_minus_one,PaymentReceipt::STATE_ZERO])) return [false, '请确认收付款单状态,操作失败']; PaymentReceipt::where('del_time',0)->where('id',$data['id']) ->update(['state' => PaymentReceipt::STATE_ONE]); return [true, $model->toArray()]; } public function waitSportsBag($data){ $model = SportsBag::where('id', $data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '活动包不存在或已被删除']; if(! in_array($model->state, [SportsBag::State_minus_one,SportsBag::STATE_ZERO])) return [false, '请确认活动包状态,操作失败']; SportsBag::where('del_time',0)->where('id',$data['id']) ->update(['state' => PaymentReceipt::STATE_ONE]); return [true, $model->toArray()]; } //改为待审核--------------------------------- //自动生成----------------------------------- //总社派给分社的合同 完成生成虚拟采购单 public function createPurchaseOrder($order,$user){ //快递件 if($order['sales_order_type'] == SalesOrder::Order_type_two) return [true,'']; //不是总公司的合同 $head = $user['head'] ?? []; $head = $head['id'] ?? 0; //总社id if($head != $order['top_depart_id']) return [true, '']; $see = SeeRange::where('del_time',0) ->where('data_id',$order['id']) ->where('data_type',SeeRange::type_seven) ->where('type',SeeRange::data_three) ->first(); if(empty($see)) return [false, '未找到指派分社信息']; $depart_id = $see->param_id;//指派的分社 //总社指派给自己 if($depart_id == $head) return [true, '']; //获取指派分社时候的金额 $fee = SalesOrderOtherFee::where('del_time',0) ->where('sales_order_id',$order['id']) ->first(); if(empty($fee)) return [false, '未找到指派分社时填写的金额']; $fee = $fee->toArray(); $order_number = (new OrderNoService())->createOrderNumber(PurchaseOrderSpecial::prefix); $storehouse = Storehouse::where('depart_id',$head)->value('id'); $product = SalesOrderProductInfo::where('del_time',0) ->where('sales_order_id',$order['id']) ->select('product_id','number','retail_price') ->get()->toArray(); //退货的差异 $returnExchange_map = []; $returnExchange = ReturnExchangeOrder::where('del_time',0) ->where('type',ReturnExchangeOrder::Order_type) ->where('data_id',$order['id']) ->select('id') ->get()->toArray(); $return_product = ReturnExchangeOrderProductInfo::where('del_time',0) ->where('return_exchange_id',array_column($returnExchange,'id')) ->select('product_id','number') ->get()->toArray(); foreach ($return_product as $value){ if(isset($returnExchange_map[$value['product_id']])){ $returnExchange_map[$value['product_id']] += $value['number']; }else{ $returnExchange_map[$value['product_id']] = $value['number']; } } $product_map = $rate = []; $total = 0; foreach ($product as $key => $value){ $return_number = 0; if(isset($returnExchange_map[$value['product_id']])) $return_number = $returnExchange_map[$value['product_id']]; $number = $value['number']; if($return_number >= $value['number']) { unset($product[$key]); continue; }else{ $number = bcsub($number,$return_number,2); $product[$key]['number'] = $number; } $total += $number * $value['retail_price']; if(isset($product_map[$value['product_id']])){ $product_map[$value['product_id']] += $value['retail_price'] * $number; }else{ $product_map[$value['product_id']] = $value['retail_price'] * $number; } } foreach ($product_map as $key => $value){ $rate[$key] = bcdiv($value, $total, 2); } try { DB::beginTransaction(); $model = new PurchaseOrderSpecial(); $model->order_number = $order_number; $model->sales_order_id = $order['id']; $model->supplier = $depart_id; $model->type = $order['type']; $model->depart_id = $head; $model->top_depart_id = $head; $model->crt_id = Employee::SPECIAL_ADMIN; $model->purchase_id = Employee::SPECIAL_ADMIN; $model->purchase_total = $fee['other_fee_1'] ?? 0; $model->storehouse_id = $storehouse ?? 0; $model->save(); if(empty($model->id)) return [false,'采购单主信息生成失败']; $purchase_order_id = $model->id; $insert = [];$product_total = 0; foreach ($product as $value){ $rate_tmp = $rate[$value['product_id']] ?? 0; $price = bcdiv(bcmul($rate_tmp, $fee['other_fee_1'],2), $value['number'],2); $product_total += $price * $value['number']; $insert[] = [ 'purchase_order_special_id' => $purchase_order_id, 'product_id' => $value['product_id'], 'order_number' => $order_number, 'number' => $value['number'], 'price' => $price, 'storehouse_id' => $storehouse, ]; } PurchaseOrderSpecialInfo::insert($insert); PurchaseOrderSpecial::where('id',$purchase_order_id)->update(['total' => $product_total]); $insert_see[] = [ 'data_id' => $purchase_order_id, // 虚拟采购单 'data_type' => SeeRange::type_ten, 'param_id' => $depart_id, //门店id 'type' => SeeRange::data_three, 'crt_time' => time(), ]; if(! empty($insert_see)) SeeRange::insert($insert_see); DB::commit(); }catch (\Throwable $exception){ DB::rollBack(); if (str_contains($exception->getMessage(), '1062') || str_contains($exception->getMessage(), 'Duplicate entry')) { return [false, '网络波动,请重新操作!']; } return [false, $exception->getMessage()]; } return [true, '']; } //分社向总社采购 生成 分社订货合同 public function createPurchaseOrderSales($order,$user){ //没有供应商 不创建合同 if(empty($order['supplier'])) return [true, '']; //总公司的采购单 不创建合同 $head = $user['head'] ?? []; $head = $head['id'] ?? 0; //总社id if($head == $order['top_depart_id']) return [true, '']; //分社公司的采购单 不向总供应商采购 不创建合同 $is_create = Supplier::where('id',$order['supplier'])->value('is_main'); if(empty($is_create)) return [true, '']; // $customer_short_name = Depart::where('id',$order['top_depart_id'])->value('id') ?? ""; $prefix = SalesOrder::$prefix[SalesOrder::Model_type_two]; $order_number = OrderNoService::createSalesOrderNumber($prefix); $product = PurchaseOrderInfo::where('del_time',0) ->where('purchase_order_id',$order['id']) ->get()->toArray(); if(empty($product)) return [false, '采购订单产品数据不能为空']; try{ DB::beginTransaction(); $time = time(); $model = new SalesOrder(); $model->model_type = SalesOrder::Model_type_two; $model->sales_order_type = SalesOrder::Order_type_two; $model->customer_id = Customer::special_id; $model->order_number = $order_number; $model->crt_id = $order['crt_id']; $model->depart_id = $head; $model->top_depart_id = $head; $model->other_fee = $order['other_fee']; $model->discount_fee = $order['discount_fee']; $model->contract_fee = $order['purchase_total']; $model->contact_order_no = $order['order_number']; $model->sign_time = $time; $model->save(); $sales_order_id = $model->id; //产品字典 $product_map = (new ProductService())->getProductDetail(array_column($product,'product_id')); $insert = []; $product_total = 0; foreach ($product as $value){ $tmp = $product_map[$value['product_id']] ?? []; $product_total += $value['price'] * $value['number']; $insert[] = [ 'sales_order_id' => $sales_order_id, 'product_id' => $value['product_id'], 'number' => $value['number'], 'basic_type_id' => $value['basic_type_id'], 'price' => $value['price'], 'cost' => $tmp['cost'] ?? 0, 'retail_price' => $tmp['retail_price'] ?? 0, 'final_amount' => $value['price'] * $value['number'], ]; } $bool = SalesOrderProductInfo::insert($insert); if(! $bool) return [false,'合同生成失败!']; //反写数据 $tmp = $product_total + $order['other_fee']; $tmp = $tmp > 0 ? $tmp : 1; $rate = ($product_total + $order['other_fee'] - $order['discount_fee']) / $tmp; SalesOrder::where('id',$sales_order_id)->update([ 'product_total' => $product_total, 'rate' => $rate ]); //生成付款单 $model = new PaymentReceipt(); $model->order_number = (new OrderNoService())->createOrderNumber(PaymentReceipt::prefix); $model->data_type = PaymentReceipt::data_type_one; $model->type = PaymentReceipt::type_one; $model->crt_id = $user['id']; $model->depart_id = $head; $model->top_depart_id = $head; $model->save(); $insert = []; $insert[] = [ 'payment_receipt_id' => $model->id, 'data_type' => PaymentReceipt::type_one, 'data_order_no' => $order_number, 'data_order_type' => PaymentReceipt::data_type_one, 'amount' => $order['purchase_total'], 'type' => PaymentReceiptInfo::type_three, 'crt_time' => $time, ]; PaymentReceiptInfo::insert($insert); DB::commit(); }catch (\Throwable $exception){ DB::rollBack(); if (str_contains($exception->getMessage(), '1062') || str_contains($exception->getMessage(), 'Duplicate entry')) { return [false, '网络波动,请重新操作!']; } return [false ,$exception->getMessage()]; } return [true,'']; } //自动生成----------------------------------- //自动生成删除 //分社订货合同删除 public function delCreatePurchaseOrderSales($data, $order){ $sale_order = SalesOrder::where('del_time',0) ->where('contact_order_no',$order['order_number']) ->select('id','order_number') ->get()->toArray(); if(empty($sale_order)) return [true,'']; foreach ($sale_order as $value){ list($status, $msg) = (new SalesOrderService())->salesOrderDel(['id' => $value['id']]); if(! $status) return [false,$msg]; list($status, $msg) = (new PaymentReceiptService())->customerDel(['id' => $value['id']]); if(! $status) return [false,$msg]; } return [true, '']; } //自动生成删除 public function confirmSportsBag($data){ $model = SportsBag::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '活动包不存在或已被删除']; if($model->state != SportsBag::STATE_ONE) return [false, '请确认活动包状态,操作失败']; if($data['type'] == self::TYPE_ONE){ //通过 $model->state = SportsBag::STATE_TWO; $model->save(); }else{ //驳回 $model->state = SportsBag::State_minus_one; $model->save(); } return [true, $model->toArray()]; } public function confirmPaymentReceipt($data){ $model = PaymentReceipt::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '收付款单不存在或已被删除']; if($model->state != PaymentReceipt::STATE_ONE) return [false, '请确认收付款单状态,操作失败']; if($data['type'] == self::TYPE_ONE){ //通过 $model->state = PaymentReceipt::STATE_TWO; $model->save(); }else{ //驳回 $model->state = PaymentReceipt::State_minus_one; $model->save(); } return [true, $model->toArray()]; } public function confirmInvoiceOrder($data){ $model = InvoiceOrder::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '发货单不存在或已被删除']; if($model->state != InvoiceOrder::STATE_ONE) return [false, '请确认发货单状态,操作失败']; $send_data = []; if($data['type'] == self::TYPE_ONE){ //通过 $model->state = InvoiceOrder::STATE_TWO; $model->save(); $sale = SalesOrder::where('id',$model->sales_order_id)->first(); if($sale['sales_order_type'] == SalesOrder::Order_type_one){ //安装件更新发货状态 SalesOrder::where('id',$model->sales_order_id) ->update(['invoice_state' => SalesOrder::invoice_one]); }else{ //快递件更新 单据状态 发货状态 SalesOrder::where('id',$model->sales_order_id) ->update([ 'state' => SalesOrder::State2_one, 'invoice_state' => SalesOrder::invoice_one ]); } //分社采购单更新发货状态 if(! empty($sale->contact_order_no)) { $purchase = PurchaseOrder::where('order_number',$sale->contact_order_no)->where('del_time', 0)->first(); if(! empty($purchase)){ $purchase = $purchase->toArray(); if(in_array($purchase['order_type'], [PurchaseOrder::Order_type_three, PurchaseOrder::Order_type_four])) { //提醒创建人 $emp_tmp = Employee::where('id', $purchase['crt_id'])->value('emp_name'); $send_data[] = [ 'employee_id' => $purchase['crt_id'], 'type' => 2, 'state' => 0, 'menu_id' => 45, 'order_number' => $purchase['order_number'], 'tmp_data' => [ $purchase['order_number'], "分社采购单", '已发货', $emp_tmp, date('Y-m-d H:i:s'), ], ]; } } PurchaseOrder::where('order_number',$sale->contact_order_no)->update(['invoice_state' => PurchaseOrder::invoice_state_one]); } }else{ //驳回 $model->state = InvoiceOrder::STATE_ZERO; $model->save(); } (new OaService())->sendWxOaCheckMessage($send_data); 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){ $key = $value['product_id'] . $value['storehouse_id']; if(isset($insert[$key])){ $insert[$key]['number'] += -($value['number']); }else{ $insert[$key] = [ 'product_id' => $value['product_id'], 'number' => -($value['number']), 'order_type' => InvoiceOrder::prefix, 'order_number' => $order['order_number'], 'crt_time' => $time, 'storehouse_id' => $value['storehouse_id'], 'depart_id' => $order['depart_id'], 'top_depart_id' => $order['top_depart_id'], 'price' => $value['price'], ]; } } $insert = array_values($insert); $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; return [true,'']; } public function confirmPurchaseOrderState($data){ $model = PurchaseOrder::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false,'采购单不存在或已被删除']; if($model->state != PurchaseOrder::STATE_ONE) return [false,'请确认采购单状态,操作失败']; if($data['type'] == self::TYPE_ONE){ $model->state = PurchaseOrder::STATE_TWO; $model->save(); }else{ //驳回 $model->state = PurchaseOrder::State_minus_one; $model->save(); } return [true, $model->toArray()]; } public function confirmPurchaseOrder($data,$user){ $model = PurchaseOrder::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '采购订单不存在或已被删除']; if($model->state != PurchaseOrder::STATE_TWO) return [false, '请确认采购订单状态,操作失败']; $model->state = PurchaseOrder::STATE_Four; $model->save(); 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){ $key = $value['product_id'] . $value['storehouse_id']; if(isset($insert[$key])){ $insert[$key]['number'] += $value['number']; }else{ $insert[$key] = [ 'product_id' => $value['product_id'], 'number' => $value['number'], 'order_type' => PurchaseOrder::prefix, 'order_number' => $order['order_number'], 'crt_time' => $time, 'storehouse_id' => $value['storehouse_id'], 'depart_id' => $order['depart_id'], 'top_depart_id' => $order['top_depart_id'], 'price' => $value['price'], ]; } } $insert = array_values($insert); $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; return [true,'']; } public function confirmPurchaseSpecial($data){ $model = PurchaseOrderSpecial::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false,'虚拟采购订单不存在或已被删除']; if($model->state != PurchaseOrderSpecial::STATE_ONE) return [false,'请确认虚拟采购订单状态,操作失败']; if($data['type'] == self::TYPE_ONE){ $model->state = PurchaseOrderSpecial::STATE_TWO; $model->save(); }else{ //驳回 $model->state = PurchaseOrderSpecial::State_minus_one; $model->save(); } return [true, $model->toArray()]; } public function confirmConstruction($data){ $model = Construction::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '施工单不存在或已被删除']; if($model->state != Construction::STATE_ONE) return [false, '请确认施工单状态,操作失败']; if($data['type'] == self::TYPE_ONE){ $model->state = Construction::STATE_TWO; $model->save(); //已下施工 SalesOrder::where('id',$model->sales_order_id)->update(['state' => SalesOrder::State_five]); }else{ //驳回 $model->state = Construction::State_minus_one; $model->save(); } return [true, $model->toArray()]; } public function recordConstruction($data, $order){ //仅施工不需要库存流水 if($order['model_type'] == Construction::Model_type_two) return [true, self::minus_one]; $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){ $key = $value['product_id'] . $value['storehouse_id']; if(isset($insert[$key])){ $insert[$key]['number'] += -($value['number']); }else{ $insert[$key] = [ 'product_id' => $value['product_id'], 'number' => -($value['number']), 'order_type' => Construction::$prefix[$order['model_type']] ?? '', 'order_number' => $order['order_number'], 'crt_time' => $time, 'storehouse_id' => $value['storehouse_id'], 'depart_id' => $order['depart_id'], 'top_depart_id' => $order['top_depart_id'], 'price' => $value['price'], ]; } } $insert = array_values($insert); $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; return [true,'']; } public function confirmReturnExchangeOrder($data){ $model = ReturnExchangeOrder::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '退换货单不存在或已被删除']; if($model->state != ReturnExchangeOrder::State_one) return [false, '请确认退换货单状态,操作失败']; if($data['type'] == self::TYPE_ONE){ $model->state = ReturnExchangeOrder::State_two; $model->save(); // if($model->data_type == ReturnExchangeOrder::Order_type){ // SalesOrder::where('id', $model->data_id)->update([ // 'state' => SalesOrder::State_six // ]); // } }else{ //驳回 $model->state = ReturnExchangeOrder::State_minus_one; $model->save(); } return [true, $model->toArray()]; } public function recordReturnExchangeOrder($data, $order){ if($order['model_type'] == ReturnExchangeOrder::Model_type_three) return [true, self::minus_one]; // if($order['type'] == ReturnExchangeOrder::Order_type){ // //快递件不记录流水 // $sales_order_type = SalesOrder::where('id',$order['data_id'])->value('sales_order_type'); // if($sales_order_type == SalesOrder::Order_type_two) return [true, self::minus_one]; // } //合同 退货 $map = []; if($order['type'] == ReturnExchangeOrder::Order_type){ //查找 出库数据的产品 $product = OutBoundOrderInfo::where('del_time',0) ->where('data_id', $order['data_id']) ->where('type', OutBoundOrder::out_type_one) ->whereColumn('number','>','return_number') ->select('id','product_id','number','return_number') ->get()->toArray(); foreach($product as $value){ $map[$value['product_id']][] = $value; } } $result = ReturnExchangeOrderProductInfo::where('del_time',0) ->where('return_exchange_id',$order['id']) ->get()->toArray(); if(empty($result)) return [false,'退换货单产品信息不存在或已被删除']; $insert = $update =[]; $time = time(); foreach ($result as $value){ $key = $value['product_id'] . $value['storehouse_id']; $prefix = ReturnExchangeOrder::$prefix[$value['return_or_exchange']] ?? ''; if($value['return_or_exchange'] == ReturnExchangeOrderProductInfo::type_one){ //退货 if($order['type'] == ReturnExchangeOrder::Order_type){ $number = 0; //合同出库数量 $out_array = $map[$value['product_id']] ?? []; if(empty($out_array)){ //未出库 这个退货不需要加回来 不需要流水 continue; } else{ foreach ($out_array as $out){ if($value['number'] <= 0) continue; //剩余能退数量 $out_number = bcsub($out['number'], $out['return_number']); if($out_number >= $value['number']) { $number = bcadd($value['number'], $number); $value['number'] = 0; $t = $value['number']; }else{ $number = bcadd($out_number, $number); $value['number'] = bcsub($value['number'], $out_number); $t = $out_number; } //更新数据 $update[] = [ 'id' => $out['id'], 'return_number' => bcadd($out['return_number'], $t), ]; } } }else{ // 采购 $number = -($value['number']); } if(isset($insert[$key])){ $insert[$key]['number'] += $number; }else{ $insert[$key] = [ 'product_id' => $value['product_id'], 'number' => $number, 'order_type' => $prefix, 'order_number' => $order['order_number'], 'crt_time' => $time, 'storehouse_id' => $value['storehouse_id'], 'depart_id' => $order['depart_id'], 'top_depart_id' => $order['top_depart_id'], 'price' => $value['return_exchange_price'], ]; } } } $insert = array_values($insert); if(empty($insert)) return [true, self::minus_one]; $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; if(! empty($update)){ foreach ($update as $value){ OutBoundOrderInfo::where('id', $value['id']) ->update(['return_number' => $value['return_number']]); } } return [true,'']; } public function confirmInventory($data){ $model = Inventory::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false,'盘点单不存在或已被删除']; if($model->state != Inventory::STATE_ONE) return [false,'请确认盘点单状态,操作失败']; if($data['type'] == self::TYPE_ONE){ $model->state = Inventory::STATE_TWO; $model->save(); }else{ //驳回 $model->state = Inventory::State_minus_one; $model->save(); } return [true, $model->toArray()]; } public function confirmOut($data){ $model = OutBoundOrder::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false,'出库单不存在或已被删除']; if($model->state != OutBoundOrder::STATE_ONE) return [false,'请确认出库单状态,操作失败']; if($data['type'] == self::TYPE_ONE){ $model->state = OutBoundOrder::STATE_TWO; $model->save(); }else{ //驳回 $model->state = OutBoundOrder::State_minus_one; $model->save(); } return [true, $model->toArray()]; } public function recordInventory($data, $order){ $result = InventorySub::where('del_time',0) ->where('inventory_id',$order['id']) ->get()->toArray(); if(empty($result)) return [false,'盘点单明细信息不存在或已被删除']; $prefix = Inventory::prefix; $insert = []; $time = time(); foreach ($result as $value){ $key = $value['product_id'] . $value['storehouse_id']; $number = $value['final_num']; if(isset($insert[$key])){ $insert[$key]['number'] += $number; }else{ $insert[$key] = [ 'product_id' => $value['product_id'], 'number' => $number, 'order_type' => $prefix, 'order_number' => $order['order_number'], 'crt_time' => $time, 'storehouse_id' => $value['storehouse_id'], 'depart_id' => $order['depart_id'], 'top_depart_id' => $order['top_depart_id'], 'price' => $value['price'], ]; } } $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; return [true,'']; } public function recordOut($data, $order){ $result = OutBoundOrderInfo::where('del_time',0) ->where('out_bound_id',$order['id']) ->get()->toArray(); if(empty($result)) return [false,'出库单明细信息不存在或已被删除']; $prefix = OutBoundOrder::prefix; $insert = []; $time = time(); foreach ($result as $value){ $key = $value['product_id'] . $value['storehouse_id']; $number = -($value['number']); if(isset($insert[$key])){ $insert[$key]['number'] += $number; }else{ $insert[$key] = [ 'product_id' => $value['product_id'], 'number' => $number, 'order_type' => $prefix, 'order_number' => $order['order_number'], 'crt_time' => $time, 'storehouse_id' => $value['storehouse_id'], 'depart_id' => $order['depart_id'], 'top_depart_id' => $order['top_depart_id'], 'price' => $value['price'], ]; } } $bool = InOutRecord::insert($insert); if(! $bool) return [false, '流水写入失败']; return [true, '']; } public function settleSalesOrder($data,$user){ $model = SalesOrder::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '合同不存在或已被删除']; //安装件 if($model->state <= SalesOrder::State_four || $model->state >= SalesOrder::State_seven) return [false, '请确认合同状态,操作失败']; SalesOrder::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => SalesOrder::State_seven]); $time = time(); $insert = []; $new = []; if(! empty($data['img'])){ foreach ($data['img'] as $value){ $insert[] = [ 'sales_order_id' => $model->id, 'data_id' => 0, 'type' => SalesOrderInfo::type_seven, 'file' => $value, 'crt_time' => $time, ]; $new[] = $value; } } if(! empty($data['mark'])){ $insert[] = [ 'sales_order_id' => $model->id, 'data_id' => $user['id'], 'type' => SalesOrderInfo::type_eight, 'file' => $data['mark'], 'crt_time' => $time, ]; } if(! empty($insert)) SalesOrderInfo::insert($insert); return [true, ['file' => $new, 'order' => $model->toArray()]]; } public function settleSalesOrderCustomer($data,$user){ $model = SalesOrder::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '合同不存在或已被删除']; if(empty($data['img'])) return [false,'图片不能为空']; //安装件 if($model->state != SalesOrder::State_seven) return [false, '请确认合同状态,操作失败']; SalesOrder::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => SalesOrder::State_eight]); SalesOrderInfo::insert([ 'sales_order_id' => $model->id, 'type' => SalesOrderInfo::type_six, 'file' => $data['img'], 'crt_time' => time(), ]); return [true, $model->toArray()]; } public function settleSalesOrderConfirm($data,$user){ $model = SalesOrder::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '合同不存在或已被删除']; //安装件 if($model->state != SalesOrder::State_four) return [false, '请确认合同状态,操作失败']; $model->is_confirm = 1; $model->save(); $depart = SeeRange::where('del_time',0) ->where('data_id', $model->id) ->where('data_type',SeeRange::type_seven) ->where('type',SeeRange::data_three) ->first(); if(! empty($depart)){ $depart = $depart->toArray(); $channel_id = Depart::where('id',$depart['param_id'])->value('channel_id'); if(! empty($channel_id)){ $emp_name = Employee::where('id',$channel_id)->value('emp_name'); $send_data[] = [ 'employee_id' => $channel_id, 'type' => 2, 'state' => 0, 'menu_id' => 37, 'order_number' => $model->order_number, 'tmp_data' => [ $model->order_number, "派单合同", "门店接收派单", $emp_name, date('Y-m-d H:i:s'), ], ]; (new OaService())->sendWxOaCheckMessage($send_data); } } return [true, $model->toArray()]; } public function settleSalesOrderConfirmBack($data,$user){ $model = SalesOrder::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '合同不存在或已被删除']; //安装件 if($model->state != SalesOrder::State_four) return [false, '请确认合同状态,操作失败']; //校验施工 $bool = Construction::where('del_time',0) ->where('sales_order_id', $model->id) ->exists(); if($bool) return [false,'合同已生成施工单,操作失败']; if($model->is_confirm != 1) return [false, '合同未接受派单,操作失败']; $model->is_confirm = 0; $model->save(); //单据状态还原 SalesOrder::where('del_time',0)->where('id', $model->id)->update([ 'state' => SalesOrder::State_three, 'dispatch_time_second' => 0, 'dispatch_time_second_id' => 0, ]); SeeRange::where('del_time',0) ->where('data_id', $model->id) ->where('data_type',SeeRange::type_seven) ->where('type',SeeRange::data_three) ->update(['del_time' => time()]); return [true, $model->toArray()]; } public function confirmSales($data){ $model = SalesOrder::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '合同不存在或已被删除']; if($model->state != SalesOrder::State_one) return [false, '请确认合同状态,操作失败']; if($data['type'] == self::TYPE_ONE){ $state = SalesOrder::State_three; if(in_array($model->model_type,[SalesOrder::Model_type_four,SalesOrder::Model_type_seven])){ //线上订单 补贴订单 $state = SalesOrder::State_two; } $model->state = $state; $model->save(); }else{ $model->state = SalesOrder::State_minus_one; $model->save(); } return [true, $model->toArray()]; } public function reject_sales($data){ $model = SalesOrder::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '合同不存在或已被删除']; if($model->out_state > SalesOrder::out_zero) return [false, '合同已提交出库,操作失败']; //安装件 if(in_array($model->model_type,[SalesOrder::Model_type_four,SalesOrder::Model_type_seven])){ //线上订单 补贴订单 if($model->state != SalesOrder::State_two) return [false, '请确认合同状态,操作失败']; }else{ //除线上订单 补贴订单 之外 if($model->state != SalesOrder::State_three) return [false, '请确认合同状态,操作失败']; } //未确认 $model->state = SalesOrder::State_zero; $model->save(); return [true, $model->toArray()]; } public function reject_purchase($data){ $model = PurchaseOrder::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '采购单不存在或已被删除']; //安装件 if($model->state != PurchaseOrder::STATE_Four) return [false, '请确认采购单状态,操作失败']; $model->state = PurchaseOrder::STATE_TWO; $model->save(); return [true, $model->toArray()]; } public function reject_purchase_special($data){ $model = PurchaseOrderSpecial::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '虚拟采购订单不存在或已被删除']; //安装件 if($model->state != PurchaseOrderSpecial::STATE_TWO) return [false, '请确认虚拟采购订单状态,操作失败']; $model->state = PurchaseOrder::STATE_ZERO; $model->save(); return [true, $model->toArray()]; } public function reject_purchase_confirm($data){ $model = PurchaseOrder::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '采购单不存在或已被删除']; //安装件 if($model->state != PurchaseOrder::STATE_TWO) return [false, '请确认采购单状态,操作失败']; $model->state = PurchaseOrder::STATE_ZERO; $model->save(); return [true, $model->toArray()]; } public function reject_construction($data){ $model = Construction::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '施工单不存在或已被删除']; //安装件 if($model->state != Construction::STATE_TWO) return [false, '请确认施工单状态,操作失败']; $model->state = Construction::STATE_ZERO; $model->save(); return [true, $model->toArray()]; } public function reject_payment_receipt($data){ $model = PaymentReceipt::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '收付款单不存在或已被删除']; if($model->state != PaymentReceipt::STATE_TWO) return [false, '请确认收付款单状态,操作失败']; $model->state = PaymentReceipt::STATE_ZERO; $model->save(); return [true, $model->toArray()]; } public function reject_sports_bag($data){ $model = SportsBag::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '活动包不存在或已被删除']; if($model->state != SportsBag::STATE_TWO) return [false, '请确认活动包状态,操作失败']; $model->state = SportsBag::STATE_ZERO; $model->save(); return [true, $model->toArray()]; } public function reject_return_exchange($data){ $model = ReturnExchangeOrder::where('order_number', $data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '退换货单不存在或已被删除']; if($model->state != ReturnExchangeOrder::State_two) return [false, '请确认退换货单状态,操作失败']; $model->state = ReturnExchangeOrder::State_zero; $model->save(); return [true, $model->toArray()]; } public function reject_record_construction($data,$order){ //仅施工不需要库存流水 if($order['model_type'] == Construction::Model_type_two) return [true, self::minus_one]; //获取单据最新数据时间 正常施工数据 $crt_time = 0; $latest = InOutRecord::where('del_time',0) ->where('order_number',$data['order_number']) ->where('number','<',0) ->select('crt_time') ->orderBy('crt_time', 'desc') ->first(); if(! empty($latest)) $crt_time = $latest->crt_time; $result = InOutRecord::where('del_time',0) ->where('crt_time',$crt_time) ->where('order_number',$data['order_number']) ->where('number','<',0) ->select('product_id','storehouse_id','number','depart_id','order_number','top_depart_id','order_type','price') ->get()->toArray(); if(empty($result)) return [false,'施工出库流水数据未找到']; //生成对冲数据 $time = time(); foreach ($result as $key => $value){ $result[$key]['number'] = abs($value['number']); $result[$key]['crt_time'] = $time; } $bool = InOutRecord::insert($result); if(! $bool) return [false,'流水写入失败']; //写入流水 return [true, '']; } public function reject_record_purchase($data,$order){ //获取单据最新数据时间 正常采购入库数据 $crt_time = 0; $latest = InOutRecord::where('del_time',0) ->where('order_number',$data['order_number']) ->where('number','>',0) ->select('crt_time') ->orderBy('crt_time', 'desc') ->first(); if(! empty($latest)) $crt_time = $latest->crt_time; $result = InOutRecord::where('del_time',0) ->where('crt_time',$crt_time) ->where('order_number',$data['order_number']) ->where('number','>',0) ->select('product_id','storehouse_id','number','depart_id','order_number','top_depart_id','order_type','price') ->get()->toArray(); if(empty($result)) return [false,'采购入库流水数据未找到']; //生成对冲数据 $time = time(); foreach ($result as $key => $value){ $result[$key]['number'] = - $value['number']; $result[$key]['crt_time'] = $time; } $bool = InOutRecord::insert($result); if(! $bool) return [false,'流水写入失败']; //写入流水 return [true, '']; } public function reject_record_return_exchange($data,$order){ if($order['model_type'] == ReturnExchangeOrder::Model_type_three) return [true, self::minus_one]; //获取单据最新数据时间 正常退换货流水数据 $crt_time = 0; $latest = InOutRecord::where('del_time',0) ->where('order_number',$data['order_number']) ->select('crt_time') ->orderBy('crt_time', 'desc') ->first(); if(! empty($latest)) $crt_time = $latest->crt_time; $result = InOutRecord::where('del_time',0) ->where('crt_time',$crt_time) ->where('order_number',$data['order_number']) ->select('product_id','storehouse_id','number','depart_id','order_number','top_depart_id','order_type','price') ->get()->toArray(); if(empty($result)) return [true, self::minus_one]; //生成对冲数据 $time = time(); foreach ($result as $key => $value){ $result[$key]['number'] = - $value['number']; $result[$key]['crt_time'] = $time; } $bool = InOutRecord::insert($result); if(! $bool) return [false, '流水写入失败']; //写入流水 return [true, '']; } 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_check = self::$opt_1case_check[$data['opt_case']] ?? ''; //走审批流 单据状态改为待审批方法 $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) { $file = []; if(isset($msg['order'])){ $order = $msg['order']; $file = $msg['file']; } else{ $order = $msg; } list($bool,$err) = $this->createRecordAndInventoryMy($data,$user,$order); if($bool){ DB::commit(); if(! empty($file)) return [true, ['file' => ['new' => $file]]]; return [true, '']; }else{ DB::rollBack(); return [false, $err]; } }else{ DB::rollBack(); return [false, $msg]; } } //需要审批流,校验 if($function_check){ list($bool,$msg) = $this->$function_check($data, $user); if(! $bool){ 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']; $lock = ProductInventorySet::type_one; $for_lock = OrderInventoryStock::where('order_number',$order['order_number']) ->where('del_time',0) ->orderBy('id','desc') ->first(); if(! empty($for_lock)) { $for_lock = $for_lock->toArray(); $lock = $for_lock['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 == ProductInventorySet::type_one && ! 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 == ProductInventorySet::type_one && ! 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']] ?? ''; //自动生成删除 $function3 = self::$create_del[$data['opt_case']] ?? ''; try{ DB::beginTransaction(); //更新单据的状态 list($bool,$msg) = $this->$function($data); if(! $bool){ DB::rollBack(); return [false, $msg]; } $order = $msg; if($function3){ list($boolean,$msg) = $this->$function3($data,$order); if(! $boolean) { DB::rollBack(); return [false, $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']] ?? ""; $create = self::$create[$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($create) { list($bool,$msg) = $this->$create($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']] ?? ""; $create = self::$create[$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($create) { list($bool,$msg) = $this->$create($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()]; } } } public function orderInventoryInsert($insert){ if(empty($insert['order_number'])) return; $model = new OrderInventoryStock(); $model->order_number = $insert['order_number']; $model->is_check_stock = $insert['is_check_stock']; $model->save(); } }