cqp 4 månader sedan
förälder
incheckning
3c205704b9

+ 13 - 0
app/Http/Controllers/Api/CustomerController.php

@@ -110,4 +110,17 @@ class CustomerController extends BaseController
             return $this->json_return(201,$data);
         }
     }
+
+    public function customerSendWx(Request $request)
+    {
+        $service = new CustomerService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->customerSendWx($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
 }

+ 13 - 6
app/Http/Controllers/Api/TestController.php

@@ -26,17 +26,24 @@ class TestController extends BaseController
     }
 
     public function aa(){
+               (new OaService())->sendWxMsg(1,2,0,34,["T9RMO.202408071529012839","施工单","待确认","陈庆鹏","2024-08-07 15:29:44"]);dd(1);
 //       (new OaService())->sendWxMsg(1,3,2,48,["T9RMO.202408071529012839","拒绝","2024-08-07 15:29:44","(未填写原因)"],"/pages/ReturnExchangeOrder/detail/detail?order_number=55");
 
         //测试消息发送
+//        $tmp_data = [
+//            "T9XS.20240824095952611883",
+//            '陈庆鹏(订单合同)',
+//            '刁法森',
+//            date('Y-m-d H:i:s'),
+//        ];
+//        (new OaService())->sendWxMsg(1,1,0,37,$tmp_data,"/pageA/pages/SalesOrder/detail/detail?order_number=T9XS.20240824095952611883");
         $tmp_data = [
-            "11111",
-            '222',
-            '审核通过',
-            date('Y-m-d H:i:s'),
+            "XNCG202411241422297482",
+            "拒绝",
+            "2024-11-24 14:22:29",
+            "测试"
         ];
-        (new OaService())->sendWxMsg(1,1,0,37,$tmp_data,"/pageA/pages/SalesOrder/detail/detail?order_number=T9XS.20240824095952611883");
-        (new OaService())->sendWxMsg(1,1,0,37,$tmp_data,"/pageA/pages/SalesOrder/detail/detail?order_number=T9XX.2024080912410029251");
+        (new OaService())->sendWxMsg(1,3,2,44,$tmp_data,"/pageA/pages/SalesOrder/detail/detail?order_number=T9XX.2024080912410029251");dd(1);
 
         //测试消息发送
         $tmp_data = [

+ 5 - 0
app/Model/OutBoundOrder.php

@@ -35,4 +35,9 @@ class OutBoundOrder extends UseScopeBaseModel
         self::out_type_one,
         self::out_type_two
     ];
+
+    public static $out_type_name = [
+        self::out_type_one => '合同',
+        self::out_type_two => '',
+    ];
 }

+ 171 - 30
app/Service/CheckService.php

@@ -11,7 +11,10 @@ use App\Model\Inventory;
 use App\Model\InventorySub;
 use App\Model\InvoiceOrder;
 use App\Model\InvoiceOrderInfo;
+use App\Model\OrderInventoryStock;
 use App\Model\OrderOperation;
+use App\Model\OutBoundOrder;
+use App\Model\OutBoundOrderInfo;
 use App\Model\PaymentReceipt;
 use App\Model\PaymentReceiptInfo;
 use App\Model\ProductInventory;
@@ -53,6 +56,7 @@ class CheckService extends Service
     const thi  = 13; //虚拟采购单
     const fourteen  = 14; //盘点
     const fifteen  = 15; //放弃门店派单
+    const sixteen  = 16; //出库单审核
 
     //中文对照
     public $map = [
@@ -71,6 +75,7 @@ class CheckService extends Service
         self::thi => '虚拟采购单',
         self::fourteen => '盘点单',
         self::fifteen => '放弃门店派单',
+        self::sixteen => '出库单审核',
     ];
 
     //入库操作
@@ -82,6 +87,7 @@ class CheckService extends Service
     public static $out_opt = [
         self::two,
         self::five,
+        self::sixteen,
     ];
 
     const TYPE_ONE = 1;//通过
@@ -105,6 +111,7 @@ class CheckService extends Service
         self::twl => 'waitSportsBag', //活动包确认
         self::thi => 'waitPurchaseSpecial', //虚拟采购单
         self::fourteen => 'waitInventory', //盘点单
+        self::sixteen => 'waitOut', //出库单
     ];
 
     public static $finished = [
@@ -127,6 +134,7 @@ class CheckService extends Service
         self::twl => 'confirmSportsBag', // 确认活动包
         self::thi => 'confirmPurchaseSpecial', //虚拟采购单
         self::fourteen => 'confirmInventory', //盘点单
+        self::sixteen => 'confirmOut', //出库单
     ];
 
     //单据库存流水
@@ -136,6 +144,7 @@ class CheckService extends Service
 //        self::five => 'recordConstruction',
         self::six => 'recordReturnExchangeOrder',
         self::fourteen => 'recordInventory',
+        self::sixteen => 'recordOut',
     ];
 
     //自动生成
