OrderController.php 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413
  1. <?php
  2. namespace api\modules\v1\controllers\order;
  3. use addons\CloudStock\common\logic\order\RestrictPurchases;
  4. use addons\Community\common\models\CommunityGoods;
  5. use addons\Community\common\service\SettingService;
  6. use addons\QiDingDong\common\service\RefundService;
  7. use addons\ServicePointAppointment\common\service\OrderService;
  8. use addons\ValetOrder\common\models\ValetOrder;
  9. use api\controllers\OnAuthController;
  10. use common\enums\AddonsEnum;
  11. use common\enums\ApiStatusEnum;
  12. use common\enums\AppEnum;
  13. use common\enums\GoodsTypeEnum;
  14. use common\enums\GlobalFuncEnum;
  15. use common\enums\MarketingTypeEnum;
  16. use common\enums\OrderSourceEnum;
  17. use common\enums\OrderStatusEnum;
  18. use common\enums\PayTypeEnum;
  19. use common\enums\RefundReasonEnum;
  20. use common\enums\RefundStatusEnum;
  21. use common\enums\RefundTypeEnum;
  22. use common\enums\ShippingTypeEnum;
  23. use common\enums\StatusEnum;
  24. use common\events\data\api\GetOrderListEvent;
  25. use common\globals\GlobalInvoke;
  26. use common\helpers\ApiCode;
  27. use common\logic\order\OrderFormLogic;
  28. use common\logic\order\OrderInitDataLogic;
  29. use common\logic\order\OrderLimitLogic;
  30. use common\logic\order\OrderMarketingLogic;
  31. use common\logic\order\OrderValidateLogic;
  32. use common\models\common\Express;
  33. use common\models\common\MallSetting;
  34. use common\models\common\PaymentTrade;
  35. use common\models\common\RechargeOrders;
  36. use common\models\goods\Goods;
  37. use common\models\goods\GoodsAttr;
  38. use common\models\goods\GoodsExtra;
  39. use common\models\mall\Mall;
  40. use common\models\mall\MallAddons;
  41. use common\models\order\Order;
  42. use common\models\order\OrderDetail;
  43. use common\models\order\OrderExtra;
  44. use common\models\order\OrderMarketing;
  45. use common\models\order\OrderPrescriptionDetails;
  46. use common\models\order\OrderRefund;
  47. use common\models\order\OrderRefundStep;
  48. use common\models\order\OrderUnreadMsg;
  49. use common\models\order\OrderUserHandle;
  50. use common\models\user\UserAddress;
  51. use common\models\user\UserPartitionRelationship;
  52. use common\models\user\UserSignAgreement;
  53. use common\models\order\OrderInvoice;
  54. use Yii;
  55. use yii\helpers\Json;
  56. use function Clue\StreamFilter\fun;
  57. use common\helpers\LockHelper;
  58. use common\models\order\OrderCommentsExtra;
  59. use common\models\order\OrderExpress;
  60. use Exception;
  61. /**
  62. * Class OrderController
  63. * @package api\modules\order\controllers
  64. */
  65. class OrderController extends OnAuthController
  66. {
  67. public $modelClass = '';
  68. /**
  69. *
  70. * 不用进行登录验证的方法
  71. *
  72. * 例如: ['index', 'update', 'create', 'view', 'delete']
  73. * 默认全部需要验证
  74. *
  75. * @var array
  76. */
  77. protected $authOptional = [
  78. 'get-confirm-receive-data',
  79. 'order-stastics'
  80. ];
  81. /**
  82. * 订单预览
  83. * @Author bing
  84. * @DateTime 2021-09-24 19:46:46
  85. * @return void
  86. * @copyright: Copyright (c) 2020 广东七件事集团
  87. */
  88. public function actionPreview()
  89. {
  90. try {
  91. $orderFormLogic = new OrderFormLogic();
  92. $form = $orderFormLogic->getDefaultform($this->mall_id, $this->user_id);
  93. $form->attributes = Yii::$app->request->post();
  94. $form['action'] = AppEnum::ACTION_PREVIEW;
  95. !empty($form->shipping_type) && $form->shipping_type = ShippingTypeEnum::LOGISTICS;
  96. // 初始化订单数据
  97. $orderInitDataLogic = new OrderInitDataLogic();
  98. $form = $orderInitDataLogic->execute($form, $form->type);
  99. if ($form === false) return $this->error($orderInitDataLogic->getError());
  100. $is_bind_popups = UserPartitionRelationship::getIsNeedPopups($this->mall_id, $this->user_id);
  101. if($is_bind_popups == 1) return $this->error('请进入商品详情页,绑定邀请码!');
  102. // 购买限制验证
  103. $orderLimitLogic = new OrderLimitLogic();
  104. $form = $orderLimitLogic->run($form);
  105. if ($form === false) return $this->error($orderLimitLogic->getError());
  106. // 获取收货地址
  107. $address_info = UserAddress::getUserAddress($this->user_id, $form->address_id);
  108. $form->address_id = $address_info['id']??0;
  109. // 强制免运费
  110. $form = $this->isForceFreeShipping($form);
  111. // 营销减免活动
  112. $orderMarketingLogic = new OrderMarketingLogic();
  113. $form = $orderMarketingLogic->run($form);
  114. if ($form === false) return $this->error($orderMarketingLogic->getError());
  115. $group_order_goods = $form['group_order_goods'];
  116. $group_order_goods_list = [];
  117. $gIds = [];
  118. foreach ($group_order_goods as $val){
  119. $group_order_goods_list[]=$val;
  120. foreach ($val['goods'] as $gId => $item) {
  121. $gIds[] = $gId;
  122. }
  123. }
  124. $marketing = $form['marketing']??[];
  125. $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]);
  126. if($form['total_pay_money']<=0){
  127. $tmp = [];
  128. foreach ($pay_type_list as $item){
  129. if($item['trade_type']=='default'){
  130. $tmp[]=$item;
  131. break;
  132. }
  133. }
  134. $pay_type_list = $tmp;
  135. }
  136. $shipping_type_list = ShippingTypeEnum::getMap();
  137. $option_list = [];
  138. $group_order_goods = $group_order_goods_list;
  139. $extends_fields = [];
  140. $info = compact('group_order_goods', 'marketing', 'address_info', 'pay_type_list', 'shipping_type_list', 'option_list', 'extends_fields');
  141. if($form['total_pay_money'] < 0) $form['total_pay_money'] = 0;
  142. $info['total_pay_money'] = '¥' . $form['total_pay_money'];
  143. $info['total_pay_money_not_coupon'] = $form['total_pay_money_not_coupon'];
  144. $info['is_address'] = $form['is_address'] ?? 0;
  145. $info['is_virtual'] = $form['is_virtual'] ?? 0;
  146. $info['is_sign_agreement'] = $form['is_sign_agreement'] ?? 0;
  147. $info['shipping_type'] = $form->data['shipping_type'] ?? null;
  148. // 农业补贴 - 是否需要显示推荐人输入框
  149. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_AGRICULTURAL_SUBSIDIES)) {
  150. $aConfig = Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_AGRICULTURAL_SUBSIDIES, 'basic');
  151. if($aConfig && isset($aConfig['goods'])){
  152. $tGoods = json_decode($aConfig['goods'], true);
  153. $tGids = array_column($tGoods, 'goods_id');
  154. $info['show_invite_form'] = StatusEnum::DISABLED;
  155. if ($aConfig['enable_bind_master'] == StatusEnum::ENABLED && !empty(array_intersect($tGids, $gIds))) {
  156. $info['show_invite_form'] = StatusEnum::ENABLED;
  157. }
  158. }
  159. // 判断是否包含当前商品
  160. // $info['show_invite_form'] = Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_AGRICULTURAL_SUBSIDIES, 'basic.enable_bind_master');
  161. }
  162. $form->data['type'] = $form->type;
  163. $form->data['need_not_express'] = $form->need_not_express;
  164. $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]);
  165. $info = !empty($invoke_res) ? $invoke_res : $info;
  166. if (!MallAddons::isInstall($this->mall_id, 'Community') && $form->need_not_express) {
  167. // 当时是在社区团购方法中进行判断是否,不需物流。并未考虑到用户没有安装社区团购插件
  168. $info['option_list'] = [];
  169. $info['is_address'] = 0;
  170. }
  171. // 当订单自提时,填写好地址,但点击优惠券重新请求接口,就会覆盖填写好的地址
  172. // 所以需要前端传来额外的值,然后赋值到地址(修改来自bug 11185)
  173. if ($form->attributes['data']['shipping_type'] == 2) {
  174. $info['address_info']['name'] = $form->attributes['data']['contact_name'] ? $form->attributes['data']['contact_name'] : $info['address_info']['name'];
  175. $info['address_info']['mobile'] = $form->attributes['data']['contact_phone'] ? $form->attributes['data']['contact_phone'] : $info['address_info']['mobile'];
  176. }
  177. return $this->success('操作成功', $info);
  178. }catch (\Exception $e){
  179. return $this->error($e->getMessage());
  180. }
  181. }
  182. /**
  183. * 是否强制免运费
  184. * @param $form
  185. * @return mixed
  186. */
  187. protected function isForceFreeShipping($form)
  188. {
  189. // 社区团购 是否强制免运费
  190. if (!$form->is_force_free_shipping && MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_COMMUNITY) &&
  191. (new SettingService())->isForceFreeShipping($this->mall_id)) { // 需要处理
  192. // 判断是否为社区团购订单
  193. // 这种判断仅限于定制创建的时候
  194. if ($form->action == AppEnum::ACTION_CREATE && in_array($form->shipping_type,
  195. [ShippingTypeEnum::PICKUP, ShippingTypeEnum::MERCHANT_DISTRIBUTION]) && !empty($form->extra_info)) {
  196. $ext = json_decode($form->extra_info, true);
  197. if (empty($ext['head_id'])) {
  198. return $form;
  199. }
  200. }
  201. // 如果有安装社区团购 并且
  202. $community_res = (new CommunityGoods())->orderPreviewAppendFields(['mall_id' => $this->mall_id, 'user_id' => $this->user_id,
  203. 'data' => [], 'params' => array_merge($form->data, ['type' => $form->type])]);
  204. $shipping_type = null;
  205. if (!empty($community_res['option_list']) && is_array($community_res['option_list'])) {
  206. $option_list = array_values(array_filter($community_res['option_list'], function ($val) {
  207. return $val['enable'] == StatusEnum::ENABLED;
  208. }));
  209. $shipping_type = $option_list[0]['key'] ?? null;
  210. }
  211. $shipping_type = $form->data['shipping_type'] ?? $shipping_type; // 如果前端没有传,那么就取默认第一个
  212. $form->is_force_free_shipping = in_array($shipping_type, [ShippingTypeEnum::PICKUP]);
  213. }
  214. return $form;
  215. }
  216. /**
  217. * 创建订单
  218. * @Author bing
  219. * @DateTime 2021-09-22 09:31:22
  220. * @return void
  221. * @copyright: Copyright (c) 2020 广东七件事集团
  222. */
  223. public function actionCreate()
  224. {
  225. try {
  226. $orderFormLogic = new OrderFormLogic();
  227. $form = $orderFormLogic->getDefaultform($this->mall_id, $this->user_id);
  228. $form->attributes = Yii::$app->request->post();
  229. $form['action'] = AppEnum::ACTION_CREATE;
  230. // 初始化订单数据
  231. $orderInitDataLogic = new OrderInitDataLogic();
  232. $form = $orderInitDataLogic->execute($form, $form->type);
  233. if ($form === false) return $this->error($orderInitDataLogic->getError());
  234. $is_bind_popups = UserPartitionRelationship::getIsNeedPopups($this->mall_id, $this->user_id);
  235. if($is_bind_popups == 1) return $this->error('请进入商品详情页,绑定邀请码!');
  236. // 购买限制验证
  237. $orderLimitLogic = new OrderLimitLogic();
  238. $form = $orderLimitLogic->run($form);
  239. if ($form === false) return $this->error($orderLimitLogic->getError());
  240. // 强制免运费
  241. $form = $this->isForceFreeShipping($form);
  242. // 数据校验
  243. $flag = OrderValidateLogic::run($form);
  244. if (is_string($flag)) return $this->error($flag);
  245. // 营销减免活动
  246. $orderMarketingLogic = new OrderMarketingLogic();
  247. $form = $orderMarketingLogic->run($form, true);
  248. if ($form === false) return $this->error($orderMarketingLogic->getError());
  249. $goods_ids = array_column($form['order_goods'],'goods_id');
  250. if(MallAddons::isInstall($this->mall_id,'CloudStock')){
  251. (new RestrictPurchases())->orderCreate(['user_id' => $this->user_id,'mall_id' => $this->mall_id,'type' => 'order','goods_ids'=>$goods_ids]);
  252. }
  253. $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]);
  254. if($need_auth === true){
  255. //需要先进行实名认证
  256. return $this->error('请先进行实名认证',[],ApiStatusEnum::CODE_ERROR_NEED_REAL_AUTH);
  257. }
  258. if (MallAddons::isInstall($this->mall_id, 'Community')) { // 检查是否安装社区团购插件
  259. $form->data['type'] = $form->type;
  260. $res = CommunityGoods::checkCommunityGoods(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'params' => $form->data]);
  261. if ($res === false) return $this->error(CommunityGoods::getStaticError());
  262. }
  263. // print_r($form);exit;
  264. $res = Order::createOrder($form);
  265. if ($res === false) return $this->error(Order::getStaticError());
  266. if (!empty($res['cart_list'])) unset($res['cart_list']); //可能因为社安消防插件而返回该数据,删除字段
  267. return $this->success('操作成功', $res);
  268. }catch (\Exception $e){
  269. return $this->error($e->getMessage());
  270. }
  271. }
  272. public function actionList()
  273. {
  274. $params = \Yii::$app->request->get();
  275. $where[] = ['mall_id' => $this->mall_id];
  276. $where[] = ['user_id' => $this->user_id];
  277. $where[] = ['status' => StatusEnum::ENABLED];
  278. $where[] = ['not in', 'order_source', [OrderSourceEnum::SOURCE_SELF_MALL,OrderSourceEnum::SOURCE_RESERVE,OrderSourceEnum::SOURCE_STORE_RESERVE]];
  279. $where[] = ['not in', 'marketing_type', [AddonsEnum::ADDONS_NAME_LAO_DA_FU]];
  280. if (isset($params['order_status']) && $params['order_status'] != 999){
  281. if($params['order_status'] == OrderStatusEnum::SING){
  282. $where[] = ['order_status' => [OrderStatusEnum::SING, OrderStatusEnum::TAKE_FINISH]];
  283. }else{
  284. $where[] = ['order_status' => $params['order_status']];
  285. }
  286. $where[] = ['is_feedback' => [OrderStatusEnum::NOT_FEEDBACK, OrderStatusEnum::FEEDBACKING]];
  287. } else { // 当订单选手全部时显示所有并且不显示前端删除
  288. $where[] = ['!=', 'order_status', OrderStatusEnum::REPEAL];
  289. }
  290. if(!empty($params['keyword'])){
  291. $order_detail_list = OrderDetail::lists(['where'=>[
  292. ['mall_id'=>$this->mall_id],
  293. ['like','goods_name','%'.trim($params['keyword']).'%',false]
  294. ],'select'=>'order_id']);
  295. $order_ids = array_column($order_detail_list,'order_id');
  296. $where[]=[
  297. 'or',
  298. ['id'=>$order_ids],
  299. ['like','order_no','%'.trim($params['keyword']).'%',false]
  300. ];
  301. }
  302. $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';
  303. $params['order'] = 'id desc';
  304. $params['select'] = $select;
  305. $params['where'] = $where;
  306. $params['with'] = ['detail' => function ($query) {
  307. $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');
  308. }, 'orderPrescriptionDetails' => function ($query) {
  309. $query->select('order_id, prescription_status, prescription_err_msg');
  310. }];
  311. $order_list = Order::listPage($params);
  312. $order_list['mall_name'] = $this->mall['name'];
  313. $order_list['mall_logo'] = Yii::$app->services->setting->mall->get($this->mall_id, 'basic.logo');
  314. $score_name = Yii::$app->services->setting->mall->get($this->mall_id, 'score.score_name');
  315. $shipping_type_text = ShippingTypeEnum::getMap();
  316. $goodsStoreSetting = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_STORE,'goodsStore');
  317. $express_title_arr = $goodsStoreSetting['express_title_arr'] ?? '';
  318. $express_title_arr = $express_title_arr ? json_decode($express_title_arr,true) :[];
  319. if (!empty($order_list['list'])) {
  320. foreach ($order_list['list'] as $key => $val) {
  321. array_map(function ($arg) use (&$val) {
  322. if (!isset($val['num'])) $val['num'] = 0;
  323. $val['num'] += $arg['num'];
  324. }, $val['detail']);
  325. // 剩余库存
  326. $stock = [];
  327. if($val['detail']){
  328. foreach ($val['detail'] as $k => $v){
  329. $order_list['list'][$key]['detail'][$k]['price'] = $order_list['list'][$key]['detail'][$k]['price'] + $order_list['list'][$key]['detail'][$k]['adjust_money'];
  330. $order_list['list'][$key]['detail'][$k]['price'] = round($order_list['list'][$key]['detail'][$k]['price'],2);
  331. $goods_unit = Goods::getOne([['=','id',$v['goods_id']]],false,'','','unit')['unit'];
  332. $val['detail'][$k]['unit'] = $goods_unit;
  333. // 当订单关闭时可以直接再次购买
  334. if ($val['order_status'] == OrderStatusEnum::REPEAL) {
  335. // 查询商品是否有货
  336. $stock[] = [
  337. 'num' => $v['num'],
  338. 'store_id' => $v['store_id']??0,
  339. 'goods_id' => $v['goods_id'],
  340. 'attr_id' => $v['goods_attr_id'],
  341. 'stock' => GoodsAttr::find()->where(['id' => $v['goods_attr_id']])->select('stock')->scalar(),
  342. ];
  343. }
  344. }
  345. }
  346. if (!empty($order_list['list'][$key]['extra_info'])) {
  347. try {
  348. $extra_info = Json::decode($order_list['list'][$key]['extra_info']);
  349. } catch (\Exception $e) {}
  350. }
  351. // 获取支付金额
  352. $order_list['list'][$key] = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $this->mall_id, [
  353. 'order' => $val,
  354. 'mall_id' => $this->mall_id,
  355. ]) ?: $val;
  356. if(!empty($extra_info['rand_fee']['order']['money'])){
  357. $order_list['list'][$key]['pay_money'] = bcadd($order_list['list'][$key]['pay_money'],$extra_info['rand_fee']['order']['money'],2);
  358. }
  359. if (!empty($extra_info['mall_info'])) {
  360. $order_list['list'][$key]['mall_name'] = $extra_info['mall_info']['mall_name'];
  361. $order_list['list'][$key]['mall_logo'] = $extra_info['mall_info']['mall_logo'];
  362. $extra_info = null;
  363. }
  364. if (empty($order_list['list'][$key]['mall_name'])) $order_list['list'][$key]['mall_name'] = $this->mall['name'];
  365. 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');
  366. // 判断是否可以再次购买
  367. $is_agent = empty($stock) ? 0 : 1;
  368. foreach ($stock as $v) {
  369. // 当库存小于购买数量 不可再次购买
  370. if ($v['stock'] < $v['num']) {
  371. $is_agent = 0;
  372. }
  373. }
  374. $order_list['list'][$key]['is_agent'] = $is_agent;
  375. $order_list['list'][$key]['is_agent_data'] = $is_agent ? $stock : [];
  376. if ($val['marketing_type'] == 'ScoreMall' && !empty($val['score'])) $order_list['list'][$key]['pay_money'] .= '+' . $val['score'] . $score_name;
  377. $order_list['list'][$key]['shipping_type_text'] = $shipping_type_text[$val['shipping_type']] ?? '';
  378. if($val['store_id'] > 0 && $express_title_arr) $order_list['list'][$key]['shipping_type_text'] = $express_title_arr[$val['shipping_type']] ?? '';
  379. // 处理处方订单 订单状态
  380. if (
  381. $order_list['list'][$key]['goods_subtype'] == GoodsTypeEnum::GOODS_SUBTYPE_PRESCRIPTION &&
  382. $order_list['list'][$key]['order_status'] == OrderStatusEnum::NOT_PAY &&
  383. !empty($order_list['list'][$key]['orderPrescriptionDetails']) &&
  384. $order_list['list'][$key]['orderPrescriptionDetails']['prescription_status'] == OrderPrescriptionDetails::PRESCRIPTION_STATUS_UNOPEN
  385. ) {
  386. $order_list['list'][$key]['order_status'] = OrderStatusEnum::PRESCRIPTION_UNOPEN;
  387. $isExistPrescriptionOrder = true;
  388. }
  389. }
  390. $order_list['list'] = GlobalInvoke::exec(GlobalFuncEnum::ORDER_LIST, $this->mall_id, [
  391. 'order' => $order_list['list'], 'mall_id' => $this->mall_id
  392. ]) ?: $order_list['list'];
  393. $order_list['shipping_type_text'] = ShippingTypeEnum::getMap();
  394. $order_list['order_status_text'] = OrderStatusEnum::getMap();
  395. !empty($isExistPrescriptionOrder) && $order_list['order_status_text'] += OrderStatusEnum::getPrescriptionStatus();
  396. $order_list['is_feedback_text'] = OrderStatusEnum::getFeedbackMap();
  397. }
  398. // 获取插件内容
  399. $event = new GetOrderListEvent($this->mall_id, $order_list['list'], $this->user);
  400. Yii::$app->services->events->dispatch($event);
  401. $order_list['list'] = $event->getResultList();
  402. $order_list['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($this->mall_id, $this->platform);
  403. $order_list['marketing_type_map'] = MarketingTypeEnum::getMap();
  404. $order_setting = Yii::$app->services->setting->mall->get($this->mall_id, 'order');
  405. $order_list['is_show_invoice'] = isset($order_setting['is_show_invoice'] ) ? $order_setting['is_show_invoice'] : 0;
  406. $order_list['is_show_update_address'] = isset($order_setting['is_show_update_address'] ) ? $order_setting['is_show_update_address'] : 0;
  407. //获取团购配置
  408. $order_list['community_config'] = [];
  409. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_COMMUNITY)) {
  410. $config = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_COMMUNITY, 'basic');
  411. $order_list['community_config'] = [
  412. 'is_enable_write_off' => $config['is_enable_write_off'] ?? StatusEnum::DISABLED,
  413. 'is_platform_distribution' => $config['is_platform_distribution'] ?? StatusEnum::DISABLED
  414. ];
  415. }
  416. return $this->success('操作成功', $order_list);
  417. }
  418. /**
  419. * 订单详情
  420. * @return mixed|void
  421. */
  422. public function actionDetail()
  423. {
  424. $params = \Yii::$app->request->get();
  425. $res = \Yii::$app->services->validate->validate($params, [
  426. [['order_id'], 'required'],
  427. ]);
  428. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  429. $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,
  430. 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,
  431. clerk_code,out_trade_no,goods_subtype';
  432. $where = [];
  433. $where[] = ['mall_id' => $this->mall_id];
  434. $where[] = ['user_id' => $this->user_id];
  435. $where[] = ['id' => $params['order_id']];
  436. $order = Order::getOne($where, true, ['detail' => function ($query) {
  437. $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');
  438. }, 'orderPrescriptionDetails' => function ($query) {
  439. $query->select('order_id, medication_recipient, symptom, prescription_status');
  440. }], false, $select);
  441. if (empty($order)) return $this->error('该订单不存在', []);
  442. $marketing = OrderMarketing::getMarketingInfo($order);
  443. $order['order_status_text'] = OrderStatusEnum::getMap();
  444. $order['is_feedback_text'] = OrderStatusEnum::getFeedbackMap();
  445. $shipping_type_list = ShippingTypeEnum::getMap();
  446. if($order['store_id'] > 0){
  447. //查询名字自定义
  448. $goodsStoreSetting = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_STORE, 'goodsStore');
  449. $express_title_arr = $goodsStoreSetting['express_title_arr'] ?? '';
  450. $express_title_arr = $express_title_arr ? json_decode($express_title_arr,true) :[];
  451. foreach ($shipping_type_list as $k => $v) {
  452. $v = $express_title_arr[$k] ?? $v;
  453. $shipping_type_arr[$k] = $v;
  454. }
  455. $shipping_type_list = $shipping_type_arr;
  456. }
  457. $order['shipping_type_text'] = $shipping_type_list;
  458. $order['payment_type_text'] = PayTypeEnum::getMap();
  459. $order['pay_type_list'] = \Yii::$app->services->pay->getEnablePayment($this->mall_id, $this->platform);
  460. $order['change_price'] = array_sum(array_column($order['detail'],'adjust_money'));//预留字段
  461. $order['marketing'] = $marketing;
  462. $order['marketing_type_map'] =MarketingTypeEnum::getMap();
  463. $order_setting = Yii::$app->services->setting->mall->get($this->mall_id, 'order');
  464. $order['payment_expire_time'] = $order_setting['payment_expire_time']??30;
  465. $order['auto_receiving_time'] = $order_setting['auto_receiving_time']??14;
  466. $order['shipping_money'] = $order['shipping_money'] ?? 0;
  467. // 订单留言
  468. $leave = OrderExtra::getInfo(['=', 'order_id', $order['id']], 'message');
  469. $order['leave'] = $leave['message'] ?? '';
  470. // 订单物流备注
  471. $memoInfo = OrderExpress::find()->where(['order_id' => $order['id']])->select("memo")->asArray()->one();
  472. $order['memo'] = $memoInfo['memo'] ?? '';
  473. //查询商品单位
  474. if($order['detail']){
  475. $goods_attr_ids = $goods_ids = [];
  476. foreach ($order['detail'] as $v){
  477. if(empty($v['store_id'])){
  478. $goods_attr_ids[]=$v['goods_attr_id'];
  479. $goods_ids[]=$v['goods_id'];
  480. }
  481. }
  482. $goods_attr_list = [];
  483. if(!empty($goods_attr_ids)){
  484. $goods_attr_list = GoodsAttr::lists(['where'=>[['id'=>$goods_attr_ids]],'select'=>'id,original_price','index'=>'id']);
  485. }
  486. if(!empty($goods_ids)){
  487. $goods_list = Goods::lists(['where'=>[['id'=>$goods_ids]],'select'=>'id,unit,goods_source,can_feedback,goods_type','index'=>'id']);
  488. $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']);
  489. }
  490. foreach ($order['detail'] as $k => $v){
  491. if(empty($v['store_id'])){
  492. $order['detail'][$k]['unit'] = $order['detail'][$k]['order_source'] = $order['detail'][$k]['is_show_return_btn'] = $order['detail'][$k]['goods_type'] = '';
  493. $order['detail'][$k]['original_price'] = $goods_attr_list[$v['goods_attr_id']]['original_price']??0;
  494. if(isset($goods_list[$v['goods_id']])){
  495. $goods = $goods_list[$v['goods_id']];
  496. $order['detail'][$k]['unit'] = $goods['unit'];
  497. $order['detail'][$k]['order_source'] = $goods['goods_source'];
  498. $order['detail'][$k]['is_show_return_btn'] = $goods['can_feedback'];
  499. $order['detail'][$k]['goods_type'] = $goods['goods_type'];
  500. }
  501. }
  502. // 获取订单售后信息
  503. $order['detail'][$k]['order_refund'] = OrderRefund::find()
  504. ->where(['order_detail_id' => $v['id'], 'status' => StatusEnum::ENABLED])
  505. ->select('id, type')->orderBy('created_at desc')->asArray()->one();
  506. }
  507. }
  508. // 获取订单详情的状态文字描述
  509. $order['status_text'] = OrderStatusEnum::getApiStatus($order['status'], $order['shipping_type']);
  510. $order['status'] == OrderStatusEnum::NOT_PAY && $order['status_text']['desc'] = $order['payment_expire_time'] . $order['status_text']['desc'];
  511. $order['status'] == OrderStatusEnum::SHIPMENTS && $order['status_text']['desc'] = $order['auto_receiving_time'] . $order['status_text']['desc'];
  512. $order['is_show_return_btn'] = 0;
  513. $order['return_prompt_content'] = '';
  514. // 处理处方订单 订单状态
  515. if ($order['goods_subtype'] == GoodsTypeEnum::GOODS_SUBTYPE_PRESCRIPTION && !empty($order['orderPrescriptionDetails'])) {
  516. if ($order['order_status'] == OrderStatusEnum::NOT_PAY && $order['orderPrescriptionDetails']['prescription_status'] == OrderPrescriptionDetails::PRESCRIPTION_STATUS_UNOPEN) {
  517. $order['order_status'] = OrderStatusEnum::PRESCRIPTION_UNOPEN;
  518. $order['order_status_text'] += OrderStatusEnum::getPrescriptionStatus();
  519. }
  520. $order['orderPrescriptionDetails']['medication_recipient'] = json_decode($order['orderPrescriptionDetails']['medication_recipient'], true) ?: [];
  521. $order['orderPrescriptionDetails']['symptom'] = json_decode($order['orderPrescriptionDetails']['symptom'], true) ?: [];
  522. }
  523. $is_show_return_btn = $order_setting['is_show_return_btn'] ?? 0;
  524. if ($goods_extra_list) {
  525. //优化1417增加放弃退换货针对商品单独设置
  526. //产品确认 多商品情况下有一个商品有独立设置就按独立设置走
  527. $has_any_show = false;
  528. $all_independent = true;
  529. foreach ($goods_extra_list as $item) {
  530. if ($item['is_alone_show_return_btn'] == '1') {
  531. if ($item['is_show_return_btn'] == '1') {
  532. $has_any_show = true;
  533. break;// 发现一个显示,即可终止循环
  534. }
  535. } else {
  536. $all_independent = false;
  537. }
  538. }
  539. if ($is_show_return_btn) {
  540. // 平台显示时:优先判断是否有独立设置为显示
  541. if ($has_any_show) {
  542. $is_show_return_btn = 1;
  543. } else {
  544. // 存在非独立设置商品则显示,否则不显示
  545. $is_show_return_btn = $all_independent ? 0 : 1;
  546. }
  547. } else {
  548. // 平台不显示时:仅当存在独立设置为显示时显示
  549. $is_show_return_btn = $has_any_show ? 1 : 0;
  550. }
  551. }
  552. 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])){
  553. $order['is_show_return_btn'] = 1;
  554. $order['return_prompt_content'] = $order_setting['return_prompt_content'] ?? '';
  555. }
  556. $order['is_show_invoice'] = isset($order_setting['is_show_invoice'] ) ? $order_setting['is_show_invoice'] : 0;
  557. $order['is_show_update_address'] = isset($order_setting['is_show_update_address'] ) ? $order_setting['is_show_update_address'] : 0;
  558. // 公共调用
  559. $order = GlobalInvoke::exec(GlobalInvoke::ORDER_DETAIL, $this->mall_id, [
  560. 'order' => $order,
  561. 'mall_id' => $this->mall_id,
  562. ]) ?: $order;
  563. $sun_single_setting = Yii::$app->services->setting->mall->get($this->mall_id, 'sun_single');
  564. if(empty($sun_single_setting) || empty($sun_single_setting['type'])){
  565. $sun_single_default = MallSetting::getDefaultSunSingle();
  566. $poster_background = $sun_single_default['poster_background']['value'];
  567. $poster_notch = $sun_single_default['poster_notch']['value'];
  568. $border_color = $sun_single_default['border_color']['value'];
  569. $price_bg_color = $sun_single_default['price_bg_color']['value'];
  570. $price_font_color = $sun_single_default['price_font_color']['value'];
  571. $sun_single_setting_setting = $sun_single_default['setting']['value'];
  572. $sun_single_setting_type = $sun_single_default['type']['value'];
  573. }else{
  574. $poster_background = $sun_single_setting['poster_background']??'';
  575. $poster_notch = $sun_single_setting['poster_notch']??'';
  576. $border_color = $sun_single_setting['border_color']??'';
  577. $price_bg_color = $sun_single_setting['price_bg_color']??'';
  578. $price_font_color = $sun_single_setting['price_font_color']??'';
  579. $sun_single_setting_setting = $sun_single_setting['setting']??0;
  580. $sun_single_setting_type = $sun_single_setting['type'];
  581. }
  582. $order['sun_single'] = [
  583. 'setting'=>$sun_single_setting_setting,
  584. 'type'=>$sun_single_setting_type,
  585. 'poster_background'=>$poster_background,
  586. 'poster_notch'=>$poster_notch,
  587. 'border_color'=>$border_color,
  588. 'price_bg_color'=>$price_bg_color,
  589. 'price_font_color'=>$price_font_color,
  590. ];
  591. //获取团购配置
  592. $order['community_config'] = [];
  593. if (MallAddons::isInstall($order['mall_id'], AddonsEnum::ADDONS_NAME_COMMUNITY)) {
  594. $config = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_COMMUNITY, 'basic');
  595. $order['community_config'] = [
  596. 'is_enable_write_off' => $config['is_enable_write_off'] ?? StatusEnum::DISABLED,
  597. 'is_platform_distribution' => $config['is_platform_distribution'] ?? StatusEnum::DISABLED
  598. ];
  599. }
  600. $order['trade'] = PaymentTrade::getPayItemByOutTradeNo($order['out_trade_no']);
  601. $extra_info = json_decode($order['extra_info'], true);
  602. if(!empty($extra_info['rand_fee']['order']['money'])){
  603. $order['pay_money'] = bcadd($order['pay_money'],$extra_info['rand_fee']['order']['money'],2);
  604. }
  605. $order['score'] = floatval($order['score']);
  606. $order['marketing_course'] = [];
  607. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_COURSE) && $order['marketing_type'] == 'Course') {
  608. $course_ids = json_decode($order['extra_info'], true);
  609. //有赠送视频课程的订单,获取赠送的视频课程展示
  610. $order['marketing_course'] = \addons\Course\common\models\AddonsCourse::find()
  611. ->select('id,name,logo')
  612. ->where(['mall_id' => $this->mall_id, 'id' => $course_ids])
  613. ->asArray()
  614. ->all();
  615. }
  616. return $this->success('操作成功', $order, ApiStatusEnum::CODE_SUCCESS, 0);
  617. }
  618. /**
  619. * 更新订单操作
  620. * @return mixed|void
  621. */
  622. public function actionUpdateOrder()
  623. {
  624. $params = \Yii::$app->request->get();
  625. $res = \Yii::$app->services->validate->validate($params, [
  626. [['id', 'order_status'], 'required'],
  627. ]);
  628. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  629. $params['mall_id'] = $this->mall_id;
  630. $params['user_id'] = $this->user_id;
  631. $params['operator_id'] = $this->user_id;
  632. $params['operator_name'] = $this->user->nickname ?? '';
  633. $res = Order::close($params);
  634. if (!$res) return $this->error(Order::getStaticError());
  635. return $this->success('操作成功', []);
  636. }
  637. /**
  638. * 提交订单评价
  639. * @return mixed|void
  640. * @throws \yii\db\Exception
  641. */
  642. public function actionComments()
  643. {
  644. $params = \Yii::$app->request->post();
  645. $res = \Yii::$app->services->validate->validate($params, [
  646. [['order_id', 'comment_data'], 'required'],
  647. ]);
  648. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  649. // 确保每个评论数据都包含 show_tech 字段,默认为 0
  650. foreach ($params['comment_data'] as &$item) {
  651. if (!isset($item['show_tech'])) {
  652. $item['show_tech'] = 0; // 设置默认值为0
  653. }
  654. }
  655. $res = Order::postComments($params);
  656. if ($res === false) return $this->error(Order::getStaticError());
  657. return $this->success('操作成功');
  658. }
  659. /**
  660. * 加载提交售后订单数据
  661. * @Author: hua
  662. * @DateTime: 2021/10/7 10:29
  663. * @Copyright: copyright (c) 2021 广东七件事集团
  664. * @return mixed|void
  665. */
  666. public function actionToRefundSubmit()
  667. {
  668. $params = \Yii::$app->request->get();
  669. $res = \Yii::$app->services->validate->validate($params, [
  670. [['order_detail_id'], 'required'],
  671. ]);
  672. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  673. $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';
  674. $order_detail = OrderDetail::getOne([['id' => $params['order_detail_id']], 'user_id' => $this->user_id, 'mall_id' => $this->mall_id], 1, [], false, $select);
  675. if (empty($order_detail)) return $this->error('订单不存在');
  676. $order = Order::find()->select("extra_info,score,shipping_money,out_trade_no,pay_money,marketing_type")
  677. ->where(['id' => $order_detail['order_id']])->asArray()->one();
  678. if ($order_detail['marketing_type'] == AddonsEnum::ADDONS_NAME_SCORE_MALL) {
  679. $order_detail['extra_info'] = $order['extra_info'];
  680. $order_detail['pay_score'] = $order['score'];
  681. }
  682. // 公共调用
  683. $order_detail = GlobalInvoke::exec(GlobalInvoke::ORDER_REFUND_SUBMIT, $this->mall_id, [
  684. 'order_detail' => $order_detail,
  685. 'mall_id' => $this->mall_id,
  686. ]) ?: $order_detail;
  687. // 自提订单公共调用
  688. $order_detail = GlobalInvoke::exec(GlobalInvoke::INVOKE_ORDER_DETAILS_ITEM, $this->mall_id, [
  689. 'order_detail' => $order_detail,
  690. 'mall_id' => $this->mall_id,
  691. ]) ?: $order_detail;
  692. //价格等于商品价格加上修改价格
  693. $order_detail['goods_price'] = round($order_detail['goods_price'] + $order_detail['adjust_money'],2);
  694. $data['goods_info'] = $order_detail;
  695. $data['feedback_reason'] = RefundReasonEnum::getMap();
  696. $feedback_type = RefundTypeEnum::getArr();
  697. $data['feedback_type'] = [];
  698. if (in_array($order_detail['order_status'], [OrderStatusEnum::PAY, OrderStatusEnum::SHIPMENTS, OrderStatusEnum::TAKE, OrderStatusEnum::TAKE_FINISH])) {
  699. // 如果是自提订单需要判断商品是否允许申请自提退款
  700. if (!empty($order_detail['is_community_order'])) {
  701. if (!empty($order_detail['community_goods_setting']['enable_refund'])) {
  702. //待发货,
  703. $data['feedback_type'][] = $feedback_type[RefundTypeEnum::MONEY];
  704. }
  705. }else {
  706. //待发货,
  707. $data['feedback_type'][] = $feedback_type[RefundTypeEnum::MONEY];
  708. }
  709. }
  710. if (in_array($order_detail['order_status'], [OrderStatusEnum::SHIPMENTS,OrderStatusEnum::SING, OrderStatusEnum::TAKE_FINISH])) {
  711. //已发货,已收货
  712. if (empty($order_detail['is_community_order'])) { // 如果不是社区团购才需要显示退换货 换货的按钮
  713. $data['feedback_type'][] = $feedback_type[RefundTypeEnum::MONEY_AND_PRODUCT];
  714. $data['feedback_type'][] = $feedback_type[RefundTypeEnum::EXCHANGE_GOODS];
  715. }
  716. }
  717. $data['order_status'] = $order_detail['order_status'];
  718. $is_filter_money = false;
  719. // 企叮咚/企商通 发货后只能换货 不能仅退款
  720. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_QI_DING_DONG) && $order_detail['order_status'] != OrderStatusEnum::PAY) {
  721. // 并且是企叮咚的订单
  722. $is_filter_money = \addons\QiDingDong\common\service\OrderService::existOrder($order_detail['order_id']);
  723. }
  724. if (!$is_filter_money && MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_QI_SHANG_TONG) && $order_detail['order_status'] != OrderStatusEnum::PAY) {
  725. // 并且是企商通的订单
  726. $is_filter_money = \addons\QiShangTong\common\service\OrderService::existOrder($order_detail['order_id']);
  727. }
  728. if ($is_filter_money) {
  729. $tmp_feedback_type = $data['feedback_type'];
  730. $tmp_feedback_type = array_filter($tmp_feedback_type, function ($val) {
  731. return $val['id'] != RefundTypeEnum::MONEY;
  732. });
  733. $data['feedback_type'] = array_values($tmp_feedback_type);
  734. }
  735. // 如果是虚拟商品 那么就需要返回仅退款
  736. $goods = Goods::findOne(['id' => $order_detail['goods_id']]);
  737. if ($goods->can_feedback && $goods->goods_type == GoodsTypeEnum::GoodsTypeVirtual) {
  738. // 返回一个仅退款选项
  739. $data['feedback_type'] = [
  740. RefundTypeEnum::getArr()[RefundTypeEnum::MONEY]
  741. ];
  742. }
  743. $shipping_money = OrderRefund::isRefundShippingMoney($order_detail['order_id'],$order['shipping_money']);
  744. $data['shipping_money'] = $shipping_money;
  745. $data['order_marketing_type'] = $order['marketing_type'];
  746. return $this->success('操作成功', $data);
  747. }
  748. /**
  749. * 申请售后
  750. * @Author: hua
  751. * @DateTime: 2021/10/7 10:29
  752. * @Copyright: copyright (c) 2021 广东七件事集团
  753. * @return mixed|void
  754. */
  755. public function actionDoRefundSubmit()
  756. {
  757. $params = \Yii::$app->request->post();
  758. $res = \Yii::$app->services->validate->validate($params, [
  759. [['order_detail_id'], 'required'],
  760. [['shipping_status', 'pic_list', 'reason', 'refund_price', 'remark', 'type', 'num'], 'safe'],
  761. ]);
  762. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  763. $key = sprintf('DoRefundSubmit:%s', $this->user_id);
  764. if (LockHelper::fLock($key)) return $this->error('请勿频繁请求');
  765. // 判断是否安装了代客下单
  766. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_VALET_ORDER)) {
  767. // 判断当前订单是否为代客下单订单
  768. if (!empty(ValetOrder::find()->where(['mall_id' => $this->mall_id])
  769. ->andWhere(['order_id' => OrderDetail::find()->where(['id' => $params['order_detail_id']])->select('order_id')->scalar()])
  770. ->select('id')->scalar())) {
  771. $config = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_VALET_ORDER, 'basic');
  772. // 如果插件是开启状态,且可售后是关闭状态
  773. if (!empty($config['is_enable']) && empty($config['is_enable_order_refund'])) {
  774. LockHelper::unFLock($key);
  775. return $this->error("代客下单订单不可申请退款/售后");
  776. }
  777. }
  778. }
  779. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_SERVICE_POINT_APPOINTMENT) &&
  780. (new OrderService())->isReserveByOrderDetailId($this->mall_id, $params['order_detail_id'])) { // 服务点预约
  781. LockHelper::unFLock($key);
  782. return $this->error('预约订单含有预约后不可进行售后');
  783. }
  784. // 企叮咚
  785. if (MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_QI_DING_DONG)) {
  786. if (!RefundService::hasPic($params['order_detail_id'], $params['pic_list'])) {
  787. LockHelper::unFLock($key);
  788. return $this->error('图片不能为空');
  789. }
  790. }
  791. $params['user_id'] = $this->user_id;
  792. $params['mall_id'] = $this->mall_id;
  793. $where = [
  794. ['=', 'order_detail_id', $params['order_detail_id']],
  795. ['=', 'user_id', $this->user_id],
  796. ['=', 'mall_id', $this->mall_id],
  797. ['>', 'step_status', 0],
  798. ['<>', 'refund_status', RefundStatusEnum::REVOKE]
  799. ];
  800. $order_refund_model = OrderRefund::getOne($where, true);
  801. if ($order_refund_model) {
  802. LockHelper::unFLock($key);
  803. return $this->error('该订单商品已经申请过售后');
  804. }
  805. $res = OrderRefund::feedback($params);
  806. if ($res === false) {
  807. LockHelper::unFLock($key);
  808. return $this->error(Order::getStaticError());
  809. }
  810. $event = new \common\events\order\OrderRefundEvent();
  811. $event->mall_id = $this->mall_id;
  812. $order_detail['order_detail_id'] = $params['order_detail_id'];
  813. $order_detail['id'] = $res->id;
  814. $order_detail['operator_id'] = $this->user_id;
  815. $order_detail['operator_name'] = $this->user->nickname ?? '';
  816. $order_detail['type'] = 'apply';
  817. Yii::$app->services->events->dispatch($event, $order_detail, $event->listeners);
  818. LockHelper::unFLock($key);
  819. return $this->success('操作成功', ['id' => $res->id]);
  820. }
  821. /**
  822. * 退款列表
  823. * @return mixed|void
  824. */
  825. public function actionRefundList()
  826. {
  827. $params = \Yii::$app->request->get();
  828. $where[] = ['user_id' => $this->user_id];
  829. $where[] = ['mall_id' => $this->mall_id];
  830. $params['order'] = 'id desc';
  831. $params['where'] = $where;
  832. $params['with'] = ['step', 'orderDetail'];
  833. $list = OrderRefund::listPage($params);
  834. if($list['list']){
  835. foreach($list['list'] as $k=>$v){
  836. $goods_unit = Goods::getOne([['=','id',$v['orderDetail']['goods_id']]],false,'','','unit')['unit'];
  837. $list['list'][$k]['orderDetail']['unit'] = $goods_unit;
  838. }
  839. }
  840. $list['mall_name'] = $this->mall['name'];
  841. $list['refund_status_text'] = RefundStatusEnum::getMap();
  842. return $this->success('操作成功 ', $list);
  843. }
  844. /**
  845. * 撤销申请售后
  846. * @Author: hua
  847. * @DateTime: 2021/10/7 10:52
  848. * @Copyright: copyright (c) 2021 广东七件事集团
  849. * @return mixed|void
  850. */
  851. public function actionCancelRefund()
  852. {
  853. $params = \Yii::$app->request->get();
  854. $res = \Yii::$app->services->validate->validate($params, [
  855. [['id', 'order_detail_id'], 'safe'],
  856. ]);
  857. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  858. $params['mall_id'] = $this->mall_id;
  859. $params['user_id'] = $this->user_id;
  860. $params['operator_id'] = $this->user_id;
  861. $res = OrderRefund::cancelRefund($params);
  862. if ($res === false) return $this->error(OrderRefund::getStaticError());
  863. return $this->success('操作成功');
  864. }
  865. /**
  866. * 订单-收货
  867. * @Author: hua
  868. * @DateTime: 2021/10/7 14:50
  869. * @Copyright: copyright (c) 2021 广东七件事集团
  870. * @return mixed|void
  871. */
  872. public function actionTakeDelivery()
  873. {
  874. // 商品操作
  875. $form = Yii::$app->request->get();
  876. $rules = [[['id'], 'required'], [['id'], 'integer']];
  877. $res = Yii::$app->services->validate->validate($form, $rules);
  878. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  879. $form['mall_id'] = $this->mall_id;
  880. $form['user_id'] = $this->user_id;
  881. $form['operator_id'] = $this->user_id;
  882. $form['operator_name'] = $this->user->nickname ?? $this->user->mobile;
  883. $res = Order::takeDelivery($form);
  884. if (!empty(Order::$getRefundId)) {
  885. $data['refund_id'] = Order::$getRefundId;
  886. }
  887. if ($res === false) return $this->error(Goods::getStaticError(), $data ?? []);
  888. return $this->success();
  889. }
  890. /**
  891. * 获取快递公司列表
  892. * @Author: hua
  893. * @DateTime: 2021/10/8 14:38
  894. * @Copyright: copyright (c) 2021 广东七件事集团
  895. * @return mixed|void
  896. */
  897. public function actionExpressList()
  898. {
  899. $params['where'] = [['status' => StatusEnum::ENABLED]];
  900. $params['select'] = 'id,name,code';
  901. $list = Express::lists($params);
  902. return $this->success('', $list);
  903. }
  904. /**
  905. * 申请售后-商家同意后-买家发货
  906. * @Author: hua
  907. * @DateTime: 2021/10/8 14:42
  908. * @Copyright: copyright (c) 2021 广东七件事集团
  909. */
  910. public function actionRefundSend()
  911. {
  912. $params = \Yii::$app->request->post();
  913. $res = \Yii::$app->services->validate->validate($params, [
  914. [['id'], 'required'],
  915. [['express', 'express_no'], 'safe'],
  916. ]);
  917. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  918. $params['mall_id'] = $this->mall_id;
  919. $params['user_id'] = $this->user_id;
  920. $res = OrderRefundStep::refundSend($params);
  921. if ($res === false) return $this->error(Order::getStaticError());
  922. return $this->success('操作成功');
  923. }
  924. /**
  925. * 申请售后-换货-买家收货
  926. * @Author: hua
  927. * @DateTime: 2021/10/9 15:52
  928. * @Copyright: copyright (c) 2021 广东七件事集团
  929. * @return mixed|void
  930. */
  931. public function actionRefundTakeDelivery()
  932. {
  933. $params = \Yii::$app->request->get();
  934. $res = \Yii::$app->services->validate->validate($params, [
  935. [['id'], 'required'],
  936. ]);
  937. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  938. $params['mall_id'] = $this->mall_id;
  939. $params['user_id'] = $this->user_id;
  940. $res = OrderRefundStep::refundTakeDelivery($params);
  941. if ($res === false) return $this->error(OrderRefundStep::getStaticError());
  942. return $this->success('操作成功');
  943. }
  944. /**
  945. * 售后详情
  946. * @Author: hua
  947. * @DateTime: 2021/10/8 14:45
  948. * @Copyright: copyright (c) 2021 广东七件事集团
  949. */
  950. public function actionRefundDetail()
  951. {
  952. $params = \Yii::$app->request->get();
  953. if (!empty($params['id'])) {
  954. $where = [['id' => $params['id']], 'user_id' => $this->user_id];
  955. } else {
  956. $where = [['order_detail_id' => $params['order_detail_id']], 'user_id' => $this->user_id];
  957. }
  958. $detail = OrderRefund::getOne($where, true, ['step', 'orderDetail', 'order' => function ($query) {
  959. return $query->select('id, order_source, order_no');
  960. }], 'id desc');
  961. $detail['refund_status_map'] = RefundStatusEnum::getMap();
  962. $detail['step_status_map'] = RefundStatusEnum::getStepStatusText(); //adjust_money
  963. if($detail['orderDetail']['goods_price']) {
  964. $detail['orderDetail']['goods_price'] = $detail['orderDetail']['goods_price'] + $detail['orderDetail']['adjust_money'];
  965. $detail['orderDetail']['goods_price'] = round($detail['orderDetail']['goods_price'],2);
  966. }
  967. return $this->success('操作成功', $detail);
  968. }
  969. /**
  970. * @desc:去支付
  971. * @Author: hua
  972. * @Date: 2021/10/19
  973. * @Time: 14:12
  974. * @Copyright: copyright (c) 2021 广东七件事集团
  975. * @return mixed|void
  976. */
  977. public function actionToPay()
  978. {
  979. $params = \Yii::$app->request->get();
  980. $res = \Yii::$app->services->validate->validate($params, [
  981. [['id'], 'required'],
  982. [['re_pay'], 'safe']
  983. ]);
  984. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  985. $params['mall_id'] = $this->mall_id;
  986. $params['user_id'] = $this->user_id;
  987. $params['re_pay'] = true;
  988. $res = Order::toPay($params);
  989. if ($res === false) return $this->error(Order::getStaticError());
  990. return $this->success('操作成功', $res);
  991. }
  992. /**
  993. * @desc:提醒发货
  994. * @Author: hua
  995. * @Date: 2021/10/20
  996. * @Time: 9:04
  997. * @Copyright: copyright (c) 2021 广东七件事集团
  998. * @return mixed
  999. */
  1000. public function actionRemindSend()
  1001. {
  1002. $params = \Yii::$app->request->get();
  1003. $res = \Yii::$app->services->validate->validate($params, [
  1004. [['order_id'], 'required'],
  1005. ]);
  1006. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  1007. $params['user_id'] = $this->user_id;
  1008. $params['mall_id'] = $this->mall_id;
  1009. $params['user'] = $this->user;
  1010. $res = Order::remindSend($params);
  1011. if ($res === false) return $this->error(Order::getStaticError());
  1012. return $this->success('提醒成功', []);
  1013. }
  1014. /**
  1015. * 创建充值订单
  1016. */
  1017. public function actionCreateRecharge()
  1018. {
  1019. $post = Yii::$app->request->post();
  1020. $validateService = Yii::$app->services->validate;
  1021. $rules = [
  1022. [['pay_price'], 'required'],
  1023. ];
  1024. $valid = $validateService->validate($post, $rules);
  1025. if (!$valid) {
  1026. return $this->error($validateService->getFirstErrorSummary());
  1027. }
  1028. $post['mall_id'] = $this->mall_id;
  1029. $post['user_id'] = $this->user_id;
  1030. $recharge = new RechargeOrders();
  1031. $res = $recharge->createOrder($post);
  1032. return $this->success('操作成功', $res);
  1033. }
  1034. /**
  1035. * 获取订单支付状态
  1036. */
  1037. public function actionGetIsPay()
  1038. {
  1039. $get = \Yii::$app->request->get();
  1040. if (!isset($get['trade_no'])) {
  1041. return [
  1042. 'code' => 0,
  1043. 'msg' => '无trade_no',
  1044. ];
  1045. }
  1046. $order_info = PaymentTrade::getOne([['out_trade_no' => $get['trade_no']]], true, '', '', 'is_pay');
  1047. return $this->success('操作成功', $order_info);
  1048. }
  1049. public function actionOrderStastics()
  1050. {
  1051. // 查询会员订单未读信息
  1052. $params['mall_id'] = $this->mall_id;
  1053. $params['user_id'] = $this->user_id;
  1054. if (empty($this->user_id)) return $this->success('请登录');
  1055. $data = OrderUnreadMsg::orderStatistic($params);
  1056. $data = OrderUnreadMsg::getOne([['=', 'mall_id', $this->mall_id], ['=', 'user_id', $this->user_id]], true);
  1057. return $this->success(ApiCode::CODE_SUCCESS_TITLE, $data);
  1058. }
  1059. /**
  1060. * @Description: 订单发货后客户端手动完成订单
  1061. * @DateTime 2023-07-06 17:49:50
  1062. * @return \yii\web\Response
  1063. */
  1064. public function actionSureFinish(){
  1065. try{
  1066. $form = Yii::$app->request->post();
  1067. $rules = [[['id'], 'required'], [['id'], 'integer']];
  1068. $res = Yii::$app->services->validate->validate($form, $rules);
  1069. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  1070. $form['mall_id'] = $this->mall_id;
  1071. $form['user_id'] = $this->user_id;
  1072. $form['operator_id'] = $this->user->id;
  1073. $form['operator_name'] = $this->user->mobile;
  1074. $res = Order::userInitiativeComplete($form);
  1075. if ($res == false) throw new \Exception('操作订单失败:' . Order::getStaticError());
  1076. return $this->success('操作成功');
  1077. }catch(\Exception $e){
  1078. return $this->error($e->getMessage());
  1079. }
  1080. }
  1081. /**
  1082. * 订单开票信息
  1083. * @return mixed|void
  1084. */
  1085. public function actionBillInfo()
  1086. {
  1087. $params = \Yii::$app->request->get();
  1088. $res = \Yii::$app->services->validate->validate($params, [
  1089. [['order_id'], 'required'],
  1090. ]);
  1091. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  1092. $select = 'id,order_no,pay_money,order_status,is_bill';
  1093. $where = [];
  1094. $where[] = ['mall_id' => $this->mall_id];
  1095. $where[] = ['user_id' => $this->user_id];
  1096. $where[] = ['id' => $params['order_id']];
  1097. $order = Order::getOne($where, true, ['detail' => function ($query) {
  1098. $query->select('order_id,goods_id,goods_name,pic_url,num');
  1099. }],false,$select);
  1100. if (empty($order)) return $this->error('该订单不存在', []);
  1101. if($order['order_status'] != OrderStatusEnum::ACCOMPLISH) return $this->error('该订单未完成,无法申请开票!', []);
  1102. if(empty($order['is_bill'])){
  1103. $data['invoice_status'] = -1;
  1104. unset($order['is_bill'],$order['order_status']);
  1105. $data['info'] = $order;
  1106. }else{
  1107. $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();
  1108. if(empty($detail)) return $this->error('开票信息异常!', []);
  1109. $data['invoice_status'] = $detail['invoice_status'];
  1110. unset($detail['invoice_status']);
  1111. $detail['created_at'] = date("Y-m-d H:i:s",$detail['created_at']);
  1112. $detail['updated_at'] = date("Y-m-d H:i:s",$detail['updated_at']);
  1113. $data['info'] = $detail;
  1114. }
  1115. return $this->success('操作成功', $data,ApiStatusEnum::CODE_SUCCESS,JSON_UNESCAPED_UNICODE);
  1116. }
  1117. /**
  1118. * 申请开票
  1119. * @return mixed|void
  1120. */
  1121. public function actionInvoice(){
  1122. $key = sprintf('Invoice:%s', $this->user_id);
  1123. if (LockHelper::fLock($key)) return $this->error('请勿频繁请求');
  1124. $t = \Yii::$app->db->beginTransaction();
  1125. try {
  1126. $params = Yii::$app->request->post();
  1127. $res = Yii::$app->services->validate->validate($params, [
  1128. [['order_id','pay_money','type','head_type'], 'required'],
  1129. [['head_name','bank_name','account','email','address','mobile','tax_no','id'],'safe']
  1130. ]);
  1131. if ($res === false) throw new \Exception(Yii::$app->services->validate->getErrorMessage());
  1132. $order = Order::findOne($params['order_id']);
  1133. if(empty($order)) throw new \Exception('订单数据异常');
  1134. if($order['order_status'] != OrderStatusEnum::ACCOMPLISH) throw new \Exception('该订单未完成,无法申请开票!');
  1135. if($order['pay_money'] != $params['pay_money']) throw new \Exception('开票金额有误!');
  1136. if(empty($params['id']) && !empty($order['is_bill'])) throw new \Exception('该笔订单已申请开票');
  1137. $params['mall_id'] = $this->mall_id;
  1138. $params['user_id'] = $this->user_id;
  1139. $params['order_no'] = $order['order_no'];
  1140. if(!empty($params['id'])){
  1141. $invoice = OrderInvoice::findOne($params['id']);
  1142. if(empty($invoice)) throw new \Exception('数据异常');
  1143. if($invoice['invoice_status'] == 1) throw new \Exception('该笔订单已开票成功,请勿重复申请');
  1144. $params['invoice_status'] = 0;
  1145. }
  1146. $res = OrderInvoice::setData($params);
  1147. if ($res === false) throw new \Exception(BalanceRechargeLog::getStaticError());
  1148. $order->is_bill = 1;
  1149. $order->bill_time = time();
  1150. if(!$order->save()) throw new \Exception('开票失败,请稍后重试!');
  1151. $t->commit();
  1152. LockHelper::unFLock($key);
  1153. return $this->success('操作成功');
  1154. } catch (\Exception $e) {
  1155. $t->rollBack();
  1156. LockHelper::unFLock($key);
  1157. return $this->error($e->getMessage());
  1158. }
  1159. }
  1160. public function actionGetConfirmReceiveData(){
  1161. $params = \Yii::$app->request->get();
  1162. $res = \Yii::$app->services->validate->validate($params, [
  1163. [['transaction_id'], 'required'],
  1164. ]);
  1165. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  1166. $payment_trade = \common\models\common\PaymentTrade::findOne(['third_trade_no'=>$params['transaction_id']]);
  1167. if(empty($payment_trade)) return $this->error('订单信息不存在');
  1168. $params['mall_id']=$payment_trade['mall_id'];
  1169. $res = \common\logic\wechat\WechatMiniProgramLogic::getOrder($params);
  1170. if(empty($res['order'])||$res['errcode']!=0){
  1171. return $this->error('支付单不存在');
  1172. }
  1173. // $logistics_type = 1;//物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
  1174. $order_state_map =[
  1175. 1=>'待发货',
  1176. 2=>'已发货',
  1177. 3=>'确认收货',
  1178. 4=>'交易完成',
  1179. 5=>'已退款'
  1180. ];
  1181. $logistics_type_map =[
  1182. 1=>'物流配送',
  1183. 2=>'同城配送',
  1184. 3=>'虚拟发货',
  1185. 4=>'用户自提'
  1186. ];
  1187. $mall = \common\models\mall\Mall::getOne([['id'=>$payment_trade['mall_id']]]);
  1188. $goods_desc = $res['order']['shipping']['goods_desc']??'';
  1189. $upload_time = '';
  1190. if(!empty($res['order']['shipping']['shipping_list'])){
  1191. foreach ($res['order']['shipping']['shipping_list'] as $item){
  1192. $goods_desc = $item['goods_desc'];
  1193. $upload_time = date('Y年m月d日 H:i',$item['upload_time']);
  1194. }
  1195. }
  1196. $data = [
  1197. 'order_state'=>$res['order']['order_state'],
  1198. 'logistics_type'=>$res['order']['shipping']['logistics_type'],
  1199. 'order_state_text'=>$order_state_map[$res['order']['order_state']]??'',
  1200. 'logistics_type_text'=>$logistics_type_map[$res['order']['shipping']['logistics_type']]??'',
  1201. 'upload_time'=>$upload_time,
  1202. 'goods_desc'=>$goods_desc,
  1203. 'transaction_id'=>$res['order']['transaction_id'],
  1204. 'pay_time'=>date('Y年m月d日 H:i',$res['order']['pay_time']),
  1205. 'pay_money'=>$payment_trade['pay_fee'],
  1206. 'mall_id'=>$payment_trade['mall_id'],
  1207. 'mall_name'=>$mall['name']
  1208. ];
  1209. return $this->success('success', $data, ApiStatusEnum::CODE_SUCCESS, 0);
  1210. }
  1211. public function actionDel()
  1212. {
  1213. $form = Yii::$app->request->post();
  1214. $rules = [[['id'], 'required'], [['id'], 'integer']];
  1215. $res = Yii::$app->services->validate->validate($form, $rules);
  1216. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  1217. $form['mall_id'] = $this->mall_id;
  1218. $form['user_id'] = $this->user_id;
  1219. $form['operator_id'] = $this->user_id;
  1220. $form['operator_name'] = $this->user->nickname??'';
  1221. $res = Order::delByh5($form);
  1222. if ($res === false) return $this->error(Order::getStaticError());
  1223. return $this->success();
  1224. }
  1225. /**
  1226. * 订单留言列表
  1227. * @return mixed|null
  1228. * @throws \yii\base\InvalidConfigException
  1229. * @throws \yii\di\NotInstantiableException
  1230. * @throws \Exception
  1231. */
  1232. public function actionLeave()
  1233. {
  1234. $order_id = Yii::$app->request->get('order_id', '');
  1235. if (!$order_id) {
  1236. return $this->error('传递参数错误');
  1237. }
  1238. $orderService = Yii::$container->get(\api\services\OrderService::class);
  1239. return $this->success('请求成功', $orderService->leave($order_id,$this->mall_id));
  1240. }
  1241. /**
  1242. * 修改收货地址
  1243. *
  1244. * @return void
  1245. */
  1246. public function actionModifyAddress()
  1247. {
  1248. $addressId = $this->request->post('address_id');
  1249. $orderId = $this->request->post('order_id');
  1250. if (empty($addressId) || empty($orderId)) {
  1251. $this->error('参数错误');
  1252. return;
  1253. }
  1254. // 修改地址
  1255. /** @var $orderService \api\services\OrderService */
  1256. $orderService = Yii::$container->get(\api\services\OrderService::class);
  1257. try {
  1258. $orderService->modifyAddress($this->user_id, $this->mall_id, $addressId, $orderId);
  1259. $this->success();
  1260. }catch (\Exception $e) {
  1261. if ($e instanceof \RuntimeException) {
  1262. $this->error($e->getMessage());
  1263. return;
  1264. }
  1265. $this->error();
  1266. }
  1267. }
  1268. /**
  1269. * 获取订单的收货地址
  1270. *
  1271. * @return void
  1272. * @throws \yii\base\InvalidConfigException
  1273. * @throws \yii\di\NotInstantiableException
  1274. */
  1275. public function actionGetOrderDeliveryAddress()
  1276. {
  1277. $orderId = $this->request->get('order_id');
  1278. if (empty($orderId)) {
  1279. $this->error('参数错误');
  1280. return;
  1281. }
  1282. // 修改地址
  1283. /** @var $orderService \api\services\OrderService */
  1284. $orderService = Yii::$container->get(\api\services\OrderService::class);
  1285. $this->success('success', $orderService->getOrderDeliveryAddress($this->user_id, $this->mall_id, $orderId));
  1286. }
  1287. //根据order_no,获取订单数据
  1288. public function actionGetOrderByOrderNo()
  1289. {
  1290. $request = Yii::$app->request;
  1291. if ($request->isGet) {
  1292. try {
  1293. $get = $request->get();
  1294. $res = Yii::$app->services->validate->validate($get, [
  1295. [['type'], 'integer'],
  1296. [['order_no'], 'string']
  1297. ]);
  1298. if (!$res) throw new Exception(Yii::$app->services->validate->getErrorMessage());
  1299. $get['mall_id'] = $this->mall_id;
  1300. switch ($get['type']) {
  1301. case 1: //主商城订单
  1302. $info = Order::getOrderByNo($get);
  1303. break;
  1304. case 2: //云库存补货订单
  1305. $info = \addons\CloudStock\common\models\CloudStockFillOrder::getOrderByNo($get);
  1306. break;
  1307. }
  1308. return $this->success('获取成功', $info);
  1309. } catch (\Exception $e) {
  1310. return $this->error($e->getMessage());
  1311. }
  1312. }
  1313. }
  1314. }