瀏覽代碼

Merge remote-tracking branch 'origin/master'

gogs 1 年之前
父節點
當前提交
9bbdd01b6a

+ 24 - 0
app/Http/Controllers/Api/ProductInventoryController.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+
+use App\Service\ProductInventoryService;
+use App\Service\ProductService;
+use Illuminate\Http\Request;
+
+class ProductInventoryController extends BaseController
+{
+    public function productInventoryList(Request $request)
+    {
+        $service = new ProductInventoryService();
+        $user = $request->userData->toArray();
+        list($status,$data) = $service->productInventoryList($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+}

+ 14 - 2
app/Http/Controllers/Api/SalesOrderController.php

@@ -83,10 +83,22 @@ class SalesOrderController extends BaseController
         }
     }
 
-    public function salesOrderDispatch(Request $request)
+    public function salesOrderDispatchSale(Request $request)
     {
         $service = new SalesOrderService();
-        list($status,$data) = $service->salesOrderDispatch($request->all());
+        list($status,$data) = $service->salesOrderDispatchSale($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function salesOrderDispatchCompany(Request $request)
+    {
+        $service = new SalesOrderService();
+        list($status,$data) = $service->salesOrderDispatchCompany($request->all());
 
         if($status){
             return $this->json_return(200,'',$data);

+ 7 - 0
app/Model/Construction.php

@@ -24,6 +24,13 @@ class Construction extends Model
         self::Model_type_two => 'T9SH.',
     ];
 
+    const STATE_ZERO = 0;//未确认
+    const STATE_ONE = 1;//已确认
+    public static $name = [
+        self::STATE_ZERO => '未确认',
+        self::STATE_ONE => '已确认',
+    ];
+
     public static $user = [];
     public static $is_search = false;
 

+ 1 - 1
app/Model/PurchaseOrderInfo.php

@@ -8,7 +8,7 @@ class PurchaseOrderInfo extends Model
 {
     protected $table = "purchase_order_info"; //指定表
     const CREATED_AT = 'crt_time';
-    const UPDATED_AT = 'upd_time';
+    const UPDATED_AT = null;
     protected $dateFormat = 'U';
     const STATE_ZERO = 0;//未发货
     const STATE_ONE = 1;//部分已发货

+ 10 - 4
app/Model/SalesOrder.php

@@ -28,11 +28,17 @@ class SalesOrder extends Model
         self::Model_type_three
     ];
 
-    const State_zero = 0;//未锁定
-    const State_one = 1;//锁定
+    const State_zero = 0;//未派单
+    const State_one = 1;//已派销售
+    const State_two = 2;//已派公司或分社
+    const State_three = 3;//已下施工单
+    const State_four = 4;//退换货
     public static $state = [
-        self::State_zero => '未锁定',
-        self::State_one => '锁定',
+        self::State_zero => '未派单',
+        self::State_one => '已派销售',
+        self::State_two => '已派总设或分社',
+        self::State_three => '已下施工单',
+        self::State_four => '退换货',
     ];
 
     public static $prefix = [

+ 13 - 0
app/Model/SalesOrderOtherFee.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class SalesOrderOtherFee extends Model
+{
+    protected $table = "sales_order_other_fee"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+}

+ 21 - 0
app/Model/SalesOrderRange.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class SalesOrderRange extends Model
+{
+    protected $table = "sales_order_range"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const type_one = 1; // 部门
+    const type_two = 2; // 人
+    const type_three = 3; // 公司
+    public static $type = [
+        self::type_one,
+        self::type_two,
+        self::type_three,
+    ];
+}

+ 32 - 0
app/Scopes/SalesOrderScope.php

@@ -0,0 +1,32 @@
+<?php
+namespace App\Scopes;
+
+use App\Model\Employee;
+use App\Model\SalesOrderInfo;
+use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Scope;
+
+class SalesOrderScope implements Scope
+{
+    public $user = [];
+
+    public function __construct($user = [])
+    {
+        $this->user = $user;
+    }
+
+    public function apply(Builder $builder, Model $model)
+    {
+        if($this->user['id'] != Employee::SPECIAL_ADMIN) {
+            $sales_order_id = SalesOrderInfo::where('del_time',0)
+                ->where('employee_id',$this->user['id'])
+                ->select('sales_order_id')
+                ->get()->toArray();
+            $sales_order_id = array_unique(array_column($sales_order_id,'sales_order_id'));
+            $builder->orWhere(function ($query) use ($sales_order_id){
+                $query->whereIn('id',$sales_order_id);
+            });
+        }
+    }
+}

+ 55 - 5
app/Service/CheckService.php

@@ -2,6 +2,8 @@
 
 namespace App\Service;
 
+use App\Model\Construction;
+use App\Model\ConstructionProductInfo;
 use App\Model\InOutRecord;
 use App\Model\InvoiceOrder;
 use App\Model\InvoiceOrderInfo;
@@ -27,7 +29,7 @@ class CheckService extends Service
         self::two => '发货单',//确认后出库
         self::three => '采购单',//确认后入库
         self::four => '销售订单',
-        self::five => '施工单',
+        self::five => '施工单',//确认后出库
     ];
 
     //入库操作
@@ -49,12 +51,14 @@ class CheckService extends Service
         self::two => 'confirmInvoiceOrder',
         self::three => 'confirmPurchaseOrder',
         self::four => 'confirmSalesOrder',
+        self::five => 'confirmConstruction',
     ];
 
     //单据库存流水
     public static $record = [
         self::two => 'recordInvoiceOrder',
         self::three => 'recordPurchaseOrder',
+        self::five => 'recordConstruction',
     ];
 
     public function confirmInvoiceOrder($data){
@@ -76,14 +80,17 @@ class CheckService extends Service
             ->get()->toArray();
         if(empty($result)) return [false,'发货单产品信息不存在或已被删除'];
         $insert = [];
+        $time = time();
         foreach ($result as $value){
             if(isset($insert[$value['product_id']])){
-                $insert[$value['product_id']]['number'] += $value['number'];
+                $insert[$value['product_id']]['number'] += -($value['number']);
             }else{
                 $insert[$value['product_id']] = [
                     'product_id' => $value['product_id'],
-                    'number' => $value['number'],
-                    'order_type' => InvoiceOrder::prefix
+                    'number' => -($value['number']),
+                    'order_type' => InvoiceOrder::prefix,
+                    'order_number' => $order['order_number'],
+                    'crt_time' => $time
                 ];
             }
         }
@@ -113,6 +120,7 @@ class CheckService extends Service
             ->get()->toArray();
         if(empty($result)) return [false,'采购单产品信息不存在或已被删除'];
         $insert = [];
+        $time = time();
         foreach ($result as $value){
             if(isset($insert[$value['product_id']])){
                 $insert[$value['product_id']]['number'] += $value['number'];
@@ -120,7 +128,9 @@ class CheckService extends Service
                 $insert[$value['product_id']] = [
                     'product_id' => $value['product_id'],
                     'number' => $value['number'],
-                    'order_type' => PurchaseOrder::prefix
+                    'order_type' => PurchaseOrder::prefix,
+                    'order_number' => $order['order_number'],
+                    'crt_time' => $time
                 ];
             }
         }
@@ -147,6 +157,46 @@ class CheckService extends Service
         return [true,$model->toArray()];
     }
 
+    public function confirmConstruction($data){
+        $model = Construction::where('id',$data['id'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($model)) return [false, '施工单不存在或已被删除'];
+        if($model->state != Construction::STATE_ZERO) return [false, '请确认施工单状态,操作失败'];
+
+        Construction::where('del_time',0)->where('id',$data['id'])
+            ->update(['state' => Construction::STATE_ONE]);
+
+        return [true, $model->toArray()];
+    }
+
+    public function recordConstruction($data, $order){
+        $result = ConstructionProductInfo::where('del_time',0)
+            ->where('construction_id',$order['id'])
+            ->get()->toArray();
+        if(empty($result)) return [false,'施工单产品信息不存在或已被删除'];
+        $insert = [];
+        $time = time();
+        foreach ($result as $value){
+            if(isset($insert[$value['product_id']])){
+                $insert[$value['product_id']]['number'] += -($value['number']);
+            }else{
+                $insert[$value['product_id']] = [
+                    'product_id' => $value['product_id'],
+                    'number' => -($value['number']),
+                    'order_type' => Construction::$prefix[$order['model_type']] ?? '',
+                    'order_number' => $order['order_number'],
+                    'crt_time' => $time
+                ];
+            }
+        }
+        $insert = array_values($insert);
+        $bool = InOutRecord::insert($insert);
+        if(! $bool) return [false,'流水写入失败'];
+
+        return [true,''];
+    }
+
     public function checkAll($data,$user){
         if(empty($data['id']) || empty($data['opt_case'])) return [false,'必传参数不能为空或者参数值错误!'];
 

+ 71 - 30
app/Service/ConstructionService.php

@@ -8,7 +8,6 @@ use App\Model\ConstructionInfo;
 use App\Model\ConstructionProductInfo;
 use App\Model\Customer;
 use App\Model\Employee;
-use App\Model\Product;
 use App\Model\SalesOrder;
 use Illuminate\Support\Facades\DB;
 
@@ -86,11 +85,22 @@ class ConstructionService extends Service
                         'product_id' => $value['product_id'],
                         'price' => $value['retail_price'],
                         'number' => $value['number'],
+                        'title' => $value['title'],
+                        'code' => $value['code'] ?? '',
+                        'size' => $value['size'] ?? '',
+                        'unit' => $value['unit'] ?? 0,
+                        'bar_code' => $value['bar_code'] ?? '',
+                        'cost' => $value['cost'] ?? 0,
+                        'depart_price' => $value['depart_price'] ?? 0,
+                        'retail_price' => $value['retail_price'] ?? 0,
                         'mark' => $value['mark'] ?? '',
                         'crt_time' => $time,
                     ];
                 }
                 ConstructionProductInfo::insert($insert);
+
+                //锁定库存
+                ProductInventoryService::changeLockNumber($msg[0],$msg[1]);
             }
 
             DB::commit();
@@ -168,11 +178,22 @@ class ConstructionService extends Service
                         'product_id' => $value['product_id'],
                         'price' => $value['retail_price'],
                         'number' => $value['number'],
-                        'mark' => $value['mark']?? '',
+                        'title' => $value['title'],
+                        'code' => $value['code'] ?? '',
+                        'size' => $value['size'] ?? '',
+                        'unit' => $value['unit'] ?? 0,
+                        'bar_code' => $value['bar_code'] ?? '',
+                        'cost' => $value['cost'] ?? 0,
+                        'depart_price' => $value['depart_price'] ?? 0,
+                        'retail_price' => $value['retail_price'] ?? 0,
+                        'mark' => $value['mark'] ?? '',
                         'crt_time' => $time,
                     ];
                 }
                 ConstructionProductInfo::insert($insert);