@@ -304,6 +313,20 @@ class CheckService extends Service
         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)
@@ -685,6 +708,7 @@ class CheckService extends Service
         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;
@@ -705,13 +729,39 @@ class CheckService extends Service
             }
 
             //分社采购单更新发货状态
-            if(! empty($sale->contact_order_no)) PurchaseOrder::where('order_number',$sale->contact_order_no)->update(['invoice_state' => PurchaseOrder::invoice_state_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()];
     }
 
@@ -920,24 +970,18 @@ class CheckService extends Service
 //        }
 
         //合同 退货
-        $construction_pro = [];
+        $map = [];
         if($order['type'] == ReturnExchangeOrder::Order_type){
-            //查找合同下  已经下施工的产品
-            $construction_id = Construction::where('del_time',0)
-                ->where('sales_order_id', $order['data_id'])
-                ->select('id')
+            //查找 出库数据的产品
+            $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();
-            $construction_id = array_column($construction_id,'id');
-            $product = ConstructionProductInfo::where('del_time',0)
-                ->whereIn('construction_id',$construction_id)
-                ->select('product_id','number')
-                ->get()->toArray();
-            foreach ($product as $value){
-                if(isset($construction_pro[$value['product_id']])){
-                    $construction_pro[$value['product_id']] += $value['number'];
-                }else{
-                    $construction_pro[$value['product_id']] = $value['number'];
-                }
+
+            foreach($product as $value){
+                $map[$value['product_id']][] = $value;
             }
         }
 
@@ -945,7 +989,7 @@ class CheckService extends Service
             ->where('return_exchange_id',$order['id'])
             ->get()->toArray();
         if(empty($result)) return [false,'退换货单产品信息不存在或已被删除'];
-        $insert = [];
+        $insert = $update =[];
         $time = time();
         foreach ($result as $value){
             $key = $value['product_id'] . $value['storehouse_id'];
@@ -953,24 +997,39 @@ class CheckService extends Service
             if($value['return_or_exchange'] == ReturnExchangeOrderProductInfo::type_one){
                 //退货
                 if($order['type'] == ReturnExchangeOrder::Order_type){
-                    //合同
-                    $c_number = $construction_pro[$value['product_id']] ?? 0;
-                    if($c_number == 0) {
-                        //未下施工 这个退货不需要加回来  不需要流水
+                    $number = 0;
+                    //合同出库数量
+                    $out_array = $map[$value['product_id']] ?? [];
+                    if(empty($out_array)){
+                        //未出库 这个退货不需要加回来 不需要流水
                         continue;
-                    }else{
-                        if($c_number >= $value['number']) {
-                            //加回来退货的数据
-                            $number = $value['number'];
-                        }else{
-                            //加回来施工的数量
-                            $number = $c_number;
+                    } 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{
@@ -994,6 +1053,13 @@ class CheckService extends Service
         $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,''];
     }
 
@@ -1016,6 +1082,25 @@ class CheckService extends Service
         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'])
@@ -1058,6 +1143,42 @@ class CheckService extends Service
         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)
@@ -1217,6 +1338,8 @@ class CheckService extends Service
             ->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])){
             //线上订单 补贴订单
@@ -1603,7 +1726,17 @@ class CheckService extends Service
         }
 
         //是否校验库存 是的话锁定数量要更新(根据当前操作人所在门店是否校验库存)
-        $lock = $user['is_check_stock'];
+//        $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){
@@ -1905,4 +2038,12 @@ class CheckService extends Service
             }
         }
     }
+
+    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();
+    }
 }

+ 54 - 1
app/Service/ConstructionService.php

@@ -311,6 +311,9 @@ class ConstructionService extends Service
                 ConstructionFile::insert($insert);
             }
 
+            //单据创建时是否校验库存
+            (new CheckService())->orderInventoryInsert(['order_number' => $data['order_number'], 'is_check_stock' => $data['is_check_stock']]);
+
             DB::commit();
         }catch (\Exception $exception){
             DB::rollBack();
@@ -331,7 +334,7 @@ class ConstructionService extends Service
 //            if(! $status) return [true, '保存成功,施工单确认失败,异常信息:' . $msg];
         }
 
