Aftersale.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?php
  2. namespace app\admin\model\shopro\order;
  3. use traits\model\SoftDelete;
  4. use app\admin\model\shopro\Common;
  5. use app\admin\model\shopro\user\User;
  6. //售后
  7. class Aftersale extends Common
  8. {
  9. use SoftDelete;
  10. protected $name = 'shopro_order_aftersale';
  11. protected $deleteTime = 'deletetime';
  12. // 追加属性
  13. protected $append = [
  14. 'type_text',
  15. 'btns',
  16. 'dispatch_status_text',
  17. 'aftersale_status_text',
  18. 'aftersale_status_desc',
  19. 'refund_status_text',
  20. 'status_text',
  21. //物流状态
  22. 'express_status_text',
  23. 'refund_type_text',
  24. ];
  25. public function expressStatusList()
  26. {
  27. return [
  28. 'noinfo' => '暂无信息',
  29. 'collect' => '已揽件',
  30. 'transport' => '运输中',
  31. 'delivery' => '派送中',
  32. 'signfor' => '已签收',
  33. 'refuse' => '用户拒收',
  34. 'difficulty' => '问题件',
  35. 'invalid' => '无效件',
  36. 'timeout' => '超时单',
  37. 'fail' => '签收失败',
  38. 'back' => '退回',
  39. ];
  40. }
  41. public function refundTypeList()
  42. {
  43. return [
  44. 'back' => '原路返回',
  45. 'money' => '余额',
  46. ];
  47. }
  48. // 发货状态
  49. const DISPATCH_STATUS_REFUSE = -1; // 拒收
  50. const DISPATCH_STATUS_NOSEND = 0; // 未发货
  51. const DISPATCH_STATUS_SENDED = 1; // 已发货
  52. const DISPATCH_STATUS_GETED = 2; // 已收货
  53. // 售后状态
  54. const AFTERSALE_STATUS_CANCEL = -2; // 已取消
  55. const AFTERSALE_STATUS_REFUSE = -1; // 拒绝
  56. const AFTERSALE_STATUS_NOOPER = 0; // 未处理
  57. const AFTERSALE_STATUS_ING = 1; // 同意并售后中
  58. const AFTERSALE_STATUS_COMPLETED = 2; // 售后完成
  59. // 退款状态
  60. const REFUND_STATUS_NOREFUND = 0; // 未退款
  61. const REFUND_STATUS_AGREE = 1; // 已退款
  62. public function typeList()
  63. {
  64. return [
  65. 'refund' => '仅退款',
  66. 'return' => '退货退款',
  67. 'other' => '其他'
  68. ];
  69. }
  70. public function dispatchStatusList()
  71. {
  72. return [
  73. self::DISPATCH_STATUS_REFUSE => '已拒收',
  74. self::DISPATCH_STATUS_NOSEND => '未发货',
  75. self::DISPATCH_STATUS_SENDED => '已发货',
  76. self::DISPATCH_STATUS_GETED => '已收货'
  77. ];
  78. }
  79. public function aftersaleStatusList()
  80. {
  81. return [
  82. self::AFTERSALE_STATUS_CANCEL => '已取消',
  83. self::AFTERSALE_STATUS_REFUSE => '拒绝',
  84. self::AFTERSALE_STATUS_NOOPER => '已申请',
  85. self::AFTERSALE_STATUS_ING => '售后处理中', //售后处理中
  86. self::AFTERSALE_STATUS_COMPLETED => '售后完成'
  87. ];
  88. }
  89. public function aftersaleStatusDescList()
  90. {
  91. return [
  92. self::AFTERSALE_STATUS_CANCEL => '买家取消了售后申请',
  93. self::AFTERSALE_STATUS_REFUSE => '卖家拒绝了售后申请',
  94. self::AFTERSALE_STATUS_NOOPER => '买家申请了售后,等待同意',
  95. self::AFTERSALE_STATUS_ING => '售后正在处理中',
  96. self::AFTERSALE_STATUS_COMPLETED => '售后已完成'
  97. ];
  98. }
  99. public function refundStatusList()
  100. {
  101. return [
  102. self::REFUND_STATUS_NOREFUND => '未退款',
  103. self::REFUND_STATUS_AGREE => '同意退款',
  104. ];
  105. }
  106. // 已取消
  107. public function scopeCancel($query)
  108. {
  109. return $query->where('aftersale_status', self::AFTERSALE_STATUS_CANCEL);
  110. }
  111. // 已拒绝
  112. public function scopeRefuse($query)
  113. {
  114. return $query->where('aftersale_status', self::AFTERSALE_STATUS_REFUSE);
  115. }
  116. public function scopeNoOper($query)
  117. {
  118. return $query->where('aftersale_status', self::AFTERSALE_STATUS_NOOPER);
  119. }
  120. // 处理中
  121. public function scopeIng($query)
  122. {
  123. return $query->where('aftersale_status', self::AFTERSALE_STATUS_ING);
  124. }
  125. // 处理完成
  126. public function scopeCompleted($query)
  127. {
  128. return $query->where('aftersale_status', self::AFTERSALE_STATUS_COMPLETED);
  129. }
  130. // 需要处理的,包含未处理,和处理中的,个人中心显示售后数量
  131. public function scopeNeedOper($query)
  132. {
  133. return $query->whereIn('aftersale_status', [self::AFTERSALE_STATUS_NOOPER, self::AFTERSALE_STATUS_ING]);
  134. }
  135. /**
  136. * 后台售后列表,主表是 order 表时不用用 scope 了
  137. *
  138. * @param [type] $scope
  139. * @return void
  140. */
  141. public static function getScopeWhere($scope)
  142. {
  143. $where = [];
  144. switch ($scope) {
  145. case 'cancel':
  146. $where['aftersale_status'] = self::AFTERSALE_STATUS_CANCEL;
  147. break;
  148. case 'refuse':
  149. $where['aftersale_status'] = self::AFTERSALE_STATUS_REFUSE;
  150. break;
  151. case 'nooper':
  152. $where['aftersale_status'] = self::AFTERSALE_STATUS_NOOPER;
  153. break;
  154. case 'ing':
  155. $where['aftersale_status'] = self::AFTERSALE_STATUS_ING;
  156. break;
  157. case 'completed':
  158. $where['aftersale_status'] = self::AFTERSALE_STATUS_COMPLETED;
  159. break;
  160. }
  161. return $where;
  162. }
  163. // 可以取消
  164. public function scopeCanCancel($query)
  165. {
  166. // 未处理,处理中,可以取消
  167. return $query->where('aftersale_status', 'in', [
  168. self::AFTERSALE_STATUS_NOOPER,
  169. self::AFTERSALE_STATUS_ING
  170. ]);
  171. }
  172. // 可以操作
  173. public function scopeCanOper($query)
  174. {
  175. // 未处理,处理中,可以 操作退款,拒绝,完成
  176. return $query->where('aftersale_status', 'in', [
  177. self::AFTERSALE_STATUS_NOOPER,
  178. self::AFTERSALE_STATUS_ING
  179. ]);
  180. }
  181. // 可以删除
  182. public function scopeCanDelete($query)
  183. {
  184. // 取消,拒绝,完成可以删除
  185. return $query->where('aftersale_status', 'in', [
  186. self::AFTERSALE_STATUS_CANCEL,
  187. self::AFTERSALE_STATUS_REFUSE,
  188. self::AFTERSALE_STATUS_COMPLETED
  189. ]);
  190. }
  191. public function getDispatchStatusTextAttr($value, $data)
  192. {
  193. $value = $value ?: ($data['dispatch_status'] ?? null);
  194. $list = $this->dispatchStatusList();
  195. return isset($list[$value]) ? $list[$value] : '';
  196. }
  197. public function getBtnsAttr($value, $data)
  198. {
  199. $btns = [];
  200. switch ($data['aftersale_status']) {
  201. case self::AFTERSALE_STATUS_NOOPER:
  202. case self::AFTERSALE_STATUS_ING:
  203. $btns[] = 'cancel';
  204. break;
  205. case self::AFTERSALE_STATUS_CANCEL:
  206. case self::AFTERSALE_STATUS_REFUSE:
  207. case self::AFTERSALE_STATUS_COMPLETED:
  208. $btns[] = 'delete';
  209. break;
  210. }
  211. return $btns;
  212. }
  213. public function getAftersaleStatusTextAttr($value, $data)
  214. {
  215. $value = $value ?: ($data['aftersale_status'] ?? null);
  216. $list = $this->aftersaleStatusList();
  217. return isset($list[$value]) ? $list[$value] : '';
  218. }
  219. public function getAftersaleStatusDescAttr($value, $data)
  220. {
  221. $value = $value ?: ($data['aftersale_status'] ?? null);
  222. $list = $this->aftersaleStatusDescList();
  223. return isset($list[$value]) ? $list[$value] : '';
  224. }
  225. public function getExpressStatusTextAttr($value, $data){
  226. $value = $value ?: ($data['express_status'] ?? null);
  227. $list = $this->expressStatusList();
  228. return isset($list[$value]) ? $list[$value] : '';
  229. }
  230. public function getRefundStatusTextAttr($value, $data)
  231. {
  232. $value = $value ?: ($data['refund_status'] ?? null);
  233. $list = $this->refundStatusList();
  234. return isset($list[$value]) ? $list[$value] : '';
  235. }
  236. public function getRefundTypeTextAttr($value, $data)
  237. {
  238. $value = $value ?: ($data['refund_type'] ?? null);
  239. $list = $this->refundTypeList();
  240. return isset($list[$value]) ? $list[$value] : '';
  241. }
  242. /**
  243. * 获取建议退款金额,不考虑剩余可退款金额是否够退
  244. *
  245. * @param string $value
  246. * @param array $data
  247. * @return string
  248. */
  249. public function getSuggestRefundFeeAttr($value, $data)
  250. {
  251. $current_goods_amount = bcmul($data['goods_price'], (string)$data['goods_num'], 2);
  252. $total_amount = bcadd($current_goods_amount, $data['dispatch_fee'], 2);
  253. $suggest_refund_fee = bcsub($total_amount, $data['discount_fee'], 2); // (商品金额 + 运费金额) - 总优惠(活动,优惠券,包邮优惠)
  254. return $suggest_refund_fee;
  255. }
  256. public function logs()
  257. {
  258. return $this->hasMany(AftersaleLog::class, 'order_aftersale_id', 'id')->order('id', 'desc');
  259. }
  260. public function user()
  261. {
  262. return $this->belongsTo(User::class, 'user_id');
  263. }
  264. public function order()
  265. {
  266. return $this->belongsTo(Order::class, 'order_id');
  267. }
  268. public function expresslogs()
  269. {
  270. return $this->hasMany(AftersaleExpressLog::class, 'order_aftersale_id', 'id')->order('id', 'desc');
  271. }
  272. }