初始上传
This commit is contained in:
248
app/model/stock/GoodsStock.php
Executable file
248
app/model/stock/GoodsStock.php
Executable file
@@ -0,0 +1,248 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace app\model\stock;
|
||||
|
||||
|
||||
use addon\stock\model\stock\Stock;
|
||||
use app\dict\goods\GoodsDict;
|
||||
use app\model\BaseModel;
|
||||
use app\model\store\Store;
|
||||
use think\db\exception\DbException;
|
||||
use think\facade\Db;
|
||||
|
||||
/**
|
||||
* 库存model (公共的库存相关改动和查询)
|
||||
*
|
||||
* @author Administrator
|
||||
*
|
||||
*/
|
||||
class GoodsStock extends BaseModel
|
||||
{
|
||||
|
||||
/**
|
||||
* 商品直接设置库存权重最高(只允许商品数据发生变动时调用)
|
||||
* @param $params
|
||||
* @return array|int
|
||||
*/
|
||||
public function changeGoodsStock($params)
|
||||
{
|
||||
$store_id = $params['store_id'] ?? 0;
|
||||
$site_id = $params['site_id'] ?? 1;
|
||||
|
||||
$goods_sku_list = $params['goods_sku_list'] ?? [];
|
||||
|
||||
//没有传递仓库id的话,就选取默认
|
||||
if ($store_id == 0 || !addon_is_exit('store')) {
|
||||
$store_model = new Store();
|
||||
$store_info = $store_model->getDefaultStore($site_id)['data'] ?? [];
|
||||
$store_id = $store_info['store_id'];
|
||||
$params['store_id'] = $store_id;
|
||||
}
|
||||
|
||||
//矫正商品库存
|
||||
$this->correctGoodsStock($params);
|
||||
|
||||
$is_exist = addon_is_exit('stock');
|
||||
if ($is_exist) {
|
||||
$stock_model = new Stock();
|
||||
}
|
||||
|
||||
if (!empty($goods_sku_list)) {
|
||||
$goods_sku_list_1 = [];
|
||||
$goods_sku_list_2 = [];
|
||||
$goods_sku_list_3 = [];
|
||||
foreach ($goods_sku_list as $k => $v) {
|
||||
if ($is_exist && $v['goods_class'] == GoodsDict::real) {
|
||||
$goods_sku_list_1[] = $v;
|
||||
} else {
|
||||
if (in_array($v['goods_class'], [GoodsDict::real, GoodsDict::virtual, GoodsDict::virtualcard, GoodsDict::service, GoodsDict::card])) {
|
||||
$goods_sku_list_2[] = $v;
|
||||
} elseif ($v['goods_class'] == GoodsDict::weigh) {
|
||||
$goods_sku_list_3[] = $v;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!empty($goods_sku_list_1)) {
|
||||
$params['goods_sku_list'] = $goods_sku_list_1;
|
||||
$result = $stock_model->setGoodsStock($params);
|
||||
if ($result['code'] < 0) {
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
if (!empty($goods_sku_list_2)) {
|
||||
$params['goods_sku_list'] = $goods_sku_list_2;
|
||||
$result = $this->setGoodsStock($params);
|
||||
if ($result['code'] < 0) {
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
if (!empty($goods_sku_list_3)) {
|
||||
$params['goods_sku_list'] = $goods_sku_list_3;
|
||||
$result = $this->setGoodsStock($params);
|
||||
if ($result['code'] < 0) {
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$goods_class = $params['goods_class'];
|
||||
//如果存在进销存的话生成入库单据
|
||||
if ($is_exist && $goods_class == GoodsDict::real) {
|
||||
$result = $stock_model->setGoodsStock($params);
|
||||
} else {//没有的话直接生成支付单据
|
||||
$result = $this->setGoodsStock($params);
|
||||
}
|
||||
}
|
||||
|
||||
return $result ?? $this->success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品库存设置(主体永远是sku)
|
||||
* @param $params
|
||||
* @return array
|
||||
* @throws DbException
|
||||
*/
|
||||
public function setGoodsStock($params)
|
||||
{
|
||||
$params['field'] = 'stock';
|
||||
return (new StockData())->setGoodsStock($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* 减少库存(存在已经)
|
||||
* @param $params
|
||||
* @return array
|
||||
* @throws DbException
|
||||
*/
|
||||
public function decGoodsStock($params)
|
||||
{
|
||||
return (new StockData())->decGoodsStock($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加库存
|
||||
* @param $params
|
||||
* @return array
|
||||
*/
|
||||
public function incGoodsStock($params)
|
||||
{
|
||||
return (new StockData())->incGoodsStock($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* 核验可能不存在的sku门店数据,并校正数据(单个商品解决方案)
|
||||
* @param $params
|
||||
* @return array
|
||||
*/
|
||||
public function checkExistGoodsSku($params)
|
||||
{
|
||||
$goods_id = $params['goods_id'];
|
||||
$goods_condition = [
|
||||
['goods_id', '=', $goods_id]
|
||||
];
|
||||
$sku_ids = model('goods_sku')->getColumn($goods_condition, 'sku_id');
|
||||
$store_sku_condition = [
|
||||
['goods_id', '=', $goods_id],
|
||||
['sku_id', 'not in', $sku_ids]
|
||||
];
|
||||
//被废弃的门店sku
|
||||
$store_sku_list = model('store_goods_sku')->getList($store_sku_condition, 'store_id, sum(stock) as stock, sum(real_stock) as real_stock', '', '', [], 'store_id');
|
||||
if (empty($store_sku_list))
|
||||
return $this->success();
|
||||
|
||||
$store_goods_list = model('store_goods')->getColumn([['goods_id', '=', $goods_id]], 'store_id, stock, real_stock', 'store_id');
|
||||
$stock = 0;
|
||||
$real_stock = 0;
|
||||
foreach ($store_sku_list as $k => $v) {
|
||||
$store_id = $v['store_id'];
|
||||
$item_stock = numberFormat($v['stock']);
|
||||
$item_real_stock = numberFormat($v['real_stock']);
|
||||
$item_store_goods_condition = $goods_condition;
|
||||
$item_store_goods_condition[] = ['store_id', '=', $store_id];
|
||||
// $item_store_goods_info = model('store_goods')->getInfo($item_store_goods_condition, 'stock, real_stock');
|
||||
$item_store_goods_info = $store_goods_list[$store_id] ?? [];
|
||||
$new_item_stock = $item_store_goods_info['stock'] - $item_stock;
|
||||
$new_item_real_stock = $item_store_goods_info['real_stock'] - $item_real_stock;
|
||||
|
||||
model('store_goods')->update([
|
||||
'stock' => max($new_item_stock, 0),
|
||||
'real_stock' => max($new_item_real_stock, 0)
|
||||
], $item_store_goods_condition);
|
||||
$stock += $item_stock;
|
||||
$real_stock += $item_real_stock;
|
||||
}
|
||||
//删除已经不存在的商品sku
|
||||
model('store_goods_sku')->delete($store_sku_condition);
|
||||
|
||||
$goods_info = model('goods')->getInfo($goods_condition, 'goods_stock, real_stock');
|
||||
$goods_stock = $goods_info['goods_stock'] - $stock;
|
||||
$goods_real_stock = $goods_info['real_stock'] - $real_stock;
|
||||
model('goods')->update([
|
||||
'goods_stock' => max($goods_stock, 0),
|
||||
'real_stock' => max($goods_real_stock, 0)
|
||||
], $goods_condition);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 矫正商品库存
|
||||
* @param $params
|
||||
* @throws DbException
|
||||
*/
|
||||
public function correctGoodsStock($params)
|
||||
{
|
||||
$store_id = $params['store_id'] ?? 0;
|
||||
$site_id = $params['site_id'] ?? 1;
|
||||
$goods_sku_list = $params['goods_sku_list'] ?? [];
|
||||
|
||||
$store_model = new Store();
|
||||
$store_info = $store_model->getDefaultStore($site_id)['data'] ?? [];
|
||||
$is_default_store = $store_id == $store_info['store_id'];
|
||||
|
||||
$goods_ids = model('goods_sku')->getColumn([['sku_id', 'in', array_column($goods_sku_list, 'sku_id')]], 'goods_id');
|
||||
$goods_ids = array_unique($goods_ids);
|
||||
|
||||
//门店商品库存=门店商品规格库存累加
|
||||
$store_goods_sku_table = Db::name('store_goods_sku')
|
||||
->field('goods_id,sum(stock) as stock_sum,sum(real_stock) as real_stock_sum')
|
||||
->where([['goods_id', 'in', $goods_ids], ['store_id', '=', $store_id]])
|
||||
->group('goods_id')
|
||||
->buildSql();
|
||||
Db::name('store_goods')
|
||||
->alias('sg')
|
||||
->join("{$store_goods_sku_table} as sgs", 'sg.goods_id = sgs.goods_id', 'inner')
|
||||
->where([['sg.goods_id', 'in', $goods_ids], ['store_id', 'in', $store_id]])
|
||||
->update([
|
||||
'sg.stock' => Db::raw('sgs.stock_sum'),
|
||||
'sg.real_stock' => Db::raw('sgs.real_stock_sum'),
|
||||
]);
|
||||
if($is_default_store){
|
||||
//商家规格库存与门店同步
|
||||
Db::name('goods_sku')
|
||||
->alias('gs')
|
||||
->join('store_goods_sku sgs', 'gs.sku_id = sgs.sku_id and sgs.store_id = '.$store_id, 'inner')
|
||||
->where([['gs.goods_id', 'in', $goods_ids]])
|
||||
->update([
|
||||
'gs.stock' => Db::raw('sgs.stock'),
|
||||
'gs.real_stock' => Db::raw('sgs.real_stock'),
|
||||
]);
|
||||
//商家商品库存与门店同步
|
||||
Db::name('goods')
|
||||
->alias('g')
|
||||
->join('store_goods sg', 'g.goods_id = sg.goods_id and sg.store_id = '.$store_id, 'inner')
|
||||
->where([['g.goods_id', 'in', $goods_ids]])
|
||||
->update([
|
||||
'g.goods_stock' => Db::raw('sg.stock'),
|
||||
'g.real_stock' => Db::raw('sg.real_stock'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
48
app/model/stock/SaleStock.php
Executable file
48
app/model/stock/SaleStock.php
Executable file
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace app\model\stock;
|
||||
|
||||
|
||||
use think\db\exception\DbException;
|
||||
|
||||
|
||||
/**
|
||||
* 库存model (公共的库存相关改动和查询)
|
||||
*
|
||||
* @author Administrator
|
||||
*
|
||||
*/
|
||||
class SaleStock extends GoodsStock
|
||||
{
|
||||
|
||||
|
||||
/**
|
||||
* 减少库存(存在已经)
|
||||
* @param $params
|
||||
* @return array
|
||||
* @throws DbException
|
||||
*/
|
||||
public function decGoodsStock($params)
|
||||
{
|
||||
return (new SaleStockData())->dec($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加库存
|
||||
* @param $params
|
||||
* @return array
|
||||
*/
|
||||
public function incGoodsStock($params)
|
||||
{
|
||||
return (new SaleStockData())->inc($params);
|
||||
}
|
||||
|
||||
}
|
||||
79
app/model/stock/SaleStockData.php
Executable file
79
app/model/stock/SaleStockData.php
Executable file
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace app\model\stock;
|
||||
|
||||
|
||||
use app\model\BaseModel;
|
||||
use think\db\exception\DbException;
|
||||
use think\facade\Db;
|
||||
|
||||
/**
|
||||
* 销售库存
|
||||
* @author Administrator
|
||||
*
|
||||
*/
|
||||
class SaleStockData extends BaseModel
|
||||
{
|
||||
use StockTool;
|
||||
|
||||
/**
|
||||
* 减少库存(存在已经)
|
||||
* @param $params
|
||||
* @return array
|
||||
* @throws DbException
|
||||
*/
|
||||
public function dec($params)
|
||||
{
|
||||
//触发库存变动前操作
|
||||
$params['fun'] = __METHOD__;
|
||||
event('GoodsStockChangePre', $params);
|
||||
//门店id
|
||||
$store_id = $this->getDefaultStore($params['store_id'] ?? 0);
|
||||
$params['store_id'] = $store_id;
|
||||
//获取商品列表
|
||||
$goods_sku_list = $this->getFormatSkuList($params);
|
||||
$params['goods_sku_list'] = $goods_sku_list;
|
||||
$params['stock_action_type'] = 'dec';
|
||||
$result_data = $this->getCheckGoodsSkuData($params);
|
||||
$this->setSaleStock(array_merge($params, $result_data));
|
||||
//触发库存变动
|
||||
$params['fun'] = __METHOD__;
|
||||
event('GoodsStockChange', $params);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 返还销售库存
|
||||
* @param $params
|
||||
* @return array
|
||||
* @throws DbException
|
||||
*/
|
||||
public function inc($params)
|
||||
{
|
||||
//触发库存变动前操作
|
||||
$params['fun'] = __METHOD__;
|
||||
event('GoodsStockChangePre', $params);
|
||||
//门店id
|
||||
$store_id = $this->getDefaultStore($params['store_id'] ?? 0);
|
||||
$params['store_id'] = $store_id;
|
||||
//获取商品列表
|
||||
$goods_sku_list = $this->getFormatSkuList($params);
|
||||
$params['goods_sku_list'] = $goods_sku_list;
|
||||
$params['stock_action_type'] = 'inc';
|
||||
$result_data = $this->getCheckGoodsSkuData($params);
|
||||
$this->setSaleStock(array_merge($params, $result_data));
|
||||
//触发库存变动
|
||||
$params['fun'] = __METHOD__;
|
||||
event('GoodsStockChange', $params);
|
||||
return $this->success();
|
||||
}
|
||||
}
|
||||
108
app/model/stock/StockData.php
Executable file
108
app/model/stock/StockData.php
Executable file
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace app\model\stock;
|
||||
|
||||
|
||||
use app\model\BaseModel;
|
||||
use think\db\exception\DbException;
|
||||
|
||||
/**
|
||||
* 库存model (公共的库存相关改动和查询)
|
||||
*
|
||||
* @author Administrator
|
||||
*
|
||||
*/
|
||||
class StockData extends BaseModel
|
||||
{
|
||||
use StockTool;
|
||||
|
||||
|
||||
public function setGoodsStock($params)
|
||||
{
|
||||
//触发库存变动前操作
|
||||
$params['fun'] = __METHOD__;
|
||||
event('GoodsStockChangePre', $params);
|
||||
|
||||
//门店id
|
||||
$store_id = $this->getDefaultStore($params['store_id'] ?? 0);
|
||||
$params['store_id'] = $store_id;
|
||||
//获取商品列表
|
||||
$goods_sku_list = $this->getFormatSkuList($params);
|
||||
|
||||
$params['goods_sku_list'] = $goods_sku_list;
|
||||
$params['stock_action_type'] = 'set';
|
||||
$result_data = $this->getCheckGoodsSkuData($params);
|
||||
$this->setStock(array_merge($params, $result_data));
|
||||
//触发库存变动
|
||||
$params['fun'] = __METHOD__;
|
||||
event('GoodsStockChange', $params);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 减少库存(存在已经)
|
||||
* @param $params
|
||||
* @return array
|
||||
* @throws DbException
|
||||
*/
|
||||
public function decGoodsStock($params)
|
||||
{
|
||||
//触发库存变动前操作
|
||||
$params['fun'] = __METHOD__;
|
||||
event('GoodsStockChangePre', $params);
|
||||
//门店id
|
||||
$store_id = $this->getDefaultStore($params['store_id'] ?? 0);
|
||||
$params['store_id'] = $store_id;
|
||||
$is_out_stock = $params['is_out_stock'] ?? 0;//是否扣除销售库存(销售状态下一般销售库存已经被扣除了)
|
||||
//获取商品列表
|
||||
$goods_sku_list = $this->getFormatSkuList($params);
|
||||
|
||||
$params['goods_sku_list'] = $goods_sku_list;
|
||||
$params['stock_action_type'] = 'dec';
|
||||
$result_data = $this->getCheckGoodsSkuData($params);
|
||||
$this->setStock(array_merge($params, $result_data));
|
||||
|
||||
//触发库存变动
|
||||
$params['fun'] = __METHOD__;
|
||||
event('GoodsStockChange', $params);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 增加库存
|
||||
* @param $params
|
||||
* @return array
|
||||
* @throws DbException
|
||||
*/
|
||||
public function incGoodsStock($params)
|
||||
{
|
||||
//触发库存变动前操作
|
||||
$params['fun'] = __METHOD__;
|
||||
event('GoodsStockChangePre', $params);
|
||||
|
||||
//门店id
|
||||
$store_id = $this->getDefaultStore($params['store_id'] ?? 0);
|
||||
$params['store_id'] = $store_id;
|
||||
//获取商品列表
|
||||
$goods_sku_list = $this->getFormatSkuList($params);
|
||||
|
||||
$params['goods_sku_list'] = $goods_sku_list;
|
||||
$params['stock_action_type'] = 'inc';
|
||||
$result_data = $this->getCheckGoodsSkuData($params);
|
||||
$this->setStock(array_merge($params, $result_data));
|
||||
//触发库存变动
|
||||
$params['fun'] = __METHOD__;
|
||||
event('GoodsStockChange', $params);
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
}
|
||||
483
app/model/stock/StockTool.php
Executable file
483
app/model/stock/StockTool.php
Executable file
@@ -0,0 +1,483 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace app\model\stock;
|
||||
|
||||
use app\model\store\Store;
|
||||
use extend\exception\StockException;
|
||||
use think\facade\Db;
|
||||
use think\facade\Log;
|
||||
|
||||
/**
|
||||
* 库存 可调用的工具类
|
||||
*/
|
||||
trait StockTool
|
||||
{
|
||||
//商品sku
|
||||
public $goods_sku_ids = [];
|
||||
public $goods_list_column = [];
|
||||
|
||||
/**
|
||||
* 将商品数据整理为不存在需添加的数据和存在需编辑的商品
|
||||
* @param $param
|
||||
* @return array
|
||||
*/
|
||||
public function getCheckGoodsSkuData($param)
|
||||
{
|
||||
$store_id = $param['store_id'];
|
||||
$stock_action_type = $param['stock_action_type'] ?? '';//出入库类型
|
||||
$result = $this->getStoreSkuAndCreateIfNotExists($param);
|
||||
$sku_column = $result['sku_column'];
|
||||
$goods_list_column = $result['goods_list_column'];
|
||||
$is_allow_negative = $param['is_allow_negative'] ?? true;
|
||||
$update_sku_data = [];
|
||||
$update_goods_data = [];
|
||||
foreach ($sku_column as $goods_k => $goods_v) {
|
||||
$temp_stock = $goods_v['stock'] ?? $goods_v['num'];
|
||||
//校验整理不存在的门店商品项或sku项
|
||||
$item_temp_v = $goods_list_column[$goods_k] ?? [];
|
||||
$sku_name = str_sub($item_temp_v['sku_name'], 12, true, 'end');
|
||||
//todo 这儿需要考虑
|
||||
if (!$item_temp_v) throw new StockException('存在已删除的商品!');
|
||||
$item_sku_id = $item_temp_v['sku_id'];
|
||||
$item_goods_id = $item_temp_v['goods_id'];
|
||||
$item_stock = $item_temp_v['stock'] ?? 0;
|
||||
$item_real_stock = $item_temp_v['real_stock'] ?? 0;
|
||||
//出库才需要校验库存
|
||||
if ($stock_action_type == 'dec') {
|
||||
$o_stock = $temp_stock;
|
||||
$temp_stock = -abs($temp_stock);
|
||||
if (!$is_allow_negative) {
|
||||
if ($item_real_stock < $o_stock) throw new StockException('商品“' . $sku_name . '”库存不足!');
|
||||
if ($item_stock < $o_stock) throw new StockException('商品“' . $sku_name . '“库存不足!');
|
||||
}
|
||||
} else if ($stock_action_type == 'inc') {
|
||||
$temp_stock = abs($temp_stock);
|
||||
} else if ($stock_action_type == 'set') {
|
||||
if (!$is_allow_negative) {
|
||||
if ($temp_stock < 0) throw new StockException('库存不足!');
|
||||
}
|
||||
if(!empty($param['field']) == 'stock'){
|
||||
$temp_stock = $temp_stock - $item_stock;
|
||||
}else{
|
||||
$temp_stock = $temp_stock - $item_real_stock;
|
||||
}
|
||||
|
||||
}
|
||||
if ($temp_stock != 0) {
|
||||
//数组的键值如果是小数会自动转化为整数,需要强制转化为字符串
|
||||
$update_sku_data[(string)$temp_stock][] = [
|
||||
'sku_id' => $item_sku_id,
|
||||
'goods_id' => $item_goods_id,
|
||||
'store_id' => $store_id,
|
||||
];
|
||||
if (!isset($update_goods_data[$item_goods_id])) {
|
||||
$update_goods_data[$item_goods_id] = [
|
||||
'goods_id' => $item_goods_id,
|
||||
'store_id' => $store_id,
|
||||
'stock' => 0
|
||||
];
|
||||
}
|
||||
$update_goods_data[$item_goods_id]['stock'] += $temp_stock;
|
||||
}
|
||||
}
|
||||
|
||||
if ($update_goods_data) {
|
||||
$temp_update_data = [];
|
||||
foreach ($update_goods_data as $v) {
|
||||
//数组的键值如果是小数会自动转化为整数,需要强制转化为字符串
|
||||
$temp_update_data[(string)$v['stock']][] = [
|
||||
'goods_id' => $v['goods_id'],
|
||||
'store_id' => $store_id,
|
||||
];
|
||||
}
|
||||
}
|
||||
//返回需要添加或编辑的数据
|
||||
return [
|
||||
'update_sku_data' => $update_sku_data,
|
||||
'update_goods_data' => $temp_update_data ?? []
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建门店商品(不存在创建)
|
||||
* @param $param
|
||||
* @return array
|
||||
*/
|
||||
public function getStoreSkuAndCreateIfNotExists($param)
|
||||
{
|
||||
$goods_sku_list = $param['goods_sku_list'] ?? [];//[['sku_id' => 1]]
|
||||
$store_id = $param['store_id'];
|
||||
$sku_column = array_column($goods_sku_list, null, 'sku_id');
|
||||
$sku_ids = array_keys($sku_column);
|
||||
$condition = [];
|
||||
if ($goods_sku_list) {
|
||||
$condition[] = ['gs.sku_id', 'in', $sku_ids];
|
||||
}
|
||||
$goods_list = model('goods_sku')->getList(
|
||||
$condition,
|
||||
'gs.goods_id,gs.sku_name,gs.sku_id, gs.stock as sku_stock, gs.real_stock as sku_real_stock,gs.price as sku_price,
|
||||
gs.is_unify_price, gs.goods_class,
|
||||
g.goods_stock as goods_stock, g.real_stock as goods_real_stock, g.price as goods_price,
|
||||
sg.store_id as store_goods_store_id, sgs.store_id as store_goods_sku_store_id, sgs.real_stock, sgs.stock',
|
||||
'',
|
||||
'gs',
|
||||
[
|
||||
[
|
||||
'goods g',
|
||||
'gs.goods_id = g.goods_id',
|
||||
'left'
|
||||
],
|
||||
[
|
||||
'store_goods sg',
|
||||
'gs.goods_id = sg.goods_id and sg.store_id = ' . $store_id,
|
||||
'left'
|
||||
],
|
||||
[
|
||||
'store_goods_sku sgs',
|
||||
'gs.sku_id = sgs.sku_id and sgs.store_id = ' . $store_id,
|
||||
'left'
|
||||
]
|
||||
]
|
||||
);
|
||||
if (empty($goods_list)) throw new StockException('商品不存在!');
|
||||
$goods_list_column = array_column($goods_list, null, 'sku_id');
|
||||
$is_default_store = $this->isDefaultStore($store_id);
|
||||
|
||||
$insert_goods_data = [];
|
||||
$insert_sku_data = [];
|
||||
$now_time = time();
|
||||
|
||||
foreach ($sku_column as $goods_k => $goods_v) {
|
||||
//校验整理不存在的门店商品项或sku项
|
||||
$item_temp_v = $goods_list_column[$goods_k] ?? [];
|
||||
//todo 这儿需要考虑
|
||||
if (!$item_temp_v) throw new StockException('存在已删除的商品!');
|
||||
$item_sku_id = $item_temp_v['sku_id'];
|
||||
$item_goods_id = $item_temp_v['goods_id'];
|
||||
|
||||
$store_goods_store_id = $item_temp_v['store_goods_store_id'] ?? 0;
|
||||
$item_insert_goods = $insert_goods_data[$item_goods_id] ?? [];
|
||||
|
||||
if (!$store_goods_store_id > 0 && !$item_insert_goods) {
|
||||
$insert_goods_data[$item_goods_id] = [
|
||||
'goods_id' => $item_goods_id,
|
||||
'store_id' => $store_id,
|
||||
'create_time' => $now_time,
|
||||
// 'stock' => $is_default_store ? $item_temp_v['goods_stock'] : 0,
|
||||
// 'real_stock' => $is_default_store ? $item_temp_v['goods_real_stock'] : 0,
|
||||
'price' => $item_temp_v['goods_price']
|
||||
];
|
||||
}
|
||||
//todo 默认认为门店商品sku只要存在,门店商品就存在
|
||||
$store_goods_sku_store_id = $item_temp_v['store_goods_sku_store_id'] ?? 0;
|
||||
$item_insert_sku = $insert_sku_data[$item_sku_id] ?? [];
|
||||
if (!$store_goods_sku_store_id > 0) {
|
||||
if (!$item_insert_sku) {
|
||||
$insert_sku_data[$item_sku_id] = [
|
||||
'goods_id' => $item_goods_id,
|
||||
'sku_id' => $item_sku_id,
|
||||
'store_id' => $store_id,
|
||||
'create_time' => $now_time,
|
||||
// 'stock' => $is_default_store ? $item_temp_v['sku_stock'] : 0,
|
||||
// 'real_stock' => $is_default_store ? $item_temp_v['sku_real_stock'] : 0,
|
||||
'price' => $item_temp_v['sku_price']
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
//统一添加未定义的门店商品
|
||||
if ($insert_goods_data) {
|
||||
model('store_goods')->addList($insert_goods_data);
|
||||
}
|
||||
//添加门店商品sku数据
|
||||
if ($insert_sku_data) {
|
||||
model('store_goods_sku')->addList($insert_sku_data);
|
||||
}
|
||||
return [
|
||||
'sku_column' => $sku_column,
|
||||
'goods_list_column' => $goods_list_column,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 当前传入的门店是否是默认门店(默认门店需要同步修改总的goods表和sku表)
|
||||
* @param $store_id
|
||||
* @return bool
|
||||
*/
|
||||
public function isDefaultStore($store_id)
|
||||
{
|
||||
$default_store_id = (new Store())->getDefaultStore()['data']['store_id'] ?? 0;
|
||||
return $default_store_id == $store_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取默认门店
|
||||
* @param $store_id
|
||||
* @return mixed
|
||||
*/
|
||||
public function getDefaultStore($store_id)
|
||||
{
|
||||
if ($store_id == 0 || !addon_is_exit('store')) {
|
||||
$store_model = new Store();
|
||||
$store_info = $store_model->getDefaultStore()['data'] ?? [];
|
||||
$store_id = $store_info['store_id'];
|
||||
}
|
||||
return $store_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量设置库存
|
||||
* @param $param
|
||||
* @return void
|
||||
*/
|
||||
public function setStock($param)
|
||||
{
|
||||
$store_id = $param['store_id'];
|
||||
$is_out_stock = 1;
|
||||
$stock_action_type = $param['stock_action_type'] ?? '';//出入库类型
|
||||
if ($stock_action_type == 'dec') {
|
||||
$is_out_stock = $param['is_out_stock'];
|
||||
}
|
||||
$update_sku_data = $param['update_sku_data'];
|
||||
$update_goods_data = $param['update_goods_data'];
|
||||
|
||||
//存在则直接编辑
|
||||
if ($update_sku_data) {
|
||||
$condition = [
|
||||
['sgs.store_id', '=', $store_id]
|
||||
];
|
||||
$data = [];
|
||||
//库存变更相同项可以合并同类项
|
||||
foreach ($update_sku_data as $item_stock => $v) {
|
||||
if ($item_stock > 0) {
|
||||
$stock_sql = ' + ' . abs($item_stock);
|
||||
} else {
|
||||
$stock_sql = ' - ' . abs($item_stock);
|
||||
}
|
||||
$item_goods_condition = $condition;
|
||||
if (count($v) > 1) {
|
||||
$item_goods_condition[] = [
|
||||
'sgs.goods_id', 'in', array_column($v, 'goods_id')
|
||||
];
|
||||
$item_goods_sku_condition = $item_goods_condition;
|
||||
$item_goods_sku_condition[] = [
|
||||
'sgs.sku_id', 'in', array_column($v, 'sku_id')
|
||||
];
|
||||
} else {
|
||||
$first_item = reset($v);
|
||||
$item_goods_condition[] = [
|
||||
'sgs.goods_id', '=', $first_item['goods_id']
|
||||
];
|
||||
$item_goods_sku_condition = $item_goods_condition;
|
||||
$item_goods_sku_condition[] = [
|
||||
'sgs.sku_id', '=', $first_item['sku_id']
|
||||
];
|
||||
}
|
||||
$update_obj = Db::name('store_goods_sku')->where($item_goods_sku_condition);
|
||||
//sku表联表goods表,合并sql
|
||||
$update_obj->alias('sgs');
|
||||
$data = [];
|
||||
//是否扣除销售库存
|
||||
if ($is_out_stock > 0) {
|
||||
$data['sgs.stock'] = Db::raw('IF(sgs.stock > sgs.real_stock,sgs.real_stock, sgs.stock)' . $stock_sql);
|
||||
}
|
||||
$data['sgs.real_stock'] = Db::raw('sgs.real_stock' . $stock_sql);
|
||||
//todo 销售库存不能大于实际库存,编辑的过程中需要校准
|
||||
//如果是默认门店,需要同步修改平台商品和sku
|
||||
if ($this->isDefaultStore($store_id)) {
|
||||
$update_obj->leftJoin('goods_sku gs', 'gs.sku_id = sgs.sku_id');
|
||||
if ($is_out_stock > 0) {
|
||||
$data['gs.stock'] = Db::raw('IF(gs.stock > gs.real_stock,gs.real_stock, gs.stock)' . $stock_sql);
|
||||
}
|
||||
$data['gs.real_stock'] = Db::raw('gs.real_stock' . $stock_sql);
|
||||
}
|
||||
$update_obj->update($data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//存在则直接编辑
|
||||
if ($update_goods_data) {
|
||||
$condition = [
|
||||
['sg.store_id', '=', $store_id]
|
||||
];
|
||||
$data = [];
|
||||
//库存变更相同项可以合并同类项
|
||||
foreach ($update_goods_data as $item_stock => $v) {
|
||||
if ($item_stock > 0) {
|
||||
$stock_sql = ' + ' . abs($item_stock);
|
||||
} else {
|
||||
$stock_sql = ' - ' . abs($item_stock);
|
||||
}
|
||||
$item_goods_condition = $condition;
|
||||
if (count($v) > 1) {
|
||||
$item_goods_condition[] = [
|
||||
'sg.goods_id', 'in', array_column($v, 'goods_id')
|
||||
];
|
||||
|
||||
} else {
|
||||
$first_item = reset($v);
|
||||
$item_goods_condition[] = [
|
||||
'sg.goods_id', '=', $first_item['goods_id']
|
||||
];
|
||||
}
|
||||
$update_obj = Db::name('store_goods')->where($item_goods_condition);
|
||||
//sku表联表goods表,合并sql
|
||||
$update_obj->alias('sg');
|
||||
$data = [];
|
||||
//是否扣除销售库存
|
||||
if ($is_out_stock > 0) {
|
||||
$data['sg.stock'] = Db::raw('IF(sg.stock > sg.real_stock,sg.real_stock, sg.stock)' . $stock_sql);
|
||||
}
|
||||
$data['sg.real_stock'] = Db::raw('sg.real_stock' . $stock_sql);
|
||||
|
||||
//todo 销售库存不能大于实际库存,编辑的过程中需要校准
|
||||
//如果是默认门店,需要同步修改平台商品和sku
|
||||
if ($this->isDefaultStore($store_id)) {
|
||||
$update_obj->leftJoin('goods g', 'g.goods_id = sg.goods_id');
|
||||
if ($is_out_stock > 0) {
|
||||
$data['g.goods_stock'] = Db::raw('IF(g.goods_stock > g.real_stock,g.real_stock, g.goods_stock)' . $stock_sql);
|
||||
}
|
||||
$data['g.real_stock'] = Db::raw('g.real_stock' . $stock_sql);
|
||||
}
|
||||
$update_obj->update($data);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 设置销售库存
|
||||
* @param $param
|
||||
* @return true
|
||||
* @throws \think\db\exception\DbException
|
||||
*/
|
||||
public function setSaleStock($param)
|
||||
{
|
||||
$store_id = $param['store_id'];
|
||||
$update_sku_data = $param['update_sku_data'];
|
||||
$update_goods_data = $param['update_goods_data'];
|
||||
//存在则直接编辑
|
||||
if ($update_sku_data) {
|
||||
$condition = [
|
||||
['sgs.store_id', '=', $store_id]
|
||||
];
|
||||
$data = [];
|
||||
//库存变更相同项可以合并同类项
|
||||
foreach ($update_sku_data as $item_stock => $v) {
|
||||
if ($item_stock > 0) {
|
||||
$stock_sql = ' + ' . abs($item_stock);
|
||||
} else {
|
||||
$stock_sql = ' - ' . abs($item_stock);
|
||||
}
|
||||
$item_goods_condition = $condition;
|
||||
if (count($v) > 1) {
|
||||
$item_goods_condition[] = [
|
||||
'sgs.goods_id', 'in', array_column($v, 'goods_id')
|
||||
];
|
||||
$item_goods_sku_condition = $item_goods_condition;
|
||||
$item_goods_sku_condition[] = [
|
||||
'sgs.sku_id', 'in', array_column($v, 'sku_id')
|
||||
];
|
||||
} else {
|
||||
$first_item = reset($v);
|
||||
$item_goods_condition[] = [
|
||||
'sgs.goods_id', '=', $first_item['goods_id']
|
||||
];
|
||||
$item_goods_sku_condition = $item_goods_condition;
|
||||
$item_goods_sku_condition[] = [
|
||||
'sgs.sku_id', '=', $first_item['sku_id']
|
||||
];
|
||||
}
|
||||
$update_obj = Db::name('store_goods_sku')->where($item_goods_sku_condition);
|
||||
//sku表联表goods表,合并sql
|
||||
$update_obj->alias('sgs');
|
||||
$data['sgs.stock'] = Db::raw('sgs.stock' . $stock_sql);
|
||||
|
||||
//todo 销售库存不能大于实际库存,编辑的过程中需要校准
|
||||
//如果是默认门店,需要同步修改平台商品和sku
|
||||
if ($this->isDefaultStore($store_id)) {
|
||||
$update_obj->leftJoin('goods_sku gs', 'gs.sku_id = sgs.sku_id');
|
||||
$data['gs.stock'] = Db::raw('IF(gs.stock > gs.real_stock,gs.real_stock, gs.stock)' . $stock_sql);
|
||||
}
|
||||
$update_obj->update($data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//存在则直接编辑
|
||||
if ($update_goods_data) {
|
||||
$condition = [
|
||||
['sg.store_id', '=', $store_id]
|
||||
];
|
||||
$data = [];
|
||||
//库存变更相同项可以合并同类项
|
||||
foreach ($update_goods_data as $item_stock => $v) {
|
||||
if ($item_stock > 0) {
|
||||
$stock_sql = ' + ' . abs($item_stock);
|
||||
} else {
|
||||
$stock_sql = ' - ' . abs($item_stock);
|
||||
}
|
||||
$item_goods_condition = $condition;
|
||||
if (count($v) > 1) {
|
||||
$item_goods_condition[] = [
|
||||
'sg.goods_id', 'in', array_column($v, 'goods_id')
|
||||
];
|
||||
|
||||
} else {
|
||||
$first_item = reset($v);
|
||||
$item_goods_condition[] = [
|
||||
'sg.goods_id', '=', $first_item['goods_id']
|
||||
];
|
||||
}
|
||||
$update_obj = Db::name('store_goods')->where($item_goods_condition);
|
||||
//sku表联表goods表,合并sql
|
||||
$update_obj->alias('sg');
|
||||
|
||||
$data['sg.stock'] = Db::raw('sg.stock' . $stock_sql);
|
||||
|
||||
//todo 销售库存不能大于实际库存,编辑的过程中需要校准
|
||||
//如果是默认门店,需要同步修改平台商品和sku
|
||||
if ($this->isDefaultStore($store_id)) {
|
||||
$update_obj->leftJoin('goods g', 'g.goods_id = sg.goods_id');
|
||||
$data['g.goods_stock'] = Db::raw('IF(g.goods_stock > g.real_stock,g.real_stock, g.goods_stock)' . $stock_sql);
|
||||
}
|
||||
$update_obj->update($data);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取统一格式的商品数据
|
||||
* @param $params
|
||||
* @return array|array[]|mixed
|
||||
*/
|
||||
public function getFormatSkuList($params)
|
||||
{
|
||||
$goods_sku_list = $params['goods_sku_list'] ?? [];
|
||||
if (empty($goods_sku_list)) {
|
||||
$goods_id = $params['goods_id'] ?? 0;
|
||||
$sku_id = $params['sku_id'];
|
||||
$temp_stock = $params['stock'] ?? $params['num'];
|
||||
$goods_sku_list = [
|
||||
[
|
||||
'stock' => $temp_stock,
|
||||
'goods_id' => $goods_id,
|
||||
'sku_id' => $sku_id
|
||||
]
|
||||
];
|
||||
}
|
||||
return $goods_sku_list;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user