+
+                //锁定库存
+                ProductInventoryService::changeLockNumber($msg[0]);
             }
 
             DB::commit();
@@ -187,6 +208,7 @@ class ConstructionService extends Service
     public function constructionDel($data){
         if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
 
+        $product_save = $this->getSaveDetail($data['id']);
         try {
             DB::beginTransaction();
 
@@ -200,6 +222,9 @@ class ConstructionService extends Service
                 ->where('construction_id',$data['id'])
                 ->update(['del_time' => time()]);
 
+            //锁定库存释放
+            ProductInventoryService::changeLockNumber([],$product_save);
+
             DB::commit();
         }catch (\Exception $exception){
             DB::rollBack();
@@ -268,7 +293,7 @@ class ConstructionService extends Service
             }elseif ($value['type'] == ConstructionInfo::type_two){
                 $tmp = [
                     'id' => $value['employee_id'],
-                    'name' => $emp_map[$value['employee_id']],
+                    'name' => $emp_map[$value['employee_id']] ?? '',
                 ];
                 $construction['employee_one'][] = $tmp;
             }
@@ -276,26 +301,9 @@ class ConstructionService extends Service
 
         $p_info = ConstructionProductInfo::where('del_time',0)
             ->where('construction_id',$construction['id'])
-            ->select('id','construction_id','product_id','mark','price','number')
-            ->get()->toArray();
-        $pro = Product::whereIn('id',array_column($p_info,'product_id'))
-            ->select('bar_code','code','cost','depart_price','size','title','id')
             ->get()->toArray();
-        $pro = array_column($pro,null,'id');
         foreach ($p_info as $value){
-            $p = $pro[$value['product_id']] ?? [];
-            $construction['product'][] = [
-                'product_id' => $value['product_id'],
-                'mark' => $value['mark'],
-                'retail_price' => $value['price'],
-                'number' => $value['number'],
-                'bar_code' => $p['bar_code'] ?? '',
-                'code' => $p['code'] ?? '',
-                'cost' => $p['cost'] ?? 0,
-                'depart_price' => $p['depart_price'] ?? 0,
-                'size' => $p['size'] ?? '',
-                'title' => $p['title'] ?? '',
-            ];
+            $construction['product'][] = $value;
         }
         $construction['crt_name'] = $emp_map[$construction['crt_id']] ?? '';
         $construction['crt_time'] = $construction['crt_time'] ? date("Y-m-d H:i:s",$construction['crt_time']): '';
@@ -323,16 +331,12 @@ class ConstructionService extends Service
         if(empty($data['order_number'])) return [false,'工单编号不能为空'];
         if(empty($data['construction_time'])) return [false,'实施日期不能为空'];
         $data['construction_time'] = $this->changeDateToDateMin($data['construction_time']);
+        if(empty($data['sales_order_id'])) return [false,'请选择合同'];
+        $sale = SalesOrder::where('del_time',0)->where('id',$data['sales_order_id'])->first();
+        if(empty($sale)) return [false,'合同不存在或已被删除'];
+        if($sale['state'] < SalesOrder::State_two) return [false,'合同未派单,不允许新建施工单'];
         if(empty($data['product'])) return [false,'请选择产品'];
-        foreach ($data['product'] as $value){
-            if(empty($value['number'])) return [false,'产品数量不能为空'];
-            $res = $this->checkNumber($value['number']);
-            if(! $res) return [false,'请输入正确的产品数量'];
 
-            if(empty($value['retail_price'])) return [false,'产品价格不能为空'];
-            $res = $this->checkNumber($value['retail_price']);
-            if(! $res) return [false,'产品价格请输入不超过两位小数并且大于0的数值'];
-        }
         if(! empty($data['construction_fee'])){
             $res = $this->checkNumber($data['construction_fee']);
             if(! $res) return [false,'施工费用请输入不超过两位小数并且大于0的数值'];
@@ -356,14 +360,35 @@ class ConstructionService extends Service
         if(empty($data['depart_id'])) $data['depart_id'] = $this->getDepart($user);
         $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0;
 
+        $product_submit = $product_save = [];
+        foreach ($data['product'] as $value){
+            if(empty($value['number'])) return [false,'产品数量不能为空'];
+            $res = $this->checkNumber($value['number']);
+            if(! $res) return [false,'请输入正确的产品数量'];
+
+            if(isset($product_submit[$value['product_id']])){
+                $product_submit[$value['product_id']] += $value['number'];
+            }else{
+                $product_submit[$value['product_id']] = $value['number'];
+            }
+        }
+        $order_number = "";
+        if(! $is_add) $order_number = $data['order_number'];
+        list($status,$msg) = (new ProductInventoryService())->compareStock(array_keys($product_submit), [
+            'order_number' => $order_number,
+            'product' => $product_submit
+        ]);
+        if(! $status) return [false, $msg];
+
         if($is_add){
             $bool = Construction::where('del_time',0)->where('order_number',$data['order_number'])->exists();
             if($bool) return [false,'工单编号已存在,请重新获取'];
         }else{
             if(empty($data['id'])) return [false,'ID不能为空'];
+            $product_save = $this->getSaveDetail($data['id']);
         }
 
-        return [true, $data];
+        return [true, [$product_submit, $product_save]];
     }
 
     public function fillData($data){
@@ -409,4 +434,20 @@ class ConstructionService extends Service
 
         return [true,['order_number' => $order_number]];
     }
+
+    public function getSaveDetail($id){
+        $product_save = [];
+        $sub = ConstructionProductInfo::where('construction_id',$id)
+            ->where('del_time',0)
+            ->get()->toArray();
+        foreach ($sub as $value){
+            if(isset($product_save[$value['product_id']])){
+                $product_save[$value['product_id']] += $value['number'];
+            }else{
+                $product_save[$value['product_id']] = $value['number'];
+            }
+        }
+
+        return $product_save;
+    }
 }

