OrderRefundStep.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <?php
  2. namespace common\models\order;
  3. use addons\Store\common\models\StoreOrder;
  4. use addons\Store\common\models\StoreOrderDetail;
  5. use common\enums\AddonsEnum;
  6. use common\enums\OrderStatusEnum;
  7. use common\enums\RefundStatusEnum;
  8. use common\enums\RefundTypeEnum;
  9. use common\enums\StatusEnum;
  10. use common\events\order\OrderRefundChangeEvent;
  11. use common\events\order\OrderRefundEvent;
  12. use common\events\order\OrderRefundFinishEvent;
  13. use common\events\order\OrderRefundBuyerDeliveryEvent;
  14. use common\events\order\OrderTakeDeliveryEvent;
  15. use common\models\mall\MallAddons;
  16. use Yii;
  17. use yii\db\Exception;
  18. use yii\helpers\Json;
  19. /**
  20. * This is the model class for table "{{%order_refund_step}}".
  21. *
  22. *
  23. * @property int $id
  24. * @property int $order_refund_id 售后表id
  25. * @property int|null $role 角色【1买家 2商家】
  26. * @property string|null $content 内容
  27. * @property int $step_num 进度条当前步骤
  28. * @property int $step_status 步骤状态
  29. * @property int $status 状态【1启用 0禁用 -1删除】
  30. * @property int $created_at 创建时间
  31. * @property int $updated_at 修改时间
  32. */
  33. class OrderRefundStep extends \common\models\base\BaseActiveRecord
  34. {
  35. /**
  36. * {@inheritdoc}
  37. */
  38. public static function tableName()
  39. {
  40. return '{{%order_refund_step}}';
  41. }
  42. /**
  43. * {@inheritdoc}
  44. */
  45. public function rules()
  46. {
  47. return [
  48. [['order_refund_id', 'role', 'step_status', 'status', 'created_at', 'updated_at', 'step_num'], 'integer'],
  49. [['content'], 'string', 'max' => 3500],
  50. ];
  51. }
  52. /**
  53. * {@inheritdoc}
  54. */
  55. public function attributeLabels()
  56. {
  57. return [
  58. 'id' => 'ID',
  59. 'order_refund_id' => '售后表id',
  60. 'role' => '角色【1买家 2商家】',
  61. 'content' => '内容',
  62. 'step_num' => '进度条当前步骤',
  63. 'step_status' => '步骤状态',
  64. 'status' => '状态【1启用 0禁用 -1删除】',
  65. 'created_at' => '创建时间',
  66. 'updated_at' => '修改时间',
  67. ];
  68. }
  69. /**
  70. * @Author: hua
  71. * @DateTime: 2021/10/8 18:01
  72. * @Copyright: copyright (c) 2021 广东七件事集团
  73. * @param array $params
  74. * @return bool|OrderRefundStep
  75. */
  76. public static function setData(array $params)
  77. {
  78. try {
  79. if (!empty($params['id'])) {
  80. $model = self::findOne(['mall_id' => $params['mall_id'], 'id' => $params['id'], 'status' => [StatusEnum::ENABLED]]);
  81. if (empty($model)) throw new Exception('订单详情不存在或已删除');
  82. } else {
  83. $model = new self();
  84. $model->loadDefaultValues();
  85. }
  86. if (isset($params['content'])) $params['content'] = Json::encode($params['content']);
  87. if (!$model->load($params, '') || !$model->save()) {
  88. throw new Exception($model->getErrorMessage());
  89. }
  90. return $model;
  91. } catch (Exception $e) {
  92. self::$static_error = $e->getMessage();
  93. return false;
  94. }
  95. }
  96. /**
  97. * 申请售后-商家同意后-买家发货
  98. * @Author: hua
  99. * @DateTime: 2021/10/9 15:53
  100. * @Copyright: copyright (c) 2021 广东七件事集团
  101. * @param $params
  102. * @return bool
  103. */
  104. public static function refundSend($params)
  105. {
  106. try {
  107. $order_refund_model = OrderRefund::getOne([['id'=>$params['id']],['user_id'=>$params['user_id']]]);
  108. if(empty($order_refund_model)) throw new Exception('售后订单不存在');
  109. if(!in_array($order_refund_model->type,[RefundTypeEnum::EXCHANGE_GOODS,RefundTypeEnum::MONEY_AND_PRODUCT])){
  110. throw new Exception('此售后订单不是换货或退款退货订单');
  111. }
  112. if(!in_array($order_refund_model->step_status,[RefundStatusEnum::STEP_2,RefundStatusEnum::STEP_8,RefundStatusEnum::STEP_NEGATIVE_2])){
  113. throw new Exception('等待商家同意申请售后');
  114. }
  115. // 售后步骤
  116. $content = [];
  117. $content[] = '物流名称:' . $params['express'];
  118. $content[] = '物流编号:' . $params['express_no'];
  119. $params['order_refund_id'] = $params['id'];
  120. unset($params['id']);
  121. $params['role'] = RefundStatusEnum::BUYERS;
  122. $params['content'] = $content;
  123. $params['step_status'] = $order_refund_model->type==RefundTypeEnum::EXCHANGE_GOODS ? RefundStatusEnum::STEP_9:RefundStatusEnum::STEP_3;
  124. $params['step_num'] = RefundStatusEnum::getStepNumByStatus($params['step_status']);
  125. $res = self::setData($params);
  126. // 售后信息保存
  127. $order_refund_model->refund_status = RefundStatusEnum::RETURN_GOODS;
  128. $order_refund_model->express = $params['express'];
  129. $order_refund_model->express_no = $params['express_no'];
  130. $order_refund_model->express_at = time();
  131. $order_refund_model->step_status = $params['step_status'];
  132. $order_refund_model->save();
  133. if (!$res) throw new Exception(self::getStaticError());
  134. // 触发售后发货
  135. $event = new OrderRefundBuyerDeliveryEvent($params['mall_id']);
  136. $data['id'] = $order_refund_model->id;
  137. $data['mall_id'] = $order_refund_model->mall_id;
  138. Yii::$app->services->events->dispatch($event, $data, $event->listeners);
  139. $orderRefundChangeEvent = new OrderRefundChangeEvent($params['mall_id']);
  140. $refundChangeData['id'] = $order_refund_model->id;
  141. $refundChangeData['step_status'] = $params['step_status'];
  142. $refundChangeData['mall_id'] = $order_refund_model->mall_id;
  143. Yii::$app->services->events->dispatch($orderRefundChangeEvent, $refundChangeData, $orderRefundChangeEvent->listeners);
  144. return true;
  145. } catch (Exception $e) {
  146. self::$static_error = $e->getMessage();
  147. return false;
  148. }
  149. }
  150. /**
  151. * 申请售后-换货-确认收货,售后完成
  152. * @Author: hua
  153. * @DateTime: 2021/10/9 15:53
  154. * @Copyright: copyright (c) 2021 广东七件事集团
  155. * @param $params
  156. * @return bool
  157. */
  158. public static function refundTakeDelivery($params)
  159. {
  160. $t = \Yii::$app->db->beginTransaction();
  161. try {
  162. $content = [];
  163. $where = [['id'=>$params['id']]];
  164. $data = RefundStatusEnum::getStepStatusText(RefundStatusEnum::STEP_12);
  165. $params['role'] = RefundStatusEnum::SELLER;
  166. if(!empty($params['user_id'])){
  167. $data = RefundStatusEnum::getStepStatusText(RefundStatusEnum::STEP_11);
  168. $where[]=['user_id'=>$params['user_id']];
  169. $params['role'] = RefundStatusEnum::BUYERS;
  170. }
  171. $content[] = $data['desc'] ?? '';
  172. $order_refund_model = OrderRefund::getOne($where);
  173. if(empty($order_refund_model)) throw new Exception('售后订单不存在');
  174. if($order_refund_model->type!=RefundTypeEnum::EXCHANGE_GOODS) throw new Exception('此售后订单不是换货订单');
  175. if($order_refund_model->step_status!=RefundStatusEnum::STEP_10){
  176. throw new Exception('等待商家重新发货');
  177. }
  178. $order_refund_model->refund_status = RefundStatusEnum::FINISH;
  179. $order_refund_model->save();
  180. $params['order_refund_id'] = $params['id'];
  181. unset($params['id']);
  182. $params['content'] = $content;
  183. $params['step_status'] = RefundStatusEnum::STEP_11;
  184. $params['step_num'] = RefundStatusEnum::getStepNumByStatus($params['step_status']);
  185. $res = self::setData($params);
  186. if (!$res) throw new Exception(self::getStaticError());
  187. $order_detail_model = OrderDetail::findOne($order_refund_model->order_detail_id);
  188. $order_detail_model->is_feedback = OrderStatusEnum::getIsFeedbackStatus($params['step_status']);
  189. $res = $order_detail_model->save();
  190. if (!$res) throw new Exception(OrderDetail::getStaticError());
  191. $order = Order::findOne($order_refund_model->order_id);
  192. Order::autoUpdateStatus($order);
  193. //o2o门店
  194. if(!empty($order['store_id'])){
  195. $is_install = MallAddons::isInstall($order['mall_id'], AddonsEnum::ADDONS_NAME_STORE);
  196. if($is_install){
  197. $store_order_detail_model = StoreOrderDetail::findOne(['main_order_detail_id'=>$order_refund_model->order_detail_id]);
  198. $store_order_detail_model->is_feedback = $order_detail_model->is_feedback;
  199. $res = $store_order_detail_model->save();
  200. if (!$res) throw new Exception($store_order_detail_model->getErrorMessage());
  201. $store_order =StoreOrder::findOne(['order_no'=>$order['order_no']]);
  202. StoreOrder::autoUpdateStatus($store_order);
  203. }
  204. }
  205. $t->commit();
  206. // 触发退款事件
  207. $event = new OrderRefundFinishEvent($order_refund_model['mall_id']);
  208. $data = [];
  209. $data['id'] = $order_refund_model->id;
  210. $data['source_table'] = 'order_detail';
  211. $data['source_table_id'] = $order_refund_model['order_detail_id'];
  212. Yii::$app->services->events->dispatch($event, $data, $event->listeners);
  213. $orderRefundChangeEvent = new OrderRefundChangeEvent($order_refund_model['mall_id']);
  214. $refundChangeData['id'] = $order_refund_model->id;
  215. $refundChangeData['step_status'] = $params['step_status'];
  216. $refundChangeData['mall_id'] = $order_refund_model->mall_id;
  217. Yii::$app->services->events->dispatch($orderRefundChangeEvent, $refundChangeData, $orderRefundChangeEvent->listeners);
  218. return true;
  219. } catch (Exception $e) {
  220. $t->rollBack();
  221. self::$static_error = $e->getMessage();
  222. return false;
  223. }
  224. }
  225. }