multi-store/app/admin/logic/warehouse_product/WarehouseProductLogic.php
mkm 1caae07bb9 feat(warehouse): 优化仓库产品编辑功能和变更日志
- 修改 WarehouseProductController 中的 edit 方法,增加 adminId 参数
- 更新 WarehouseProductLogic 中的 edit 方法,接收 adminId 参数
- 在 ChangeLogLists 中添加 admin_name 字段,关联管理员名称
- 调整 WarehouseProductLogic 中的 dec
2025-01-06 14:15:12 +08:00

372 lines
16 KiB
PHP

<?php
namespace app\admin\logic\warehouse_product;
use app\admin\logic\store_branch_product\StoreBranchProductLogic;
use app\admin\logic\store_product\StoreProductLogic;
use app\common\model\warehouse_product\WarehouseProduct;
use app\common\logic\BaseLogic;
use app\common\model\purchase_product_offer\PurchaseProductOffer;
use app\common\model\store_branch_product\StoreBranchProduct;
use app\common\model\store_product\StoreProduct;
use app\common\model\system_store_storage\SystemStoreStorage;
use app\common\model\warehouse_order\WarehouseOrder;
use app\common\model\warehouse_product_storege\WarehouseProductStorege;
use support\Log;
use think\facade\Db;
use support\exception\BusinessException;
/**
* 商品仓储信息逻辑
* Class WarehouseProductLogic
* @package app\admin\logic\warehouse_product
*/
class WarehouseProductLogic extends BaseLogic
{
/**
* @notes 添加商品仓储信息
* @param array $params
* @return bool
* @author admin
* @date 2024/07/31 16:55
*/
public static function add(array $params, $type = 1,$admin_id=0)
{
// Db::startTrans();
try {
$after_nums = 0;
if ($params['order_type'] != 6) {
$storege = WarehouseProductStorege::where('warehouse_id', $params['warehouse_id'])->where('product_id', $params['product_id'])->find();
if ($storege) {
$after_nums = $storege['nums'] + $params['nums'];
if ($type == 1) {
$storeProduct = StoreProduct::where('id', $params['product_id'])->findOrEmpty();
if (!$storeProduct) {
throw new BusinessException('商品不存在');
}
if ($storeProduct['purchase'] <= 0) {
$total_price = 0;
} else {
$total_price = bcmul($after_nums, $storeProduct['purchase'], 2);
}
WarehouseProductStorege::update(['nums' => $after_nums, 'total_price' => $total_price], ['id' => $storege['id']]);
SqlChannelLog('WarehouseProductStorege', $storege['id'], $after_nums, 1, Request()->url(),$admin_id);
}
} else {
$after_nums = $params['nums'];
$storeProduct = StoreProduct::where('id', $params['product_id'])->findOrEmpty();
if (!$storeProduct) {
throw new BusinessException('商品不存在');
}
if ($storeProduct['purchase'] <= 0) {
$total_price = 0;
} else {
$total_price = bcmul($after_nums, $storeProduct['purchase'], 2);
}
$data = [
'warehouse_id' => $params['warehouse_id'],
'product_id' => $params['product_id'],
'nums' => $params['nums'],
'total_price' => $total_price
];
if ($params['financial_pm'] == 0) {
$data['nums'] = -$params['nums'];
}
$storege = WarehouseProductStorege::create($data);
SqlChannelLog('WarehouseProductStorege', $storege['id'], -$params['nums'], 1, Request()->url(),$admin_id);
}
}
$batch_count = WarehouseProduct::where(['product_id' => $params['product_id'], 'warehouse_id' => $params['warehouse_id'], 'financial_pm' => $params['financial_pm'], 'store_id' => $params['store_id']])->count();
$data = [
'warehouse_id' => $params['warehouse_id'],
'supplier_id' => $params['supplier_id'] ?? 0,
'oid' => $params['oid'] ?? 0,
'store_id' => $params['store_id'] ?? 0,
'product_id' => $params['product_id'],
'financial_pm' => $params['financial_pm'],
'batch' => $batch_count + 1,
'nums' => $params['nums'],
'before_nums' => 0,
'after_nums' => 0,
'price' => $params['price'] ?? '',
'purchase' => $params['purchase'] ?? '',
// 'cost' => $params['cost'] ?? '',
'total_price' => $params['total_price'] ?? '',
'admin_id' => $params['admin_id'],
'code' => $params['code'] ?? '',
'status' => 1,
'pay_type' => $params['pay_type'] ?? 0,
'mark' => $params['mark'] ?? '',
];
if (isset($params['manufacture']) && $params['manufacture'] != '') {
$data['manufacture'] = strtotime($params['manufacture']);
}
if (isset($params['expiration_date']) && $params['expiration_date'] != '') {
$data['expiration_date'] = strtotime($params['expiration_date']);
}
$res = WarehouseProduct::create($data);
SqlChannelLog('WarehouseProduct', $res['id'], $params['nums'], $params['financial_pm'] == 1 ? 1 : -1, Request()->url(),$admin_id);
return $res;
} catch (\Throwable $e) {
throw new BusinessException($e->getMessage());
}
}
/**
* 设置出库商品
*/
public static function setOutbound(array $params, $type = 1,$admin_id=0)
{
Db::startTrans();
try {
$after_nums = 0;
if ($params['order_type'] != 6) {
$storege = WarehouseProductStorege::where('warehouse_id', $params['warehouse_id'])->where('product_id', $params['product_id'])->find();
if ($storege) {
if (in_array($params['order_type'], [1, 4])) {
SystemStoreStorage::create([
'store_id' => $params['store_id'],
'admin_id' => $params['admin_id'],
'order_type' => $params['order_type'],
'staff_id' => 0,
'type' => 1,
'product_id' => $params['product_id'],
'nums' => $params['nums'],
'status' => 0
]);
}
$after_nums = bcsub($storege['nums'], $params['nums']);
$total_price = bcmul($after_nums, $params['purchase'], 2);
WarehouseProductStorege::update(['nums' => bcsub($storege['nums'], $params['nums']), 'total_price' => $total_price], ['id' => $storege['id']]);
SqlChannelLog('WarehouseProductStorege', $storege['id'], bcsub($storege['nums'], $params['nums']), -1, Request()->url(),$admin_id);
} else {
$data = [
'warehouse_id' => $params['warehouse_id'],
'product_id' => $params['product_id'],
'nums' => -$params['nums'],
'total_price' => 0
];
$storege = WarehouseProductStorege::create($data);
SqlChannelLog('WarehouseProductStorege', $storege->id, -$params['nums'], -1, Request()->url(),$admin_id);
}
} else {
$storege['nums'] = 0;
}
$batch_count = WarehouseProduct::where(['product_id' => $params['product_id'], 'warehouse_id' => $params['warehouse_id'], 'financial_pm' => $params['financial_pm'], 'store_id' => $params['store_id']])->count();
$data = [
'warehouse_id' => $params['warehouse_id'],
'supplier_id' => $params['supplier_id'] ?? 0,
'oid' => $params['oid'] ?? 0,
'store_id' => $params['store_id'] ?? 0,
'product_id' => $params['product_id'],
'financial_pm' => $params['financial_pm'],
'batch' => $batch_count + 1,
'nums' => $params['nums'],
'before_nums' => $storege['nums'],
'after_nums' => $after_nums,
'price' => $params['price'] ?? 0,
'purchase' => $params['purchase'] ?? 0,
'vip_price' => $params['vip_price'] ?? 0,
'total_price' => $params['total_price'] ?? 0,
'admin_id' => $params['admin_id'],
'code' => $params['code'] ?? '',
'unit' => $params['unit'] ?? 0,
'status' => 1,
'mark' => $params['mark'] ?? '',
];
$res = WarehouseProduct::create($data);
SqlChannelLog('WarehouseProduct', $res->id, $params['nums'], $params['financial_pm'] == 1 ? 1 : -1, Request()->url(),$admin_id);
Db::commit();
return $res;
} catch (\Throwable $e) {
Db::rollback();
throw new BusinessException($e->getMessage());
}
}
/**
* @notes 编辑商品仓储信息
* @param array $params
* @return bool
* @author admin
* @date 2024/07/31 16:55
*/
public static function edit(array $params,$admin_id=0)
{
Db::startTrans();
try {
$find = WarehouseOrder::where('id', $params['oid'])->find();
if ($find) {
$res = WarehouseProduct::where('id', $params['id'])->withTrashed()->find();
self::decStock($res,$admin_id);
self::incStock($res, $params,$admin_id);
$datas = [
'nums' => $params['nums'],
'total_price' => $params['total_price'],
];
if ($find['financial_pm'] == 1) {
$datas['supplier_id'] = $params['supplier_id'];
$datas['pay_type'] = $params['pay_type'];
$datas['purchase'] = $params['purchase'];
} else {
$datas['price'] = $params['price'];
}
if (isset($params['manufacture']) && $params['manufacture'] != '') {
$datas['manufacture'] = strtotime($params['manufacture']);
}
if (isset($params['expiration_date']) && $params['expiration_date'] != '') {
$datas['expiration_date'] = strtotime($params['expiration_date']);
}
$res->save($datas);
$finds = WarehouseProduct::where('oid', $params['oid'])->field('sum(nums) as nums,sum(total_price) as total_price')->find();
if ($finds) {
WarehouseOrder::where('id', $params['oid'])->update([
'nums' => $finds['nums'],
'total_price' => $finds['total_price']
]);
}
}
Db::commit();
return $res;
} catch (\Exception $e) {
Db::rollback();
throw new BusinessException($e->getMessage());
}
}
/**
* @notes 删除商品仓储信息
* @param array $params
* @return bool
* @author admin
* @date 2024/07/31 16:55
*/
public static function delete(array $params,$admin_id=0): bool
{
$res = WarehouseProduct::where('id', $params['id'])->find();
if ($res) {
$res->delete();
if ($res['financial_pm'] == 1) {
$find = WarehouseProductStorege::where('warehouse_id', $res['warehouse_id'])->where('product_id', $res['product_id'])->dec('nums', $res['nums'])->save();
SqlChannelLog('WarehouseProductStorege', $find['id'], $res['nums'], -1, Request()->url(),$admin_id);
} elseif ($res['financial_pm'] == 0) {
$find = WarehouseProductStorege::where('warehouse_id', $res['warehouse_id'])->where('product_id', $res['product_id'])->inc('nums', $res['nums'])->save();
SqlChannelLog('WarehouseProductStorege', $find['id'], $res['nums'], 1, Request()->url(),$admin_id);
}
$find = WarehouseProduct::where('oid', $res['oid'])->field('sum(nums) as nums,sum(total_price) as total_price')->find();
if ($find) {
WarehouseOrder::where('id', $res['oid'])->update([
'nums' => $find['nums'],
'total_price' => $find['total_price']
]);
}
return true;
}
throw new BusinessException('没有查到出入库信息');
}
/**
* * @notes 结算
* @param $id
* @return void
*/
public static function settlement($id)
{
Db::startTrans();
try {
$find = WarehouseProduct::where(['id' => $id, 'financial_pm' => 1, 'is_pay' => 0])->find();
if ($find) {
$find->is_pay = 1;
$find->save();
} else {
throw new BusinessException('没有查到出入库信息');
}
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
throw new BusinessException($th->getMessage());
}
}
/**
* * @notes 仓库重置出入库数量
* @param $id
* @return void
*/
public static function settNums($params,$admin_id=0)
{
Db::startTrans();
try {
$res = WarehouseProduct::where('id', $params['id'])->find();
if ($res) {
self::decStock($res,$admin_id);
self::incStock($res, $params,$admin_id);
$datas = [
'nums' => $params['nums'],
'total_price' => bcmul($params['nums'], $res['price'], 2),
];
$res->save($datas);
$finds = WarehouseProduct::where('oid', $res['oid'])->field('sum(nums) as nums')->find();
if ($finds) {
WarehouseOrder::where('id', $res['oid'])->update([
'nums' => $finds['nums'],
]);
}
}
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
throw new BusinessException($th->getMessage());
}
}
/**
* @notes 获取商品仓储信息详情
* @param $params
* @return array
* @author admin
* @date 2024/07/31 16:55
*/
public static function detail($params): array
{
$data = WarehouseProduct::findOrEmpty($params['id'])->toArray();
if ($data) {
$data['manufacture'] = date('Y-m-d', $data['manufacture']);
$data['expiration_date'] = date('Y-m-d', $data['expiration_date']);
}
return $data;
}
//减少
private static function decStock($res,$admin_id=0)
{
$res1 = WarehouseProductStorege::where('warehouse_id', $res['warehouse_id'])
->where('product_id', $res['product_id'])->find();
$res1->save(['nums'=>bcsub($res1['nums'], $res['nums'],2)]);
SqlChannelLog('WarehouseProductStorege', $res1['id'], $res['nums'], -1, Request()->url(),$admin_id);
$res->save(['nums'=>bcsub($res['nums'], $res['nums'],2)]);
SqlChannelLog('WarehouseProduct', $res['id'], $res['nums'], -1, Request()->url(),$admin_id);
}
//增加
private static function incStock($res, $params,$admin_id=0)
{
$res1 = WarehouseProductStorege::where('warehouse_id', $res['warehouse_id'])
->where('product_id', $res['product_id'])
->find();
$res1->save(['nums'=>bcadd($res1['nums'], $params['nums'],2)]);
SqlChannelLog('WarehouseProductStorege', $res1['id'], $res['nums'], 1, Request()->url(),$admin_id);
$res->save(['nums'=>bcadd($res['nums'], $params['nums'],2)]);
SqlChannelLog('WarehouseProduct', $res['id'], $res['nums'], 1, Request()->url(),$admin_id);
}
}