Order.php 2.2 KB

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