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'], '参数验证成功'); } }