Aftersale.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?php
  2. namespace addons\shopro\controller\order;
  3. use think\Db;
  4. use addons\shopro\controller\Common;
  5. use app\admin\model\shopro\order\Order as OrderModel;
  6. use app\admin\model\shopro\order\OrderItem as OrderItemModel;
  7. use app\admin\model\shopro\order\Aftersale as AftersaleModel;
  8. use app\admin\model\shopro\order\AftersaleLog as AftersaleLogModel;
  9. use app\admin\model\shopro\order\Action as OrderActionModel;
  10. class Aftersale extends Common
  11. {
  12. protected $noNeedLogin = [];
  13. protected $noNeedRight = ['*'];
  14. //售后原因
  15. public function aftersale_reason(){
  16. $data = [
  17. '不想要了',
  18. '不喜欢、效果不好',
  19. '货物与描述不符',
  20. '质量问题',
  21. '收到商品少件(含少配件)',
  22. '商品破损或污渍',
  23. '商家发错货',
  24. '假冒品牌',
  25. '其他原因',
  26. ];
  27. $this->success(1, $data);
  28. }
  29. //售后列表
  30. public function index() {
  31. $user = auth_user();
  32. $params = $this->request->param();
  33. $type = $params['type'] ?? 'all';
  34. $aftersales = AftersaleModel::where('user_id', $user->id);
  35. if ($type != 'all') {
  36. $aftersales = $aftersales->{$type}();
  37. }
  38. $aftersales = $aftersales->order('id', 'desc')
  39. ->autopage()->select();
  40. // ->paginate($this->request->param('list_rows', 10));
  41. $this->success('获取成功', $aftersales);
  42. }
  43. //售后详情
  44. public function detail()
  45. {
  46. $user = auth_user();
  47. $id = $this->request->param('id');
  48. $aftersale = AftersaleModel::where('user_id', $user->id)->with('logs')->where('id', $id)->find();
  49. if (!$aftersale) {
  50. $this->error(__('No Results were found'));
  51. }
  52. $this->success('获取成功', $aftersale);
  53. }
  54. //申请售后
  55. public function add()
  56. {
  57. $user = auth_user();
  58. $params = $this->request->param();
  59. $this->svalidate($params, ".add");
  60. $aftersale = Db::transaction(function () use ($user, $params) {
  61. $type = $params['type'];
  62. $order_id = $params['order_id'];
  63. $order_item_id = $params['order_item_id'];
  64. $mobile = $params['mobile'] ?? '';
  65. $reason = $params['reason'] ?? '用户申请售后';
  66. $content = $params['content'] ?? '';
  67. $images = $params['images'] ? json_decode(htmlspecialchars_decode($params['images']),true) : [];
  68. //寄回信息
  69. $express_id = $params['express_id'] ?? 0;
  70. $express_no = $params['express_no'] ?? '';
  71. if($type == 'return'){
  72. if(!$express_id || !$express_no){
  73. error_stop('请输入快递公司和运单号');
  74. }
  75. $express = Db::name('shopro_data_express')->where('id',$express_id)->find();
  76. if(!$express){
  77. error_stop('请输入快递公司和运单号');
  78. }
  79. }
  80. //订单状态:已支付,已完成
  81. $order = OrderModel::canAftersale()->where('user_id', $user->id)->lock(true)->where('id', $order_id)->find();
  82. if (!$order) {
  83. error_stop('订单不存在或不可售后');
  84. }
  85. $item = OrderItemModel::where('user_id', $user->id)->where('order_id',$order_id)->where('id', $order_item_id)->find();
  86. if (!$item) {
  87. error_stop('参数错误');
  88. }
  89. if (!in_array($item->aftersale_status, [
  90. OrderItemModel::AFTERSALE_STATUS_REFUSE, //拒绝
  91. OrderItemModel::AFTERSALE_STATUS_NOAFTER //未申请
  92. ])) {
  93. error_stop('当前订单商品不可申请售后');
  94. }
  95. $aftersale = new AftersaleModel();
  96. $aftersale->aftersale_sn = get_sn($user->id, 'A');
  97. $aftersale->user_id = $user->id;
  98. $aftersale->type = $type;
  99. $aftersale->mobile = $mobile;
  100. $aftersale->activity_id = $item['activity_id'];
  101. $aftersale->activity_type = $item['activity_type'];
  102. $aftersale->order_id = $order_id;
  103. $aftersale->order_item_id = $order_item_id;
  104. $aftersale->goods_id = $item['goods_id'];
  105. $aftersale->goods_sku_price_id = $item['goods_sku_price_id'];
  106. $aftersale->goods_sku_text = $item['goods_sku_text'];
  107. $aftersale->goods_title = $item['goods_title'];
  108. $aftersale->goods_image = $item['goods_image'];
  109. $aftersale->goods_original_price = $item['goods_original_price'];
  110. $aftersale->discount_fee = $item['discount_fee'];
  111. $aftersale->goods_price = $item['goods_price'];
  112. $aftersale->goods_num = $item['goods_num'];
  113. $aftersale->dispatch_status = $item['dispatch_status'];
  114. $aftersale->dispatch_fee = $item['dispatch_fee'];
  115. $aftersale->aftersale_status = AftersaleModel::AFTERSALE_STATUS_NOOPER;
  116. $aftersale->refund_status = AftersaleModel::REFUND_STATUS_NOREFUND; // 未退款
  117. $aftersale->refund_fee = 0;
  118. $aftersale->reason = $reason;
  119. $aftersale->content = $content;
  120. if($type == 'return'){
  121. $aftersale->express_name = $express['name'];
  122. $aftersale->express_code = $express['code'];
  123. $aftersale->express_no = $express_no;
  124. }
  125. $aftersale->save();
  126. // 增加售后单变动记录、
  127. AftersaleLogModel::add($order, $aftersale, $user, 'user', [
  128. 'log_type' => 'apply_aftersale',
  129. 'content' => "申请原因:$reason <br>相关描述: $content",
  130. 'images' => $images
  131. ]);
  132. $ext = $item->ext ?: [];
  133. $ext['aftersale_id'] = $aftersale->id;
  134. // 修改订单 item 状态,申请售后
  135. $item->aftersale_status = OrderItemModel::AFTERSALE_STATUS_ING;
  136. $item->ext = $ext;
  137. $item->save();
  138. OrderActionModel::add($order, $item, $user, 'user', '用户申请售后');
  139. return $aftersale;
  140. });
  141. $this->success('申请成功', $aftersale);
  142. }
  143. //取消售后
  144. public function cancel()
  145. {
  146. $user = auth_user();
  147. $id = $this->request->param('id');
  148. $aftersale = AftersaleModel::canCancel()->where('user_id', $user->id)->where('id', $id)->find();
  149. if (!$aftersale) {
  150. $this->error('售后单不存在或不可取消');
  151. }
  152. $order = OrderModel::where('user_id', $user->id)->find($aftersale['order_id']);
  153. if (!$order) {
  154. $this->error(__('No Results were found'));
  155. }
  156. $orderItem = OrderItemModel::find($aftersale['order_item_id']);
  157. if (!$orderItem || in_array($orderItem['refund_status'], [OrderItemModel::REFUND_STATUS_AGREE, OrderItemModel::REFUND_STATUS_COMPLETED])) {
  158. // 不存在, 或者已经退款
  159. $this->error('退款商品不存在或已退款');
  160. }
  161. $aftersale = Db::transaction(function () use ($aftersale, $order, $orderItem, $user) {
  162. $aftersale->aftersale_status = AftersaleModel::AFTERSALE_STATUS_CANCEL; // 取消售后单
  163. $aftersale->save();
  164. AftersaleLogModel::add($order, $aftersale, $user, 'user', [
  165. 'log_type' => 'cancel',
  166. 'content' => '用户取消申请售后',
  167. 'images' => []
  168. ]);
  169. // 修改订单 item 为未申请售后
  170. $orderItem->aftersale_status = OrderItemModel::AFTERSALE_STATUS_NOAFTER;
  171. $orderItem->refund_status = OrderItemModel::REFUND_STATUS_NOREFUND;
  172. $orderItem->save();
  173. OrderActionModel::add($order, $orderItem, $user, 'user', '用户取消申请售后');
  174. return $aftersale;
  175. });
  176. $this->success('取消成功', $aftersale);
  177. }
  178. public function delete()
  179. {
  180. $user = auth_user();
  181. $id = $this->request->param('id');
  182. $aftersale = AftersaleModel::canDelete()->where('user_id', $user->id)->where('id', $id)->find();
  183. if (!$aftersale) {
  184. $this->error('售后单不存在或不可删除');
  185. }
  186. $order = OrderModel::withTrashed()->where('id', $aftersale['order_id'])->find();
  187. Db::transaction(function () use ($aftersale, $order, $user) {
  188. AftersaleLogModel::add($order, $aftersale, $user, 'user', [
  189. 'log_type' => 'delete',
  190. 'content' => '用户删除售后单',
  191. 'images' => []
  192. ]);
  193. $aftersale->delete(); // 删除售后单(后删除,否则添加记录时 $aftersale 没数据)
  194. });
  195. $this->success('删除成功');
  196. }
  197. }