| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413 |
- <?php
- namespace api\modules\v1\controllers\order;
- use addons\CloudStock\common\logic\order\RestrictPurchases;
- use addons\Community\common\models\CommunityGoods;
- use addons\Community\common\service\SettingService;
- use addons\QiDingDong\common\service\RefundService;
- use addons\ServicePointAppointment\common\service\OrderService;
- use addons\ValetOrder\common\models\ValetOrder;
- use api\controllers\OnAuthController;
- use common\enums\AddonsEnum;
- use common\enums\ApiStatusEnum;
- use common\enums\AppEnum;
- use common\enums\GoodsTypeEnum;
- use common\enums\GlobalFuncEnum;
- use common\enums\MarketingTypeEnum;
- use common\enums\OrderSourceEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\PayTypeEnum;
- use common\enums\RefundReasonEnum;
- use common\enums\RefundStatusEnum;
- use common\enums\RefundTypeEnum;
- use common\enums\ShippingTypeEnum;
- use common\enums\StatusEnum;
- use common\events\data\api\GetOrderListEvent;
- use common\globals\GlobalInvoke;
- use common\helpers\ApiCode;
- use common\logic\order\OrderFormLogic;
- use common\logic\order\OrderInitDataLogic;
- use common\logic\order\OrderLimitLogic;
- use common\logic\order\OrderMarketingLogic;
- use common\logic\order\OrderValidateLogic;
- use common\models\common\Express;
- use common\models\common\MallSetting;
- use common\models\common\PaymentTrade;
- use common\models\common\RechargeOrders;
- use common\models\goods\Goods;
- use common\models\goods\GoodsAttr;
- use common\models\goods\GoodsExtra;
- use common\models\mall\Mall;
- use common\models\mall\MallAddons;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\order\OrderExtra;
- use common\models\order\OrderMarketing;
- use common\models\order\OrderPrescriptionDetails;
- use common\models\order\OrderRefund;
- use common\models\order\OrderRefundStep;
- use common\models\order\OrderUnreadMsg;
- use common\models\order\OrderUserHandle;
- use common\models\user\UserAddress;
- use common\models\user\UserPartitionRelationship;
- use common\models\user\UserSignAgreement;
- use common\models\order\OrderInvoice;
- use Yii;
- use yii\helpers\Json;
- use function Clue\StreamFilter\fun;
- use common\helpers\LockHelper;
- use common\models\order\OrderCommentsExtra;
- use common\models\order\OrderExpress;
- use Exception;
- /**
- * Class OrderController
- * @package api\modules\order\controllers
- */
- class OrderController extends OnAuthController
- {
- public $modelClass = '';
- /**
- *
- * 不用进行登录验证的方法
- *
- * 例如: ['index', 'update', 'create', 'view', 'delete']
- * 默认全部需要验证
- *
- * @var array
- */
- protected $authOptional = [
- 'get-confirm-receive-data',
- 'order-stastics'
- ];
- /**
- * 订单预览
- * @Author bing
- * @DateTime 2021-09-24 19:46:46
- * @return void
- * @copyright: Copyright (c) 2020 广东七件事集团
- */
- public function actionPreview()
- {
- try {
- $orderFormLogic = new OrderFormLogic();
- $form = $orderFormLogic->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());
- }
- }
- }
- }
|