+ 3 - 3
app/Service/CustomerService.php

@@ -372,19 +372,19 @@ class CustomerService extends Service
             }elseif ($value['type'] == CustomerInfo::type_two){
                 $tmp = [
                     'id' => $value['employee_id'],
-                    'name' => $emp_map[$value['employee_id']],
+                    'name' => $emp_map[$value['employee_id']] ?? '',
                 ];
                 $customer['employee_one'][] = $tmp;
             }elseif ($value['type'] == CustomerInfo::type_three){
                 $tmp = [
                     'id' => $value['employee_id'],
-                    'name' => $emp_map[$value['employee_id']],
+                    'name' => $emp_map[$value['employee_id']] ?? '',
                 ];
                 $customer['employee_two'][] = $tmp;
             }elseif ($value['type'] == CustomerInfo::type_four){
                 $tmp = [
                     'id' => $value['employee_id'],
-                    'name' => $emp_map[$value['employee_id']],
+                    'name' => $emp_map[$value['employee_id']] ?? '',
                 ];
                 $customer['employee_three'][] = $tmp;
             }elseif ($value['type'] == CustomerInfo::type_five){

+ 7 - 6
app/Service/EmployeeService.php

@@ -569,19 +569,20 @@ class EmployeeService extends Service
 
             $data['data'][$key]['upd_time'] = time();
 
+            //Depart::whereRaw("(binary code = '{$value['code']}' OR title = '{$value['title']}')")
             if($is_check){
                 $data['data'][$key]['crt_time'] = time();
-                $bool = Depart::whereRaw("(binary code = '{$value['code']}' OR title = '{$value['title']}')")
+                $bool = Depart::whereRaw("binary code = '{$value['code']}'")
                     ->where('del_time',0)
                     ->exists();
             }else{
                 if($this->isEmpty($data,'id')) return [false,'id不能为空!'];
-                $bool = Depart::whereRaw("(binary code = '{$value['code']}' OR title = '{$value['title']}')")
+                $bool = Depart::whereRaw("binary code = '{$value['code']}'")
                     ->where('id','<>',$data['id'])
                     ->where('del_time',0)
                     ->exists();
             }
-            if($bool) return [false,'编码或部门名称不能重复'];
+            if($bool) return [false,'编码不能重复'];
         }
 
         return [true, $data];
