$mall_id], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]] ]; if (!empty($params['goods_name'])) { $where[] = ['like', 'goods_name', $params['goods_name']]; } if (!empty($params['cate_id'])) { $where[] = ['cate_one' => $params['cate_id']]; } if (isset($params['imported']) && $params['imported'] !== '') { switch ($params['imported']) { case 1: $where[] = ['>', 'goods_id' , 0]; break; case 0: $where[] = ['=', 'goods_id' , 0]; break; } } $ret = QiShangTongGoods::listPage([ 'where' => $where, 'limit' => $params['limit'] ?? 10, 'order' => 'id desc', 'with' => ['cateOne', 'cateTwo'] ]); if (!empty(QiShangTongGoods::getStaticError())) return QiShangTongGoods::getStaticError(); if (!empty($ret['list'])) { $rate = MallService::rate($mall_id); foreach ($ret['list'] as &$item) { $item['content'] = Json::decode($item['content']); $item['retail_price'] = bcmul($rate, $item['retail_price'], 2); $item['retail_price1'] = bcmul($rate, $item['retail_price'], 2); $item['gonghuojia'] = bcmul($rate, $item['gonghuojia'], 2); $item['gonghuojia1'] = bcmul($rate, $item['gonghuojia'], 2); $item['price'] = bcmul($rate, $item['price'], 2); $item['price1'] = bcmul($rate, $item['price'], 2); } } return $ret; } public function thirdPage(int $mall_id, array $params) { try { $contentModel = new GoodsSelectedListModel(); if (!empty($params['page'])) $contentModel->page = $params['page']; if (!empty($params['limit'])) $contentModel->limit = $params['limit']; if (!empty($params['goods_name'])) $contentModel->goods_name = $params['goods_name']; if (!empty($params['goods_id'])) $contentModel->goods_id = $params['goods_id']; if (!empty($params['order'])) $contentModel->order = $params['order']; if (!empty($params['cate_id'])) $contentModel->cate_id_1 = $params['cate_id']; if (!empty($params['cate_id_2'])) $contentModel->cate_id_2 = $params['cate_id_2']; if (!empty($params['brand_id'])) $contentModel->brand_id = $params['brand_id']; if (!empty($params['lowprice'])) $contentModel->lowprice = $params['lowprice']; if (!empty($params['highprice'])) $contentModel->highprice = $params['highprice']; if (!empty($params['sort_type']) && !empty($params['sort'])) { // 默认最新 1、价格高到低 2、价格低到高 3、最新上架 4、修改时间 5、商品最后上下时间 $order_map = [ "price_desc" => 1, "price_asc" => 2, "time_desc" => 3, "time_asc" => 4, ]; $contentModel->order = $order_map["{$params['sort_type']}_{$params['sort']}"] ?? 1; } return RequestHelper::send(new GoodsSelectedListRequest(), $contentModel, $mall_id); } catch (\Exception $e) { return $e->getMessage(); } } /** * 总数 * @param int $mall_id * @param array $params * @return array|string */ public function thirdCount(int $mall_id, array $params) { try { $contentModel = new GoodsTotalModel(); if (!empty($params['goods_name'])) $contentModel->goods_name = $params['goods_name']; if (!empty($params['goods_id'])) $contentModel->goods_id = $params['goods_id']; if (!empty($params['order'])) $contentModel->order = $params['order']; if (!empty($params['cate_id_1'])) $contentModel->cate_id_1 = $params['cate_id_1']; if (!empty($params['cate_id_2'])) $contentModel->cate_id_2 = $params['cate_id_2']; if (!empty($params['brand_id'])) $contentModel->brand_id = $params['brand_id']; if (!empty($params['lowprice'])) $contentModel->lowprice = $params['lowprice']; if (!empty($params['highprice'])) $contentModel->highprice = $params['highprice']; return RequestHelper::send(new GoodsTotalRequest(), $contentModel, $mall_id); } catch (\Exception $e) { return $e->getMessage(); } } public function localPage(int $mall_id, array $params) { $where = [ ['mall_id' => $mall_id], ['status' => StatusEnum::ENABLED] ]; if (!empty($params['goods_name'])) { $where[] = ['like', 'goods_name', $params['goods_name']]; } if (!empty($params['cate_id'])) { $where[] = ['cate_one' => $params['cate_id']]; } $order = 'id desc'; if (!empty($params['sort']) && !empty($params['sort_type'])) { switch ($params['sort_type']) { case 'time': $order = "created_at {$params['sort']}"; break; case 'price': $order = "price {$params['sort']}"; break; } } $ret = QiShangTongGoods::listPage([ 'where' => $where, 'order' => $order, 'limit' => $params['limit'] ?? 18 ]); if (!empty(QiShangTongGoods::getStaticError())) return QiShangTongGoods::getStaticError(); if (!empty($ret['list'])) { foreach ($ret['list'] as &$item) { // 供货价,商品价格,建议零售价格 $item['goods_id'] = $item['third_goods_id']; } } return $ret; } /** * 批量导入 * @param int $mall_id * @param array $goods * @return string|true */ public function batchImport(int $mall_id, array $goods) { $list = []; $ids = []; $t_ids = array_column($goods, 'goods_id'); $t_ids = QiShangTongGoods::find()->where(['mall_id' => $mall_id]) ->andWhere(['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]) ->andWhere(['third_goods_id' => $t_ids]) ->select('third_goods_id') ->column(); foreach ($goods as $good) { if (in_array($good['goods_id'], $t_ids)) continue; $list[] = [ 'created_at' => time(), 'updated_at' => time(), 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'third_goods_id'=> $good['goods_id'], 'goods_name' => $good['goods_name'], 'gonghuojia' => $good['gonghuojia'], 'retail_price' => $good['retail_price'], 'price' => $good['price'], 'default_image' => $good['default_image'], ]; $ids[] = $good['goods_id']; } try { if (!empty($list)) { $t = \Yii::$app->db->beginTransaction(); try { QiShangTongGoods::find()->createCommand()->batchInsert(QiShangTongGoods::tableName(), array_keys($list[0]), $list)->execute(); QiShangTongGoods::updateAll(['can_sale' => StatusEnum::ENABLED], ['and', ['third_goods_id' => $ids], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]]); // 改成可售状态 $query = QiShangTongGoods::find() ->where(['third_goods_id' => $ids]) ->andWhere(['>', 'goods_id', 0]); if (!SettingService::isMasterMall($mall_id)) { $query->andWhere(['mall_id' => $mall_id]); } $gids = $query->select('goods_id')->column(); Goods::updateAll(['is_on_sale' => StatusEnum::ENABLED], ['id' => $gids]); // 上架 $t->commit(); } catch (\Exception $e) { $t->rollBack(); return $e->getMessage(); } foreach ($ids as $id) { \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, [ 'mall_id' => $mall_id, 'goods_id' => $id ], self::class, 'asyncGoodsDetail'); // $this->asyncGoodsDetail(['mall_id' => $mall_id, 'goods_id' => $id]); } } } catch (\Exception $e) { return $e->getMessage(); } return true; } /** * 同步商品详情 * @param array $data * @return bool */ public function asyncGoodsDetail(array $data) { try { $resp = $this->detail($data['mall_id'], $data['goods_id']); /** * @var $goods QiShangTongGoods */ $goods = QiShangTongGoods::getOne([ ['mall_id' => $data['mall_id']], ['third_goods_id' => $data['goods_id']], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]], ]); if (empty($goods)) throw new \Exception("商品不存在{$data['goods_id']}"); $goods->cate_one = $resp['goods']['cate_id_1'] ?? 0; $goods->cate_two = $resp['goods']['cate_id_2'] ?? 0; $goods->content = $resp; if (!$goods->save()) throw new \Exception($goods->getErrorMessage()); } catch (\Exception $e) { \Yii::error(FormatHelper::exception($e, __METHOD__)); return false; } return true; } /** * 获取商品详情 * @param int $mall_id * @param int $goods_id * @return array * @throws \Exception */ public function detail(int $mall_id, int $goods_id) { $contentModel = new GoodsDetailModel(); $contentModel->id = $goods_id; return RequestHelper::send(new GoodsDetailRequest(), $contentModel, $mall_id); } /** * 删除 * @param int $mall_id * @param int $id * @return mixed|string|true|null */ public function delete(int $mall_id, int $id) { $t = \Yii::$app->db->beginTransaction(); try { /** * @var $goods QiShangTongGoods */ $goods = QiShangTongGoods::getOne([ ['mall_id' => $mall_id], ['id' => $id], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]], ]); if (empty($goods)) throw new \Exception('记录不存在'); $goods->status = StatusEnum::DELETE; $goods->can_sale = StatusEnum::DISABLED; if (!$goods->save()) throw new \Exception($goods->getErrorMessage()); // 判断 $ids = []; if (SettingService::isMasterMall($mall_id)) { $ids = QiShangTongGoods::find()->where(['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]) ->andWhere(['third_goods_id' => $goods->third_goods_id])->select('goods_id')->column(); QiShangTongGoods::updateAll(['can_sale' => StatusEnum::DISABLED], ['and', ['third_goods_id' => $goods->third_goods_id], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]]); } else { $ids[] = $goods->id; } // 下架商品 if (!empty($ids)) Goods::updateAll(['is_on_sale' => StatusEnum::DISABLED], ['id' => $ids]); $t->commit(); } catch (\Exception $e) { $t->rollBack(); return $e->getMessage(); } return true; } /** * @param $params * @return string */ public function write($params) { return $this->asyncWriter(['mall_id' => $params['mall_id'], 'id' => $params['id']]); } public function asyncWriter(array $params) { $mall_id = $params['mall_id']; $id = $params['id']; /** * @var $goods QiShangTongGoods */ $goods = QiShangTongGoods::getOne([ ['mall_id' => $mall_id], ['id' => $id], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]], ]); if (empty($goods)) return '记录不存在'; $config = (new SettingService())->get($mall_id); // 这里写入商品数据 try { $form = (new GoodsLogic($goods, $config))->execute(); $t = \Yii::$app->db->beginTransaction(); $res = Goods::setData($form); if (false === $res) throw new \Exception(Goods::getStaticError()); if (!empty($goods->goods_id)) { QiShangTongGoodsAttr::deleteAll(['goods_id' => $goods->goods_id]); } if ($res->is_attr) { $attrs = GoodsAttr::lists([ 'where' => [ ['goods_id' => $res->id] ] ]); $f_attr = []; foreach ($form['attr'] as $item) { $f_attr[$item['goods_no']] = $item; } foreach ($attrs as $item) { QiShangTongGoodsAttr::setData([ 'goods_id' => $res->id, 'goods_attr_id' => $item['id'], 'cost_price' => $item['cost_price'], 'price' => $item['price'], 'original_price'=> $item['original_price'], 'third_spec_id' => $item['goods_no'], 'mall_id' => $goods->mall_id, 'third_goods_id'=> $goods->third_goods_id, 'third_price' => $f_attr[$item['goods_no']]['third_price'], 'gonghuojia' => $f_attr[$item['goods_no']]['gonghuojia'], 'retail_price' => $f_attr[$item['goods_no']]['retail_price'], ]); } } else { /** * @var $attr GoodsAttr */ $attr = GoodsAttr::getOne([ ['goods_id' => $res->id], ], false, [], null, 'id'); // 没有规格的情况下 QiShangTongGoodsAttr::setData([ 'goods_id' => $res->id, 'goods_attr_id' => $attr->id, 'third_goods_id'=> $goods->third_goods_id, 'cost_price' => $res->cost_price, 'price' => $res->price, 'original_price'=> $res->original_price, 'third_spec_id' => $res->goods_no, 'sign_id' => '', 'mall_id' => $goods->mall_id, 'third_price' => $form['third_price'], 'gonghuojia' => $form['gonghuojia'], 'retail_price' => $form['retail_price'], ]); } if (empty($goods->goods_id)) { $goods->goods_id = $res->id; $goods->import_at = time(); if (!$goods->save()) throw new \Exception($goods->getErrorMessage()); } $t->commit(); } catch (\Exception $e) { if (!empty($t)) $t->rollBack(); return $e->getMessage(); } return true; } /** * @param QiShangTongEvent $event * @return void * @throws \Exception */ public function eventUpdate(QiShangTongEvent &$event) { $list = QiShangTongGoods::lists([ 'where' => [ ['third_goods_id' => $event->content['goods_id']], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]], ], 'select'=> 'id,mall_id' ], false); if (!empty($list)) { /** * @var $goods QiShangTongGoods */ foreach ($list as $goods) { if (empty($goods)) throw new \Exception('记录不存在'); $event->mall_id = $goods->mall_id; \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, [ 'mall_id' => $goods->mall_id, 'id' => $goods->id ], self::class, 'asyncWriter'); } } } /** * 修改价格 * @param int $mall_id * @return void * @throws \Exception */ public function changePrice(int $mall_id) { // $this->asyncChangePrice(['mall_id' => $mall_id]); \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, [ 'mall_id' => $mall_id, ], self::class, 'asyncChangePrice'); } /** * 批量修改价格 * @param array $params * @return void * @throws \Exception */ public function asyncChangePrice(array $params) { $mall_id = $params['mall_id']; // $config = (new SettingService())->get($mall_id); // 取出所有已经绑定的商品 foreach (QiShangTongGoods::find() ->where(['mall_id' => $mall_id]) ->andWhere(['!=', 'goods_id', 0]) ->andWhere(['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]) ->select('id, goods_id, retail_price, price, gonghuojia')->each() as $each) { $data = ['mall_id' => $mall_id, 'id' => $each->goods_id, 'price' => $each->price, 'retail_price' => $each->retail_price, 'gonghuojia' => $each->gonghuojia]; \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, self::class, 'asyncChangeGoodsPrice'); // $this->asyncChangeGoodsPrice($data); } } /** * 修改价格 * @param array $params * @return bool */ public function asyncChangeGoodsPrice(array $params) { $mall_id = $params['mall_id']; $config = (new SettingService())->get($mall_id); $prices = !empty($config['price']) ? Json::decode($config['price']) : []; $t = \Yii::$app->db->beginTransaction(); try { // 更新商品ID $price = SettingService::getPrice($mall_id, SettingService::PRICE, $params, $prices); $cost_price = SettingService::getPrice($mall_id, SettingService::COST_PRICE, $params, $prices); $original_price = SettingService::getPrice($mall_id, SettingService::ORIGINAL_PRICE, $params, $prices); Goods::updateAll(['price' => $price, 'cost_price' => $cost_price, 'original_price' => $original_price], ['id' => $params['id']]); $attrs = QiShangTongGoodsAttr::lists([ 'where' => [ ['goods_id' => $params['id']] ], 'select'=> 'goods_attr_id, id, price, cost_price, original_price, gonghuojia, retail_price, third_price' ]); foreach ($attrs as $attr) { $attr['price'] = $attr['third_price']; $price = SettingService::getPrice($mall_id, SettingService::PRICE, $attr, $prices); $cost_price = SettingService::getPrice($mall_id, SettingService::COST_PRICE, $attr, $prices); $original_price = SettingService::getPrice($mall_id, SettingService::ORIGINAL_PRICE, $attr, $prices); GoodsAttr::updateAll(['price' => $price, 'cost_price' => $cost_price, 'original_price' => $original_price], ['id' => $attr['goods_attr_id']]); } $t->commit(); } catch (\Exception $e) { $t->rollBack(); \Yii::error(FormatHelper::exception($e, __METHOD__)); return false; } return true; } }