'收货单', self::two => '发货单',//确认后出库 self::three => '采购单',//确认后入库 self::four => '合同', // 安装件 合同完结 self::five => '施工单',//确认后出库 self::six => '退换货单',//确认后出库或出库入库 self::seven => '采购单确认', self::eight => '合同确认', ]; //入库操作 public static $in_opt = [ self::three, ]; //出库操作 public static $out_opt = [ self::two, self::five, ]; const TYPE_ONE = 1;//通过 const TYPE_TWO = 2;//不通过 const TYPE_THREE = 3;//通过后驳回 //改为待审核状态 public static $opt_1case = [ self::two => 'waitInvoice',//发货单 self::three => 'waitPurchase',//采购单 入库 self::five => 'waitConstruction',//施工单 self::six => 'waitReturnExchange',//退换货单 self::seven => 'waitPurchaseConfirm', //采购单确认 self::eight => 'waitSales', // 合同安装件 合同确认 ]; public static $finished = [ self::four => 'settleSalesOrder', // 合同 安装件 合同公司完结 self::nine => 'settleSalesOrderCustomer', // 合同 安装件 合同客户完结 ]; //单据操作 public static $opt_case = [ self::two => 'confirmInvoiceOrder', self::three => 'confirmPurchaseOrder', self::five => 'confirmConstruction', self::six => 'confirmReturnExchangeOrder', self::seven => 'confirmPurchaseOrderState', self::eight => 'confirmSales', // 合同 安装件 合同确认 ]; //单据库存流水 public static $record = [ self::two => 'recordInvoiceOrder', self::three => 'recordPurchaseOrder', self::five => 'recordConstruction', self::six => 'recordReturnExchangeOrder' ]; //自动生成 public static $create = [ self::seven => 'createPurchaseOrderSales', //分社合同生成 self::four => 'createPurchaseOrder', // 派给分社的合同确认以后生成虚拟采购单 ]; //审核通过后 驳回 public static $opt_case_reject = [ self::four => 'reject_sales', // 合同 self::three => 'reject_purchase', //采购 self::five => 'reject_construction',//施工单 self::six => 'reject_return_exchange',//退换货 ]; //审核通过后 驳回 产生流水 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,//采购单入库审核通过 ]; public static $operation_order2 = [ self::four => OrderOperation::five, // 合同 安装件 合同公司完结 self::nine => OrderOperation::six, // 合同 安装件 合同客户完结 ]; //旅程日志 驳回 public static $operation_order_reject = [ self::four => OrderOperation::four, //合同弃审 self::six => OrderOperation::ten, //退换货弃审 self::five => OrderOperation::twl, //施工单弃审 self::three => OrderOperation::fif,//采购单入库弃审 ]; //改为待审核--------------------------------- 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_ONE) 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($model->state != 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 waitConstruction($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 waitReturnExchange($data){ $model = ReturnExchangeOrder::where('id',$data['id']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '退换货单不存在或已被删除']; if($model->state != 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($model->state != 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 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, '请确认发货单状态,操作失败']; InvoiceOrder::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => InvoiceOrder::STATE_TWO]); $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 ]); } 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'], ]; } } $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,'请确认采购单状态,操作失败']; //未入库 PurchaseOrder::where('order_number',$data['order_number'])->update(['state' => PurchaseOrder::STATE_TWO]); return [true, $model->toArray()]; } public function confirmPurchaseOrder($data){ $model = PurchaseOrder::where('order_number',$data['order_number']) ->where('del_time',0) ->first(); if(empty($model)) return [false, '采购订单不存在或已被删除']; if($model->state != PurchaseOrder::STATE_Three) return [false, '请确认采购订单状态,操作失败']; // 已出库 PurchaseOrder::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => PurchaseOrder::STATE_Four]); 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'], ]; } } $insert = array_values($insert); $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; return [true,'']; } //分社订货合同 public function createPurchaseOrderSales($order){ //没有供应商 不创建合同 if(empty($order['supplier'])) return [true, '']; //总公司的采购单 不创建合同 $depart = Depart::where('del_time',0) ->where('is_main',1) ->where('parent_id',0) ->first(); $head = 0; if(! empty($depart)) $head = $depart->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, '']; $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, '采购订单产品数据不能为空']; $time = time(); $depart_id = Depart::where('del_time',0)->where('parent_id',0)->where('is_main',1)->value('id'); $model = new SalesOrder(); $model->model_type = SalesOrder::Model_type_two; $model->sales_order_type = SalesOrder::Order_type_one; $model->order_number = $order_number; $model->crt_id = $order['crt_id']; $model->depart_id = $depart_id; $model->top_depart_id = $depart_id; $model->other_fee = $order['other_fee']; $model->discount_fee = $order['discount_fee']; $model->contract_fee = $order['purchase_total']; $model->sign_time = $time; $model->save(); $sales_order_id = $model->id; //产品字典 $product_map = (new ProductService())->getProductDetail(array_column($product,'product_id')); // //获取产品采购使用金额 // $map = (new ProductService())->getProductPrice(array_column($product,'product_id')); // //获取部门目前使用的分社价 // $basic_type_id = Depart::where('id',$order['top_depart_id'])->value('basic_type_id'); // //产品对应的分社价 // $new_map = []; // foreach ($map as $product_id => $value){ // foreach ($value as $v){ // if($v['basic_type_id'] == $basic_type_id && ! empty($v['price'])) $new_map[$product_id] = $v['price']; // } // } $insert = []; $product_total = 0; foreach ($product as $value){ $tmp = $product_map[$value['product_id']] ?? []; // $fs_price = $new_map[$value['product_id']] ?? 0; //有分社价就是分社价格 没有就是零售 // $price = $fs_price ? $fs_price : $tmp['retail_price']; $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,'合同生成失败!']; //反写数据 $rate = ($product_total + $order['other_fee'] - $order['discount_fee']) / ($product_total + $order['other_fee'] ?? 1); SalesOrder::where('id',$sales_order_id)->update([ 'product_total' => $product_total, 'rate' =>$rate ]); return [true,'']; } 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, '请确认施工单状态,操作失败']; //已确认 Construction::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => Construction::STATE_TWO]); //已下施工 SalesOrder::where('id',$model->sales_order_id)->update(['state' => SalesOrder::State_five]); 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){ $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'], ]; } } $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, '请确认退换货单状态,操作失败']; ReturnExchangeOrder::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => ReturnExchangeOrder::State_two]); if($model->data_type == ReturnExchangeOrder::Order_type){ SalesOrder::where('id', $model->data_id)->update([ 'state' => SalesOrder::State_six ]); } return [true, $model->toArray()]; } public function recordReturnExchangeOrder($data, $order){ $result = ReturnExchangeOrderProductInfo::where('del_time',0) ->where('return_exchange_id',$order['id']) ->get()->toArray(); if(empty($result)) return [false,'退换货单产品信息不存在或已被删除']; $insert = $insert2 = []; $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(isset($insert[$key])){ $insert[$key]['number'] += $value['number']; }else{ $insert[$key] = [ 'product_id' => $value['product_id'], 'number' => $value['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'], ]; } }else{ //换货 if(isset($insert2[$key])){ $insert2[$key]['number'] += -($value['number']); }else{ $insert2[$key] = [ 'product_id' => $value['product_id'], 'number' => -($value['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'], ]; } } } $insert = array_values($insert); $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; if(! empty($insert2)) { $insert2 = array_values($insert2); $bool = InOutRecord::insert($insert2); if(! $bool) return [false,'流水写入失败']; } return [true,'']; } public function settleSalesOrder($data){ $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]); return [true, $model->toArray()]; } public function settleSalesOrderCustomer($data){ $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 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, '请确认合同状态,操作失败']; //已确认 SalesOrder::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => SalesOrder::State_two]); return [true, $model->toArray()]; } //总社派给分社的合同 完成生成虚拟采购单 public function createPurchaseOrder($order){ //快递件 if($order['sales_order_type'] == SalesOrder::Order_type_two) return [true,'']; //不是总公司的合同 $depart = Depart::where('del_time',0) ->where('is_main',1) ->where('parent_id',0) ->first(); $head = 0; if(! empty($depart)) $head = $depart->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(); $product_map = $rate = []; $total = 0; foreach ($product as $value){ $total += $value['number'] * $value['retail_price']; if(isset($product_map[$value['product_id']])){ $product_map[$value['product_id']] += $value['retail_price'] * $value['number']; }else{ $product_map[$value['product_id']] = $value['retail_price'] * $value['number']; } } foreach ($product_map as $key => $value){ $rate[$key] = sprintf("%.2f", round($value / $total, 2)); } $model = new PurchaseOrderSpecial(); $model->order_number = $order_number; $model->sales_order_id = $order['id']; $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 = sprintf("%.2f", round($rate_tmp * $fee['other_fee_1'] / $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]); return [true, '']; } 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->state != SalesOrder::State_two) return [false, '请确认合同状态,操作失败']; //未确认 SalesOrder::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => SalesOrder::State_zero]); 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, '请确认采购单状态,操作失败']; //未出库 PurchaseOrder::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => PurchaseOrder::STATE_TWO]); 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, '请确认施工单状态,操作失败']; Construction::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => Construction::STATE_ZERO]); 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, '请确认退换货单状态,操作失败']; ReturnExchangeOrder::where('del_time',0)->where('order_number',$data['order_number']) ->update(['state' => ReturnExchangeOrder::State_zero]); return [true, $model->toArray()]; } public function reject_record_construction($data,$order){ //获取单据最新数据时间 正常施工数据 $latest = InOutRecord::where('del_time',0) ->where('order_number',$data['order_number']) ->where('number','<',0) ->select('crt_time') ->orderBy('crt_time', 'desc') ->first(); $latest = $latest->toArray(); $result = InOutRecord::where('del_time',0) ->where('crt_time',$latest['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') ->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; } //写入流水 return InOutRecord::insert($result); } public function reject_record_purchase($data,$order){ //获取单据最新数据时间 正常采购入库数据 $latest = InOutRecord::where('del_time',0) ->where('order_number',$data['order_number']) ->where('number','>',0) ->select('crt_time') ->orderBy('crt_time', 'desc') ->first(); $latest = $latest->toArray(); $result = InOutRecord::where('del_time',0) ->where('crt_time',$latest['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') ->get()->toArray(); if(empty($result)) return false; //生成对冲数据 $time = time(); foreach ($result as $key => $value){ $result[$key]['number'] = - $value['number']; $result[$key]['crt_time'] = $time; } //写入流水 return InOutRecord::insert($result); } public function reject_record_return_exchange($data,$order){ $result = ReturnExchangeOrderProductInfo::where('del_time',0) ->where('return_exchange_id',$order['id']) ->get()->toArray(); if(empty($result)) return [false,'退换货单产品信息不存在或已被删除']; $insert = $insert2 = []; $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(isset($insert[$key])){ $insert[$key]['number'] += -($value['number']); }else{ $insert[$key] = [ 'product_id' => $value['product_id'], 'number' => -($value['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'], ]; } }else{ //换货 加回 if(isset($insert2[$key])){ $insert2[$key]['number'] += $value['number']; }else{ $insert2[$key] = [ 'product_id' => $value['product_id'], 'number' => $value['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'], ]; } } } $insert = array_values($insert); $bool = InOutRecord::insert($insert); if(! $bool) return [false,'流水写入失败']; if(! empty($insert2)) { $insert2 = array_values($insert2); $bool = InOutRecord::insert($insert2); 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 = self::$opt_1case[$data['opt_case']] ?? ''; $function2 = self::$finished[$data['opt_case']] ?? ''; try{ DB::beginTransaction(); if($function2) { list($bool,$msg) = $this->$function2($data); if($bool) { $order = $msg; if(! empty(self::$operation_order2[$data['opt_case']])){ $type = self::$operation_order2[$data['opt_case']]; (new OrderOperationService())->add([ 'order_number' => $order['order_number'], 'msg' => OrderOperation::$type[$type], 'type' => $type ],$user); } DB::commit(); return [true, '']; }else{ DB::rollBack(); return [false, $msg]; } } //更新单据的状态 从未审核变成待审核 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){ $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,'流水记录不存在']; $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' => $value['top_depart_id'], ]; } if($value['number'] < 0){ if(isset($lock_number[$key])){ $lock_number[$key] += $value['number']; }else{ $lock_number[$key] = $value['number']; } } } //是否锁定 $lock = 0; $depart = Depart::where('del_time',0) ->where('is_main',1) ->where('parent_id',0) ->first(); $head = 0; if(! empty($depart)) $head = $depart->id;//总社 if($head != $order['top_depart_id']) $lock = DB::table('depart_set')->where('top_depart_id',$order['top_depart_id'])->value('param_one'); $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){ $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,'流水记录不存在']; $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' => $value['top_depart_id'], ]; } if($value['number'] > 0){ if(isset($lock_number[$key])){ $lock_number[$key] += $value['number']; }else{ $lock_number[$key] = $value['number']; } } } //是否锁定 $lock = 0; $depart = Depart::where('del_time',0) ->where('is_main',1) ->where('parent_id',0) ->first(); $head = 0; if(! empty($depart)) $head = $depart->id;//总社 if($head != $order['top_depart_id']) $lock = DB::table('depart_set')->where('top_depart_id',$order['top_depart_id'])->value('param_one'); $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, '']; 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, '']; } $order = $msg; if($function2) { //流水 $boolean = $this->$function2($data,$order); if(! $boolean) { DB::rollBack(); return [false, '']; } //库存 $bool = $this->changeInventoryReject($data,$order); if(! $bool){ DB::rollBack(); return [false, '']; } } if(! empty(self::$operation_order_reject[$data['opt_case']])){ $user = $data['user_data'] ?? []; $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->getLine(). $exception->getMessage()]; } }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($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]; } } if($create) { $bool = $this->$create($order); 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()]; } } } }