cqp 2 månader sedan
förälder
incheckning
df34df59a1

+ 74 - 0
app/Http/Controllers/Api/ProductAdjustmentController.php

@@ -0,0 +1,74 @@
+<?php
+
+namespace App\Http\Controllers\Api;
+
+use App\Service\ProductAdjustService;
+use Illuminate\Http\Request;
+
+class ProductAdjustmentController extends BaseController
+{
+    public function productAdjustmentAdd(Request $request)
+    {
+        $service = new ProductAdjustService();
+        $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 productAdjustmentEdit(Request $request)
+    {
+        $service = new ProductAdjustService();
+        $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 productAdjustmentDetail(Request $request)
+    {
+        $service = new ProductAdjustService();
+        $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 productAdjustmentDel(Request $request)
+    {
+        $service = new ProductAdjustService();
+        $userData = $request->userData->toArray();
+        list($status,$data) = $service->del($request->all(),$userData);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function productAdjustmentList(Request $request)
+    {
+        $service = new ProductAdjustService();
+        $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);
+        }
+    }
+}

+ 33 - 0
app/Model/ProductAdjustment.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ProductAdjustment extends UseScopeBaseModel
+{
+    protected $table = "product_adjustment"; //指定表
+    const CREATED_AT = 'crt_time';
+    const UPDATED_AT = 'upd_time';
+    protected $dateFormat = 'U';
+    const State_minus_one = -1;//驳回
+    const STATE_ZERO = 0;//未审核
+    const STATE_ONE = 1;//待审核
+    const STATE_TWO = 2;//审核通过
+    const prefix = 'PAD';
+    public static $name = [
+        self::State_minus_one => '驳回',
+        self::STATE_ZERO => '未审核',
+        self::STATE_ONE => '待审核',
+        self::STATE_TWO => '审核通过'
+    ];
+
+    const range_function = '';
+    const is_check_function = 'productAdjustmentCheck';
+
+    public static $wait_check = [
+        self::State_minus_one,
+        self::STATE_ZERO,
+        self::STATE_ONE,
+    ];
+}

+ 14 - 0
app/Model/ProductAdjustmentSub.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class ProductAdjustmentSub extends Model
+{
+    protected $table = "product_adjustment_sub"; //指定表
+    const CREATED_AT = null;
+    const UPDATED_AT = null;
+    protected $dateFormat = 'U';
+
+}

+ 77 - 0
app/Service/CheckService.php

@@ -18,6 +18,8 @@ use App\Model\OutBoundOrder;
 use App\Model\OutBoundOrderInfo;
 use App\Model\PaymentReceipt;
 use App\Model\PaymentReceiptInfo;
+use App\Model\ProductAdjustment;
+use App\Model\ProductAdjustmentSub;
 use App\Model\ProductInventory;
 use App\Model\ProductInventorySet;
 use App\Model\PurchaseOrder;
@@ -59,6 +61,7 @@ class CheckService extends Service
     const fourteen  = 14; //盘点
     const fifteen  = 15; //放弃门店派单
     const sixteen  = 16; //出库单审核
+    const seventeen  = 17; //产品金额调整单审核
 
     //中文对照
     public $map = [
@@ -78,6 +81,7 @@ class CheckService extends Service
         self::fourteen => '盘点单',
         self::fifteen => '放弃门店派单',
         self::sixteen => '出库单审核',
+        self::seventeen => '产品金额调整单审核',
     ];
 
     //入库操作
@@ -114,6 +118,7 @@ class CheckService extends Service
         self::thi => 'waitPurchaseSpecial', //虚拟采购单
         self::fourteen => 'waitInventory', //盘点单
         self::sixteen => 'waitOut', //出库单
+        self::seventeen => 'waitProductAdjustment', //产品金额调整单
     ];
 
     public static $finished = [
@@ -137,6 +142,7 @@ class CheckService extends Service
         self::thi => 'confirmPurchaseSpecial', //虚拟采购单
         self::fourteen => 'confirmInventory', //盘点单
         self::sixteen => 'confirmOut', //出库单
+        self::seventeen => 'confirmProductAdjustment', //产品金额调整单
     ];
 
     //单据库存流水
@@ -147,6 +153,7 @@ class CheckService extends Service
         self::six => 'recordReturnExchangeOrder',
         self::fourteen => 'recordInventory',
         self::sixteen => 'recordOut',
+        self::seventeen => 'recordProductAdjustment',
     ];
 
     //自动生成
