getDefaultform($this->mall_id, $this->user_id); $form->attributes = Yii::$app->request->post(); $form['action'] = AppEnum::ACTION_PREVIEW; !empty($form->shipping_type) && $form->shipping_type = ShippingTypeEnum::LOGISTICS; // 初始化订单数据 $orderInitDataLogic = new OrderInitDataLogic(); $form = $orderInitDataLogic->execute($form, $form->type); if ($form === false) return $this->error($orderInitDataLogic->getError()); $is_bind_popups = UserPartitionRelationship::getIsNeedPopups($this->mall_id, $this->user_id); if($is_bind_popups == 1) return $this->error('请进入商品详情页,绑定邀请码!'); // 购买限制验证 $orderLimitLogic = new OrderLimitLogic(); $form = $orderLimitLogic->run($form); if ($form === false) return $this->error($orderLimitLogic->getError()); // 获取收货地址 $address_info = UserAddress::getUserAddress($this->user_id, $form->address_id); $form->address_id = $address_info['id']??0; // 强制免运费 $form = $this->isForceFreeShipping($form); // 营销减免活动 $orderMarketingLogic = new OrderMarketingLogic(); $form = $orderMarketingLogic->run($form); if ($form === false) return $this->error($orderMarketingLogic->getError()); $group_order_goods = $form['group_order_goods']; $group_order_goods_list = []; $gIds = []; foreach ($group_order_goods as $val){ $group_order_goods_list[]=$val; foreach ($val['goods'] as $gId => $item) { $gIds[] = $gId; } } $marketing = $form['marketing']??[]; $pay_type_list = \Yii::$app->services->pay->getEnablePayment($this->mall_id, $this->platform, 1, ['pay_money' => $form['total_pay_money'], 'user_id' => $this->user_id]); if($form['total_pay_money']<=0){ $tmp = []; foreach ($pay_type_list as $item){ if($item['trade_type']=='default'){ $tmp[]=$item; break; } } $pay_type_list = $tmp; } $shipping_type_list = ShippingTypeEnum::getMap(); $option_list = []; $group_order_goods = $group_order_goods_list; $extends_fields = []; $info = compact('group_order_goods', 'marketing', 'address_info', 'pay_type_list', 'shipping_type_list', 'option_list', 'extends_fields'); if($form['total_pay_money'] < 0) $form['total_pay_money'] = 0; $info['total_pay_money'] = '¥' . $form['total_pay_money']; $info['total_pay_money_not_coupon'] = $form['total_pay_money_not_coupon']; $info['is_address'] = $form['is_address'] ?? 0; $info['is_virtual'] = $form['is_virtual'] ?? 0; $info['is_sign_agreement'] = $form['is_sign_agreement'] ?? 0; $info['shipping_type'] = $form->data['shipping_type'] ?? null; // 农业补贴 - 是否需要显示推荐人输入框 if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_AGRICULTURAL_SUBSIDIES)) { $aConfig = Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_AGRICULTURAL_SUBSIDIES, 'basic'); if($aConfig && isset($aConfig['goods'])){ $tGoods = json_decode($aConfig['goods'], true); $tGids = array_column($tGoods, 'goods_id'); $info['show_invite_form'] = StatusEnum::DISABLED; if ($aConfig['enable_bind_master'] == StatusEnum::ENABLED && !empty(array_intersect($tGids, $gIds))) { $info['show_invite_form'] = StatusEnum::ENABLED; } } // 判断是否包含当前商品 // $info['show_invite_form'] = Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_AGRICULTURAL_SUBSIDIES, 'basic.enable_bind_master'); } $form->data['type'] = $form->type; $form->data['need_not_express'] = $form->need_not_express; $invoke_res = GlobalInvoke::exec(GlobalInvoke::ORDER_PREVIEW_APPEND_FILEDS, $this->mall_id, ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'data' => $info, 'params' => $form->data]); $info = !empty($invoke_res) ? $invoke_res : $info; if (!MallAddons::isInstall($this->mall_id, 'Community') && $form->need_not_express) { // 当时是在社区团购方法中进行判断是否,不需物流。并未考虑到用户没有安装社区团购插件 $info['option_list'] = []; $info['is_address'] = 0; } // 当订单自提时,填写好地址,但点击优惠券重新请求接口,就会覆盖填写好的地址 // 所以需要前端传来额外的值,然后赋值到地址(修改来自bug 11185) if ($form->attributes['data']['shipping_type'] == 2) { $info['address_info']['name'] = $form->attributes['data']['contact_name'] ? $form->attributes['data']['contact_name'] : $info['address_info']['name']; $info['address_info']['mobile'] = $form->attributes['data']['contact_phone'] ? $form->attributes['data']['contact_phone'] : $info['address_info']['mobile']; } return $this->success('操作成功', $info); }catch (\Exception $e){ return $this->error($e->getMessage()); } } /** * 是否强制免运费 * @param $form * @return mixed */ protected function isForceFreeShipping($form) { // 社区团购 是否强制免运费 if (!$form->is_force_free_shipping && MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_COMMUNITY) && (new SettingService())->isForceFreeShipping($this->mall_id)) { // 需要处理 // 判断是否为社区团购订单 // 这种判断仅限于定制创建的时候 if ($form->action == AppEnum::ACTION_CREATE && in_array($form->shipping_type, [ShippingTypeEnum::PICKUP, ShippingTypeEnum::MERCHANT_DISTRIBUTION]) && !empty($form->extra_info)) { $ext = json_decode($form->extra_info, true); if (empty($ext['head_id'])) { return $form; } } // 如果有安装社区团购 并且 $community_res = (new CommunityGoods())->orderPreviewAppendFields(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'data' => [], 'params' => array_merge($form->data, ['type' => $form->type])]); $shipping_type = null; if (!empty($community_res['option_list']) && is_array($community_res['option_list'])) { $option_list = array_values(array_filter($community_res['option_list'], function ($val) { return $val['enable'] == StatusEnum::ENABLED; })); $shipping_type = $option_list[0]['key'] ?? null; } $shipping_type = $form->data['shipping_type'] ?? $shipping_type; // 如果前端没有传,那么就取默认第一个 $form->is_force_free_shipping = in_array($shipping_type, [ShippingTypeEnum::PICKUP]); } return $form; } /** * 创建订单 * @Author bing * @DateTime 2021-09-22 09:31:22 * @return void * @copyright: Copyright (c) 2020 广东七件事集团 */ public function actionCreate() { try { $orderFormLogic = new OrderFormLogic(); $form = $orderFormLogic->getDefaultform($this->mall_id, $this->user_id); $form->attributes = Yii::$app->request->post(); $form['action'] = AppEnum::ACTION_CREATE; // 初始化订单数据 $orderInitDataLogic = new OrderInitDataLogic(); $form = $orderInitDataLogic->execute($form, $form->type); if ($form === false) return $this->error($orderInitDataLogic->getError()); $is_bind_popups = UserPartitionRelationship::getIsNeedPopups($this->mall_id, $this->user_id); if($is_bind_popups == 1) return $this->error('请进入商品详情页,绑定邀请码!'); // 购买限制验证 $orderLimitLogic = new OrderLimitLogic(); $form = $orderLimitLogic->run($form); if ($form === false) return $this->error($orderLimitLogic->getError()); // 强制免运费 $form = $this->isForceFreeShipping($form); // 数据校验 $flag = OrderValidateLogic::run($form); if (is_string($flag)) return $this->error($flag); // 营销减免活动 $orderMarketingLogic = new OrderMarketingLogic(); $form = $orderMarketingLogic->run($form, true); if ($form === false) return $this->error($orderMarketingLogic->getError()); $goods_ids = array_column($form['order_goods'],'goods_id'); if(MallAddons::isInstall($this->mall_id,'CloudStock')){ (new RestrictPurchases())->orderCreate(['user_id' => $this->user_id,'mall_id' => $this->mall_id,'type' => 'order','goods_ids'=>$goods_ids]); } $need_auth = GlobalInvoke::exec(GlobalInvoke::REAL_AUTH, $this->mall_id, ['user_id' => $this->user_id,'mall_id' => $this->mall_id,'type' => 'order','goods_ids'=>$goods_ids]); if($need_auth === true){ //需要先进行实名认证 return $this->error('请先进行实名认证',[],ApiStatusEnum::CODE_ERROR_NEED_REAL_AUTH); } if (MallAddons::isInstall($this->mall_id, 'Community')) { // 检查是否安装社区团购插件 $form->data['type'] = $form->type; $res = CommunityGoods::checkCommunityGoods(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'params' => $form->data]); if ($res === false) return $this->error(CommunityGoods::getStaticError()); } // print_r($form);exit; $res = Order::createOrder($form); if ($res === false) return $this->error(Order::getStaticError()); if (!empty($res['cart_list'])) unset($res['cart_list']); //可能因为社安消防插件而返回该数据,删除字段 return $this->success('操作成功', $res); }catch (\Exception $e){ return $this->error($e->getMessage()); } } public function actionList() { $params = \Yii::$app->request->get(); $where[] = ['mall_id' => $this->mall_id]; $where[] = ['user_id' => $this->user_id]; $where[] = ['status' => StatusEnum::ENABLED]; $where[] = ['not in', 'order_source', [OrderSourceEnum::SOURCE_SELF_MALL,OrderSourceEnum::SOURCE_RESERVE,OrderSourceEnum::SOURCE_STORE_RESERVE]]; $where[] = ['not in', 'marketing_type', [AddonsEnum::ADDONS_NAME_LAO_DA_FU]]; if (isset($params['order_status']) && $params['order_status'] != 999){ if($params['order_status'] == OrderStatusEnum::SING){ $where[] = ['order_status' => [OrderStatusEnum::SING, OrderStatusEnum::TAKE_FINISH]]; }else{ $where[] = ['order_status' => $params['order_status']]; } $where[] = ['is_feedback' => [OrderStatusEnum::NOT_FEEDBACK, OrderStatusEnum::FEEDBACKING]]; } else { // 当订单选手全部时显示所有并且不显示前端删除 $where[] = ['!=', 'order_status', OrderStatusEnum::REPEAL]; } if(!empty($params['keyword'])){ $order_detail_list = OrderDetail::lists(['where'=>[ ['mall_id'=>$this->mall_id], ['like','goods_name','%'.trim($params['keyword']).'%',false] ],'select'=>'order_id']); $order_ids = array_column($order_detail_list,'order_id'); $where[]=[ 'or', ['id'=>$order_ids], ['like','order_no','%'.trim($params['keyword']).'%',false] ]; } $select = 'id,mall_id,pay_money,score,order_status,shipping_type,is_recycle,marketing_type,extra_info,order_source,store_id,mch_id,order_no,is_bill,is_virtual,clerk_code,extra_info,goods_subtype'; $params['order'] = 'id 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'); }, 'orderPrescriptionDetails' => function ($query) { $query->select('order_id, prescription_status, prescription_err_msg'); }]; $order_list = Order::listPage($params); $order_list['mall_name'] = $this->mall['name']; $order_list['mall_logo'] = Yii::$app->services->setting->mall->get($this->mall_id, 'basic.logo'); $score_name = Yii::$app->services->setting->mall->get($this->mall_id, 'score.score_name'); $shipping_type_text = ShippingTypeEnum::getMap(); $goodsStoreSetting = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_STORE,'goodsStore'); $express_title_arr = $goodsStoreSetting['express_title_arr'] ?? ''; $express_title_arr = $express_title_arr ? json_decode($express_title_arr,true) :[]; if (!empty($order_list['list'])) { foreach ($order_list['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['list'][$key]['detail'][$k]['price'] = $order_list['list'][$key]['detail'][$k]['price'] + $order_list['list'][$key]['detail'][$k]['adjust_money']; $order_list['list'][$key]['detail'][$k]['price'] = round($order_list['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(), ]; } } } if (!empty($order_list['list'][$key]['extra_info'])) { try { $extra_info = Json::decode($order_list['list'][$key]['extra_info']); } catch (\Exception $e) {} } // 获取支付金额 $order_list['list'][$key] = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $this->mall_id, [ 'order' => $val, 'mall_id' => $this->mall_id, ]) ?: $val; if(!empty($extra_info['rand_fee']['order']['money'])){ $order_list['list'][$key]['pay_money'] = bcadd($order_list['list'][$key]['pay_money'],$extra_info['rand_fee']['order']['money'],2); } if (!empty($extra_info['mall_info'])) { $order_list['list'][$key]['mall_name'] = $extra_info['mall_info']['mall_name']; $order_list['list'][$key]['mall_logo'] = $extra_info['mall_info']['mall_logo']; $extra_info = null; } if (empty($order_list['list'][$key]['mall_name'])) $order_list['list'][$key]['mall_name'] = $this->mall['name']; if (empty($order_list['list'][$key]['mall_logo'])) $order_list['list'][$key]['mall_logo'] = Yii::$app->services->setting->mall->get($this->mall_id, 'basic.logo'); // 判断是否可以再次购买 $is_agent = empty($stock) ? 0 : 1; foreach ($stock as $v) { // 当库存小于购买数量 不可再次购买 if ($v['stock'] < $v['num']) { $is_agent = 0; } } $order_list['list'][$key]['is_agent'] = $is_agent; $order_list['list'][$key]['is_agent_data'] = $is_agent ? $stock : []; if ($val['marketing_type'] == 'ScoreMall' && !empty($val['score'])) $order_list['list'][$key]['pay_money'] .= '+' . $val['score'] . $score_name; $order_list['list'][$key]['shipping_type_text'] = $shipping_type_text[$val['shipping_type']] ?? ''; if($val['store_id'] > 0 && $express_title_arr) $order_list['list'][$key]['shipping_type_text'] = $express_title_arr[$val['shipping_type']] ?? ''; // 处理处方订单 订单状态 if ( $order_list['list'][$key]['goods_subtype'] == GoodsTypeEnum::GOODS_SUBTYPE_PRESCRIPTION && $order_list['list'][$key]['order_status'] == OrderStatusEnum::NOT_PAY && !empty($order_list['list'][$key]['orderPrescriptionDetails']) && $order_list['list'][$key]['orderPrescriptionDetails']['prescription_status'] == OrderPrescriptionDetails::PRESCRIPTION_STATUS_UNOPEN ) { $order_list['list'][$key]['order_status'] = OrderStatusEnum::PRESCRIPTION_UNOPEN; $isExistPrescriptionOrder = true; } } $order_list['list'] = GlobalInvoke::exec(GlobalFuncEnum::ORDER_LIST, $this->mall_id, [ 'order' => $order_list['list'], 'mall_id' => $this->mall_id ]) ?: $order_list['list']; $order_list['shipping_type_text'] = ShippingTypeEnum::getMap(); $order_list['order_status_text'] = OrderStatusEnum::getMap(); !empty($isExistPrescriptionOrder) && $order_list['order_status_text'] += OrderStatusEnum::getPrescriptionStatus(); $order_list['is_feedback_text'] = OrderStatusEnum::getFeedbackMap(); } // 获取插件内容 $event = new GetOrderListEvent($this->mall_id, $order_list['list'], $this->user); Yii::$app->services->events->dispatch($event); $order_list['list'] = $event->getResultList(); $order_list['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($this->mall_id, $this->platform); $order_list['marketing_type_map'] = MarketingTypeEnum::getMap(); $order_setting = Yii::$app->services->setting->mall->get($this->mall_id, 'order'); $order_list['is_show_invoice'] = isset($order_setting['is_show_invoice'] ) ? $order_setting['is_show_invoice'] : 0; $order_list['is_show_update_address'] = isset($order_setting['is_show_update_address'] ) ? $order_setting['is_show_update_address'] : 0; //获取团购配置 $order_list['community_config'] = []; if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_COMMUNITY)) { $config = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_COMMUNITY, 'basic'); $order_list['community_config'] = [ 'is_enable_write_off' => $config['is_enable_write_off'] ?? StatusEnum::DISABLED, 'is_platform_distribution' => $config['is_platform_distribution'] ?? StatusEnum::DISABLED ]; } return $this->success('操作成功', $order_list); } /** * 订单详情 * @return mixed|void */ public function actionDetail() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['order_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $select = 'id,mall_id,store_id,order_no,receiver_name,mobile,pay_money,shipping_money,original_goods_price,coupon_money,goods_price,order_status,pay_status, shipping_status,review_status,is_feedback,address,created_at,pay_time,region_name,remark,consign_time,finish_time,sign_time,shipping_type,payment_type,score,score_money,marketing_id,marketing_type,extra_info,order_source,is_bill,is_virtual, clerk_code,out_trade_no,goods_subtype'; $where = []; $where[] = ['mall_id' => $this->mall_id]; $where[] = ['user_id' => $this->user_id]; $where[] = ['id' => $params['order_id']]; $order = Order::getOne($where, true, ['detail' => function ($query) { $query->select('id,order_id,goods_id,store_id,goods_attr_id,goods_name,pic_url,num,price,is_feedback,sign_id,goods_attr_name,order_status,adjust_money,extra_info'); }, 'orderPrescriptionDetails' => function ($query) { $query->select('order_id, medication_recipient, symptom, prescription_status'); }], false, $select); if (empty($order)) return $this->error('该订单不存在', []); $marketing = OrderMarketing::getMarketingInfo($order); $order['order_status_text'] = OrderStatusEnum::getMap(); $order['is_feedback_text'] = OrderStatusEnum::getFeedbackMap(); $shipping_type_list = ShippingTypeEnum::getMap(); if($order['store_id'] > 0){ //查询名字自定义 $goodsStoreSetting = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_STORE, 'goodsStore'); $express_title_arr = $goodsStoreSetting['express_title_arr'] ?? ''; $express_title_arr = $express_title_arr ? json_decode($express_title_arr,true) :[]; foreach ($shipping_type_list as $k => $v) { $v = $express_title_arr[$k] ?? $v; $shipping_type_arr[$k] = $v; } $shipping_type_list = $shipping_type_arr; } $order['shipping_type_text'] = $shipping_type_list; $order['payment_type_text'] = PayTypeEnum::getMap(); $order['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($this->mall_id, $this->platform); $order['change_price'] = array_sum(array_column($order['detail'],'adjust_money'));//预留字段 $order['marketing'] = $marketing; $order['marketing_type_map'] =MarketingTypeEnum::getMap(); $order_setting = Yii::$app->services->setting->mall->get($this->mall_id, 'order'); $order['payment_expire_time'] = $order_setting['payment_expire_time']??30; $order['auto_receiving_time'] = $order_setting['auto_receiving_time']??14; $order['shipping_money'] = $order['shipping_money'] ?? 0; // 订单留言 $leave = OrderExtra::getInfo(['=', 'order_id', $order['id']], 'message'); $order['leave'] = $leave['message'] ?? ''; // 订单物流备注 $memoInfo = OrderExpress::find()->where(['order_id' => $order['id']])->select("memo")->asArray()->one(); $order['memo'] = $memoInfo['memo'] ?? ''; //查询商品单位 if($order['detail']){ $goods_attr_ids = $goods_ids = []; foreach ($order['detail'] as $v){ if(empty($v['store_id'])){ $goods_attr_ids[]=$v['goods_attr_id']; $goods_ids[]=$v['goods_id']; } } $goods_attr_list = []; if(!empty($goods_attr_ids)){ $goods_attr_list = GoodsAttr::lists(['where'=>[['id'=>$goods_attr_ids]],'select'=>'id,original_price','index'=>'id']); } if(!empty($goods_ids)){ $goods_list = Goods::lists(['where'=>[['id'=>$goods_ids]],'select'=>'id,unit,goods_source,can_feedback,goods_type','index'=>'id']); $goods_extra_list = GoodsExtra::lists(['where'=>[['goods_id'=>$goods_ids]],'select'=>'id,goods_id,is_alone_show_return_btn,is_show_return_btn','index'=>'id']); } foreach ($order['detail'] as $k => $v){ if(empty($v['store_id'])){ $order['detail'][$k]['unit'] = $order['detail'][$k]['order_source'] = $order['detail'][$k]['is_show_return_btn'] = $order['detail'][$k]['goods_type'] = ''; $order['detail'][$k]['original_price'] = $goods_attr_list[$v['goods_attr_id']]['original_price']??0; if(isset($goods_list[$v['goods_id']])){ $goods = $goods_list[$v['goods_id']]; $order['detail'][$k]['unit'] = $goods['unit']; $order['detail'][$k]['order_source'] = $goods['goods_source']; $order['detail'][$k]['is_show_return_btn'] = $goods['can_feedback']; $order['detail'][$k]['goods_type'] = $goods['goods_type']; } } // 获取订单售后信息 $order['detail'][$k]['order_refund'] = OrderRefund::find() ->where(['order_detail_id' => $v['id'], 'status' => StatusEnum::ENABLED]) ->select('id, type')->orderBy('created_at desc')->asArray()->one(); } } // 获取订单详情的状态文字描述 $order['status_text'] = OrderStatusEnum::getApiStatus($order['status'], $order['shipping_type']); $order['status'] == OrderStatusEnum::NOT_PAY && $order['status_text']['desc'] = $order['payment_expire_time'] . $order['status_text']['desc']; $order['status'] == OrderStatusEnum::SHIPMENTS && $order['status_text']['desc'] = $order['auto_receiving_time'] . $order['status_text']['desc']; $order['is_show_return_btn'] = 0; $order['return_prompt_content'] = ''; // 处理处方订单 订单状态 if ($order['goods_subtype'] == GoodsTypeEnum::GOODS_SUBTYPE_PRESCRIPTION && !empty($order['orderPrescriptionDetails'])) { if ($order['order_status'] == OrderStatusEnum::NOT_PAY && $order['orderPrescriptionDetails']['prescription_status'] == OrderPrescriptionDetails::PRESCRIPTION_STATUS_UNOPEN) { $order['order_status'] = OrderStatusEnum::PRESCRIPTION_UNOPEN; $order['order_status_text'] += OrderStatusEnum::getPrescriptionStatus(); } $order['orderPrescriptionDetails']['medication_recipient'] = json_decode($order['orderPrescriptionDetails']['medication_recipient'], true) ?: []; $order['orderPrescriptionDetails']['symptom'] = json_decode($order['orderPrescriptionDetails']['symptom'], true) ?: []; } $is_show_return_btn = $order_setting['is_show_return_btn'] ?? 0; if ($goods_extra_list) { //优化1417增加放弃退换货针对商品单独设置 //产品确认 多商品情况下有一个商品有独立设置就按独立设置走 $has_any_show = false; $all_independent = true; foreach ($goods_extra_list as $item) { if ($item['is_alone_show_return_btn'] == '1') { if ($item['is_show_return_btn'] == '1') { $has_any_show = true; break;// 发现一个显示,即可终止循环 } } else { $all_independent = false; } } if ($is_show_return_btn) { // 平台显示时:优先判断是否有独立设置为显示 if ($has_any_show) { $is_show_return_btn = 1; } else { // 存在非独立设置商品则显示,否则不显示 $is_show_return_btn = $all_independent ? 0 : 1; } } else { // 平台不显示时:仅当存在独立设置为显示时显示 $is_show_return_btn = $has_any_show ? 1 : 0; } } if(empty($order['is_feedback']) && empty($order['mch_id']) && empty($order['store_id']) && $is_show_return_btn && in_array($order['order_status'], [OrderStatusEnum::SHIPMENTS,OrderStatusEnum::SING,OrderStatusEnum::PAY])){ $order['is_show_return_btn'] = 1; $order['return_prompt_content'] = $order_setting['return_prompt_content'] ?? ''; } $order['is_show_invoice'] = isset($order_setting['is_show_invoice'] ) ? $order_setting['is_show_invoice'] : 0; $order['is_show_update_address'] = isset($order_setting['is_show_update_address'] ) ? $order_setting['is_show_update_address'] : 0; // 公共调用 $order = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $this->mall_id, [ 'order' => $order, 'mall_id' => $this->mall_id, ]) ?: $order; $sun_single_setting = Yii::$app->services->setting->mall->get($this->mall_id, 'sun_single'); if(empty($sun_single_setting) || empty($sun_single_setting['type'])){ $sun_single_default = MallSetting::getDefaultSunSingle(); $poster_background = $sun_single_default['poster_background']['value']; $poster_notch = $sun_single_default['poster_notch']['value']; $border_color = $sun_single_default['border_color']['value']; $price_bg_color = $sun_single_default['price_bg_color']['value']; $price_font_color = $sun_single_default['price_font_color']['value']; $sun_single_setting_setting = $sun_single_default['setting']['value']; $sun_single_setting_type = $sun_single_default['type']['value']; }else{ $poster_background = $sun_single_setting['poster_background']??''; $poster_notch = $sun_single_setting['poster_notch']??''; $border_color = $sun_single_setting['border_color']??''; $price_bg_color = $sun_single_setting['price_bg_color']??''; $price_font_color = $sun_single_setting['price_font_color']??''; $sun_single_setting_setting = $sun_single_setting['setting']??0; $sun_single_setting_type = $sun_single_setting['type']; } $order['sun_single'] = [ 'setting'=>$sun_single_setting_setting, 'type'=>$sun_single_setting_type, 'poster_background'=>$poster_background, 'poster_notch'=>$poster_notch, 'border_color'=>$border_color, 'price_bg_color'=>$price_bg_color, 'price_font_color'=>$price_font_color, ]; //获取团购配置 $order['community_config'] = []; if (MallAddons::isInstall($order['mall_id'], AddonsEnum::ADDONS_NAME_COMMUNITY)) { $config = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_COMMUNITY, 'basic'); $order['community_config'] = [ 'is_enable_write_off' => $config['is_enable_write_off'] ?? StatusEnum::DISABLED, 'is_platform_distribution' => $config['is_platform_distribution'] ?? StatusEnum::DISABLED ]; } $order['trade'] = PaymentTrade::getPayItemByOutTradeNo($order['out_trade_no']); $extra_info = json_decode($order['extra_info'], true); if(!empty($extra_info['rand_fee']['order']['money'])){ $order['pay_money'] = bcadd($order['pay_money'],$extra_info['rand_fee']['order']['money'],2); } $order['score'] = floatval($order['score']); $order['marketing_course'] = []; if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_COURSE) && $order['marketing_type'] == 'Course') { $course_ids = json_decode($order['extra_info'], true); //有赠送视频课程的订单,获取赠送的视频课程展示 $order['marketing_course'] = \addons\Course\common\models\AddonsCourse::find() ->select('id,name,logo') ->where(['mall_id' => $this->mall_id, 'id' => $course_ids]) ->asArray() ->all(); } return $this->success('操作成功', $order, ApiStatusEnum::CODE_SUCCESS, 0); } /** * 更新订单操作 * @return mixed|void */ public function actionUpdateOrder() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['id', 'order_status'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; $params['operator_id'] = $this->user_id; $params['operator_name'] = $this->user->nickname ?? ''; $res = Order::close($params); if (!$res) return $this->error(Order::getStaticError()); return $this->success('操作成功', []); } /** * 提交订单评价 * @return mixed|void * @throws \yii\db\Exception */ public function actionComments() { $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['order_id', 'comment_data'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); // 确保每个评论数据都包含 show_tech 字段,默认为 0 foreach ($params['comment_data'] as &$item) { if (!isset($item['show_tech'])) { $item['show_tech'] = 0; // 设置默认值为0 } } $res = Order::postComments($params); if ($res === false) return $this->error(Order::getStaticError()); return $this->success('操作成功'); } /** * 加载提交售后订单数据 * @Author: hua * @DateTime: 2021/10/7 10:29 * @Copyright: copyright (c) 2021 广东七件事集团 * @return mixed|void */ public function actionToRefundSubmit() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['order_detail_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $select = 'id,order_id,goods_name,sign_id,goods_attr_name,price,num,pic_url,goods_price,order_status,marketing_type,extra_info,adjust_money,goods_id'; $order_detail = OrderDetail::getOne([['id' => $params['order_detail_id']], 'user_id' => $this->user_id, 'mall_id' => $this->mall_id], 1, [], false, $select); if (empty($order_detail)) return $this->error('订单不存在'); $order = Order::find()->select("extra_info,score,shipping_money,out_trade_no,pay_money,marketing_type") ->where(['id' => $order_detail['order_id']])->asArray()->one(); if ($order_detail['marketing_type'] == AddonsEnum::ADDONS_NAME_SCORE_MALL) { $order_detail['extra_info'] = $order['extra_info']; $order_detail['pay_score'] = $order['score']; } // 公共调用 $order_detail = GlobalInvoke::exec(GlobalInvoke::ORDER_REFUND_SUBMIT, $this->mall_id, [ 'order_detail' => $order_detail, 'mall_id' => $this->mall_id, ]) ?: $order_detail; // 自提订单公共调用 $order_detail = GlobalInvoke::exec(GlobalInvoke::INVOKE_ORDER_DETAILS_ITEM, $this->mall_id, [ 'order_detail' => $order_detail, 'mall_id' => $this->mall_id, ]) ?: $order_detail; //价格等于商品价格加上修改价格 $order_detail['goods_price'] = round($order_detail['goods_price'] + $order_detail['adjust_money'],2); $data['goods_info'] = $order_detail; $data['feedback_reason'] = RefundReasonEnum::getMap(); $feedback_type = RefundTypeEnum::getArr(); $data['feedback_type'] = []; if (in_array($order_detail['order_status'], [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH])) { // 如果是自提订单需要判断商品是否允许申请自提退款 if (!empty($order_detail['is_community_order'])) { if (!empty($order_detail['community_goods_setting']['enable_refund'])) { //待发货, $data['feedback_type'][] = $feedback_type[RefundTypeEnum::MONEY]; } }else { //待发货, $data['feedback_type'][] = $feedback_type[RefundTypeEnum::MONEY]; } } if (in_array($order_detail['order_status'], [OrderStatusEnum::SHIPMENTS,OrderStatusEnum::SING, OrderStatusEnum::TAKE_FINISH])) { //已发货,已收货 if (empty($order_detail['is_community_order'])) { // 如果不是社区团购才需要显示退换货 换货的按钮 $data['feedback_type'][] = $feedback_type[RefundTypeEnum::MONEY_AND_PRODUCT]; $data['feedback_type'][] = $feedback_type[RefundTypeEnum::EXCHANGE_GOODS]; } } $data['order_status'] = $order_detail['order_status']; $is_filter_money = false; // 企叮咚/企商通 发货后只能换货 不能仅退款 if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_QI_DING_DONG) && $order_detail['order_status'] != OrderStatusEnum::PAY) { // 并且是企叮咚的订单 $is_filter_money = \addons\QiDingDong\common\service\OrderService::existOrder($order_detail['order_id']); } if (!$is_filter_money && MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_QI_SHANG_TONG) && $order_detail['order_status'] != OrderStatusEnum::PAY) { // 并且是企商通的订单 $is_filter_money = \addons\QiShangTong\common\service\OrderService::existOrder($order_detail['order_id']); } if ($is_filter_money) { $tmp_feedback_type = $data['feedback_type']; $tmp_feedback_type = array_filter($tmp_feedback_type, function ($val) { return $val['id'] != RefundTypeEnum::MONEY; }); $data['feedback_type'] = array_values($tmp_feedback_type); } // 如果是虚拟商品 那么就需要返回仅退款 $goods = Goods::findOne(['id' => $order_detail['goods_id']]); if ($goods->can_feedback && $goods->goods_type == GoodsTypeEnum::GoodsTypeVirtual) { // 返回一个仅退款选项 $data['feedback_type'] = [ RefundTypeEnum::getArr()[RefundTypeEnum::MONEY] ]; } $shipping_money = OrderRefund::isRefundShippingMoney($order_detail['order_id'],$order['shipping_money']); $data['shipping_money'] = $shipping_money; $data['order_marketing_type'] = $order['marketing_type']; return $this->success('操作成功', $data); } /** * 申请售后 * @Author: hua * @DateTime: 2021/10/7 10:29 * @Copyright: copyright (c) 2021 广东七件事集团 * @return mixed|void */ public function actionDoRefundSubmit() { $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['order_detail_id'], 'required'], [['shipping_status', 'pic_list', 'reason', 'refund_price', 'remark', 'type', 'num'], 'safe'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $key = sprintf('DoRefundSubmit:%s', $this->user_id); if (LockHelper::fLock($key)) return $this->error('请勿频繁请求'); // 判断是否安装了代客下单 if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_VALET_ORDER)) { // 判断当前订单是否为代客下单订单 if (!empty(ValetOrder::find()->where(['mall_id' => $this->mall_id]) ->andWhere(['order_id' => OrderDetail::find()->where(['id' => $params['order_detail_id']])->select('order_id')->scalar()]) ->select('id')->scalar())) { $config = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_VALET_ORDER, 'basic'); // 如果插件是开启状态,且可售后是关闭状态 if (!empty($config['is_enable']) && empty($config['is_enable_order_refund'])) { LockHelper::unFLock($key); return $this->error("代客下单订单不可申请退款/售后"); } } } if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_SERVICE_POINT_APPOINTMENT) && (new OrderService())->isReserveByOrderDetailId($this->mall_id, $params['order_detail_id'])) { // 服务点预约 LockHelper::unFLock($key); return $this->error('预约订单含有预约后不可进行售后'); } // 企叮咚 if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_QI_DING_DONG)) { if (!RefundService::hasPic($params['order_detail_id'], $params['pic_list'])) { LockHelper::unFLock($key); return $this->error('图片不能为空'); } } $params['user_id'] = $this->user_id; $params['mall_id'] = $this->mall_id; $where = [ ['=', 'order_detail_id', $params['order_detail_id']], ['=', 'user_id', $this->user_id], ['=', 'mall_id', $this->mall_id], ['>', 'step_status', 0], ['<>', 'refund_status', RefundStatusEnum::REVOKE] ]; $order_refund_model = OrderRefund::getOne($where, true); if ($order_refund_model) { LockHelper::unFLock($key); return $this->error('该订单商品已经申请过售后'); } $res = OrderRefund::feedback($params); if ($res === false) { LockHelper::unFLock($key); return $this->error(Order::getStaticError()); } $event = new \common\events\order\OrderRefundEvent(); $event->mall_id = $this->mall_id; $order_detail['order_detail_id'] = $params['order_detail_id']; $order_detail['id'] = $res->id; $order_detail['operator_id'] = $this->user_id; $order_detail['operator_name'] = $this->user->nickname ?? ''; $order_detail['type'] = 'apply'; Yii::$app->services->events->dispatch($event, $order_detail, $event->listeners); LockHelper::unFLock($key); return $this->success('操作成功', ['id' => $res->id]); } /** * 退款列表 * @return mixed|void */ public function actionRefundList() { $params = \Yii::$app->request->get(); $where[] = ['user_id' => $this->user_id]; $where[] = ['mall_id' => $this->mall_id]; $params['order'] = 'id desc'; $params['where'] = $where; $params['with'] = ['step', 'orderDetail']; $list = OrderRefund::listPage($params); if($list['list']){ foreach($list['list'] as $k=>$v){ $goods_unit = Goods::getOne([['=','id',$v['orderDetail']['goods_id']]],false,'','','unit')['unit']; $list['list'][$k]['orderDetail']['unit'] = $goods_unit; } } $list['mall_name'] = $this->mall['name']; $list['refund_status_text'] = RefundStatusEnum::getMap(); return $this->success('操作成功 ', $list); } /** * 撤销申请售后 * @Author: hua * @DateTime: 2021/10/7 10:52 * @Copyright: copyright (c) 2021 广东七件事集团 * @return mixed|void */ public function actionCancelRefund() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['id', 'order_detail_id'], 'safe'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; $params['operator_id'] = $this->user_id; $res = OrderRefund::cancelRefund($params); if ($res === false) return $this->error(OrderRefund::getStaticError()); return $this->success('操作成功'); } /** * 订单-收货 * @Author: hua * @DateTime: 2021/10/7 14:50 * @Copyright: copyright (c) 2021 广东七件事集团 * @return mixed|void */ public function actionTakeDelivery() { // 商品操作 $form = Yii::$app->request->get(); $rules = [[['id'], 'required'], [['id'], 'integer']]; $res = Yii::$app->services->validate->validate($form, $rules); if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage()); $form['mall_id'] = $this->mall_id; $form['user_id'] = $this->user_id; $form['operator_id'] = $this->user_id; $form['operator_name'] = $this->user->nickname ?? $this->user->mobile; $res = Order::takeDelivery($form); if (!empty(Order::$getRefundId)) { $data['refund_id'] = Order::$getRefundId; } if ($res === false) return $this->error(Goods::getStaticError(), $data ?? []); return $this->success(); } /** * 获取快递公司列表 * @Author: hua * @DateTime: 2021/10/8 14:38 * @Copyright: copyright (c) 2021 广东七件事集团 * @return mixed|void */ public function actionExpressList() { $params['where'] = [['status' => StatusEnum::ENABLED]]; $params['select'] = 'id,name,code'; $list = Express::lists($params); return $this->success('', $list); } /** * 申请售后-商家同意后-买家发货 * @Author: hua * @DateTime: 2021/10/8 14:42 * @Copyright: copyright (c) 2021 广东七件事集团 */ public function actionRefundSend() { $params = \Yii::$app->request->post(); $res = \Yii::$app->services->validate->validate($params, [ [['id'], 'required'], [['express', 'express_no'], 'safe'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; $res = OrderRefundStep::refundSend($params); if ($res === false) return $this->error(Order::getStaticError()); return $this->success('操作成功'); } /** * 申请售后-换货-买家收货 * @Author: hua * @DateTime: 2021/10/9 15:52 * @Copyright: copyright (c) 2021 广东七件事集团 * @return mixed|void */ public function actionRefundTakeDelivery() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; $res = OrderRefundStep::refundTakeDelivery($params); if ($res === false) return $this->error(OrderRefundStep::getStaticError()); return $this->success('操作成功'); } /** * 售后详情 * @Author: hua * @DateTime: 2021/10/8 14:45 * @Copyright: copyright (c) 2021 广东七件事集团 */ public function actionRefundDetail() { $params = \Yii::$app->request->get(); if (!empty($params['id'])) { $where = [['id' => $params['id']], 'user_id' => $this->user_id]; } else { $where = [['order_detail_id' => $params['order_detail_id']], 'user_id' => $this->user_id]; } $detail = OrderRefund::getOne($where, true, ['step', 'orderDetail', 'order' => function ($query) { return $query->select('id, order_source, order_no'); }], 'id desc'); $detail['refund_status_map'] = RefundStatusEnum::getMap(); $detail['step_status_map'] = RefundStatusEnum::getStepStatusText(); //adjust_money if($detail['orderDetail']['goods_price']) { $detail['orderDetail']['goods_price'] = $detail['orderDetail']['goods_price'] + $detail['orderDetail']['adjust_money']; $detail['orderDetail']['goods_price'] = round($detail['orderDetail']['goods_price'],2); } return $this->success('操作成功', $detail); } /** * @desc:去支付 * @Author: hua * @Date: 2021/10/19 * @Time: 14:12 * @Copyright: copyright (c) 2021 广东七件事集团 * @return mixed|void */ public function actionToPay() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['id'], 'required'], [['re_pay'], 'safe'] ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; $params['re_pay'] = true; $res = Order::toPay($params); if ($res === false) return $this->error(Order::getStaticError()); return $this->success('操作成功', $res); } /** * @desc:提醒发货 * @Author: hua * @Date: 2021/10/20 * @Time: 9:04 * @Copyright: copyright (c) 2021 广东七件事集团 * @return mixed */ public function actionRemindSend() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['order_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $params['user_id'] = $this->user_id; $params['mall_id'] = $this->mall_id; $params['user'] = $this->user; $res = Order::remindSend($params); if ($res === false) return $this->error(Order::getStaticError()); return $this->success('提醒成功', []); } /** * 创建充值订单 */ public function actionCreateRecharge() { $post = Yii::$app->request->post(); $validateService = Yii::$app->services->validate; $rules = [ [['pay_price'], 'required'], ]; $valid = $validateService->validate($post, $rules); if (!$valid) { return $this->error($validateService->getFirstErrorSummary()); } $post['mall_id'] = $this->mall_id; $post['user_id'] = $this->user_id; $recharge = new RechargeOrders(); $res = $recharge->createOrder($post); return $this->success('操作成功', $res); } /** * 获取订单支付状态 */ public function actionGetIsPay() { $get = \Yii::$app->request->get(); if (!isset($get['trade_no'])) { return [ 'code' => 0, 'msg' => '无trade_no', ]; } $order_info = PaymentTrade::getOne([['out_trade_no' => $get['trade_no']]], true, '', '', 'is_pay'); return $this->success('操作成功', $order_info); } public function actionOrderStastics() { // 查询会员订单未读信息 $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; if (empty($this->user_id)) return $this->success('请登录'); $data = OrderUnreadMsg::orderStatistic($params); $data = OrderUnreadMsg::getOne([['=', 'mall_id', $this->mall_id], ['=', 'user_id', $this->user_id]], true); return $this->success(ApiCode::CODE_SUCCESS_TITLE, $data); } /** * @Description: 订单发货后客户端手动完成订单 * @DateTime 2023-07-06 17:49:50 * @return \yii\web\Response */ public function actionSureFinish(){ try{ $form = Yii::$app->request->post(); $rules = [[['id'], 'required'], [['id'], 'integer']]; $res = Yii::$app->services->validate->validate($form, $rules); if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage()); $form['mall_id'] = $this->mall_id; $form['user_id'] = $this->user_id; $form['operator_id'] = $this->user->id; $form['operator_name'] = $this->user->mobile; $res = Order::userInitiativeComplete($form); if ($res == false) throw new \Exception('操作订单失败:' . Order::getStaticError()); return $this->success('操作成功'); }catch(\Exception $e){ return $this->error($e->getMessage()); } } /** * 订单开票信息 * @return mixed|void */ public function actionBillInfo() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['order_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $select = 'id,order_no,pay_money,order_status,is_bill'; $where = []; $where[] = ['mall_id' => $this->mall_id]; $where[] = ['user_id' => $this->user_id]; $where[] = ['id' => $params['order_id']]; $order = Order::getOne($where, true, ['detail' => function ($query) { $query->select('order_id,goods_id,goods_name,pic_url,num'); }],false,$select); if (empty($order)) return $this->error('该订单不存在', []); if($order['order_status'] != OrderStatusEnum::ACCOMPLISH) return $this->error('该订单未完成,无法申请开票!', []); if(empty($order['is_bill'])){ $data['invoice_status'] = -1; unset($order['is_bill'],$order['order_status']); $data['info'] = $order; }else{ $detail = OrderInvoice::find()->where(['order_id'=>$order['id'],'status'=>StatusEnum::ENABLED])->select('id,type,head_type,head_name,account,email,address,mobile,tax_no,invoice_status,created_at,updated_at,bank_name,pay_money,remark')->asArray()->one(); if(empty($detail)) return $this->error('开票信息异常!', []); $data['invoice_status'] = $detail['invoice_status']; unset($detail['invoice_status']); $detail['created_at'] = date("Y-m-d H:i:s",$detail['created_at']); $detail['updated_at'] = date("Y-m-d H:i:s",$detail['updated_at']); $data['info'] = $detail; } return $this->success('操作成功', $data,ApiStatusEnum::CODE_SUCCESS,JSON_UNESCAPED_UNICODE); } /** * 申请开票 * @return mixed|void */ public function actionInvoice(){ $key = sprintf('Invoice:%s', $this->user_id); if (LockHelper::fLock($key)) return $this->error('请勿频繁请求'); $t = \Yii::$app->db->beginTransaction(); try { $params = Yii::$app->request->post(); $res = Yii::$app->services->validate->validate($params, [ [['order_id','pay_money','type','head_type'], 'required'], [['head_name','bank_name','account','email','address','mobile','tax_no','id'],'safe'] ]); if ($res === false) throw new \Exception(Yii::$app->services->validate->getErrorMessage()); $order = Order::findOne($params['order_id']); if(empty($order)) throw new \Exception('订单数据异常'); if($order['order_status'] != OrderStatusEnum::ACCOMPLISH) throw new \Exception('该订单未完成,无法申请开票!'); if($order['pay_money'] != $params['pay_money']) throw new \Exception('开票金额有误!'); if(empty($params['id']) && !empty($order['is_bill'])) throw new \Exception('该笔订单已申请开票'); $params['mall_id'] = $this->mall_id; $params['user_id'] = $this->user_id; $params['order_no'] = $order['order_no']; if(!empty($params['id'])){ $invoice = OrderInvoice::findOne($params['id']); if(empty($invoice)) throw new \Exception('数据异常'); if($invoice['invoice_status'] == 1) throw new \Exception('该笔订单已开票成功,请勿重复申请'); $params['invoice_status'] = 0; } $res = OrderInvoice::setData($params); if ($res === false) throw new \Exception(BalanceRechargeLog::getStaticError()); $order->is_bill = 1; $order->bill_time = time(); if(!$order->save()) throw new \Exception('开票失败,请稍后重试!'); $t->commit(); LockHelper::unFLock($key); return $this->success('操作成功'); } catch (\Exception $e) { $t->rollBack(); LockHelper::unFLock($key); return $this->error($e->getMessage()); } } public function actionGetConfirmReceiveData(){ $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['transaction_id'], 'required'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $payment_trade = \common\models\common\PaymentTrade::findOne(['third_trade_no'=>$params['transaction_id']]); if(empty($payment_trade)) return $this->error('订单信息不存在'); $params['mall_id']=$payment_trade['mall_id']; $res = \common\logic\wechat\WechatMiniProgramLogic::getOrder($params); if(empty($res['order'])||$res['errcode']!=0){ return $this->error('支付单不存在'); } // $logistics_type = 1;//物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提 $order_state_map =[ 1=>'待发货', 2=>'已发货', 3=>'确认收货', 4=>'交易完成', 5=>'已退款' ]; $logistics_type_map =[ 1=>'物流配送', 2=>'同城配送', 3=>'虚拟发货', 4=>'用户自提' ]; $mall = \common\models\mall\Mall::getOne([['id'=>$payment_trade['mall_id']]]); $goods_desc = $res['order']['shipping']['goods_desc']??''; $upload_time = ''; if(!empty($res['order']['shipping']['shipping_list'])){ foreach ($res['order']['shipping']['shipping_list'] as $item){ $goods_desc = $item['goods_desc']; $upload_time = date('Y年m月d日 H:i',$item['upload_time']); } } $data = [ 'order_state'=>$res['order']['order_state'], 'logistics_type'=>$res['order']['shipping']['logistics_type'], 'order_state_text'=>$order_state_map[$res['order']['order_state']]??'', 'logistics_type_text'=>$logistics_type_map[$res['order']['shipping']['logistics_type']]??'', 'upload_time'=>$upload_time, 'goods_desc'=>$goods_desc, 'transaction_id'=>$res['order']['transaction_id'], 'pay_time'=>date('Y年m月d日 H:i',$res['order']['pay_time']), 'pay_money'=>$payment_trade['pay_fee'], 'mall_id'=>$payment_trade['mall_id'], 'mall_name'=>$mall['name'] ]; return $this->success('success', $data, ApiStatusEnum::CODE_SUCCESS, 0); } public function actionDel() { $form = Yii::$app->request->post(); $rules = [[['id'], 'required'], [['id'], 'integer']]; $res = Yii::$app->services->validate->validate($form, $rules); if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage()); $form['mall_id'] = $this->mall_id; $form['user_id'] = $this->user_id; $form['operator_id'] = $this->user_id; $form['operator_name'] = $this->user->nickname??''; $res = Order::delByh5($form); if ($res === false) return $this->error(Order::getStaticError()); return $this->success(); } /** * 订单留言列表 * @return mixed|null * @throws \yii\base\InvalidConfigException * @throws \yii\di\NotInstantiableException * @throws \Exception */ public function actionLeave() { $order_id = Yii::$app->request->get('order_id', ''); if (!$order_id) { return $this->error('传递参数错误'); } $orderService = Yii::$container->get(\api\services\OrderService::class); return $this->success('请求成功', $orderService->leave($order_id,$this->mall_id)); } /** * 修改收货地址 * * @return void */ public function actionModifyAddress() { $addressId = $this->request->post('address_id'); $orderId = $this->request->post('order_id'); if (empty($addressId) || empty($orderId)) { $this->error('参数错误'); return; } // 修改地址 /** @var $orderService \api\services\OrderService */ $orderService = Yii::$container->get(\api\services\OrderService::class); try { $orderService->modifyAddress($this->user_id, $this->mall_id, $addressId, $orderId); $this->success(); }catch (\Exception $e) { if ($e instanceof \RuntimeException) { $this->error($e->getMessage()); return; } $this->error(); } } /** * 获取订单的收货地址 * * @return void * @throws \yii\base\InvalidConfigException * @throws \yii\di\NotInstantiableException */ public function actionGetOrderDeliveryAddress() { $orderId = $this->request->get('order_id'); if (empty($orderId)) { $this->error('参数错误'); return; } // 修改地址 /** @var $orderService \api\services\OrderService */ $orderService = Yii::$container->get(\api\services\OrderService::class); $this->success('success', $orderService->getOrderDeliveryAddress($this->user_id, $this->mall_id, $orderId)); } //根据order_no,获取订单数据 public function actionGetOrderByOrderNo() { $request = Yii::$app->request; if ($request->isGet) { try { $get = $request->get(); $res = Yii::$app->services->validate->validate($get, [ [['type'], 'integer'], [['order_no'], 'string'] ]); if (!$res) throw new Exception(Yii::$app->services->validate->getErrorMessage()); $get['mall_id'] = $this->mall_id; switch ($get['type']) { case 1: //主商城订单 $info = Order::getOrderByNo($get); break; case 2: //云库存补货订单 $info = \addons\CloudStock\common\models\CloudStockFillOrder::getOrderByNo($get); break; } return $this->success('获取成功', $info); } catch (\Exception $e) { return $this->error($e->getMessage()); } } } }