admin/addon/store/model/StoreGoodsSku.php

357 lines
13 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* ThinkShop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 成都云之牛科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.cdcloudshop.com
* =========================================================
*/
namespace addon\store\model;
use app\model\BaseModel;
use app\model\goods\Goods;
class StoreGoodsSku extends BaseModel
{
/**
* 添加店铺sku
* @param $data
* @return array
*/
public function addStoreGoodsSku($data)
{
$res = model('store_goods_sku')->add($data);
//判断当前有没有store_goods
$store_goods_info = model('store_goods')->getInfo([['goods_id', '=', $data['goods_id']], ['store_id', '=', $data['store_id']]], 'id');
if (empty($store_goods_info)) {
$store_goods_data = [
'goods_id' => $data['goods_id'],
'store_id' => $data['store_id'],
'create_time' => time(),
];
model('store_goods')->add($store_goods_data);
}
return $this->success($res);
}
/**
* 获取门店商品sku详情
* @param $condition
* @param string $field
* @return array
*/
public function getStoreGoodsSkuInfo($condition, $field = '*')
{
$res = model('store_goods_sku')->getInfo($condition, $field);
return $this->success($res);
}
/**
* 增加库存
* @param param
*/
public function incStock($param)
{
$condition = array(
['store_id', '=', $param['store_id']],
['sku_id', '=', $param['sku_id']]
);
$num = $param['stock'];
$store_sku_info = model("store_goods_sku")->getInfo($condition, 'id, goods_id');
if (empty($store_sku_info))
return $this->error(-1, "");
//编辑sku库存
$result = model("store_goods_sku")->setInc($condition, 'stock', $num);
model('store_goods')->setInc([['goods_id', '=', $store_sku_info['goods_id']], ['store_id', '=', $param['store_id']]], 'stock', $num);
return $this->success($result);
}
/**
* 减少库存
* @param $param
* @return array
*/
public function decStock($param)
{
$condition = array(
['store_id', '=', $param['store_id']],
['sku_id', '=', $param['sku_id']]
);
$num = $param['stock'];
$store_sku_info = model("store_goods_sku")->getInfo($condition, 'id, goods_id, stock');
if (empty($store_sku_info)) {
return $this->error(-1, '库存不足!');
}
if (($store_sku_info['stock'] - $num) < 0) {
return $this->error(-1, '库存不足!');
}
//编辑sku库存
$result = model("store_goods_sku")->setDec($condition, 'stock', $num);
model('store_goods')->setDec([['goods_id', '=', $store_sku_info['goods_id']], ['store_id', '=', $param['store_id']]], 'stock', $num);
return $this->success($result);
}
/**
* 编辑门店商品库存信息
* @param $goods_sku_array
*/
public function editStock($store_goods_sku_array)
{
model('store_goods_sku')->startTrans();
try {
foreach ($store_goods_sku_array as $item) {
$sku_info_result = $this->getStoreGoodsSkuInfo([["store_id", "=", $item["store_id"]], ["sku_id", "=", $item["sku_id"]]], "sku_id");
$sku_info = $sku_info_result["data"];
if (empty($sku_info)) {
$sku_data = array(
"goods_id" => $item["goods_id"],
"sku_id" => $item["sku_id"],
"store_id" => $item["store_id"],
);
$this->addStoreGoodsSku($sku_data);
}
if ($item['stock'] > 0) {
$item_result = $this->incStock($item);
} else {
$item['stock'] = abs($item['stock']);
$item_result = $this->decStock($item);
}
if ($item_result["code"] < 0) {
model('store_goods_sku')->rollback();
return $item_result;
}
}
model('store_goods_sku')->commit();
return $this->success();
} catch (\Exception $e) {
model('store_goods_sku')->rollback();
return $this->error($e->getMessage());
}
}
/**
* 获取商品列表
* @param array $condition
*/
public function getGoodsSkuList($condition = [], $store_id = 0)
{
$alias = 'gs';
$join = [
[
'store_goods_sku sgs',
'sgs.sku_id = gs.sku_id and (sgs.store_id is null or sgs.store_id = ' . $store_id . ')',
'left'
]
];
$field = '
gs.sku_id,gs.sku_name,gs.price,gs.stock,gs.sale_num,gs.sku_image,gs.goods_id,gs.goods_name,gs.site_id,gs.spec_name,
gs.max_buy,gs.min_buy,gs.goods_class_name,
sgs.stock,sgs.sale_num
';
$list = model('goods_sku')->getList($condition, $field, '', $alias, $join);
return $this->success($list);
}
/**
* 获取商品分页列表
* @param array $condition
* @param number $page
* @param string $page_size
* @param string $order
* @param string $field
*/
public function getGoodsSkuPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'gs.create_time desc', $field = '*')
{
$alias = 'gs';
$join = [
[
'store_goods_sku sgs',
'sgs.sku_id = gs.sku_id',
'inner'
],
[
'goods g',
'g.goods_id = gs.goods_id',
'inner'
]
];
$field = 'gs.*,sgs.stock,sgs.sale_num';
$list = model('goods_sku')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
return $this->success($list);
}
/**
* 门店库存批量修改导入excel
* @param $param
* @param $site_id
* @return array
*/
public function importStoreGoodsStock($param, $site_id, $store_id)
{
$PHPReader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
//载入文件
$PHPExcel = $PHPReader->load($param['path']);
//获取表中的第一个工作表如果要获取第二个把0改为1依次类推
$currentSheet = $PHPExcel->getSheet(0);
//获取总行数
$allRow = $currentSheet->getHighestRow();
if ($allRow < 2) {
return $this->error('', '导入了一个空文件');
}
//添加文件上传记录
$error_num = 0;
$data = [
'site_id' => $site_id,
'store_id' => $store_id,
'filename' => $param['filename'],
'path' => $param['path'],
'sku_num' => $allRow - 1,
'create_time' => time()
];
$res = model('store_stock_import')->add($data);
if (!$res) {
return $this->error('', '上传文件失败');
}
model('store_stock_import')->startTrans();
try {
for ($i = 2; $i <= $allRow; $i++) {
//商品id
$goods_id = $PHPExcel->getActiveSheet()->getCell('A' . $i)->getValue();
$goods_id = trim($goods_id, ' ');
//商品名称
$goods_name = $PHPExcel->getActiveSheet()->getCell('B' . $i)->getValue();
$goods_name = trim($goods_name, ' ');
//sku_id
$sku_id = $PHPExcel->getActiveSheet()->getCell('C' . $i)->getValue();
$sku_id = trim($sku_id, ' ');
//sku名称
$sku_name = $PHPExcel->getActiveSheet()->getCell('D' . $i)->getValue();
$sku_name = trim($sku_name, ' ');
//库存(增/减)
$stock = $PHPExcel->getActiveSheet()->getCell('F' . $i)->getValue();
$stock = trim($stock, ' ');
if (empty($goods_id) || empty($sku_id) || empty($stock)) {
$error_num += 1;
model('store_stock_import')->update(['error_num' => $error_num], [['id', '=', $res]]);
//添加失败记录
model('store_stock_import_log')->add(
[
'store_id' => $store_id,'file_id' => $res, 'goods_id' => $goods_id, 'goods_name' => $goods_name, 'sku_id' => $sku_id,
'sku_name' => $sku_name, 'stock' => $stock, 'status' => -1,'reason' => '商品编号、sku编号或者库存为空'
]
);
continue;
}
$goods_model = new Goods();
$sku_info = $goods_model->getGoodsSkuInfo([['sku_id','=',$sku_id],['goods_id','=',$goods_id],['site_id','=',$site_id]]);
if(empty($sku_info['data'])){
$error_num += 1;
model('store_stock_import')->update(['error_num' => $error_num], [['id', '=', $res]]);
//添加失败记录
model('store_stock_import_log')->add(
[
'store_id' => $store_id,'file_id' => $res, 'goods_id' => $goods_id, 'goods_name' => $goods_name, 'sku_id' => $sku_id,
'sku_name' => $sku_name, 'stock' => $stock, 'status' => -1,'reason' => '商品不存在'
]
);
continue;
}
$sku_info_result = $this->getStoreGoodsSkuInfo([["store_id", "=", $store_id], ["sku_id", "=", $sku_id]], "sku_id");
$sku_info = $sku_info_result["data"];
if (empty($sku_info)) {
$sku_data = array(
"goods_id" => $goods_id,
"sku_id" => $sku_id,
"store_id" => $store_id,
);
$this->addStoreGoodsSku($sku_data);
}
$store_data = [
'store_id' => $store_id,
'sku_id' => $sku_id,
'stock' => $stock
];
if ($stock > 0) {
$item_result = $this->incStock($store_data);
} else {
$store_data['stock'] = abs($store_data['stock']);
$item_result = $this->decStock($store_data);
}
if ($item_result["code"] < 0) {
$error_num += 1;
model('store_stock_import')->update(['error_num' => $error_num], [['id', '=', $res]]);
//添加失败记录
model('store_stock_import_log')->add(
[
'store_id' => $store_id,'file_id' => $res, 'goods_id' => $goods_id, 'goods_name' => $goods_name, 'sku_id' => $sku_id,
'sku_name' => $sku_name, 'stock' => $stock, 'status' => -1, 'reason' => $item_result['message']
]
);
continue;
}
//添加记录
model('store_stock_import_log')->add(
[
'store_id' => $store_id,'file_id' => $res, 'goods_id' => $goods_id, 'goods_name' => $goods_name, 'sku_id' => $sku_id,
'sku_name' => $sku_name, 'stock' => $stock, 'status' => 0, 'reason' => ''
]
);
}
model('store_stock_import')->commit();
return $this->success();
} catch (\Exception $e) {
model('store_stock_import')->rollback();
model('store_stock_import')->update(['error_num' => $allRow - 1], [['id', '=', $res]]);
return $this->error('', $e->getMessage());
}
}
/**
* 核验门店库存是否足够
* @param $params
*/
public function checkStoreGoodsSkuStock($params){
$store_id = $params['store_id'];
$goods_id = $params['goods_id'];
$sku_id = $params['sku_id'];
$site_id = $params['site_id'];
$num = $params['num'];
$sku_condition = array(
['goods_id' , '=', $goods_id],
['sku_id', '=', $sku_id],
['store_id', '=', $store_id],
);
$store_sku_info = model("store_goods_sku")->getInfo($sku_condition, 'stock');
if (empty($store_sku_info)) {
return $this->error(-1, '库存不足!');
}
if (($store_sku_info['stock'] - $num) < 0) {
return $this->error(-1, '库存不足!');
}
return $this->success();
}
}