From 0ad56182cfa9b4ea9e622eaa7632a6a88ba91ca3 Mon Sep 17 00:00:00 2001 From: lewis <604446095@qq.com> Date: Thu, 13 Mar 2025 17:49:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=95=86=E5=93=81=E5=87=BA?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E6=BA=AF=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProductSourceLinkInfoController.php | 5 - .../ProductSourceLinkInfoLists.php | 2 +- .../ProductSourceLinkLogic.php | 71 +++++++++++++ .../ProductSourceLinkInfoLogic.php | 82 +++++++++++++- .../StoreBranchProductLogic.php | 9 ++ .../WarehouseProductLogic.php | 100 ++++++------------ .../ProductSourceLinkInfo.php | 12 ++- 7 files changed, 198 insertions(+), 83 deletions(-) diff --git a/app/admin/controller/product_source_link_info/ProductSourceLinkInfoController.php b/app/admin/controller/product_source_link_info/ProductSourceLinkInfoController.php index 8dec396ef..af8046e26 100644 --- a/app/admin/controller/product_source_link_info/ProductSourceLinkInfoController.php +++ b/app/admin/controller/product_source_link_info/ProductSourceLinkInfoController.php @@ -20,7 +20,6 @@ class ProductSourceLinkInfoController extends BaseAdminController /** * @notes 获取商品溯源详细列表 - * @return \think\response\Json * @author admin * @date 2025/03/12 10:08 */ @@ -32,7 +31,6 @@ class ProductSourceLinkInfoController extends BaseAdminController /** * @notes 添加商品溯源详细 - * @return \think\response\Json * @author admin * @date 2025/03/12 10:08 */ @@ -49,7 +47,6 @@ class ProductSourceLinkInfoController extends BaseAdminController /** * @notes 编辑商品溯源详细 - * @return \think\response\Json * @author admin * @date 2025/03/12 10:08 */ @@ -66,7 +63,6 @@ class ProductSourceLinkInfoController extends BaseAdminController /** * @notes 删除商品溯源详细 - * @return \think\response\Json * @author admin * @date 2025/03/12 10:08 */ @@ -80,7 +76,6 @@ class ProductSourceLinkInfoController extends BaseAdminController /** * @notes 获取商品溯源详细详情 - * @return \think\response\Json * @author admin * @date 2025/03/12 10:08 */ diff --git a/app/admin/lists/product_source_link_info/ProductSourceLinkInfoLists.php b/app/admin/lists/product_source_link_info/ProductSourceLinkInfoLists.php index 1b3a87d7a..80061173a 100644 --- a/app/admin/lists/product_source_link_info/ProductSourceLinkInfoLists.php +++ b/app/admin/lists/product_source_link_info/ProductSourceLinkInfoLists.php @@ -26,7 +26,7 @@ class ProductSourceLinkInfoLists extends BaseAdminDataLists implements ListsSear public function setSearch(): array { return [ - + '=' => ['oid'] ]; } diff --git a/app/admin/logic/product_source_link/ProductSourceLinkLogic.php b/app/admin/logic/product_source_link/ProductSourceLinkLogic.php index 0fcbf2417..4bc708fba 100644 --- a/app/admin/logic/product_source_link/ProductSourceLinkLogic.php +++ b/app/admin/logic/product_source_link/ProductSourceLinkLogic.php @@ -42,6 +42,7 @@ class ProductSourceLinkLogic extends BaseLogic 'oid' => $model['id'], 'product_id' => $offer['product_id'], 'nums' => $offer['buyer_nums'], + 'current_nums' => $offer['buyer_nums'], 'types' => $info['types'], 'link_id' => $info['link_id'], 'price' => $offer['price'], @@ -102,4 +103,74 @@ class ProductSourceLinkLogic extends BaseLogic { return ProductSourceLink::findOrEmpty($params['id'])->toArray(); } + + /** + * 出库 + * @param array $info + * @return true + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public static function outbound(array $info) + { + $productSourceLinkInfo = ProductSourceLink::alias('t1') + ->field('t2.id,t2.product_id,oid,price,current_nums') + ->join('product_source_link_info t2', 't1.id = t2.oid') + ->where('t1.product_id', $info['product']['product_id']) + ->where('types', ProductSourceLinkInfo::TypeIn) + ->where('current_nums', '>', 0) + ->select()->toArray(); + $update = []; + $insert = []; + $needNum = $info['product']['nums']; + foreach ($productSourceLinkInfo as $item) { + $currentNum = max(bcsub($item['current_nums'], $needNum, 2), 0); + if ($needNum - $item['current_nums'] <= 0) { + [$update, $insert] = self::getInsertAndUpdate($update, $insert, $currentNum, $item, $info, $needNum); + break; + } else { + [$update, $insert] = self::getInsertAndUpdate($update, $insert, 0, $item, $info, $item['current_nums']); + } + $needNum = $needNum - $item['current_nums']; + } + (new ProductSourceLinkInfo())->saveAll($update); + (new ProductSourceLinkInfo())->insertAll($insert); + return true; + } + + public static function getInsertAndUpdate($update, $insert, $currentNum, $item, $info, $needNum) + { + $time = time(); + $update[] = [ + 'id' => $item['id'], + 'current_nums' => $currentNum, + 'update_time' => $time, + ]; + $exist = ProductSourceLinkInfo::field('id,from_id,nums')->where('link_id', $info['link_id'])->where('types', ProductSourceLinkInfo::TypeOut)->findOrEmpty()->toArray(); + if (!empty($exist) && $exist['from_id'] == $item['id']) { + $itemNums = bcadd($exist['nums'], $needNum, 2); + $update[] = [ + 'id' => $exist['id'], + 'nums' => $itemNums, + 'total_price' => bcmul($item['price'], $itemNums, 2), + 'update_time' => $time, + ]; + } else { + $insert[] = [ + 'product_id' => $item['product_id'], + 'oid' => $item['oid'], + 'types' => ProductSourceLinkInfo::TypeOut, + 'link_id' => $info['link_id'], + 'from_id' => $item['id'], + 'nums' => $needNum, + 'price' => $item['price'], + 'total_price' => bcmul($item['price'], $needNum, 2), + 'create_time' => $time, + 'update_time' => $time, + ]; + } + return [$update, $insert]; + } + } \ No newline at end of file diff --git a/app/admin/logic/product_source_link_info/ProductSourceLinkInfoLogic.php b/app/admin/logic/product_source_link_info/ProductSourceLinkInfoLogic.php index 140700ed0..6bd7f9ed7 100644 --- a/app/admin/logic/product_source_link_info/ProductSourceLinkInfoLogic.php +++ b/app/admin/logic/product_source_link_info/ProductSourceLinkInfoLogic.php @@ -3,6 +3,8 @@ namespace app\admin\logic\product_source_link_info; +use app\admin\logic\product_source_link\ProductSourceLinkLogic; +use app\common\model\product_source_link\ProductSourceLink; use app\common\model\product_source_link_info\ProductSourceLinkInfo; use app\common\logic\BaseLogic; use support\exception\BusinessException; @@ -89,15 +91,87 @@ class ProductSourceLinkInfoLogic extends BaseLogic public static function updateByLinkId($linkId, $types, array $params) { - ProductSourceLinkInfo::where('link_id', $linkId)->where('types', $types)->update($params); + $data = ProductSourceLinkInfo::where('link_id', $linkId)->where('types', $types)->findOrEmpty()->toArray(); + if ($types == ProductSourceLinkInfo::TypeIn && isset($params['add_nums'])) { + $params['current_nums'] = bcadd($data['current_nums'], $params['add_nums'], 2); + unset($params['add_nums']); + $params['total_price'] = bcmul($params['nums'], $data['price'], 2); + ProductSourceLinkInfo::where('id', $data['id'])->update($params); + } elseif ($types == ProductSourceLinkInfo::TypeOut && isset($params['add_nums'])) { + if ($params['add_nums'] < 0) { + $otherData = ProductSourceLinkInfo::where('id', '<>', $data['id'])->where('link_id', $linkId)->where('types', $types)->order('id desc')->select()->toArray(); + if (!empty($otherData)) { + $rollbackNum = abs($params['add_nums']); + $update = []; + foreach ($otherData as $item) { + if ($item['nums'] > $rollbackNum) { + $update = self::setUpdate($item, $rollbackNum, $update); + break; + } else { + $update = self::setUpdate($item, $item['nums'], $update); + } + $rollbackNum = bcsub($rollbackNum, $item['nums'], 2); + } + if ($rollbackNum > 0) { + $update = self::setUpdate($data, $rollbackNum, $update); + } + (new ProductSourceLinkInfo())->saveAll($update); + } + } else { + $warehouseId = ProductSourceLink::where('id', $data['oid'])->value('warehouse_id'); + ProductSourceLinkLogic::outbound([ + 'product' => [ + 'product_id' => $data['product_id'], + 'nums' => $params['add_nums'], + ], + 'warehouse_id' => $warehouseId, + 'link_id' => $data['link_id'], + ]); + } + } } public static function deleteByLinkId($linkId, $types) { - $data = ProductSourceLinkInfo::where('link_id', $linkId)->where('types', $types)->find(); - if (!empty($data)) { - $data->delete(); + $list = ProductSourceLinkInfo::where('link_id', $linkId)->where('types', $types)->select()->toArray(); + $update = []; + foreach ($list as $item) { + if ($types == ProductSourceLinkInfo::TypeOut && $item['from_id'] > 0) { + $update[] = [ + 'id' => $item['from_id'], + 'current_nums' => Db::raw("current_nums+{$item['nums']}"), + ]; + } + $update[] = [ + 'id' => $item['id'], + 'delete_time' => time(), + ]; } + (new ProductSourceLinkInfo())->saveAll($update); + } + + /** + * @param array $data + * @param float|int|string $rollbackNum + * @param array $update + * @return array + */ + public static function setUpdate(array $data, float|int|string $rollbackNum, array $update): array + { + $dataNums = bcsub($data['nums'], $rollbackNum, 2); + $update[] = [ + 'id' => $data['id'], + 'nums' => $dataNums, + 'total_price' => bcmul($data['price'], $dataNums, 2), + 'delete_time' => $dataNums > 0 ? null : time(), + ]; + if ($data['from_id'] > 0) { + $update[] = [ + 'id' => $data['from_id'], + 'current_nums' => Db::raw("current_nums+{$rollbackNum}"), + ]; + } + return $update; } } \ No newline at end of file diff --git a/app/admin/logic/store_branch_product/StoreBranchProductLogic.php b/app/admin/logic/store_branch_product/StoreBranchProductLogic.php index 4d2ea5a4a..6d2ae3bb6 100644 --- a/app/admin/logic/store_branch_product/StoreBranchProductLogic.php +++ b/app/admin/logic/store_branch_product/StoreBranchProductLogic.php @@ -2,7 +2,9 @@ namespace app\admin\logic\store_branch_product; +use app\admin\logic\product_source_link\ProductSourceLinkLogic; use app\admin\logic\store_product\StoreProductLogic; +use app\common\model\product_source_link_info\ProductSourceLinkInfo; use app\common\model\store_branch_product\StoreBranchProduct; use app\common\logic\BaseLogic; use app\common\model\store_product\StoreProduct; @@ -141,6 +143,13 @@ class StoreBranchProductLogic extends BaseLogic ], ['product_id' => $productId,'store_id'=>$storeId]); SqlChannelLog('StoreBranchProduct',$branchProduct['id'], $num, -1, Request()->url()); } + ProductSourceLinkLogic::add([ + 'purchase_product_offer' => [$params], + 'types' => ProductSourceLinkInfo::TypeIn, + 'buyer_id' => $params['buyer_id'], + 'warehouse_id' => $params['warehouse_id'], + 'link_id' => $res['id'], + ]); } } diff --git a/app/admin/logic/warehouse_product/WarehouseProductLogic.php b/app/admin/logic/warehouse_product/WarehouseProductLogic.php index 9b30d7251..684a444d8 100644 --- a/app/admin/logic/warehouse_product/WarehouseProductLogic.php +++ b/app/admin/logic/warehouse_product/WarehouseProductLogic.php @@ -197,6 +197,12 @@ class WarehouseProductLogic extends BaseLogic $res = WarehouseProduct::create($data); SqlChannelLog('WarehouseProduct', $res->id, $params['nums'], $params['financial_pm'] == 1 ? 1 : -1, Request()->url(),$admin_id); + ProductSourceLinkLogic::outbound([ + 'product' => $data, + 'warehouse_id' => $params['warehouse_id'], + 'link_id' => $res['id'], + ]); + Db::commit(); return $res; } catch (\Throwable $e) { @@ -219,23 +225,21 @@ class WarehouseProductLogic extends BaseLogic $find = WarehouseOrder::where('id', $params['oid'])->find(); if ($find) { $res = WarehouseProduct::where('id', $params['id'])->withTrashed()->find(); - if($params['nums']>$res['nums']){ - $nums=bcsub($params['nums'], $res['nums'],2); - if ($res['financial_pm'] == 0) { - self::decWarehouseProduct($res, $nums); + $updateNums = bcsub($params['nums'], $res['nums'],2); + if ($updateNums != 0) { + $storageNum = $res['financial_pm'] == 0 ? -$updateNums : $updateNums; + $productNum = $updateNums; + self::updateWarehouseProduct($res, $storageNum, $productNum); + + $ProductSourceLinkInfoParams = ['nums' => $params['nums'], 'total_price' => $params['total_price']]; + if ($find['financial_pm'] == 1) { + $ProductSourceLinkInfoParams['price'] = $params['purchase']; + $ProductSourceLinkInfoParams['add_nums'] = $updateNums; + ProductSourceLinkInfoLogic::updateByLinkId($res['id'], ProductSourceLinkInfo::TypeIn, $ProductSourceLinkInfoParams); } else { - self::incWarehouseProduct($res, $nums); - } - }else{ - if($params['nums']==0){ - self::decWarehouseProduct($res, $res['nums']); - }else{ - $nums = bcsub($res['nums'], $params['nums'], 2); - if ($res['financial_pm'] == 0) { - self::incWarehouseProduct($res, $nums); - } else { - self::decWarehouseProduct($res, $nums); - } + $ProductSourceLinkInfoParams['origin_nums'] = $res['nums']; + $ProductSourceLinkInfoParams['add_nums'] = bcsub($params['nums'], $res['nums'],2); + ProductSourceLinkInfoLogic::updateByLinkId($res['id'], ProductSourceLinkInfo::TypeOut, $ProductSourceLinkInfoParams); } } $datas = [ @@ -255,14 +259,6 @@ class WarehouseProductLogic extends BaseLogic $datas['expiration_date'] = strtotime($params['expiration_date']); } $res->save($datas); - $ProductSourceLinkInfoParams = ['nums' => $params['nums'], 'total_price' => $params['total_price']]; - if ($find['financial_pm'] == 1) { - $ProductSourceLinkInfoParams['price'] = $params['purchase']; - ProductSourceLinkInfoLogic::updateByLinkId($res['id'], ProductSourceLinkInfo::TypeIn, $ProductSourceLinkInfoParams); - } else { - $ProductSourceLinkInfoParams['price'] = $params['price']; - ProductSourceLinkInfoLogic::updateByLinkId($res['id'], ProductSourceLinkInfo::TypeOut, $ProductSourceLinkInfoParams); - } } Db::commit(); return $res; @@ -285,11 +281,9 @@ class WarehouseProductLogic extends BaseLogic if ($res) { Db::startTrans(); try { - if ($res['financial_pm'] == 1) { - self::decProductIncStorege($res, $res['nums'], $admin_id); - } elseif ($res['financial_pm'] == 0) { - self::incProductDecStorege($res, $res['nums'], $admin_id); - } + $storageNum = $res['financial_pm'] == 1 ? -$res['nums'] : $res['nums']; + $productNum = -$res['nums']; + self::updateWarehouseProduct($res, $storageNum, $productNum); $res->delete(); $types = $res['financial_pm'] == 1 ? ProductSourceLinkInfo::TypeIn : ProductSourceLinkInfo::TypeOut; ProductSourceLinkInfoLogic::deleteByLinkId($res['id'], $types); @@ -471,20 +465,20 @@ class WarehouseProductLogic extends BaseLogic * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ - public static function incWarehouseProduct($warehouseProduct, $nums) + public static function updateWarehouseProduct($warehouseProduct, $storageNum, $productNum) { $warehouseProductStorage = WarehouseProductStorege::where('warehouse_id', $warehouseProduct['warehouse_id']) ->where('product_id', $warehouseProduct['product_id'])->find(); - $warehouseProductStorage->nums = bcadd($warehouseProductStorage->nums, $nums, 2); + $warehouseProductStorage->nums = bcadd($warehouseProductStorage->nums, $storageNum, 2); $warehouseProductStorage->save(); - SqlChannelLog('WarehouseProductStorege', $warehouseProductStorage['id'], $nums, 1, Request()->url()); + SqlChannelLog('WarehouseProductStorege', $warehouseProductStorage['id'], $storageNum, $storageNum > 0 ? 1 : -1, Request()->url()); $update = [ - 'nums' => bcadd($warehouseProduct['nums'], $nums, 2), - 'total_price' => bcadd($warehouseProduct['total_price'], bcmul($nums, $warehouseProduct['price'], 2), 2), + 'nums' => bcadd($warehouseProduct['nums'], $productNum, 2), + 'total_price' => bcadd($warehouseProduct['total_price'], bcmul($productNum, $warehouseProduct['price'], 2), 2), ]; WarehouseProduct::where('id',$warehouseProduct['id'])->update($update); - SqlChannelLog('WarehouseProduct', $warehouseProduct['id'], $nums, 1, Request()->url()); + SqlChannelLog('WarehouseProduct', $warehouseProduct['id'], $productNum, $productNum > 0 ? 1 : -1, Request()->url()); $find = WarehouseProduct::where('oid', $warehouseProduct['oid'])->field('sum(nums) as nums,sum(total_price) as total_price')->find(); if ($find) { @@ -493,41 +487,7 @@ class WarehouseProductLogic extends BaseLogic 'total_price' => $find['total_price'] ]); } - self::updateStoreStorage2($warehouseProduct, $nums); - } - - /** - * 减少商品入库数量 - * @param $warehouseProduct - * @param $nums - * @return void - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public static function decWarehouseProduct($warehouseProduct, $nums) - { - $warehouseProductStorage = WarehouseProductStorege::where('warehouse_id', $warehouseProduct['warehouse_id']) - ->where('product_id', $warehouseProduct['product_id'])->find(); - $warehouseProductStorage->nums = bcsub($warehouseProductStorage->nums, $nums, 2); - $warehouseProductStorage->save(); - SqlChannelLog('WarehouseProductStorege', $warehouseProductStorage['id'], $nums, -1, Request()->url()); - - $update = [ - 'nums' => bcsub($warehouseProduct['nums'], $nums, 2), - 'total_price' => bcsub($warehouseProduct['total_price'], bcmul($nums, $warehouseProduct['price'], 2), 2), - ]; - WarehouseProduct::where('id',$warehouseProduct['id'])->update($update); - SqlChannelLog('WarehouseProduct', $warehouseProduct['id'], $nums, -1, Request()->url()); - - $find = WarehouseProduct::where('oid', $warehouseProduct['oid'])->field('sum(nums) as nums,sum(total_price) as total_price')->find(); - if ($find) { - WarehouseOrder::where('id', $warehouseProduct['oid'])->update([ - 'nums' => $find['nums'], - 'total_price' => $find['total_price'] - ]); - } - self::updateStoreStorage2($warehouseProduct, $nums); + self::updateStoreStorage2($warehouseProduct, $productNum); } /** diff --git a/app/common/model/product_source_link_info/ProductSourceLinkInfo.php b/app/common/model/product_source_link_info/ProductSourceLinkInfo.php index 3cb67daf5..695bace29 100644 --- a/app/common/model/product_source_link_info/ProductSourceLinkInfo.php +++ b/app/common/model/product_source_link_info/ProductSourceLinkInfo.php @@ -23,14 +23,20 @@ class ProductSourceLinkInfo extends BaseModel const TypeOut = 2; const TypeStoreIn = 3; const TypeOrder = 4; + const TypeOrderRefund = 5; + const TypeTransferToWarehouse = 6; + const TypeTransferToStore = 7; public function getTypeName() { $typeMap = [ - self::TypeIn => '入库', - self::TypeOut => '出库', + self::TypeIn => '仓库入库', + self::TypeOut => '仓库出库', self::TypeStoreIn => '门店入库', - self::TypeOrder => '订单', + self::TypeOrder => '订单出库', + self::TypeOrderRefund => '订单退货入库', + self::TypeTransferToWarehouse => '门店调拨至仓库', + self::TypeTransferToStore => '门店调拨至门店', ]; return $typeMap[$this->getAttr('types')]; }