| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- <?php
- namespace addons\CloudStock\backend\services;
- use addons\CloudStock\common\enums\CloudStockEnum;
- use addons\CloudStock\common\models\CloudStockAgent;
- use addons\CloudStock\common\models\CloudStockAgentGoods;
- use addons\CloudStock\common\models\CloudStockAgentOrder;
- use addons\CloudStock\common\models\CloudStockAgentOrderDetails;
- use addons\CloudStock\common\models\CloudStockGoodsStockLog;
- use addons\CloudStock\common\models\CloudStockIncreaseDetail;
- use common\enums\RedisKeyEnum;
- use common\enums\StatusEnum;
- use common\helpers\LockHelper;
- use Exception;
- use RuntimeException;
- use Yii;
- class CloudStockAgentOrderService extends \addons\CloudStock\common\services\CloudStockAgentOrderService
- {
- public $admin_id;
- /**
- * 取消自提
- *
- * @param int $id
- *
- * @return bool
- * @throws Exception
- */
- public function cancelAgentOrder(int $id): bool
- {
- // 加锁
- $close_identification = uniqid();
- $close_lock_key = RedisKeyEnum::suffix('cloud_stock_cancel_agent_order' , $id);
- $t = Yii::$app->db->beginTransaction();
- try {
- if (!LockHelper::lock($close_lock_key, $close_identification, 30, 60)) {
- throw new Exception('正在关闭订单');
- }
- $order = CloudStockAgentOrder::find()
- ->where([
- 'id' => $id,
- 'send_status' => [CloudStockEnum::PICK_ORDER_STATUS0, CloudStockEnum::PICK_ORDER_STATUS3],
- 'status' => StatusEnum::ENABLED,
- 'mall_id' => $this->mall_id
- ])
- ->one();
- if (empty($order)) {
- throw new RuntimeException('自提订单异常');
- }
- $isCallRefund = $order->send_status == CloudStockEnum::PICK_ORDER_STATUS0;
- $details = CloudStockAgentOrderDetails::find()
- ->where(['status' => StatusEnum::ENABLED, 'order_id' => $order->id, 'mall_id' => $order->mall_id])
- ->select('num, goods_id')
- ->asArray()
- ->all();
- if (empty($details)) {
- throw new RuntimeException('自提订单异常');
- }
- foreach ($details as $detail) {
- $params_add = [
- 'goods_id' => $detail['goods_id'],
- 'changes_dir' => CloudStockEnum::STOCK_CHANGE_ADD,
- 'user_id' => $order['user_id'],
- 'order_id' => $order['id'],
- 'order_type' => 0,
- 'changes_type' => CloudStockEnum::CHANGE_TYPE_PICKOFFLINE_RETURN,
- 'num' => $detail['num'],
- 'status' => StatusEnum::ENABLED,
- ];
- $res_save_log = CloudStockGoodsStockLog::setData($this->mall_id, $params_add);
- if (false === $res_save_log) {
- throw new RuntimeException(CloudStockGoodsStockLog::getStaticError());
- }
- $add_params = [
- 'user_id' => $order['user_id'],
- 'num' => $detail['num'],
- 'mall_id' => $this->mall_id,
- 'goods_id' => $detail['goods_id'],
- 'order_id' => $order['id'],
- 'order_type' => 0,
- 'changes_type' => CloudStockEnum::CHANGE_TYPE_PICKOFFLINE_RETURN,
- 'stock_log_id' => $res_save_log->id,
- 'status' => StatusEnum::ENABLED,
- ];
- $res_add = CloudStockIncreaseDetail::setData($add_params);
- if (false === $res_add) {
- throw new RuntimeException(CloudStockIncreaseDetail::getStaticError());
- }
- $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]]);
- if (!empty($cloud_stock_agent_goods_model)) {
- $cloud_stock_agent_goods_model->num += $detail['num'];
- $res = $cloud_stock_agent_goods_model->save();
- if (!$res) {
- throw new RuntimeException($cloud_stock_agent_goods_model->getErrorMessage());
- }
- }
- $cloud_stock_agent_model = CloudStockAgent::findOne(['mall_id' => $order['mall_id'], 'user_id' => $order['user_id'], 'status' => StatusEnum::ENABLED]);
- if (!empty($cloud_stock_agent_model)) {
- $cloud_stock_agent_model->stock += $detail['num'];
- $res = $cloud_stock_agent_model->save();
- if (!$res) {
- throw new RuntimeException($cloud_stock_agent_model->getErrorMessage());
- }
- }
- $order->cancel_admin_id = $this->admin_id;
- $order->send_status = CloudStockEnum::PICK_ORDER_STATUS4;
- if (!$order->save()) {
- throw new RuntimeException($order->getErrorMessage());
- }
- }
- $t->commit();
- } catch (Exception $e) {
- $t->rollBack();
- $this->setError($e->getMessage());
- return false;
- } finally {
- LockHelper::uLock($close_lock_key, $close_identification);
- }
- if (!$isCallRefund) {
- return true;
- }
- // 执行退款
- return $this->shippingRefunds($order);
- }
- }
|