cqpCow 1 년 전
부모
커밋
f4580e1946
1개의 변경된 파일114개의 추가작업 그리고 3개의 파일을 삭제
  1. 114 3
      app/Service/ProductInventoryService.php

+ 114 - 3
app/Service/ProductInventoryService.php

@@ -2,13 +2,18 @@
 
 namespace App\Service;
 
+use App\Model\BasicType;
 use App\Model\Construction;
 use App\Model\ConstructionProductInfo;
+use App\Model\InOutRecord;
 use App\Model\InvoiceOrder;
 use App\Model\InvoiceOrderInfo;
 use App\Model\Product;
 use App\Model\ProductCategory;
 use App\Model\ProductInventory;
+use App\Model\PurchaseOrder;
+use App\Model\ReturnExchangeOrder;
+use App\Model\SalesOrder;
 use App\Model\Setting;
 use Illuminate\Support\Facades\DB;
 
@@ -156,9 +161,25 @@ class ProductInventoryService extends Service
             ->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['product_name'])){
+            $product_name = $data['product_name'];
+            $id = Product::where('del_time',0)
+                ->when(! empty($product_name), function ($query) use ($product_name) {
+                    return $query->where('title', 'LIKE', '%'.$product_name.'%');
+                })
+                ->select('id')
+                ->get()->toArray();
+            $model->whereIn('a.product_id',array_unique(array_column($id,'id')));
+        }
+        if(! empty($data['product_category_name'])){
+            $product_category_name = $data['product_category_name'];
+            $c = ProductCategory::where('del_time',0)
+                ->where('title', 'LIKE', '%'.$product_category_name.'%')
+                ->select('id')
+                ->get()->toArray();
+            $model->whereIn('b.product_category_id',array_unique(array_column($c,'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]]);
@@ -176,12 +197,102 @@ class ProductInventoryService extends Service
         $category = ProductCategory::whereIn('id',array_column($data['data'],'product_category_id'))
             ->pluck('title','id')
             ->toArray();
-
+        $basic_map = BasicType::whereIn('id',array_unique(array_column($data['data'],'unit')))
+            ->pluck('title','id')
+            ->toArray();
         foreach ($data['data'] as $key => $value){
+            $data['data'][$key]['unit_title'] = $basic_map[$value['unit']] ?? '';
             $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;
     }
+
+    //库存台账
+    public function productInventoryStockList($data,$user){
+        $model = InOutRecord::from('in_out_record as a')
+            ->where('a.del_time',0)
+            ->join('product as b','b.id','a.product_id')
+            ->select('a.id','a.product_id','a.number','a.order_type','a.crt_time','b.title','b.code','b.product_category_id','b.unit',DB::raw('SUM(CASE WHEN number < 0 THEN number ELSE 0 END) as out_number'),DB::raw('SUM(CASE WHEN number >= 0 THEN number ELSE 0 END) as in_number'),'a.order_number','a.crt_time')
+            ->groupby('a.product_id','a.order_number')
+            ->orderBy('a.crt_time','asc');
+
+        if(empty($data['crt_time'][0]) || empty($data['crt_time'][1])) return [false,'时间必须选择'];
+        $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
+        $model->whereBetween('a.crt_time',[$return[0],$return[1]]);
+
+        if(! empty($data['product_category_id'])) $model->whereIn("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']);
+
+        $list = $model->get()->toArray();
+        $list = $this->fillData($list, $return);
+
+        return [true, $list];
+    }
+
+    public function fillData($data,$time_arr){
+        if (empty($data)) return $data;
+
+        $start_data = InOutRecord::whereIn('product_id',array_column($data,'product_id'))
+            ->where('crt_time','<',$time_arr[0])
+            ->where('del_time',0)
+            ->select('product_id','number',DB::raw('sum(number) as number'))
+            ->groupby('product_id')
+            ->get()->toArray();
+        $start_map = [];
+        foreach ($start_data as $value){
+            $start_map[$value['product_id']] = $value['number'];
+        }
+
+        $category = ProductCategory::whereIn('id',array_unique(array_column($data,'b_r_f_id')))
+            ->pluck('title','id')
+            ->toArray();
+
+        $roll_tmp = [];
+        $order_type = $this->getOrderType();
+        foreach ($data as $key => $value){
+            $keys = $value['product_id'];
+            if(! isset($roll_tmp[$keys])){
+                if(isset($start_map[$keys])){
+                    $data[$key]['start_number'] = $start_map[$keys];
+                }else{
+                    $data[$key]['start_number'] = 0;
+                }
+                $tmp = $data[$key]['start_number'] + $value['in_number'] + $value['out_number'];
+                $data[$key]['end_number'] = round($tmp,2);
+                $roll_tmp[$keys] = $data[$key]['end_number'];
+            }else{
+                $data[$key]['start_number'] = $roll_tmp[$keys];
+                $tmp = $data[$key]['start_number'] + $value['in_number'] + $value['out_number'];
+                $data[$key]['end_number'] = round($tmp,2);
+                $roll_tmp[$keys] = $data[$key]['end_number'];
+            }
+
+            $data[$key]['out_number'] = abs($value['out_number']);
+            $data[$key]['product_category_title'] = $category[$value['product_category_id']] ?? '';
+            $data[$key]['order_name'] = $order_type[$value['order_type']] ?? '';
+            $data[$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d",$value['crt_time']):'';
+        }
+
+        return $data;
+    }
+
+    public function getOrderType(){
+        $array = [];
+        foreach (Construction::$prefix as $value){
+            $array[$value] = '施工单';
+        }
+        foreach (ReturnExchangeOrder::$prefix as $key => $value){
+            $array[$value] = ReturnExchangeOrder::$model_type_name[$key] ?? '';
+        }
+        foreach (SalesOrder::$prefix as $value){
+            $array[$value] = '合同';
+        }
+        $array[InvoiceOrder::prefix] = '发货单';
+        $array[PurchaseOrder::prefix] = '采购单';
+
+        return $array;
+    }
 }