@@ -1028,11 +1029,11 @@ class EmployeeService extends Service
                     if($value['is_main']) {//是总社
                         $top_tmp = $map[$value['depart_id']];
                         if(! empty($depart_map[$top_tmp]['is_main'])){
-                            //顶级部门是总公司  所有部门都有
+                            //顶级公司是总公司 所有部门都有
                             $rule = array_column($list,'id');
                         }else{
-                            //顶级部门不是总公司 自己以及自己之下
-                            $depart_id = array_merge(self::getAllIds($list,$value['depart_id']),[$value['depart_id']]);
+                            //顶级公司是分公司 分公司所有部门
+                            $depart_id = array_merge(self::getAllIds($list,$top_tmp),[$top_tmp]);
                             $rule = array_merge_recursive($rule,$depart_id);
                         }
                     }else{//不是总社

+ 34 - 11
app/Service/InvoiceOrderService.php

@@ -18,7 +18,7 @@ class InvoiceOrderService extends Service
         try{
             DB::beginTransaction();
             $material_model = InvoiceOrder::where('order_number',$data['order_number'])->first();
-            $material_model->contact_order_number = $data['contact_order_number'];
+            $material_model->sales_order_id = $data['sales_order_id'];
             $material_model->send = $data['send'];
             $material_model->send_time = $data['send_time'];
             $material_model->take = $data['take'];
@@ -26,7 +26,7 @@ class InvoiceOrderService extends Service
             $material_model->take_phone = $data['take_phone'];
             $material_model->logistics_company = $data['logistics_company'];
             $material_model->logistics_number = $data['logistics_number'];
-            $material_model->depart_id = $data['depart_id'];
+            $material_model->depart_id = $data['depart_id'] ?? 0;
             $material_model->mark = $data['mark'];
             $material_model->save();
 
@@ -37,11 +37,17 @@ class InvoiceOrderService extends Service
                 $sub = [];
                 foreach ($data['product'] as $value){
                     $sub[] = [
+                        'invoice_id' => $material_model->id,
                         'order_number' => $data['order_number'],
                         'depart_id' => $data['depart_id'] ?? 0,
                         'product_id' => $value['product_id'],
                         'number' => $value['number'],
                         'mark' => $value['mark'] ?? '',
+                        'title' => $value['title'] ?? '',
+                        'code' => $value['code'] ?? '',
+                        'size' => $value['size'] ?? '',
+                        'unit' => $value['unit'] ?? 0,
+                        'bar_code' => $value['bar_code'] ?? '',
                     ];
                 }
                 InvoiceOrderInfo::insert($sub);
@@ -67,7 +73,7 @@ class InvoiceOrderService extends Service
             DB::beginTransaction();
             $material_model = new InvoiceOrder();
             $material_model->order_number = $data['order_number'];
-            $material_model->contact_order_number = $data['contact_order_number'];
+            $material_model->sales_order_id = $data['sales_order_id'];
             $material_model->send = $data['send'];
             $material_model->send_time = $data['send_time'];
             $material_model->take = $data['take'];
@@ -75,7 +81,7 @@ class InvoiceOrderService extends Service
             $material_model->take_phone = $data['take_phone'];
             $material_model->logistics_company = $data['logistics_company'];
             $material_model->logistics_number = $data['logistics_number'];
-            $material_model->depart_id = $data['depart_id'];
+            $material_model->depart_id = $data['depart_id'] ?? 0;
             $material_model->mark = $data['mark'];
             $material_model->crt_id = $user['id'];
             $material_model->save();
@@ -84,11 +90,17 @@ class InvoiceOrderService extends Service
                 $sub = [];
                 foreach ($data['product'] as $value){
                     $sub[] = [
+                        'invoice_id' => $material_model->id,
                         'order_number' => $data['order_number'],
                         'depart_id' => $data['depart_id'] ?? 0,
                         'product_id' => $value['product_id'],
                         'number' => $value['number'],
                         'mark' => $value['mark'] ?? '',
+                        'title' => $value['title'] ?? '',
+                        'code' => $value['code'] ?? '',
+                        'size' => $value['size'] ?? '',
+                        'unit' => $value['unit'] ?? 0,
+                        'bar_code' => $value['bar_code'] ?? '',
                     ];
                 }
                 InvoiceOrderInfo::insert($sub);
@@ -111,15 +123,25 @@ class InvoiceOrderService extends Service
 
         $order = InvoiceOrder::where('order_number',$data['order_number'])
             ->where('del_time',0)
-            ->select('id','order_number','contact_order_number','depart_id','send','send_time','take','take_address','take_phone','logistics_company','logistics_number','crt_id','mark','state')
+            ->select('id','order_number','sales_order_id','send','send_time','take','take_address','take_phone','logistics_company','logistics_number','crt_id','mark','state','crt_time')
             ->first();
         if(empty($order)) return [false, '发货订单不存在或已被删除'];
+        $order = $order->toArray();
+        $order['state_title'] = InvoiceOrder::$name[$order['state']] ?? '';
+        $sales = SalesOrder::where('id',$order['sales_order_id'])->value('order_number');
+        $order['sales_order_number'] = $sales;
 
+        $emp_map = Employee::whereIn('id',array_unique(array_merge_recursive([$order['crt_id']],[$order['send']])))
+            ->pluck('emp_name','id')
+            ->toArray();
         $info = InvoiceOrderInfo::where('del_time',0)
             ->where('order_number',$data['order_number'])
-            ->select('id','order_number','depart_id','product_id','number','mark')
+            ->select('id','order_number','depart_id','product_id','number','mark','title','code','size','unit','bar_code','invoice_id')
             ->get()->toArray();
         $order['product'] = $info;
+        $order['send_name'] = $emp_map[$order['send']] ?? '';
+        $order['crt_name'] = $emp_map[$order['crt_id']] ?? '';
+        $order['crt_time'] = $order['crt_time'] ? date("Y-m-d H:i:s",$order['crt_time']): '';
 
         return [true, $order];
     }
@@ -154,10 +176,9 @@ class InvoiceOrderService extends Service
 
     public function getList($data,$user){
         $model = InvoiceOrder::where('del_time',0)
-            ->select('id','order_number','contact_order_number','depart_id','send','send_time','take','take_address','take_phone','logistics_company','logistics_number','crt_id','mark','state')
+            ->select('id','order_number','sales_order_id','depart_id','send','send_time','take','take_address','take_phone','logistics_company','logistics_number','crt_id','mark','state','crt_time')
             ->orderby('id', 'desc');
         if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
-        if(! empty($data['contact_order_number'])) $model->where('contact_order_number', 'LIKE', '%'.$data['contact_order_number'].'%');
         if(! empty($data['depart_id'])) $model->where('depart_id', $data['depart_id']);
         if(isset($data['state'])) $model->where('state',$data['state']);
         if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
@@ -184,12 +205,14 @@ class InvoiceOrderService extends Service
                     ->pluck('emp_name','id')
                     ->toArray();
 
+        $sales = SalesOrder::whereIn('id',array_unique(array_column($data['data'],'sales_order_id')))->pluck('order_number','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]['send_name'] = $emp_map[$value['send']] ?? '';
-            $data['data'][$key]['state_name'] = InvoiceOrder::$name[$value['state']] ?? '';
+            $data['data'][$key]['state_title'] = InvoiceOrder::$name[$value['state']] ?? '';
+            $data['data'][$key]['sales_order_number'] = $sales[$value['sales_order_id']] ?? '';
         }
 
         return $data;
@@ -199,9 +222,9 @@ class InvoiceOrderService extends Service
         if($this->isEmpty($data,'send')) return [false,'发货人不能为空!'];
         if($this->isEmpty($data,'product')) return [false,'产品不能为空!'];
         if(! empty($data['send_time'])) $data['send_time'] = $this->changeDateToDateMin($data['send_time']);
-        if(! empty($data['contact_order_number'])) {
+        if(! empty($data['sales_order_id'])) {
             $sales = SalesOrder::where('del_time',0)
-                ->where('order_number',$data['contact_order_number'])
+                ->where('id',$data['sales_order_id'])
                 ->first();
             if(empty($sales)) return [false,'合同不存在或已被删除'];
             if($sales['sales_order_type'] != SalesOrder::Order_type_two) return [false,'非快递件合同'];

+ 37 - 1
app/Service/ProductInventoryService.php

@@ -7,6 +7,7 @@ use App\Model\ConstructionProductInfo;
 use App\Model\InvoiceOrder;
 use App\Model\InvoiceOrderInfo;
 use App\Model\Product;
+use App\Model\ProductCategory;
 use App\Model\ProductInventory;
 use App\Model\Setting;
 use Illuminate\Support\Facades\DB;
@@ -14,7 +15,7 @@ use Illuminate\Support\Facades\DB;
 class ProductInventoryService extends Service
 {
     //获取产品真实库存
-    public static function getRealStock($product_id = [],$data){
+    public static function getRealStock($product_id = [],$data=[]){
         if(empty($product_id)) return [];
         $array = ProductInventory::whereIn('product_id',$product_id)
             ->where('number','>',0)
@@ -182,4 +183,39 @@ class ProductInventoryService extends Service
 
         return [true,''];
     }
+
+    //现存量
+    public function productInventoryList($data,$user){
+        $model = ProductInventory::from('product_inventory as a')
+            ->join('product as b','b.id','a.product_id')
+            ->select('a.product_id','a.id','a.number','b.title','b.code','b.product_category_id','b.unit','b.bar_code','a.crt_time')
+            ->orderby('a.crt_time', 'desc');
+        if(! empty($data['product_category_id'])) $model->where("b.product_category_id", $data['product_category_id']);
+        if(!empty($data['code'])) $model->where('b.code', 'LIKE', '%'.$data['code'].'%');
+        if(! empty($data['product_id'])) $model->where('a.product_id', $data['product_id']);
+        if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
+            $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
+            $model->whereBetween('a.crt_time',[$return[0],$return[1]]);
+        }
+
+        $list = $this->limit($model,'',$data);
+        $list = $this->fillListData($list);
+
+        return [true, $list];
+    }
+
+    public function fillListData($data){
+        if(empty($data['data'])) return $data;
+
+        $category = ProductCategory::whereIn('id',array_column($data['data'],'product_category_id'))
+            ->pluck('title','id')
+            ->toArray();
+
+        foreach ($data['data'] as $key => $value){
+            $data['data'][$key]['product_category_title'] = $category[$value['product_category_id']] ?? '';
+            $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']):'';
+        }
+
+        return $data;
+    }
 }

+ 1 - 1
app/Service/ProductService.php

@@ -408,7 +408,7 @@ class ProductService extends Service
             }elseif ($value['type'] == ProductRange::type_two){
                 $tmp = [
                     'id' => $value['employee_id'],
-                    'name' => $emp_map[$value['employee_id']],
+                    'name' => $emp_map[$value['employee_id']] ?? '',
                 ];
                 $customer['employee'][] = $tmp;
             }

+ 73 - 7
app/Service/PurchaseOrderService.php

@@ -4,8 +4,10 @@ namespace App\Service;
 
 use App\Model\Depart;
 use App\Model\Employee;
+use App\Model\Product;
 use App\Model\PurchaseOrder;
 use App\Model\PurchaseOrderInfo;
+use App\Model\SalesOrder;
 use Illuminate\Support\Facades\DB;
 
 class PurchaseOrderService extends Service
@@ -17,9 +19,17 @@ class PurchaseOrderService extends Service
         try{
             DB::beginTransaction();
             $material_model = PurchaseOrder::where('order_number',$data['order_number'])->first();
+            $material_model->order_number = $data['order_number'];
             $material_model->depart_id = $data['depart_id'] ?? 0;
+            $material_model->rate = $data['rate'] ?? 0;
+            $material_model->total = $data['total'] ?? 0;
+            $material_model->other_fee = $data['other_fee'] ?? 0;
+            $material_model->discount_fee = $data['discount_fee'] ?? 0;
+            $material_model->purchase_total = $data['purchase_total'] ?? 0;
+            $material_model->supplier = $data['supplier'] ?? '';
+            $material_model->purchase_id = $data['purchase_id'] ?? 0;
             $material_model->order_type = $data['order_type'];
-            $material_model->contact_order_no = $data['contact_order_no'] ?? '';
+            $material_model->sales_order_id = $data['sales_order_id'] ?? 0;
             $material_model->mark = $data['mark'] ?? '';
             $material_model->save();
 
@@ -30,11 +40,18 @@ class PurchaseOrderService extends Service
                 $sub = [];
                 foreach ($data['product'] as $value){
                     $sub[] = [
+                        'purchase_order_id' => $material_model->id,
                         'order_number' => $data['order_number'],
                         'depart_id' => $data['depart_id'] ?? 0,
                         'product_id' => $value['product_id'],
                         'number' => $value['number'],
+                        'price' => $value['price'],
                         'mark' => $value['mark'] ?? '',
+                        'title' => $value['title'] ?? '',
+                        'code' => $value['code'] ?? '',
+                        'size' => $value['size'] ?? '',
+                        'unit' => $value['unit'] ?? 0,
+                        'bar_code' => $value['bar_code'] ?? '',
                     ];
                 }
                 PurchaseOrderInfo::insert($sub);
@@ -55,9 +72,17 @@ class PurchaseOrderService extends Service
         try{
             DB::beginTransaction();
             $material_model = new PurchaseOrder();
+            $material_model->order_number = $data['order_number'];
             $material_model->depart_id = $data['depart_id'] ?? 0;
+            $material_model->rate = $data['rate'] ?? 0;
+            $material_model->total = $data['total'] ?? 0;
+            $material_model->other_fee = $data['other_fee'] ?? 0;
+            $material_model->discount_fee = $data['discount_fee'] ?? 0;
+            $material_model->purchase_total = $data['purchase_total'] ?? 0;
+            $material_model->supplier = $data['supplier'] ?? '';
+            $material_model->purchase_id = $data['purchase_id'] ?? 0;
             $material_model->order_type = $data['order_type'];
-            $material_model->contact_order_no = $data['contact_order_no'] ?? '';
+            $material_model->sales_order_id = $data['sales_order_id'] ?? 0;
             $material_model->mark = $data['mark'] ?? '';
             $material_model->crt_id = $user['id'];
             $material_model->save();
@@ -66,11 +91,18 @@ class PurchaseOrderService extends Service
                 $sub = [];
                 foreach ($data['product'] as $value){
                     $sub[] = [
+                        'purchase_order_id' => $material_model->id,
                         'order_number' => $data['order_number'],
                         'depart_id' => $data['depart_id'] ?? 0,
                         'product_id' => $value['product_id'],
                         'number' => $value['number'],
+                        'price' => $value['price'],
                         'mark' => $value['mark'] ?? '',
+                        'title' => $value['title'] ?? '',
+                        'code' => $value['code'] ?? '',
+                        'size' => $value['size'] ?? '',
+                        'unit' => $value['unit'] ?? 0,
+                        'bar_code' => $value['bar_code'] ?? '',
                     ];
                 }
                 PurchaseOrderInfo::insert($sub);
@@ -90,15 +122,26 @@ class PurchaseOrderService extends Service
 
         $order = PurchaseOrder::where('order_number',$data['order_number'])
             ->where('del_time',0)
-            ->select('id','order_number','depart_id','mark','state','crt_id','order_type','contact_order_no')
+            ->select('id','order_number','depart_id','mark','state','crt_id','order_type','sales_order_id','supplier','purchase_id','rate','total','other_fee','discount_fee','purchase_total','crt_time')
             ->first();
         if(empty($order)) return [false, '采购订单不存在或已被删除'];
+        $order = $order->toArray();
+        $order['order_type_title'] = PurchaseOrder::$order_type[$order['order_type']] ?? '';
+        $order['state_title'] = PurchaseOrder::$name[$order['state']] ?? '';
+        $sales = SalesOrder::where('id',$order['sales_order_id'])->value('order_number');
+        $order['sales_order_number'] = $sales;
+        $emp_map = Employee::whereIn('id',array_unique(array_merge_recursive([$order['purchase_id']],[$order['crt_id']])))
+            ->pluck('emp_name','id')
+            ->toArray();
+        $order['purchase_title'] = $emp_map[$order['purchase_id']] ?? '';
 
         $info = PurchaseOrderInfo::where('del_time',0)
             ->where('order_number',$data['order_number'])
-            ->select('id','order_number','depart_id','product_id','number','mark')
+            ->select('id','order_number','depart_id','product_id','number','mark','price','title','size','code','bar_code','purchase_order_id')
             ->get()->toArray();
         $order['product'] = $info;
+        $order['crt_name'] = $emp_map[$order['crt_id']] ?? '';
+        $order['crt_time'] = $order['crt_time'] ? date("Y-m-d H:i:s",$order['crt_time']): '';
 
         return [true, $order];
     }
@@ -130,7 +173,7 @@ class PurchaseOrderService extends Service
 
     public function getList($data,$user){
         $model = PurchaseOrder::where('del_time',0)
-            ->select('order_number','id','depart_id','mark','crt_time','state','crt_id','order_type','contact_order_no')
+            ->select('order_number','id','depart_id','mark','crt_time','state','crt_id','order_type','sales_order_id','supplier','purchase_id','purchase_total','rate','discount_fee','other_fee','total')
             ->orderby('id', 'desc');
         if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
         if(! empty($data['depart_id'])) $model->where('depart_id', $data['depart_id']);
@@ -155,16 +198,20 @@ class PurchaseOrderService extends Service
             ->pluck('title','id')
             ->toArray();
 
-        $emp_id = array_unique(array_column($data['data'],'crt_id'));
+        $emp_id = array_unique(array_merge_recursive(array_column($data['data'],'crt_id'),array_column($data['data'],'purchase_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')))->pluck('order_number','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]['purchase_name'] = $emp_map[$value['purchase_id']] ?? '';
             $data['data'][$key]['order_type_title'] = PurchaseOrder::$order_type[$value['order_type']] ?? '';
+            $data['data'][$key]['state_title'] = PurchaseOrder::$name[$value['state']] ?? '';
+            $data['data'][$key]['sales_order_number'] = $sales[$value['sales_order_id']] ?? '';
         }
 
         return $data;
@@ -173,7 +220,26 @@ class PurchaseOrderService extends Service
     public function orderRule(&$data, $is_check = true){
         if(empty($data['order_type'])) return [false,'采购订单类型不能为空'];
         if($this->isEmpty($data,'product')) return [false,'产品不能为空'];
-
+        if(! empty($data['rate'])){
+            $res = $this->checkNumber($data['rate']);
+            if(! $res) return [false, '整单扣除率请输入不超过两位小数并且大于0的数值'];
+        }
+        if(! empty($data['other_fee'])){
+            $res = $this->checkNumber($data['other_fee']);
+            if(! $res) return [false, '其它费用请输入不超过两位小数并且大于0的数值'];
+        }
+        if(! empty($data['discount_fee'])){
+            $res = $this->checkNumber($data['discount_fee']);
+            if(! $res) return [false, '优惠金额请输入不超过两位小数并且大于0的数值'];
+        }
+        if(! empty($data['total'])){
+            $res = $this->checkNumber($data['total']);
+            if(! $res) return [false, '产品总价请输入不超过两位小数并且大于0的数值'];
+        }
+        if(! empty($data['purchase_total'])){
+            $res = $this->checkNumber($data['purchase_total']);
+            if(! $res) return [false, '采购总价请输入不超过两位小数并且大于0的数值'];
+        }
         foreach ($data['product'] as $value){
             if(empty($value['number'])) return [false,'产品数量不能为空'];
             $res = $this->checkNumber($value['number']);

+ 229 - 45
app/Service/SalesOrderService.php

@@ -3,12 +3,16 @@
 namespace App\Service;
 
 use App\Model\BasicType;
+use App\Model\Construction;
 use App\Model\Customer;
+use App\Model\Depart;
 use App\Model\Employee;
 use App\Model\Product;
 use App\Model\SalesOrder;
 use App\Model\SalesOrderInfo;
+use App\Model\SalesOrderOtherFee;
 use App\Model\SalesOrderProductInfo;
+use App\Model\SalesOrderRange;
 use Illuminate\Support\Facades\DB;
 
 class SalesOrderService extends Service
@@ -104,13 +108,25 @@ class SalesOrderService extends Service
             }
 
             if(! empty($data['product'])){
+                $pro = Product::whereIn('id',array_column($data['product'],'product_id'))
+                    ->select('bar_code','code','cost','depart_price','size','title','id','retail_price')
+                    ->get()->toArray();
+                $pro = array_column($pro,null,'id');
                 $insert = [];
                 foreach ($data['product'] as $value){
+                    $tmp = $pro[$value['product_id']] ?? [];
                     $insert[] = [
                         'sales_order_id' => $model->id,
                         'product_id' => $value['product_id'],
-                        'price' => $value['retail_price'],
                         'number' => $value['number'],
+                        'title' => $tmp['title'],
+                        'code' => $tmp['code'] ?? '',
+                        'size' => $tmp['size'] ?? '',
+                        'unit' => $tmp['unit'] ?? 0,
+                        'bar_code' => $tmp['bar_code'] ?? '',
+                        'cost' => $tmp['cost'] ?? 0,
+                        'depart_price' => $tmp['depart_price'] ?? 0,
+                        'retail_price' => $tmp['retail_price'] ?? 0,
                         'mark' => $value['mark'] ?? '',
                         'crt_time' => $time,
                     ];
@@ -212,13 +228,25 @@ class SalesOrderService extends Service
             }
 
             if(! empty($data['product'])){
+                $pro = Product::whereIn('id',array_column($data['product'],'product_id'))
+                    ->select('bar_code','code','cost','depart_price','size','title','id','retail_price')
+                    ->get()->toArray();
+                $pro = array_column($pro,null,'id');
                 $insert = [];
                 foreach ($data['product'] as $value){
+                    $tmp = $pro[$value['product_id']] ?? [];
                     $insert[] = [
                         'sales_order_id' => $model->id,
                         'product_id' => $value['product_id'],
-                        'price' => $value['retail_price'],
                         'number' => $value['number'],
+                        'title' => $tmp['title'],
+                        'code' => $tmp['code'] ?? '',
+                        'size' => $tmp['size'] ?? '',
+                        'unit' => $tmp['unit'] ?? 0,
+                        'bar_code' => $tmp['bar_code'] ?? '',
+                        'cost' => $tmp['cost'] ?? 0,
+                        'depart_price' => $tmp['depart_price'] ?? 0,
+                        'retail_price' => $tmp['retail_price'] ?? 0,
                         'mark' => $value['mark'] ?? '',
                         'crt_time' => $time,
                     ];
@@ -250,6 +278,12 @@ class SalesOrderService extends Service
             SalesOrderProductInfo::where('del_time',0)
                 ->where('sales_order_id',$data['id'])
                 ->update(['del_time' => time()]);
+            SalesOrderRange::where('del_time',0)
+                ->where('sales_order_id',$data['id'])
+                ->update(['del_time' => time()]);
+            SalesOrderOtherFee::where('del_time',0)
+                ->where('sales_order_id',$data['id'])
+                ->update(['del_time' => time()]);
 
             DB::commit();
         }catch (\Exception $exception){
@@ -270,7 +304,7 @@ class SalesOrderService extends Service
         $sales = $sales->toArray();
         $customer = Customer::where('id',$sales['customer_id'])->value('title');
         $sales['customer_title'] = $customer;
-        $sales['employee_one'] = $sales['employee_two'] = $sales['employee_three'] = $sales['product'] = [];
+        $sales['employee_one'] = $sales['employee_two'] = $sales['employee_three'] = $sales['product'] = $sales['dispatch_depart_one'] = $sales['dispatch_employee'] = $sales['dispatch_depart_two'] = [];
         $array = [
             $sales['order_type'],
             $sales['deal_type'],
@@ -307,7 +341,7 @@ class SalesOrderService extends Service
         foreach ($sales_info as $value){
             $tmp = [
                 'id' => $value['employee_id'],
-                'name' => $emp_map[$value['employee_id']],
+                'name' => $emp_map[$value['employee_id']] ?? '',
             ];
             if($value['type'] == SalesOrderInfo::type_one){
                 $sales['employee_one'][] = $tmp;
@@ -320,30 +354,45 @@ class SalesOrderService extends Service
 
         $sales_p_info = SalesOrderProductInfo::where('del_time',0)
             ->where('sales_order_id',$sales['id'])
-            ->select('id','sales_order_id','product_id','mark','price','number')
-            ->get()->toArray();
-        $pro = Product::whereIn('id',array_column($sales_p_info,'product_id'))
-            ->select('bar_code','code','cost','depart_price','size','title','id')
             ->get()->toArray();
-        $pro = array_column($pro,null,'id');
         foreach ($sales_p_info as $value){
-            $p = $pro[$value['product_id']] ?? [];
-            $sales['product'][] = [
-                'product_id' => $value['product_id'],
-                'mark' => $value['mark'],
-                'retail_price' => $value['price'],
-                'number' => $value['number'],
-                'bar_code' => $p['bar_code'] ?? '',
-                'code' => $p['code'] ?? '',
-                'cost' => $p['cost'] ?? 0,
-                'depart_price' => $p['depart_price'] ?? 0,
-                'size' => $p['size'] ?? '',
-                'title' => $p['title'] ?? '',
-            ];
+            $sales['product'][] = $value;
         }
         $sales['crt_name'] = $emp_map[$sales['crt_id']] ?? '';
         $sales['crt_time'] = $sales['crt_time'] ? date("Y-m-d H:i:s",$sales['crt_time']): '';
 
+        //派单后数据
+        $range = SalesOrderRange::where('del_time',0)
+            ->where('sales_order_id',$data['id'])
+            ->get()->toArray();
+        $emp_map = Employee::whereIn('id',array_unique(array_column($range,'employee_id')))
+            ->pluck('emp_name','id')
+            ->toArray();
+        $depart_map = Depart::whereIn('id',array_unique(array_column($range,'depart_id')))
+            ->pluck('title','id')
+            ->toArray();
+        foreach ($range as $value){
+            if($value['type'] == SalesOrderRange::type_one){
+                $tmp = [
+                    'id' => $value['depart_id'],
+                    'name' => $depart_map[$value['depart_id']],
+                ];
+                $sales['dispatch_depart_one'][] = $tmp;
+            }elseif ($value['type'] == SalesOrderRange::type_two){
+                $tmp = [
+                    'id' => $value['employee_id'],
+                    'name' => $emp_map[$value['employee_id']] ?? '',
+                ];
+                $sales['dispatch_employee'][] = $tmp;
+            }elseif ($value['type'] == SalesOrderRange::type_three){
+                $tmp = [
+                    'id' => $value['employee_id'],
+                    'name' => $depart_map[$value['depart_id']],
+                ];
+                $sales['dispatch_depart_two'][] = $tmp;
+            }
+        }
+
         return [true, $sales];
     }
 
@@ -353,6 +402,26 @@ class SalesOrderService extends Service
             ->select('title','id','sales_order_type','model_type','order_number','selling_price','vin_no','car_type','order_type','deal_type','customer_id','sign_time','contract_state','crt_id','crt_time','mark','product_total','rate','construction_time','handover_time','expire_time','other_fee','discount_fee','contract_fee','contract_type','pay_way','send_state','logistics_company','logistics_number','car_type','year','mileage','color','original_set','processing','state')
             ->orderby('id', 'desc');
 
+        if($user['id'] != Employee::SPECIAL_ADMIN){
+            //单据中选择的签订负责协同人
+            $sales_order_id = SalesOrderInfo::where('del_time',0)
+                ->where('employee_id',$user['id'])
+                ->select('sales_order_id')
+                ->get()->toArray();
+            $sales_order_id = array_unique(array_column($sales_order_id,'sales_order_id'));
+
+            //指派后
+            $user_id = $user['id'];
+            $depart_id = $user['depart_range'];
+            $sales_order_id2 = SalesOrderRange::where('del_time',0)
+                ->where(function ($query) use($user_id, $depart_id) {
+                    $query->where('employee_id',$user_id)
+                        ->orWhereIn('depart_id', $depart_id);
+                })->select('sales_order_id')->get()
+                ->toArray();
+            $sales_order_id = array_unique(array_merge_recursive($sales_order_id,array_column($sales_order_id2,'sales_order_id')));
+            $model->whereIn('id',$sales_order_id);
+        }
         if(! empty($data['sales_order_type'])) $model->where('sales_order_type',$data['sales_order_type']);
         if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
         if(! empty($data['model_type'])) $model->where('model_type',$data['model_type']);
@@ -369,6 +438,7 @@ class SalesOrderService extends Service
                 $model->where('crt_time','<=',$end);
             }
         }
+        if(! empty($data['add_construction'])) $model->where('state','>=',SalesOrder::State_two);
 
         $list = $this->limit($model,'',$data);
         $list = $this->fillData($list,$data);
@@ -471,31 +541,19 @@ class SalesOrderService extends Service
             ->pluck('title','id')
             ->toArray();
 
-        $product = [];
+        $product = $fee = [];
         if(! empty($ergs['product'])){
             $sales_p_info = SalesOrderProductInfo::where('del_time',0)
                 ->where('sales_order_id',array_column($data['data'],'id'))
-                ->select('id','sales_order_id','product_id','mark','price','number')
-                ->get()->toArray();
-            $pro = Product::whereIn('id',array_column($sales_p_info,'product_id'))
-                ->select('bar_code','code','cost','depart_price','size','title','id')
                 ->get()->toArray();
-            $pro = array_column($pro,null,'id');
             foreach ($sales_p_info as $value){
-                $p = $pro[$value['product_id']] ?? [];
-                $tmp = [
-                    'product_id' => $value['product_id'],
-                    'mark' => $value['mark'],
-                    'retail_price' => $value['price'],
-                    'number' => $value['number'],
-                    'bar_code' => $p['bar_code'] ?? '',
-                    'code' => $p['code'] ?? '',
-                    'cost' => $p['cost'] ?? 0,
-                    'depart_price' => $p['depart_price'] ?? 0,
-                    'size' => $p['size'] ?? '',
-                    'title' => $p['title'] ?? '',
-                ];
-                $product[$value['sales_order_id']][] = $tmp;
+                $product[$value['sales_order_id']][] = $value;
+            }
+            $sales_o_info = SalesOrderOtherFee::where('del_time',0)
+                ->where('sales_order_id',array_column($data['data'],'id'))
+                ->get()->toArray();
+            foreach ($sales_o_info as $value){
+                $fee[$value['sales_order_id']][] = $value;
             }
         }
         foreach ($data['data'] as $key => $value){
@@ -512,6 +570,8 @@ class SalesOrderService extends Service
             $data['data'][$key]['crt_time'] = $value['crt_time'] ? date('Y-m-d H:i:s',$value['crt_time']) : '';
             $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? '';
             $data['data'][$key]['product'] = $product[$value['id']] ?? [];
+            $data['data'][$key]['fee'] = $fee[$value['id']] ?? [];
+            $data['data'][$key]['state_name'] = SalesOrder::$state[$value['state']] ?? '';
         }
 
         return $data;
@@ -527,12 +587,136 @@ class SalesOrderService extends Service
         return [true, ['order_number' => $order_number]];
     }
 
-    public function salesOrderDispatch($data){
-//        list($status,$msg)
+    public function salesOrderDispatchSale($data){
+        list($status,$msg) = $this->salesOrderDispatchSaleRule($data);
+        if(! $status) return [false,$msg];
+
+        try {
+            DB::beginTransaction();
+            SalesOrder::where('del_time',0)->where('id',$msg['id'])->update([
+                'state' => SalesOrder::State_one
+            ]);
+
+            $time = time();
+            SalesOrderRange::where('del_time',0)->where('sales_order_id',$msg['id'])->update([
+                'del_time' => $time
+            ]);
+
+            if(! empty($data['dispatch_depart_one'])){
+                $insert = [];
+                foreach ($data['dispatch_depart_one'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $msg['id'],
+                        'depart_id' => $value,
+                        'type' => SalesOrderRange::type_one,
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderRange::insert($insert);
+            }
+
+            if(! empty($data['dispatch_employee'])){
+                $insert = [];
+                foreach ($data['dispatch_employee'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $msg['id'],
+                        'employee_id' => $value,
+                        'type' => SalesOrderRange::type_two,
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderRange::insert($insert);
+            }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
+
+        return [true,''];
     }
 
-    public function salesOrderDispatchRule($data){
+    public function salesOrderDispatchSaleRule($data){
+        if(empty($data['id'])) return [false,'请选择合同派单'];
+        $sale = SalesOrder::where('del_time',0)
+            ->where('id',$data['id'])
+            ->first();
+        if(empty($sale)) return [false,'合同不存在或已被删除'];
+        if($sale['state'] > SalesOrder::State_one) return [false,'请确认合同状态,操作失败'];
+        $sale = $sale->toArray();
+
+        if(empty($data['dispatch_depart_one']) && empty($data['dispatch_employee'])) return [false, '请指派部门或人员'];
+
+        return [true, $sale];
+    }
+
+    public function salesOrderDispatchCompany($data){
+        list($status,$msg) = $this->salesOrderDispatchCompanyRule($data);
+        if(! $status) return [false,$msg];
+
+        try {
+            DB::beginTransaction();
+            SalesOrder::where('del_time',0)->where('id',$msg['id'])->update([
+                'state' => SalesOrder::State_two
+            ]);
+
+            $time = time();
+            SalesOrderRange::where('del_time',0)
+                ->where('sales_order_id',$msg['id'])
+                ->where('type',SalesOrderRange::type_three)
+                ->update(['del_time' => $time]);
+            SalesOrderOtherFee::where('del_time',0)
+                ->where('sales_order_id',$msg['id'])
+                ->update(['del_time' => $time]);
+            if(! empty($data['dispatch_depart_two'])){
+                $insert = [];
+                foreach ($data['dispatch_depart_two'] as $value){
+                    $insert[] = [
+                        'sales_order_id' => $msg['id'],
+                        'depart_id' => $value,
+                        'type' => SalesOrderRange::type_three,
+                        'crt_time' => $time,
+                    ];
+                }
+                SalesOrderRange::insert($insert);
+            }
+
+            if(! empty($data['other_fee_1'])){
+                $model = new SalesOrderOtherFee();
+                $model->sales_order_id = $msg['id'];
+                $model->other_fee_1 = $data['other_fee_1'] ?? 0;
+                $model->save();
+            }
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false,$exception->getMessage()];
+        }
 
         return [true,''];
     }
+
+    public function salesOrderDispatchCompanyRule($data){
+        if(empty($data['id'])) return [false,'请选择合同派单'];
+        $sale = SalesOrder::where('del_time',0)
+            ->where('id',$data['id'])
+            ->first();
+        if(empty($sale)) return [false,'合同不存在或已被删除'];
+        if($sale['state'] > SalesOrder::State_two) return [false,'请确认合同状态,操作失败'];
+        $sale = $sale->toArray();
+
+        $bool = Construction::where('del_time',0)
+            ->where('sales_order_id',$data['id'])
+            ->exists();
+        if(! $bool) return [false,'合同已下施工,操作失败'];
+
+        if(empty($data['dispatch_depart_two'])) return [false, '请指派总社或分社'];
+        if(empty($value['other_fee_1'])) return [false,'价格不能为空'];
+        $res = $this->checkNumber($value['other_fee_1']);
+        if(! $res) return [false,'价格请输入不超过两位小数并且大于0的数值'];
+
+        return [true, $sale];
+    }
 }

+ 11 - 2
routes/api.php

@@ -113,7 +113,6 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('purchaseOrderDetail', 'Api\PurchaseOrderController@purchaseOrderDetail');
     $route->any('purchaseOrderAdd', 'Api\PurchaseOrderController@purchaseOrderAdd');
     $route->any('purchaseOrderDel', 'Api\PurchaseOrderController@purchaseOrderDel');
-    $route->any('purchaseOrderConfirm', 'Api\PurchaseOrderController@purchaseOrderConfirm');
 
     //发货单
     $route->any('invoiceOrderList', 'Api\InvoiceOrderController@invoiceOrderList');
@@ -136,7 +135,10 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('salesOrderDetail', 'Api\SalesOrderController@salesOrderDetail');
     $route->any('salesOrderAdd', 'Api\SalesOrderController@salesOrderAdd');
     $route->any('salesOrderDel', 'Api\SalesOrderController@salesOrderDel');
-    $route->any('salesOrderDispatch', 'Api\SalesOrderController@salesOrderDispatch');
+    //派单销售
+    $route->any('salesOrderDispatchSale', 'Api\SalesOrderController@salesOrderDispatchSale');
+    //派单总部或分社
+    $route->any('salesOrderDispatchCompany', 'Api\SalesOrderController@salesOrderDispatchCompany');
 
     //施工单
     $route->any('constructionGet', 'Api\ConstructionController@constructionGet');
@@ -145,4 +147,11 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('constructionDetail', 'Api\ConstructionController@constructionDetail');
     $route->any('constructionAdd', 'Api\ConstructionController@constructionAdd');
     $route->any('constructionDel', 'Api\ConstructionController@constructionDel');
+
+    //现存量
+    $route->any('productInventoryList', 'Api\ProductInventoryController@productInventoryList');
+    //收发存汇总
+    $route->any('productInAndOutList', 'Api\ProductInventoryController@productInAndOutList');
+    //库存台账
+    $route->any('productInventoryStockList', 'Api\ProductInventoryController@productInventoryStockList');
 });