473 lines
14 KiB
PHP
473 lines
14 KiB
PHP
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | likeshop开源商城系统
|
||
// +----------------------------------------------------------------------
|
||
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
|
||
// | gitee下载:https://gitee.com/likeshop_gitee
|
||
// | github下载:https://github.com/likeshop-github
|
||
// | 访问官网:https://www.likeshop.cn
|
||
// | 访问社区:https://home.likeshop.cn
|
||
// | 访问手册:http://doc.likeshop.cn
|
||
// | 微信公众号:likeshop技术社区
|
||
// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
|
||
// | likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
|
||
// | 禁止对系统程序代码以任何目的,任何形式的再发布
|
||
// | likeshop团队版权所有并拥有最终解释权
|
||
// +----------------------------------------------------------------------
|
||
// | author: likeshop.cn.team
|
||
// +----------------------------------------------------------------------
|
||
|
||
namespace app\shopapi\logic;
|
||
|
||
use app\common\basics\Logic;
|
||
use app\common\enum\GoodsEnum;
|
||
use app\common\enum\ShopEnum;
|
||
use app\common\model\goods\Goods;
|
||
use app\common\model\goods\GoodsItem;
|
||
use app\common\model\goods\GoodsSpec;
|
||
use app\common\server\ConfigServer;
|
||
use app\common\server\UrlServer;
|
||
use think\facade\Db;
|
||
|
||
class GoodsLogic extends Logic
|
||
{
|
||
/**
|
||
* @notes 商品列表
|
||
* @param $params
|
||
* @return array
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\DbException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @author Tab
|
||
* @date 2021/11/10 11:16
|
||
*/
|
||
public function lists($params)
|
||
{
|
||
// 组装条件
|
||
$field = $this->assemblyField();
|
||
$where = $this->assemblyWhere($params);
|
||
$order = $this->assemblyOrder();
|
||
|
||
$lists = Goods::field($field)
|
||
->where($where)
|
||
->page($params['page_no'], $params['page_size'])
|
||
->order($order)
|
||
->select()
|
||
->toArray();
|
||
|
||
$count = Goods::where($where)->count();
|
||
|
||
$lists = $this->formatLists($lists);
|
||
|
||
$more = is_more($count, $params['page_no'], $params['page_size']);
|
||
$btns = $this->btns($params);
|
||
$data = [
|
||
'lists' => $lists,
|
||
'page_no' => $params['page_no'],
|
||
'page_size' => $params['page_size'],
|
||
'count' => $count,
|
||
'more' => $more,
|
||
'btns' => $btns,
|
||
];
|
||
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
* @notes 字段
|
||
* @return string[]
|
||
* @author Tab
|
||
* @date 2021/11/10 11:04
|
||
*/
|
||
public function assemblyField()
|
||
{
|
||
return [
|
||
"id",
|
||
"name",
|
||
"image",
|
||
"min_price",
|
||
"max_price",
|
||
"stock",
|
||
"sales_actual",
|
||
];
|
||
}
|
||
|
||
/**
|
||
* @notes 搜索条件
|
||
* @param $params
|
||
* @return array[]
|
||
* @author Tab
|
||
* @date 2021/11/10 10:47
|
||
*/
|
||
public function assemblyWhere($params)
|
||
{
|
||
// 商家
|
||
$where = [
|
||
['shop_id', '=', $params['shop_id']]
|
||
];
|
||
// 商品名称
|
||
if(isset($params['name']) && trim($params['name'])) {
|
||
$where[] = ['name','like','%'.trim($params['name']).'%'];
|
||
}
|
||
// 商品类型 - 默认销售中
|
||
$type = !empty($params['type']) ? (int)$params['type'] : GoodsEnum::SALES;
|
||
|
||
switch ($type) {
|
||
case GoodsEnum::SALES:
|
||
$where[] = ['status', '=', GoodsEnum::STATUS_SHELVES];//上架
|
||
$where[] = ['del', '=', GoodsEnum::DEL_NORMAL];
|
||
$where[] = ['audit_status', '=', GoodsEnum::AUDIT_STATUS_OK];//审核通过
|
||
$where[] = ['stock','exp', Db::raw('>stock_warn')];
|
||
break;
|
||
case GoodsEnum::WAREHOUSE:
|
||
$where[] = ['status', '=', GoodsEnum::STATUS_SOLD_OUT];//下架
|
||
$where[] = ['del', '=', GoodsEnum::DEL_NORMAL];
|
||
$where[] = ['audit_status', '=', GoodsEnum::AUDIT_STATUS_OK];//审核通过
|
||
break;
|
||
case GoodsEnum::WARNING:
|
||
$where[] = ['status', '=', GoodsEnum::STATUS_SHELVES];//上架
|
||
$where[] = ['del', '=', GoodsEnum::DEL_NORMAL];
|
||
$where[] = ['audit_status', '=', GoodsEnum::AUDIT_STATUS_OK];//审核通过
|
||
$where[] = ['stock','exp', Db::raw('<=stock_warn')];
|
||
break;
|
||
case GoodsEnum::RECYCLE_BIN:
|
||
$where[] = ['del', '=', GoodsEnum::DEL_RECYCLE];
|
||
$where[] = ['audit_status', '=', GoodsEnum::AUDIT_STATUS_OK];//审核通过
|
||
break;
|
||
case GoodsEnum::WAIT_AUDIT:
|
||
$where[] = ['del', '<>', GoodsEnum::DEL_TRUE];
|
||
$where[] = ['audit_status', '=', GoodsEnum::AUDIT_STATUS_STAY];
|
||
break;
|
||
case GoodsEnum::UNPASS_AUDIT:
|
||
$where[] = ['del', '<>', GoodsEnum::DEL_TRUE];
|
||
$where[] = ['audit_status', '=', GoodsEnum::AUDIT_STATUS_REFUSE];
|
||
break;
|
||
default:
|
||
$where[] = ['del', '=', GoodsEnum::DEL_NORMAL];
|
||
}
|
||
|
||
return $where;
|
||
}
|
||
|
||
/**
|
||
* @notes 排序
|
||
* @return string[]
|
||
* @author Tab
|
||
* @date 2021/11/10 10:47
|
||
*/
|
||
public function assemblyOrder()
|
||
{
|
||
return [
|
||
'sort' => 'asc',
|
||
'id' => 'desc'
|
||
];
|
||
}
|
||
|
||
/**
|
||
* @notes 格式化
|
||
* @param $lists
|
||
* @return mixed
|
||
* @author Tab
|
||
* @date 2021/11/10 11:06
|
||
*/
|
||
public function formatLists($lists)
|
||
{
|
||
if (empty($lists)) {
|
||
return $lists;
|
||
}
|
||
|
||
foreach ($lists as &$item) {
|
||
$minPrice = floor($item["min_price"] * 100);
|
||
$maxPrice = floor($item["max_price"] * 100);
|
||
$item['price'] = $minPrice == $maxPrice ? "¥" . clearZero($item["min_price"]) : "¥" . clearZero($item["min_price"]) . " ~ " . clearZero($item["max_price"]);
|
||
}
|
||
|
||
return $lists;
|
||
}
|
||
|
||
/**
|
||
* @notes 操作
|
||
* @param $shopId
|
||
* @param $params
|
||
* @return bool
|
||
* @author Tab
|
||
* @date 2021/11/10 14:08
|
||
*/
|
||
public function operation($shopId, $params)
|
||
{
|
||
try {
|
||
if (empty($params['action'])) {
|
||
throw new \Exception("请选择操作");
|
||
}
|
||
|
||
$goods = Goods::where([
|
||
'shop_id' => $shopId,
|
||
'id' => $params['id']
|
||
])->findOrEmpty();
|
||
if ($goods->isEmpty()) {
|
||
throw new \Exception("商品不存在");
|
||
}
|
||
|
||
switch ($params['action']) {
|
||
case "delete":
|
||
$this->delete($goods);
|
||
break;
|
||
case "recycle":
|
||
$this->recycle($goods);
|
||
break;
|
||
case "on_shelf":
|
||
$this->onShelf($goods);
|
||
break;
|
||
case "off_shelf":
|
||
$this->offShelf($goods);
|
||
break;
|
||
case "warehouse":
|
||
$this->warehouse($goods);
|
||
break;
|
||
default:
|
||
throw new \Exception("无效的操作");
|
||
}
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
self::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @notes 删除商品
|
||
* @param $goods
|
||
* @author Tab
|
||
* @date 2021/11/10 11:58
|
||
*/
|
||
public function delete($goods)
|
||
{
|
||
$goods->del = GoodsEnum::DEL_TRUE;
|
||
$goods->save();
|
||
}
|
||
|
||
/**
|
||
* @notes 放入回收站
|
||
* @param $goods
|
||
* @author Tab
|
||
* @date 2021/11/10 11:58
|
||
*/
|
||
public function recycle($goods)
|
||
{
|
||
$goods->del = GoodsEnum::DEL_RECYCLE;
|
||
$goods->save();
|
||
}
|
||
|
||
/**
|
||
* @notes 上架
|
||
* @param $goods
|
||
* @throws \Exception
|
||
* @author Tab
|
||
* @date 2021/11/10 12:01
|
||
*/
|
||
public function onShelf($goods)
|
||
{
|
||
if ($goods->stock <= 0) {
|
||
throw new \Exception("库存不足不允许上架");
|
||
}
|
||
$goods->status = GoodsEnum::STATUS_SHELVES;
|
||
$goods->save();
|
||
}
|
||
|
||
/**
|
||
* @notes 下架
|
||
* @param $goods
|
||
* @author Tab
|
||
* @date 2021/11/10 14:04
|
||
*/
|
||
public function offShelf($goods)
|
||
{
|
||
$goods->status = GoodsEnum::STATUS_SOLD_OUT;
|
||
$goods->save();
|
||
}
|
||
|
||
/**
|
||
* @notes 放入仓库
|
||
* @param $goods
|
||
* @author Tab
|
||
* @date 2021/11/10 14:07
|
||
*/
|
||
public function warehouse($goods)
|
||
{
|
||
$goods->status = GoodsEnum::STATUS_SOLD_OUT;
|
||
$goods->del = GoodsEnum::DEL_NORMAL;
|
||
$goods->save();
|
||
}
|
||
|
||
/**
|
||
* @notes 商品详情
|
||
* @param $id
|
||
* @return array
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\DbException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @author Tab
|
||
* @date 2021/11/10 15:14
|
||
*/
|
||
public function detail($id)
|
||
{
|
||
$goodsDetail = Goods::with(['goods_image', 'goods_item', 'shop'])
|
||
->field('id,type,code,name,spec_type,image,video,remark,content,market_price,min_price,max_price,stock,sales_actual,shop_id')
|
||
->where('id', $id)
|
||
->findOrEmpty();
|
||
|
||
if ($goodsDetail->isEmpty()) {
|
||
return [];
|
||
}
|
||
|
||
$goodsDetail = $goodsDetail->toArray();
|
||
|
||
// 轮播图添加域名
|
||
foreach($goodsDetail['goods_image'] as &$item) {
|
||
$item['uri'] = empty($item['uri']) ? '' : UrlServer::getFileUrl($item['uri']);
|
||
}
|
||
|
||
// 规格项及规格值信息
|
||
$goodsDetail['goods_spec'] = GoodsSpec::with('spec_value')
|
||
->where('goods_id', $goodsDetail['id'])->select()->toArray();
|
||
|
||
return $goodsDetail;
|
||
}
|
||
|
||
/**
|
||
* @notes 商品编辑
|
||
* @param $shopId
|
||
* @param $params
|
||
* @author Tab
|
||
* @date 2021/11/10 15:24
|
||
*/
|
||
public function edit($params)
|
||
{
|
||
try {
|
||
$updateData = $this->checkParams($params);
|
||
(new GoodsItem())->saveAll($updateData['itemData']);
|
||
Goods::update($updateData['goodsData']);
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
self::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @notes 参数校验
|
||
* @param $params
|
||
* @throws \Exception
|
||
* @author Tab
|
||
* @date 2021/11/10 15:48
|
||
*/
|
||
public function checkParams($params)
|
||
{
|
||
$goodsStock = 0;
|
||
$itemId = 0;
|
||
$updateData = [];
|
||
|
||
$max_price = 0;
|
||
$min_price = 0;
|
||
$market_price = 0;
|
||
|
||
if (!isset($params['items']) || !is_array($params['items'])) {
|
||
throw new \Exception("参数缺失或格式有误");
|
||
}
|
||
foreach($params['items'] as $item) {
|
||
if (!is_array($item)) {
|
||
throw new \Exception("参数格式错误");
|
||
}
|
||
if (!isset($item['id']) || !isset($item['price']) || !isset($item['stock']) || !isset($item['market_price']) || !isset($item['chengben_price'])) {
|
||
throw new \Exception("参数缺失");
|
||
}
|
||
if ($item['price'] <= 0 || $item['market_price'] <= 0 || $item['chengben_price'] <= 0 || $item['stock'] <= 0) {
|
||
throw new \Exception("价格及库存均不能为负数和零");
|
||
}
|
||
if ($item['market_price'] < $item['price']) {
|
||
throw new \Exception("市场价不能低于售价");
|
||
}
|
||
// 重新赋值作用:避免$item字段过多时修改了不该修改的字段
|
||
$temp['id'] = $item['id'];
|
||
$temp['price'] = $item['price'];
|
||
$temp['market_price'] = $item['market_price'];
|
||
$temp['chengben_price'] = $item['chengben_price'];
|
||
$temp['stock'] = $item['stock'];
|
||
// 规格数据
|
||
$updateData[] = $temp;
|
||
|
||
// 主表库存
|
||
$goodsStock += $item['stock'];
|
||
$itemId = $item['id'];
|
||
|
||
// 最高价
|
||
if ($item['price'] > $max_price) {
|
||
$max_price = $item['price'];
|
||
}
|
||
|
||
if ($min_price == 0) {
|
||
$min_price = $item['price'];
|
||
$market_price = $item['market_price'];
|
||
}
|
||
|
||
//最低价
|
||
if ($item['price'] < $min_price) {
|
||
$min_price = $item['price'];
|
||
$market_price = $item['market_price'];
|
||
}
|
||
}
|
||
|
||
// 商品id
|
||
$goodsId = (new GoodsItem())->where(['id' => $itemId])->value('goods_id');
|
||
|
||
// 商品更新库存
|
||
$goodsData = [
|
||
'id' => $goodsId,
|
||
'stock' => $goodsStock,
|
||
'max_price' => $max_price,
|
||
'min_price' => $min_price,
|
||
'market_price' => $market_price,
|
||
];
|
||
|
||
return ['itemData' => $updateData, 'goodsData' => $goodsData];
|
||
}
|
||
|
||
/**
|
||
* @notes 按钮显示与隐藏
|
||
* @param $params
|
||
* @return array
|
||
* @author Tab
|
||
* @date 2021/11/12 17:59
|
||
*/
|
||
public function btns($params)
|
||
{
|
||
$recycleBtn = $editBtn = $offShelfBtn = $onShelfBtn = $deleteBtn = $warehouseBtn = false;
|
||
// 商品类型 - 默认销售中
|
||
$type = !empty($params['type']) ? (int)$params['type'] : GoodsEnum::SALES;
|
||
|
||
switch ($type) {
|
||
case GoodsEnum::SALES:
|
||
case GoodsEnum::WARNING:
|
||
$recycleBtn = $editBtn = $offShelfBtn = true;
|
||
break;
|
||
case GoodsEnum::WAREHOUSE:
|
||
$recycleBtn = $editBtn = $onShelfBtn = true;
|
||
break;
|
||
case GoodsEnum::RECYCLE_BIN:
|
||
$deleteBtn = $warehouseBtn = true;
|
||
break;
|
||
case GoodsEnum::WAIT_AUDIT:
|
||
case GoodsEnum::UNPASS_AUDIT:
|
||
$deleteBtn = $editBtn = true;
|
||
break;
|
||
}
|
||
return [
|
||
"recycle_btn" => $recycleBtn,
|
||
"edit_btn" => $editBtn,
|
||
"off_shelf_btn" => $offShelfBtn,
|
||
"on_shelf_btn" => $onShelfBtn,
|
||
"delete_btn" => $deleteBtn,
|
||
"warehouse_btn" => $warehouseBtn,
|
||
];
|
||
}
|
||
} |