OrderPayDataForm.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\alliance\models\pt\order;
  8. use app\jobs\CancelPtOrderJob;
  9. use app\jobs\CreatedPtOrderJob;
  10. use app\models\AccountLog;
  11. use app\models\Goods;
  12. use app\models\GoodsBook;
  13. use app\models\Order;
  14. use app\models\OrderDetail;
  15. use app\models\PtActivity;
  16. use app\models\PtActivityGoods;
  17. use app\models\PtActivityOrder;
  18. use app\models\PtActivityOrderDetail;
  19. use app\models\User;
  20. use app\models\VerifyCardLog;
  21. use app\models\VerifyCardSale;
  22. use app\modules\admin\models\pt\PtActivityOrderForm;
  23. use app\modules\client\models\OrderComplete;
  24. use app\modules\client\models\v1\LoginForm;
  25. use app\modules\client\models\v1\ShareMoneyForm;
  26. use app\modules\common\models\NotifyForm;
  27. use app\utils\Alipay\Alipay;
  28. use app\utils\Alipay\AlipayProfit;
  29. use app\utils\Alipay\AlipayUnion;
  30. use app\utils\CloudPrint;
  31. use app\utils\OrderNo;
  32. use app\utils\Wechat\WechatAlliancePay;
  33. use app\utils\Wechat\WechatNewPay;
  34. use app\utils\Wechat\WechatPay;
  35. use app\utils\yunst\src\OrderYunst;
  36. use ByteDance\ByteDance;
  37. use yii\base\Model;
  38. use yii\helpers\Json;
  39. use app\utils\Delivery\Delivery;
  40. use app\models\Store;
  41. /**
  42. * @property User $user
  43. * @property Order $order
  44. */
  45. class OrderPayDataForm extends Model
  46. {
  47. public $store_id;
  48. public $order_id;
  49. public $order_id_list;
  50. public $pay_type;
  51. public $user;
  52. public $form_id;
  53. public $parent_user_id;
  54. public $condition;
  55. public $_from;
  56. public $is_combine;
  57. public $saas_id;
  58. public $saas_user;
  59. /** @var Wechat $wechat */
  60. private $wechat;
  61. private $wechatPay;
  62. private $order;
  63. const PAY_FROM_APP = 'app';
  64. const PAY_FROM_MINI = 'mini';
  65. const PAY_FROM_H5 = 'h5';
  66. const PAY_FROM_OFFICIAL = 'official';
  67. public function rules()
  68. {
  69. return [
  70. [['pay_type', '_from'], 'required'],
  71. [['_from'], 'in', 'range' => ['app', 'mini', 'h5', 'official']],
  72. [['pay_type'], 'in', 'range' => [1, 2, 3, 4, 5, Order::PAY_TYPE_YUNST_WECHAT_PAY]], // 'WECHAT_PAY', 'HUODAO_PAY', 'BALANCE_PAY' 'ALIPAY',
  73. [['form_id', 'order_id_list', '_from'], 'string'],
  74. ['is_combine', 'default', 'value' => 0],
  75. [['parent_user_id', 'condition', 'order_id', 'is_combine'], 'integer'],
  76. ];
  77. }
  78. public function search()
  79. {
  80. //$this->wechatPay = \Yii::$app->controller->wechatPay;
  81. if (!$this->validate()) {
  82. return [
  83. 'code' => 1,
  84. 'msg' => $this->getErrorSummary(false)[0],
  85. ];
  86. }
  87. $t = \Yii::$app->db->beginTransaction();
  88. if ($this->order_id) { //单个订单付款
  89. //检测活动是否存在
  90. $this->order = PtActivityOrder::findOne([
  91. 'id' => $this->order_id,
  92. ]);
  93. $pt_activity = PtActivityOrderDetail::find()->alias('pod')->where(['pod.order_id' => $this->order_id])
  94. ->leftJoin(['pa' => PtActivity::tableName()], 'pod.activity_id = pa.id')
  95. ->select('pa.start_time, pa.end_time, pa.id, pa.party_size, pa.party_type, pa.party_goods_count, pa.split_time, pa.join_num, pod.goods_id')->asArray()->one();
  96. if (empty($pt_activity)) {
  97. return [
  98. 'code' => 1,
  99. 'msg' => "拼团活动不存在",
  100. ];
  101. }
  102. $join_num = $pt_activity['join_num'];
  103. $s_today_time = strtotime(date('Y-m-d'));
  104. $e_today_time = (strtotime(date('Y-m-d')) + 3600 * 24);
  105. $join_count = PtActivityOrderDetail::find()->alias('od')
  106. ->leftJoin(['o' => PtActivityOrder::tableName()], 'od.order_id = o.id')
  107. ->where(['od.goods_id' => $pt_activity['goods_id'], 'o.user_id' => get_user_id(), 'is_pay' => 1])
  108. ->andWhere(['AND', ['>', 'od.created_at', $s_today_time], ['<', 'od.created_at', $e_today_time]])->select('od.id')->count();
  109. if($pt_activity->party_type == 0){
  110. if ($join_num > 0 && $join_count >= $join_num) {
  111. return [
  112. 'code' => 1,
  113. 'msg' => "今日参加此商品的拼团次数已达上限"
  114. ];
  115. }
  116. }
  117. if ($pt_activity['end_time'] < time() || $pt_activity['start_time'] > time()) {
  118. return [
  119. 'code' => 1,
  120. 'msg' => "当前时间不在拼团活动时间范围内",
  121. ];
  122. }
  123. //判断是否开奖
  124. $saas_user = get_saas_user();
  125. $user = User::findOne(['binding' => $saas_user->mobile, 'store_id' => $this->order->store_id, 'is_delete' => 0]);
  126. $user_id = 0;
  127. if ($user) {
  128. \Yii::$app->jwt->setUser($user);
  129. $user_id = $user->id;
  130. }
  131. if (!empty($this->order->pt_number)) {
  132. $pt_order = PtActivityOrder::findOne(['id' => $this->order->pt_number]);
  133. if ($pt_order) {
  134. if ((int)$pt_order->is_pay === 0) {
  135. return [
  136. 'code' => 1,
  137. 'msg' => "当前团暂未开放"
  138. ];
  139. }
  140. //error
  141. $check_pt_order = PtActivityOrder::find()->where(['trade_status' => 0, 'is_pay' => 1])
  142. ->andWhere(['OR', ['id' => $this->order->pt_number], ['pt_number' => $this->order->pt_number]])
  143. ->select('id, is_winner')->asArray()->all();
  144. //判断是否到解散时间
  145. $end_time = (($pt_activity['split_time'] * 60 * 60) + ($pt_order->pay_time));
  146. if ($end_time <= time()) {
  147. return [
  148. 'code' => 1,
  149. 'msg' => "当前团已解散"
  150. ];
  151. }
  152. $open = false;
  153. foreach ($check_pt_order as $item) {
  154. if ((int)$item['is_winner'] > 0) {
  155. $open = true;
  156. }
  157. if ((int)$item['user_id'] === $user_id) {
  158. return [
  159. 'code' => 1,
  160. 'msg' => "已加入,不可重复操作"
  161. ];
  162. }
  163. }
  164. if ($open) {
  165. return [
  166. 'code' => 1,
  167. 'msg' => "当前团已开奖"
  168. ];
  169. }
  170. if($pt_activity['party_type'] == 0){
  171. if ($pt_activity['party_size'] <= count($check_pt_order)) {
  172. return [
  173. 'code' => 1,
  174. 'msg' => "当前团人数已达上限"
  175. ];
  176. }
  177. }
  178. if($pt_activity['party_type'] == 1){
  179. $goodsCountQuery = PtActivityOrderDetail::find()->alias('pod')
  180. ->leftJoin(['po' => PtActivityOrder::tableName()], 'pod.order_id = po.id')
  181. ->where(['po.is_pay' => 1, 'pod.is_delete' => 0])
  182. ->andWhere(['OR' , ['po.id' => $this->order->pt_number], ['po.pt_number' => $this->order->pt_number]]);
  183. $goodsCount = $goodsCountQuery->sum('pod.num');
  184. if($pt_activity['party_goods_count'] <= (int)$goodsCount){
  185. return [
  186. 'code' => 1,
  187. 'msg' => "当前团商品数量已达上限"
  188. ];
  189. }
  190. }
  191. }
  192. } else {
  193. if ($this->order->head_integral > 0) {
  194. if ($this->order->head_integral > $user->integral) {
  195. return [
  196. 'code' => 1,
  197. 'msg' => '开团积分不足'
  198. ];
  199. }
  200. }
  201. }
  202. // 供应链系统下单时是否使用平台商户号,1使用,0未使用
  203. if (!Store::hasIncoming($this->order->store_id)) {
  204. $this->order->is_use_platform_mch = 1;
  205. $this->order->save();
  206. }
  207. //0元订单开始
  208. if ($this->order->pay_price == 0) {
  209. // 这里要判断订单之前是不是货到付款的订单 如果是货到付款的订单
  210. $this->order->pay_time = time();
  211. $this->order->is_pay = 1;
  212. $this->order->pay_type = 3;
  213. $this->order->trade_status = Order::ORDER_FLOW_NO_SEND;
  214. $this->order->save();
  215. $t->commit();
  216. //TODO 拼团成功后需要走注释部分
  217. // 支付完成后,相关操作
  218. // (new NotifyForm())->videoGoodsShare($this->order);
  219. // $form = new OrderComplete();
  220. // $form->order_id = $this->order->id;
  221. // $form->order_type = 0;
  222. // $form->store_id = get_store_id();
  223. // $form->notify();
  224. $pt_number = $this->order->pt_number ?: $this->order->id;
  225. //判断是团长开团
  226. $is_first_order = false;
  227. if ($pt_number === $this->order->id) {
  228. $is_first_order = true;
  229. }
  230. $this->order->pt_number && $this->order = PtActivityOrder::findOne($this->order->pt_number);
  231. $order_detail = PtActivityOrderDetail::find()->where(['order_id' => $pt_number])->select('goods_id, activity_id')->asArray()->one();
  232. if (!empty($this->order) && !empty($order_detail)) {
  233. $pt_activity_goods = PtActivityGoods::findOne([
  234. 'activity_id' => $order_detail['activity_id'],
  235. 'goods_id' => $order_detail['goods_id'],
  236. 'is_delete' => 0
  237. ]);
  238. if ($pt_activity_goods) {
  239. $pt_activity = PtActivity::findOne(['id' => $pt_activity_goods->activity_id, 'is_delete' => 0]);
  240. if ($pt_activity) {
  241. $pt_order = PtActivityOrder::find()->where(['trade_status' => 0, 'is_pay' => 1])
  242. ->andWhere(['OR', ['id' => $pt_number], ['pt_number' => $pt_number]])->select('id')->column();
  243. if($pt_activity->party_type == 0){
  244. if ($pt_activity->party_size <= count($pt_order)) {
  245. queue_push(new CreatedPtOrderJob(['order_id' => ($pt_number ?: $this->order->id)]));
  246. }
  247. }
  248. if($pt_activity->party_type == 1){
  249. $goodsCountQuery = PtActivityOrderDetail::find()->alias('pod')
  250. ->leftJoin(['po' => PtActivityOrder::tableName()], 'pod.order_id = po.id')
  251. ->where(['po.is_pay' => 1, 'pod.is_delete' => 0])
  252. ->andWhere(['OR' , ['po.id' => $pt_number], ['po.pt_number' => $pt_number]]);
  253. $goodsCount = $goodsCountQuery->sum('pod.num');
  254. if($pt_activity->party_goods_count <= (int)$goodsCount){
  255. queue_push(new CreatedPtOrderJob(['order_id' => ($pt_number ?: $this->order->id)]));
  256. }
  257. }
  258. //判断是团长开团
  259. if ($is_first_order) {
  260. $delay = $pt_activity->split_time * 60 * 60;
  261. queue_push(new CancelPtOrderJob(['order_id' => $this->order->id, 'store_id' => $this->order->store_id]), $delay);
  262. }
  263. }
  264. }
  265. }
  266. return [
  267. 'code' => 0,
  268. 'msg' => '支付成功'
  269. ];
  270. }
  271. if (!$this->order) {
  272. $t->rollBack();
  273. return [
  274. 'code' => 1,
  275. 'msg' => '订单不存在',
  276. ];
  277. }
  278. if ($this->order->is_delete == 1 || $this->order->trade_status == Order::ORDER_FLOW_CANCEL) {
  279. $t->rollBack();
  280. return [
  281. 'code' => 1,
  282. 'msg' => '订单已取消',
  283. ];
  284. }
  285. if ($this->order->is_pay == 1 || ($this->order->trade_status > -1 && $this->order->pay_type != 2)) {
  286. $t->rollBack();
  287. return [
  288. 'code' => 1,
  289. 'msg' => '订单状态异常',
  290. ];
  291. }
  292. // try {
  293. // $this->checkGoodsConfine($this->order);
  294. // } catch (\Exception $e) {
  295. // $t->rollBack();
  296. // return [
  297. // 'code' => 1,
  298. // 'msg' => $e->getMessage()
  299. // ];
  300. // }
  301. // 存储parent_id
  302. // if ($this->user && $this->user->parent_user_id) {
  303. // CommonOrder::saveParentId($this->user->parent_user_id);
  304. // }
  305. $goods_names = '';
  306. $goods_list = PtActivityOrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()],
  307. 'g.id=od.goods_id')->where(['od.order_id' => $this->order->id, 'od.is_delete' => 0,
  308. ])->select('g.name')->asArray()->all();
  309. foreach ($goods_list as $goods) {
  310. $goods_names .= $goods['name'] . ';';
  311. }
  312. $goods_names = mb_substr($goods_names, 0, 32, 'utf-8');
  313. //TODO 拼团成功后需要走注释部分
  314. // $this->setReturnData($this->order);
  315. if (!$this->order->save()) {
  316. $t->rollBack();
  317. return [
  318. 'code' => 1,
  319. 'msg' => '订单保存失败'
  320. ];
  321. }
  322. // 余额抵扣支付
  323. $balance_price = 0;
  324. $this->order->combine_money = 0;
  325. $this->order->is_combine_pay = Order::NOT_COMBINE_PAY;
  326. $this->order->save();
  327. if ($this->pay_type == 1 || $this->pay_type == 4 || $this->pay_type == 5 || $this->pay_type == Order::PAY_TYPE_YUNST_WECHAT_PAY) {
  328. if ($this->order->pay_price == 0) {
  329. $this->order->is_pay = 1;
  330. $this->order->pay_type = 1;
  331. if ($this->pay_type == 4) {
  332. $this->order->pay_type = 4;
  333. }
  334. $this->order->pay_time = time();
  335. if (!$this->order->save()) {
  336. $t->rollBack();
  337. return [
  338. 'code' => 1,
  339. 'msg' => '支付失败'
  340. ];
  341. }
  342. // 支付完成后,相关操作
  343. // (new NotifyForm())->videoGoodsShare($this->order);
  344. // $form = new OrderComplete();
  345. // $form->order_id = $this->order->id;
  346. // $form->order_type = 0;
  347. // $form->store_id = get_store_id();
  348. // $form->notify();
  349. // $this->setReturnData($this->order);
  350. $pt_number = $this->order->pt_number ?: $this->order->id;
  351. debug_log('拼团处理:'. 11111,'ptOrderLog.log');
  352. $this->order->pt_number && $order = PtActivityOrder::findOne($this->order->pt_number);
  353. $order_detail = PtActivityOrderDetail::find()->where(['order_id' => $pt_number])->select('goods_id, activity_id')->asArray()->one();
  354. if (!empty($order) && !empty($order_detail)) {
  355. $pt_activity_goods = PtActivityGoods::findOne([
  356. 'activity_id' => $order_detail['activity_id'],
  357. 'goods_id' => $order_detail['goods_id'],
  358. 'is_delete' => 0
  359. ]);
  360. if ($pt_activity_goods) {
  361. $pt_activity = PtActivity::findOne(['id' => $pt_activity_goods->activity_id, 'is_delete' => 0]);
  362. if ($pt_activity) {
  363. $pt_order = PtActivityOrder::find()->where(['trade_status' => 0, 'is_pay' => 1])
  364. ->andWhere(['OR', ['id' => $pt_number], ['pt_number' => $pt_number]])->select('id')->column();
  365. if($pt_activity->party_type == 0){
  366. if ($pt_activity->party_size <= count($pt_order)) {
  367. queue_push(new CreatedPtOrderJob(['order_id' => ($pt_number ?: $order->id)]));
  368. }
  369. }
  370. if($pt_activity->party_type == 1){
  371. $goodsCountQuery = PtActivityOrderDetail::find()->alias('pod')
  372. ->leftJoin(['po' => PtActivityOrder::tableName()], 'pod.order_id = po.id')
  373. ->where(['po.is_pay' => 1, 'pod.is_delete' => 0])
  374. ->andWhere(['OR' , ['po.id' => $pt_number], ['po.pt_number' => $pt_number]]);
  375. $goodsCount = $goodsCountQuery->sum('pod.num');
  376. if($pt_activity->party_goods_count <= (int)$goodsCount){
  377. queue_push(new CreatedPtOrderJob(['order_id' => ($pt_number ?: $order->id)]));
  378. }
  379. }
  380. }
  381. }
  382. }
  383. $t->commit();
  384. return [
  385. 'code' => 0,
  386. 'msg' => '0元支付'
  387. ];
  388. }
  389. if ($this->pay_type == 1) {
  390. // \Yii::error($this->_from);
  391. if ($this->_from == self::PAY_FROM_APP) {
  392. if (!Store::hasIncoming($this->order->store_id)) {
  393. $result = WechatPay::orderUnify($this->order, OrderNo::ORDER_PT, $goods_names, 0, true, $balance_price);
  394. } else {
  395. $result = WechatAlliancePay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, true, $balance_price);
  396. }
  397. } else if ($this->_from == self::PAY_FROM_H5) {
  398. if (!Store::hasIncoming($this->order->store_id)) {
  399. $result = WechatPay::orderUnify($this->order, OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price, true);
  400. } else {
  401. $result = WechatAlliancePay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price, true);
  402. }
  403. } else if ($this->_from == self::PAY_FROM_OFFICIAL) {
  404. if (!Store::hasIncoming($this->order->store_id)) {
  405. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price, false, true);
  406. } else {
  407. $result = WechatAlliancePay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price, false, true);
  408. }
  409. } else {
  410. if (!Store::hasIncoming($this->order->store_id)) {
  411. $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price);
  412. } else {
  413. $result = WechatAlliancePay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price);
  414. }
  415. }
  416. if (isset($result['code']) && $result['code'] == 1) {
  417. if ($this->_from == self::PAY_FROM_OFFICIAL) {
  418. $result['wechat_platform_open_id'] = get_user()->wechat_platform_open_id;
  419. $result['h5_auth_link'] = LoginForm::getAuthLink();
  420. }
  421. return $result;
  422. }
  423. CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  424. $t->commit();
  425. return [
  426. 'code' => 0,
  427. 'msg' => 'success',
  428. 'data' => (object)$result['data'],
  429. 'res' => $result['res'],
  430. 'body' => $goods_names
  431. ];
  432. }
  433. if ($this->pay_type == Order::PAY_TYPE_YUNST_WECHAT_PAY) {
  434. // if (!Store::hasIncoming($this->order->store_id, 'yunst')) {
  435. // return [
  436. // 'code' => 1,
  437. // 'msg' => '商家未配置通联支付'
  438. // ];
  439. // }
  440. //是非独立部署 进件流程//通联支付 start
  441. $store = Store::findOne(['id' => $this->order->store_id]);
  442. $OrderYunst = new OrderYunst();
  443. $result2 = $OrderYunst->payYunst($this->order->store_id, $this->order->order_no, $store->cusid, $this->order->pay_price * 100);
  444. if ($result2['subCode'] == 'SUCCESS') {
  445. $payInfo = json_decode($result2['data']['payinfo'], true);
  446. if (!empty($payInfo)) {
  447. if (is_array($payInfo)) {
  448. return [
  449. 'code' => 0,
  450. 'data' => $payInfo,
  451. 'msg' => 'success',
  452. 'res' => $payInfo
  453. ];
  454. }
  455. return [
  456. 'code' => 1,
  457. 'msg' => $result2['data']['errmsg']
  458. ];
  459. }
  460. return [
  461. 'code' => 1,
  462. 'msg' => $result2['subMsg']
  463. ];
  464. }
  465. return $result2;
  466. //通联支付 end
  467. }
  468. if ($this->pay_type == 4) {
  469. $user = ($this->user ?: get_saas_user());
  470. if ($this->_from == self::PAY_FROM_MINI) {
  471. //TODO 兼容
  472. //AlipayUnion
  473. if (is_profit_pay('ali')) {
  474. $result = AlipayUnion::mini($this->order, $goods_names, $user, '', '', false, 0, $balance_price);
  475. } else {
  476. $result = Alipay::mini($this->order, $goods_names, $user, '', '', 0, $balance_price);
  477. }
  478. if (isset($result['code']) && $result['code'] == 1) {
  479. return $result;
  480. }
  481. //$t->commit();
  482. return [
  483. 'code' => 0,
  484. 'msg' => 'success',
  485. 'data' => $result['data']['trade_no'],
  486. 'body' => $goods_names
  487. ];
  488. } else {
  489. if (is_profit_pay('ali')) {
  490. $result = AlipayProfit::app($this->order, $goods_names, $this->user, $balance_price);
  491. } else {
  492. $result = Alipay::app($this->order, $goods_names, $this->user, $balance_price);
  493. }
  494. if (isset($result['code']) && $result['code'] == 1) {
  495. //$t->commit();
  496. return $result;
  497. }
  498. //$t->commit();
  499. return [
  500. 'code' => 0,
  501. 'msg' => 'success',
  502. 'data' => $result['data'],
  503. 'body' => $goods_names
  504. ];
  505. }
  506. }
  507. // // 抖音小程序
  508. // if ($this->pay_type == 5) {
  509. // $result = ByteDance::pay($this->order, '', $goods_names, 0 , $balance_price);
  510. // if (isset($result['code']) && $result['code'] == 1) {
  511. // return $result;
  512. // }
  513. // //$t->commit();
  514. // return [
  515. // 'code' => 0,
  516. // 'msg' => 'success',
  517. // 'data' => $result['data'],
  518. // ];
  519. // }
  520. }
  521. // //货到付款和余额支付数据处理
  522. // if ($this->pay_type == 2 || $this->pay_type == 3) {
  523. // $order = $this->order;
  524. // // 中间页选择货到付款,需要存入支付类型
  525. // if ($this->pay_type == 2) {
  526. // $order->is_pay = 0;
  527. // $order->pay_type = 2;
  528. // $order->save();
  529. // }
  530. // // //余额支付 用户余额变动
  531. // // if ($this->pay_type == 3) {
  532. // // $user = User::findOne(['id' => $order->user_id]);
  533. // // if ($user->money < $order->pay_price) {
  534. // // $t->rollBack();
  535. // // return [
  536. // // 'code' => 1,
  537. // // 'msg' => '支付失败,余额不足',
  538. // // ];
  539. // // }
  540. // // // $user->money -= floatval($order->pay_price);
  541. // // $res = AccountLog::saveLog($user->id, floatval($order->pay_price), AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_EXPEND, 1, $order->id, "商城余额支付,订单号为:{$order->order_no}。");
  542. // // if (!$res) {
  543. // // $t->rollBack();
  544. // // return [
  545. // // 'code' => 1,
  546. // // 'msg' => '支付失败'
  547. // // ];
  548. // // }
  549. // // $order->is_pay = 1;
  550. // // $order->pay_type = 3;
  551. // // $order->trade_status = Order::ORDER_FLOW_NO_SEND;
  552. // // $order->pay_time = time();
  553. // // if ($order->user_id != get_user_id()) {
  554. // // $order->pay_user_id = get_user_id();
  555. // // }
  556. // // if (!$order->save()) {
  557. // // $t->rollBack();
  558. // // return [
  559. // // 'code' => 1,
  560. // // 'msg' => '支付失败'
  561. // // ];
  562. // // }
  563. // // }
  564. // // 同城配送订单下单
  565. // if ($order->is_delivery == 1) {
  566. // $detail_goods = OrderDetail::find()->where(['order_id' => $order->id])->select('goods_name as name, pic, num, total_price as price')->asArray()->all();
  567. // Delivery::addOrder($detail_goods, $order->order_no);
  568. // }
  569. // // 支付完成后,相关操作
  570. // $form = new OrderComplete();
  571. // $form->order_id = $order->id;
  572. // $form->order_type = 0;
  573. // $form->store_id = $this->order->store_id;
  574. // $form->notify();
  575. // CloudPrint::doPrint($this->order->id, 0, $this->order->store_id);
  576. // //$t->commit();
  577. // return [
  578. // 'code' => 0,
  579. // 'msg' => '支付成功',
  580. // 'data' => ''
  581. // ];
  582. // }
  583. }
  584. }
  585. /**
  586. * 设置佣金
  587. * @param Order $order
  588. * @return mixed
  589. */
  590. private function setReturnData($order)
  591. {
  592. $form = new ShareMoneyForm();
  593. $form->order = $order;
  594. $form->order_type = 0;
  595. return $form->setData();
  596. }
  597. /**
  598. * @param Order $PtActivityOrder
  599. * @throws \Exception
  600. * 检查限购
  601. */
  602. private function checkGoodsConfine($order)
  603. {
  604. $saas_user = get_saas_user();
  605. $user = User::findOne(['binding'=>$saas_user->mobile,'store_id'=>get_store_id(),'is_delete'=>0]);
  606. foreach ($order->detail as $detail) {
  607. /* @var Goods $goods*/
  608. /* @var OrderDetail $detail*/
  609. $goods = $detail->goods;
  610. if ($goods->confine_count && $goods->confine_count > 0) {
  611. $goodsNum = Goods::getBuyNum($user, $goods->id);
  612. if ($goodsNum) {
  613. } else {
  614. $goodsNum = 0;
  615. }
  616. $goodsTotalNum = intval($goodsNum + $detail->num);
  617. if ($goodsTotalNum > $goods->confine_count) {
  618. throw new \Exception('商品:' . $goods->name . ' 超出购买数量', 1);
  619. }
  620. }
  621. //起订数量
  622. if (($goods['order_min_count'] && $goods['order_min_count'] > 0)) {
  623. if ($detail->num < $goods['order_min_count']) {
  624. throw new \Exception('商品:' . $goods->name . ' 起订数量' . $goods['order_min_count'], 1);
  625. }
  626. }
  627. }
  628. }
  629. /**
  630. * @param Goods $goods
  631. * @param OrderDetail $detail
  632. * @param Order $order
  633. */
  634. private function bookCheckGoodsNum($goods, $detail, $order) {
  635. // 判断时间
  636. if (time() - $order->created_at > 15 * 60) {
  637. return [
  638. 'code' => 1,
  639. 'msg' => '订单已过支付时间,将自动取消'
  640. ];
  641. }
  642. $attr = Json::decode($detail->attr);
  643. // 酒店预约
  644. if ($order->order_type == 1) {
  645. // $date_book = GoodsBook::findOne(['goods_id' => $goods->id])->date_book;
  646. // $date_book = Json::decode($date_book);
  647. // if (!$date_book) {
  648. // return [
  649. // 'code' => 1,
  650. // 'msg' => '数据异常'
  651. // ];
  652. // }
  653. // $data_config = array_combine(array_column($date_book, 'date'), array_column($date_book, 'num'));
  654. // foreach ($attr as $value) {
  655. // if (isset($data_config[$value['date']])) {
  656. // if ($data_config[$value['date']] < $detail->num) {
  657. // return [
  658. // 'code' => 1,
  659. // 'msg' => '选中日期' . $value['date'] . '内暂无房源'
  660. // ];
  661. // }
  662. // } else {
  663. // return [
  664. // 'code' => 1,
  665. // 'msg' => '未找到预约时间下相关商品数据'
  666. // ];
  667. // }
  668. // }
  669. }
  670. // 服务预约
  671. if ($order->order_type == 2) {
  672. $service_book = GoodsBook::findOne(['goods_id' => $goods->id])->service_book;
  673. $service_book = Json::decode($service_book);
  674. if (!$service_book) {
  675. return [
  676. 'code' => 1,
  677. 'msg' => '数据异常'
  678. ];
  679. }
  680. $date_data = $this->getDateByInterval(7);
  681. $count = 0;
  682. $new_arr = [
  683. 'data' => []
  684. ];
  685. $order = Order::find()->alias('o')
  686. ->leftJoin(['od' => OrderDetail::tableName()], 'o.id = od.order_id')
  687. ->where(['o.trade_status' => [0, 2, 3], 'o.is_delete' => 0, 'o.order_type' => 2, 'goods_id' => $goods['id']])
  688. ->andWhere(['>', 'o.created_at', strtotime(date("Y-m-d"))])
  689. ->select('od.attr, od.num')->asArray()->all();
  690. foreach ($date_data as $index => $datum) {
  691. $new_arr['data'][$index]['date'] = $datum;
  692. $new_arr['data'][$index]['time'] = $service_book['data'][0]['time'];
  693. }
  694. if (!$new_arr) {
  695. return [
  696. 'code' => 1,
  697. 'msg' => '数据异常'
  698. ];
  699. }
  700. $service_book = $new_arr['data'];
  701. $service_book_date = array_column($service_book, NULL, 'date');
  702. $service_book_time = $service_book_date[$attr['date']]['time'];
  703. $num = 0;
  704. $is = false;
  705. foreach ($order as $item) {
  706. $item['attr'] = json_decode($item['attr'], true);
  707. if ($item['attr']['date'] === $attr['date']) {
  708. if ($attr['time'] == $item['attr']['time']) {
  709. $num += $item['num'];
  710. }
  711. }
  712. }
  713. foreach ($service_book_time as $m) {
  714. foreach ($m['times'] as $n) {
  715. $is = true;
  716. if ($n['time'] == $attr['time']) {
  717. if (($detail->num + $num) > $n['num']) {
  718. return [
  719. 'code' => 1,
  720. 'msg' => $n['time'] . '时间段内暂不可预约'
  721. ];
  722. }
  723. }
  724. }
  725. }
  726. if ($is === false) {
  727. return [
  728. 'code' => 1,
  729. 'msg' => '未找到预约时间下相关商品数据'
  730. ];
  731. }
  732. }
  733. return [
  734. 'code' => 0,
  735. 'msg' => 'success'
  736. ];
  737. }
  738. public function getDateByInterval(int $num) :array
  739. {
  740. //var_dump($st, $et);die;
  741. $returnData = [];
  742. $i = 0;
  743. do {
  744. $temp = date('Y-m-d', strtotime('+' . $i . ' day', strtotime(date('Y-m-d'))));
  745. $returnData[] = $temp;
  746. $i++;
  747. } while ($i < $num);
  748. return $returnData;
  749. }
  750. }