Order.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. /**
  3. *
  4. * @copyright ©2020 点小铺
  5. * @author hanj
  6. * @link: https://dyuit.com
  7. * Created by VSCode
  8. */
  9. namespace app\task\service;
  10. use app\common\service\Basics;
  11. use app\task\model\Order as OrderModel;
  12. use app\task\model\UserCoupon as UserCouponModel;
  13. use app\common\library\helper;
  14. use app\common\service\goods\source\Factory as FactoryStock;
  15. class Order extends Basics
  16. {
  17. /* @var \app\task\model\Order $model */
  18. private $model;
  19. // 自动关闭的订单id集
  20. private $closeOrderIds = [];
  21. /**
  22. * 构造方法
  23. * Order constructor.
  24. */
  25. public function __construct()
  26. {
  27. $this->model = new OrderModel;
  28. }
  29. /**
  30. * 未支付订单自动关闭
  31. * @param int $deadlineTime
  32. * @param array $where
  33. * @return bool
  34. * @throws \think\db\exception\DataNotFoundException
  35. * @throws \think\db\exception\ModelNotFoundException
  36. * @throws \think\exception\DbException
  37. * @throws \Exception
  38. */
  39. public function close($deadlineTime, $where = [])
  40. {
  41. // 条件
  42. $filter = array_merge($where, [
  43. 'pay_status' => 10,
  44. 'order_status' => 10,
  45. 'create_time' => ['<=', $deadlineTime]
  46. ]);
  47. // 查询截止时间未支付的订单
  48. $list = $this->model->getList($filter, ['goods', 'user']);
  49. $this->closeOrderIds = helper::getArrayColumn($list, 'order_id');
  50. // 取消订单事件
  51. if (!empty($this->closeOrderIds)) {
  52. foreach ($list as &$order) {
  53. // 回退商品库存
  54. FactoryStock::getFactory($order['order_source'])->backGoodsStock($order['goods'], false);
  55. // 回退用户优惠券
  56. $order['coupon_id'] > 0 && UserCouponModel::setIsUse($order['coupon_id'], false);
  57. // 回退用户积分
  58. $describe = "订单取消:{$order['order_no']}";
  59. $order['points_num'] > 0 && $order->user->setIncPoints($order['points_num'], $describe);
  60. }
  61. // 批量更新订单状态为已取消
  62. return $this->model->onBatchUpdate($this->closeOrderIds, ['order_status' => 20]);
  63. }
  64. return true;
  65. }
  66. /**
  67. * 获取自动关闭的订单id集
  68. * @return array
  69. */
  70. public function getCloseOrderIds()
  71. {
  72. return $this->closeOrderIds;
  73. }
  74. }