OrderController.php 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\admin\controllers;
  8. use app\constants\OptionSetting;
  9. use app\models\AccountLog;
  10. use app\models\CloudGoodsBind;
  11. use app\models\common\admin\order\CommonUpdateAddress;
  12. use app\models\Express;
  13. use app\models\Goods;
  14. use app\models\MdProfit;
  15. use app\models\Order;
  16. use app\models\OrderComment;
  17. use app\models\OrderDetail;
  18. use app\models\OrderGoodsCancel;
  19. use app\models\OrderRefund;
  20. use app\models\OrderTransit;
  21. use app\models\SaaSLeaguePriceLog;
  22. use app\models\SaasUser;
  23. use app\models\Shop;
  24. use app\models\Store;
  25. use app\models\StoreCloud;
  26. use app\models\Supplier;
  27. use app\models\UserPayMonth;
  28. use app\modules\admin\models\MerchantForm;
  29. use app\modules\admin\models\OrderClerkForm;
  30. use app\modules\admin\models\OrderMessageForm;
  31. use app\modules\admin\models\OrderPriceForm;
  32. use app\modules\admin\models\OrderSendForm;
  33. use app\modules\client\models\v1\order\OrderForm;
  34. use app\modules\client\models\v1\ShareMoneyForm;
  35. use app\modules\common\models\NotifyForm;
  36. use app\utils\BookOrderNum;
  37. use app\utils\ExportList;
  38. use app\utils\OrderNo;
  39. use app\utils\OrderRevoke;
  40. use app\utils\PrintOrder;
  41. use app\utils\Refund;
  42. use yii\helpers\Html;
  43. use app\models\User;
  44. use app\modules\admin\models\ExpressDetailForm;
  45. use app\modules\admin\models\OrderCommentForm;
  46. use app\modules\admin\models\OrderListForm;
  47. use app\modules\admin\models\OrderRefundListForm;
  48. use app\modules\admin\models\OrderRevokeForm;
  49. use app\modules\admin\models\OrderRefundForm;
  50. use app\modules\admin\models\OrderShopForm;
  51. use app\models\OrderPayOffline;
  52. use app\utils\Notice\NoticeSend;
  53. use app\utils\PrintExpress;
  54. use app\models\VerifyCardSale;
  55. use app\models\Admin;
  56. class OrderController extends BaseController
  57. {
  58. /**
  59. * 平台商品订单提醒
  60. * @return \yii\web\Response
  61. */
  62. public function actionMsg() {
  63. $admin = get_admin();
  64. $store_id = get_store_id();
  65. $mch_id = get_mch_id();
  66. $md_id = input_params('md_id');
  67. $media = \Yii::$app->request->hostInfo . '/web/v1/statics/wav/store/W5611.wav';
  68. $data = [
  69. 'hasMsg' => 0,
  70. 'desc' => '',
  71. 'media' => $media,
  72. ];
  73. $msg = $this->getMsg($admin, $store_id, $md_id, $mch_id);
  74. if($msg['hasMsg']){
  75. $data['hasMsg'] = 1;
  76. $data['desc'] = $msg['desc'];
  77. }
  78. return $this->asJson([
  79. 'code' => 0,
  80. 'msg' => 'ok',
  81. 'data' => $data,
  82. '$admin' => $admin['username'],
  83. '$admin_type' => $admin['type'],
  84. '$store_id' => $store_id,
  85. '$md_id' => $md_id,
  86. ]);
  87. }
  88. public function getMsg($admin, $store_id, $md_id, $mch_id = 0) {
  89. $desc = '';
  90. $hasMsg = 0;
  91. if($admin['type'] == Admin::ADMIN_TYPE_SUPPLIER){
  92. $supplier_id = $admin['type_id'];
  93. $form = new \app\modules\admin\models\SupplierForm();
  94. $form->supplier_id = $supplier_id;
  95. $res = $form->getLastOrderInfo();
  96. if($res['data']['order_info']){
  97. $hasMsg = $res['data']['order_info']['id'];
  98. $desc .= sprintf('🟢提醒:订单号:%s 支付时间:%s', $res['data']['order_info']['order_no'], date('H:i:s', $res['data']['order_info']['pay_time']));
  99. }
  100. if($res['data']['purchase_order_info']){
  101. $hasMsg = $res['data']['purchase_order_info']['id'];
  102. $desc .= sprintf('🟢提醒:订单号:%s 支付时间:%s', $res['data']['purchase_order_info']['order_no'], date('H:i:s', $res['data']['purchase_order_info']['pay_time']));
  103. }
  104. }else if(in_array($admin['type'], [Admin::ADMIN_TYPE_DEFAULT, Admin::ADMIN_TYPE_STORE, Admin::ADMIN_TYPE_MD])){
  105. $cacheK = 'chidian_admin_frontend_orderMsg_maxId_' . $admin['username'] . $store_id . $md_id;
  106. $cacheV = (int)cache()->get($cacheK);
  107. $query = Order::find()->where([
  108. 'store_id' => $store_id,
  109. 'is_pay' => 1,
  110. ])->andWhere([
  111. 'and',
  112. ['>', 'id', $cacheV],
  113. ['>', 'pay_time', time() - 60 * 3],
  114. ])->orderBy('id DESC');
  115. if($md_id){
  116. $query->andWhere(['md_id' => $md_id]);
  117. }
  118. if($mch_id){
  119. $query->andWhere(['mch_id' => $mch_id]);
  120. }
  121. $order = $query->limit(1)->one();
  122. if($order){
  123. $hasMsg = $order->id;
  124. $desc = sprintf('提醒:订单号:%s 支付时间:%s', $order->order_no, date('H:i:s', $order->pay_time));
  125. cache()->set($cacheK, $order->id);
  126. }
  127. }
  128. return [
  129. 'hasMsg' => $hasMsg,
  130. 'desc' => $desc,
  131. ];
  132. }
  133. /**
  134. * 平台商品订单列表
  135. * @return \yii\web\Response
  136. */
  137. public function actionList() {
  138. $store_id = get_store_id();
  139. $form = new OrderListForm();
  140. $form->attributes = get_params();
  141. $is_offline = get_params('is_offline');
  142. if (isset($is_offline)) {
  143. $form->is_offline = explode(',', $is_offline);
  144. } else {
  145. $form->is_offline = Order::IS_OFFLINE_FALSE;
  146. }
  147. if($form->order_origin == 4){
  148. unset($form->is_offline);
  149. }
  150. $form->store_id = $store_id;
  151. $form->supplier_id = get_params('supplier_id');
  152. $form->order_id = get_params('order_id');
  153. $form->type = get_params('type');
  154. $form->province_id = get_params('province_id');
  155. $form->city_id = get_params('city_id');
  156. $form->district_id = get_params('district_id');
  157. if(get_mch_id()){
  158. $form->mch = 1;
  159. $form->mch_id = get_mch_id();
  160. }
  161. return $this->asJson($form->search(0, all_params()));
  162. }
  163. /**
  164. * 获取快递单号
  165. */
  166. public function actionGetExpressData()
  167. {
  168. $form = new OrderListForm();
  169. $form->store_id = get_store_id();
  170. $form->order_id = post_params("order_id", 0);
  171. return $this->asJson($form->getExpressData());
  172. }
  173. public function actionRefundMoney()
  174. {
  175. $store_id = get_store_id();
  176. $where = [
  177. 'id' => input_params('order_id', 0),
  178. 'is_delete' => Order::IS_DELETE_FALSE,
  179. // 'store_id' => $store_id,
  180. // 'mch_id' => 0,
  181. ];
  182. $order = Order::findOne($where);
  183. if (!$order) {
  184. return $this->asJson([
  185. 'code' => 1,
  186. 'msg' => '订单不存在,请刷新页面后重试'
  187. ]);
  188. }
  189. $form = new OrderRevokeForm();
  190. $desc = input_params('desc', '');
  191. $refund_price = input_params('refund_price', 0.01);
  192. return $this->asJson($form->refundMoney($order, $desc, $refund_price));
  193. }
  194. /**
  195. * 平台商品订单取消
  196. */
  197. public function actionApplyOrderDelete()
  198. {
  199. $store_id = get_store_id();
  200. if ($store_id <= 0) {
  201. $store_id = [0, -1];
  202. }
  203. $where = [
  204. 'id' => post_params('id'),
  205. 'is_delete' => Order::IS_DELETE_FALSE,
  206. // 'store_id' => $store_id, //先注释掉,代理发货不验证此参数
  207. // 'mch_id' => 0,
  208. ];
  209. $handle_type = \app\models\OrderAdminHandleLog::HANDLE_TYPE_CANCEL;
  210. // type=1 后台主要取消订单, type=0 用户发起订单取消申请
  211. if (post_params('type') == Order::CANCEL_USER_TYPE) {
  212. $where['apply_delete'] = Order::ORDER_APPLY_DELETE;
  213. $handle_type = \app\models\OrderAdminHandleLog::HANDLE_TYPE_AGREE_CANCEL;
  214. }
  215. $order = Order::findOne($where);
  216. if (!$order) {
  217. return $this->asJson([
  218. 'code' => 1,
  219. 'msg' => '订单不存在,请刷新页面后重试'
  220. ]);
  221. }
  222. // 发送备注消息
  223. $order->remark = post_params('remark', '');
  224. // 同意
  225. if (post_params('status') == 1) {
  226. // if (post_params('type') == Order::CANCEL_BACK_TYPE) {
  227. //
  228. // }
  229. ////修改未支付但是取消订单的逻辑
  230. // if (intval($order->is_pay) === 1 || (intval($order->is_pay) === 0 && intval($order->pay_type) === Order::PAY_TYPE_COD)) {
  231. //TODO 取消订单需要退积分,这里剩余如果检测到是平台操作,就使用saas_user添加积分信息
  232. $form = new OrderRevokeForm();
  233. $form->order_id = $order->id;
  234. $form->delete_pass = true;
  235. $form->user_id = $order->user_id;
  236. $form->store_id = $order->store_id;
  237. $res = $form->save();
  238. if ($res['code'] == 0) {
  239. VerifyCardSale::cancelCard($order);
  240. $order->save();
  241. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
  242. if ($order->order_type == Order::ORDER_TYPE_Adopt) {
  243. NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 1);
  244. }else{
  245. NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 0);
  246. }
  247. // 订单打印
  248. if ((int)$order->md_id === -1 || (int)$order->md_id === 0 || !isset($order->md_id)) {
  249. $order->md_id = 0;
  250. }
  251. $printer_order = new PrintOrder($order->store_id, $order->id, 'confirm', 0, $order->md_id, 0, $order['mch_id']);
  252. $printer_order->is_refund = true;
  253. $printer_order->print_order();
  254. $check = SaaSLeaguePriceLog::findOne(['order_id' => $order->id, 'type' => 4]);
  255. if($order->take_price > 0 ){
  256. $user = User::findOne($order->user_id);
  257. $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
  258. if($saas_user){
  259. $take_price = $order->take_price;
  260. $before = $saas_user->league_price;
  261. $saas_user->updateCounters(['league_price' => floatval($take_price)]);
  262. SaaSLeaguePriceLog::setLeaguePriceLog(
  263. $order->store_id,
  264. $saas_user->id,
  265. $take_price,
  266. $before,
  267. SaaSLeaguePriceLog::TYPE_CANCEL,
  268. SaaSLeaguePriceLog::SEND_TYPE,
  269. SaaSLeaguePriceLog::ROLE_USER,
  270. $order->id
  271. );
  272. }
  273. }
  274. //如果已经转单 就调用取消接口
  275. $orderTransit = OrderTransit::findOne(['order_id' => $order->id, 'is_delete' => 0]);
  276. if ($orderTransit) {
  277. $merchant = new MerchantForm();
  278. $merchant->order_id = $orderTransit->cloud_order_id;
  279. $result = $merchant->purchaseOrderCancel();
  280. debug_log('云仓订单取消');
  281. debug_log($result);
  282. }
  283. }
  284. // }
  285. } else { //拒绝
  286. $order->apply_delete = Order::ORDER_APPLY_DELETE_DEFAULT;
  287. $order->save();
  288. $handle_type = \app\models\OrderAdminHandleLog::HANDLE_TYPE_REJECT_CANCEL;
  289. // TODO :推送订单取消拒绝消息
  290. $res = [
  291. 'code' => 0,
  292. 'msg' => '操作成功',
  293. ];
  294. $merchant = new MerchantForm();
  295. $merchant->order_id = $order->id;
  296. $merchant->syncMchOrderRefundStatus(0);
  297. }
  298. \app\models\OrderAdminHandleLog::addHandleLog($order->id, $handle_type);
  299. return $this->asJson($res);
  300. }
  301. /**
  302. * 修改物流单号
  303. */
  304. public function actionSetExpressNo() {
  305. try {
  306. $order_id = input_params('order_id');
  307. $express_no = input_params('express_no');
  308. $express = input_params('express');
  309. $is_express = input_params('is_express', 1);
  310. $order = Order::findOne($order_id);
  311. if (empty($order)) {
  312. throw new \Exception('订单不存在');
  313. }
  314. $expressList = Express::getExpressList();
  315. $ok = false;
  316. foreach ($expressList as $value) {
  317. if ($value['name'] == $express) {
  318. $ok = true;
  319. break;
  320. }
  321. }
  322. if (!$ok && (int)$is_express === 1) {
  323. return $this->asJson([
  324. 'code' => 1,
  325. 'msg' => '快递公司不正确'
  326. ]);
  327. }
  328. if($is_express == 0){
  329. $order->express_no = '';
  330. $order->express = '';
  331. }else{
  332. $order->express_no = $express_no;
  333. $order->express = $express;
  334. }
  335. if (!$order->save()) {
  336. throw new \Exception('保存失败 ' . json_encode($order->errors));
  337. }
  338. \app\models\OrderAdminHandleLog::addHandleLog($order_id, \app\models\OrderAdminHandleLog::HANDLE_TYPE_SET_EXPRESS_NO);
  339. return $this->asJson([
  340. 'code' => 0,
  341. 'msg' => '修改成功'
  342. ]);
  343. } catch (\Exception $e) {
  344. return $this->asJson([
  345. 'code' => 1,
  346. 'msg' => $e->getMessage()
  347. ]);
  348. }
  349. }
  350. /**
  351. * 添加备注
  352. */
  353. public function actionSellerComments()
  354. {
  355. $store_id = get_store_id();
  356. $order_id = get_params('order_id');
  357. $seller_comments = get_params('seller_comments');
  358. $form = Order::findOne($order_id); //'store_id' => $store_id, //先注释掉,代理发货不验证此参数
  359. $form->seller_comments = $seller_comments;
  360. if ($form->save()) {
  361. \app\models\OrderAdminHandleLog::addHandleLog($order_id, \app\models\OrderAdminHandleLog::HANDLE_TYPE_ADD_REMARK);
  362. return $this->asJson([
  363. 'code' => 0,
  364. 'msg' => '操作成功',
  365. ]);
  366. } else {
  367. return $this->asJson([
  368. 'code' => 1,
  369. 'msg' => '操作失败',
  370. ]);
  371. }
  372. }
  373. /**
  374. * 添加商家留言
  375. */
  376. public function actionSetWords()
  377. {
  378. $store_id = get_store_id();
  379. $order_id = post_params('order_id');
  380. $words = post_params('words');
  381. $form = Order::findOne($order_id); //'store_id' => $store_id, //先注释掉,代理发货不验证此参数
  382. $form->words = $words;
  383. if ($form->save()) {
  384. \app\models\OrderAdminHandleLog::addHandleLog($order_id, \app\models\OrderAdminHandleLog::HANDLE_TYPE_ADD_MESSAGE);
  385. return $this->asJson([
  386. 'code' => 0,
  387. 'msg' => '操作成功',
  388. ]);
  389. } else {
  390. return $this->asJson([
  391. 'code' => 1,
  392. 'msg' => '操作失败',
  393. ]);
  394. }
  395. }
  396. /**
  397. * 更新订单地址
  398. * @return \yii\web\Response
  399. */
  400. public function actionSetOrderAddress()
  401. {
  402. $commonUpdateAddress = new CommonUpdateAddress();
  403. $commonUpdateAddress->data = post_params();
  404. $updateAddress = $commonUpdateAddress->updateAddress();
  405. return $this->asJson($updateAddress);
  406. }
  407. /**
  408. * 售后订单列表
  409. */
  410. public function actionRefund()
  411. {
  412. $form = new OrderRefundListForm();
  413. $form->attributes = \Yii::$app->request->get();
  414. $form->attributes = \Yii::$app->request->post();
  415. $form->store_id = get_store_id();
  416. if(get_mch_id()){
  417. $form->mch = 1;
  418. $form->mch_id = get_mch_id();
  419. }
  420. return $this->asJson($form->search(all_params()));
  421. }
  422. /**
  423. * 处理售后订单
  424. */
  425. public function actionRefundHandle()
  426. {
  427. $form = new OrderRefundForm();
  428. $form->attributes = post_params();
  429. $form->store_id = get_store_id();
  430. return $this->asJson($form->save());
  431. }
  432. /**
  433. * 商品评论列表
  434. */
  435. public function actionCommentList() {
  436. $form = new OrderCommentForm();
  437. $form->store_id = get_store_id();
  438. if(get_mch_id()){
  439. $form->mch = 1;
  440. $form->mch_id = get_mch_id();
  441. }
  442. return $this->asJson($form->getComment());
  443. }
  444. /**
  445. * 评论回复
  446. */
  447. public function actionCommentReply() {
  448. $form = new OrderCommentForm();
  449. $form->id = post_params('id');
  450. $form->reply_content = post_params('reply_content');
  451. $form->store_id = get_store_id();
  452. return $this->asJson($form->reply());
  453. }
  454. /**
  455. * 评论显示隐藏
  456. */
  457. public function actionCommentHide() {
  458. $form = new OrderCommentForm();
  459. $form->id = post_params('id');
  460. $form->status = post_params('status');
  461. $form->store_id = get_store_id();
  462. return $this->asJson($form->hideStatus());
  463. }
  464. /**
  465. * 评论删除
  466. */
  467. public function actionCommentDelete() {
  468. $form = new OrderCommentForm();
  469. $form->id = post_params('id');
  470. $form->status = post_params('status');
  471. $form->store_id = get_store_id();
  472. return $this->asJson($form->deleteStatus());
  473. }
  474. /**
  475. * @return array|string
  476. */
  477. public function actionCommentEdit()
  478. {
  479. $store_id = get_store_id();
  480. $form = new OrderCommentForm();
  481. $pic_list = array();
  482. if (!empty(post_params('pic_list'))) {
  483. if (count(post_params('pic_list')) > 6) {
  484. return $this->asJson(
  485. [
  486. 'code' => 1,
  487. 'msg' => '图片最多为6张'
  488. ]
  489. );
  490. }
  491. foreach (post_params('pic_list') as $item) {
  492. $pic_list[] = Html::encode($item);
  493. }
  494. }
  495. $form->pic_list = json_encode($pic_list);
  496. if (json_encode($pic_list) === '[""]') {
  497. $form->pic_list = '[]';
  498. }
  499. $form->store_id = $store_id;
  500. $form->attributes = post_params();
  501. $created_at = post_params('created_at');
  502. $form->created_at = $created_at ? strtotime($created_at) : time();
  503. return $this->asJson($form->save());
  504. }
  505. /**
  506. * 订单发货
  507. * @return mixed
  508. */
  509. public function actionSend()
  510. {
  511. $form = new OrderSendForm();
  512. $post = post_params();
  513. if ($post['is_express'] == OrderSendForm::EXPRESS_TYPE_EXPRESS) {
  514. $form->scenario = 'EXPRESS';
  515. }elseif ($post['is_express'] == OrderSendForm::EXPRESS_TYPE_DADA){
  516. $form->scenario = 'DADA';
  517. }elseif ($post['is_express'] == OrderSendForm::EXPRESS_TYPE_UU){
  518. $form->scenario = 'UU';
  519. }elseif ($post['is_express'] == OrderSendForm::EXPRESS_TYPE_PEISONG){
  520. $form->scenario = 'PEISONG';
  521. }
  522. $form->attributes = $post;
  523. $form->store_id = get_store_id();
  524. return $this->asJson($form->save());
  525. }
  526. /**
  527. * 货到付款 确认收货
  528. * @return \yii\web\Response
  529. */
  530. public function actionConfirm()
  531. {
  532. $store_id = get_store_id();
  533. $order_id = post_params('order_id');
  534. $order = Order::findOne([
  535. 'id' => $order_id,
  536. // 'mch_id' => 0,
  537. // 'store_id' => $store_id //先注释掉,代理发货不验证此参数
  538. ]);
  539. if (!$order) {
  540. return $this->asJson([
  541. 'code' => 1,
  542. 'msg' => '订单不存在,请刷新重试',
  543. ]);
  544. }
  545. if ($order->pay_type != 2) {
  546. return $this->asJson([
  547. 'code' => 1,
  548. 'msg' => '订单支付方式不是货到付款,无法确认收货',
  549. ]);
  550. }
  551. if ($order->trade_status != Order::ORDER_FLOW_SEND) {
  552. return $this->asJson([
  553. 'code' => 1,
  554. 'msg' => '订单未发货',
  555. ]);
  556. }
  557. $order->trade_status = Order::ORDER_FLOW_CONFIRM;
  558. $order->confirm_time = time();
  559. $order->is_pay = Order::IS_PAY_TRUE;
  560. $order->pay_time = time();
  561. if ($order->save()) {
  562. //测试用
  563. // $order_detail = new OrderDetail();
  564. // $order_detail->order_id = 5;
  565. // $order_detail->goods_id = 1;
  566. // $order_detail->id = 5;
  567. // $order_detail->order->user_id = 2;
  568. // $order_detail->total_price = 100;
  569. // $order_detail->afterSave(false, []);
  570. \app\models\OrderAdminHandleLog::addHandleLog($order->id, \app\models\OrderAdminHandleLog::HANDLE_TYPE_CONFIRM);
  571. return $this->asJson([
  572. 'code' => 0,
  573. 'msg' => '成功',
  574. ]);
  575. } else {
  576. return $this->asJson([
  577. 'code' => 1,
  578. 'msg' => implode(';', array_values($order->firstErrors))
  579. ]);
  580. }
  581. }
  582. /**
  583. * 小票打印
  584. * @return mixed
  585. */
  586. public function actionPrintOrder()
  587. {
  588. $data = post_params();
  589. $type = $data['type'] ?? 0;
  590. $store_id = get_store_id();
  591. $md_id = get_md_id();
  592. $mch_id = get_mch_id();
  593. if ((int)$md_id === -1 || (int)$md_id === 0) {
  594. $md_id = 0;
  595. }
  596. // 订单打印
  597. $print = new PrintOrder($store_id, $data['order_id'], 'reprint', $data['order_type'],
  598. $md_id ?: 0, $type, $mch_id);
  599. return $this->asJson($print->print_order());
  600. }
  601. /**
  602. * 订单打印
  603. */
  604. public function actionPrint()
  605. {
  606. $id = \Yii::$app->request->get('id');
  607. $express = \Yii::$app->request->get('express');
  608. $post_code = \Yii::$app->request->get('code');
  609. $type = \Yii::$app->request->get('type');
  610. $form = new PrintExpress();
  611. $form->store_id = get_store_id();
  612. $form->order_id = $id;
  613. $form->express = $express;
  614. $form->post_code = $post_code;
  615. $form->type = $type;
  616. return $this->asJson($form->send());
  617. }
  618. /**
  619. * 核销订单
  620. * @return mixed
  621. */
  622. public function actionClerk()
  623. {
  624. $form = new OrderClerkForm();
  625. $form->attributes = post_params();
  626. $form->order_model = 'app\models\Order';
  627. $form->store_id = get_store_id();
  628. return $this->asJson($form->clerk());
  629. }
  630. /**
  631. * 修改价格
  632. * @return mixed
  633. */
  634. public function actionModifyPrice()
  635. {
  636. $form = new OrderPriceForm();
  637. $form->attributes = post_params();
  638. $form->store_id = get_store_id();
  639. return $this->asJson($form->save());
  640. }
  641. /**
  642. * 移入回收站
  643. */
  644. public function actionEdit()
  645. {
  646. $order_id = get_params('order_id');
  647. $is_recycle = get_params('is_recycle');
  648. if ($is_recycle == 0 || $is_recycle == 1) {
  649. $form = Order::find()//->where(['store_id' => get_store_id(), 'mch_id' => 0])//先注释掉,代理发货不验证此参数
  650. ->where('id = :order_id', [':order_id' => $order_id])->one();
  651. $form->is_recycle = $is_recycle;
  652. if ($form && $form->save()) {
  653. $handle_type = \app\models\OrderAdminHandleLog::HANDLE_TYPE_RECYCLE;
  654. if ($is_recycle == 0) {
  655. $handle_type = \app\models\OrderAdminHandleLog::HANDLE_TYPE_CANCEL_RECYCLE;
  656. }
  657. \app\models\OrderAdminHandleLog::addHandleLog($order_id, $handle_type);
  658. return $this->asJson([
  659. 'code' => 0,
  660. 'msg' => '操作成功',
  661. ]);
  662. }
  663. };
  664. return $this->asJson([
  665. 'code' => 1,
  666. 'msg' => '操作失败',
  667. ]);
  668. }
  669. /**
  670. * 订单物流信息
  671. */
  672. public function actionExpressDetail()
  673. {
  674. $form = new ExpressDetailForm();
  675. $form->attributes = get_params();
  676. $form->store_id = get_store_id();
  677. $form->user_id = get_user_id();
  678. return $this->asJson($form->search());
  679. }
  680. /**
  681. * 修改自提点
  682. */
  683. public function actionUpdateShop()
  684. {
  685. $form = new OrderShopForm();
  686. $form->order_id = get_params('order_id');
  687. $form->shop_id = get_params('shop_id');
  688. return $this->asJson($form->save());
  689. }
  690. /**
  691. * 获取订单提示列表
  692. */
  693. public function actionMessage()
  694. {
  695. $form = new OrderMessageForm();
  696. $form->store_id = get_store_id();
  697. $form->limit = 100;
  698. $form->is_read = 1;
  699. $arr = $form->search();
  700. return $this->asJson([
  701. 'code' => 0,
  702. 'msg' => '',
  703. 'data' => $arr['list'],
  704. 'total_count' => $arr['count'],
  705. ]);
  706. }
  707. /**
  708. * 线下转账列表
  709. */
  710. public function actionPayOfflineList()
  711. {
  712. $params = all_params();
  713. $query = OrderPayOffline::find()->where(['is_delete' => 0, 'store_id' => get_store_id()]);
  714. if($params['order_no']){
  715. $order = Order::findOne(['order_no' => trim($params['order_no'])]);
  716. $order_id = (int)$order['id'];
  717. $query->andWhere(['order_id' => $order_id]);
  718. }
  719. if($params['begin_time']){
  720. $query->andWhere(['>=', 'add_at', strtotime($params['begin_time'])]);
  721. }
  722. if($params['end_time']){
  723. $query->andWhere(['<=', 'add_at', strtotime($params['end_time'])]);
  724. }
  725. if($params['status'] > -1){
  726. $query->andWhere(['status' => (int)$params['status']]);
  727. }
  728. $query->orderBy('id DESC');
  729. $list = pagination_make($query);
  730. foreach($list['list'] as &$item){
  731. $item['order'] = Order::findOne($item['order_id']);
  732. $item['add_at'] = date('Y-m-d H:i:s', $item['add_at']);
  733. $item['pic_list'] = json_decode($item['pic_list'], true);
  734. }
  735. return $this->asJson([
  736. 'code' => 0,
  737. 'msg' => '',
  738. 'data' => $list,
  739. ]);
  740. }
  741. /**
  742. * 线下转账审核
  743. */
  744. public function actionPayOfflineAudit()
  745. {
  746. $params = all_params();
  747. $audit = OrderPayOffline::auditPay(get_store_id(), (int)$params['id'], (int)$params['status'], $params['admin_remark']);
  748. return $this->asJson($audit);
  749. }
  750. /**
  751. * 线下转账删除
  752. */
  753. public function actionPayOfflineDel()
  754. {
  755. $params = all_params();
  756. OrderPayOffline::delPay(get_store_id(), $params['id']);
  757. return $this->asJson([
  758. 'code' => 0,
  759. 'msg' => '操作成功',
  760. ]);
  761. }
  762. public function actionGetOrderInfoByNo()
  763. {
  764. $order_no = get_params('order_no');
  765. $order = Order::find()->alias('o')
  766. ->leftJoin(['u' => User::tableName()], 'o.user_id = u.id')
  767. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  768. ->where([
  769. 'o.order_no' => $order_no,
  770. 'o.store_id' => get_store_id(),
  771. 'o.is_delete' => 0,
  772. ])->select('o.id, su.name, u.id as user_id')->one();
  773. if (!$order) {
  774. return $this->asJson([
  775. 'code' => 1,
  776. 'msg' => '订单不存在',
  777. ]);
  778. }
  779. return $this->asJson([
  780. 'code' => 0,
  781. 'msg' => 'success',
  782. 'data' => [
  783. 'order_id' => $order->id,
  784. 'user_id' => $order->user_id,
  785. 'user_name' => $order->name,
  786. ],
  787. ]);
  788. }
  789. /**
  790. * 获取快递公司列表
  791. * @return void
  792. */
  793. public function actionExpressList()
  794. {
  795. $expressList = Express::getExpressList();
  796. return $this->asJson([
  797. 'code' => 0,
  798. 'msg' => 'success',
  799. 'data' => $expressList,
  800. ]);
  801. }
  802. /**
  803. * 待发货订单导出
  804. * @return void
  805. */
  806. public function actionSendOrderExport()
  807. {
  808. $order_list = Order::find()
  809. ->where(['store_id' => get_store_id(), 'is_delete' => Order::IS_DELETE_FALSE])
  810. ->andWhere(['trade_status' => Order::ORDER_FLOW_NO_SEND])
  811. ->andWhere(['is_pay' => Order::IS_PAY_TRUE,'mch_id'=>0,'is_offline' => Order::IS_OFFLINE_FALSE])
  812. ->orderBy('id DESC')
  813. ->select('id,order_no')
  814. ->all();
  815. // 获取可导出数据
  816. $rows = [[
  817. '序号',
  818. '订单号',
  819. '快递单号',
  820. ]];
  821. foreach($order_list as $item){
  822. $r = [
  823. '',
  824. $item['order_no'],
  825. ''
  826. ];
  827. $rows[] = $r;
  828. }
  829. $writer = \Spatie\SimpleExcel\SimpleExcelWriter::streamDownload(time() . '.xlsx')->noHeaderRow()
  830. ->addRows($rows)->toBrowser();
  831. }
  832. /**
  833. * 批量发货
  834. * @return array|void
  835. */
  836. public function actionBatchSendOrder() {
  837. $store_id = get_store_id();
  838. $express = post_params('express', '');
  839. $filename = $_FILES['excel']['name'];
  840. $tmpname = $_FILES['excel']['tmp_name'];
  841. $path = \Yii::$app->basePath . '/web/temp/';
  842. if(!is_dir($path)){
  843. mkdir($path);
  844. }
  845. $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
  846. if (($ext != 'xlsx') && ($ext != 'xls')) {
  847. return [
  848. 'code' => 1,
  849. 'msg' => '请上传excel文件'
  850. ];
  851. }
  852. $file = time() . $store_id . '.' . $ext;
  853. $uploadfile = $path . $file;
  854. move_uploaded_file($tmpname, $uploadfile);
  855. $rows = \Spatie\SimpleExcel\SimpleExcelReader::create($uploadfile)
  856. ->getRows();
  857. $err = [];
  858. $rows->each(function (array $item) use ($store_id,$express, &$err) {
  859. try{
  860. $t = \Yii::$app->db->beginTransaction();
  861. $order_no = trim($item['订单号']);
  862. $express_no = trim($item['快递单号']);
  863. if (!$order_no){
  864. throw new \Exception('表单信息不完整,请检查');
  865. }
  866. $order = Order::findOne([
  867. 'is_delete' => 0,
  868. 'order_no' => $order_no,
  869. ]);
  870. if (!$order) {
  871. throw new \Exception('订单不存在或已删除');
  872. }
  873. if ($order->is_pay == 0 && $order->pay_type != 2) {
  874. throw new \Exception('订单未支付');
  875. }
  876. if ($order->apply_delete == Order::ORDER_APPLY_DELETE) {
  877. throw new \Exception('该订单正在申请取消操作,请先处理');
  878. }
  879. // 订单类型判断提示
  880. $all_goods = OrderDetail::find()->where(['order_id' => $order->id])->asArray()->all();
  881. $is_have_express = false;
  882. foreach ($all_goods as $_goods) {
  883. if ($_goods['delivery_type'] == OrderDetail::GOODS_DELIVERY_EXPRESS) {
  884. $is_have_express = true;
  885. break;
  886. }
  887. }
  888. if ($order->is_offline == Order::IS_OFFLINE_TRUE && !$is_have_express ) {
  889. throw new \Exception('此订单商品皆为自提,请选择无需物流发货');
  890. }
  891. if ($order->is_offline == Order::IS_OFFLINE_TRUE && $is_have_express ) {
  892. throw new \Exception('此订单包含普通快递配送,请选择快递方式发货');
  893. }
  894. if ($express != '无需快递'){
  895. $order->express = $express;
  896. $order->express_no = $express_no;
  897. }
  898. $order->trade_status = ORDER::ORDER_FLOW_SEND;
  899. $order->send_time = time();
  900. if ($order->save()) {
  901. \app\models\OrderAdminHandleLog::addHandleLog($order->id, \app\models\OrderAdminHandleLog::HANDLE_TYPE_SEND);
  902. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
  903. if ($order->giving_gifts_received_user_id) {
  904. NoticeSend::OrderSend($order->giving_gifts_received_user_id, $order->mobile, $order->order_no, $goods->name, $express, $express_no, $order->order_type);
  905. } else {
  906. NoticeSend::OrderSend($order->user_id, $order->mobile, $order->order_no, $goods->name, $express, $express_no);
  907. }
  908. $t->commit();
  909. }else{
  910. $t->rollBack();
  911. $res = [
  912. 'code' => 1,
  913. 'msg' => $order->getErrors()
  914. ];
  915. }
  916. } catch (\Exception $e){
  917. $t->rollBack();
  918. $res = [
  919. 'code' => 1,
  920. 'msg' => $e->getMessage(),
  921. ];
  922. }
  923. if($res['code'] != 0){
  924. $err[] = array_merge($res, ['order_no' => $order_no]);
  925. }
  926. });
  927. $count = count($err);
  928. @unlink($uploadfile);
  929. return $this->asJson([
  930. 'code' => $count ? 1 : 0,
  931. 'msg' => "操作完成" . ($err ? ",失败{$count}条数据" : ''),
  932. 'err' => $err,
  933. ]);
  934. }
  935. /**
  936. * 新增评论
  937. */
  938. public function actionCommentSave() {
  939. $store_id = get_store_id();
  940. $form = new OrderCommentForm();
  941. $pic_list = array();
  942. if (!empty(post_params('pic_list'))) {
  943. if (count(post_params('pic_list')) > 6) {
  944. return $this->asJson(
  945. [
  946. 'code' => 1,
  947. 'msg' => '图片最多为6张'
  948. ]
  949. );
  950. }
  951. foreach (post_params('pic_list') as $item) {
  952. $pic_list[] = Html::encode($item);
  953. }
  954. }
  955. $form->pic_list = json_encode($pic_list);
  956. if (json_encode($pic_list) === '[""]') {
  957. $form->pic_list = '[]';
  958. }
  959. $form->store_id = $store_id;
  960. $form->attributes = post_params();
  961. $created_at = post_params('created_at');
  962. $form->created_at = $created_at ? strtotime($created_at) : time();
  963. return $this->asJson($form->commentSave());
  964. }
  965. /**
  966. * 订单单个商品退款
  967. */
  968. public function actionOrderGoodsCancelList()
  969. {
  970. $store_id = get_store_id();
  971. $form = new OrderListForm();
  972. $form->attributes = get_params();
  973. $is_offline = get_params('is_offline');
  974. if (isset($is_offline)) {
  975. $form->is_offline = explode(',', $is_offline);
  976. } else {
  977. $form->is_offline = Order::IS_OFFLINE_FALSE;
  978. }
  979. if($form->order_origin == 4){
  980. unset($form->is_offline);
  981. }
  982. $form->store_id = $store_id;
  983. $form->supplier_id = get_params('supplier_id');
  984. $form->order_id = get_params('order_id');
  985. $form->type = get_params('type');
  986. $form->province_id = get_params('province_id');
  987. $form->city_id = get_params('city_id');
  988. $form->district_id = get_params('district_id');
  989. return $this->asJson($form->orderGoodsCancelList());
  990. // $store_id = get_store_id();
  991. // $order_no = get_params('order_no');
  992. // $refund_order_no = get_params('refund_order_no');
  993. // $status = get_params('status');
  994. // $username = get_params('username');
  995. // $mobile = get_params('mobile');
  996. // $goods_name = get_params('goods_name');
  997. //
  998. // $query = \app\models\OrderGoodsCancel::find()->alias('ogc')
  999. // ->leftJoin(['od' => OrderDetail::tableName()], 'od.id = ogc.order_detail_id')
  1000. // ->leftJoin(['o' => Order::tableName()], 'o.id = ogc.order_id')
  1001. // ->leftJoin(['u' => User::tableName()], 'o.user_id = u.id')
  1002. // ->where(['ogc.store_id' => $store_id]);
  1003. //
  1004. //
  1005. // $query->andWhere(['OR',
  1006. // [
  1007. // 'ogc.status' => \app\models\OrderGoodsCancel::STATUS_APPLY,
  1008. // 'o.trade_status' => Order::ORDER_FLOW_NO_SEND
  1009. // ], [
  1010. // '<>', 'ogc.status', \app\models\OrderGoodsCancel::STATUS_APPLY
  1011. // ]
  1012. // ]);
  1013. //
  1014. // if ($order_no) {
  1015. // $query->andWhere(['LIKE', 'o.order_no', $order_no]);
  1016. // }
  1017. //
  1018. // if ($refund_order_no) {
  1019. // $query->andWhere(['LIKE', 'ogc.refund_order_no', $refund_order_no]);
  1020. // }
  1021. //
  1022. // if ($username) {
  1023. // $query->andWhere(['LIKE', 'u.nickname', $username]);
  1024. // }
  1025. //
  1026. // if ($mobile) {
  1027. // $query->andWhere(['LIKE', 'u.binding', $mobile]);
  1028. // }
  1029. //
  1030. // if ($goods_name) {
  1031. // $query->andWhere(['LIKE', 'od.goods_name', $goods_name]);
  1032. // }
  1033. //
  1034. // if (isset($status) && in_array($status, [
  1035. // \app\models\OrderGoodsCancel::STATUS_APPLY,
  1036. // \app\models\OrderGoodsCancel::STATUS_PASS,
  1037. // \app\models\OrderGoodsCancel::STATUS_REFUSE,
  1038. // \app\models\OrderGoodsCancel::STATUS_PAY,
  1039. // \app\models\OrderGoodsCancel::STATUS_PAY_FAIL,
  1040. // \app\models\OrderGoodsCancel::STATUS_CANCEL,
  1041. // ])) {
  1042. // $query->andWhere(['ogc.status' => $status]);
  1043. // }
  1044. //
  1045. // $query->select('ogc.id, o.order_no, ogc.refund_order_no, ogc.status, ogc.created_at, od.goods_id,
  1046. // od.goods_name, od.num, ogc.refund_price, ogc.num refund_num, od.pic, u.nickname, u.binding, u.avatar_url')->orderBy('ogc.id DESC');
  1047. //
  1048. // $list = pagination_make($query);
  1049. // foreach ($list['list'] as &$item) {
  1050. // $item['status'] = intval($item['status']);
  1051. // $item['status_text'] = \app\models\OrderGoodsCancel::$status_text[$item['status']];
  1052. // $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  1053. // }
  1054. // return $this->asJson([
  1055. // 'code' => 0,
  1056. // 'msg' => '',
  1057. // 'data' => $list
  1058. // ]);
  1059. }
  1060. //订单单个商品取消处理
  1061. public function actionOrderGoodsCancelHandle() {
  1062. try {
  1063. $id = post_params('id');
  1064. $status = intval(post_params('status'));
  1065. $result = \app\models\OrderGoodsCancel::orderGoodsCancelHandle($id, $status);
  1066. return $this->asJson($result);
  1067. } catch (\Exception $e) {
  1068. return $this->asJson([
  1069. 'code' => 1,
  1070. 'msg' => $e->getMessage()
  1071. ]);
  1072. }
  1073. }
  1074. //订单商品退款
  1075. public function actionOrderGoodsCancel()
  1076. {
  1077. $order_id = post_params('order_id');
  1078. $order_detail_id = post_params('order_detail_id');
  1079. $num = post_params('num');
  1080. $order = \app\models\Order::findOne($order_id);
  1081. if (!$order) {
  1082. return $this->asJson([
  1083. 'code' => 1,
  1084. 'msg' => '订单不存在'
  1085. ]);
  1086. }
  1087. // if (intval($order->trade_status) !== \app\models\Order::ORDER_FLOW_NO_SEND) {
  1088. // return $this->asJson([
  1089. // 'code' => 1,
  1090. // 'msg' => '订单已经发货'
  1091. // ]);
  1092. // }
  1093. if (intval($order->is_sale) || ($order->future_sales_time > 0 && $order->future_sales_time <= time())) {
  1094. return $this->asJson([
  1095. 'code' => 1,
  1096. 'msg' => '订单已过售后期'
  1097. ]);
  1098. }
  1099. $order_detail = \app\models\OrderDetail::findOne($order_detail_id);
  1100. if (!OrderGoodsCancel::is_activity_goods($order->id, $order_detail->id)) {
  1101. return $this->asJson([
  1102. 'code' => 1,
  1103. 'msg' => '营销活动产品不能取消'
  1104. ]);
  1105. }
  1106. //如果订单有售后待处理 不允许后台操作单独退款
  1107. $orderRefund = \app\models\OrderRefund::findOne(['order_id' => $order->id, 'status' => OrderRefund::STATUS_IN]);
  1108. if ($orderRefund) {
  1109. return $this->asJson([
  1110. 'code' => 1,
  1111. 'msg' => '订单有售后待处理 不允许后台操作单独退款'
  1112. ]);
  1113. }
  1114. $goods_info = OrderGoodsCancel::getCancelGoodsOrderQuery(
  1115. $order->id,
  1116. 'num, refund_price',
  1117. false,
  1118. $order_detail_id
  1119. )->asArray()->all();
  1120. $goods_price = array_sum(array_column($goods_info, 'refund_price')) ?: 0;
  1121. $goods_num = array_sum(array_column($goods_info, 'num')) ?: 0;
  1122. if ($order_detail->num < ($num + $goods_num)) {
  1123. //申请数量超过下单数量
  1124. return $this->asJson([
  1125. 'code' => 1,
  1126. 'msg' => '申请退款数量超过下单数量'
  1127. ]);
  1128. }
  1129. $refund_price = 0;
  1130. //计算退款金额 如果带上这次已经全部退款 那么就将剩余的金额全退了
  1131. if ($order_detail->num - $goods_num == $num) {
  1132. $refund_price = bcsub($order_detail->total_price, $goods_price, 2);
  1133. }
  1134. //如果没有全部退款 那么计算单个的商品金额 然后再乘以当前的退款商品数量
  1135. if ($order_detail->num - $goods_num > $num) {
  1136. $once_goods_price = bcdiv($order_detail->total_price, $order_detail->num, 2);//计算单个的商品金额
  1137. $refund_price = bcmul($once_goods_price, $num, 2);
  1138. }
  1139. $order_goods_cancel = new \app\models\OrderGoodsCancel();
  1140. $order_goods_cancel->order_id = $order_id;
  1141. $order_goods_cancel->order_detail_id = $order_detail_id;
  1142. $order_goods_cancel->num = $num;
  1143. $order_goods_cancel->user_id = $order->user_id;
  1144. $order_goods_cancel->store_id = $order->store_id;
  1145. $order_goods_cancel->refund_price = $refund_price;
  1146. $order_goods_cancel->status = \app\models\OrderGoodsCancel::STATUS_APPLY;
  1147. $order_goods_cancel->refund_order_no = \app\models\OrderGoodsCancel::getOrderNo();
  1148. if (!$order_goods_cancel->save()) {
  1149. //保存失败
  1150. return $this->asJson([
  1151. 'code' => 1,
  1152. 'msg' => implode(';', array_values($order_goods_cancel->firstErrors))
  1153. ]);
  1154. }
  1155. $result = \app\models\OrderGoodsCancel::orderGoodsCancelHandle($order_goods_cancel->id, \app\models\OrderGoodsCancel::STATUS_PASS);
  1156. return $this->asJson($result);
  1157. }
  1158. }