-        return [true, ['file' => ['new' => $new], "order" => ['order_number' => $data['order_number'], 'is_check_stock' => $data['is_check_stock']]]];
+        return [true, ['file' => ['new' => $new]]];
     }
 
     /**
@@ -1556,17 +1559,67 @@ class ConstructionService extends Service
         if(empty($order)) return [false,'施工单不存在或已被删除,操作失败'];
         $order = $order->toArray();
 
+        $send_data = [];
         if($data['type'] == 1){
             if($order['state'] != Construction::STATE_TWO) return [false, '请确认施工单单据状态,操作完结失败'];
             $state = Construction::STATE_THREE;
+
+            //提醒分配人
+            $info = ConstructionInfo::where('del_time',0)
+                ->where('construction_id',$order['id'])
+                ->where('type', ConstructionInfo::type_three)
+                ->select('opt_id')
+                ->get()->toArray();
+            $opt_id = array_unique(array_column($info,'opt_id'));
+            if(! empty($opt_id)){
+                $emp_map = Employee::whereIn('id', $opt_id)
+                    ->pluck('emp_name','id')
+                    ->toArray();
+                foreach ($opt_id as $value){
+                    $emp_tmp = $emp_map[$value] ?? "";
+                    $send_data[] = [
+                        'employee_id' => $value,
+                        'type' => 2,
+                        'state' => 0,
+                        'menu_id' => 34,
+                        'order_number' => $order['order_number'],
+                        'tmp_data' => [
+                            $order['order_number'],
+                            "施工单",
+                            '待确认',
+                            $emp_tmp,
+                            date('Y-m-d H:i:s'),
+                        ],
+                    ];
+                }
+            }
         }else{
             if($order['state'] != Construction::STATE_THREE) return [false, '请确认施工单单据状态,操作待确认失败'];
             $state = Construction::STATE_FOUR;
+
+            //提醒创建人
+            $emp_tmp = Employee::where('id', $order['crt_id'])->value('emp_name');
+            $send_data[] = [
+                'employee_id' => $order['crt_id'],
+                'type' => 2,
+                'state' => 0,
+                'menu_id' => 34,
+                'order_number' => $order['order_number'],
+                'tmp_data' => [
+                    $order['order_number'],
+                    "施工单",
+                    '已完结',
+                    $emp_tmp,
+                    date('Y-m-d H:i:s'),
+                ],
+            ];
         }
 
         Construction::where('order_number',$data['order_number'])
             ->update(['state' => $state]);
 
+        (new OaService())->sendWxOaCheckMessage($send_data);
+
         return [true, ''];
     }
 }

+ 43 - 0
app/Service/CustomerService.php

@@ -1209,4 +1209,47 @@ class CustomerService extends Service
 
         return [true, ''];
     }
+
+    //发送客户消息
+    public function customerSendWx($data, $user){
+        list($status,$msg) = $this->customerSendWxRule($data);
+        if(! $status) return [false,$msg];
+
+        try {
+            DB::beginTransaction();
+            $time = time();
+
+            $insert = [];
+
+            //负责人获取 改为前负责人
+            $man = CustomerInfo::where('del_time',0)
+                ->where('customer_id',$data['customer_id'])
+                ->where('type', CustomerInfo::type_two)
+                ->get()->toArray();
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
+    public function customerSendWxRule($data){
+        if(empty($data['id'])) return [false,'请选择客户'];
+
+        $customer = Customer::where('del_time',0)
+            ->whereIn('id',$data['id'])
+            ->get()->toArray();
+        if(empty($customer)) return [false,'客户不存在或已被删除'];
+        $map = array_column($customer,'title', 'id');
+
+        $man = CustomerInfo::where('del_time',0)
+            ->where('customer_id',$data['customer_id'])
+            ->where('type', CustomerInfo::type_two)
+            ->get()->toArray();
+
+        return [true,''];
+    }
 }

+ 32 - 3
app/Service/DeleteService.php

@@ -173,6 +173,7 @@ class DeleteService extends Service
             $send_data = [];
             foreach ($data['man'] as $value){
                 $emp_tmp = $emp_map[$value] ?? "";
+                if($emp_tmp) $emp_tmp .= "(负责人)";
                 foreach ($data_id as $c){
                     //负责人累加
                     $insert[] = [
@@ -191,15 +192,18 @@ class DeleteService extends Service
                         ];
                     }
 
-                    $customer_tmp = $customer_map[$c] ?? "";
+//                    $customer_tmp = $customer_map[$c] ?? "";
+
                     $send_data[] = [
                         'employee_id' => $value,
                         'type' => 2,
                         'state' => 0,
                         'menu_id' => 16,
-                        'order_number' => $customer_tmp,
+                        'order_number' => $c,
                         'tmp_data' => [
-                            $customer_tmp,
+                            $c,
+                            "客户分配",
+                            '成功',
                             $emp_tmp,
                             date('Y-m-d H:i:s'),
                         ],
@@ -276,9 +280,17 @@ class DeleteService extends Service
             ->where('type', ConstructionInfo::type_three)
             ->update(['del_time' => $time]);
 
+        $send_data = [];
         if(! empty($data['man'])){
+            $emp_map = Employee::whereIn('id',$data['man'])
+                ->pluck('emp_name','id')
+                ->toArray();
+
             $insert = [];
             foreach ($data['man'] as $value){
+                $emp_tmp = $emp_map[$value] ?? "";
+                if($emp_tmp) $emp_tmp .= "(施工员)";
+
                 $insert[] = [
                     'construction_id' => $data['id'],
                     'employee_id' => $value,
@@ -286,6 +298,21 @@ class DeleteService extends Service
                     'crt_time' => $time,
                     'opt_id' => $user['id'],
                 ];
+
+                $send_data[] = [
+                    'employee_id' => $value,
+                    'type' => 2,
+                    'state' => 0,
+                    'menu_id' => 34,
+                    'order_number' => $data['id'],
+                    'tmp_data' => [
+                        $data['id'],
+                        "施工分配",
+                        '成功',
+                        $emp_tmp,
+                        date('Y-m-d H:i:s'),
+                    ],
+                ];
             }
             ConstructionInfo::insert($insert);
 
@@ -298,6 +325,8 @@ class DeleteService extends Service
             ],$user);
         }
 
+        (new OaService())->sendWxOaCheckMessage($send_data);
+
         return [true, ''];
     }
 

+ 6 - 1
app/Service/InventoryService.php

@@ -90,6 +90,9 @@ class InventoryService extends Service
                 ProductInventoryService::changeLockNumber($user,$msg[0],[]);
             }
 
+            //单据创建时是否校验库存
+            (new CheckService())->orderInventoryInsert(['order_number' => $data['order_number'], 'is_check_stock' => $data['is_check_stock']]);
+
             DB::commit();
         }catch (\Throwable $exception){
             DB::rollBack();
@@ -99,7 +102,7 @@ class InventoryService extends Service
             return [false,$exception->getMessage()];
         }
 
-        return [true, ["order" => ['order_number' => $data['order_number'], 'is_check_stock' => $user['is_check_stock']]]];
+        return [true, ''];
     }
 
     public function detail($data,$user){
@@ -281,6 +284,8 @@ class InventoryService extends Service
             $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0;
         }
 
+        $data['is_check_stock'] = $user['is_check_stock'];
+
         if($is_add){
             $order_number = (new OrderNoService())->createOrderNumber(Inventory::prefix);
             if(empty($order_number)) return [false,'盘点单号生成失败'];

+ 4 - 1
app/Service/InvoiceOrderService.php

@@ -124,6 +124,9 @@ class InvoiceOrderService extends Service
 //                ProductInventoryService::changeLockNumber($user,$msg[0],[]);
             }
 
+            //单据创建时是否校验库存
+            (new CheckService())->orderInventoryInsert(['order_number' => $data['order_number'], 'is_check_stock' => $data['is_check_stock']]);
+
             DB::commit();
         }catch (\Throwable $exception){
             DB::rollBack();
@@ -133,7 +136,7 @@ class InvoiceOrderService extends Service
             return [false,$exception->getMessage()];
         }
 
-        return [true, ["order" => ['order_number' => $data['order_number'], 'is_check_stock' => $user['is_check_stock']]]];
+        return [true, ''];
     }
 
     /**

+ 62 - 43
app/Service/OutBoundOrderService.php

@@ -17,7 +17,7 @@ class OutBoundOrderService extends Service
 {
     public function edit($data,$user){
         list($status,$msg) = $this->orderRule($data,$user,false);
-        if(!$status) return [$status,$msg];
+        if(! $status) return [$status,$msg];
 
         try{
             DB::beginTransaction();
@@ -36,13 +36,15 @@ class OutBoundOrderService extends Service
                 $sub = [];
                 foreach ($data['product'] as $value){
                     $sub[] = [
-                        'invoice_id' => $material_model->id,
+                        'out_bound_id' => $material_model->id,
                         'order_number' => $data['order_number'],
                         'storehouse_id' => $data['storehouse_id'] ?? 0,
                         'product_id' => $value['product_id'],
                         'number' => $value['number'],
                         'price' => $value['price'] ?? 0,
                         'final_amount' => $value['final_amount'] ?? 0,
+                        'data_id' => $data['data_id'],
+                        'type' => $data['type'],
                     ];
                 }
                 OutBoundOrderInfo::insert($sub);
@@ -57,12 +59,22 @@ class OutBoundOrderService extends Service
             return [false,$e->getMessage()];
         }
 
+        if(! empty($data['check'])) {
+            list($status,$msg) = (new CheckService())->checkAll([
+                "id" => $material_model->id,
+                "order_number" => $data['order_number'],
+                "opt_case" => CheckService::sixteen,
+                "menu_id" => $data['menu_id']
+            ],$user);
+//            if(! $status) return [true, '保存成功,出库单确认失败,异常信息:' . $msg];
+        }
+
         return [true,''];
     }
 
     public function add($data,$user){
         list($status,$msg) = $this->orderRule($data, $user);
-        if(!$status) return [$status,$msg];
+        if(! $status) return [$status,$msg];
 
         try{
             DB::beginTransaction();
@@ -89,6 +101,8 @@ class OutBoundOrderService extends Service
                         'number' => $value['number'],
                         'price' => $value['price'] ?? 0,
                         'final_amount' => $value['final_amount'] ?? 0,
+                        'data_id' => $data['data_id'],
+                        'type' => $data['type'],
                     ];
                 }
                 OutBoundOrderInfo::insert($sub);
@@ -97,6 +111,9 @@ class OutBoundOrderService extends Service
                 ProductInventoryService::changeLockNumber($user,$msg[0],[]);
             }
 
+            //单据创建时是否校验库存
+            (new CheckService())->orderInventoryInsert(['order_number' => $data['order_number'], 'is_check_stock' => $data['is_check_stock']]);
+
             DB::commit();
         }catch (\Throwable $exception){
             DB::rollBack();
@@ -113,18 +130,16 @@ class OutBoundOrderService extends Service
                 "opt_case" => CheckService::sixteen,
                 "menu_id" => $data['menu_id']
             ],$user);
-//            if(! $status) return [true, '保存成功,施工单确认失败,异常信息:' . $msg];
+//            if(! $status) return [true, '保存成功,出库单确认失败,异常信息:' . $msg];
         }
 
-        return [true, ["order" => ['order_number' => $data['order_number'], 'is_check_stock' => $data['is_check_stock']]]];
+        return [true, ''];
     }
 
     public function detail($data){
         if($this->isEmpty($data,'order_number')) return [false,'请选择数据'];
 
-        $order = OutBoundOrder::where('order_number',$data['order_number'])
-            ->where('del_time',0)
-            ->first();
+        $order = OutBoundOrder::where('order_number',$data['order_number'])->where('del_time',0)->first();
         if(empty($order)) return [false, '出库单不存在或已被删除'];
         $order = $order->toArray();
         $order['storehouse_title'] = Storehouse::where('id',$order['storehouse_id'])->value('title');
@@ -161,8 +176,7 @@ class OutBoundOrderService extends Service
     public function del($data, $user){
         if($this->isEmpty($data,'order_number')) return [false,'请选择数据'];
 
-        $order = OutBoundOrder::where('order_number',$data['order_number'])
-            ->first();
+        $order = OutBoundOrder::where('order_number',$data['order_number'])->where('del_time',0)->first();
         if(empty($order)) return [false,'出库单不存在或已被删除'];
         $order = $order->toArray();
         if($order['state'] > OutBoundOrder::STATE_ZERO) return [false,'请确认出库单状态,删除失败'];
@@ -202,12 +216,9 @@ class OutBoundOrderService extends Service
         }
 
         if(! empty($data['sale_order'])){
-            $sale_order_number = $data['sale_order'] ?? "";
-            $model2 = SalesOrder::Clear($user,$data);
-            $sale = $model2->where('del_time',0)
-                ->when(! empty($sale_order_number), function ($query) use ($sale_order_number) {
-                    return $query->where('order_number', 'LIKE', '%'.$sale_order_number.'%');
-                })
+            $sale_order_number = $data['sale_order'];
+            $sale = SalesOrder::where('del_time',0)
+                ->where('order_number', 'LIKE', '%'.$sale_order_number.'%')
                 ->select('id')
                 ->get()->toArray();
             $model->whereIn('data_id',array_unique(array_column($sale,'id')))
@@ -223,29 +234,27 @@ class OutBoundOrderService extends Service
     public function fillListData($data){
         if(empty($data['data'])) return $data;
 
-        $depart_id = array_unique(array_column($data['data'],'depart_id'));
-        $depart_map = Depart::whereIn('id',$depart_id)
-            ->pluck('title','id')
-            ->toArray();
-
         $emp_id = array_unique(array_merge_recursive(array_column($data['data'],'crt_id'),array_column($data['data'],'out_id')));
         $emp_map = Employee::whereIn('id',$emp_id)
             ->pluck('emp_name','id')
             ->toArray();
 
-        $sales = SalesOrder::whereIn('id',array_unique(array_column($data['data'],'sales_order_id')))->select('order_number','id','contact_order_no')->get()->toArray();
-        $sales = array_column($sales,null,'id');
+        $sales_id = [];
+        foreach ($data['data'] as $value){
+            if($value['type'] == OutBoundOrder::out_type_one) $sales_id[] = $value['data_id'];
+        }
+        $sales = SalesOrder::whereIn('id', $sales_id)
+            ->pluck('order_number','id')
+            ->toArray();
         $storehouse = Storehouse::whereIn('id',array_unique(array_column($data['data'],'storehouse_id')))
             ->pluck('title','id')
             ->toArray();
         foreach ($data['data'] as $key => $value){
             $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']) : '';
-            $data['data'][$key]['depart_name'] = $depart_map[$value['depart_id']] ?? '';
             $data['data'][$key]['crt_name'] = $emp_map[$value['crt_id']] ?? '';
             $data['data'][$key]['out_name'] = $emp_map[$value['out_id']] ?? '';
             $data['data'][$key]['state_title'] = OutBoundOrder::$name[$value['state']] ?? '';
-            $tmp = $sales[$value['sales_order_id']] ?? [];
-            $data['data'][$key]['sales_order_number'] = $tmp['order_number'] ?? '';
+            $data['data'][$key]['data_order_number'] = $sales[$value['data_id']] ?? "";
             $data['data'][$key]['storehouse_title'] = $storehouse[$value['storehouse_id']] ?? '';
         }
 
@@ -254,19 +263,19 @@ class OutBoundOrderService extends Service
 
     public function orderRule(&$data, $user, $is_check = true){
         if(empty($data['storehouse_id'])) return [false, '仓库不能为空'];
-        if(empty($data['product'])) return [false, '发货数据不能为空'];
-        if(empty($data['data_id'])) return [false, '发货数据源id不能为空'];
-        if(empty($data['type'])) return [false, '发货类型不能为空'];
+        if(empty($data['product'])) return [false, '出库数据不能为空'];
+        if(empty($data['data_id'])) return [false, '出库数据源id不能为空'];
+        if(empty($data['type'])) return [false, '出库类型不能为空'];
         if(empty($data['out_id'])) $data['out_id'] = $user['id'];
 
         $product_submit = $product_id = [];
         foreach ($data['product'] as $value){
-            if(empty($value['product_id'])) return [false, '发货产品不能为空'];
-            if(empty($value['number'])) return [false, '发货产品数量不能为空'];
+            if(empty($value['product_id'])) return [false, '出库产品不能为空'];
+            if(empty($value['number'])) return [false, '出库产品数量不能为空'];
             $res = $this->checkNumber($value['number']);
             if(! $res) return [false,'请输入正确的产品数量'];
-            if(! isset($value['price'])) return [false, '发货产品单价不能为空'];
-            if(! isset($value['final_amount'])) return [false, '发货产品总价值不能为空'];
+            if(! isset($value['price'])) return [false, '出库产品单价不能为空'];
+            if(! isset($value['final_amount'])) return [false, '出库产品总价值不能为空'];
 
             $key = $value['product_id'] . ',' .$data['storehouse_id'];
             if(isset($product_submit[$key])){
@@ -279,16 +288,20 @@ class OutBoundOrderService extends Service
 
         //剩余能发
         $id = $data['id'] ?? 0;
-        if($data['type'] == OutBoundOrder::out_type_one) $s_product = $this->getSalesProduct(['out_bound_id' => $id, 'data_id' => $data['data_id']], $user);
+        $s_product = [];
+        if($data['type'] == OutBoundOrder::out_type_one)  {
+            $return = $this->getSalesProduct(['out_bound_id' => $id, 'data_id' => $data['data_id'], 'type' => $data['type']], $user);
+            $s_product = array_column($return,'number','product_id');
+        }
 
         //比较
         foreach ($product_submit as $pro => $number){
             $tmp = explode(',',$pro);
             $p = $tmp[0];
-            if(! isset($s_product[$p])) return [false,'产品错误,合同中不存在该产品'];
+            if(! isset($s_product[$p])) return [false,'产品错误,合同中不存在该产品或产品出库已完成'];
             $s_number = $s_product[$p];
 
-            if($number > $s_number) return [false,'发货产品数量不能超过合同产品数量'];
+            if($number > $s_number) return [false,'出库产品数量不能超过合同产品数量'];
         }
 
         //已保存
@@ -308,11 +321,15 @@ class OutBoundOrderService extends Service
 
         if($is_check){
             $order_number = (new OrderNoService())->createOrderNumber(OutBoundOrder::prefix);
-            if(empty($order_number)) return [false,'出库单号生成失败'];
+            if(empty($order_number)) return [false,'出库单号生成失败'];
             $data['order_number'] = $order_number;
         }else{
-            if($this->isEmpty($data,'id')) return [false,'出库单ID不能为空!'];
-            if($this->isEmpty($data,'order_number')) return [false,'出库单号不能为空!'];
+            if($this->isEmpty($data,'id')) return [false,'出库单ID不能为空'];
+            if($this->isEmpty($data,'order_number')) return [false,'出库单号不能为空'];
+            $order = OutBoundOrder::where('order_number', $data['order_number'])->where('del_time',0)->first();
+            if(empty($order)) return [false, '出库单不存在或已被删除'];
+            $order = $order->toArray();
+            if($order['state'] > OutBoundOrder::STATE_ZERO) return [false, '请确认出库单状态,编辑失败'];
         }
 
         return [true, [$product_submit, $product_save]];
@@ -325,9 +342,9 @@ class OutBoundOrderService extends Service
         if(empty($data['type'])) return [false, '出库类型不能为空'];
         if(! in_array($data['type'], OutBoundOrder::$out_type)) return [false, '出库类型不存在'];
 
-        // 合同 发货
+        // 合同 出库
         $return = [];
-        if($data['type'] == OutBoundOrder::out_type_one) $this->getSalesProduct($data, $user);
+        if($data['type'] == OutBoundOrder::out_type_one) $return = $this->getSalesProduct($data, $user);
 
         return [true, $return];
     }
@@ -342,10 +359,11 @@ class OutBoundOrderService extends Service
             ->get()->toArray();
         $map = (new ProductService())->getProductDetail(array_column($product,'product_id'));
 
+        //合同出库产品
         $product_map = [];
         $save = OutBoundOrderInfo::where('del_time',0)
             ->where('type', $data['type'])
-            ->where('id', $data_id)
+            ->where('data_id', $data_id)
             ->when(! empty($out_bound_id), function ($query) use ($out_bound_id) {
                 return $query->where('out_bound_id', '<>', $out_bound_id);
             })
@@ -360,6 +378,7 @@ class OutBoundOrderService extends Service
             }
         }
 
+        //合同退货产品
         $product_map2 = [];
         $return_id = ReturnExchangeOrder::where('del_time',0)
             ->where('type', ReturnExchangeOrder::Order_type)
@@ -384,7 +403,7 @@ class OutBoundOrderService extends Service
         foreach ($product as $value){
             $p1 = $product_map[$value['product_id']] ?? 0;
             $p2 = $product_map2[$value['product_id']] ?? 0;
-            $number = bcadd(bcsub($value['number'], $p1), $p2);
+            $number = bcsub(bcsub($value['number'], $p1), $p2);
             if($number <= 0) continue;
 
             $tmp = $map[$value['product_id']] ?? [];

+ 6 - 1
app/Service/ReturnExchangeOrderService.php

@@ -174,6 +174,9 @@ class ReturnExchangeOrderService extends Service
 //                ProductInventoryService::changeLockNumber($user, $msg[0],[]);
             }
 
+            //单据创建时是否校验库存
+            (new CheckService())->orderInventoryInsert(['order_number' => $data['order_number'], 'is_check_stock' => $data['is_check_stock']]);
+
             DB::commit();
         }catch (\Throwable $exception){
             DB::rollBack();
@@ -195,7 +198,7 @@ class ReturnExchangeOrderService extends Service
 //            if(! $status) return [true, '保存成功,退换货单提交失败,异常信息:' . $msg];
         }
 
-        return [true, ["order" => ['order_number' => $data['order_number'], 'is_check_stock' => $user['is_check_stock']]]];
+        return [true, ''];
     }
 
     public function detail($data,$user){
@@ -508,6 +511,8 @@ class ReturnExchangeOrderService extends Service
         $res = $this->checkNumber($data['difference_amount']);
         if(! $res) return [false, '金额请输入不超过两位小数并且大于等于0的数值'];
 
+        $data['is_check_stock'] = $user['is_check_stock'];
+
         $total = 0;
         if($data['type'] == ReturnExchangeOrder::Order_type){
             $sale = SalesOrder::where('del_time',0)->where('id',$data['data_id'])->first();

+ 1 - 0
config/morequery.php

@@ -69,6 +69,7 @@ return [
 
     //34 施工单 35 退换货单 37 订单合同  38 T9采购单  44 虚拟采购单 45 分社采购单 48 收付款单
     "detail_message" => [
+        16 => '/pages/CustomerManage/detail/detail?id=',
         34 => '/pages/ConstructionOrder/add/detail/detail?order_number=',
         35 => '/pages/ReturnExchangeOrder/detail/detail?order_number=',
         37 => '/pageA/pages/SalesOrder/detail/detail?order_number=',

+ 3 - 0
config/wx/msg.php

@@ -23,6 +23,9 @@ return [
         '48_1' => 1,
         '48_2' => 2,
         '48_3_2' => 3,
+        '16_1' => 1,
+        '16_2' => 2,
+        '16_3_2' => 3,
     ],
 
     'wx_tmp_id' => [

+ 7 - 6
routes/api.php

@@ -131,6 +131,7 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('customerDetail', 'Api\CustomerController@customerDetail');
     $route->any('customerGrabbing', 'Api\CustomerController@customerGrabbing');
     $route->any('customerImportanceEdit', 'Api\CustomerController@customerImportanceEdit');
+    $route->any('customerSendWx', 'Api\CustomerController@customerSendWx');
 
     //供应商
     $route->any('supplierList', 'Api\SupplierController@customerList');
@@ -182,14 +183,14 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('invoiceOrderList', 'Api\InvoiceOrderController@invoiceOrderList');
     $route->any('invoiceOrderEdit', 'Api\InvoiceOrderController@invoiceOrderEdit');
     $route->any('invoiceOrderDetail', 'Api\InvoiceOrderController@invoiceOrderDetail');
-    $route->any('invoiceOrderAdd', 'Api\InvoiceOrderController@invoiceOrderAdd')->middleware('OrderDeal');
+    $route->any('invoiceOrderAdd', 'Api\InvoiceOrderController@invoiceOrderAdd');
     $route->any('invoiceOrderDel', 'Api\InvoiceOrderController@invoiceOrderDel');
 
     //出库单
     $route->any('outBoundOrderList', 'Api\OutBoundOrderController@getList');
     $route->any('outBoundOrderEdit', 'Api\OutBoundOrderController@edit');
     $route->any('outBoundOrderDetail', 'Api\OutBoundOrderController@detail');
-    $route->any('outBoundOrderAdd', 'Api\OutBoundOrderController@add')->middleware('OrderDeal');
+    $route->any('outBoundOrderAdd', 'Api\OutBoundOrderController@add');
     $route->any('outBoundOrderDel', 'Api\OutBoundOrderController@del');
     $route->any('outBoundGetProduct', 'Api\OutBoundOrderController@outBoundGetProduct');
 
@@ -222,7 +223,7 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('constructionList', 'Api\ConstructionController@constructionList');
     $route->any('constructionEdit', 'Api\ConstructionController@constructionEdit')->middleware('OssFileDeal');
     $route->any('constructionDetail', 'Api\ConstructionController@constructionDetail');
-    $route->any('constructionAdd', 'Api\ConstructionController@constructionAdd')->middleware('OrderDeal')->middleware('OssFileDeal');
+    $route->any('constructionAdd', 'Api\ConstructionController@constructionAdd')->middleware('OssFileDeal');
     $route->any('constructionDel', 'Api\ConstructionController@constructionDel')->middleware('OssFileDeal');
     $route->any('constructionPdf', 'Api\ConstructionController@constructionPdf');
     $route->any('constructionOperation', 'Api\ConstructionController@constructionOperation');
@@ -237,7 +238,7 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('ReturnExchangeOrderList', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderList');
     $route->any('ReturnExchangeOrderEdit', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderEdit');
     $route->any('ReturnExchangeOrderDetail', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderDetail');
-    $route->any('ReturnExchangeOrderAdd', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderAdd')->middleware('OrderDeal');
+    $route->any('ReturnExchangeOrderAdd', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderAdd');
     $route->any('ReturnExchangeOrderDel', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderDel');
 
     //活动包 组合活动包
@@ -274,9 +275,9 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('inventoryList', 'Api\InventoryController@inventoryList');
     $route->any('inventoryEdit', 'Api\InventoryController@inventoryEdit');
     $route->any('inventoryDetail', 'Api\InventoryController@inventoryDetail');
-    $route->any('inventoryAdd', 'Api\InventoryController@inventoryAdd')->middleware('OrderDeal')->middleware('OrderDeal');
+    $route->any('inventoryAdd', 'Api\InventoryController@inventoryAdd');
     $route->any('inventoryDel', 'Api\InventoryController@inventoryDel');
-    $route->any('inventoryImport', 'Api\InventoryController@inventoryImport')->middleware('OrderDeal');
+    $route->any('inventoryImport', 'Api\InventoryController@inventoryImport');
 
     //排班设置
     $route->any('scheduleList', 'Api\ScheduleController@getList');

+ 3 - 3
routes/wx.php

@@ -56,7 +56,7 @@ Route::group(['middleware'=> ['checkWx']],function ($route){
     $route->any('constructionList', 'Api\ConstructionController@constructionList');
     $route->any('constructionEdit', 'Api\ConstructionController@constructionEdit')->middleware('OssFileDeal');
     $route->any('constructionDetail', 'Api\ConstructionController@constructionDetail');
-    $route->any('constructionAdd', 'Api\ConstructionController@constructionAdd')->middleware('OrderDeal')->middleware('OssFileDeal');
+    $route->any('constructionAdd', 'Api\ConstructionController@constructionAdd')->middleware('OssFileDeal');
     $route->any('constructionDel', 'Api\ConstructionController@constructionDel')->middleware('OssFileDeal');
     $route->any('deliveryNoteList', 'Api\ConstructionController@deliveryNoteList');
     $route->any('deliveryNoteDetail', 'Api\ConstructionController@deliveryNoteDetail');
@@ -80,14 +80,14 @@ Route::group(['middleware'=> ['checkWx']],function ($route){
     $route->any('ReturnExchangeOrderList', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderList');
     $route->any('ReturnExchangeOrderEdit', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderEdit');
     $route->any('ReturnExchangeOrderDetail', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderDetail');
-    $route->any('ReturnExchangeOrderAdd', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderAdd')->middleware('OrderDeal');
+    $route->any('ReturnExchangeOrderAdd', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderAdd');
     $route->any('ReturnExchangeOrderDel', 'Api\ReturnExchangeOrderController@ReturnExchangeOrderDel');
 
     //盘点单
     $route->any('inventoryList', 'Api\InventoryController@inventoryList');
     $route->any('inventoryEdit', 'Api\InventoryController@inventoryEdit');
     $route->any('inventoryDetail', 'Api\InventoryController@inventoryDetail');
-    $route->any('inventoryAdd', 'Api\InventoryController@inventoryAdd')->middleware('OrderDeal');
+    $route->any('inventoryAdd', 'Api\InventoryController@inventoryAdd');
     $route->any('inventoryDel', 'Api\InventoryController@inventoryDel');
 
     //排班设置