| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558 |
- <?php
- namespace addons\ValetOrder\common\service;
- use addons\ValetOrder\common\enums\ValetOrderEnum;
- use addons\ValetOrder\common\logic\order\OrderMarketingLogicV2;
- use addons\ValetOrder\common\models\ValetOrder;
- use addons\ValetOrder\common\models\ValetOrderGoods;
- use common\enums\GlobalFuncEnum;
- use common\enums\MarketingTypeEnum;
- use common\enums\OrderSourceEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\ShippingTypeEnum;
- use common\enums\StatusEnum;
- use common\events\user\UserRegisterEvent;
- use common\globals\GlobalInvoke;
- use common\helpers\FormatHelper;
- use common\logic\order\BaseOrderForm;
- use common\models\goods\Goods;
- use common\models\goods\GoodsAttr;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\user\User;
- use common\models\user\UserPartitionRelationship;
- use RuntimeException;
- use Yii;
- use yii\helpers\Json;
- class OrderService
- {
- public function page(int $mall_id, array $params)
- {
- $where = [
- ['mall_id' => $mall_id],
- ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
- ];
- // 买家
- if (!empty($params['user_id'])) {
- $where[] = ['user_id' => $params['user_id']];
- }
- if (!empty($params['user'])) {
- $uids = User::find()
- ->where(['mall_id' => $mall_id])
- ->andWhere(['status' => StatusEnum::ENABLED])
- ->andWhere(['or', ['like', 'username', $params['user']], ['like', 'nickname', $params['user']], ['like', 'mobile', $params['user']]])
- ->select('id')
- ->column();
- if (empty($uids)) return [];
- $where[] = ['user_id' => $uids];
- }
- if (isset($params['buy_user_id']) && $params['buy_user_id'] !== '') {
- $where[] = ['buy_user_id' => intval($params['buy_user_id'])];
- }
- if (!empty($params['buy_user'])) {
- $uids = User::find()
- ->where(['mall_id' => $mall_id])
- ->andWhere(['status' => StatusEnum::ENABLED])
- ->andWhere(['or', ['like', 'username', $params['buy_user']], ['like', 'nickname', $params['buy_user']], ['like', 'mobile', $params['buy_user']]])
- ->select('id')
- ->column();
- if (empty($uids)) return [];
- $where[] = ['buy_user_id' => $uids];
- }
- if (!empty($params['start_date'])) $where[] = ['>=', 'created_at', strtotime($params['start_date'])];
- if (!empty($params['end_date'])) $where[] = ['<=', 'created_at', strtotime($params['end_date'])];
- if (!empty($params['goods_name'])) $where[] = ['like', 'order_goods_names', $params['goods_name']];
- $ret = ValetOrder::listPage([
- 'where' => $where,
- 'order' => 'id desc',
- 'limit' => $params['limit'] ?? 10,
- 'with' => ['user', 'buyUser', 'order' => function($query) {
- $query->with(['detail']);
- }]
- ]);
- if (!empty(ValetOrder::getStaticError())) return ValetOrder::getStaticError();
- if (!empty($ret['list'])) {
- foreach ($ret['list'] as &$item) {
- if (empty($item['buyUser'])) {
- $item['buyUser'] = [
- 'id' => 0,
- 'nickname' => '平台',
- 'avatar_url'=> '',
- 'mobile' => '',
- ];
- }
- }
- }
- array_unshift($where, 'AND');
- $ret['total_amount'] = ValetOrder::find()->where($where)->sum("order_amount");
- return $ret;
- }
- public function frontPage(int $mall_id, int $user_id, array $data, array $mall, string $platform)
- {
- // 通过用户ID去取数据
- $head_where = [
- ['mall_id' => $mall_id],
- ['buy_user_id' => $user_id],
- ['status' => StatusEnum::ENABLED]
- ];
- if (isset($data['order_status']) && $data['order_status'] != 999) {
- if ($data['order_status'] == OrderStatusEnum::SING) { // 如果筛选的是已收货的订单那么就将已提货的订单一起取出来
- $data['order_status'] = [OrderStatusEnum::SING, OrderStatusEnum::TAKE_FINISH];
- }
- $head_where[] = ['order_status' => $data['order_status']];
- } else {
- if (!empty($data['wait_pending'])) {
- $head_where[] = ['not in', 'order_status', [OrderStatusEnum::ACCOMPLISH, OrderStatusEnum::REPEAL,
- OrderStatusEnum::TAKE_FINISH, OrderStatusEnum::SING]]; // 排除 已完成, 已关闭, 已自提, 已签收
- }
- }
- if (!empty($data['keyword'])) {
- $u_ids = User::find()->where(['mall_id' => $mall_id])
- ->andWhere(['or', ['like', 'mobile', $data['keyword']], ['like', 'nickname', $data['keyword']]])
- ->select('id')
- ->column();
- if (!empty($u_ids)) {
- $head_where[] = ['user_id' => $u_ids];
- } else {
- $head_where[] = ['user_id' => 0];
- }
- }
- $map['where'] = $head_where;
- $map['select'] = 'id, order_id';
- $map['limit'] = $data['limit'] ?? 5;
- // $map['page'] = $params['page'] ?? 1;
- $map['order'] = 'id desc';
- $ret = ValetOrder::listPage($map);
- if (!empty($ret['list'])) {
- $order_ids = array_column($ret['list'], 'order_id');
- $where[] = ['in', 'id', $order_ids];
- $where[] = ['is_feedback' => OrderStatusEnum::NOT_FEEDBACK];
- $where[] = ['!=', 'order_source', OrderSourceEnum::SOURCE_SELF_MALL];
- $select = 'id,pay_money,order_status,shipping_type,is_recycle,marketing_type,extra_info,order_source,store_id,mch_id,receiver_name,mobile,
- consign_time, mall_id, order_no, created_at';
- $params['order'] = 'pay_time desc';
- $params['select'] = $select;
- $params['where'] = $where;
- $params['with'] = ['detail' => function ($query) {
- $query->select('id,order_id,goods_id,goods_name,pic_url,goods_attr_id,num,price,is_feedback,sign_id,goods_attr_name,extra_info,adjust_money');
- }];
- $order_list = Order::lists($params);
- $ret['mall_logo'] = Yii::$app->services->setting->mall->get($mall_id, 'basic.logo');
- if (!empty($order_list)) {
- foreach ($order_list as $key => $val) {
- array_map(function ($arg) use (&$val) {
- if (!isset($val['num'])) $val['num'] = 0;
- $val['num'] += $arg['num'];
- }, $val['detail']);
- // 剩余库存
- $stock = [];
- if($val['detail']){
- foreach ($val['detail'] as $k => $v){
- $order_list[$key]['detail'][$k]['price'] = $order_list[$key]['detail'][$k]['price'] + $order_list[$key]['detail'][$k]['adjust_money'];
- $order_list[$key]['detail'][$k]['price'] = round($order_list[$key]['detail'][$k]['price'],2);
- $goods_unit = Goods::getOne([['=','id',$v['goods_id']]],false,'','','unit')['unit'];
- $val['detail'][$k]['unit'] = $goods_unit;
- // 当订单关闭时可以直接再次购买
- if ($val['order_status'] == OrderStatusEnum::REPEAL) {
- // 查询商品是否有货
- $stock[] = [
- 'num' => $v['num'],
- 'store_id' => $v['store_id']??0,
- 'goods_id' => $v['goods_id'],
- 'attr_id' => $v['goods_attr_id'],
- 'stock' => GoodsAttr::find()->where(['id' => $v['goods_attr_id']])->select('stock')->scalar(),
- ];
- }
- }
- }
- // 获取支付金额
- $order_list[$key] = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $mall_id, [
- 'order' => $val,
- 'mall_id' => $mall_id,
- ]) ?: $val;
- $order_list[$key]['mall_name'] = $mall['name'];
- $order_list[$key]['mall_logo'] = Yii::$app->services->setting->mall->get($mall_id, 'basic.logo');
- // 判断是否可以再次购买
- $is_agent = empty($stock) ? 0 : 1;
- foreach ($stock as $v) {
- // 当库存小于购买数量 不可再次购买
- if ($v['stock'] < $v['num']) {
- $is_agent = 0;
- }
- }
- $order_list[$key]['is_agent'] = $is_agent;
- $order_list[$key]['extra_info'] = Json::decode($order_list[$key]['extra_info']);
- $order_list[$key]['is_agent_data'] = $is_agent ? $stock : [];
- $order_list[$key]['created_at'] = date('Y-m-d H:i:s', $order_list[$key]['created_at']);
- }
- $order_list = GlobalInvoke::exec(GlobalFuncEnum::ORDER_LIST, $mall_id, [
- 'order' => $order_list, 'mall_id' => $mall_id
- ]) ?: $order_list;
- $ret['shipping_type_text'] = ShippingTypeEnum::getMap();
- $ret['order_status_text'] = OrderStatusEnum::getMap();
- $ret['order_status_text'][OrderStatusEnum::SHIPMENTS] = '待取货';
- $ret['is_feedback_text'] = OrderStatusEnum::getFeedbackMap();
- }
- $ret['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($mall_id, $platform);
- $ret['marketing_type_map'] = MarketingTypeEnum::getMap();
- $ret['list'] = $order_list;
- }
- return $ret;
- }
- /**
- * @param array $orders
- * @param array $ext
- * @return true
- * @throws \Exception
- */
- public function create(array $orders, array $ext)
- {
- $t = \Yii::$app->db->beginTransaction();
- try {
- // 获取上级且注册账号
- $users = [];
- // 新增用户列表
- $add_new_users = [];
- foreach ($ext as $order_id => $info) {
- $parent_id = $orders[0]['buy_user_id']; // 默认上级
- if (!empty($info['parent'])) {
- $pid = User::find()->where(['mall_id' => $orders[0]['mall_id']])
- ->andWhere(['mobile' => $info['parent']])->select('id')->scalar();
- if (!empty($pid)) $parent_id = $pid;
- }
- // 判断当前用户是否存在
- if (empty($users[$info['mobile']])) {
- $user = User::getOne([
- ['mall_id' => $orders[0]['mall_id']],
- ['mobile' => $info['mobile']],
- ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
- ]);
- if (empty($user)) {
- // 实施注册
- $user = User::setData([
- 'parent_id' => $parent_id,
- 'nickname' => '代客下单用户',
- 'mobile' => $info['mobile'],
- 'mall_id' => $orders[0]['mall_id'],
- 'username' => "{$info['mobile']}",
- 'source' => User::SOURCE_VALET_ORDER,
- 'platform' => User::PLATFORM_H5,
- 'password' => Yii::$app->getSecurity()->generatePasswordHash(substr($info['mobile'],-6,6))
- ]);
- if ($user) {
- $add_new_users[] = $user;
- }
- } else {
- // 判断当前老用户是否没有上级,如果没有的话那么就需要指定上级
- if (empty($user->parent_id) && !empty($parent_id)) {
- // 考虑代下单的对象是自己团队的上级并且浏览路径是平台
- $parentIds = UserPartitionRelationship::getParentIdArr($parent_id);
- if (!in_array($user->id, $parentIds)) {
- // 给其更改上级
- $flag = UserPartitionRelationship::changeRelationship([
- 'user_id' => $user->id,
- 'parent_id' => $parent_id,
- 'operator_user_id' => $orders[0]['buy_user_id']
- ]);
- if ($flag === false) throw new \Exception("修改关系链失败");
- }
- }
- }
- if (!$user) throw new \Exception(User::getStaticError()); // 注册失败
- $users[$info['mobile']] = $user;
- }
- }
- // 创建订单
- foreach ($orders as &$order) {
- $uid = $users[$ext[$order['order_id']]['mobile']]->id;
- $order['user_id'] = $uid;
- // 修改订单所属人
- Order::updateAll(['user_id' => $uid, 'marketing_type' => ValetOrderEnum::ADDONS_NAME], ['id' => $order['order_id']]);
- OrderDetail::updateAll(['user_id' => $uid], ['order_id' => $order['order_id']]);
- }
- // 执行
- \Yii::$app->db->createCommand()->batchInsert(ValetOrder::tableName(), array_keys($orders[0]), $orders)->execute();
- $t->commit();
- if (!empty($add_new_users)) {
- foreach ($add_new_users as $user) {
- // 触发注册成功事件,事务提交完成后触发
- $event = new UserRegisterEvent($user->mall_id);
- $data = ['user_id' => $user->id, 'platform' => 'h5'];
- Yii::$app->services->events->dispatch($event, $data, $event->listeners);
- }
- }
- } catch (\Exception $e) {
- $t->rollBack();
- var_dump($e->getMessage(), $e->getFile(), $e->getLine());
- \Yii::error(FormatHelper::exception($e, __METHOD__));
- throw new \Exception($e->getMessage());
- }
- // 执行写入
- return true;
- }
- /**
- * @param int $order_id
- * @param int $status
- * @return true
- * @throws \Exception
- */
- public function update(int $order_id, int $status)
- {
- $order = ValetOrder::getOne([
- ['order_id' => $order_id]
- ]);
- if (empty($order)) return true;
- // 判断有没有开启插件
- $config = (new SettingService())->get($order->mall_id);
- if (empty($config['is_enable'])) return true;
- $order->order_status = $status;
- if (!$order->save()) throw new \Exception($order->getErrorMessage());
- return true;
- }
- /**
- * 确认订单
- * @param array $params
- * @return mixed
- */
- public function preview(array $params)
- {
- $input = $params['params'];
- $response = $params['data'];
- // 只能是一件商品
- if (count($response['group_order_goods']) > 1) return $response;
- $response[ValetOrderEnum::ORDER_EXT_KEY][ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::DISABLED;
- $response[ValetOrderEnum::ORDER_EXT_KEY][ValetOrderEnum::ORDER_VALET_SMS_CODE] = StatusEnum::DISABLED;
- foreach ($response['group_order_goods'] as $goods) {
- if (count($goods['goods']) > 1) return $response;
- // 判断当前商品是否能够参与代客下单
- $gids = array_keys($goods['goods']);
- $valet = ValetOrderGoods::getOne([
- ['mall_id' => $params['mall_id']],
- ['goods_id' => $gids[0]],
- ['status' => StatusEnum::ENABLED],
- ], true, [], null, 'id');
- if (!empty($valet)) {
- $response[ValetOrderEnum::ORDER_EXT_KEY][ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::ENABLED;
- }
- }
- if (!empty($response[ValetOrderEnum::ORDER_EXT_KEY][ValetOrderEnum::ORDER_IS_VALET_KEY])) {
- // 需要验证码
- $config = (new SettingService())->get($params['mall_id']);
- $response[ValetOrderEnum::ORDER_EXT_KEY][ValetOrderEnum::ORDER_VALET_SMS_CODE] = $config['is_enable_sms_code'] ?? StatusEnum::DISABLED;
- }
- // 是否需要校验短信验证码
- return $response;
- }
- /**
- * 公共调用订单详情
- * @param $params
- * @return mixed
- */
- public function globalDetail($params)
- {
- // $params['order'] // 订单主体信息
- // 判断是否为代客下单
- $params['order'][ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::DISABLED;
- if (!empty($params['order']['extra_info']) && $params['order']['marketing_type'] == ValetOrderEnum::ADDONS_NAME) {
- try {
- $ext = Json::decode($params['order']['extra_info']);
- if (!empty($ext[ValetOrderEnum::ORDER_EXT_KEY])) {
- // 需要取出下单人
- $valetOrder = ValetOrder::getOne([
- ['order_id' => $params['order']['id']],
- ['mall_id' => $params['order']['mall_id']]
- ], true, ['buyUser']);
- if (!empty($valetOrder['buyUser'])) {
- $config = (new SettingService())->get($params['mall_id']);
- $params['order'][ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::ENABLED;
- $params['order'][ValetOrderEnum::ORDER_VALET_CAN_REFUND] = $config['is_enable_order_refund'];
- $params['order'][ValetOrderEnum::ORDER_VALET_BUYER_KEY] = $valetOrder['buyUser'];
- }
- }
- } catch (\Exception $e) {}
- }
- return $params['order'];
- }
- /**
- * 公共调用 - 订单列表
- * @param $params
- * @return mixed
- */
- public function globalList($params)
- {
- if (!empty($params['order'])) {
- foreach ($params['order'] as &$item) {
- $item[ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::DISABLED;
- if (!empty($item['extra_info']) && $item['marketing_type'] == ValetOrderEnum::ADDONS_NAME) {
- try {
- $ext = Json::decode($item['extra_info']);
- if (!empty($ext[ValetOrderEnum::ORDER_EXT_KEY])) {
- // 需要取出下单人
- $valetOrder = ValetOrder::getOne([
- ['order_id' => $item['id']],
- ['mall_id' => $params['mall_id']]
- ], true, ['buyUser']);
- if (!empty($valetOrder['buyUser'])) {
- $item[ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::ENABLED;
- $item[ValetOrderEnum::ORDER_VALET_BUYER_KEY] = $valetOrder['buyUser'];
- }
- }
- } catch (\Exception $e) {}
- }
- }
- }
- return $params['order'];
- }
- /**
- * 公共调用 - 总后台订单列表
- * @param $params
- * @return mixed
- */
- public function globalBackendLists($params)
- {
- foreach ($params['order'] as &$item) {
- $item[ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::DISABLED;
- if (!empty($item['extra_info']) && $item['marketing_type'] == ValetOrderEnum::ADDONS_NAME) {
- try {
- $ext = Json::decode($item['extra_info']);
- if (!empty($ext[ValetOrderEnum::ORDER_EXT_KEY])) {
- // 需要取出下单人
- $valetOrder = ValetOrder::getOne([
- ['order_id' => $params['order']['id']],
- ['mall_id' => $params['order']['mall_id']]
- ], true, ['buyUser']);
- if (!empty($valetOrder['buyUser'])) {
- $item[ValetOrderEnum::ORDER_IS_VALET_KEY] = StatusEnum::ENABLED;
- $item[ValetOrderEnum::ORDER_VALET_BUYER_KEY] = $valetOrder['buyUser'];
- }
- }
- } catch (\Exception $e) {}
- }
- }
- return $params['order'];
- }
- /**
- * @param $order_id
- * @return bool
- */
- public function refund($order_id)
- {
- $order = ValetOrder::getOne([['order_id' => $order_id]], true, [], null, 'id');
- if (empty($order)) return false;
- return true;
- }
- /**
- * @param $order_id
- * @return bool
- */
- public function getValetOrderByOrderId($order_id)
- {
- return ValetOrder::getOne([['order_id' => $order_id]], true, [], null);
- }
- /**
- * 营销减免,决定使用哪个用户
- *
- * @param BaseOrderForm $form
- *
- * @return false|mixed|object
- */
- public function orderMarketing(BaseOrderForm $form)
- {
- $settingService = new SettingService;
- $originUserId = $form->user_id;
- $originUser = $form->user;
- $form->process_extra_data['valet_order_origin_user_id'] = $originUserId;
- if (!empty($settingService->get($form->mall_id)['is_enable_other_identity_price'])) {
- // 输入了手机号并且用户存在
- if (
- !empty($form->attributes['data']['extra_info']['valet_order']['mobile']) &&
- $valetOrderUser = User::getUser([
- [
- 'mall_id' => $form->mall_id,
- 'mobile' => $form->attributes['data']['extra_info']['valet_order']['mobile'],
- 'status' => StatusEnum::ENABLED
- ]
- ])
- ) {
- $form->user_id = $valetOrderUser->id;
- $form->user = $valetOrderUser;
- } else {
- $form->user_id = $settingService->getValetOrderDefaultUser($form->mall_id);
- if (empty($form->user_id)) {
- throw new RuntimeException('系统异常');
- }
- $form->user = User::getOne([['id' => $form->user_id, 'mall_id' => $form->mall_id]]);
- if (empty($form->user)) {
- throw new RuntimeException('系统异常');
- }
- }
- }
- $orderMarketingLogic = new OrderMarketingLogicV2();
- $form = $orderMarketingLogic->run($form);
- if ($form === false) {
- throw new RuntimeException($orderMarketingLogic->getError());
- }
- $form->user_id = $originUserId;
- $form->user = $originUser;
- unset($form->process_extra_data['valet_order_origin_user_id']);
- return $form;
- }
- }
|