cqpCow hai 1 ano
pai
achega
e7faf88811

+ 87 - 0
app/Http/Controllers/Api/PurchaseOrderSpecialController.php

@@ -0,0 +1,87 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Service\PurchaseOrderSpecialService;
+use Illuminate\Http\Request;
+
+class PurchaseOrderSpecialController extends BaseController
+{
+    public function purchaseOrderAdd(Request $request)
+    {
+        $service = new PurchaseOrderSpecialService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->add($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function purchaseOrderEdit(Request $request)
+    {
+        $service = new PurchaseOrderSpecialService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->edit($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function purchaseOrderDetail(Request $request)
+    {
+        $service = new PurchaseOrderSpecialService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->detail($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function purchaseOrderDel(Request $request)
+    {
+        $service = new PurchaseOrderSpecialService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->del($request->all());
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function purchaseOrderList(Request $request)
+    {
+        $service = new PurchaseOrderSpecialService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->getList($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function purchaseOrderConfirm(Request $request)
+    {
+        $service = new PurchaseOrderSpecialService();
+        $user = $request->userData->toArray();
+        list($status,$data) = $service->purchaseOrderConfirm($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+}

+ 1 - 1
app/Model/Product.php

@@ -17,5 +17,5 @@ class Product extends UseScopeBaseModel
         self::State_two => '下架',
     ];
 
-    const range_function = 'productRange';
+    const range_function = 'productRangeNot';
 }

+ 22 - 0
app/Model/PurchaseOrderSpecial.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Model;
+
+class PurchaseOrderSpecial extends UseScopeBaseModel
+{
+    protected $table = "purchase_order_special"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const STATE_ZERO = 0;//未确认
+    const STATE_ONE = 1;//未入库
+    const STATE_TWO = 2;//已入库
+    const prefix = 'XNCG';
+    public static $name = [
+        self::STATE_ZERO => '未确认',
+        self::STATE_ONE => '未入库',
+        self::STATE_TWO => '已入库',
+    ];
+
+    const range_function = '';
+}

+ 21 - 0
app/Model/PurchaseOrderSpecialInfo.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class PurchaseOrderSpecialInfo extends Model
+{
+    protected $table = "purchase_order_special_info"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = null;
+    protected $dateFormat = 'U';
+    const STATE_ZERO = 0;//未发货
+    const STATE_ONE = 1;//部分已发货
+    const STATE_TWO = 2;//已发货
+    public static $name = [
+        0 => '未发货',
+        1 => '部分已发货',
+        2 => '已发货'
+    ];
+}

+ 49 - 0
app/Model/UseScopeBaseModel.php

@@ -156,4 +156,53 @@ class UseScopeBaseModel extends Model
 
         return $query;
     }
+
+    //产品不可见 部门和顶级部门(公司)过滤
+    public function scopeProductClear($query, $user, $search)
+    {
+        //是否所有部门
+        $is_all_depart = $user['is_all_depart'] ?? 0;
+        //权限范围内的部门
+        $depart_range = $user['depart_range'] ?? [];
+        //总社id
+        $top_depart_id = $user['head'] ?? [];
+        $top_depart = $top_depart_id['id'] ?? 0;
+
+        //可见范围方法
+        $model = $query->getModel(); // 获取模型的实例
+        $range_function = $model::range_function ?? ""; // 访问静态属性
+        $is_function_range = $this->hasMethod(new RangeService(),$range_function);
+
+        //顶级部门
+        $search_depart_id = $search['top_depart_id'] ?? 0; //顶级公司
+        if(empty($search_depart_id)){
+            //默认进来 自身顶级公司
+            $top_depart_id = $user['depart_top'][0] ?? [];
+            $top_depart_id = $top_depart_id['depart_id'] ?? 0;
+        }else{
+            //查询 顶级公司
+            $top_depart_id = $search_depart_id;
+        }
+
+        $id = [];
+        //产品 不可见范围
+        if($is_function_range) $id = RangeService::$range_function($user,$search);
+
+        if($is_all_depart){
+            //所有部门
+            if(empty($search_depart_id)){
+                //全部
+                $query->whereIn('depart_id', $depart_range);
+            }else{
+                //查看某个分社
+                $query->where('top_depart_id', $top_depart_id);
+            }
+        }else{
+            //某个分社全部 去掉不可见数
+            $query->where('top_depart_id', $top_depart_id)
+                ->whereIn('depart_id', $depart_range)
+                ->orWhere('top_depart_id',$top_depart)
+                ->whereNotIn('id', $id);
+        }
+    }
 }

+ 97 - 4
app/Service/CheckService.php

@@ -13,11 +13,16 @@ use App\Model\ProductInventory;
 use App\Model\ProductInventorySet;
 use App\Model\PurchaseOrder;
 use App\Model\PurchaseOrderInfo;
+use App\Model\PurchaseOrderSpecial;
+use App\Model\PurchaseOrderSpecialInfo;
 use App\Model\ReturnExchangeOrder;
 use App\Model\ReturnExchangeOrderProductInfo;
 use App\Model\SalesOrder;
+use App\Model\SalesOrderOtherFee;
 use App\Model\SalesOrderProductInfo;
+use App\Model\SeeRange;
 use App\Model\Setting;
+use App\Model\Storehouse;
 use App\Model\Supplier;
 use Illuminate\Support\Facades\DB;
 
@@ -37,7 +42,7 @@ class CheckService extends Service
         self::one => '收货单',
         self::two => '发货单',//确认后出库
         self::three => '采购单',//确认后入库
-        self::four => '合同',
+        self::four => '合同', // 合同完结
         self::five => '施工单',//确认后出库
         self::six => '退换货单',//确认后出库或出库入库
         self::seven => '采购单确认',
@@ -63,7 +68,8 @@ class CheckService extends Service
         self::three => 'confirmPurchaseOrder',
         self::five => 'confirmConstruction',
         self::six => 'confirmReturnExchangeOrder',
-        self::seven => 'confirmPurchaseOrderState'
+        self::seven => 'confirmPurchaseOrderState',
+        self::four => 'confirmSalesOrder',
     ];
 
     //单据库存流水
@@ -76,6 +82,7 @@ class CheckService extends Service
 
     public static $create = [
         self::seven => 'createPurchaseOrderSales', //分社合同生成
+        self::four => 'createPurchaseOrder', // 派给分社的合同确认以后生成虚拟采购单
     ];
 
     public function confirmInvoiceOrder($data){
@@ -180,7 +187,7 @@ class CheckService extends Service
     }
 
     //todo
-    public function createPurchaseOrderSales($data, $order, $user){
+    public function createPurchaseOrderSales($order, $user){
         //没有供应商 不创建合同
         if(empty($order['supplier'])) return [true, ''];
         //总公司的采购单 不创建合同
@@ -354,6 +361,92 @@ class CheckService extends Service
         return [true,''];
     }
 
+    public function confirmSalesOrder($data){
+        $model = SalesOrder::where('id', $data['id'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($model)) return [false, '合同不存在或已被删除'];
+        if($model->state == SalesOrder::State_five) return [false, '请确认合同状态,操作失败'];
+
+        SalesOrder::where('del_time',0)->where('id',$data['id'])
+            ->update(['state' => SalesOrder::State_five]);
+
+        return [true, $model->toArray()];
+    }
+
+    public function createPurchaseOrder($order, $user){
+        //不是总公司的合同
+        $top_depart_id = $user['head'] ?? [];
+        $top_depart_id = $top_depart_id['id'] ?? 0;
+        if($top_depart_id != $order['top_depart_id']) return [true, ''];
+
+        $see = SeeRange::where('del_time',0)
+            ->where('data_id',$order['id'])
+            ->where('data_type',SeeRange::type_seven)
+            ->where('type',SeeRange::data_three)
+            ->first();
+        if(empty($see)) return [false, '未找到指派分社信息'];
+        $depart_id = $see->param_id;//指派的分社
+
+        //总社指派给自己
+        if($depart_id == $top_depart_id) return [true, ''];
+
+        //获取指派分社时候的金额
+        $fee = SalesOrderOtherFee::where('del_time',0)
+            ->where('sales_order_id',$order['id'])
+            ->first();
+        if(empty($fee)) return [false, '未找到指派分社时填写的金额'];
+        $fee = $fee->toArray();
+
+        $order_number = OrderNoService::createOrderNumber(PurchaseOrderSpecial::prefix);
+        $storehouse = Storehouse::where('depart_id',$top_depart_id)->value('id');
+        $product = SalesOrderProductInfo::where('del_time',0)
+            ->where('sales_order_id',$order['id'])
+            ->select('product_id','number','retail_price')
+            ->get()->toArray();
+        $product_map = $rate = [];
+        $total = 0;
+        foreach ($product as $value){
+            $total += $value['number'] * $value['retail_price'];
+            if(isset($product_map[$value['product_id']])){
+                $product_map[$value['product_id']] = $value['product_id'] * $value['number'];
+            }else{
+                $product_map[$value['product_id']] += $value['product_id'] * $value['number'];
+            }
+        }
+        foreach ($product_map as $key => $value){
+            $rate[$key] = round($value / $total);
+        }
+
+        $model = new PurchaseOrderSpecial();
+        $model->order_number = $order_number;
+        $model->sales_order_id = $order['id'];
+        $model->depart_id = $top_depart_id;
+        $model->top_depart_id = $top_depart_id;
+        $model->crt_id = $user['id'];
+        $model->purchase_id = $user['id'];
+        $model->purchase_total = $fee['other_fee_1'] ?? 0;
+        $model->storehouse_id = $storehouse ?? 0;
+        $model->save();
+        if(empty($model->id)) return [false,'采购单主信息生成失败'];
+
+        $insert = [];
+        foreach ($product as $value){
+            $rate_tmp = $rate[$value['product_id']] ?? 0;
+            $insert[] = [
+                'purchase_order_special_id' => $model->id,
+                'product_id' => $value['product_id'],
+                'order_number' => $order_number,
+                'number' => $value['number'],
+                'price' => round($rate_tmp * $fee['other_fee_1'] / $value['number'],2),
+                'storehouse_id' => $storehouse,
+            ];
+        }
+        PurchaseOrderSpecialInfo::insert($insert);
+
+        return [true, ''];
+    }
+
     public function checkAll($data,$user){
         if(empty($data['id']) || empty($data['opt_case'])) return [false,'必传参数不能为空或者参数值错误!'];
 
@@ -389,7 +482,7 @@ class CheckService extends Service
             }
 
             if($create) {
-                $bool = $this->$create($data, $order, $user);
+                $bool = $this->$create($order, $user);
                 if(! $bool) {
                     DB::rollBack();
                     return [false, $msg];

+ 2 - 2
app/Service/CustomerService.php

@@ -44,7 +44,7 @@ class CustomerService extends Service
             $model->mark = $data['mark'] ?? '';
             $model->importance = $data['importance'] ?? '';
             $model->company = $data['company'] ?? '';
-            $model->company_short_name = $data['company_short_name'] ?? '';
+//            $model->company_short_name = $data['company_short_name'] ?? '';
             $model->state_type = $data['state_type'] ?? 0;
             $model->customer_state = $data['customer_state'] ?? 0;
             $model->customer_grade = $data['customer_grade'] ?? 0;
@@ -174,7 +174,7 @@ class CustomerService extends Service
             $model->mark = $data['mark'] ?? '';
             $model->importance = $data['importance'] ?? '';
             $model->company = $data['company'] ?? '';
-            $model->company_short_name = $data['company_short_name'] ?? '';
+//            $model->company_short_name = $data['company_short_name'] ?? '';
             $model->depart_id = $data['depart_id'] ?? 0;
             $model->top_depart_id = $data['top_depart_id'] ?? 0;
             $model->state_type = $data['state_type'] ?? 0;

+ 1 - 1
app/Service/EmployeeService.php

@@ -666,7 +666,7 @@ class EmployeeService extends Service
             ->select('title','id','code','parent_id','is_main','basic_type_id')
             ->orderby('code', 'asc');
 
-        if($user['id'] != Employee::SPECIAL_ADMIN && ! $user['is_all_depart']){
+        if($user['id'] != Employee::SPECIAL_ADMIN && ! $user['is_all_depart'] && empty($data['get_top'])){
             $depart_id = $this->getDepartIdList($user);
             $model->whereIn('id',$depart_id);
         }

+ 54 - 12
app/Service/ProductService.php

@@ -93,9 +93,14 @@ class ProductService extends Service
             ->orderby('id','desc');
         if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
 
-        $list = $this->limit($model,'',$data);
+        $list = $model->get()->toArray();
+        $list_tree = $list;
+        if(! empty($list_tree)) {
+            $list_tree = $this->makeTree(0,$list_tree);
+            $list_tree = $this->set_sort_circle($list_tree);
+        }
 
-        return [true, $list];
+        return [200, ['data' => $list,'tree' => $list_tree]];
     }
 
     /**
@@ -178,6 +183,7 @@ class ProductService extends Service
             $model->product_category_id = $data['product_category_id'] ?? 0;
             $model->title = $data['title'];
             $model->code = $data['code'] ?? '';
+            $model->sn_code = $data['sn_code'] ?? '';
             $model->size = $data['size'] ?? '';
             $model->unit = $data['unit'] ?? 0;
             $model->bar_code = $data['bar_code'] ?? '';
@@ -274,6 +280,7 @@ class ProductService extends Service
             $model->product_category_id = $data['product_category_id'] ?? 0;
             $model->title = $data['title'];
             $model->code = $data['code'] ?? '';
+            $model->sn_code = $data['sn_code'] ?? '';
             $model->size = $data['size'] ?? '';
             $model->unit = $data['unit'] ?? 0;
             $model->bar_code = $data['bar_code'] ?? '';
@@ -469,16 +476,17 @@ class ProductService extends Service
      * @return array
      */
     public function productList($data,$user){
-        $model = Product::Clear($user,$data);
+        $model = Product::ProductClear($user,$data);
         $model = $model->where('del_time',0)
-            ->select('title','id','product_category_id','code','size','unit','bar_code','retail_price','cost','state','crt_id','crt_time','mark','depart_id','top_depart_id')
+            ->select('title','id','product_category_id','code','size','unit','bar_code','retail_price','cost','state','crt_id','crt_time','mark','depart_id','top_depart_id','sn_code')
             ->orderby('id', 'desc');
 
         if(! empty($data['title'])) $model->where('title', 'LIKE', '%'.$data['title'].'%');
         if(isset($data['state'])) $model->where('state', $data['state']);
+        if(! empty($data['product_category_id'])) $model->where('product_category_id', $data['product_category_id']);
 
         $list = $this->limit($model,'',$data);
-        $list = $this->fillData($list,$user);
+        $list = $this->fillData($list,$user,$data);
 
         return [true, $list];
     }
@@ -493,6 +501,7 @@ class ProductService extends Service
         if(empty($data['title'])) return [false,'产品名称不能为空'];
         if(empty($data['product_category_id'])) return [false,'产品分类不能为空'];
         if(empty($data['code'])) return [false,'产品编码不能为空'];
+        if(empty($data['sn_code'])) return [false,'产品SN编码不能为空'];
         if(empty($data['cost'])) return [false,'成本不能为空'];
         $res = $this->checkNumber($data['cost']);
         if(! $res) return [false,'成本请输入不超过两位小数并且大于0的数值'];
@@ -522,17 +531,17 @@ class ProductService extends Service
         $top_depart_id = $user['head'] ?? [];
         $top_depart_id = $top_depart_id['id'] ?? 0;
         if($is_add){
-            $bool = Product::whereRaw("(binary code = '{$data['code']}' OR title = '{$data['title']}') AND (top_depart_id = {$data['top_depart_id']} OR top_depart_id = {$top_depart_id})")
+            $bool = Product::whereRaw("(binary code = '{$data['code']}' OR title = '{$data['title']}' OR sn_code = '{$data['sn_code']}') AND (top_depart_id = {$data['top_depart_id']} OR top_depart_id = {$top_depart_id})")
                 ->where('del_time',0)
                 ->exists();
         }else{
             if(empty($data['id'])) return [false,'ID不能为空'];
-            $bool = Product::whereRaw("(binary code = '{$data['code']}' OR title = '{$data['title']}') AND (top_depart_id = {$data['top_depart_id']} OR top_depart_id = {$top_depart_id})")
+            $bool = Product::whereRaw("(binary code = '{$data['code']}' OR title = '{$data['title']}' OR sn_code = '{$data['sn_code']}') AND (top_depart_id = {$data['top_depart_id']} OR top_depart_id = {$top_depart_id})")
                 ->where('id','<>',$data['id'])
                 ->where('del_time',0)
                 ->exists();
         }
-        if($bool) return [false,'产品名称编码不能重复'];
+        if($bool) return [false,'产品名称、编码与SN编码不能重复'];
 
         return [true, $data];
     }
@@ -542,9 +551,10 @@ class ProductService extends Service
      * @param $data
      * @return array
      */
-    public function fillData($data, $user){
+    public function fillData($data, $user, $search){
         if(empty($data['data'])) return $data;
 
+        $type = $search['type'] ?? 0;
         $emp = Employee::whereIn('id',array_unique(array_column($data['data'],'crt_id')))
             ->pluck('emp_name','id')
             ->toArray();
@@ -557,7 +567,7 @@ class ProductService extends Service
             ->toArray();
 
         //产品使用价格
-        $detail_map = $this->getProductPrice(array_column($data['data'],'id'));
+        $detail_map = $this->getProductPrice(array_column($data['data'],'id'), $type);
 
         //是否总公司
         $is_main = $user['is_all_depart'];
@@ -605,8 +615,40 @@ class ProductService extends Service
     }
 
     //获取产品使用价格
-    public function getProductPrice($product_id = []){
-        //产品里设置的价格
+    public function getProductPrice($product_id = [], $type = 1){
+        //type 1 采购  2 合同
+
+        $detail_map = [];
+        if($type == 1) {
+            //分社价
+            $detail = ProductPriceDetail::where('del_time',0)
+                ->whereIn('product_id',$product_id)
+                ->select('product_id','basic_type_id','price')
+                ->get()->toArray();
+            foreach ($detail as $value){
+                $detail_map[$value['product_id']][] = $value;
+            }
+        }else{
+            //活动价格
+            $time = time();
+            $activity = ProductActivityPrice::where('del_time',0)
+                ->whereIn('product_id',$product_id)
+                ->where('start_time','<=',$time)
+                ->where('end_time','>=',$time)
+                ->select('product_id','basic_type_id','price')
+                ->get()->toArray();
+            foreach ($activity as $value){
+                $detail_map[$value['product_id']][] = $value;
+            }
+        }
+
+        return $detail_map;
+    }
+
+    public function getProductPriceTmp($product_id = []){
+        //type 0 采购  1 合同
+
+        //分社价
         $detail = ProductPriceDetail::where('del_time',0)
             ->whereIn('product_id',$product_id)
             ->select('product_id','basic_type_id','price')

+ 439 - 0
app/Service/PurchaseOrderSpecialService.php

@@ -0,0 +1,439 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\BasicType;
+use App\Model\BookingList;
+use App\Model\Depart;
+use App\Model\Employee;
+use App\Model\PurchaseOrder;
+use App\Model\PurchaseOrderFile;
+use App\Model\PurchaseOrderInfo;
+use App\Model\PurchaseOrderSpecial;
+use App\Model\ReturnExchangeOrder;
+use App\Model\SalesOrder;
+use App\Model\SeeRange;
+use App\Model\Storehouse;
+use App\Model\Supplier;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * 采购单
+ */
+class PurchaseOrderSpecialService extends Service
+{
+    /**
+     * 采购单编辑
+     * @param $data
+     * @param $user
+     * @return array
+     */
+    public function edit($data,$user){
+        list($status,$msg) = $this->orderRule($data,$user, false);
+        if(!$status) return [$status,$msg];
+
+        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->top_depart_id = $data['top_depart_id'] ?? 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'] ?? 0;
+            $material_model->purchase_id = $data['purchase_id'] ?? 0;
+            $material_model->order_type = $data['order_type'];
+            $material_model->sales_order_id = $data['sales_order_id'] ?? 0;
+            $material_model->mark = $data['mark'] ?? '';
+            $material_model->storehouse_id = $data['storehouse_id'];
+            $material_model->save();
+
+            $time = time();
+            PurchaseOrderInfo::where('order_number',$data['order_number'])
+                ->where('del_time',0)
+                ->update(['del_time' => time()]);
+            if(!empty($data['product'])){
+                $sub = [];
+                foreach ($data['product'] as $value){
+                    $sub[] = [
+                        'purchase_order_id' => $material_model->id,
+                        'order_number' => $data['order_number'],
+                        'storehouse_id' => $data['storehouse_id'] ?? 0,
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                        'basic_type_id' => $value['basic_type_id'],
+                        'price' => $value['price'],
+                        'mark' => $value['mark'] ?? '',
+                    ];
+                }
+                PurchaseOrderInfo::insert($sub);
+            }
+
+            PurchaseOrderFile::where('order_number',$data['order_number'])
+                ->where('del_time',0)
+                ->update(['del_time' => time()]);
+            if(! empty($data['file'])){
+                $insert = [];
+                foreach ($data['file'] as $value){
+                    $insert[] = [
+                        'purchase_order_id' => $material_model->id,
+                        'order_number' => $data['order_number'],
+                        'file' => $value['url'],
+                        'type' => PurchaseOrderFile::type_one,
+                        'name' => $value['name'],
+                        'crt_time' => $time,
+                    ];
+                }
+                PurchaseOrderFile::insert($insert);
+            }
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    /**
+     * 采购单新增
+     * @param $data
+     * @param $user
+     * @return array
+     */
+    public function add($data,$user){
+        list($status,$msg) = $this->orderRule($data, $user);
+        if(!$status) return [$status,$msg];
+        try{
+            DB::beginTransaction();
+            $material_model = new PurchaseOrder();
+            $material_model->order_number = $data['order_number'];
+            $material_model->depart_id = $data['depart_id'] ?? 0;
+            $material_model->top_depart_id = $data['top_depart_id'] ?? 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'] ?? 0;
+            $material_model->purchase_id = $data['purchase_id'] ?? 0;
+            $material_model->order_type = $data['order_type'];
+            $material_model->sales_order_id = $data['sales_order_id'] ?? 0;
+            $material_model->mark = $data['mark'] ?? '';
+            $material_model->crt_id = $user['id'];
+            $material_model->storehouse_id = $data['storehouse_id'];
+            $material_model->save();
+
+            $time = time();
+            if(!empty($data['product'])){
+                $sub = [];
+                foreach ($data['product'] as $value){
+                    $sub[] = [
+                        'purchase_order_id' => $material_model->id,
+                        'order_number' => $data['order_number'],
+                        'storehouse_id' => $data['storehouse_id'] ?? 0,
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                        'basic_type_id' => $value['basic_type_id'],
+                        'price' => $value['price'],
+                        'mark' => $value['mark'] ?? '',
+                    ];
+                }
+                PurchaseOrderInfo::insert($sub);
+            }
+
+            if(! empty($data['file'])){
+                $insert = [];
+                foreach ($data['file'] as $value){
+                    $insert[] = [
+                        'purchase_order_id' => $material_model->id,
+                        'order_number' => $data['order_number'],
+                        'file' => $value['url'],
+                        'type' => PurchaseOrderFile::type_one,
+                        'name' => $value['name'],
+                        'crt_time' => $time,
+                    ];
+                }
+                PurchaseOrderFile::insert($insert);
+            }
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    /**
+     * 采购单详情
+     * @param $data
+     * @return array
+     */
+    public function detail($data,$user){
+        if($this->isEmpty($data,'order_number')) return [false,'请选择数据'];
+
+        $order = PurchaseOrderSpecial::where('order_number',$data['order_number'])
+            ->where('del_time',0)
+            ->select('id','order_number','depart_id','mark','state','crt_id','order_type','sales_order_id','supplier','purchase_id','purchase_total','crt_time','storehouse_id','top_depart_id')
+            ->first();
+        if(empty($order)) return [false, '采购订单不存在或已被删除'];
+        $order = $order->toArray();
+        $order['file'] = [];
+        $order['storehouse_title'] = Storehouse::where('id',$order['storehouse_id'])->value('title');
+        $supplier = Supplier::where('id',$order['supplier'])->first();
+        $order['supplier_title'] = $supplier->title ?? '';
+        $order['order_type_title'] = PurchaseOrder::$order_type[$order['order_type']] ?? '';
+        $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']] ?? '';
+
+        $p_info = PurchaseOrderInfo::where('del_time',0)
+            ->where('order_number',$data['order_number'])
+            ->get()->toArray();
+        $basic_price = BasicType::whereIn('id',array_unique(array_column($p_info,'basic_type_id')))->pluck('title','id')->toArray();
+        $map = (new ProductService())->getProductDetail(array_column($p_info,'product_id'));
+        foreach ($p_info as $value){
+            $tmp = $map[$value['product_id']] ?? [];
+            $value['title'] = $tmp['title'] ?? "";
+            $value['code'] = $tmp['code'] ?? "";
+            $value['size'] = $tmp['size'] ?? "";
+            $value['unit'] = $tmp['unit'] ?? "";
+            $value['bar_code'] = $tmp['bar_code'] ?? "";
+            $value['basic_type_title'] = $basic_price[$value['basic_type_id']] ?? "";
+            $order['product'][] = $value;
+        }
+
+        $file = PurchaseOrderFile::where('del_time',0)
+            ->where('order_number',$data['order_number'])
+            ->get()->toArray();
+        foreach ($file as $value){
+            if($value['type'] == PurchaseOrderFile::type_one){
+                $tmp = [
+                    'url' => $value['file'],
+                    'name' => $value['name'],
+                ];
+                $order['file'][] = $tmp;
+            }
+        }
+        $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 = (new RangeService())->RangeDetail($order['id'],SeeRange::type_five);
+        $order['depart'] = $return[0] ?? [];
+        $order['employee'] = $return[1] ?? [];
+
+        //退换货信息
+        $order['return_exchange'] = (new ReturnExchangeOrderService())->getDifferentAmount($order['id'],ReturnExchangeOrder::Order_type2);
+
+        //总社id
+        $top_depart_id = $user['head'] ?? [];
+        $top_depart_id = $top_depart_id['id'] ?? 0;
+        if(empty($order['state'])) {
+            //分社的采购单 供应商是总社
+            if($order['top_depart_id'] != $top_depart_id && ! empty($supplier->is_main)) {
+                $is_show_confirm = 0;
+                //总公司下的人
+                if($user['is_behind_main']) $is_show_confirm = 1;
+            }else{
+                $is_show_confirm = 1;
+            }
+        }else{
+            $is_show_confirm = 0;
+        }
+        $order['is_show_confirm'] = $is_show_confirm;
+
+        return [true, $order];
+    }
+
+    /**
+     * 采购单删除
+     * @param $data
+     * @return array
+     */
+    public function del($data){
+        if($this->isEmpty($data,'order_number')) return [false,'请选择数据!'];
+        $order = PurchaseOrder::where('del_time',0)->where('order_number',$data['order_number'])->first();
+        if(empty($order)) return [false,'采购单不存在或已被删除'];
+        $order = $order->toArray();
+        if($order['state'] > PurchaseOrder::STATE_ZERO) return [false,'请确认采购订单状态,删除失败!'];
+
+        try{
+            DB::beginTransaction();
+            PurchaseOrder::where('order_number',$data['order_number'])->where('del_time',0)->update([
+                'del_time'=>time()
+            ]);
+            PurchaseOrderInfo::where('order_number',$data['order_number'])->where('del_time',0)->update([
+                'del_time'=>time()
+            ]);
+            PurchaseOrderFile::where('order_number',$data['order_number'])
+                ->where('del_time',0)
+                ->update(['del_time' => time()]);
+            (new RangeService())->RangeDelete($order['id'],SeeRange::type_five);
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        return [true,''];
+    }
+
+    /**
+     * 获取采购单列表
+     * @param $data
+     * @param $user
+     * @return array
+     */
+    public function getList($data,$user){
+        $model = PurchaseOrderSpecial::Clear($user,$data);
+        $model = $model->where('del_time',0)->select('order_number','id','depart_id','top_depart_id','mark','crt_time','state','crt_id','sales_order_id','supplier','purchase_id','purchase_total','storehouse_id')
+            ->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']);
+        if(isset($data['state'])) $model->where('state',$data['state']);
+        if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) {
+            $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
+            $model->whereBetween('crt_time',[$return[0],$return[1]]);
+        }
+        if(! empty($data['time_type'])) {
+            if($data['time_type'] == 1) {
+                $start = strtotime('today');
+                $end = strtotime('tomorrow') - 1;
+            }elseif ($data['time_type'] == 2){
+                $start = strtotime('this week',strtotime('today'));
+                $end = strtotime('this week +6 days 23:59:59', strtotime('today'));
+            }
+            if(! empty($start) && ! empty($end)) {
+                $model->where('crt_time','>=',$start);
+                $model->where('crt_time','<=',$end);
+            }
+        }
+
+        $list = $this->limit($model,'',$data);
+        $list = $this->fillListData($list,$data,$user);
+
+        return [true, $list];
+    }
+
+    /**
+     * 拼接数据
+     * @param $data
+     * @return array
+     */
+    public function fillListData($data,$ergs,$user){
+        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'],'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();
+        $storehouse = Storehouse::whereIn('id',array_unique(array_column($data['data'],'storehouse_id')))
+            ->pluck('title','id')
+            ->toArray();
+        $supplier = Supplier::whereIn('id',array_unique(array_column($data['data'],'supplier')))
+            ->select('title','id','is_main')
+            ->get()
+            ->toArray();
+        $supplier_map = array_column($supplier,null,'id');
+        foreach ($data['data'] as $key => $value){
+            $supplier_tmp = $supplier_map[$value['supplier']] ?? [];
+            $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]['state_title'] = PurchaseOrderSpecial::$name[$value['state']] ?? '';
+            $data['data'][$key]['sales_order_number'] = $sales[$value['sales_order_id']] ?? '';
+            $data['data'][$key]['storehouse_title'] = $storehouse[$value['storehouse_id']] ?? '';
+            $data['data'][$key]['supplier_title'] = $supplier_tmp['title'] ?? '';
+        }
+
+        return $data;
+    }
+
+    /**
+     * 采购单参数规则
+     * @param $data
+     * @param $is_check
+     * @return array
+     */
+    public function orderRule(&$data, $user, $is_check = true){
+        if(empty($data['order_type'])) return [false,'采购订单类型不能为空'];
+        if($data['order_type'] == PurchaseOrder::Order_type_two && empty($data['sales_order_id'])) return [false, PurchaseOrder::$order_type[PurchaseOrder::Order_type_two] . '必须选择合同'];
+        if($this->isEmpty($data,'product')) return [false,'产品不能为空'];
+        if(empty($data['storehouse_id'])) return [false,'请选择仓库'];
+        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']);
+            if(! $res) return [false,'请输入正确的产品数量'];
+        }
+
+        //所属部门 以及 顶级部门
+        if(empty($data['depart_id'])) $data['depart_id'] = $this->getDepart($user);
+        $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0;
+
+        if($is_check){
+            $order_number = (new OrderNoService())->createOrderNumber(PurchaseOrder::prefix);
+            if(empty($order_number)) return [false,'采购单号生成失败!'];
+            $data['order_number'] = $order_number;
+        }else{
+            if($this->isEmpty($data,'order_number')) return [false,'采购单号不能为空!'];
+        }
+
+        return [true, ''];
+    }
+
+    /**
+     * 采购单确认
+     * @param $data
+     * @param $user
+     * @return array
+     */
+    public function purchaseOrderConfirm($data,$user){
+        if(empty($data['order_number'])) return [false, '请选择数据'];
+
+        $order = PurchaseOrder::where('order_number',$data['order_number'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($order)) return [false, '采购订单不存在或已被删除'];
+        if($order->state != PurchaseOrder::STATE_ZERO) return [false, '请确认采购订单状态,操作失败'];
+
+        PurchaseOrder::where('order_number',$data['order_number'])
+            ->where('del_time',0)
+            ->update(['state' => PurchaseOrder::STATE_ONE]);
+
+        return [true,''];
+    }
+}

+ 22 - 0
app/Service/RangeService.php

@@ -223,6 +223,28 @@ class RangeService extends Service
         return $return_id;
     }
 
+    //获取产品不可见数据
+    public static function productRangeNot($user,$search){
+        //不可见范围id
+        $return_id = Self::getRangeDataId($user,SeeRange::type_four);
+
+        //分社管理员
+        if(empty($user['is_all_depart']) && ! empty($user['is_manager'])) {
+            $depart = array_shift($user['rule_depart']);
+            $depart_id = $depart['depart_id'] ?? 0;
+            $id = DB::table('product')
+                ->where('del_time',0)
+                ->where('top_depart_id',$depart_id)
+                ->select('id')->get()->toArray();
+            $id = array_column($id,'id');
+            foreach ($return_id as $key => $value){
+                if(in_array($value,$id)) unset($return_id[$key]);
+            }
+        }
+
+        return $return_id;
+    }
+
     //获取采购单可见数据
     public static function purchaseRange($user,$search){
         //可见范围id

+ 18 - 6
app/Service/SalesOrderService.php

@@ -468,6 +468,8 @@ class SalesOrderService extends Service
         }
         $sales['crt_name'] = $emp_map[$sales['crt_id']] ?? '';
         $sales['crt_time'] = $sales['crt_time'] ? date("Y-m-d H:i:s",$sales['crt_time']): '';
+        $sales['dispatch_time_first'] = $sales['dispatch_time_first'] ? date("Y-m-d H:i:s",$sales['dispatch_time_first']): '';
+        $sales['dispatch_time_second'] = $sales['dispatch_time_second'] ? date("Y-m-d H:i:s",$sales['dispatch_time_second']): '';
 
         //派单后数据 也就是可见范围
         $return = (new RangeService())->RangeDetail($data['id'],SeeRange::type_seven);
@@ -509,8 +511,16 @@ class SalesOrderService extends Service
                 $model->where('crt_time','<=',$end);
             }
         }
-        if(! empty($data['add_construction'])) $model->where('state','>=',SalesOrder::State_two);
-        if(! empty($data['add_return'])) $model->where('state','>',SalesOrder::State_two);
+        if(! empty($data['add_construction'])) {
+            //能下施工单的合同状态
+            $model->where('state','>=',SalesOrder::State_two);
+            $model->where('state','<',SalesOrder::State_five);
+        }
+        if(! empty($data['add_return'])) {
+            //能下退换货单的合同状态
+            $model->where('state','>',SalesOrder::State_two);
+            $model->where('state','<',SalesOrder::State_five);
+        }
         if(! empty($data['sales_order_id'])) $model->where('id',$data['sales_order_id']);
 
         $list = $this->limit($model,'',$data);
@@ -720,11 +730,12 @@ class SalesOrderService extends Service
 
         try {
             DB::beginTransaction();
+            $time = time();
             SalesOrder::where('del_time',0)->where('id',$msg['id'])->update([
-                'state' => SalesOrder::State_one
+                'state' => SalesOrder::State_one,
+                'dispatch_time_first' => $time,
             ]);
 
-            $time = time();
             SeeRange::where('del_time',0)
                 ->where('data_id',$msg['id'])
                 ->where('data_type',SeeRange::type_seven)
@@ -802,11 +813,12 @@ class SalesOrderService extends Service
 
         try {
             DB::beginTransaction();
+            $time = time();
             SalesOrder::where('del_time',0)->where('id',$msg['id'])->update([
-                'state' => SalesOrder::State_two
+                'state' => SalesOrder::State_two,
+                'dispatch_time_second' => $time,
             ]);
 
-            $time = time();
             SeeRange::where('del_time',0)
                 ->where('data_id',$msg['id'])
                 ->where('data_type',SeeRange::type_seven)