CloudStockAgentOrderService.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace addons\CloudStock\backend\services;
  3. use addons\CloudStock\common\enums\CloudStockEnum;
  4. use addons\CloudStock\common\models\CloudStockAgent;
  5. use addons\CloudStock\common\models\CloudStockAgentGoods;
  6. use addons\CloudStock\common\models\CloudStockAgentOrder;
  7. use addons\CloudStock\common\models\CloudStockAgentOrderDetails;
  8. use addons\CloudStock\common\models\CloudStockGoodsStockLog;
  9. use addons\CloudStock\common\models\CloudStockIncreaseDetail;
  10. use common\enums\RedisKeyEnum;
  11. use common\enums\StatusEnum;
  12. use common\helpers\LockHelper;
  13. use Exception;
  14. use RuntimeException;
  15. use Yii;
  16. class CloudStockAgentOrderService extends \addons\CloudStock\common\services\CloudStockAgentOrderService
  17. {
  18. public $admin_id;
  19. /**
  20. * 取消自提
  21. *
  22. * @param int $id
  23. *
  24. * @return bool
  25. * @throws Exception
  26. */
  27. public function cancelAgentOrder(int $id): bool
  28. {
  29. // 加锁
  30. $close_identification = uniqid();
  31. $close_lock_key = RedisKeyEnum::suffix('cloud_stock_cancel_agent_order' , $id);
  32. $t = Yii::$app->db->beginTransaction();
  33. try {
  34. if (!LockHelper::lock($close_lock_key, $close_identification, 30, 60)) {
  35. throw new Exception('正在关闭订单');
  36. }
  37. $order = CloudStockAgentOrder::find()
  38. ->where([
  39. 'id' => $id,
  40. 'send_status' => [CloudStockEnum::PICK_ORDER_STATUS0, CloudStockEnum::PICK_ORDER_STATUS3],
  41. 'status' => StatusEnum::ENABLED,
  42. 'mall_id' => $this->mall_id
  43. ])
  44. ->one();
  45. if (empty($order)) {
  46. throw new RuntimeException('自提订单异常');
  47. }
  48. $isCallRefund = $order->send_status == CloudStockEnum::PICK_ORDER_STATUS0;
  49. $details = CloudStockAgentOrderDetails::find()
  50. ->where(['status' => StatusEnum::ENABLED, 'order_id' => $order->id, 'mall_id' => $order->mall_id])
  51. ->select('num, goods_id')
  52. ->asArray()
  53. ->all();
  54. if (empty($details)) {
  55. throw new RuntimeException('自提订单异常');
  56. }
  57. foreach ($details as $detail) {
  58. $params_add = [
  59. 'goods_id' => $detail['goods_id'],
  60. 'changes_dir' => CloudStockEnum::STOCK_CHANGE_ADD,
  61. 'user_id' => $order['user_id'],
  62. 'order_id' => $order['id'],
  63. 'order_type' => 0,
  64. 'changes_type' => CloudStockEnum::CHANGE_TYPE_PICKOFFLINE_RETURN,
  65. 'num' => $detail['num'],
  66. 'status' => StatusEnum::ENABLED,
  67. ];
  68. $res_save_log = CloudStockGoodsStockLog::setData($this->mall_id, $params_add);
  69. if (false === $res_save_log) {
  70. throw new RuntimeException(CloudStockGoodsStockLog::getStaticError());
  71. }
  72. $add_params = [
  73. 'user_id' => $order['user_id'],
  74. 'num' => $detail['num'],
  75. 'mall_id' => $this->mall_id,
  76. 'goods_id' => $detail['goods_id'],
  77. 'order_id' => $order['id'],
  78. 'order_type' => 0,
  79. 'changes_type' => CloudStockEnum::CHANGE_TYPE_PICKOFFLINE_RETURN,
  80. 'stock_log_id' => $res_save_log->id,
  81. 'status' => StatusEnum::ENABLED,
  82. ];
  83. $res_add = CloudStockIncreaseDetail::setData($add_params);
  84. if (false === $res_add) {
  85. throw new RuntimeException(CloudStockIncreaseDetail::getStaticError());
  86. }
  87. $cloud_stock_agent_goods_model = CloudStockAgentGoods::findOne(['mall_id' => $order['mall_id'], 'user_id' => $order['user_id'], 'goods_id' => $detail['goods_id'], 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]);
  88. if (!empty($cloud_stock_agent_goods_model)) {
  89. $cloud_stock_agent_goods_model->num += $detail['num'];
  90. $res = $cloud_stock_agent_goods_model->save();
  91. if (!$res) {
  92. throw new RuntimeException($cloud_stock_agent_goods_model->getErrorMessage());
  93. }
  94. }
  95. $cloud_stock_agent_model = CloudStockAgent::findOne(['mall_id' => $order['mall_id'], 'user_id' => $order['user_id'], 'status' => StatusEnum::ENABLED]);
  96. if (!empty($cloud_stock_agent_model)) {
  97. $cloud_stock_agent_model->stock += $detail['num'];
  98. $res = $cloud_stock_agent_model->save();
  99. if (!$res) {
  100. throw new RuntimeException($cloud_stock_agent_model->getErrorMessage());
  101. }
  102. }
  103. $order->cancel_admin_id = $this->admin_id;
  104. $order->send_status = CloudStockEnum::PICK_ORDER_STATUS4;
  105. if (!$order->save()) {
  106. throw new RuntimeException($order->getErrorMessage());
  107. }
  108. }
  109. $t->commit();
  110. } catch (Exception $e) {
  111. $t->rollBack();
  112. $this->setError($e->getMessage());
  113. return false;
  114. } finally {
  115. LockHelper::uLock($close_lock_key, $close_identification);
  116. }
  117. if (!$isCallRefund) {
  118. return true;
  119. }
  120. // 执行退款
  121. return $this->shippingRefunds($order);
  122. }
  123. }