@@ -330,6 +337,20 @@ class CheckService extends Service
         return [true, $model->toArray()];
     }
 
+    public function waitProductAdjustment($data){
+        $model = ProductAdjustment::where('id',$data['id'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($model)) return [false, '产品金额调整单不存在或已被删除'];
+        if($model->state > ProductAdjustment::STATE_ZERO) return [false, '请确认产品金额调整单状态,操作失败'];
+
+        //待审核
+        ProductAdjustment::where('del_time',0)->where('id',$data['id'])
+            ->update(['state' => ProductAdjustment::STATE_ONE]);
+
+        return [true, $model->toArray()];
+    }
+
     public function waitConstruction($data){
         $model = Construction::where('id',$data['id'])
             ->where('del_time',0)
@@ -1104,6 +1125,25 @@ class CheckService extends Service
         return [true, $model->toArray()];
     }
 
+    public function confirmProductAdjustment($data){
+        $model = ProductAdjustment::where('order_number',$data['order_number'])
+            ->where('del_time',0)
+            ->first();
+        if(empty($model)) return [false,'产品金额调整单不存在或已被删除'];
+        if($model->state != ProductAdjustment::STATE_ONE) return [false,'请确认产品金额调整单状态,操作失败'];
+
+        if($data['type'] == self::TYPE_ONE){
+            $model->state = ProductAdjustment::STATE_TWO;
+            $model->save();
+        }else{
+            //驳回
+            $model->state = ProductAdjustment::State_minus_one;
+            $model->save();
+        }
+
+        return [true, $model->toArray()];
+    }
+
     public function recordInventory($data, $order){
         $result = InventorySub::where('del_time',0)
             ->where('inventory_id',$order['id'])
@@ -1200,6 +1240,43 @@ class CheckService extends Service
         return [true, ''];
     }
 
+    public function recordProductAdjustment($data, $order){
+        $result = ProductAdjustmentSub::where('del_time',0)
+            ->where('product_adjustment_id', $order['id'])
+            ->select('product_id','storehouse_id','final_amount')
+            ->get()->toArray();
+        if(empty($result)) return [false, "产品调整单明细数据不能为空"];
+
+        $time = time();
+        $prefix = ProductAdjustment::prefix;
+        $insert = [];
+        foreach ($result as $value){
+            $key = $value['product_id'] . $value['storehouse_id'];
+
+            if(isset($insert[$key])){
+                $price = bcadd($insert[$key]['price'], $value['final_amount'],2);
+                $insert[$key]['price'] = $price;
+            }else{
+                $insert[$key] = [
+                    'product_id' => $value['product_id'],
+                    'number' => 0,
+                    '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'],
+                    'price' => $value['final_amount'],
+                ];
+            }
+        }
+
+        $bool = InOutRecord::insert($insert);
+        if(! $bool) return [false, '流水写入失败'];
+
+        return [true, self::minus_one];
+    }
+
     public function settleSalesOrder($data,$user){
         $model = SalesOrder::where('order_number', $data['order_number'])
             ->where('del_time',0)

+ 1 - 1
app/Service/InventoryService.php

@@ -400,7 +400,7 @@ class InventoryService extends Service
 
         $sub = InventorySub::where('del_time', 0)
             ->whereIn('inventory_id', array_column($inventory,'id'))
-            ->select('product_id', 'storehouse_id')
+            ->select('product_id', 'storehouse_id', 'order_number')
             ->get()->toArray();
 
         $map = [];

+ 338 - 0
app/Service/ProductAdjustService.php

@@ -0,0 +1,338 @@
+<?php
+
+namespace App\Service;
+
+use App\Model\Employee;
+use App\Model\InventorySub;
+use App\Model\Product;
+use App\Model\ProductAdjustment;
+use App\Model\ProductAdjustmentSub;
+use App\Model\Storehouse;
+use Illuminate\Support\Facades\DB;
+
+class ProductAdjustService extends Service
+{
+    public function edit($data,$user){
+        list($status,$msg) = $this->orderRule($data, $user,false);
+        if(!$status) return [$status,$msg];
+
+        try{
+            DB::beginTransaction();
+            $inventory_model = ProductAdjustment::where('order_number',$data['order_number'])->first();
+            $inventory_model->counted_id = $data['counted_id'];
+            $inventory_model->counted_time = $data['counted_time'];
+            $inventory_model->mark = $data['mark'];
+            $inventory_model->save();
+
+            ProductAdjustmentSub::where('del_time',0)
+                ->where('order_number',$data['order_number'])
+                ->update(['del_time'=>time()]);
+
+            if(! empty($data['sub'])){
+                $sub = [];
+                foreach ($data['sub'] as $value){
+                    $sub[] = [
+                        'product_id' => $value['product_id'],
+                        'storehouse_id' => $data['storehouse_id'],
+                        'order_number' => $data['order_number'],
+                        'product_adjustment_id' => $inventory_model->id,
+                        'final_amount' => $value['final_amount'],
+                    ];
+                }
+                ProductAdjustmentSub::insert($sub);
+            }
+
+            DB::commit();
+        }catch (\Throwable $e){
+            DB::rollBack();
+            return [false,$e->getMessage()];
+        }
+
+        if(! empty($data['check'])) {
+            list($status,$msg) = (new CheckService())->checkAll([
+                "id" => $inventory_model->id,
+                "order_number" => $data['order_number'],
+                "opt_case" => CheckService::seventeen,
+                "menu_id" => $data['menu_id']
+            ],$user);
+            if(! $status) return [true, '保存成功,产品金额调整单确认失败,异常信息:' . $msg];
+        }
+
+        return [true, ''];
+    }
+
+    public function add($data,$user){
+        list($status,$msg) = $this->orderRule($data, $user);
+        if(!$status) return [$status,$msg];
+        try{
+            DB::beginTransaction();
+            $inventory_model = new ProductAdjustment();
+            $inventory_model->order_number = $data['order_number'];
+            $inventory_model->storehouse_id = $data['storehouse_id'];
+            $inventory_model->counted_id = $data['counted_id'];
+            $inventory_model->counted_time = $data['counted_time'];
+            $inventory_model->mark = $data['mark'] ?? '';
+            $inventory_model->depart_id = $data['depart_id'] ?? 0;
+            $inventory_model->top_depart_id = $data['top_depart_id'] ?? 0;
+            $inventory_model->crt_id = $user['id'];
+            $inventory_model->save();
+
+            if(! empty($data['sub'])){
+                $sub = [];
+                foreach ($data['sub'] as $value){
+                    $sub[] = [
+                        'product_id' => $value['product_id'],
+                        'storehouse_id' => $data['storehouse_id'],
+                        'order_number' => $data['order_number'],
+                        'product_adjustment_id' => $inventory_model->id,
+                        'final_amount' => $value['final_amount'],
+                    ];
+                }
+                ProductAdjustmentSub::insert($sub);
+            }
+
+            DB::commit();
+        }catch (\Throwable $exception){
+            DB::rollBack();
+            if (str_contains($exception->getMessage(), '1062') || str_contains($exception->getMessage(), 'Duplicate entry')) {
+                return [false, '网络波动,请重新操作!'];
+            }
+            return [false,$exception->getMessage()];
+        }
+
+        if(! empty($data['check'])) {
+            list($status,$msg) = (new CheckService())->checkAll([
+                "id" => $inventory_model->id,
+                "order_number" => $data['order_number'],
+                "opt_case" => CheckService::seventeen,
+                "menu_id" => $data['menu_id']
+            ],$user);
+            if(! $status) return [true, '保存成功,产品金额调整单确认失败,异常信息:' . $msg];
+        }
+
+        return [true, ''];
+    }
+
+    public function detail($data,$user){
+        if(empty($data['id']) && empty($data['order_number'])) return [false,'请选择数据!'];
+
+        if(! empty($data['id'])){
+            $inventory = ProductAdjustment::where('del_time',0)
+                ->where('id',$data['id'])
+                ->first();
+        }else{
+            $inventory = ProductAdjustment::where('del_time',0)
+                ->where('order_number',$data['order_number'])
+                ->first();
+            $data['id'] = empty($inventory->id) ? 0 : $inventory->id;
+        }
+        if(empty($inventory)) return [false,'调整单不存在或已被删除'];
+        $inventory = $inventory->toArray();
+        $inventory['state_title'] = ProductAdjustment::$name[$inventory['state']] ?? '';
+        $inventory['storehouse_title'] = Storehouse::where('id',$inventory['storehouse_id'])->value('title');
+
+        $emp_map = Employee::whereIn('id', [$inventory['crt_id'], $inventory['counted_id']])
+            ->pluck('emp_name','id')
+            ->toArray();
+        $inventory['crt_name'] = $emp_map[$inventory['crt_id']] ?? '';
+        $inventory['counted_name'] = $emp_map[$inventory['counted_id']] ?? '';
+        $inventory['counted_time'] = $inventory['counted_time'] ? date("Y-m-d", $inventory['counted_time']): '';
+        $inventory['crt_time'] = $inventory['crt_time'] ? date("Y-m-d H:i:s", $inventory['crt_time']): '';
+
+        $sub = ProductAdjustmentSub::where('del_time',0)
+            ->where('product_adjustment_id', $data['id'])
+            ->select('product_id','final_amount')
+            ->get()->toArray();
+        $map = (new ProductService())->getProductDetail(array_column($sub,'product_id'));
+        foreach ($sub as $key => $value){
+            $tmp = $map[$value['product_id']] ?? [];
+            $sub[$key]['title'] = $tmp['title'] ?? "";
+            $sub[$key]['code'] = $tmp['code'] ?? "";
+            $sub[$key]['size'] = $tmp['size'] ?? "";
+        }
+        $inventory['sub'] = $sub;
+
+        return [true, $inventory];
+    }
+
+    public function del($data,$user){
+        if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
+        $inventory = ProductAdjustment::where('del_time',0)->where('id',$data['id'])->first();
+        if(empty($inventory)) return [false,'调整单不存在或已被删除'];
+        $inventory = $inventory->toArray();
+        if($inventory['state'] > ProductAdjustment::STATE_ZERO) return [false,'请确认调整单状态,操作失败'];
+
+        $time = time();
+        try {
+            DB::beginTransaction();
+
+            ProductAdjustment::where('id',$data['id'])->update([
+                'del_time'=> $time
+            ]);
+
+            ProductAdjustmentSub::where('del_time',0)->where('product_adjustment_id',$data['id'])->update([
+                'del_time'=> $time
+            ]);
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false, $exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
+    public function getList($data,$user){
+        $model = ProductAdjustment::Clear($user,$data);
+        $model = $model->where('del_time',0)
+            ->select('order_number','id','storehouse_id','state','counted_id','counted_time','crt_time')
+            ->orderby('id', 'desc');
+        if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) $model->whereBetween('crt_time',[$data['crt_time'][0],$data['crt_time'][1]]);
+        if(! empty($data['order_number'])) $model->where('order_number', 'LIKE', '%'.$data['order_number'].'%');
+        if(! empty($data['storehouse_id'])) $model->where('storehouse_id', $data['storehouse_id']);
+        if(! empty($data['counted_name'])) {
+            $id = $this->forSearch($data);
+            $model->whereIn('counted_id',$id);
+        }
+        if(isset($data['state'])) $model->where('state', $data['state']);
+        if(! empty($data['product_code'])) {
+            $id = $this->forSearch($data);
+            $model->whereIn('id',$id);
+        }
+
+        $list = $this->limit($model,'',$data);
+        $list = $this->fillListData($list);
+
+        return [true, $list];
+    }
+
+    public function fillListData($data){
+        if(empty($data['data'])) return $data;
+
+        $storehouse_map = Storehouse::whereIn('id',array_column($data['data'],'storehouse_id'))
+            ->pluck('title','id')
+            ->toArray();
+
+        $emp_map = Employee::whereIn('id',array_unique(array_merge_recursive(array_column($data['data'],'counted_id'), array_column($data['data'],'crt_id'))))
+            ->pluck('emp_name','id')
+            ->toArray();
+
+        foreach ($data['data'] as $key => $value){
+            $data['data'][$key]['counted_time'] = $value['counted_time'] ? date("Y-m-d",$value['counted_time']) : '';
+            $data['data'][$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']) : '';
+            $data['data'][$key]['storehouse_name'] = $storehouse_map[$value['storehouse_id']] ?? '';
+            $data['data'][$key]['counted_name'] = $emp_map[$value['counted_id']] ?? '';
+            $data['data'][$key]['state_name'] = ProductAdjustment::$name[$value['state']] ?? '';
+        }
+
+        return $data;
+    }
+
+    public function forSearch($data){
+        if(! empty($data['product_code'])){
+            $product = Product::where('code',  'LIKE', '%'.$data['product_code'].'%')
+                ->select('id')
+                ->get()->toArray();
+            $inventory_id = InventorySub::where('del_time',0)
+                ->whereIn('product_id', array_column($product,'id'))
+                ->select('inventory_id')
+                ->get()->toArray();
+            return array_column($inventory_id, 'inventory_id');
+        }
+
+        if(! empty($data['counted_name'])){
+            $employee = Employee::where('emp_name',  'LIKE', '%'.$data['counted_name'].'%')
+                ->select('id')
+                ->get()->toArray();
+            return array_column($employee, 'id');
+        }
+
+        return [];
+    }
+
+    public function orderRule(&$data, $user, $is_add = true){
+        if(empty($data['counted_id'])) $data['counted_id'] = $user['id'];
+        if(empty($data['counted_time'])) return [false,'调整日期不能为空'];
+        $data['counted_time'] = $this->changeDateToDate($data['counted_time']);
+        if(empty($data['storehouse_id'])) return [false,'仓库不能为空'];
+        if(empty($data['sub'])) return [false, '调整明细不能为空'];
+        $product_submit = [];
+        foreach ($data['sub'] as $value){
+            if(empty($value['product_id'])) return [false,"盘点单产品ID不为空"];
+            if(! isset($value['final_amount'])) return [false, '调整金额不存在'];
+            if(! is_numeric($value['final_amount']))  return [false, '调整金额请填写数字'];
+            $formattedNumber = number_format($value['final_amount'], 2, '.', '');
+            if($formattedNumber != $value['final_amount']) return [false, '调整金额请填写不超过两位小数的数字'];
+
+            $key = $value['product_id'] . ',' .$data['storehouse_id'];
+            if(! isset($product_submit[$key])) $product_submit[$key] = 0;
+        }
+
+        //所属部门 以及  顶级部门
+        if(empty($data['depart_id'])) {
+            $data['depart_id'] = $this->getDepart($user);
+            $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0;
+        }
+
+        if($is_add){
+            $order_number = (new OrderNoService())->createOrderNumber(ProductAdjustment::prefix);
+            if(empty($order_number)) return [false,'调整单号生成失败'];
+            $data['order_number'] = $order_number;
+        }else{
+            if(empty($data['order_number'])) return [false,'盘点单号不能为空'];
+            $model = ProductAdjustment::where('order_number',$data['order_number'])->where('del_time',0)->first();
+            if(empty($model)) return [false, '调整单号不存在或已被删除'];
+            $order = $model->toArray();
+            if($order['state'] != ProductAdjustment::STATE_ZERO) return [false, '请确认单据状态,编辑失败'];
+            if($order['storehouse_id'] != $data['storehouse_id']) return [false, '仓库不允许编辑'];
+            //订单编辑提交限制
+            $current_top_depart_id = $this->getMyTopDepart($user);
+            list($status, $msg) = $this->returnOrderEditErrorCommon($current_top_depart_id, $order['top_depart_id']);
+            if(! $status) return [false, $msg];
+        }
+
+        //校验是否存在产品调整
+        list($status, $msg) = $this->issetProduct($data, $product_submit);
+        if(! $status) return [false, $msg];
+
+        return [true, ''];
+    }
+
+    public function issetProduct($data, $product_submit){
+        $id = $data['id'] ?? 0;
+
+        $inventory = ProductAdjustment::where('del_time',0)
+            ->when(! empty($id), function ($query) use ($id) {
+                return $query->where('id','<>',$id);
+            })
+            ->where('top_depart_id',$data['top_depart_id'])
+            ->where('state','<',ProductAdjustment::STATE_TWO)
+            ->select('id')
+            ->get()->toArray();
+
+        $sub = ProductAdjustmentSub::where('del_time', 0)
+            ->whereIn('inventory_id', array_column($inventory,'id'))
+            ->select('product_id', 'storehouse_id')
+            ->get()->toArray();
+
+        $map = [];
+        $product = Product::whereIn('id', array_unique(array_column($sub,'product_id')))
+            ->select('id','title','code')
+            ->get()->toArray();
+        foreach ($product as $value){
+            $map[$value['id']] = $value;
+        }
+
+        foreach ($sub as $value){
+            $key = $value['product_id'] . ',' .$value['storehouse_id'];
+            if(isset($product_submit[$key])){
+                $pro_tmp = $map[$value['product_id']] ?? [];
+                $pro_str = $pro_tmp['title'] . "( ". $pro_tmp['code'] .")";
+                return [false, "产品:" . $pro_str . "在调整单:" . $value['order_number'] . "已录入盘点"];
+            }
+        }
+
+        return [true, ''];
+    }
+}

+ 4 - 0
app/Service/ProductInventoryService.php

@@ -13,10 +13,12 @@ use App\Model\InvoiceOrderInfo;
 use App\Model\OrderOperation;
 use App\Model\OutBoundOrder;
 use App\Model\Product;
+use App\Model\ProductAdjustment;
 use App\Model\ProductCategory;
 use App\Model\ProductInventory;
 use App\Model\ProductInventorySet;
 use App\Model\PurchaseOrder;
+use App\Model\PurchaseOrderInfoForOutBound;
 use App\Model\ReturnExchangeOrder;
 use App\Model\SalesOrder;
 use App\Model\Setting;
@@ -358,6 +360,8 @@ class ProductInventoryService extends Service
         $array[PurchaseOrder::prefix] = '采购单';
         $array[Inventory::prefix] = '盘点单';
         $array[OutBoundOrder::prefix] = '出库单';
+        $array[PurchaseOrderInfoForOutBound::prefix] = '平出库流水记录';
+        $array[ProductAdjustment::prefix] = '产品金额调整单';
 
         return $array;
     }

+ 46 - 0
app/Service/RangeService.php

@@ -17,6 +17,7 @@ use App\Model\OaOrderSubEmployee;
 use App\Model\PaymentReceipt;
 use App\Model\PaymentReceiptInfo;
 use App\Model\Product;
+use App\Model\ProductAdjustment;
 use App\Model\PurchaseOrder;
 use App\Model\ReturnExchangeOrder;
 use App\Model\SalesOrder;
@@ -982,6 +983,51 @@ class RangeService extends Service
         return [$status, $msg];
     }
 
+    public static function productAdjustmentCheck($user,$search){
+        $args = "";
+        if($search['is_check'] == 1) {
+            list($status, $id) = self::getProductAdjustmentCheck($user,$search);
+
+            //待审核
+            $check = implode(",", ProductAdjustment::$wait_check);
+            $args = "(state IN (" . $check ."))";
+
+            if($status) {
+                $wait_for_me = $search['wait_for_me'] ?? 0;
+
+                $check_2 = implode(',', array_diff(ProductAdjustment::$wait_check, [ProductAdjustment::STATE_ONE]));
+                $id = implode(",", $id);
+                if($wait_for_me){
+                    if(empty($id)) {
+                        $args = "(state IN (" . $check .") and (1=0 or (crt_id = " . $user['id'] ." and state IN (" . $check_2 ."))))";
+                    }else{
+                        $args = "(state IN (" . $check .") and (id IN (" . $id .") or (crt_id = " . $user['id'] ." and state IN (" . $check_2 ."))))";
+                    }
+                }
+            }
+        }elseif($search['is_check'] == 2){
+            //已审
+            $args = "(state >= ". ProductAdjustment::STATE_TWO . ")";
+        }
+
+        return $args;
+    }
+
+    private static function getProductAdjustmentCheck($user, $search){
+        if(! isset($search['wait_for_me'])) return [false, []];
+
+        //获取待审核数据
+        $args = "(state = " . ProductAdjustment::STATE_ONE . ")";
+        $data = ProductAdjustment::where('del_time',0)
+            ->whereRaw($args)
+            ->select('order_number','id')
+            ->get()->toArray();
+        if(empty($data)) return [true, []];
+
+        list($status,$msg) = self::getWaitCommon($data,$user);
+        return [$status, $msg];
+    }
+
     private static function getWaitCommon($data,$user){
         $data_map = array_column($data,'id','order_number');
         //查找对应审批流数据

+ 41 - 9
app/Service/StatisticsService.php

@@ -12,6 +12,7 @@ use App\Model\InvoiceOrder;
 use App\Model\InvoiceOrderInfo;
 use App\Model\LastJc;
 use App\Model\Product;
+use App\Model\ProductAdjustment;
 use App\Model\ProductCategory;
 use App\Model\PurchaseOrder;
 use App\Model\PurchaseOrderInfo;
@@ -1216,9 +1217,9 @@ class StatisticsService extends Service
             $data['data'][$key]['this_out_price'] = $this_out_price;
 
             //本月结存
-            //本月结存 数量/金额=本月入库+上月结存-本月出库
-            $this_jc_money = bcsub(bcadd($this_in_money,$last_jc_money,2),$this_out_money);
-            $this_jc_number = bcsub(bcadd($this_in_number,$last_jc_number,2),$this_out_number);
+            //本月结存 数量/金额=本月入库+上月结存+(-本月出库)
+            $this_jc_money = bcsub(bcadd($this_in_money,$last_jc_money,2),$this_out_money,2);
+            $this_jc_number = bcadd(bcadd($this_in_number,$last_jc_number,2),$this_out_number,2);
             $this_jc_price = floatval($this_jc_number) ? bcdiv($this_jc_money,$this_jc_number,2) : 0;//本月结存单价
             $data['data'][$key]['this_jc_money'] = $this_jc_money;
             $data['data'][$key]['this_jc_number'] = $this_jc_number;
@@ -1532,12 +1533,43 @@ class StatisticsService extends Service
         //-------- 结存数量汇总 ---------- //
 
         //-------- 结存金额汇总 ---------- //
+        $order_type = ProductAdjustment::prefix;
         //上月结存
-        $last_month_stock_m = "ROUND(SUM(CASE WHEN crt_time < $startStamp THEN (number * price) ELSE 0 END), 2)";
+        $last_month_stock_m = "ROUND(
+                                    SUM(
+                                        CASE 
+                                            WHEN crt_time < $startStamp and number <> 0 THEN (number * price)
+                                            WHEN crt_time < $startStamp and number = 0 and order_type = ' . $order_type . ' THEN price
+                                            ELSE 0 
+                                        END
+                                    ), 
+                               2)";
         //本月入库
-        $this_month_in_m = "ROUND(SUM(CASE WHEN crt_time >= $startStamp AND number > 0 THEN (number * price) ELSE 0 END), 2)";
+        $this_month_in_m = "ROUND(
+                                  SUM(
+                                      CASE 
+                                            WHEN crt_time >= $startStamp and number > 0 THEN (number * price)
+                                            WHEN crt_time >= $startStamp and number = 0 and price >= 0 and order_type = ' . $order_type . ' THEN price
+                                            ELSE 0 
+                                      END
+                                 ), 
+                            2)";
         //本月出库
