文件
mashangyoujiu/Application/Retail/Business/LabelInventory.class.php

734 行
27 KiB
PHP
可执行文件

<?php
namespace Retail\Business;
use Common\Business\GoodsClassify;
use Common\Business\OperateMGoods;
use Common\Model\ImageGalleryModel;
use Common\Model\RetailGoodsClassModel;
use Common\Model\RetailGoodsModel;
use Common\Model\RetailMgoodsModel;
use Retail\Model\GoodsLabelLinkModel;
use Retail\Model\LabelInventoryModel;
use Retail\Model\MGoodsLabelLinkModel;
use Retail\Model\StoreIndustryModel;
//[1.8.50]
/**
* 标签库类
* Class LabelInventory
* [
* addLabelData 添加标签
* getLabelInventoryList 获取标签列表
* delLabelData 删除标签
* getGoodsList 获取门店/商城商品列表
* addLinkGoods 绑定商品与标签
* getLabelBelongGoods 获取标签对应商品
* delLinkGoods 删除商品与标签的绑定关系
* addGoodsLabelLink 保存商品选择的多个标签
* verifyGoodsChangeClass 验证是否可以批量修改商品分类
* ]
* @package Retail\Business
*/
class LabelInventory
{
/**
* 添加标签
*/
public function addLabelData($param)
{
$verify = $this->publicVerifyParam($param);
if ($verify['status'] == 0) {
return $verify;
}
if (empty($param['name'])) {
return callBack(statusCode()['error'], '缺少必要参数');
}
$LabelInventoryModel = new LabelInventoryModel();
// 验重
$repeatMap = [
'industry_id' => $param['industry_id'],
'name' => $param['name'],
'merchant_id' => $param['merchant_id'],
'status' => 1,
];
$repeat = $LabelInventoryModel->getFind($repeatMap);
if ($repeat) {
return callBack(statusCode()['error'], '已存在相同名称标签');
}
$newLabelData = [
'name' => $param['name'],
'industry_id' => $param['industry_id'] ? $param['industry_id'] : 0,
'store_id' => $param['store_id'] ? $param['store_id'] : 0,
'merchant_id' => $param['merchant_id'],
'add_time' => time(),
'status' => 1,
'operate_id' => $param['operate_id'],
'operate_type' => $param['operate_type'],
];
$result = $LabelInventoryModel->addOrder($newLabelData);
if ($result) {
return callBack(statusCode()['success'], '标签添加成功');
} else {
return callBack(statusCode()['error'], '添加失败,请刷新重试');
}
}
/**
* 获取标签列表
*/
public function getLabelInventoryList($param)
{
$verify = $this->publicVerifyParam($param);
if ($verify['status'] == 0) {
return $verify;
}
$param['page'] = I('post.page') ? I('post.page') : 1;
$param['limit'] = I('post.limit') ? I('post.limit') : 10;
$LabelInventoryModel = new LabelInventoryModel();
$map = [
'merchant_id' => $param['merchant_id'],
'status' => 1,
];
if ($param['name']) {
$map['name'] = ['like', '%' . trim($param['name']) . '%'];
}
if (($param['operate_type'] == 1 || empty($param['store_industry_id'])) && $param['industry_id'] != '') {
$map['industry_id'] = $param['industry_id'];
} else if ($param['store_industry_id']) {
$map['industry_id'] = ['in', [0, $param['store_industry_id']]];
}
if ($param['start_time'] && $param['end_time']) {
$map['add_time'] = ['between', [$param['start_time'], $param['end_time']]];
}
$list = $LabelInventoryModel->getSelect($map, '', 'add_time desc', "{$param['page']},{$param['limit']}");
if (!empty($list)) {
$StoreIndustryModel = new StoreIndustryModel();
$GoodsLabelLinkModel = new GoodsLabelLinkModel();
$MGoodsLabelLinkModel = new MGoodsLabelLinkModel();
$IndustryArray = [];
$IndustryIdArr = [];
// 场景 1商户 2门店
$Model = $param['operate_type'] == 1 ? $MGoodsLabelLinkModel : $GoodsLabelLinkModel;
foreach ($list as &$value) {
// 减少行业name重复查询
if (in_array($value['industry_id'], $IndustryIdArr)) {
$value['industry_name'] = $IndustryArray[$value['industry_id']];
} else {
$value['industry_name'] = $StoreIndustryModel->getFindField(['id' => $value['industry_id']], 'name');
$IndustryIdArr[] = $value['industry_id'];
$IndustryArray[$value['industry_id']] = $value['industry_name'];
}
$value['add_time'] = date("Y-m-d H:i:s", $value['add_time']);
$value['goods_num'] = $Model->getCount(['label_id' => $value['id']]);
}
return callBack(statusCode()['success'], '获取成功', [
'list' => $list,
'count' => $LabelInventoryModel->getCount($map),
]);
} else {
return callBack(statusCode()['success'], '暂无数据', [
'list' => [],
'count' => 0,
]);
}
}
/**
* 获取标签列表-无商品数
*/
public function getLabelList($param)
{
$map = [
'l.merchant_id' => $param['merchant_id'],
'l.status' => 1,
];
if ($param['industry_id']) {
$map['l.industry_id'] = ['in', [0, $param['industry_id']]];
}
$list = M('label_inventory as l')
->join('ls_store_industry as i on i.id=l.industry_id', 'LEFT')
->where($map)
->field('l.id,l.name,l.industry_id,i.name as industry_name')
->select();
$groupList = [];
$ids = [];
foreach ($list as $v) {
if (!isset($ids[$v['industry_id']])) {
$ids[$v['industry_id']] = count($ids);
$groupList[$ids[$v['industry_id']]]['id'] = $v['industry_id'];
$groupList[$ids[$v['industry_id']]]['name'] = $v['industry_name'] ? $v['industry_name'] : '公共';
$groupList[$ids[$v['industry_id']]]['list'] = [];
}
$groupList[$ids[$v['industry_id']]]['list'][] = [
'id' => $v['id'],
'name' => $v['name'],
'industry_id' => $v['industry_id'],
];
}
return callBack(statusCode()['success'], !empty($groupList) ? '获取成功' : '暂无数据', [
'list' => $groupList ? $groupList : [],
]);
}
/**
* 删除标签
*/
public function delLabelData($param)
{
$verify = $this->publicVerifyParam($param);
if ($verify['status'] == 0) {
return $verify;
}
if (!$param['id']) {
return callBack(statusCode()['error'], '缺少必要参数');
}
$LabelInventoryModel = new LabelInventoryModel();
$GoodsLabelLinkModel = new GoodsLabelLinkModel();
$MGoodsLabelLinkModel = new MGoodsLabelLinkModel();
// 商户
$inUseLabel = $MGoodsLabelLinkModel->getFind(['merchant_id' => $param['merchant_id'], 'label_id' => $param['id']], 'id');
if ($inUseLabel) {
return callBack(statusCode()['error'], '存在商品使用该标签,不可删除');
}
// 门店
$inUseLabel = $GoodsLabelLinkModel->getFind(['merchant_id' => $param['merchant_id'], 'label_id' => $param['id']], 'id');
if ($inUseLabel) {
return callBack(statusCode()['error'], '存在商品使用该标签,不可删除');
}
switch ($param['operate_type']) {
case 1:
// 商户
break;
case 2:
// 门店
$labelInfo = $LabelInventoryModel->getFind(['id' => $param['id'], 'store_id']);
if ($labelInfo['store_id'] && $labelInfo['store_id'] != $param['store_id']) {
return callBack(statusCode()['error'], '门店只能删除自己新增的标签');
}
break;
}
$map = [
'id' => $param['id'],
];
if ($param['operate_type'] == 2) {
$map['store_id'] = $param['store_id'];
}
$result = $LabelInventoryModel->updateOrder($map, ['status' => 2]);
if ($result) {
return callBack(statusCode()['success'], '标签删除成功');
} else {
return callBack(statusCode()['error'], '标签删除失败,请刷新重试');
}
}
/**
* 获取门店/商城商品列表
*/
public function getGoodsList($param)
{
$verify = $this->publicVerifyParam($param);
if ($verify['status'] == 0) {
return $verify;
}
// 验参
if (!$param['label_id']) {
return callBack(statusCode()['error'], '缺少必要参数');
}
$LabelModel = new LabelInventoryModel();
$label = $LabelModel->getFind(['id' => $param['label_id'], 'status' => 1], 'id,industry_id');
if (empty($label)) {
return callBack(statusCode()['error'], '标签不存在');
}
$ImageGalleryModel = new ImageGalleryModel();
switch ($param['operate_type']) {
case 1:
$Model = new RetailMgoodsModel();
$idBelong = 1;
$map = [
'status' => ['neq', 2],
'merchantid' => $param['merchant_id'],
];
$order = 'addtime desc';
break;
case 2:
$Model = new RetailGoodsModel();
$idBelong = 2;
$map = [
'status' => ['neq', 2],
'merchantid' => $param['merchant_id'],
'store_id' => $param['store_id'],
];
$order = 'add_time desc';
break;
}
if (trim($param['search_text'])) {
switch ($param['search_type']) {
case 1:
// 货号
if ($idBelong == 1) {
$map['good_number'] = ['like', '%' . trim($param['search_text'] . '%')];
} else {
$map['goods_number'] = ['like', '%' . trim($param['search_text'] . '%')];
}
break;
case 2:
// 条码
$map['goods_code'] = ['like', '%' . trim($param['search_text'] . '%')];
break;
case 3:
// 商品名称
$map['goods_name'] = ['like', '%' . trim($param['search_text'] . '%')];
break;
default:
$map['goods_name|goods_code'] = ['like', '%' . trim($param['search_text'] . '%')];
break;
}
}
// 处理分类
$goods_class_id = getGoodsClass($param['firstClass'], $param['secondClass'], $param['thirdClass']);
if ($goods_class_id) {
$map['goods_class_id'] = $goods_class_id;
} else if ($label['industry_id'] != 0) {
//行业限制分类
$GoodsClassify = new GoodsClassify();
$class = $GoodsClassify->basisIndustryGetClass([
'merchant_id' => $param['merchant_id'],
'industry_id' => $label['industry_id'],
]);
$map['goods_class_id'] = ['in', $class['data']];
}
$goodsField = [
'id',
'goods_name',
'goods_code',
'specifications',
];
if ($idBelong == 1) {
$map['id'] = ['exp', "NOT IN (select ifnull (goods_id,0) from `ls_mgoods_label_link` where label_id = " . $param['label_id'] . " and merchant_id = " . $param['merchant_id'] . ")"];
$goodsField[] = 'goods_image_id';
$goodsField[] = 'good_number';
} elseif ($idBelong == 2) {
$map['id'] = ['exp', "NOT IN (select ifnull (goods_id,0) from `ls_goods_label_link` where label_id = " . $param['label_id'] . " and merchant_id = " . $param['merchant_id'] . ")"];
$goodsField[] = 'goods_img_id';
$goodsField[] = 'goods_number';
}
$list = $Model->getSelect($map, $goodsField, $order, "{$param['page']},{$param['limit']}");
foreach ($list as &$value) {
$goods_img_id = $value['goods_img_id'] ? $value['goods_img_id'] : $value['goods_image_id'];
if ($goods_img_id) {
$value['goods_image'] = $ImageGalleryModel->getFieldPath(['id' => $goods_img_id]);
}
$value['goods_number'] = $value['goods_number'] ? $value['goods_number'] : $value['good_number'];
}
return callBack(statusCode()['success'], !empty($list) ? '获取成功' : '暂无数据', [
'list' => $list ? $list : [],
'count' => $list ? $Model->getCount($map) : 0,
]);
}
/**
* 绑定商品与标签
*/
public function addLinkGoods($param)
{
$verify = $this->publicVerifyParam($param);
if ($verify['status'] == 0) {
return $verify;
}
if (!$param['ids'] || !$param['label_id']) {
return callBack(statusCode()['error'], '缺少必要参数');
}
$idArr = explode(',', $param['ids']);
$GoodsLabelLinkModel = new GoodsLabelLinkModel();
$MGoodsLabelLinkModel = new MGoodsLabelLinkModel();
$Model = $param['operate_type'] == 1 ? $MGoodsLabelLinkModel : $GoodsLabelLinkModel;
$successNum = 0;
$OperateMGoods = new OperateMGoods();
foreach ($idArr as $id) {
$newLinkData = [
'merchant_id' => $param['merchant_id'],
'label_id' => $param['label_id'],
'operate_id' => $param['operate_id'],
'goods_id' => $id,
'add_time' => time()
];
if ($param['store_id']) {
$newLinkData['store_id'] = $param['store_id'];
}
$addRes = $Model->addOrder($newLinkData);
if ($addRes) {
$successNum++;
if ($param['operate_type'] == 1) {
//修改门店商品档案的更新状态
$OperateMGoods->updateStoreGoodsSyncState($id);
}
}
}
if (count($idArr) == $successNum) {
return callBack(statusCode()['success'], '标签商品添加成功');
} else if ($successNum == 0) {
return callBack(statusCode()['error'], '标签商品添加失败');
}
}
/**
* 获取标签对应商品
*/
public function getLabelBelongGoods($param)
{
$verify = $this->publicVerifyParam($param);
if ($verify['status'] == 0) {
return $verify;
}
if (!$param['label_id']) {
return callBack(statusCode()['error'], '缺少必要参数');
}
$param['page'] = I('post.page') ? I('post.page') : 1;
$param['limit'] = I('post.limit') ? I('post.limit') : 10;
$ImageGalleryModel = new ImageGalleryModel();
$GoodsLabelLinkModel = new GoodsLabelLinkModel();
$MGoodsLabelLinkModel = new MGoodsLabelLinkModel();
$field = [
'link.id',
'goods.goods_name', // 商品名称
'goods.goods_code', // 条码
'goods.specifications', // 规格
];
if ($param['operate_type'] == 1) {
$Model = $MGoodsLabelLinkModel;
$field[] = 'goods.goods_image_id'; // 图片id
$field[] = 'goods.good_number'; // 货号
} else {
$Model = $GoodsLabelLinkModel;
$field[] = 'goods.goods_img_id'; // 图片id
$field[] = 'goods.goods_number'; // 货号
}
$map = [
'link.label_id' => $param['label_id'],
'link.merchant_id' => $param['merchant_id'],
];
// 处理分类
$goods_class_id = getGoodsClass($param['firstClass'], $param['secondClass'], $param['thirdClass']);
if ($goods_class_id) {
$map['goods.goods_class_id'] = $goods_class_id;
}
if (trim($param['search_text'])) {
switch ($param['search_type']) {
case 1:
//货号
if ($param['operate_type'] == 1) {
$map['goods.good_number'] = ['like', '%' . trim($param['search_text'] . '%')];
} else {
$map['goods.goods_number'] = ['like', '%' . trim($param['search_text'] . '%')];
}
break;
case 2:
//条码
$map['goods.goods_code'] = ['like', '%' . trim($param['search_text'] . '%')];
break;
case 3:
//商品名称
$map['goods.goods_name'] = ['like', '%' . trim($param['search_text'] . '%')];
break;
default:
$map['goods.goods_name|goods.goods_number|goods.goods_code'] = ['like', '%' . trim($param['search_text'] . '%')];
break;
}
}
$list = $Model->getLabelBelongGoods($map, $field, 'link.add_time desc', $param['page'], $param['limit']);
if (!empty($list['list'])) {
foreach ($list['list'] as &$value) {
$value['goods_number'] = $value['goods_number'] ? $value['goods_number'] : $value['good_number'];
$goods_img_id = $value['goods_img_id'] ? $value['goods_img_id'] : $value['goods_image_id'];
if ($goods_img_id) {
$value['goods_image'] = $ImageGalleryModel->getFieldPath(['id' => $goods_img_id]);
}
}
}
return callBack(statusCode()['success'], $list['list'] ? '商品获取成功' : '暂无数据', [
'list' => $list['list'] ? $list['list'] : [],
'count' => $list['count'],
]);
}
/**
* 删除商品与标签的绑定关系
*/
public function delLinkGoods($param)
{
$verify = $this->publicVerifyParam($param);
if ($verify['status'] == 0) {
return $verify;
}
if (!$param['ids']) {
return callBack(statusCode()['error'], '缺少必要参数');
}
$idArr = explode(',', $param['ids']);
$GoodsLabelLinkModel = new GoodsLabelLinkModel();
$MGoodsLabelLinkModel = new MGoodsLabelLinkModel();
$Model = $param['operate_type'] == 1 ? $MGoodsLabelLinkModel : $GoodsLabelLinkModel;
$successNum = 0;
foreach ($idArr as $id) {
$delRes = $Model->deleteOrder(['id' => $id]);
if ($delRes) {
$successNum++;
}
}
if (count($idArr) == $successNum) {
return callBack(statusCode()['success'], '标签商品删除成功');
} else if ($successNum == 0) {
return callBack(statusCode()['error'], '标签商品删除失败');
}
}
/**
* 获取商品绑定标签列表
* @param goods_id 商品id
* @param user_type 类型 1商户 2门店
* @return array
*/
public function getGoodsLabel($param)
{
$goods_id = $param['goods_id'];
$user_type = $param['user_type'];
$merchant_id = $param['merchant_id'];
if (!$merchant_id) {
return callBack(statusCode()['error'], '缺少商户ID');
}
if (!$goods_id || !$user_type) {
return callBack(statusCode()['error'], '缺少必要参数');
}
$where = [
'merchant_id' => $merchant_id,
'goods_id' => $goods_id,
];
switch ($user_type) {
case 1:
$Model = new MGoodsLabelLinkModel();
break;
case 2:
$Model = new GoodsLabelLinkModel();
$where['store_id'] = $param['store_id'];
break;
}
$list = $Model->getFindField($where, 'label_id', true);
$data = [];
$LabelModel = new LabelInventoryModel();
foreach ($list as $id) {
$data[] = $LabelModel->getFind(['id' => $id], 'id,name,industry_id');
}
return callBack(statusCode()['success'], !empty($data) ? '获取成功' : '暂无数据', [
'list' => $data ? $data : []
]);
}
/**
* 保存商品选择的多个标签
* @param goods_id 商品id
* @param label_ids 标签数组
* @param user_type 类型 1商户 2门店
* @param operate_id 操作人员id
* @return array
*/
public function addGoodsLabelLink($param)
{
$label_ids = json_decode($param['label_ids'], true);
if (!$param['merchant_id']) {
return callBack(statusCode()['error'], '缺少商户ID');
}
if (!isset($label_ids) || !$param['user_type'] || !$param['goods_id']) {
return callBack(statusCode()['error'], '缺少必要参数');
}
$oldLabelMap = [
'merchant_id' => $param['merchant_id'],
'goods_id' => $param['goods_id'],
];
// 新增label数组
$addLabelData = [
'goods_id' => $param['goods_id'],
'merchant_id' => $param['merchant_id'],
'add_time' => $_SERVER['REQUEST_TIME'],
'operate_id' => $param['operate_id'],
];
// 删除label数组
$delLabelMap = [
'goods_id' => $param['goods_id'],
'merchant_id' => $param['merchant_id'],
];
switch ($param['user_type']) {
case 1:
$Model = new MGoodsLabelLinkModel();
break;
case 2:
$Model = new GoodsLabelLinkModel();
$oldLabelMap['store_id'] = $param['store_id'];
$addLabelData['store_id'] = $param['store_id'];
$delLabelMap['store_id'] = $param['store_id'];
break;
}
//获取该商品在数据库中已绑定的标签id列表
$oldLabelIdArr = $Model->getFindField($oldLabelMap, 'label_id', true);
$oldLabelIdArr = $oldLabelIdArr ? $oldLabelIdArr : [];
//判断是否需要删除多余的标签
$addLabelId = array_diff($oldLabelIdArr, $label_ids);
// 存在差异 需要删除
$successCount = 0;//修改成功的次数
if ($addLabelId) {
$delLabelMap['label_id'] = ['in', $addLabelId];
$del = $Model->deleteOrder($delLabelMap); //删除
if ($del) {
$successCount++;
}
}
//判断是否需要新增标签绑定关系
$addLabelId = array_diff($label_ids, $oldLabelIdArr);
// 存在差异 需要新增
if ($addLabelId) {
foreach ($addLabelId as $id) {
$addLabelData['label_id'] = $id;
$add = $Model->addOrder($addLabelData); //新增
if ($add) {
$successCount++;
}
}
}
if ($successCount > 0 && $param['user_type'] == 1) {
$OperateMGoods = new OperateMGoods();
//修改门店商品档案的更新状态
$OperateMGoods->updateStoreGoodsSyncState($param['goods_id']);
}
return callBack(statusCode()['success'], '保存商品标签成功');
}
/**
* 验证批量修改商品分类
* @param $param
* $param['merchant_id'] 商户ID
* $param['store_id'] 门店ID
* $param['class_id'] 分类ID
* $param['goods_ids'] 商品ID字符串列表
* $param['operate_type'] 用户类型 1商户 2门店
* @return array
*/
public function verifyGoodsChangeClass($param)
{
if (empty($param['operate_type'])
|| empty($param['class_id']) || empty($param['goods_ids'])
|| empty($param['merchant_id'])
|| !in_array($param['operate_type'], ['1', '2'])
|| $param['operate_type'] == 2 && empty($param['store_id'])) {
return callBack(statusCode()['error'], '缺少参数');
}
$ClassModel = new RetailGoodsClassModel();
$cMap = [
'merchant_id' => $param['merchant_id'],
'id' => $param['class_id'],
'status' => 0,
];
$class = $ClassModel->getFind($cMap, 'id,industry_id');
if (empty($class)) {
return callBack(statusCode()['error'], '分类不存在');
}
if ($class['industry_id'] == 0) {
return callBack(statusCode()['success'], '验证成功');
}
switch ($param['operate_type']) {
case '1':
//商户
$Model = M('mgoods_label_link as lg');
$goods = 'ls_retail_mgoods';
$fields = 'g.good_number as goods_number';
break;
case '2':
//门店
$Model = M('goods_label_link as lg');
$goods = 'ls_retail_goods';
$fields = 'g.goods_number';
break;
}
//获取所有与分类互斥的标签绑定的商品列表
$map = [
'lg.goods_id' => ['in', $param['goods_ids']],
'l.industry_id' => ['not in', [0, $class['industry_id']]],
];
$fields .= ',goods_name,g.id,g.goods_code,l.name,lg.label_id,l.industry_id';
$errGoods = $Model->join('ls_label_inventory as l on l.id=lg.label_id')
->join($goods . ' as g on g.id=lg.goods_id')
->where($map)->field($fields)->select();
if (!empty($errGoods)) {
$data = [];
$ids = [];
foreach ($errGoods as $val) {
$label = ['id' => $val['label_id'], 'name' => $val['name'], 'industry_id' => $val['industry_id']];
if (!isset($ids[$val['id']])) {
$ids[$val['id']] = count($ids);
$data[$ids[$val['id']]] = [
'id' => $val['id'],
'goods_name' => $val['goods_name'],
'goods_number' => $val['goods_number'],
'goods_code' => $val['goods_code'],
'label' => [$label],
];
} else {
$data[$ids[$val['id']]]['label'][] = $label;
}
}
return callBack(statusCode()['error'], '以下已选商品的标签与所选的分类不属于同一行业', $data);
} else {
return callBack(statusCode()['success'], '验证成功');
}
}
/**
* 公共验证标签请求参数
* @param $param
* @return mixed
*/
private function publicVerifyParam($param)
{
if (empty($param['merchant_id'])) {
return callBack(statusCode()['error'], '缺少商户ID');
}
if (empty($param['operate_id'])) {
return callBack(statusCode()['error'], '缺少操作者ID');
}
if (!$param['operate_type'] || !in_array($param['operate_type'], [1, 2])) {
return callBack(statusCode()['error'], '缺少场景参数');
}
if ($param['operate_type'] == 2 && empty($param['store_id'])) {
return callBack(statusCode()['error'], '缺少门店ID');
}
return callBack(statusCode()['success'], '参数验证成功');
}
}