PresaleOrderCommon.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\presale\model;
  11. use app\model\BaseModel;
  12. use app\model\order\Order;
  13. use app\model\order\OrderCommon;
  14. use app\model\system\Cron;
  15. use app\model\order\Config;
  16. use addon\coupon\model\Coupon;
  17. use app\model\member\MemberAccount;
  18. use addon\store\model\StoreGoodsSku;
  19. use app\model\system\Pay;
  20. /**
  21. * 商品预售
  22. */
  23. class PresaleOrderCommon extends BaseModel
  24. {
  25. // 订单待付款
  26. const ORDER_CREATE = 0;
  27. //等待付尾款
  28. const WAIT_FINAL_PAY = 1;
  29. //订单完成(尾款已支付)
  30. const ORDER_PAY = 2;
  31. // 订单已关闭
  32. const ORDER_CLOSE = -1;
  33. /**
  34. * 基础订单状态(不同类型的订单可以不使用这些状态,但是不能冲突)
  35. * @var unknown
  36. */
  37. public $order_status = [
  38. self::ORDER_CREATE => [
  39. 'status' => self::ORDER_CREATE,
  40. 'name' => '待付款',
  41. 'is_allow_refund' => 0,
  42. 'icon' => 'public/uniapp/order/order-icon-send.png',
  43. 'action' => [
  44. [
  45. 'action' => 'orderClose',
  46. 'title' => '关闭订单',
  47. 'color' => ''
  48. ],
  49. [
  50. 'action' => 'offlinePayDeposit',
  51. 'title' => '线下支付定金',
  52. 'color' => ''
  53. ],
  54. ],
  55. 'member_action' => [
  56. [
  57. 'action' => 'orderClose',
  58. 'title' => '关闭订单',
  59. 'color' => ''
  60. ],
  61. [
  62. 'action' => 'orderPayDeposit',
  63. 'title' => '支付定金',
  64. 'color' => ''
  65. ],
  66. ],
  67. 'color' => ''
  68. ],
  69. self::WAIT_FINAL_PAY => [
  70. 'status' => self::WAIT_FINAL_PAY,
  71. 'name' => '待付尾款',
  72. 'is_allow_refund' => 0,
  73. 'icon' => 'public/uniapp/order/order-icon-send.png',
  74. 'action' => [
  75. [
  76. 'action' => 'offlinePayFinal',
  77. 'title' => '线下支付尾款',
  78. 'color' => ''
  79. ],
  80. ],
  81. 'member_action' => [
  82. [
  83. 'action' => 'refundDeposit',
  84. 'title' => '退定金',
  85. 'color' => ''
  86. ],
  87. [
  88. 'action' => 'orderPayFinal',
  89. 'title' => '支付尾款',
  90. 'color' => ''
  91. ],
  92. ],
  93. 'color' => ''
  94. ],
  95. self::ORDER_PAY => [
  96. 'status' => self::ORDER_PAY,
  97. 'name' => '已完成',
  98. 'is_allow_refund' => 0,
  99. 'icon' => 'public/uniapp/order/order-icon-send.png',
  100. 'action' => [],
  101. 'member_action' => [],
  102. 'color' => ''
  103. ],
  104. self::ORDER_CLOSE => [
  105. 'status' => self::ORDER_CLOSE,
  106. 'name' => '已关闭',
  107. 'is_allow_refund' => 0,
  108. 'icon' => 'public/uniapp/order/order-icon-close.png',
  109. 'action' => [
  110. [
  111. 'action' => 'deleteOrder',
  112. 'title' => '删除订单',
  113. 'color' => ''
  114. ],
  115. ],
  116. 'member_action' => [
  117. [
  118. 'action' => 'deleteOrder',
  119. 'title' => '删除订单',
  120. 'color' => ''
  121. ],
  122. ],
  123. 'color' => ''
  124. ],
  125. ];
  126. /**
  127. * 订单状态
  128. * @return array
  129. */
  130. public function getOrderStatus()
  131. {
  132. return $this->success($this->order_status);
  133. }
  134. /*********************************************** 订单关闭 start *****************************************************************/
  135. /**
  136. * 订单关闭
  137. * @param array $condition
  138. */
  139. public function depositOrderClose($condition = [])
  140. {
  141. $info = model('promotion_presale_order')->getInfo($condition, 'id,order_status');
  142. if (empty($info)) {
  143. return $this->error('', '订单不存在');
  144. }
  145. if ($info[ 'order_status' ] == self::ORDER_CLOSE) {
  146. return $this->error('', '该订单已关闭');
  147. }
  148. if ($info[ 'order_status' ] != self::ORDER_CREATE) {
  149. return $this->error('', '该订单已支付或已完成');
  150. }
  151. $res = $this->cronDepositOrderClose($info[ 'id' ]);
  152. return $res;
  153. }
  154. /**
  155. * 添加定金订单自动关闭
  156. */
  157. public function addDepositOrderCronClose($order_id, $site_id)
  158. {
  159. //计算订单自动关闭时间
  160. $config_model = new Config();
  161. $order_config_result = $config_model->getOrderEventTimeConfig($site_id);
  162. $order_config = $order_config_result[ "data" ];
  163. $now_time = time();
  164. if (!empty($order_config)) {
  165. $execute_time = $now_time + $order_config[ "value" ][ "auto_close" ] * 60; //自动关闭时间
  166. } else {
  167. $execute_time = $now_time + 3600; //尚未配置 默认一天
  168. }
  169. $cron_model = new Cron();
  170. $cron_model->addCron(1, 0, "预售订单自动关闭", "CronDepositOrderClose", $execute_time, $order_id);
  171. }
  172. /**
  173. * 添加尾款支付到期自动退定金操作
  174. */
  175. public function addRefundOrderCronClose($order_id, $site_id, $time)
  176. {
  177. //计算订单自动关闭时间
  178. // $config_model = new Config();
  179. // $order_config_result = $config_model->getOrderEventTimeConfig($site_id);
  180. // $order_config = $order_config_result["data"];
  181. // $now_time = time();
  182. // if (!empty($order_config)) {
  183. // $execute_time = $now_time + $order_config["value"]["auto_close"] * 60; //自动关闭时间
  184. // } else {
  185. // $execute_time = $now_time + 3600; //尚未配置 默认一天
  186. // }
  187. $cron_model = new Cron();
  188. $cron_model->addCron(1, 0, "预售订单尾款支付到期退定金", "CronRefundOrderDepositClose", $time, $order_id);
  189. }
  190. /**
  191. * 自动关闭定金订单
  192. * @param $order_id
  193. * @return array
  194. */
  195. public function cronDepositOrderClose($order_id)
  196. {
  197. $order_info = model('promotion_presale_order')->getInfo([ [ 'id', '=', $order_id ] ]);
  198. if (empty($order_info)) {
  199. return $this->error('', '订单不存在');
  200. }
  201. //订单已关闭
  202. if ($order_info[ 'order_status' ] == self::ORDER_CLOSE) {
  203. return $this->success();
  204. }
  205. if ($order_info[ 'order_status' ] != self::ORDER_CREATE) {
  206. return $this->success();
  207. }
  208. model('promotion_presale_order')->startTrans();
  209. try {
  210. //修改订单状态
  211. $data = [
  212. 'order_status' => self::ORDER_CLOSE,
  213. 'order_status_name' => $this->order_status[ self::ORDER_CLOSE ][ "name" ],
  214. 'order_status_action' => json_encode($this->order_status[ self::ORDER_CLOSE ], JSON_UNESCAPED_UNICODE),
  215. 'close_time' => time(),
  216. ];
  217. model('promotion_presale_order')->update($data, [ [ 'id', '=', $order_id ] ]);
  218. //增加库存
  219. // model('promotion_presale')->setInc([['presale_id','=',$order_info['presale_id']]],'presale_stock',$order_info['num']);
  220. //返还sku库存 2021.06.10
  221. model('promotion_presale_goods')->setInc([ [ 'presale_id', '=', $order_info[ 'presale_id' ] ], [ 'sku_id', '=', $order_info[ 'sku_id' ] ] ], 'presale_stock', $order_info[ 'num' ]);
  222. //增加门店库存
  223. if ($order_info[ 'delivery_store_id' ] > 0) {
  224. $store_data = [
  225. 'delivery_store_id' => $order_info[ 'delivery_store_id' ],
  226. 'num' => $order_info[ 'num' ],
  227. 'sku_id' => $order_info[ 'sku_id' ]
  228. ];
  229. $store_result = $this->incStoreGoodsStock($store_data);
  230. if ($store_result[ 'code' ] < 0) {
  231. return $store_result;
  232. }
  233. }
  234. //返还店铺优惠券
  235. $coupon_id = $order_info[ "coupon_id" ];
  236. if ($coupon_id > 0) {
  237. $coupon_model = new Coupon();
  238. $coupon_model->refundCoupon($coupon_id, $order_info[ "member_id" ]);
  239. }
  240. //平台优惠券
  241. //平台余额 退还余额
  242. if ($order_info[ "balance_deposit_money" ] > 0) {
  243. $member_account_model = new MemberAccount();
  244. $member_account_model->addMemberAccount($order_info[ 'site_id' ], $order_info[ "member_id" ], "balance", $order_info[ "balance_deposit_money" ], "presale_deposit_refund", "余额返还", "订单关闭返还");
  245. }
  246. model('promotion_presale_order')->commit();
  247. return $this->success();
  248. } catch (\Exception $e) {
  249. model('promotion_presale_order')->rollback();
  250. return $this->error('', $e->getMessage());
  251. }
  252. }
  253. /**
  254. * 订单尾款结束自动退款
  255. * @param $order_id
  256. * @return array
  257. */
  258. public function cronRefundOrderDepositClose($order_id)
  259. {
  260. $order_info = model('promotion_presale_order')->getInfo([ [ 'id', '=', $order_id ] ]);
  261. if (empty($order_info)) {
  262. return $this->error('', '订单不存在');
  263. }
  264. //订单已关闭
  265. if ($order_info[ 'order_status' ] == self::ORDER_CLOSE) {
  266. return $this->success();
  267. }
  268. if ($order_info[ 'order_status' ] != self::WAIT_FINAL_PAY) {
  269. return $this->success();
  270. }
  271. model('promotion_presale_order')->startTrans();
  272. try {
  273. //修改订单状态
  274. $data = [
  275. 'order_status' => self::ORDER_CLOSE,
  276. 'order_status_name' => $this->order_status[ self::ORDER_CLOSE ][ "name" ],
  277. 'order_status_action' => json_encode($this->order_status[ self::ORDER_CLOSE ], JSON_UNESCAPED_UNICODE),
  278. 'close_time' => time(),
  279. ];
  280. model('promotion_presale_order')->update($data, [ [ 'id', '=', $order_id ] ]);
  281. //增加库存
  282. // model('promotion_presale')->setInc([['presale_id','=',$order_info['presale_id']]],'presale_stock',$order_info['num']);
  283. //返还sku库存 2021.06.10
  284. model('promotion_presale_goods')->setInc([ [ 'presale_id', '=', $order_info[ 'presale_id' ] ], [ 'sku_id', '=', $order_info[ 'sku_id' ] ] ], 'presale_stock', $order_info[ 'num' ]);
  285. //增加门店库存
  286. if ($order_info[ 'delivery_store_id' ] > 0) {
  287. $store_data = [
  288. 'delivery_store_id' => $order_info[ 'delivery_store_id' ],
  289. 'num' => $order_info[ 'num' ],
  290. 'sku_id' => $order_info[ 'sku_id' ]
  291. ];
  292. $store_result = $this->incStoreGoodsStock($store_data);
  293. if ($store_result[ 'code' ] < 0) {
  294. return $store_result;
  295. }
  296. }
  297. //返还店铺优惠券
  298. $coupon_id = $order_info[ "coupon_id" ];
  299. if ($coupon_id > 0) {
  300. $coupon_model = new Coupon();
  301. $coupon_model->refundCoupon($coupon_id, $order_info[ "member_id" ]);
  302. }
  303. //平台优惠券
  304. //平台余额 退还余额
  305. if ($order_info[ "balance_deposit_money" ] > 0) {
  306. $member_account_model = new MemberAccount();
  307. $member_account_model->addMemberAccount($order_info[ 'site_id' ], $order_info[ "member_id" ], "balance", $order_info[ "balance_deposit_money" ], "presale_deposit_refund", "余额返还", "订单关闭返还");
  308. }
  309. model('promotion_presale_order')->commit();
  310. return $this->success();
  311. } catch (\Exception $e) {
  312. model('promotion_presale_order')->rollback();
  313. return $this->error('', $e->getMessage());
  314. }
  315. }
  316. /**
  317. * 订单关闭增加门店商品库存
  318. * @param $data
  319. * @return array
  320. */
  321. public function incStoreGoodsStock($data)
  322. {
  323. $store_goods_sku_model = new StoreGoodsSku();
  324. $stock_result = $store_goods_sku_model->incStock([ "store_id" => $data[ "delivery_store_id" ], "sku_id" => $data[ "sku_id" ], "stock" => $data[ "num" ] ]);
  325. if ($stock_result[ "code" ] < 0) {
  326. return $stock_result;
  327. }
  328. }
  329. /*********************************************** 订单关闭 end ******************************************************/
  330. /********************************************** 订单线下支付 start *************************************************/
  331. /**
  332. * 线下支付定金
  333. * @param $order_id
  334. * @param $site_id
  335. * @return array
  336. */
  337. public function offlinePayDeposit($order_id, $site_id)
  338. {
  339. $order_info = model("promotion_presale_order")->getInfo(
  340. [ [ 'id', '=', $order_id ], [ 'site_id', '=', $site_id ] ],
  341. 'deposit_out_trade_no,order_status'
  342. );
  343. if (empty($order_info)) {
  344. return $this->error('', '订单不存在');
  345. }
  346. if ($order_info[ 'order_status' ] != self::ORDER_CREATE) {
  347. return $this->error('', '订单已经支付或已经关闭');
  348. }
  349. $pay_model = new Pay();
  350. $result = $pay_model->onlinePay($order_info[ 'deposit_out_trade_no' ], "OFFLINE_PAY", '', '');
  351. if ($result[ "code" ] < 0) {
  352. return $result;
  353. }
  354. }
  355. /**
  356. * 线下支付尾款
  357. * @param $order_id
  358. * @param $site_id
  359. * @return array
  360. */
  361. public function offlinePayFinal($order_id, $site_id)
  362. {
  363. $order_info = model("promotion_presale_order")->getInfo(
  364. [ [ 'id', '=', $order_id ], [ 'site_id', '=', $site_id ] ],
  365. 'final_out_trade_no,order_status,pay_start_time,pay_end_time'
  366. );
  367. if (empty($order_info)) {
  368. return $this->error('', '订单不存在');
  369. }
  370. if ($order_info[ 'order_status' ] != self::WAIT_FINAL_PAY) {
  371. return $this->error('', '订单已经支付或已经关闭');
  372. }
  373. // if ($order_info['pay_start_time'] > time() || $order_info['pay_end_time'] < time()){
  374. // return $this->error('','未在尾款支付时间');
  375. // }
  376. if (!( $order_info[ 'pay_start_time' ] < time() && time() < $order_info[ 'pay_end_time' ] )) {
  377. return $this->error('', '未在尾款支付时间');
  378. }
  379. if (empty($order_info[ 'final_out_trade_no' ])) {
  380. $pay = new Pay();
  381. $out_trade_no = $pay->createOutTradeNo();
  382. model('promotion_presale_order')->startTrans();
  383. try {
  384. model('promotion_presale_order')->update(
  385. [ 'final_out_trade_no' => $out_trade_no ],
  386. [ [ 'id', '=', $order_id ], [ 'site_id', '=', $site_id ] ]
  387. );
  388. //将预售订单信息添加到普通订单中
  389. $res = $this->finalOrderOnlinePay([ 'out_trade_no' => $out_trade_no, 'pay_type' => 'OFFLINE_PAY' ]);
  390. if ($res[ 'code' ] < 0) {
  391. model('promotion_presale_order')->rollback();
  392. return $res;
  393. }
  394. model('promotion_presale_order')->commit();
  395. return $this->success();
  396. } catch (\Exception $e) {
  397. model('promotion_presale_order')->rollback();
  398. return $this->error('', $e->getMessage());
  399. }
  400. } else {
  401. $pay_model = new Pay();
  402. $result = $pay_model->onlinePay($order_info[ 'final_out_trade_no' ], "OFFLINE_PAY", '', '');
  403. if ($result[ "code" ] < 0) {
  404. return $result;
  405. }
  406. }
  407. }
  408. /********************************************** 订单线下支付 end ***************************************************/
  409. /*********************************************** 订单异步回调 start ************************************************/
  410. /**
  411. * 定金订单线上支付回调
  412. * @param $data
  413. * @return array
  414. */
  415. public function depositOrderOnlinePay($data)
  416. {
  417. $out_trade_no = $data[ "out_trade_no" ];
  418. $order_info = model("promotion_presale_order")->getInfo([ [ 'deposit_out_trade_no', '=', $out_trade_no ] ]);
  419. if ($order_info[ 'order_status' ] != self::ORDER_CREATE) {
  420. return $this->success();
  421. }
  422. $order_model = new Order();
  423. $pay_type_list = $order_model->getPayType();
  424. model('promotion_presale_order')->startTrans();
  425. try {
  426. //获取预售活动信息
  427. $presale_info = model('promotion_presale')->getInfo([ [ 'presale_id', '=', $order_info[ 'presale_id' ] ] ], 'deliver_type,deliver_time');
  428. if ($presale_info[ 'deliver_type' ] == 0) {
  429. $predict_delivery_time = $presale_info[ 'deliver_time' ];
  430. } else {
  431. $predict_delivery_time = strtotime('+' . $presale_info[ 'deliver_time' ] . 'days');
  432. }
  433. //修改订单状态
  434. $order_data = [
  435. 'order_status' => self::WAIT_FINAL_PAY,
  436. 'order_status_name' => $this->order_status[ self::WAIT_FINAL_PAY ][ "name" ],
  437. 'order_status_action' => json_encode($this->order_status[ self::WAIT_FINAL_PAY ], JSON_UNESCAPED_UNICODE),
  438. 'pay_deposit_time' => time(),
  439. 'deposit_pay_type' => $data[ 'pay_type' ],
  440. 'deposit_pay_type_name' => $pay_type_list[ $data[ 'pay_type' ] ],
  441. 'predict_delivery_time' => $predict_delivery_time
  442. ];
  443. model("promotion_presale_order")->update($order_data, [ [ 'id', '=', $order_info[ 'id' ] ] ]);
  444. if ($order_info[ 'final_money' ] == 0) {
  445. // $this->finalOrderOnlinePay(['out_trade_no' => $order_info['final_out_trade_no'], 'id' => $order_info['id'], 'pay_type' => $data['pay_type'] ]);
  446. }
  447. //增加销量
  448. model('promotion_presale')->setInc([ [ 'presale_id', '=', $order_info[ 'presale_id' ] ] ], 'sale_num', $order_info[ 'num' ]);
  449. model('promotion_presale_order')->commit();
  450. return $this->success();
  451. } catch (\Exception $e) {
  452. model('promotion_presale_order')->rollback();
  453. return $this->error('', $e->getMessage());
  454. }
  455. }
  456. /**
  457. * 尾款订单线上支付回调
  458. * @param $data
  459. * @return array
  460. */
  461. public function finalOrderOnlinePay($data)
  462. {
  463. if ($data[ "out_trade_no" ] == '' && isset($data[ 'id' ])) {
  464. $condition = [ [ 'id', '=', $data[ 'id' ] ] ];
  465. } else {
  466. $condition = [ [ 'final_out_trade_no', '=', $data[ "out_trade_no" ] ] ];
  467. }
  468. $order_info = model("promotion_presale_order")->getInfo($condition);
  469. if ($order_info[ 'order_status' ] != self::WAIT_FINAL_PAY) {
  470. return $this->success();
  471. }
  472. $order_model = new Order();
  473. $pay_type_list = $order_model->getPayType();
  474. model('promotion_presale_order')->startTrans();
  475. try {
  476. //修改预售订单状态
  477. $order_data = [
  478. 'order_status' => self::ORDER_PAY,
  479. 'order_status_name' => $this->order_status[ self::ORDER_PAY ][ "name" ],
  480. 'order_status_action' => json_encode($this->order_status[ self::ORDER_PAY ], JSON_UNESCAPED_UNICODE),
  481. 'pay_final_time' => time(),
  482. 'final_pay_type' => $data[ 'pay_type' ],
  483. 'final_pay_type_name' => $pay_type_list[ $data[ 'pay_type' ] ]
  484. ];
  485. model("promotion_presale_order")->update($order_data, [ [ 'id', '=', $order_info[ 'id' ] ] ]);
  486. //将预售订单信息添加到普通订单中
  487. $res = $this->presaleOrderToOrder($order_info);
  488. if ($res[ 'code' ] < 0) {
  489. model('promotion_presale_order')->rollback();
  490. return $res;
  491. }
  492. model('promotion_presale_order')->commit();
  493. return $this->success();
  494. } catch (\Exception $e) {
  495. model('promotion_presale_order')->rollback();
  496. return $this->error('', $e->getMessage());
  497. }
  498. }
  499. /**
  500. * 将预售订单信息添加到普通订单中
  501. * @param $presale_order
  502. * @return array
  503. */
  504. public function presaleOrderToOrder($presale_order)
  505. {
  506. model('order')->startTrans();
  507. model("order_log")->startTrans();
  508. try {
  509. //添加订单记录
  510. $order_data = [
  511. 'order_no' => $presale_order[ 'order_no' ],
  512. 'site_id' => $presale_order[ 'site_id' ],
  513. 'site_name' => $presale_order[ 'site_name' ],
  514. 'order_name' => $presale_order[ 'sku_name' ],
  515. 'order_from' => $presale_order[ 'order_from' ],
  516. 'order_from_name' => $presale_order[ 'order_from_name' ],
  517. 'order_type' => $presale_order[ 'order_type' ],
  518. 'order_type_name' => $presale_order[ 'order_type_name' ],
  519. 'out_trade_no' => $presale_order[ 'deposit_out_trade_no' ],
  520. 'out_trade_no_2' => $presale_order[ 'final_out_trade_no' ],
  521. 'pay_type' => $presale_order[ 'deposit_pay_type' ],
  522. 'pay_type_name' => $presale_order[ 'deposit_pay_type_name' ],
  523. 'delivery_type' => $presale_order[ 'delivery_type' ],
  524. 'delivery_type_name' => $presale_order[ 'delivery_type_name' ],
  525. 'member_id' => $presale_order[ 'member_id' ],
  526. 'name' => $presale_order[ 'name' ],
  527. 'mobile' => $presale_order[ 'mobile' ],
  528. 'telephone' => $presale_order[ 'telephone' ],
  529. 'province_id' => $presale_order[ 'province_id' ],
  530. 'city_id' => $presale_order[ 'city_id' ],
  531. 'district_id' => $presale_order[ 'district_id' ],
  532. 'community_id' => $presale_order[ 'community_id' ],
  533. 'address' => $presale_order[ 'address' ],
  534. 'full_address' => $presale_order[ 'full_address' ],
  535. 'longitude' => $presale_order[ 'longitude' ],
  536. 'latitude' => $presale_order[ 'latitude' ],
  537. 'buyer_ip' => $presale_order[ 'buyer_ip' ],
  538. 'buyer_ask_delivery_time' => $presale_order[ 'buyer_ask_delivery_time' ],
  539. 'buyer_message' => $presale_order[ 'buyer_message' ],
  540. 'goods_money' => $presale_order[ 'goods_money' ],
  541. 'delivery_money' => $presale_order[ 'delivery_money' ],
  542. 'promotion_money' => $presale_order[ 'promotion_money' ],
  543. 'coupon_id' => $presale_order[ 'coupon_id' ],
  544. 'coupon_money' => $presale_order[ 'coupon_money' ],
  545. 'invoice_money' => $presale_order[ 'invoice_money' ],
  546. 'order_money' => $presale_order[ 'order_money' ],
  547. 'balance_money' => $presale_order[ 'balance_deposit_money' ] + $presale_order[ 'balance_final_money' ],
  548. 'pay_money' => $presale_order[ 'pay_deposit_money' ] + $presale_order[ 'pay_final_money' ],//现金支付金额
  549. 'create_time' => $presale_order[ 'create_time' ],
  550. 'pay_time' => time(),
  551. 'goods_num' => $presale_order[ 'num' ],
  552. 'delivery_store_id' => $presale_order[ 'delivery_store_id' ],
  553. 'delivery_store_name' => $presale_order[ 'delivery_store_name' ],
  554. 'delivery_store_info' => $presale_order[ 'delivery_store_info' ],
  555. 'promotion_type' => 'presale',
  556. 'promotion_type_name' => '商品预售',
  557. 'promotion_status_name' => '已完成',
  558. 'is_invoice' => $presale_order[ 'is_invoice' ],
  559. 'invoice_type' => $presale_order[ 'invoice_type' ],
  560. 'invoice_title' => $presale_order[ 'invoice_title' ],
  561. 'taxpayer_number' => $presale_order[ 'taxpayer_number' ],
  562. 'invoice_rate' => $presale_order[ 'invoice_rate' ],
  563. 'invoice_content' => $presale_order[ 'invoice_content' ],
  564. 'invoice_delivery_money' => $presale_order[ 'invoice_delivery_money' ],
  565. 'invoice_full_address' => $presale_order[ 'invoice_full_address' ],
  566. 'is_tax_invoice' => $presale_order[ 'is_tax_invoice' ],
  567. 'invoice_email' => $presale_order[ 'invoice_email' ],
  568. 'invoice_title_type' => $presale_order[ 'invoice_title_type' ],
  569. 'is_fenxiao' => $presale_order[ 'is_fenxiao' ],
  570. 'predict_delivery_time' => $presale_order[ 'predict_delivery_time' ],//预计发货时间
  571. 'store_id' => $presale_order[ 'delivery_store_id' ]
  572. ];
  573. $order_id = model('order')->add($order_data);
  574. //添加订单商品项
  575. $order_goods_data = [
  576. 'order_id' => $order_id,
  577. 'order_no' => $presale_order[ 'order_no' ],
  578. 'site_id' => $presale_order[ 'site_id' ],
  579. 'member_id' => $presale_order[ 'member_id' ],
  580. 'goods_id' => $presale_order[ 'goods_id' ],
  581. 'sku_id' => $presale_order[ 'sku_id' ],
  582. 'sku_name' => $presale_order[ 'sku_name' ],
  583. 'sku_image' => $presale_order[ 'sku_image' ],
  584. 'sku_no' => $presale_order[ 'sku_no' ],
  585. 'is_virtual' => $presale_order[ 'is_virtual' ],
  586. 'goods_class' => $presale_order[ 'goods_class' ],
  587. 'goods_class_name' => $presale_order[ 'goods_class_name' ],
  588. 'price' => $presale_order[ 'price' ],
  589. 'cost_price' => $presale_order[ 'cost_price' ],
  590. 'num' => $presale_order[ 'num' ],
  591. 'goods_money' => $presale_order[ 'goods_money' ],
  592. 'cost_money' => $presale_order[ 'cost_price' ] * $presale_order[ 'num' ],
  593. 'real_goods_money' => $presale_order[ 'goods_money' ] - ( $presale_order[ 'presale_money' ] - $presale_order[ 'presale_deposit_money' ] ),
  594. 'promotion_money' => $presale_order[ 'promotion_money' ],
  595. 'coupon_money' => $presale_order[ 'coupon_money' ],
  596. 'goods_name' => $presale_order[ 'goods_name' ],
  597. 'sku_spec_format' => $presale_order[ 'sku_spec_format' ],
  598. 'is_fenxiao' => $presale_order[ 'is_fenxiao' ],
  599. 'delivery_status_name' => '未发货',
  600. 'delivery_status' => 0,
  601. 'create_time' => time(),
  602. 'store_id' => $presale_order[ 'delivery_store_id' ]
  603. ];
  604. model('order_goods')->add($order_goods_data);
  605. model('promotion_presale_order')->update([ 'relate_order_id' => $order_id ], [ [ 'id', '=', $presale_order[ 'id' ] ] ]);
  606. //调用线上支付
  607. $order_model = new OrderCommon();
  608. //记录订单日志 start
  609. //获取用户信息
  610. $member_info = model('member')->getInfo([ 'member_id' => $presale_order[ 'member_id' ] ], 'nickname');
  611. $buyer_name = empty($member_info[ 'nickname' ]) ? '' : '【' . $member_info[ 'nickname' ] . '】';
  612. $log_data = [
  613. 'order_id' => $order_id,
  614. 'action' => '买家' . $buyer_name . '下单了',
  615. 'uid' => $presale_order[ 'member_id' ],
  616. 'nick_name' => $member_info[ 'nickname' ],
  617. 'action_way' => 1,
  618. 'order_status' => 0,
  619. 'order_status_name' => '待支付'
  620. ];
  621. $order_model->addOrderLog($log_data);
  622. //记录订单日志 end
  623. $result = $order_model->orderOnlinePay([ 'out_trade_no' => $presale_order[ 'deposit_out_trade_no' ], 'pay_type' => $presale_order[ 'deposit_pay_type' ] ]);
  624. if ($result[ 'code' ] < 0) {
  625. model('order')->rollback();
  626. return $result;
  627. }
  628. model('order')->commit();
  629. model("order_log")->commit();
  630. return $this->success();
  631. } catch (\Exception $e) {
  632. model('order')->rollback();
  633. model("order_log")->rollback();
  634. return $this->error('', $e->getMessage());
  635. }
  636. }
  637. /*********************************************** 订单异步回调 end *****************************************************************/
  638. /**
  639. * 订单删除
  640. * @param $condition
  641. * @return array
  642. */
  643. public function deleteOrder($condition)
  644. {
  645. $info = model('promotion_presale_order')->getInfo($condition, 'order_status');
  646. if (empty($info)) {
  647. return $this->error('', '订单不存在');
  648. }
  649. if ($info[ 'order_status' ] != self::ORDER_CLOSE) {
  650. return $this->error('', '抱歉,只有已关闭的订单才可以删除');
  651. }
  652. $res = model('promotion_presale_order')->delete($condition);
  653. if ($res) {
  654. return $this->success($res);
  655. } else {
  656. return $this->error();
  657. }
  658. }
  659. /**
  660. * 获取定金/尾款支付流水号
  661. * @param $id
  662. * @param $member_id
  663. * @param $site_id
  664. * @return array
  665. */
  666. public function getPresaleOrderOutTradeNo($id, $member_id, $site_id)
  667. {
  668. //订单信息
  669. $order_info = model('promotion_presale_order')->getInfo(
  670. [
  671. [ 'id', '=', $id ],
  672. [ 'member_id', '=', $member_id ],
  673. [ 'site_id', '=', $site_id ]
  674. ],
  675. 'order_status,deposit_out_trade_no,final_out_trade_no'
  676. );
  677. if (empty($order_info)) {
  678. return $this->error('', '订单不存在');
  679. }
  680. //未支付定金
  681. if ($order_info[ 'order_status' ] == self::ORDER_CREATE) {
  682. return $this->success($order_info[ 'deposit_out_trade_no' ]);
  683. }
  684. if ($order_info[ 'order_status' ] == self::WAIT_FINAL_PAY) {
  685. return $this->success($order_info[ 'final_out_trade_no' ]);
  686. }
  687. return $this->error('', '请核实数据后重试');
  688. }
  689. /**
  690. * 订单关闭
  691. * @param array $condition
  692. */
  693. public function depositPresaleOrderClose($condition = [])
  694. {
  695. $list = model('promotion_presale_order')->getList($condition, 'id,order_status');
  696. if (empty($list)) {
  697. return $this->error('', '订单不存在');
  698. }
  699. foreach ($list as $key => $val) {
  700. if ($val[ 'order_status' ] != self::ORDER_CLOSE && $val[ 'order_status' ] != self::ORDER_CREATE) {
  701. $this->cronDepositOrderClose($val[ 'id' ]);
  702. }
  703. }
  704. }
  705. }