Order.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <?php
  2. namespace app\admin\model\shopro\order;
  3. use addons\shopro\library\traits\model\order\OrderOper;
  4. use addons\shopro\library\traits\model\order\OrderScope;
  5. use addons\shopro\library\traits\model\order\OrderStatus;
  6. use app\admin\model\shopro\activity\Activity;
  7. use think\Model;
  8. use traits\model\SoftDelete;
  9. use think\Log;
  10. class Order extends Model
  11. {
  12. use OrderOper, OrderScope, OrderStatus, SoftDelete;
  13. // 表名
  14. protected $name = 'shopro_order';
  15. // 自动写入时间戳字段
  16. protected $autoWriteTimestamp = 'int';
  17. // 定义时间戳字段名
  18. protected $createTime = 'createtime';
  19. protected $updateTime = 'updatetime';
  20. protected $deleteTime = 'deletetime';
  21. // 追加属性
  22. protected $append = [
  23. 'type_text',
  24. 'status_text',
  25. 'pay_type_text',
  26. 'paytime_text',
  27. 'platform_text',
  28. 'ext_arr',
  29. 'status_code',
  30. 'status_name',
  31. 'status_desc',
  32. 'btns',
  33. ];
  34. // 订单状态
  35. const STATUS_INVALID = -2; // 已失效|交易关闭
  36. const STATUS_CANCEL = -1; // 已取消
  37. const STATUS_NOPAY = 0; // 未付款
  38. const STATUS_PAYED = 1; // 买家已付款
  39. const STATUS_FINISH = 2; // 已完成
  40. public function getTypeList()
  41. {
  42. return ['goods' => __('Type goods'), 'score' => __('Type score')];
  43. }
  44. public function getStatusList()
  45. {
  46. return ['-2' => __('Status -2'), '-1' => __('Status -1'), '0' => __('Status 0'), '1' => __('Status 1'), '2' => __('Status 2')];
  47. }
  48. public function getPayTypeList()
  49. {
  50. return ['wechat' => __('Pay_type wechat'), 'alipay' => __('Pay_type alipay'), 'wallet' => __('Pay_type wallet'), 'score' => __('Pay_type score')];
  51. }
  52. public function getPlatformList()
  53. {
  54. return ['H5' => __('Platform h5'), 'wxOfficialAccount' => __('Platform wxofficialaccount'), 'wxMiniProgram' => __('Platform wxminiprogram'), 'App' => __('Platform app')];
  55. }
  56. public function getTypeTextAttr($value, $data)
  57. {
  58. $value = $value ? $value : (isset($data['type']) ? $data['type'] : '');
  59. $list = $this->getTypeList();
  60. return isset($list[$value]) ? $list[$value] : '';
  61. }
  62. public function getStatusTextAttr($value, $data)
  63. {
  64. return $this->getStatus($data, 'status_name');
  65. }
  66. public function getPayTypeTextAttr($value, $data)
  67. {
  68. $value = $value ? $value : (isset($data['pay_type']) ? $data['pay_type'] : '');
  69. $list = $this->getPayTypeList();
  70. return isset($list[$value]) ? $list[$value] : '';
  71. }
  72. public function getPaytimeTextAttr($value, $data)
  73. {
  74. $value = $value ? $value : (isset($data['paytime']) ? $data['paytime'] : '');
  75. return is_numeric($value) ? date("Y-m-d H:i:s", $value) : $value;
  76. }
  77. public function getPlatformTextAttr($value, $data)
  78. {
  79. $value = $value ? $value : (isset($data['platform']) ? $data['platform'] : '');
  80. $list = $this->getPlatformList();
  81. return isset($list[$value]) ? $list[$value] : '';
  82. }
  83. protected function setPaytimeAttr($value)
  84. {
  85. return $value === '' ? null : ($value && !is_numeric($value) ? strtotime($value) : $value);
  86. }
  87. public function getExtArrAttr($value, $data)
  88. {
  89. $ext = (isset($data['ext']) && $data['ext']) ? json_decode($data['ext'], true) : [];
  90. if ($ext && isset($ext['activity_discount_infos']) && $ext['activity_discount_infos']) {
  91. foreach ($ext['activity_discount_infos'] as $key => $info) {
  92. $ext['activity_discount_infos'][$key]['activity_type_text'] = Activity::getTypeList()[$info['activity_type']];
  93. $ext['activity_discount_infos'][$key]['format_text'] = \addons\shopro\model\Activity::formatDiscountTags($info['activity_type'], array_merge([
  94. 'type' => $info['rule_type'],
  95. ], $info['discount_rule']));
  96. }
  97. }
  98. return $ext;
  99. }
  100. protected function getStatus($data, $type)
  101. {
  102. $btns = [];
  103. $status_name = '';
  104. $status_desc = '';
  105. switch ($this->status_code) {
  106. case 'cancel':
  107. $status_name = '已取消';
  108. $status_desc = '买家已取消';
  109. break;
  110. case 'invalid':
  111. $status_name = '交易关闭';
  112. $status_desc = '买家未在规定时间内付款,订单将按照预定时间逾期自动关闭';
  113. break;
  114. case 'nopay':
  115. $status_name = '待付款';
  116. $status_desc = '买家已下单,等待付款';
  117. break;
  118. // 已支付的
  119. case 'commented':
  120. $status_name = '已评价';
  121. $status_desc = '买家已评价';
  122. $btns[] = 'refund'; // 全部退款 直接不申请退款
  123. break;
  124. case 'nocomment':
  125. $status_name = '未评价';
  126. $status_desc = '等待买家评价';
  127. $btns[] = 'refund'; // 全部退款 直接不申请退款
  128. break;
  129. case 'noget':
  130. $status_name = '商家已发货';
  131. $status_desc = '买家若在设置天数内未确认收货,系统将自动确认收货完成订单';
  132. $btns[] = 'refund'; // 全部退款 直接不申请退款
  133. break;
  134. case 'nosend':
  135. $is_send_btn = false;
  136. $is_send_store_btn = false;
  137. foreach ($this->item as $key => $item) {
  138. // 获取 item status
  139. $dispatchType[] = $item['dispatch_type'];
  140. // 如果有一个快递的未发货,显示发货按钮
  141. if ($item['dispatch_type'] == 'express' && $item['dispatch_status'] == OrderItem::DISPATCH_STATUS_NOSEND) {
  142. $is_send_btn = true;
  143. }
  144. // 如果有一个到店,或者商家配送未发货,显示备货按钮
  145. if (in_array($item['dispatch_type'], ['store', 'selfetch']) && $item['dispatch_status'] == OrderItem::DISPATCH_STATUS_NOSEND) {
  146. $is_send_store_btn = true;
  147. }
  148. }
  149. $dispatchType = array_unique(array_filter($dispatchType));
  150. if (in_array('express', $dispatchType)) {
  151. $status_name = '买家已付款';
  152. $status_desc = '买家已付款,请尽快发货';
  153. } else {
  154. $status_name = '买家已付款';
  155. $status_desc = '买家已付款,请通知相关门店发货';
  156. }
  157. if ($is_send_btn) {
  158. $btns[] = 'send'; // 快递发货
  159. }
  160. if ($is_send_store_btn) {
  161. $btns[] = 'send_store'; // 总后台也可直接帮门店发货
  162. }
  163. $btns[] = 'refund'; // 全部退款 直接不申请退款
  164. break;
  165. case 'refund_finish':
  166. $status_name = '退款完成';
  167. $status_desc = '订单退款完成';
  168. break;
  169. case 'refund_ing':
  170. $status_name = '退款处理中';
  171. $status_desc = '请尽快处理退款';
  172. $btns[] = 'refund'; // 全部退款 直接不申请退款
  173. break;
  174. case 'groupon_ing':
  175. $status_name = '等待成团';
  176. $status_desc = '请等待拼团完成之后再发货';
  177. $btns[] = 'refund'; // 全部退款 直接不申请退款
  178. break;
  179. case 'groupon_invalid':
  180. $status_name = '拼团失败';
  181. $status_desc = '未在规定时间完成拼团,团已解散';
  182. break;
  183. // 已支付的结束
  184. case 'finish':
  185. $status_name = '交易完成';
  186. $status_desc = '交易已完成';
  187. break;
  188. }
  189. if ($data['activity_type']) {
  190. // 有活动
  191. if (strpos($data['activity_type'], 'groupon') !== false) {
  192. // 是拼团订单
  193. $ext_arr = json_decode($data['ext'], true);
  194. if (isset($ext_arr['groupon_id']) && $ext_arr['groupon_id']) {
  195. $btns[] = 'groupon'; // 拼团详情
  196. } else {
  197. if ($data['status'] > 0) {
  198. $btns[] = 'groupon_alone'; // 拼团单独购买,支付了,也没有 groupon_id 的情况
  199. } else {
  200. $btns[] = 'groupon'; // 拼团详情 未支付显示拼团
  201. }
  202. }
  203. } else if (strpos($data['activity_type'], 'seckill') !== false) {
  204. // 秒杀订单
  205. $btns[] = 'seckill'; // 秒杀
  206. }
  207. }
  208. return $type == 'status_name' ? $status_name : ($type == 'btns' ? $btns : $status_desc);
  209. }
  210. public function user ()
  211. {
  212. return $this->belongsTo(\app\admin\model\User::class, 'user_id');
  213. }
  214. public function item()
  215. {
  216. return $this->hasMany(\app\admin\model\shopro\order\OrderItem::class, 'order_id');
  217. }
  218. public function express()
  219. {
  220. return $this->hasMany(\app\admin\model\shopro\order\OrderExpress::class, 'order_id');
  221. }
  222. public function aftersale()
  223. {
  224. return $this->hasMany(\app\admin\model\shopro\order\Aftersale::class, 'order_id')->order('id', 'desc');
  225. }
  226. }