|
@@ -0,0 +1,185 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Service;
|
|
|
+
|
|
|
+use App\Model\Construction;
|
|
|
+use App\Model\ConstructionProductInfo;
|
|
|
+use App\Model\InvoiceOrder;
|
|
|
+use App\Model\InvoiceOrderInfo;
|
|
|
+use App\Model\Product;
|
|
|
+use App\Model\ProductInventory;
|
|
|
+use App\Model\Setting;
|
|
|
+use Illuminate\Support\Facades\DB;
|
|
|
+
|
|
|
+class ProductInventoryService extends Service
|
|
|
+{
|
|
|
+ //获取产品真实库存
|
|
|
+ public static function getRealStock($product_id = [],$data){
|
|
|
+ if(empty($product_id)) return [];
|
|
|
+ $array = ProductInventory::whereIn('product_id',$product_id)
|
|
|
+ ->where('number','>',0)
|
|
|
+ ->select('id','product_id','number','crt_time','lock_number')
|
|
|
+ ->get()->toArray();
|
|
|
+
|
|
|
+ $map = [];
|
|
|
+ if(! empty($data['order_number'])){
|
|
|
+ if(strpos($data['order_number'],InvoiceOrder::prefix) !== false){
|
|
|
+ $id = InvoiceOrder::where('order_number',$data['order_number'])
|
|
|
+ ->where('del_time',0)
|
|
|
+ ->value('id');
|
|
|
+ $model = new InvoiceOrderInfo();
|
|
|
+ }else{
|
|
|
+ foreach (Construction::$prefix as $value){
|
|
|
+ if(strpos($data['order_number'],$value) !== false){
|
|
|
+ $model = new ConstructionProductInfo();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $id = Construction::where('order_number',$data['order_number'])
|
|
|
+ ->where('del_time',0)
|
|
|
+ ->value('id');
|
|
|
+ }
|
|
|
+ if(! empty($model) && ! empty($id)){
|
|
|
+ $save = $model->where('del_time',0)
|
|
|
+ ->where('id',$id)
|
|
|
+ ->select('product_id','number')
|
|
|
+ ->get()->toArray();
|
|
|
+ foreach ($save as $value){
|
|
|
+ $key = $value['product_id'];
|
|
|
+ if(isset($map[$key])){
|
|
|
+ $map[$key] += $value['number'];
|
|
|
+ }else{
|
|
|
+ $map[$key] = $value['number'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $return = [];
|
|
|
+ if(! empty($array)){
|
|
|
+ $setting_map = Setting::where('setting_name','lock_number')
|
|
|
+ ->pluck('setting_value','setting_name')
|
|
|
+ ->toArray();
|
|
|
+ foreach ($array as $value){
|
|
|
+ if(! empty($setting_map['lock_number'])){//真实库存
|
|
|
+ $tmp = $map[$value['product_id']] ?? 0;//已保存数量
|
|
|
+ $tmp_lock = ($value['lock_number'] > 0 ? $value['lock_number'] : 0) - $tmp;
|
|
|
+ if($value['number'] > $tmp_lock) {
|
|
|
+ $return[] = [
|
|
|
+ 'id' => $value['id'],
|
|
|
+ 'product_id' => $value['product_id'],
|
|
|
+ 'number' => $value['number'] - ($tmp_lock > 0 ? $tmp_lock : 0),
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ $return[] = [
|
|
|
+ 'id' => $value['id'],
|
|
|
+ 'product_id' => $value['product_id'],
|
|
|
+ 'number' => $value['number'],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return $return;
|
|
|
+ }
|
|
|
+
|
|
|
+ //更新锁定库存
|
|
|
+ //第一个数组 (提交的数据) 第二个数组(保存过的数据)
|
|
|
+ public static function changeLockNumber($submit_total = [], $save_total = []){
|
|
|
+ if(empty($submit_total) && empty($save_total)) return;
|
|
|
+
|
|
|
+ $setting_map = Setting::where('setting_name','lock_number')
|
|
|
+ ->pluck('setting_value','setting_name')
|
|
|
+ ->toArray();
|
|
|
+ if(empty($setting_map['lock_number'])) return; //是否使用锁定库存
|
|
|
+
|
|
|
+ //产品数扣减
|
|
|
+ if(! empty($save_total)){
|
|
|
+ foreach ($save_total as $key => $value){
|
|
|
+ if(! isset($submit_total[$key])){
|
|
|
+ $submit_total[$key] = - $value;
|
|
|
+ }else{
|
|
|
+ $submit_total[$key] = $submit_total[$key] - $value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //更新锁定库存
|
|
|
+ foreach ($submit_total as $key => $value){
|
|
|
+ $product_id = $key;
|
|
|
+
|
|
|
+ ProductInventory::where('product_id',$product_id)
|
|
|
+ ->update(['lock_number' => DB::raw('lock_number + ('. $value . ')')]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //比较库存
|
|
|
+ public static function compareStock($product_id = [],$data){
|
|
|
+ if(empty($product_id) || empty($data['product'])) return [false,'比较参数不能为空'];
|
|
|
+
|
|
|
+ $pro = Product::whereIn('id',$product_id)
|
|
|
+ ->pluck('title','id')
|
|
|
+ ->toArray();
|
|
|
+ $setting_map = Setting::where('setting_name','lock_number')
|
|
|
+ ->pluck('setting_value','setting_name')
|
|
|
+ ->toArray();
|
|
|
+ $product_map = $data['product'];
|
|
|
+
|
|
|
+ //库存
|
|
|
+ $array = ProductInventory::whereIn('product_id',$product_id)
|
|
|
+ ->where('number','>',0)
|
|
|
+ ->select('id','product_id','number','crt_time','lock_number')
|
|
|
+ ->get()->toArray();
|
|
|
+
|
|
|
+ //已保存单据的产品数量
|
|
|
+ $map = [];
|
|
|
+ if(! empty($setting_map['lock_number']) && ! empty($data['order_number'])){
|
|
|
+ if(strpos($data['order_number'],InvoiceOrder::prefix) !== false){
|
|
|
+ $id = InvoiceOrder::where('order_number',$data['order_number'])
|
|
|
+ ->where('del_time',0)
|
|
|
+ ->value('id');
|
|
|
+ $model = new InvoiceOrderInfo();
|
|
|
+ }else{
|
|
|
+ foreach (Construction::$prefix as $value){
|
|
|
+ if(strpos($data['order_number'],$value) !== false){
|
|
|
+ $model = new ConstructionProductInfo();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $id = Construction::where('order_number',$data['order_number'])
|
|
|
+ ->where('del_time',0)
|
|
|
+ ->value('id');
|
|
|
+ }
|
|
|
+ if(! empty($model) && ! empty($id)){
|
|
|
+ $save = $model->where('del_time',0)
|
|
|
+ ->where('id',$id)
|
|
|
+ ->select('product_id','number')
|
|
|
+ ->get()->toArray();
|
|
|
+ foreach ($save as $value){
|
|
|
+ $key = $value['product_id'];
|
|
|
+ if(isset($map[$key])){
|
|
|
+ $map[$key] += $value['number'];
|
|
|
+ }else{
|
|
|
+ $map[$key] = $value['number'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //比较
|
|
|
+ if(! empty($array)){
|
|
|
+ foreach ($array as $value){
|
|
|
+ if(! isset($product_map[$value['product_id']])) return [false,'产品不存在'];
|
|
|
+
|
|
|
+ if(! empty($setting_map['lock_number'])){//真实库存
|
|
|
+ $tmp = $map[$value['product_id']] ?? 0;//已保存数量
|
|
|
+ $tmp_lock = ($value['lock_number'] > 0 ? $value['lock_number'] : 0) - $tmp;
|
|
|
+ $number = $value['number'] - ($tmp_lock > 0 ? $tmp_lock : 0);
|
|
|
+ }else{
|
|
|
+ $number = $value['number'];
|
|
|
+ }
|
|
|
+ if($product_map[$value['product_id']] > $number) return [false,$pro[$value['product_id']] . '数量不足,当前数量:'. $number];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return [true,''];
|
|
|
+ }
|
|
|
+}
|