|
@@ -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;
|
|
|
+ }
|
|
|
}
|