OrderItem.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <?php
  2. namespace app\admin\model\shopro\order;
  3. use think\Model;
  4. use traits\model\SoftDelete;
  5. use addons\shopro\library\traits\model\order\OrderItemStatus;
  6. class OrderItem extends Model
  7. {
  8. use OrderItemStatus, SoftDelete;
  9. // 表名
  10. protected $name = 'shopro_order_item';
  11. // 自动写入时间戳字段
  12. protected $autoWriteTimestamp = 'int';
  13. // 定义时间戳字段名
  14. protected $createTime = 'createtime';
  15. protected $updateTime = 'updatetime';
  16. protected $deleteTime = 'deletetime';
  17. // 追加属性
  18. protected $append = [
  19. 'dispatch_type_text',
  20. 'dispatch_status_text',
  21. 'aftersale_status_text',
  22. 'comment_status_text',
  23. 'activity_type_arr',
  24. 'activity_type_text_arr',
  25. 'activity_type_text',
  26. 'refund_status_text',
  27. 'status_code',
  28. 'status_name',
  29. 'status_desc',
  30. 'btns',
  31. 'ext_arr'
  32. ];
  33. // 发货状态
  34. const DISPATCH_STATUS_NOSEND = 0; // 未发货
  35. const DISPATCH_STATUS_SENDED = 1; // 已发货
  36. const DISPATCH_STATUS_GETED = 2; // 已收货
  37. // 售后状态
  38. const AFTERSALE_STATUS_REFUSE = -1; // 驳回
  39. const AFTERSALE_STATUS_NOAFTER = 0; // 未申请
  40. const AFTERSALE_STATUS_AFTERING = 1; // 申请退款
  41. const AFTERSALE_STATUS_OK = 2; // 售后完成
  42. // 退款状态
  43. const REFUND_STATUS_REFUSE = -1; // 拒绝退款 // 驳回aftersale_status(状态不会出现)
  44. const REFUND_STATUS_NOREFUND = 0; // 退款状态 未申请
  45. const REFUND_STATUS_ING = 1; // 申请中 // 不需要申请(状态不会出现)
  46. const REFUND_STATUS_OK = 2; // 已同意
  47. const REFUND_STATUS_FINISH = 3; // 退款完成
  48. // 评价状态
  49. const COMMENT_STATUS_NO = 0; // 待评价
  50. const COMMENT_STATUS_OK = 1; // 已评价
  51. public function getExtArrAttr($value, $data)
  52. {
  53. return (isset($data['ext']) && $data['ext']) ? json_decode($data['ext'], true) : [];
  54. }
  55. public function getDispatchStatusList()
  56. {
  57. return ['0' => __('Dispatch_status 0'), '1' => __('Dispatch_status 1'), '2' => __('Dispatch_status 2')];
  58. }
  59. public function getAftersaleStatusList()
  60. {
  61. return ['-1' => __('Aftersale_status -1'), '0' => __('Aftersale_status 0'), '1' => __('Aftersale_status 1'), '2' => __('Aftersale_status 2')];
  62. }
  63. public function getCommentStatusList()
  64. {
  65. return ['0' => __('Comment_status 0'), '1' => __('Comment_status 1')];
  66. }
  67. public function getRefundStatusList()
  68. {
  69. return ['-1' => __('Refund_status -1'), '0' => __('Refund_status 0'), '1' => __('Refund_status 1'), '2' => __('Refund_status 2'), '3' => __('Refund_status 3')];
  70. }
  71. public function getDispatchTypeTextAttr($value, $data)
  72. {
  73. $value = $value ? $value : (isset($data['dispatch_type']) ? $data['dispatch_type'] : '');
  74. $list = (new \app\admin\model\shopro\dispatch\Dispatch)->getTypeList();
  75. return isset($list[$value]) ? $list[$value] : '';
  76. }
  77. public function getDispatchStatusTextAttr($value, $data)
  78. {
  79. $value = $value ? $value : (isset($data['dispatch_status']) ? $data['dispatch_status'] : '');
  80. $list = $this->getDispatchStatusList();
  81. return isset($list[$value]) ? $list[$value] : '';
  82. }
  83. public function getAftersaleStatusTextAttr($value, $data)
  84. {
  85. $value = $value ? $value : (isset($data['aftersale_status']) ? $data['aftersale_status'] : '');
  86. $list = $this->getAftersaleStatusList();
  87. return isset($list[$value]) ? $list[$value] : '';
  88. }
  89. public function getActivityTypeArrAttr($value, $data) {
  90. $activity_types = $value ? $value : (isset($data['activity_type']) ? $data['activity_type'] : '');
  91. $activityTypes = array_values(array_filter(explode(',', $activity_types)));
  92. return $activityTypes;
  93. }
  94. public function getActivityTypeTextArrAttr($value, $data)
  95. {
  96. $activityTypes = $this->activity_type_arr;
  97. $list = \app\admin\model\shopro\activity\Activity::getTypeList();
  98. $activityTypeTextArr = [];
  99. foreach ($activityTypes as $key => $activity_type) {
  100. if (isset($list[$activity_type])) {
  101. $activityTypeTextArr[$activity_type] = $list[$activity_type];
  102. }
  103. }
  104. return $activityTypeTextArr;
  105. }
  106. public function getActivityTypeTextAttr($value, $data) {
  107. $activityTypeTextArr = $this->activityTypeTextArr;
  108. return join(',', $activityTypeTextArr);
  109. }
  110. public function getCommentStatusTextAttr($value, $data)
  111. {
  112. $value = $value ? $value : (isset($data['comment_status']) ? $data['comment_status'] : '');
  113. $list = $this->getCommentStatusList();
  114. return isset($list[$value]) ? $list[$value] : '';
  115. }
  116. public function getRefundStatusTextAttr($value, $data)
  117. {
  118. $value = $value ? $value : (isset($data['refund_status']) ? $data['refund_status'] : '');
  119. $list = $this->getRefundStatusList();
  120. return isset($list[$value]) ? $list[$value] : '';
  121. }
  122. public function getStatus($data, $type)
  123. {
  124. $btns = [];
  125. $status_name = '';
  126. $status_desc = '';
  127. $status_code = $this->status_code;
  128. $item_code = 'null'; // 有售后的时候,第二状态
  129. if (strpos($status_code, '|') !== false) {
  130. $codes = explode('|', $status_code);
  131. $status_code = $codes[0] ?? 'null';
  132. $item_code = $codes[1] ?? 'null';
  133. }
  134. switch ($status_code) {
  135. case 'null':
  136. case 'cancel':
  137. case 'invalid':
  138. case 'nopay':
  139. // 未支付的返回空
  140. break;
  141. case 'nosend':
  142. $status_name = '待发货';
  143. $status_desc = '等待卖家发货';
  144. // 细分订单发货
  145. switch ($data['dispatch_type']) {
  146. case 'store':
  147. $status_name = '待配送';
  148. $status_desc = '等待卖家上门配送';
  149. $btns[] = 'send_store'; // 总后台也可直接帮门店发货
  150. break;
  151. case 'selfetch':
  152. $status_name = '待备货';
  153. $status_desc = '等待卖家备货';
  154. $btns[] = 'send_store'; // 总后台也可直接帮门店发货
  155. break;
  156. case 'express':
  157. $btns[] = 'send'; // 发货
  158. break;
  159. }
  160. $btns[] = 'refund'; // 退款
  161. break;
  162. case 'noget':
  163. switch ($data['dispatch_type']) {
  164. case 'express':
  165. $status_name = '待收货';
  166. $status_desc = '等待买家收货';
  167. $btns[] = 'get'; // 确认收货
  168. break;
  169. case 'selfetch':
  170. $status_name = '待自提/到店';
  171. $status_desc = '等待买家提货/到店';
  172. break;
  173. case 'store':
  174. $status_name = '待取货';
  175. $status_desc = '卖家上门配送中';
  176. break;
  177. case 'autosend': // 正常不需要确认收货
  178. $status_name = '待收货';
  179. $status_desc = '等待买家收货';
  180. $btns[] = 'get'; // 确认收货
  181. break;
  182. }
  183. $btns[] = 'refund'; // 售后
  184. break;
  185. case 'nocomment':
  186. $status_name = '待评价';
  187. $status_desc = '等待买家评价';
  188. $btns[] = 'refund'; // 退款
  189. break;
  190. case 'commented':
  191. $status_name = '已评价';
  192. $status_desc = '订单已评价';
  193. $btns[] = 'refund'; // 退款
  194. break;
  195. case 'refund_finish':
  196. $status_name = '退款完成';
  197. $status_desc = '订单退款完成';
  198. break;
  199. case 'refund_ing': // 不需要申请退款(状态不会出现)
  200. $status_name = '退款处理中';
  201. $status_desc = '退款处理中';
  202. $btns[] = 'refund'; // 退款
  203. break;
  204. case 'refund_refuse': // 驳回aftersale_status(状态不会出现)
  205. $status_name = '拒绝退款';
  206. $status_desc = '卖家拒绝退款';
  207. break;
  208. case 'after_ing':
  209. $status_name = '售后中';
  210. $status_desc = '售后处理中';
  211. break;
  212. case 'after_refuse':
  213. case 'after_finish':
  214. switch ($status_code) {
  215. case 'after_refuse':
  216. $status_name = '售后拒绝';
  217. $status_desc = '售后申请拒绝';
  218. break;
  219. case 'after_finish':
  220. $status_name = '售后完成';
  221. $status_desc = '售后完成';
  222. break;
  223. }
  224. // 售后拒绝,或者完成的时候,还可以继续操作订单
  225. switch ($item_code) {
  226. case 'nosend':
  227. if ($data['dispatch_type'] == 'express') {
  228. $btns[] = 'send'; // 发货
  229. } else if (in_array($data['dispatch_type'], ['store', 'selfetch'])) {
  230. $btns[] = 'send_store'; // 备货
  231. }
  232. break;
  233. }
  234. break;
  235. }
  236. // 只要有售后单号,就显示售后详情按钮
  237. $ext_arr = json_decode($data['ext'], true);
  238. if (isset($ext_arr['aftersale_id']) && !empty($ext_arr['aftersale_id'])) {
  239. $btns[] = 'aftersale_info'; // 查看详情
  240. }
  241. return $type == 'status_name' ? $status_name : ($type == 'btns' ? $btns : $status_desc);
  242. }
  243. // 商家配送, 到店自提的门店
  244. public function store()
  245. {
  246. return $this->belongsTo(\app\admin\model\shopro\store\Store::class, 'store_id');
  247. }
  248. public function reward()
  249. {
  250. return $this->hasMany(\app\admin\model\shopro\commission\Reward::class, 'order_item_id', 'id');
  251. }
  252. public function commissionOrder()
  253. {
  254. return $this->hasOne(\app\admin\model\shopro\commission\Order::class, 'order_item_id');
  255. }
  256. }