MchOrderPayDataForm.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\admin\models\order;
  8. use app\models\AccountLog;
  9. use app\models\Goods;
  10. use app\models\GoodsBook;
  11. use app\models\HangingOrder;
  12. use app\models\HangingOrderDetail;
  13. use app\models\Order;
  14. use app\models\OrderDetail;
  15. use app\models\User;
  16. use app\models\VerifyCardLog;
  17. use app\models\VerifyCardSale;
  18. use app\modules\admin\models\order\MchOrderForm;
  19. use app\modules\client\models\OrderComplete;
  20. use app\modules\client\models\v1\LoginForm;
  21. use app\modules\client\models\v1\ShareMoneyForm;
  22. use app\modules\common\models\AlipayNotifyForm;
  23. use app\modules\common\models\NotifyForm;
  24. use app\utils\Alipay\Alipay;
  25. use app\utils\Alipay\AlipayProfit;
  26. use app\utils\CloudPrint;
  27. use app\utils\Delivery\Delivery;
  28. use app\utils\OrderNo;
  29. use app\utils\Wechat\WechatNewPay;
  30. use app\utils\Wechat\WechatPay;
  31. use ByteDance\ByteDance;
  32. use yii\helpers\Json;
  33. class MchOrderPayDataForm extends MchOrderForm
  34. {
  35. public $store_id;
  36. public $order_id;
  37. public $order_id_list;
  38. public $pay_type;
  39. public $user;
  40. public $form_id;
  41. public $parent_user_id;
  42. public $condition;
  43. public $_from;
  44. public $is_combine;
  45. public $auth_code;
  46. /** @var Wechat $wechat */
  47. private $wechat;
  48. private $wechatPay;
  49. private $order;
  50. const PAY_FROM_APP = 'app';
  51. const PAY_FROM_MINI = 'mini';
  52. const PAY_FROM_H5 = 'h5';
  53. const PAY_FROM_OFFICIAL = 'official';
  54. public function rules()
  55. {
  56. return [
  57. [['pay_type', '_from'], 'required'],//用户收银下单报错Auth Code不能为空 移除auth_code必填
  58. [['_from'], 'in', 'range' => ['app', 'mini', 'h5', 'official','cashier']],
  59. [['pay_type'], 'in', 'range' => [1, 2, 3, 4, 5, 6]], // 'WECHAT_PAY', 'HUODAO_PAY', 'BALANCE_PAY' 'ALIPAY','现金'
  60. [['form_id', 'order_id_list', '_from','auth_code'], 'string'],
  61. ['is_combine', 'default', 'value' => 0],
  62. [['parent_user_id', 'condition', 'order_id', 'is_combine'], 'integer'],
  63. ];
  64. }
  65. public function search()
  66. {
  67. $this->wechatPay = \Yii::$app->controller->wechatPay;
  68. if (!$this->validate()) {
  69. return [
  70. 'code' => 1,
  71. 'msg' => $this->getErrorSummary(false)[0],
  72. ];
  73. }
  74. if ($this->order_id_list) {
  75. $order_id_list = json_decode($this->order_id_list, true);
  76. if (is_array($order_id_list) && count($order_id_list) == 1) {
  77. $this->order_id = $order_id_list[0];
  78. $this->order_id_list = '';
  79. }
  80. }
  81. $t = \Yii::$app->db->beginTransaction();
  82. $this->order = Order::findOne([
  83. 'store_id' => $this->store_id,
  84. 'id' => $this->order_id,
  85. ]);
  86. if ($this->order->pay_price == 0) {
  87. $this->order->pay_time = time();
  88. $this->order->is_pay = 1;
  89. if($this->order->order_type == 7){
  90. $this->order->pay_type = 7; //积分兑换
  91. }else{
  92. $this->order->pay_type = 3;
  93. }
  94. $this->order->trade_status = $this->order->is_offline == 1 ? Order::ORDER_FLOW_CONFIRM : Order::ORDER_FLOW_NO_SEND;
  95. $this->order->save();
  96. if ($this->order->verify_card_id > 0) {
  97. VerifyCardSale::updateAll(['status' => 1], ['id' => $this->order->verify_card_id]);
  98. $verifylog = new VerifyCardLog();
  99. $verifylog->store_id = get_store_id();
  100. $verifylog->sale_id = $this->order->verify_card_id;
  101. $verifylog->shop_id = 0;
  102. $verifylog->use_time = time();
  103. $verifylog->user_id = get_user_id();
  104. $verifylog->type = VerifyCardLog::WRITE_TYPE_EXCHANGE;
  105. $verifylog->describe = '使用卡券礼品卡兑换商品';
  106. $verifylog->save();
  107. }
  108. $t->commit();
  109. // 支付完成后,相关操作
  110. (new NotifyForm())->videoGoodsShare($this->order);
  111. $form = new OrderComplete();
  112. $form->order_id = $this->order->id;
  113. $form->order_type = 0;
  114. $form->store_id = get_store_id();
  115. $form->notify();
  116. return [
  117. 'code' => 0,
  118. 'msg' => '支付成功'
  119. ];
  120. }
  121. if (!$this->order) {
  122. $t->rollBack();
  123. return [
  124. 'code' => 1,
  125. 'msg' => '订单不存在',
  126. ];
  127. }
  128. if ($this->order->is_delete == 1 || $this->order->trade_status == Order::ORDER_FLOW_CANCEL) {
  129. $t->rollBack();
  130. return [
  131. 'code' => 1,
  132. 'msg' => '订单已取消',
  133. ];
  134. }
  135. if ($this->order->is_pay == 1 || $this->order->trade_status > -1) {
  136. $t->rollBack();
  137. return [
  138. 'code' => 1,
  139. 'msg' => '订单状态异常',
  140. ];
  141. }
  142. try {
  143. $this->checkGoodsConfine($this->order);
  144. } catch (\Exception $e) {
  145. $t->rollBack();
  146. return [
  147. 'code' => 1,
  148. 'msg' => $e->getMessage()
  149. ];
  150. }
  151. // 存储parent_id
  152. // if ($this->user && $this->user->parent_user_id) {
  153. // CommonOrder::saveParentId($this->user->parent_user_id);
  154. // }
  155. $goods_names = '';
  156. $goods_list = OrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()],
  157. 'g.id=od.goods_id')->where(['od.order_id' => $this->order->id, 'od.is_delete' => 0,
  158. ])->select('g.name,g.verify_card_id')->asArray()->all();
  159. foreach ($goods_list as $goods) {
  160. $goods_names .= $goods['name'] . ';';
  161. }
  162. $goods_names = mb_substr($goods_names, 0, 32, 'utf-8');
  163. $this->setReturnData($this->order);
  164. $this->order->order_union_id = 0;
  165. if (!$this->order->save()) {
  166. $t->rollBack();
  167. return [
  168. 'code' => 1,
  169. 'msg' => '订单保存失败'
  170. ];
  171. }
  172. // 余额抵扣支付
  173. $balance_price = 0;
  174. if ($this->is_combine) {
  175. $this->user->money = doubleval($this->user->money);
  176. if ($this->user->money >= $this->order->pay_price) {
  177. $this->pay_type = 3;
  178. } else {
  179. $balance_price = $this->user->money;
  180. $this->order->combine_money = $this->user->money;
  181. $this->order->is_combine_pay = Order::IS_COMBINE_PAY;
  182. }
  183. } else {
  184. $this->order->combine_money = 0;
  185. $this->order->is_combine_pay = Order::NOT_COMBINE_PAY;
  186. }
  187. $this->order->save();
  188. if (in_array($this->pay_type, [1, 2, 3, 4, 6])) {
  189. if ($this->order->pay_price == 0) {
  190. $this->order->is_pay = 1;
  191. $this->order->pay_type = 1;
  192. $this->order->pay_time = time();
  193. // 已发货状态
  194. $this->order->trade_status = $this->order->is_offline == 1 ? ORDER::ORDER_FLOW_SEND : ORDER::ORDER_FLOW_NO_SEND;
  195. $this->order->send_time = $this->order->is_offline == 1 ? time() : 0;
  196. if (!$this->order->save()) {
  197. $t->rollBack();
  198. return [
  199. 'code' => 1,
  200. 'msg' => '支付失败'
  201. ];
  202. }
  203. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  204. // 支付完成后,相关操作
  205. $form = new OrderComplete();
  206. $form->order_id = $this->order->id;
  207. $form->order_type = 0;
  208. $form->store_id = get_store_id();
  209. $form->notify();
  210. $t->commit();
  211. if($this->order->is_offline == 1){
  212. $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
  213. $this->order->confirm_time = time();
  214. }
  215. $this->order->save();
  216. // if($this->order->hanging_order_id > 0){
  217. // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
  218. // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
  219. // }
  220. return [
  221. 'code' => 0,
  222. 'msg' => '0元支付'
  223. ];
  224. }
  225. // 微信支付
  226. if ($this->pay_type == 1) {
  227. if (is_profit_pay()) {
  228. $result = WechatNewPay::micropay($this->order,OrderNo::ORDER_MALL, $goods_names, $this->order->pay_price, $balance_price, $this->auth_code);
  229. }else{
  230. $result = WechatPay::micropay($this->order,OrderNo::ORDER_MALL, $goods_names, $this->order->pay_price, $balance_price, $this->auth_code);
  231. }
  232. if($result['return_code'] == 'SUCCESS' ){
  233. if($result['result_code'] === 'FAIL'){
  234. // 如果返回结果不是 等待用户输入密码 则直接返回
  235. if($result['err_code'] == 'USERPAYING'){
  236. $result = $this->checkOrderPay($this->order,0);
  237. }else{
  238. return [
  239. 'code' => 1,
  240. 'msg' => '微信支付参数错误',
  241. 'data' => $result
  242. ];
  243. }
  244. }
  245. if($result['result_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS' && $result['trade_type'] == 'MICROPAY'){
  246. $this->order->transaction_id = $result['transaction_id'];
  247. $this->order->is_pay = 1;
  248. $this->order->pay_time = time();
  249. $this->order->pay_type = 1;
  250. // 已发货状态
  251. $this->order->trade_status = $this->order->is_offline == 1 ? ORDER::ORDER_FLOW_SEND : ORDER::ORDER_FLOW_NO_SEND;
  252. $this->order->send_time = $this->order->is_offline == 1 ? time() : 0;
  253. $this->order->save();
  254. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  255. // 支付完成后,相关操作
  256. $form = new OrderComplete();
  257. $form->order_id = $this->order->id;
  258. $form->order_type = 0;
  259. $form->store_id = get_store_id();
  260. $form->notify();
  261. $t->commit();
  262. if($this->order->is_offline == 1){
  263. $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
  264. $this->order->confirm_time = time();
  265. }
  266. $this->order->save();
  267. // if($this->order->hanging_order_id > 0){
  268. // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
  269. // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
  270. // }
  271. //添加分账接收方
  272. $notifyForm = new NotifyForm();
  273. $notifyForm->addReceiver($this->order);
  274. return [
  275. 'code' => 0,
  276. 'msg' => '支付成功',
  277. ];
  278. }else{
  279. return [
  280. 'code' => 1,
  281. 'msg' => '支付失败',
  282. 'data' => $result
  283. ];
  284. }
  285. }else{
  286. return ['code'=>1,'msg'=>'支付失败','data'=>$result];
  287. }
  288. }
  289. // 纯余额支付
  290. if($this->pay_type == 3){
  291. $user = User::findOne(['id' => $this->order->user_id]);
  292. if ($user->money < $this->order->pay_price) {
  293. $t->rollBack();
  294. return [
  295. 'code' => 1,
  296. 'msg' => '支付失败,余额不足',
  297. ];
  298. }
  299. $res = AccountLog::saveLog($user->id, floatval($this->order->pay_price), AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_EXPEND, 1, $this->order->id, "商城余额支付,订单号为:{$this->order->order_no}。");
  300. if (!$res) {
  301. $t->rollBack();
  302. return [
  303. 'code' => 1,
  304. 'msg' => '支付失败'
  305. ];
  306. }
  307. $this->order->is_pay = 1;
  308. $this->order->pay_type = 3;
  309. $this->order->pay_time = time();
  310. $this->order->trade_status = $this->order->is_offline == 1 ? ORDER::ORDER_FLOW_SEND : ORDER::ORDER_FLOW_NO_SEND;
  311. $this->order->send_time = $this->order->is_offline == 1 ? time() : 0;
  312. $this->order->save();
  313. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  314. $form = new OrderComplete();
  315. $form->order_id = $this->order->id;
  316. $form->order_type = 0;
  317. $form->store_id = get_store_id();
  318. $form->notify();
  319. $t->commit();
  320. if($this->order->is_offline == 1){
  321. $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
  322. $this->order->confirm_time = time();
  323. }
  324. $this->order->save();
  325. // if($this->order->hanging_order_id > 0){
  326. // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
  327. // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
  328. // }
  329. return [
  330. 'code' => 0,
  331. 'msg' => '订单支付成功',
  332. ];
  333. }
  334. // 支付宝支付
  335. if ($this->pay_type == 4) {
  336. if (is_profit_pay()) {
  337. $result = AlipayProfit::scanNew($this->order, $goods_names, '', $this->auth_code,$this->order->pay_price,$balance_price);
  338. }else{
  339. $result = Alipay::scanNew($this->order, $goods_names, '', $this->auth_code,$this->order->pay_price,$balance_price);
  340. }
  341. // 支付成功
  342. if($result['code'] == 0){
  343. $this->order->alipay_trade_no = $result['data']['trade_no'];
  344. $this->order->is_pay = 1;
  345. $this->order->pay_time = time();
  346. $this->order->pay_type = 4;
  347. // 已发货状态
  348. $this->order->trade_status = $this->order->is_offline == 1 ? ORDER::ORDER_FLOW_SEND : ORDER::ORDER_FLOW_NO_SEND;
  349. $this->order->send_time = $this->order->is_offline == 1 ? time() : 0;
  350. $this->order->save();
  351. // if($this->order->hanging_order_id > 0){
  352. // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
  353. // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
  354. // }
  355. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  356. // 支付完成后,相关操作
  357. $form = new OrderComplete();
  358. $form->order_id = $this->order->id;
  359. $form->order_type = 0;
  360. $form->store_id = get_store_id();
  361. $form->notify();
  362. $t->commit();
  363. // 确认收获
  364. if($this->order->is_offline == 1){
  365. $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
  366. $this->order->confirm_time = time();
  367. }
  368. $this->order->save();
  369. $notifyForm = new AlipayNotifyForm();
  370. $notifyForm->addReceiver($this->order);
  371. return [
  372. 'code' => 0,
  373. 'msg' => '订单支付成功',
  374. ];
  375. }else{
  376. // todo 再去查询是否支付成功
  377. }
  378. }
  379. // 现金
  380. if($this->pay_type == 6){
  381. // 现金支付 直接完成订单
  382. $this->order->is_pay = 1;
  383. $this->order->pay_time = time();
  384. $this->order->pay_type = 6;
  385. // 已发货状态
  386. $this->order->trade_status = $this->order->is_offline == 1 ? ORDER::ORDER_FLOW_SEND : ORDER::ORDER_FLOW_NO_SEND;
  387. $this->order->send_time = $this->order->is_offline == 1 ? time() : 0;
  388. if(!$this->order->save()){
  389. $t->rollBack();
  390. return ['code' =>1 ,' msg' => '订单支付失败'];
  391. }
  392. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  393. $form = new OrderComplete();
  394. $form->order_id = $this->order->id;
  395. $form->order_type = 0;
  396. $form->store_id = get_store_id();
  397. $form->notify();
  398. if($this->order->is_offline == 1){
  399. $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
  400. $this->order->confirm_time = time();
  401. }
  402. $this->order->save();
  403. $t->commit();
  404. // 如果有挂单ID 将挂单信息删除
  405. // if($this->order->hanging_order_id > 0){
  406. // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
  407. // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
  408. // }
  409. return ['code' => 0,'msg' => '订单支付成功'];
  410. }
  411. //货到付款
  412. if ($this->pay_type == 2) {
  413. // 现金支付 直接完成订单
  414. $this->order->pay_type = 2;
  415. // 已发货状态
  416. $this->order->trade_status = ORDER::ORDER_FLOW_NO_SEND;
  417. $this->order->send_time = time();
  418. if(!$this->order->save()){
  419. $t->rollBack();
  420. return ['code' =>1 ,' msg' => '订单支付失败'];
  421. }
  422. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  423. $form = new OrderComplete();
  424. $form->order_id = $this->order->id;
  425. $form->order_type = 0;
  426. $form->store_id = get_store_id();
  427. $form->notify();
  428. // $this->order->trade_status = Order::ORDER_FLOW_CONFIRM;
  429. // $this->order->confirm_time = time();
  430. // $this->order->save();
  431. $t->commit();
  432. // 如果有挂单ID 将挂单信息删除
  433. // if($this->order->hanging_order_id > 0){
  434. // HangingOrder::updateAll(['is_delete'=>1],['id'=>$this->order->hanging_order_id]);
  435. // HangingOrderDetail::updateAll(['is_delete'=>1],['order_id'=>$this->order->hanging_order_id]);
  436. // }
  437. return ['code' => 0,'msg' => '订单支付成功'];
  438. }
  439. }
  440. }
  441. // 查询付款码支付后订单状态
  442. private function checkOrderPay($order,$num = 0){
  443. sleep(5);
  444. if($num >= 45){
  445. return ['result_code'=>'FAIL','data' => '支付超时'];
  446. }
  447. $num += 5;
  448. if (is_profit_pay()) {
  449. $result = WechatNewPay::orderQuery($order);
  450. }else{
  451. $result = WechatPay::orderQuery($order);
  452. }
  453. if($result['return_code'] == 'SUCCESS'){
  454. if($result['trade_state'] == 'USERPAYING'){
  455. return $this->checkOrderPay($order,$num);
  456. }else{
  457. return $result;
  458. }
  459. }
  460. }
  461. /**
  462. * 设置佣金
  463. * @param Order $order
  464. * @return mixed
  465. */
  466. private function setReturnData($order)
  467. {
  468. $form = new ShareMoneyForm();
  469. $form->order = $order;
  470. $form->order_type = 0;
  471. return $form->setData();
  472. }
  473. /**
  474. * @param Order $order
  475. * @throws \Exception
  476. */
  477. private function checkGoodsConfine($order)
  478. {
  479. foreach ($order->detail as $detail) {
  480. /* @var Goods $goods*/
  481. /* @var OrderDetail $detail*/
  482. $goods = $detail->goods;
  483. if ($goods->confine_count && $goods->confine_count > 0) {
  484. $goodsNum = Goods::getBuyNum($this->user, $goods->id);
  485. if ($goodsNum) {
  486. } else {
  487. $goodsNum = 0;
  488. }
  489. $goodsTotalNum = intval($goodsNum + $detail->num);
  490. if ($goodsTotalNum > $goods->confine_count) {
  491. throw new \Exception('商品:' . $goods->name . ' 超出购买数量', 1);
  492. }
  493. }
  494. if (in_array($order->order_type, [1, 2])) {
  495. $res = $this->bookCheckGoodsNum($goods, $detail, $order);
  496. if ($res['code'] > 0) {
  497. throw new \Exception($res['msg'], 1);
  498. }
  499. }
  500. }
  501. }
  502. /**
  503. * @param Goods $goods
  504. * @param OrderDetail $detail
  505. * @param Order $order
  506. */
  507. private function bookCheckGoodsNum($goods, $detail, $order) {
  508. // 判断时间
  509. if (time() - $order->created_at > 15 * 60) {
  510. return [
  511. 'code' => 1,
  512. 'msg' => '订单已过支付时间,将自动取消'
  513. ];
  514. }
  515. $attr = Json::decode($detail->attr);
  516. // 酒店预约
  517. if ($order->order_type == 1) {
  518. // $date_book = GoodsBook::findOne(['goods_id' => $goods->id])->date_book;
  519. // $date_book = Json::decode($date_book);
  520. // if (!$date_book) {
  521. // return [
  522. // 'code' => 1,
  523. // 'msg' => '数据异常'
  524. // ];
  525. // }
  526. // $data_config = array_combine(array_column($date_book, 'date'), array_column($date_book, 'num'));
  527. // foreach ($attr as $value) {
  528. // if (isset($data_config[$value['date']])) {
  529. // if ($data_config[$value['date']] < $detail->num) {
  530. // return [
  531. // 'code' => 1,
  532. // 'msg' => '选中日期' . $value['date'] . '内暂无房源'
  533. // ];
  534. // }
  535. // } else {
  536. // return [
  537. // 'code' => 1,
  538. // 'msg' => '未找到预约时间下相关商品数据'
  539. // ];
  540. // }
  541. // }
  542. }
  543. // 服务预约
  544. if ($order->order_type == 2) {
  545. $service_book = GoodsBook::findOne(['goods_id' => $goods->id])->service_book;
  546. $service_book = Json::decode($service_book);
  547. if (!$service_book) {
  548. return [
  549. 'code' => 1,
  550. 'msg' => '数据异常'
  551. ];
  552. }
  553. $date_data = $this->getDateByInterval(7);
  554. $count = 0;
  555. $new_arr = [
  556. 'data' => []
  557. ];
  558. $order = Order::find()->alias('o')
  559. ->leftJoin(['od' => OrderDetail::tableName()], 'o.id = od.order_id')
  560. ->where(['o.trade_status' => [0, 2, 3], 'o.is_delete' => 0, 'o.order_type' => 2, 'goods_id' => $goods['id']])
  561. ->andWhere(['>', 'o.created_at', strtotime(date("Y-m-d"))])
  562. ->select('od.attr, od.num')->asArray()->all();
  563. foreach ($date_data as $index => $datum) {
  564. $new_arr['data'][$index]['date'] = $datum;
  565. $new_arr['data'][$index]['time'] = $service_book['data'][0]['time'];
  566. }
  567. if (!$new_arr) {
  568. return [
  569. 'code' => 1,
  570. 'msg' => '数据异常'
  571. ];
  572. }
  573. $service_book = $new_arr['data'];
  574. $service_book_date = array_column($service_book, NULL, 'date');
  575. $service_book_time = $service_book_date[$attr['date']]['time'];
  576. $num = 0;
  577. $is = false;
  578. foreach ($order as $item) {
  579. $item['attr'] = json_decode($item['attr'], true);
  580. if ($item['attr']['date'] === $attr['date']) {
  581. if ($attr['time'] == $item['attr']['time']) {
  582. $num += $item['num'];
  583. }
  584. }
  585. }
  586. foreach ($service_book_time as $m) {
  587. foreach ($m['times'] as $n) {
  588. $is = true;
  589. if ($n['time'] == $attr['time']) {
  590. if (($detail->num + $num) > $n['num']) {
  591. return [
  592. 'code' => 1,
  593. 'msg' => $n['time'] . '时间段内暂不可预约'
  594. ];
  595. }
  596. }
  597. }
  598. }
  599. if ($is === false) {
  600. return [
  601. 'code' => 1,
  602. 'msg' => '未找到预约时间下相关商品数据'
  603. ];
  604. }
  605. }
  606. return [
  607. 'code' => 0,
  608. 'msg' => 'success'
  609. ];
  610. }
  611. public function getDateByInterval(int $num) :array
  612. {
  613. //var_dump($st, $et);die;
  614. $returnData = [];
  615. $i = 0;
  616. do {
  617. $temp = date('Y-m-d', strtotime('+' . $i . ' day', strtotime(date('Y-m-d'))));
  618. $returnData[] = $temp;
  619. $i++;
  620. } while ($i < $num);
  621. return $returnData;
  622. }
  623. }