cqpCow há 1 ano atrás
pai
commit
225bb41de2
2 ficheiros alterados com 258 adições e 47 exclusões
  1. 253 45
      app/Service/CheckService.php
  2. 5 2
      app/Service/Oa/OaService.php

+ 253 - 45
app/Service/CheckService.php

@@ -9,9 +9,7 @@ use App\Model\Employee;
 use App\Model\InOutRecord;
 use App\Model\InvoiceOrder;
 use App\Model\InvoiceOrderInfo;
-use App\Model\Product;
 use App\Model\ProductInventory;
-use App\Model\ProductInventorySet;
 use App\Model\PurchaseOrder;
 use App\Model\PurchaseOrderInfo;
 use App\Model\PurchaseOrderSpecial;
@@ -22,7 +20,6 @@ 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 App\Service\Oa\OaService;
@@ -200,13 +197,13 @@ class CheckService extends Service
 
 
     public function confirmInvoiceOrder($data){
-        $model = InvoiceOrder::where('id',$data['id'])
+        $model = InvoiceOrder::where('order_number',$data['order_number'])
             ->where('del_time',0)
             ->first();
         if(empty($model)) return [false, '发货单不存在或已被删除'];
         if($model->state != InvoiceOrder::STATE_ONE) return [false, '请确认发货单状态,操作失败'];
 
-        InvoiceOrder::where('del_time',0)->where('id',$data['id'])
+        InvoiceOrder::where('del_time',0)->where('order_number',$data['order_number'])
             ->update(['state' => InvoiceOrder::STATE_TWO]);
         SalesOrder::where('id',$model->sales_order_id)->update(['state' => SalesOrder::State2_one]);
 
@@ -245,26 +242,26 @@ class CheckService extends Service
     }
 
     public function confirmPurchaseOrderState($data){
-        $model = PurchaseOrder::where('id',$data['id'])
+        $model = PurchaseOrder::where('order_number',$data['order_number'])
             ->where('del_time',0)
             ->first();
         if(empty($model)) return [false,'采购单不存在或已被删除'];
         if($model->state != PurchaseOrder::STATE_ONE) return [false,'请确认采购单状态,操作失败'];
 
         //未入库
-        PurchaseOrder::where('id',$data['id'])->update(['state' => PurchaseOrder::STATE_TWO]);
+        PurchaseOrder::where('order_number',$data['order_number'])->update(['state' => PurchaseOrder::STATE_TWO]);
         return [true, $model->toArray()];
     }
 
     public function confirmPurchaseOrder($data){
-        $model = PurchaseOrder::where('id',$data['id'])
+        $model = PurchaseOrder::where('order_number',$data['order_number'])
             ->where('del_time',0)
             ->first();
         if(empty($model)) return [false, '采购订单不存在或已被删除'];
         if($model->state != PurchaseOrder::STATE_Three) return [false, '请确认采购订单状态,操作失败'];
 
         // 已出库
-        PurchaseOrder::where('del_time',0)->where('id',$data['id'])
+        PurchaseOrder::where('del_time',0)->where('order_number',$data['order_number'])
             ->update(['state' => PurchaseOrder::STATE_Four]);
 
         return [true, $model->toArray()];
@@ -381,14 +378,14 @@ class CheckService extends Service
     }
 
     public function confirmConstruction($data){
-        $model = Construction::where('id',$data['id'])
+        $model = Construction::where('order_number',$data['order_number'])
             ->where('del_time',0)
             ->first();
         if(empty($model)) return [false, '施工单不存在或已被删除'];
         if($model->state != Construction::STATE_ONE) return [false, '请确认施工单状态,操作失败'];
 
         //已确认
-        Construction::where('del_time',0)->where('id',$data['id'])
+        Construction::where('del_time',0)->where('order_number',$data['order_number'])
             ->update(['state' => Construction::STATE_TWO]);
         //已下施工
         SalesOrder::where('id',$model->sales_order_id)->update(['state' => SalesOrder::State_five]);
@@ -428,17 +425,17 @@ class CheckService extends Service
     }
 
     public function confirmReturnExchangeOrder($data){
-        $model = ReturnExchangeOrder::where('id',$data['id'])
+        $model = ReturnExchangeOrder::where('order_number',$data['order_number'])
             ->where('del_time',0)
             ->first();
         if(empty($model)) return [false, '退换货单不存在或已被删除'];
         if($model->state != ReturnExchangeOrder::State_one) return [false, '请确认退换货单状态,操作失败'];
 
-        ReturnExchangeOrder::where('del_time',0)->where('id',$data['id'])
+        ReturnExchangeOrder::where('del_time',0)->where('order_number',$data['order_number'])
             ->update(['state' => ReturnExchangeOrder::State_two]);
 
         if($data['data_type'] == ReturnExchangeOrder::Order_type){
-            SalesOrder::where('id',$data['id'])->update([
+            SalesOrder::where('id',$model->data_id)->update([
                 'state' => SalesOrder::State_six
             ]);
         }
@@ -505,28 +502,28 @@ class CheckService extends Service
     }
 
     public function confirmSalesOrder($data){
-        $model = SalesOrder::where('id', $data['id'])
+        $model = SalesOrder::where('order_number', $data['order_number'])
             ->where('del_time',0)
             ->first();
         if(empty($model)) return [false, '合同不存在或已被删除'];
         //安装件
-        if($model->state == SalesOrder::State_five) return [false, '请确认合同状态,操作失败'];
+        if($model->state == SalesOrder::State_seven) return [false, '请确认合同状态,操作失败'];
 
-        SalesOrder::where('del_time',0)->where('id',$data['id'])
+        SalesOrder::where('del_time',0)->where('order_number',$data['order_number'])
             ->update(['state' => SalesOrder::State_seven]);
 
         return [true, $model->toArray()];
     }
 
     public function confirmSales($data){
-        $model = SalesOrder::where('id', $data['id'])
+        $model = SalesOrder::where('order_number', $data['order_number'])
             ->where('del_time',0)
             ->first();
         if(empty($model)) return [false, '合同不存在或已被删除'];
         if($model->state != SalesOrder::State_one) return [false, '请确认合同状态,操作失败'];
 
         //已确认
-        SalesOrder::where('del_time',0)->where('id',$data['id'])
+        SalesOrder::where('del_time',0)->where('order_number',$data['order_number'])
             ->update(['state' => SalesOrder::State_two]);
 
         return [true, $model->toArray()];
@@ -618,19 +615,179 @@ class CheckService extends Service
     }
 
     public function reject_sales($data){
-        $model = SalesOrder::where('id', $data['id'])
+        $model = SalesOrder::where('order_number', $data['order_number'])
             ->where('del_time',0)
             ->first();
         if(empty($model)) return [false, '合同不存在或已被删除'];
         //安装件
         if($model->state != SalesOrder::State_two) return [false, '请确认合同状态,操作失败'];
 
-        SalesOrder::where('del_time',0)->where('id',$data['id'])
+        //未确认
+        SalesOrder::where('del_time',0)->where('order_number',$data['order_number'])
             ->update(['state' => SalesOrder::State_zero]);
 
         return [true, $model->toArray()];
     }
 
+    public function reject_purchase($data){
+        $model = PurchaseOrder::where('order_number', $data['order_number'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($model)) return [false, '采购单不存在或已被删除'];
+        //安装件
+        if($model->state != PurchaseOrder::STATE_Four) return [false, '请确认采购单状态,操作失败'];
+
+        //未出库
+        PurchaseOrder::where('del_time',0)->where('order_number',$data['order_number'])
+            ->update(['state' => PurchaseOrder::STATE_TWO]);
+
+        return [true, $model->toArray()];
+    }
+
+    public function reject_construction($data){
+        $model = Construction::where('order_number', $data['order_number'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($model)) return [false, '施工单不存在或已被删除'];
+        //安装件
+        if($model->state != Construction::STATE_TWO) return [false, '请确认施工单状态,操作失败'];
+
+        Construction::where('del_time',0)->where('order_number',$data['order_number'])
+            ->update(['state' => Construction::STATE_ZERO]);
+
+        return [true, $model->toArray()];
+    }
+
+    public function reject_return_exchange($data){
+        $model = ReturnExchangeOrder::where('order_number', $data['order_number'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($model)) return [false, '退换货单不存在或已被删除'];
+        //安装件
+        if($model->state != ReturnExchangeOrder::State_two) return [false, '请确认退换货单状态,操作失败'];
+
+        ReturnExchangeOrder::where('del_time',0)->where('order_number',$data['order_number'])
+            ->update(['state' => ReturnExchangeOrder::State_zero]);
+
+        return [true, $model->toArray()];
+    }
+
+    public function reject_record_construction($data,$order){
+        //获取单据最新数据时间 正常施工数据
+        $latest = InOutRecord::where('del_time',0)
+            ->where('order_number',$data['order_number'])
+            ->where('number','<',0)
+            ->select('crt_time')
+            ->orderBy('crt_time', 'desc')
+            ->first();
+        $latest = $latest->toArray();
+
+        $result = InOutRecord::where('del_time',0)
+            ->where('crt_time',$latest['crt_time'])
+            ->where('order_number',$data['order_number'])
+            ->where('number','<',0)
+            ->select('product_id','storehouse_id','number','depart_id','order_number','top_depart_id','order_type')
+            ->get()->toArray();
+        if(empty($result)) return false;
+
+        //生成对冲数据
+        $time = time();
+        foreach ($result as $key => $value){
+            $result[$key]['number'] = abs($value['number']);
+            $result[$key]['crt_time'] = $time;
+        }
+
+        //写入流水
+        return InOutRecord::insert($result);
+    }
+
+    public function reject_record_purchase($data,$order){
+        //获取单据最新数据时间 正常采购入库数据
+        $latest = InOutRecord::where('del_time',0)
+            ->where('order_number',$data['order_number'])
+            ->where('number','>',0)
+            ->select('crt_time')
+            ->orderBy('crt_time', 'desc')
+            ->first();
+        $latest = $latest->toArray();
+
+        $result = InOutRecord::where('del_time',0)
+            ->where('crt_time',$latest['crt_time'])
+            ->where('order_number',$data['order_number'])
+            ->where('number','>',0)
+            ->select('product_id','storehouse_id','number','depart_id','order_number','top_depart_id','order_type')
+            ->get()->toArray();
+        if(empty($result)) return false;
+
+        //生成对冲数据
+        $time = time();
+        foreach ($result as $key => $value){
+            $result[$key]['number'] = - $value['number'];
+            $result[$key]['crt_time'] = $time;
+        }
+
+        //写入流水
+        return InOutRecord::insert($result);
+    }
+
+    public function reject_record_return_exchange($data,$order){
+        $result = ReturnExchangeOrderProductInfo::where('del_time',0)
+            ->where('return_exchange_id',$order['id'])
+            ->get()->toArray();
+        if(empty($result)) return [false,'退换货单产品信息不存在或已被删除'];
+        $insert = $insert2 = [];
+        $time = time();
+        foreach ($result as $value){
+            $key = $value['product_id'] . $value['storehouse_id'];
+            $prefix = ReturnExchangeOrder::$prefix[$value['return_or_exchange']] ?? '';
+            if($value['return_or_exchange'] == ReturnExchangeOrderProductInfo::type_one){
+                //退货 扣出
+                if(isset($insert[$key])){
+                    $insert[$key]['number'] += -($value['number']);
+                }else{
+                    $insert[$key] = [
+                        'product_id' => $value['product_id'],
+                        'number' => -($value['number']),
+                        'order_type' => $prefix,
+                        'order_number' => $order['order_number'],
+                        'crt_time' => $time,
+                        'storehouse_id' => $value['storehouse_id'],
+                        'depart_id' => $order['depart_id'],
+                        'top_depart_id' => $order['top_depart_id'],
+                    ];
+                }
+            }else{
+                //换货 加回
+                if(isset($insert2[$key])){
+                    $insert2[$key]['number'] += $value['number'];
+                }else{
+                    $insert2[$key] = [
+                        'product_id' => $value['product_id'],
+                        'number' => $value['number'],
+                        'order_type' => $prefix,
+                        'order_number' => $order['order_number'],
+                        'crt_time' => $time,
+                        'storehouse_id' => $value['storehouse_id'],
+                        'depart_id' => $order['depart_id'],
+                        'top_depart_id' => $order['top_depart_id'],
+                    ];
+                }
+            }
+
+        }
+        $insert = array_values($insert);
+        $bool = InOutRecord::insert($insert);
+        if(! $bool) return [false,'流水写入失败'];
+
+        if(! empty($insert2)) {
+            $insert2 = array_values($insert2);
+            $bool = InOutRecord::insert($insert2);
+            if(! $bool) return [false,'流水写入失败'];
+        }
+
+        return [true,''];
+    }
+
     public function checkAll($data,$user){
         if(empty($data['id']) || empty($data['order_number'])|| empty($data['opt_case'])) return [false,'必传参数不能为空或者参数值错误!'];
 
@@ -778,55 +935,104 @@ class CheckService extends Service
     }
 
     //业务单据审批通过后 驳回 更新库存
-    public function changeInventoryReject($data){
-        $number_symbol = "<";
+    public function changeInventoryReject($data,$order){
+        $number_symbol = "";
         if(in_array($data['opt_case'],self::$in_opt)){
             $number_symbol = "<";
         }elseif (in_array($data['opt_case'],self::$out_opt)){
             $number_symbol = ">";
         }
 
-        //获取单据最新数据时间
+        //获取单据最新数据时间 正常审核的数据
         $latest = InOutRecord::where('del_time',0)
-            ->where('order_number',$data['order_number'])
-            ->where('number',$number_symbol,0)
+            ->where('order_number',$order['order_number'])
+            ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
+                return $query->where('number', $number_symbol,0);
+            })
             ->select('crt_time')
             ->orderBy('crt_time', 'desc')
             ->first();
 
         $model = InOutRecord::where('del_time',0)
-            ->where('order_number',$data['order_number'])
-            ->where('number',$number_symbol,0)
-            ->select('storehouse_id',DB::raw("sum(number) as number"),'roll_film_id','roll_film_number')
-            ->groupby('roll_film_id','roll_film_number','storehouse_id');
+            ->where('order_number',$order['order_number'])
+            ->when(! empty($number_symbol), function ($query) use ($number_symbol) {
+                return $query->where('number', $number_symbol,0);
+            })
+            ->select('number','crt_time','product_id','storehouse_id','top_depart_id');
         if(! empty($latest)) {
             $t = $latest->toArray();
             $model->where('crt_time',$t['crt_time']);
         }
 
-        $result = $model->get()->toArray();
-        if (empty($result)) return false;
+        $record = $model->get()->toArray();
+        if (empty($record)) return [false,'流水记录不存在'];
+        $result = $lock_number = [];
+        foreach ($record as $value){
+            $key = $value['product_id'] . $value['storehouse_id'];
+            if(isset($result[$key])){
+                $result[$key]['number'] += $value['number'];
+            }else{
+                $result[$key] = [
+                    'product_id' => $value['product_id'],
+                    'number' => $value['number'],
+                    'crt_time' => $value['crt_time'],
+                    'storehouse_id' => $value['storehouse_id'],
+                    'top_depart_id' => $value['top_depart_id'],
+                ];
+            }
+            if($value['number'] > 0){
+                if(isset($lock_number[$key])){
+                    $lock_number[$key] += $value['number'];
+                }else{
+                    $lock_number[$key] = $value['number'];
+                }
+            }
+        }
+
+        //是否锁定
+        $lock = 0;
+        $depart = Depart::where('del_time',0)
+            ->where('is_main',1)
+            ->where('parent_id',0)
+            ->first();
+        $head = 0;
+        if(! empty($depart)) $head = $depart->id;//总社
+        if($head != $order['top_depart_id']) $lock = DB::table('depart_set')->where('top_depart_id',$order['top_depart_id'])->value('param_one');
 
-        foreach ($result as $value){
-            RollFilmInventory::where('roll_film_id',$value['roll_film_id'])
-                ->where('roll_film_number',$value['roll_film_number'])
+        $result = array_values($result);
+        foreach ($result as $key => $value){
+            $keys = $value['product_id'] . $value['storehouse_id'];
+            $m = ProductInventory::where('product_id',$value['product_id'])
                 ->where('storehouse_id',$value['storehouse_id'])
-                ->lockForUpdate()
-                ->update([
-                    'number' => DB::raw('number + ('. $value['number'] . ')'),
-                    'lock_number' => DB::raw('lock_number + ('. $value['number'] . ')')
-                ]);
+                ->select('product_id','number','storehouse_id')
+                ->first();
+
+            if(empty($m)){
+                ProductInventory::insert($result[$key]);
+            }else{
+                $lock_number_tmp = 0;
+                if($lock && ! empty($lock_number[$keys])) $lock_number_tmp = $lock_number[$keys];
+
+                ProductInventory::where('product_id',$m->product_id)
+                    ->where('storehouse_id',$m->storehouse_id)
+                    ->lockForUpdate()
+                    ->update([
+                        'number' => DB::raw('number + ('. $value['number'] . ')'),
+                        'lock_number' => DB::raw('lock_number + ('. $lock_number_tmp . ')')
+                    ]);
+            }
         }
 
-        return true;
+        return [true,''];
     }
 
     public function createRecordAndInventory($data = []){
-        if(empty($data['id']) || empty($data['type']) || empty($data['opt_case'])) return [false, ''];
+        if(empty($data['type']) || empty($data['opt_case']) || empty($data['order_number'])) return [false, ''];
 
         if($data['type'] == self::TYPE_THREE){
             //通过后弃审
             if(! isset(self::$opt_case_reject[$data['opt_case']])) return [false, ''];
+
             //具体方法
             $function = self::$opt_case_reject[$data['opt_case']];
 
@@ -836,21 +1042,23 @@ class CheckService extends Service
                 DB::beginTransaction();
 
                 //更新单据的状态
-                $bool = $this->$function($data);
+                list($bool,$msg) = $this->$function($data);
                 if(! $bool){
                     DB::rollBack();
                     return [false, ''];
                 }
+                $order = $msg;
+
                 if($function2) {
                     //流水
-                    $boolean = $this->$function2($data);
+                    $boolean = $this->$function2($data,$order);
                     if(! $boolean) {
                         DB::rollBack();
                         return [false, ''];
                     }
 
                     //库存
-                    $bool = $this->changeInventoryReject($data);
+                    $bool = $this->changeInventoryReject($data,$order);
                     if(! $bool){
                         DB::rollBack();
                         return [false, ''];

+ 5 - 2
app/Service/Oa/OaService.php

@@ -12,6 +12,7 @@ use App\Model\OaSub;
 use App\Service\CheckService;
 use Illuminate\Support\Facades\DB;
 use App\Service\Service;
+use Illuminate\Support\Facades\Log;
 
 /**
  * Oa相关
@@ -178,9 +179,11 @@ class OaService extends Service
 
     public function createOaOrder($data)
     {
+        Log::channel('request')->info('request', ['param' => $data]);
+        if(!isset($data['order_number'])) $data['order_number'] = $data['order_no'];
         $menu_id = $data['menu_id'];
-        $order_no = $data['order_no'];
-        $type = isset($data['type']) ? $data['type'] : 0;
+        $order_no = $data['order_number'];
+        $type = isset($data['opt_case']) ? $data['opt_case'] : 0;
 
 //        $list = Oa::from('oa as o')
 //            ->leftJoin('oa_sub as os', 'os.oa_id', 'o.id')