-        $this_month_out_m = "ROUND(SUM(CASE WHEN crt_time >= $startStamp AND number < 0 THEN (number * price) ELSE 0 END), 2)";
+        $this_month_out_m = "ROUND(
+                                  SUM(
+                                      CASE 
+                                            WHEN crt_time >= $startStamp and number < 0 THEN (number * price)
+                                            WHEN crt_time >= $startStamp and number = 0 and price < 0 and order_type = ' . $order_type . ' THEN price
+                                            ELSE 0 
+                                      END
+                                 ), 
+                            2)";
+        //上月结存
+//        $last_month_stock_m = "ROUND(SUM(CASE WHEN crt_time < $startStamp THEN (number * price) ELSE 0 END), 2)";
+//        //本月入库
+//        $this_month_in_m = "ROUND(SUM(CASE WHEN crt_time >= $startStamp AND number > 0 THEN (number * price) ELSE 0 END), 2)";
+//        //本月出库
+//        $this_month_out_m = "ROUND(SUM(CASE WHEN crt_time >= $startStamp AND number < 0 THEN (number * price) ELSE 0 END), 2)";
         //-------- 结存金额汇总 ---------- //
 
         if(empty($field)){
@@ -1605,9 +1637,9 @@ class StatisticsService extends Service
             $data['data'][$key]['this_out_price'] = $this_out_price;
 
             //本月结存
-            //本月结存 数量/金额=本月入库+上月结存-本月出库
-            $this_jc_money = bcsub(bcadd($value['this_in_money'],$value['last_jc_money'],2),$value['this_out_money']);
-            $this_jc_number = bcsub(bcadd($value['this_in_number'],$value['last_jc_number'],2),$value['this_out_number']);
+            //本月结存 数量/金额=本月入库+上月结存+(-本月出库)
+            $this_jc_money = bcsub(bcadd($value['this_in_money'],$value['last_jc_money'],2),$value['this_out_money'],2);
+            $this_jc_number = bcadd(bcadd($value['this_in_number'],$value['last_jc_number'],2),$value['this_out_number'],2);
             $this_jc_price = floatval($this_jc_number) ? bcdiv($this_jc_money,$this_jc_number,2) : 0;//本月结存单价
             $data['data'][$key]['this_jc_money'] = $this_jc_money;
             $data['data'][$key]['this_jc_number'] = $this_jc_number;

+ 3 - 0
config/morequery.php

@@ -2,6 +2,9 @@
 
 return [
     "menu" => [
+        "api/productAdjustmentAdd" => 58,
+        "api/productAdjustmentEdit" => 58,
+        "api/productAdjustmentList" => 58,
         "api/inventoryAdd" => 56,
         "api/inventoryEdit" => 56,
         "api/inventoryList" => 56,

+ 7 - 0
routes/api.php

@@ -284,6 +284,13 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('inventoryAdd', 'Api\InventoryController@inventoryAdd');
     $route->any('inventoryDel', 'Api\InventoryController@inventoryDel');
 
+    //产品金额调整单
+    $route->any('productAdjustmentList', 'Api\ProductAdjustmentController@productAdjustmentList');
+    $route->any('productAdjustmentEdit', 'Api\ProductAdjustmentController@productAdjustmentEdit');
+    $route->any('productAdjustmentDetail', 'Api\ProductAdjustmentController@productAdjustmentDetail');
+    $route->any('productAdjustmentAdd', 'Api\ProductAdjustmentController@productAdjustmentAdd');
+    $route->any('productAdjustmentDel', 'Api\ProductAdjustmentController@productAdjustmentDel');
+
     //排班设置
     $route->any('scheduleList', 'Api\ScheduleController@getList');
     $route->any('scheduleEdit', 'Api\ScheduleController@edit');