ajaxReturn(['status' => 0, 'msg' => '缺少必要参数']); } $this->userTypeVerify(I('post.user_type'), I('post.operator_id'), 5); $param = [ 'platform_type' => I('post.platform_type') ? I('post.platform_type') : 1, 'page' => I('post.page') ? I('post.page') : 1, 'limit' => I('post.limit') ? I('post.limit') : 10, // 按照商品类别搜索 'person1' => I('post.person1'), 'person2' => I('post.person2'), 'person3' => I('post.person3'), 'keyword' => I('post.keyword'), //搜索关键词 'need_img' => I('post.need_img') ? I('post.need_img') : true, //是否需要图片 true false 'need_goods_num' => I('post.need_goods_num') ? I('post.need_goods_num') : true, //是否需要库存 'need_count' => I('post.need_count') ? I('post.need_count') : false, //是否需要总数量 'keyword_type' => I('post.keyword_type'), //关键词搜索类型 1货号 2条码 3名称 'order_type' => I("post.order_type"), //排序规则 'condition_name' => I("post.condition_name"), //排序规则关键词 'status' => I("post.status"), //状态 // 'recovery_type' => I('post.recovery_type'), //2回收站 'attribute_state' => I('post.attribute_state'), //规格 1无规格 2规格 ]; if ($managerType == 3) { $param['merchant_id'] = I('post.merchant_id'); $param['can_exchange_weigh'] = I('post.pricing_method'); // 该商品是否称重计价 1:不称重 2:称重 $param['issellonline'] = I('post.online_state'); // 商城出售状态 $OperateMGoods = new OperateMGoods(); $result = $OperateMGoods->getMerGoodsList($param); } else { $global_store_jurisdiction = M('retail_store_jurisdiction')->field('showpurch_price')->where(['storeid' => I('post.store_id')])->find(); $param['store_id'] = I('post.store_id'); $param['showpurch_price'] = $global_store_jurisdiction['showpurch_price']; //进价查看权限 $param['identity'] = 2; //用户身份 1商户2门店 $param['online_state'] = I('post.online_state'); // 是否在商城中出售:0,不在,1,在商城出售。 $param['pricing_method'] = I('post.pricing_method'); // 该商品是否称重计价 1:不称重 2:称重 $param['status'] = I('post.status'); $param['advance_sale_status'] = I('post.advance_sale_status'); $SkuGoodsViewModel = new SkuGoodsViewModel(); $result = $SkuGoodsViewModel->getGoodsList($param); } $this->ajaxReturn($result); } /** * 批量操作 * 2020年12月18日14:54:26 * @param goodsIds 商品id数组 * @param managerType 类型 3商户 4门店 * @param key 操作键名 * @param value 操作键值 * @param user_type 登录角色类型 1商户 2店长 3收银员 */ public function batchOperateGoods() { $key = I('post.key'); $value = json_decode(I('post.value'), true); $goodsIds = json_decode(I('post.goodsIds'), true); $type = I('post.managerType'); $operate_id = I('post.operator_id'); if (!in_array($type, [3, 4]) || empty($goodsIds) || !$key || (!isset($value) & $value === '')) { $this->ajaxReturn(callBack(statusCode()['error'], "缺少重要参数")); } $this->userTypeVerify(I('post.user_type'), I('post.operator_id'), 4); $param = [ 'merchant_id' => I('post.merchant_id'), 'user_type' => $type, 'operate_id' => $operate_id, 'key' => $key, 'value' => $value, 'goodsIds' => $goodsIds, 'delivery_template_id' => I('post.delivery_template_id'), ]; if ($type == 3) { $OperateMGoods = new OperateMGoods(); $result = $OperateMGoods->batchOperateGoods($param); } else { $OperateGoods = new OperateGoods(); $param['store_id'] = I('post.store_id'); $result = $OperateGoods->batchOperateGoods($param); } if ($result['status'] == 1) { $sysParam = [ 'postInfo' => I('post.'), 'operate_id' => $operate_id, ]; $desc = $this->keyChangeDesc($param['key']); $this->addSysLog($sysParam, $type, $desc); } $this->ajaxReturn($result); } /** * 添加/编辑商品 * 2020年12月18日16:39:39 * @param managerType 类型 3商户 4门店 * @param user_type 登录角色类型 1商户 2店长 3收银员 * @param operate_id 操作人员id */ public function operateGoodsInfo() { $managerType = I('post.managerType'); if (!$managerType || !in_array($managerType, [3, 4])) { $this->ajaxReturn(callBack(statusCode()['error'], "缺少必要参数")); } $param = [ 'merchant_id' => I('post.merchant_id'), 'platform_type' => I('post.platform_type'), 'goodsInfo' => I('post.'), 'operate_source' => 1, ]; // 公共参数json处理 $param = $this->paramChange($param, 5); if (!$param['goodsInfo']['id']) { // 判断添加权限 $this->userTypeVerify(I('post.user_type'), I('post.operator_id'), 1); } else { // 判断编辑权限 $this->userTypeVerify(I('post.user_type'), I('post.operator_id'), 2); } switch ($managerType) { case 3: // 商户 $OperateGoodsApi = new OperateMGoods(I('post.merchant_id')); $param['user_type'] = 3; // 商户参数处理 $param = $this->paramChange($param, 3); $editGoods = $OperateGoodsApi->editMerchantGoods($param); break; case 4: $OperateGoodsApi = new OperateGoods(); // 门店 $param['user_type'] = 4; $param['store_id'] = I('post.store_id'); $param['operate_id'] = I('post.operator_id'); $editGoods = $OperateGoodsApi->editStoreGoods($param); break; } if ($editGoods['status'] == 1) { $sysParam = [ 'postInfo' => I('post.'), 'operate_id' => I('post.operator_id'), ]; $msg = $param['goodsInfo']['id'] ? '设置-修改商品' : '设置-添加商品'; $this->addSysLog($sysParam, $managerType, $msg); } $this->ajaxReturn($editGoods); } /** * 获取商品详情 * 2021年1月27日10:53:02 * @param managerType 类型 3商户 4门店 * @param merchant_id 商户id * @param goods_id 商品id * @param store_id 门店id */ public function getGoodsInfo() { $managerType = I('post.managerType'); $param['merchant_id'] = I('post.merchant_id'); $param['goods_id'] = I('post.goods_id'); if (!$managerType) { $this->ajaxReturn(['status' => 0, 'msg' => '缺少必要参数']); } switch ($managerType) { case 3: $OperateGoodsApi = new OperateMGoods(I('post.merchant_id')); $result = $OperateGoodsApi->getMGoodsDetails($param); $result = $this->paramChange($result, 4); break; case 4: $OperateGoodsApi = new OperateGoods(); $param['store_id'] = I('post.store_id'); $result = $OperateGoodsApi->getGoodsDetails($param); break; } $this->ajaxReturn($result); } /** * 获取商品规格信息 * 2021年1月27日10:57:58 * @param managerType 类型 3商户 4门店 * @param goods_id 商品id * @param merchant_id 商户id * @param store_id 门店id * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getGoodsSkuAttr() { $managerType = I('post.managerType'); $goods_id = I('post.goods_id'); $SkuAttribute = new SkuAttribute(); $param = [ 'merchant_id' => I('post.merchant_id'), 'goods_id' => $goods_id, ]; if (!$goods_id || !$managerType || !$param['merchant_id']) { $this->ajaxReturn(['status' => 0, 'msg' => '缺少必要参数']); } switch ($managerType) { case 3: $result = $SkuAttribute->getMerGoodsSkuInfo($param); break; case 4: $param['store_id'] = I('post.store_id'); if (!$param['store_id']) { $this->ajaxReturn(['status' => 0, 'msg' => '缺少门店id']); } $result = $SkuAttribute->getStoreGoodsSkuInfo($param); break; } $this->ajaxReturn($result); } /** * 门店/商户删除商品档案 * 2020年12月19日17:21:10 * @param ids 商品id数组 * @param managerType 类型 3商户 4门店 * @param user_type 登录角色类型 1商户 2店长 3收银员 */ public function delGoodsInfo() { $ids = json_decode(I('post.ids'), true); $managerType = I('post.managerType'); if (empty($ids) || !$managerType) { $this->ajaxReturn(['status' => 0, 'msg' => '缺少必要参数']); } $this->userTypeVerify(I('post.user_type'), I('post.operator_id'), 3); switch ($managerType) { case 3: // 商户 $result = $this->delMgoodsOperate($ids); break; case 4: // 门店 $result = $this->delGoodsOperate($ids); break; } if ($result['status'] == 1) { $sysParam = [ 'postInfo' => I('post.'), 'operate_id' => I('post.operator_id'), ]; $this->addSysLog($sysParam, $managerType, '设置-删除商品'); } $this->ajaxReturn($result); } /** * 门店获取用来使用的供货商列表 */ public function getUsedSupplierList() { $SupplierApi = new \Common\User\Supplier(); $data = $SupplierApi->getStoreUsedSupplierList(I('post.store_id')); $this->ajaxReturn([ 'status' => 1, 'msg' => $data ? '获取成功' : '暂无数据', 'data' => $data ? $data : [], ]); } /** * 新增、编辑商品处获取规格供选择 * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getSkuAttr() { $SkuAttribute = new SkuAttribute(); $this->ajaxReturn($SkuAttribute->getSkuAttr(I('post.merchant_id'))); } /** * 获取商户商品积分限制设置 */ public function getEditMGoodsBaseSet() { $user_type = I('post.user_type'); switch ($user_type) { case '1': //商户 $OperateMGoodsApi = new OperateMGoods(I('post.merchant_id')); $config = $OperateMGoodsApi->getEditGoodsConfig(); break; case '2': case '3': //门店 收银员 $OperateGoodsApi = new OperateGoods(); $config = $OperateGoodsApi->getEditGoodsConfig([ 'user_type' => 4, 'merchant_id' => I('post.merchant_id'), 'store_id' => I('post.store_id'), ]); //门店 break; } $this->ajaxReturn([ 'status' => 1, 'msg' => '获取成功', 'data' => $config, ]); } /** * 获取品牌库下拉选择 * @param name 品牌库名字 */ public function getSelectBrand() { $Brand = new Brand(); $this->ajaxReturn($Brand->getSelectBrand([ 'merchant_id' => I('post.merchant_id'), 'name' => I('post.name'), ])); } /** * 获取商品标签供选择 */ public function getGoodsLabelList() { $LabelModel = new GoodsLabelModel(); $map = array( 'storeid' => I('post.store_id'), ); $data = $LabelModel->getSelect($map, 'id,label_name as name'); $this->ajaxReturn(callBack(statusCode()['success'], $data ? '获取成功' : '暂无标签', [ 'list' => $data ? $data : [], ])); } /** * 获取商品产地供选择 */ public function getGoodsYieldlyList() { $YieldlyApi = new Yieldly(); $data = $YieldlyApi->getUsedGoodsYieldlyList(I('post.merchant_id')); $this->ajaxReturn([ 'status' => 1, 'msg' => $data ? '获取成功' : '暂无标签', 'data' => $data ? $data : [], ]); } /** * 获取商户分类 */ public function getGoodsClass() { $ClassApi = new GoodsClassify(); $param = [ 'pid' => I('post.pid'), 'merchant_id' => I('post.merchant_id'), ]; $data = $ClassApi->getAbsolutelyGoodsClass($param); $this->ajaxReturn([ 'status' => 1, 'msg' => $data ? '获取成功' : '暂无分类', 'data' => $data ? $data : [], ]); } /** * 获取发货模板 */ public function getStoreFreightTem() { $DeliveryTemplateModel = new DeliveryTemplateModel(); $data = $DeliveryTemplateModel->getStoreFreightTem(I('post.store_id')); $this->ajaxReturn([ 'status' => 1, 'msg' => $data ? '获取成功' : '暂无数据', 'data' => $data ? $data : [], ]); } /** * 获取单位列表-筛选 * @param name * @param merchant_id 商户id * @param store_id 门店id * @param managerType 3商户 4门店 */ public function getUnitSelect() { $UnitLibrary = new UnitLibrary(); $result = $UnitLibrary->getUnitSelect([ 'merchant_id' => I('post.merchant_id'), 'store_id' => I('post.store_id'), 'name' => I('post.name'), 'type' => I('post.managerType') == 3 ? 1 : 2, ]); $this->ajaxReturn($result); } /** * 添加商品图片/视频 * @param fileType 文件类型 1图片 2视频 * @param user_type 登录类型 1商户 2门店 3收银员 * @param operate_id 操作人员id */ public function addGoodsImage() { if (!$_FILES) { $this->ajaxReturn(['status' => 0, 'msg' => '未上传文件']); } $fileType = I('post.fileType'); if (!in_array($fileType, ['1', '2'])) { $this->ajaxReturn(['status' => 0, 'msg' => '请选择文件类型']); } $user_type = I('post.user_type'); switch ($user_type) { case 1: // 商户 $user_real_type = 3; break; case 2: // 门店 $user_real_type = 4; break; case 3: // 收银员 $user_real_type = 5; break; } if (!$user_real_type) $this->ajaxReturn(['status' => 0, 'msg' => '缺少必要参数']); $item = [ 'add_time' => time(), 'user_type' => $user_real_type, 'user_id' => I('post.operator_id'), 'type' => $fileType == 2 ? 2 : 1, 'limit_size' => $fileType == 1 ? 1048576 : 10485760,//1M = 1024*1024 = 1048576 'merchant_id' => I('post.merchant_id'), ]; if (in_array($user_real_type, [4, 5])) { $item['from_type_id'] = 28; // 门店商品图片 $item['store_id'] = I('post.store_id'); } else { $item['from_type_id'] = 19; // 商户商品图片 } $UploadImageClassModel = new UploadImageClassModel(); $directory = $UploadImageClassModel->getFindField(['id' => $item['from_type_id']], 'directory'); $item['localUrl'] = $directory; $uploads = uploadFiles($item); if (!empty($uploads['file'])) { $result = ['status' => 1, 'msg' => '上传成功', 'image_id' => $uploads['file']['id'], 'access_path' => $uploads['file']['access_path']]; } else { $result = ['status' => 0, 'msg' => $uploads['msg']]; } $this->ajaxReturn($result); } /** * 删除商品图片/视频 * @param id 图片/视频id */ public function delGoodsImage() { $id = I('post.id'); if (!$id) { $this->ajaxReturn(['status' => 0, 'msg' => '缺少必要参数']); } $ImageGalleryModel = new \Common\Model\ImageGalleryModel(); $file = $ImageGalleryModel->getFind(['id' => $id]); if (empty($file)) { $this->ajaxReturn(['status' => 0, 'msg' => '图片不存在']); } $result = deleteUploadFile([$file], ''); $this->ajaxReturn($result); } /** * 添加商品标签绑定 * @param label_ids 标签ID数组以逗号拼接 * @param goods_id 商品id * @param merchant_id 商户id * @param store_id 门店id * @param operator_id 操作人员id * @param user_type 3商户 4门店 */ public function addGoodsLabelLink() { $param = I('post.'); $param['goods_id'] = I('post.goods_id'); $param['label_ids'] = I('post.label_ids'); $param['user_type'] = I('post.user_type'); $param['merchant_id'] = I('post.merchant_id'); $param['store_id'] = I('post.store_id'); $param['operate_id'] = I('post.operate_id'); $LabelInventory = new LabelInventory(); $this->ajaxReturn($LabelInventory->addGoodsLabelLink($param)); } /* ---------------------------------------------私用函数处理--------------------------------------------------- */ /** * @param param 参数 * @param type 类型 * [ * 3商户 => 门店 * 4门店 => 商户 * 5公共 * ] */ private function paramChange(&$param, $type = 3) { switch ($type) { case 3: $param['goodsInfo']['issellonline'] = $param['goodsInfo']['online_state']; //是否在商城中出售 $param['goodsInfo']['can_exchange_weigh'] = $param['goodsInfo']['pricing_method']; //是否称重 $param['goodsInfo']['good_number'] = $param['goodsInfo']['goods_number']; //商品货号 $param['goodsInfo']['purch_price'] = $param['goodsInfo']['purchase_price']; //商品进价 $param['goodsInfo']['attribute'] = $param['goodsInfo']['attribute_state']; //是否开启sku $param['goodsInfo']['goods_image_id'] = $param['goodsInfo']['goods_img_id']; //封面图 unset($param['goodsInfo']['online_state'], $param['goodsInfo']['pricing_method'], $param['goodsInfo']['goods_number'], $param['goodsInfo']['purchase_price'], $param['goodsInfo']['attribute_state'], $param['goodsInfo']['goods_img_id']); break; case 4: $param['data']['goods']['online_state'] = $param['data']['goods']['issellonline']; //是否在商城中出售 $param['data']['goods']['pricing_method'] = $param['data']['goods']['can_exchange_weigh']; //是否称重 $param['data']['goods']['goods_number'] = $param['data']['goods']['good_number']; //商品货号 $param['data']['goods']['purchase_price'] = $param['data']['goods']['purch_price']; //商品进价 $param['data']['goods']['attribute_state'] = $param['data']['goods']['attribute']; //是否开启sku $param['data']['goods']['goods_img_id'] = $param['data']['goods']['goods_image_id']; //封面图 unset($param['data']['goods']['issellonline'], $param['data']['goods']['can_exchange_weigh'], $param['data']['goods']['good_number'], $param['data']['goods']['purch_price'], $param['data']['goods']['attribute'], $param['data']['goods']['goods_image_id']); break; case 5: $param['goodsInfo']['delivery_type'] = json_decode($param['goodsInfo']['delivery_type'], true); //配送方式 $param['goodsInfo']['bannerList'] = json_decode($param['goodsInfo']['bannerList'], true); //轮播图 break; } return $param; } /** * 日志描述转化 * @param key 操作参数 */ private function keyChangeDesc($key) { switch ($key) { case 'status': $desc = '设置-商品状态设置'; break; case 'retail_state': $desc = '设置-商品店内出售设置'; break; case 'online_state': $desc = '设置-商品商城出售设置'; break; case 'vip_retail_state': $desc = '设置-线下会员打折设置'; break; case 'vip_online_state': $desc = '设置-会员打折设置'; break; case 'goods_class_id': $desc = '设置-商品所属类别设置'; break; case 'guide_royalty_state': $desc = '设置-商品提成设置'; break; } return $desc; } /** * 添加日志 * @param param [ * postInfo post参数 * operate_id 操作人员id * ] * @param type 3 商户 4 门店 * @param msg 操作描述 */ private function addSysLog($param, $type, $msg) { $type_name = $type == 3 ? '商户' : '门店'; $desc = $type_name . $msg; $log_data = [ 'source' => 1, 'desc' => $desc, 'type' => $type, 'request_data' => json_encode($param['postInfo']), 'operator_id' => $param['operate_id'], 'mer_id' => $param['postInfo']['merchant_id'], ]; action_log_v2($log_data); } /** * 删除商户商品 */ private function delMgoodsOperate($ids) { // 验证商品信息 防止传假数据 $verifyRes = $this->verifyGoodsInfo($ids, 3); if (!$verifyRes) { return ['status' => 0, 'msg' => '请选择正确数据']; } $RetailMgoodsModel = new RetailMgoodsModel(); $defeatArr = []; $success = 0; $totalNum = count($ids); foreach ($ids as $id) { $goodsInfo = $RetailMgoodsModel->getFind(['id' => $id], 'goods_name,attribute'); $updateRes = $RetailMgoodsModel->updateOrder(['id' => $id], ['status' => 2]); if (!$updateRes) { $defeatArr[] = '商品【' . $goodsInfo['goods_name'] . '】删除失败'; } else { if ($goodsInfo['attribute'] == 2) { //规格商品规格状态修改 M('retail_sku_mgoods')->where(['mgoods_id' => $id])->setField('state', 1); } $updateDataRes = D('SaleMGoods')->updateData(['goods_id' => $id], ['status' => 2]); if ($updateDataRes) { $success++; } } } if ($success < $totalNum) { return ['status' => 0, 'msg' => '商品删除失败']; } else if ($success == $totalNum) { return ['status' => 1, 'msg' => '商品删除成功']; } } /** * 删除门店商品 */ private function delGoodsOperate($ids) { // 验证商品信息 防止传假数据 $verifyRes = $this->verifyGoodsInfo($ids, 4); if (!$verifyRes) { return ['status' => 0, 'msg' => '请选择正确数据']; } $RetailGoodsModel = new RetailGoodsModel(); $save = $RetailGoodsModel->updateOrder(['id' => ['in', $ids]], ['status' => 2]); if ($save) { $map = ['goods_id' => ['in', $ids]]; // 促销商品 M("retail_host")->where($map)->delete(); // 规格删除 M('retail_sku_goods')->where($map)->save(['state' => 1]); $updateDataRes = D('SSaleMGoods')->updateData($map, ['status' => 2]); if ($updateDataRes) { return ['status' => 1, 'msg' => '商品删除成功']; } else { return ['status' => 1, 'msg' => '商品删除成功,商品库存删除失败']; } } else { return ['status' => 0, 'msg' => '商品删除失败']; } } /** * 验证商品是否存在,防止传假数据 * @param ids id数组 * @param type 类型 3商户 4门店 */ private function verifyGoodsInfo($ids, $type) { switch ($type) { case 3: $Model = new RetailMgoodsModel(); break; case 4: $Model = new RetailGoodsModel(); break; } $totalNum = count($ids); $goodsInfo = $Model->getFindField(['id' => ['in', $ids]], 'goods_name', true); if ($totalNum == count($goodsInfo)) { return true; } else { return false; } } /** * 验证当前登录人员身份 * @param user_type 1商户 2门店 3收银员 * @param type [ * 1 添加商品 * 2 编辑商品 * 3 删除商品 * 4 批量修改商品 * 5 商品管理权限 * ] */ private function userTypeVerify($user_type, $cashier_id = 0, $type) { if (!$user_type || !$type) { $this->ajaxReturn(['status' => 0, 'msg' => '缺少必要参数']); } $RetailCashierModel = new RetailCashierModel(); switch ($user_type) { case 1: case 2: return true; break; case 3: if (!$cashier_id) { $this->ajaxReturn(['status' => 0, 'msg' => '缺少收银员id']); } switch ($type) { case 1: $hasAuthorize = $RetailCashierModel->getFindField(['id' => $cashier_id], 'cashier_add_goods'); if ($hasAuthorize != 1) { $this->ajaxReturn(['status' => 0, 'msg' => '该收银员暂无添加商品权限']); } break; case 2: $hasAuthorize = $RetailCashierModel->getFind(['id' => $cashier_id], 'goods_manage_edit,is_goods_manage'); if ($hasAuthorize['goods_manage_edit'] != 1 || $hasAuthorize['is_goods_manage'] != 1) { $this->ajaxReturn(['status' => 0, 'msg' => '该收银员暂无编辑商品权限']); } break; case 3: $hasAuthorize = $RetailCashierModel->getFind(['id' => $cashier_id], 'goods_manage_del,is_goods_manage'); if ($hasAuthorize['goods_manage_del'] != 1 || $hasAuthorize['is_goods_manage'] != 1) { $this->ajaxReturn(['status' => 0, 'msg' => '该收银员暂无删除商品权限']); } break; case 4: $hasAuthorize = $RetailCashierModel->getFind(['id' => $cashier_id], 'goods_manage_operate,is_goods_manage'); if ($hasAuthorize['goods_manage_operate'] != 1 || $hasAuthorize['is_goods_manage'] != 1) { $this->ajaxReturn(['status' => 0, 'msg' => '该收银员暂无批量修改商品权限']); } break; case 5: $hasAuthorize = $RetailCashierModel->getFindField(['id' => $cashier_id], 'is_goods_manage'); if ($hasAuthorize != 1) { $this->ajaxReturn(['status' => 0, 'msg' => '该收银员暂无商品管理权限']); } break; default: $this->ajaxReturn(['status' => 0, 'msg' => '缺少必要参数']); break; } return true; break; default: $this->ajaxReturn(['status' => 0, 'msg' => '缺少必要参数']); break; } } }