MdOrder.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. <?php
  2. /**
  3. * MdOrder.php
  4. * todo 文件描述
  5. * Created on 2024/4/10 16:38
  6. * @author: hankaige
  7. */
  8. namespace app\modules\client\models\v1;
  9. use app\models\AccountLog;
  10. use app\models\Goods;
  11. use app\models\Order;
  12. use app\models\OrderDetail;
  13. use app\models\OrderRefund;
  14. use app\models\OrderTransit;
  15. use app\models\RefundAddress;
  16. use app\models\SaaSLeaguePriceLog;
  17. use app\models\SaasUser;
  18. use app\models\User;
  19. use app\models\VerifyCardSale;
  20. use app\modules\admin\models\MerchantForm;
  21. use app\modules\admin\models\OrderRevokeForm;
  22. use app\modules\client\models\ApiModel;
  23. use app\utils\Notice\NoticeSend;
  24. use app\utils\OrderNo;
  25. use app\utils\PrintOrder;
  26. use app\utils\Refund;
  27. class MdOrder extends ApiModel
  28. {
  29. public $order_id;
  30. public $store_id;
  31. public $md_id;
  32. public $remark;
  33. public $status;
  34. public $order_refund_id;
  35. public $type;
  36. public $action;
  37. public $refund;
  38. public $address_id;
  39. public function rules()
  40. {
  41. return [
  42. [['store_id','md_id'], 'required'],
  43. [['order_id','store_id','md_id', 'order_refund_id'], 'integer'],
  44. [['remark', 'status', 'type', 'action', 'refund', 'address_id'], 'safe']
  45. ];
  46. }
  47. public function handleCancel(){
  48. $order = Order::findOne(['id' => $this->order_id,'store_id'=>$this->store_id,'is_delete' => Order::IS_DELETE_FALSE,'md_id'=>$this->md_id]);
  49. if(empty($order)){
  50. return ['code'=>1,'msg'=>'订单不存在'];
  51. }
  52. $form = new OrderRevokeForm();
  53. $form->order_id = $order->id;
  54. $form->delete_pass = true;
  55. $form->user_id = $order->user_id;
  56. $form->store_id = $order->store_id;
  57. $res = $form->save();
  58. if ($res['code'] == 0) {
  59. VerifyCardSale::cancelCard($order);
  60. $order->save();
  61. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
  62. if ($order->order_type == Order::ORDER_TYPE_Adopt) {
  63. NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 1);
  64. }else{
  65. NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 0);
  66. }
  67. // 订单打印
  68. if ((int)$order->md_id === -1 || (int)$order->md_id === 0 || !isset($order->md_id)) {
  69. $order->md_id = 0;
  70. }
  71. $printer_order = new PrintOrder($order->store_id, $order->id, 'confirm', 0, $order->md_id);
  72. $printer_order->is_refund = true;
  73. $printer_order->print_order();
  74. if($order->take_price > 0){
  75. $user = User::findOne($order->user_id);
  76. $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
  77. if($saas_user){
  78. $take_price = $order->take_price;
  79. $before = $saas_user->league_price;
  80. $saas_user->updateCounters(['league_price' => floatval($take_price)]);
  81. \app\models\SaaSLeaguePriceLog::setLeaguePriceLog(
  82. $order->store_id,
  83. $saas_user->id,
  84. $take_price,
  85. $before,
  86. \app\models\SaaSLeaguePriceLog::TYPE_CANCEL,
  87. \app\models\SaaSLeaguePriceLog::SEND_TYPE,
  88. \app\models\SaaSLeaguePriceLog::ROLE_USER,
  89. $order->id
  90. );
  91. }
  92. }
  93. }
  94. return ['code'=>0 ,'msg'=>'取消成功'];
  95. }
  96. //订单申请取消处理
  97. public function applyOrderDelete() {
  98. $store_id = $this->store_id;
  99. $md_id = $this->md_id;
  100. $where = [
  101. 'id' => $this->order_id,
  102. 'is_delete' => Order::IS_DELETE_FALSE,
  103. 'store_id' => $store_id,
  104. 'md_id' => $md_id,
  105. 'apply_delete' => Order::ORDER_APPLY_DELETE
  106. ];
  107. $handle_type = \app\models\OrderAdminHandleLog::HANDLE_TYPE_AGREE_CANCEL;
  108. $order = Order::findOne($where);
  109. if (!$order) {
  110. return [
  111. 'code' => 1,
  112. 'msg' => '订单不存在,请刷新页面后重试'
  113. ];
  114. }
  115. // 发送备注消息
  116. $order->remark = $this->remark;
  117. // 同意
  118. if (intval($this->status) == 1) {
  119. // if (post_params('type') == Order::CANCEL_BACK_TYPE) {
  120. //
  121. // }
  122. ////修改未支付但是取消订单的逻辑
  123. // if (intval($order->is_pay) === 1 || (intval($order->is_pay) === 0 && intval($order->pay_type) === Order::PAY_TYPE_COD)) {
  124. //TODO 取消订单需要退积分,这里剩余如果检测到是平台操作,就使用saas_user添加积分信息
  125. $form = new OrderRevokeForm();
  126. $form->order_id = $order->id;
  127. $form->delete_pass = true;
  128. $form->user_id = $order->user_id;
  129. $form->store_id = $order->store_id;
  130. $res = $form->save();
  131. if ($res['code'] == 0) {
  132. VerifyCardSale::cancelCard($order);
  133. $order->save();
  134. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
  135. if ($order->order_type == Order::ORDER_TYPE_Adopt) {
  136. NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 1);
  137. }else{
  138. NoticeSend::OrderCancel($order->user_id, $order->mobile, $order->order_no, $order->pay_price, $goods->name, 0);
  139. }
  140. // 订单打印
  141. if ((int)$order->md_id === -1 || (int)$order->md_id === 0 || !isset($order->md_id)) {
  142. $order->md_id = 0;
  143. }
  144. $printer_order = new PrintOrder($order->store_id, $order->id, 'confirm', 0, $order->md_id);
  145. $printer_order->is_refund = true;
  146. $printer_order->print_order();
  147. $check = SaaSLeaguePriceLog::findOne(['order_id' => $order->id, 'type' => 4]);
  148. if($order->take_price > 0 && $check){
  149. $user = User::findOne($order->user_id);
  150. $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
  151. if($saas_user){
  152. $take_price = $order->take_price;
  153. $before = $saas_user->league_price;
  154. $saas_user->updateCounters(['league_price' => floatval($take_price)]);
  155. \app\models\SaaSLeaguePriceLog::setLeaguePriceLog(
  156. $order->store_id,
  157. $saas_user->id,
  158. $take_price,
  159. $before,
  160. \app\models\SaaSLeaguePriceLog::TYPE_CANCEL,
  161. \app\models\SaaSLeaguePriceLog::SEND_TYPE,
  162. \app\models\SaaSLeaguePriceLog::ROLE_USER,
  163. $order->id
  164. );
  165. }
  166. }
  167. //如果已经转单 就调用取消接口
  168. $orderTransit = OrderTransit::findOne(['order_id' => $order->id, 'is_delete' => 0]);
  169. if ($orderTransit) {
  170. $merchant = new MerchantForm();
  171. $merchant->order_id = $orderTransit->cloud_order_id;
  172. $merchant->purchaseOrderCancel();
  173. }
  174. }
  175. // }
  176. } else { //拒绝
  177. $order->apply_delete = Order::ORDER_APPLY_DELETE_DEFAULT;
  178. $order->save();
  179. $handle_type = \app\models\OrderAdminHandleLog::HANDLE_TYPE_REJECT_CANCEL;
  180. // TODO :推送订单取消拒绝消息
  181. $res = [
  182. 'code' => 0,
  183. 'msg' => '操作成功',
  184. ];
  185. $merchant = new MerchantForm();
  186. $merchant->order_id = $order->id;
  187. $merchant->syncMchOrderRefundStatus(0);
  188. }
  189. \app\models\OrderAdminHandleLog::addHandleLog($order->id, $handle_type);
  190. return $res;
  191. }
  192. //订单售后处理
  193. public function handleRefund()
  194. {
  195. if (!$this->validate()) {
  196. return [
  197. 'code' => 1,
  198. 'msg' => $this->getErrorSummary(false)[0],
  199. ];
  200. }
  201. $order_refund = OrderRefund::findOne([
  202. 'id' => $this->order_refund_id,
  203. 'store_id' => $this->store_id,
  204. 'is_delete' => Order::IS_DELETE_FALSE,
  205. ]);
  206. if (!$order_refund) {
  207. return [
  208. 'code' => 1,
  209. 'msg' => '售后订单不存在,请刷新页面'
  210. ];
  211. }
  212. $OrderDetail = OrderDetail::find()->where(['in','id',json_decode($order_refund->order_detail_id, true)])->asArray()->all();
  213. $arr = [];
  214. foreach ($OrderDetail as $val) {
  215. $arr[] = $val['goods_id'];
  216. }
  217. // 订单时间
  218. $order = Order::findOne(['id' => $order_refund->order_id, 'md_id' => $this->md_id]);
  219. $orderTransit = OrderTransit::findOne(['order_id' => $order_refund->order_id, 'is_delete' => 0]);
  220. if ($orderTransit) {//已转单
  221. return [
  222. 'code' => 1,
  223. 'msg' => '订单已转单,请前往后台操作'
  224. ];
  225. }
  226. $created_at = $order->created_at;
  227. $confirm_time = $order->confirm_time;
  228. foreach ($arr as $v) {
  229. // 获取核销卡id
  230. $verifyIds = explode(',',Goods::findOne(['id' => $v])->verify_card_id);
  231. if (!empty($verifyIds)) {
  232. $verifySales = VerifyCardSale::find()
  233. ->where(['in', 'verify_card_id', $verifyIds])
  234. ->andWhere(['in', 'goods_id', $arr])
  235. ->andWhere(['>' , 'created_at', $created_at])
  236. ->andWhere(['<=' , 'created_at', $confirm_time])
  237. ->andWhere(['store_id' => $order_refund->store_id])
  238. ->andWhere(['user_id' => $order_refund->user_id])
  239. ->asArray()->all();
  240. foreach ($verifySales as $val) {
  241. $verifySale = VerifyCardSale::findOne(['id' => $val['id']]);
  242. $verifySale->status = 2;
  243. $verifySale->save();
  244. }
  245. }
  246. }
  247. if ($order_refund->status != 0) {
  248. return [
  249. 'code' => 1,
  250. 'msg' => '售后订单已经处理过了,请刷新页面',
  251. 'id' => $order_refund->id,
  252. ];
  253. }
  254. // if ($this->type == 1) {
  255. return $this->submit1($order_refund);
  256. // }
  257. // if ($this->type == 2) {
  258. // return $this->submit2($order_refund);
  259. // }
  260. }
  261. /**
  262. * 平台订单退货退款
  263. * @param $order_refund
  264. * @return \app\cyy\ValidationErrorResponse|array
  265. */
  266. private function submit1($order_refund)
  267. {
  268. $order = Order::findOne($order_refund->order_id);
  269. if ($this->action == 1) {//同意
  270. if ($this->refund != 1) {
  271. //仅同意,还未退款
  272. if (isset($this->refund_price)) {
  273. if ($this->refund_price > $order_refund->refund_price) {
  274. return [
  275. 'code' => 1,
  276. 'msg' => '退款金额不能大于' . $order_refund->refund_price,
  277. ];
  278. }
  279. $order_refund->refund_price = $this->refund_price;
  280. }
  281. if (!$this->address_id) {
  282. return [
  283. 'code' => 1,
  284. 'msg' => '退货地址不能为空',
  285. ];
  286. };
  287. $refundAddress = RefundAddress::findOne($this->address_id);
  288. if ($refundAddress) {
  289. $order_refund->refund_address = json_encode([
  290. 'name' => $refundAddress->name,
  291. 'address' => $refundAddress->address,
  292. 'mobile' => $refundAddress->mobile
  293. ], JSON_UNESCAPED_UNICODE);
  294. }
  295. $order_refund->address_id = $this->address_id;
  296. $order_refund->is_agree = 1;
  297. $order_refund->save();
  298. if ($order_refund->save()) {
  299. return [
  300. 'code' => 0,
  301. 'msg' => '已同意退货。',
  302. ];
  303. } else {
  304. return [
  305. 'code' => 1,
  306. 'msg' => $order_refund->errors[0],
  307. ];
  308. }
  309. } else {
  310. //已同意,退款操作
  311. $order_refund->status = 1;
  312. $order_refund->response_time = time();
  313. if ($order_refund->refund_price > 0 && ($order->pay_type == 1 || in_array($order->pay_type, [Order::PAY_TYPE_WX_B2B, Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY, Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX]))) {
  314. $res = Refund::refund($order, OrderNo::ORDER_MALL, $order_refund->order_refund_no, $order_refund->refund_price);
  315. if ($res !== true) {
  316. return $res;
  317. }
  318. }
  319. // 商城商品总库存恢复
  320. $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => 0])->all();
  321. foreach ($order_detail_list as $order_detail) {
  322. $goods = Goods::findOne($order_detail->goods_id);
  323. $attr_id_list = [];
  324. foreach (json_decode($order_detail->attr) as $item) {
  325. array_push($attr_id_list, $item->attr_id);
  326. }
  327. $goods->numAdd($attr_id_list, $order_detail->num);
  328. }
  329. $user = User::findOne(['id' => $order->user_id]);
  330. $balance = $order->balance ?? 0;
  331. if ($balance > 0) {
  332. $before = $user->money;
  333. $user->money += $balance;
  334. $log = new AccountLog();
  335. $log->store_id = $this->store_id ?? get_store_id();
  336. $log->user_id = $user->id;
  337. $log->type = AccountLog::TYPE_GOODS_BALANCE;
  338. $log->amount = $balance;
  339. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  340. $log->desc = "商城售后订单退款,商品余额抵扣:退款订单号:{$order_refund->order_refund_no}";
  341. $log->before = $before;
  342. $log->after = $user->money;
  343. $log->operator = '';
  344. $log->operator_id = 0;
  345. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  346. $log->created_at = time();
  347. $log->order_id = $order->id;
  348. $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER;
  349. if (!$log->save()) {
  350. return [
  351. 'code' => 1,
  352. 'msg' => implode(';', array_values($log->firstErrors))
  353. ];
  354. };
  355. if (!$user->save()) {
  356. return [
  357. 'code' => 1,
  358. 'msg' => $this->getErrorSummary(false)[0],
  359. ];
  360. }
  361. }
  362. $integral = isset($order->integral) ? json_decode($order->integral)->forehead_integral : 0;
  363. if ($integral > 0) {
  364. $user->integral += $integral;
  365. }
  366. if ($order_refund->refund_price > 0 && $order->pay_type == 3) {
  367. $before = $user->money;
  368. $user->money += floatval($order_refund->refund_price);
  369. $log = new AccountLog();
  370. $log->store_id = $this->store_id ?? get_store_id();
  371. $log->user_id = $user->id;
  372. $log->type = AccountLog::TYPE_BALANCE;
  373. $log->amount = $order_refund->refund_price;
  374. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  375. $log->desc = "商城售后订单退款:退款订单号:{$order_refund->order_refund_no}";
  376. $log->before = $before;
  377. $log->after = $user->money;
  378. $log->operator = '';
  379. $log->operator_id = 0;
  380. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  381. $log->created_at = time();
  382. $log->order_id = $order->id;
  383. $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER;
  384. if (!$log->save()) {
  385. return [
  386. 'code' => 1,
  387. 'msg' => implode(';', array_values($log->firstErrors))
  388. ];
  389. };
  390. if (!$user->save()) {
  391. return [
  392. 'code' => 1,
  393. 'msg' => $this->getErrorSummary(false)[0],
  394. ];
  395. }
  396. }
  397. if ($order_refund->save()) {
  398. // 删除赠送的核销卡
  399. VerifyCardSale::cancelCard($order);
  400. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
  401. NoticeSend::OrderRefund($order->user_id, $order->mobile, $order->order_no, $order_refund->refund_price, $goods->name);
  402. return [
  403. 'code' => 0,
  404. 'msg' => '处理成功,已完成退款退货。',
  405. ];
  406. }
  407. return [
  408. 'code' => 1,
  409. 'msg' => $this->getErrorSummary(false)[0],
  410. ];
  411. }
  412. }
  413. if ($this->action == 2) {//拒绝
  414. $order_refund->status = 3;
  415. $order_refund->refuse_desc = $this->remark ? $this->remark : '卖家拒绝了您的退货请求';
  416. $order_refund->response_time = time();
  417. if ($order_refund->save()) {
  418. NoticeSend::OrderRefundCancel($order->mobile);
  419. $merchant = new MerchantForm();
  420. $merchant->order_id = $order->id;
  421. $merchant->syncMchOrderRefundStatus(0);
  422. return [
  423. 'code' => 0,
  424. 'msg' => '处理成功,已拒绝该退货退款订单。',
  425. ];
  426. }
  427. return [
  428. 'code' => 1,
  429. 'msg' => $this->getErrorSummary(false)[0],
  430. ];
  431. }
  432. }
  433. /**
  434. * 统一处理换货
  435. * @param $order_refund
  436. * @return \app\cyy\ValidationErrorResponse|array
  437. */
  438. private function submit2($order_refund)
  439. {
  440. if ($this->action == 1) {//同意
  441. $order_refund->status = 2;
  442. if (!$this->address_id) {
  443. return [
  444. 'code' => 1,
  445. 'msg' => '退货地址不能为空',
  446. ];
  447. };
  448. $order_refund->address_id = $this->address_id;
  449. $order_refund->response_time = time();
  450. if ($order_refund->save()) {
  451. // TODO: 消息
  452. return [
  453. 'code' => 0,
  454. 'msg' => '处理成功,已同意换货。',
  455. ];
  456. }
  457. return [
  458. 'code' => 1,
  459. 'msg' => $this->getErrorSummary(false)[0],
  460. ];
  461. }
  462. if ($this->action == 2) {//拒绝
  463. $order_refund->status = 3;
  464. $order_refund->refuse_desc = $this->remark ? $this->remark : '卖家已拒绝您的换货请求';
  465. $order_refund->response_time = time();
  466. if ($order_refund->save()) {
  467. $merchant = new MerchantForm();
  468. $merchant->order_id = $order_refund->order_id;
  469. $merchant->syncMchOrderRefundStatus(0);
  470. return [
  471. 'code' => 0,
  472. 'msg' => '处理成功,已拒绝换货请求。',
  473. ];
  474. }
  475. return [
  476. 'code' => 1,
  477. 'msg' => $this->getErrorSummary(false)[0],
  478. ];
  479. }
  480. }
  481. }