Aftersale.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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. ];
  21. // 发货状态
  22. const DISPATCH_STATUS_REFUSE = -1; // 拒收
  23. const DISPATCH_STATUS_NOSEND = 0; // 未发货
  24. const DISPATCH_STATUS_SENDED = 1; // 已发货
  25. const DISPATCH_STATUS_GETED = 2; // 已收货
  26. // 售后状态
  27. const AFTERSALE_STATUS_CANCEL = -2; // 已取消
  28. const AFTERSALE_STATUS_REFUSE = -1; // 拒绝
  29. const AFTERSALE_STATUS_NOOPER = 0; // 未处理
  30. const AFTERSALE_STATUS_ING = 1; // 申请售后
  31. const AFTERSALE_STATUS_COMPLETED = 2; // 售后完成
  32. // 退款状态
  33. const REFUND_STATUS_NOREFUND = 0; // 未退款
  34. const REFUND_STATUS_AGREE = 1; // 已同意
  35. public function typeList()
  36. {
  37. return [
  38. 'refund' => '仅退款',
  39. 'return' => '退货退款',
  40. 'other' => '其他'
  41. ];
  42. }
  43. public function dispatchStatusList()
  44. {
  45. return [
  46. self::DISPATCH_STATUS_REFUSE => '已拒收',
  47. self::DISPATCH_STATUS_NOSEND => '未发货',
  48. self::DISPATCH_STATUS_SENDED => '已发货',
  49. self::DISPATCH_STATUS_GETED => '已收货'
  50. ];
  51. }
  52. public function aftersaleStatusList()
  53. {
  54. return [
  55. self::AFTERSALE_STATUS_CANCEL => '已取消',
  56. self::AFTERSALE_STATUS_REFUSE => '拒绝',
  57. self::AFTERSALE_STATUS_NOOPER => '未处理',
  58. self::AFTERSALE_STATUS_ING => '申请售后',
  59. self::AFTERSALE_STATUS_COMPLETED => '售后完成'
  60. ];
  61. }
  62. public function aftersaleStatusDescList()
  63. {
  64. return [
  65. self::AFTERSALE_STATUS_CANCEL => '买家取消了售后申请',
  66. self::AFTERSALE_STATUS_REFUSE => '卖家拒绝了售后申请',
  67. self::AFTERSALE_STATUS_NOOPER => '买家申请了售后,请及时处理',
  68. self::AFTERSALE_STATUS_ING => '售后正在处理中',
  69. self::AFTERSALE_STATUS_COMPLETED => '售后已完成'
  70. ];
  71. }
  72. public function refundStatusList()
  73. {
  74. return [
  75. self::REFUND_STATUS_NOREFUND => '未退款',
  76. self::REFUND_STATUS_AGREE => '同意退款',
  77. ];
  78. }
  79. // 已取消
  80. public function scopeCancel($query)
  81. {
  82. return $query->where('aftersale_status', self::AFTERSALE_STATUS_CANCEL);
  83. }
  84. // 已拒绝
  85. public function scopeRefuse($query)
  86. {
  87. return $query->where('aftersale_status', self::AFTERSALE_STATUS_REFUSE);
  88. }
  89. public function scopeNoOper($query)
  90. {
  91. return $query->where('aftersale_status', self::AFTERSALE_STATUS_NOOPER);
  92. }
  93. // 处理中
  94. public function scopeIng($query)
  95. {
  96. return $query->where('aftersale_status', self::AFTERSALE_STATUS_ING);
  97. }
  98. // 处理完成
  99. public function scopeCompleted($query)
  100. {
  101. return $query->where('aftersale_status', self::AFTERSALE_STATUS_COMPLETED);
  102. }
  103. // 需要处理的,包含未处理,和处理中的,个人中心显示售后数量
  104. public function scopeNeedOper($query)
  105. {
  106. return $query->whereIn('aftersale_status', [self::AFTERSALE_STATUS_NOOPER, self::AFTERSALE_STATUS_ING]);
  107. }
  108. /**
  109. * 后台售后列表,主表是 order 表时不用用 scope 了
  110. *
  111. * @param [type] $scope
  112. * @return void
  113. */
  114. public static function getScopeWhere($scope)
  115. {
  116. $where = [];
  117. switch ($scope) {
  118. case 'cancel':
  119. $where['aftersale_status'] = self::AFTERSALE_STATUS_CANCEL;
  120. break;
  121. case 'refuse':
  122. $where['aftersale_status'] = self::AFTERSALE_STATUS_REFUSE;
  123. break;
  124. case 'nooper':
  125. $where['aftersale_status'] = self::AFTERSALE_STATUS_NOOPER;
  126. break;
  127. case 'ing':
  128. $where['aftersale_status'] = self::AFTERSALE_STATUS_ING;
  129. break;
  130. case 'completed':
  131. $where['aftersale_status'] = self::AFTERSALE_STATUS_COMPLETED;
  132. break;
  133. }
  134. return $where;
  135. }
  136. // 可以取消
  137. public function scopeCanCancel($query)
  138. {
  139. // 未处理,处理中,可以取消
  140. return $query->where('aftersale_status', 'in', [
  141. self::AFTERSALE_STATUS_NOOPER,
  142. self::AFTERSALE_STATUS_ING
  143. ]);
  144. }
  145. // 可以操作
  146. public function scopeCanOper($query)
  147. {
  148. // 未处理,处理中,可以 操作退款,拒绝,完成
  149. return $query->where('aftersale_status', 'in', [
  150. self::AFTERSALE_STATUS_NOOPER,
  151. self::AFTERSALE_STATUS_ING
  152. ]);
  153. }
  154. // 可以删除
  155. public function scopeCanDelete($query)
  156. {
  157. // 取消,拒绝,完成可以删除
  158. return $query->where('aftersale_status', 'in', [
  159. self::AFTERSALE_STATUS_CANCEL,
  160. self::AFTERSALE_STATUS_REFUSE,
  161. self::AFTERSALE_STATUS_COMPLETED
  162. ]);
  163. }
  164. public function getDispatchStatusTextAttr($value, $data)
  165. {
  166. $value = $value ?: ($data['dispatch_status'] ?? null);
  167. $list = $this->dispatchStatusList();
  168. return isset($list[$value]) ? $list[$value] : '';
  169. }
  170. public function getBtnsAttr($value, $data)
  171. {
  172. $btns = [];
  173. switch ($data['aftersale_status']) {
  174. case self::AFTERSALE_STATUS_NOOPER:
  175. case self::AFTERSALE_STATUS_ING:
  176. $btns[] = 'cancel';
  177. break;
  178. case self::AFTERSALE_STATUS_CANCEL:
  179. case self::AFTERSALE_STATUS_REFUSE:
  180. case self::AFTERSALE_STATUS_COMPLETED:
  181. $btns[] = 'delete';
  182. break;
  183. }
  184. return $btns;
  185. }
  186. public function getAftersaleStatusTextAttr($value, $data)
  187. {
  188. $value = $value ?: ($data['aftersale_status'] ?? null);
  189. $list = $this->aftersaleStatusList();
  190. return isset($list[$value]) ? $list[$value] : '';
  191. }
  192. public function getAftersaleStatusDescAttr($value, $data)
  193. {
  194. $value = $value ?: ($data['aftersale_status'] ?? null);
  195. $list = $this->aftersaleStatusDescList();
  196. return isset($list[$value]) ? $list[$value] : '';
  197. }
  198. public function getRefundStatusTextAttr($value, $data)
  199. {
  200. $value = $value ?: ($data['refund_status'] ?? null);
  201. $list = $this->refundStatusList();
  202. return isset($list[$value]) ? $list[$value] : '';
  203. }
  204. /**
  205. * 获取建议退款金额,不考虑剩余可退款金额是否够退
  206. *
  207. * @param string $value
  208. * @param array $data
  209. * @return string
  210. */
  211. public function getSuggestRefundFeeAttr($value, $data)
  212. {
  213. $current_goods_amount = bcmul($data['goods_price'], (string)$data['goods_num'], 2);
  214. $total_amount = bcadd($current_goods_amount, $data['dispatch_fee'], 2);
  215. $suggest_refund_fee = bcsub($total_amount, $data['discount_fee'], 2); // (商品金额 + 运费金额) - 总优惠(活动,优惠券,包邮优惠)
  216. return $suggest_refund_fee;
  217. }
  218. public function logs()
  219. {
  220. return $this->hasMany(AftersaleLog::class, 'order_aftersale_id', 'id')->order('id', 'desc');
  221. }
  222. public function user()
  223. {
  224. return $this->belongsTo(User::class, 'user_id');
  225. }
  226. public function order()
  227. {
  228. return $this->belongsTo(Order::class, 'order_id');
  229. }
  230. }