diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/service/WxOrderService.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/service/WxOrderService.java index 7b1f27f8..db0dc369 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/service/WxOrderService.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/service/WxOrderService.java @@ -62,11 +62,8 @@ import static org.linlinjava.litemall.wx.util.WxResponseCode.*; * 当101用户未付款时,此时用户可以进行的操作是取消订单,或者付款操作 * 当201支付完成而商家未发货时,此时用户可以取消订单并申请退款 * 当301商家已发货时,此时用户可以有确认收货的操作 - * 当401用户确认收货以后,此时用户可以进行的操作是删除订单,评价商品,或者再次购买 - * 当402系统自动确认收货以后,此时用户可以删除订单,评价商品,或者再次购买 - * - *

- * 注意:目前不支持订单退货和售后服务 + * 当401用户确认收货以后,此时用户可以进行的操作是删除订单,评价商品,申请售后,或者再次购买 + * 当402系统自动确认收货以后,此时用户可以删除订单,评价商品,申请售后,或者再次购买 */ @Service public class WxOrderService { @@ -108,6 +105,8 @@ public class WxOrderService { private CouponVerifyService couponVerifyService; @Autowired private TaskService taskService; + @Autowired + private LitemallAftersaleService aftersaleService; /** * 订单列表 @@ -139,6 +138,7 @@ public class WxOrderService { orderVo.put("actualPrice", o.getActualPrice()); orderVo.put("orderStatusText", OrderUtil.orderStatusText(o)); orderVo.put("handleOption", OrderUtil.build(o)); + orderVo.put("aftersaleStatus", o.getAftersaleStatus()); LitemallGroupon groupon = grouponService.queryByOrderId(o.getId()); if (groupon != null) { @@ -180,7 +180,7 @@ public class WxOrderService { } // 订单信息 - LitemallOrder order = orderService.findById(orderId); + LitemallOrder order = orderService.findById(userId, orderId); if (null == order) { return ResponseUtil.fail(ORDER_UNKNOWN, "订单不存在"); } @@ -201,6 +201,7 @@ public class WxOrderService { orderVo.put("actualPrice", order.getActualPrice()); orderVo.put("orderStatusText", OrderUtil.orderStatusText(order)); orderVo.put("handleOption", OrderUtil.build(order)); + orderVo.put("aftersaleStatus", order.getAftersaleStatus()); orderVo.put("expCode", order.getShipChannel()); orderVo.put("expName", expressService.getVendorName(order.getShipChannel())); orderVo.put("expNo", order.getShipSn()); @@ -496,7 +497,7 @@ public class WxOrderService { return ResponseUtil.badArgument(); } - LitemallOrder order = orderService.findById(orderId); + LitemallOrder order = orderService.findById(userId, orderId); if (order == null) { return ResponseUtil.badArgumentValue(); } @@ -553,7 +554,7 @@ public class WxOrderService { return ResponseUtil.badArgument(); } - LitemallOrder order = orderService.findById(orderId); + LitemallOrder order = orderService.findById(userId, orderId); if (order == null) { return ResponseUtil.badArgumentValue(); } @@ -615,7 +616,7 @@ public class WxOrderService { return ResponseUtil.badArgument(); } - LitemallOrder order = orderService.findById(orderId); + LitemallOrder order = orderService.findById(userId, orderId); if (order == null) { return ResponseUtil.badArgumentValue(); } @@ -789,7 +790,7 @@ public class WxOrderService { return ResponseUtil.badArgument(); } - LitemallOrder order = orderService.findById(orderId); + LitemallOrder order = orderService.findById(userId, orderId); if (order == null) { return ResponseUtil.badArgument(); } @@ -834,7 +835,7 @@ public class WxOrderService { return ResponseUtil.badArgument(); } - LitemallOrder order = orderService.findById(orderId); + LitemallOrder order = orderService.findById(userId, orderId); if (order == null) { return ResponseUtil.badArgument(); } @@ -877,7 +878,7 @@ public class WxOrderService { return ResponseUtil.badArgument(); } - LitemallOrder order = orderService.findById(orderId); + LitemallOrder order = orderService.findById(userId, orderId); if (order == null) { return ResponseUtil.badArgument(); } @@ -893,6 +894,8 @@ public class WxOrderService { // 订单order_status没有字段用于标识删除 // 而是存在专门的delete字段表示是否删除 orderService.deleteById(orderId); + // 售后也同时删除 + aftersaleService.deleteByOrderId(userId, orderId); return ResponseUtil.ok(); } @@ -946,7 +949,7 @@ public class WxOrderService { return ResponseUtil.badArgumentValue(); } Integer orderId = orderGoods.getOrderId(); - LitemallOrder order = orderService.findById(orderId); + LitemallOrder order = orderService.findById(userId, orderId); if (order == null) { return ResponseUtil.badArgumentValue(); } diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/util/WxResponseCode.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/util/WxResponseCode.java index 0454cac8..adfabde3 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/util/WxResponseCode.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/util/WxResponseCode.java @@ -38,6 +38,6 @@ public class WxResponseCode { public static final int AFTERSALE_UNALLOWED = 750; public static final int AFTERSALE_INVALID_AMOUNT = 751; - public static final int AFTERSALE_IS_REQUESTED = 752; + public static final int AFTERSALE_INVALID_STATUS = 752; } diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAddressController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAddressController.java index ef75816a..6853ecaa 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAddressController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAddressController.java @@ -168,7 +168,7 @@ public class WxAddressController extends GetRegionService { return ResponseUtil.badArgument(); } - addressService.delete(id); + addressService.delete(userId, id); return ResponseUtil.ok(); } } \ No newline at end of file diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAftersaleController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAftersaleController.java index 85408705..9b51f485 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAftersaleController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxAftersaleController.java @@ -27,6 +27,8 @@ import java.util.Map; * 售后服务 * * 目前只支持订单整体售后,不支持订单商品单个售后 + * + * 一个订单只能有一个售后记录 */ @RestController @RequestMapping("/wx/aftersale") @@ -82,25 +84,18 @@ public class WxAftersaleController { /** * 售后详情 * - * @param id 售后ID + * @param orderId 订单ID * @return 售后详情 */ @GetMapping("detail") - public Object detail(@LoginUser Integer userId, @NotNull Integer id) { + public Object detail(@LoginUser Integer userId, @NotNull Integer orderId) { if (userId == null) { return ResponseUtil.unlogin(); } - LitemallAftersale aftersale = aftersaleService.findById(id); - if(id == null){ - return ResponseUtil.badArgumentValue(); - } - if(!userId.equals(aftersale.getUserId())){ - return ResponseUtil.badArgumentValue(); - } - - LitemallOrder order = orderService.findById(aftersale.getOrderId()); - List orderGoodsList = orderGoodsService.queryByOid(order.getId()); + LitemallOrder order = orderService.findById(userId, orderId); + List orderGoodsList = orderGoodsService.queryByOid(orderId); + LitemallAftersale aftersale = aftersaleService.findByOrderId(userId, orderId); Map data = new HashMap(); data.put("aftersale", aftersale); @@ -130,7 +125,7 @@ public class WxAftersaleController { if(orderId == null){ return ResponseUtil.badArgument(); } - LitemallOrder order = orderService.findById(orderId); + LitemallOrder order = orderService.findById(userId, orderId); if(order == null){ return ResponseUtil.badArgumentValue(); } @@ -138,23 +133,76 @@ public class WxAftersaleController { return ResponseUtil.badArgumentValue(); } + // 订单必须完成才能进入售后流程。 if(!OrderUtil.isConfirmStatus(order) && !OrderUtil.isAutoConfirmStatus(order)){ - return ResponseUtil.fail(WxResponseCode.AFTERSALE_UNALLOWED, "不支持售后"); + return ResponseUtil.fail(WxResponseCode.AFTERSALE_UNALLOWED, "不能申请售后"); } BigDecimal amount = order.getActualPrice().subtract(order.getFreightPrice()); if(aftersale.getAmount().compareTo(amount) > 0){ return ResponseUtil.fail(WxResponseCode.AFTERSALE_INVALID_AMOUNT, "退款金额不正确"); } - - if(aftersaleService.countByOrderIdWithoutReject(userId, orderId) > 0){ - return ResponseUtil.fail(WxResponseCode.AFTERSALE_UNALLOWED, "已申请售后"); + Short afterStatus = order.getAftersaleStatus(); + if(afterStatus.equals(AftersaleConstant.STATUS_RECEPT) || afterStatus.equals(AftersaleConstant.STATUS_REFUND)){ + return ResponseUtil.fail(WxResponseCode.AFTERSALE_INVALID_AMOUNT, "已申请售后"); } + // 如果有旧的售后记录则删除(例如用户已取消,管理员拒绝) + aftersaleService.deleteByOrderId(userId, orderId); + aftersale.setStatus(AftersaleConstant.STATUS_REQUEST); aftersale.setAftersaleSn(aftersaleService.generateAftersaleSn(userId)); aftersale.setUserId(userId); aftersaleService.add(aftersale); + // 订单的aftersale_status和售后记录的status是一致的。 + orderService.updateAftersaleStatus(orderId, AftersaleConstant.STATUS_REQUEST); + return ResponseUtil.ok(); + } + + /** + * 取消售后 + * + * 如果管理员还没有审核,用户可以取消自己的售后申请 + * + * @param userId 用户ID + * @param aftersale 用户售后信息 + * @return 操作结果 + */ + @PostMapping("cancel") + public Object cancel(@LoginUser Integer userId, @RequestBody LitemallAftersale aftersale) { + if (userId == null) { + return ResponseUtil.unlogin(); + } + Integer id = aftersale.getId(); + if(id == null){ + return ResponseUtil.badArgument(); + } + LitemallAftersale aftersaleOne = aftersaleService.findById(id); + if(aftersaleOne == null){ + return ResponseUtil.badArgument(); + } + + Integer orderId = aftersaleOne.getOrderId(); + LitemallOrder order = orderService.findById(userId, orderId); + if(!order.getUserId().equals(userId)){ + return ResponseUtil.badArgumentValue(); + } + + // 订单必须完成才能进入售后流程。 + if(!OrderUtil.isConfirmStatus(order) && !OrderUtil.isAutoConfirmStatus(order)){ + return ResponseUtil.fail(WxResponseCode.AFTERSALE_UNALLOWED, "不支持售后"); + } + Short afterStatus = order.getAftersaleStatus(); + if(!afterStatus.equals(AftersaleConstant.STATUS_REQUEST)){ + return ResponseUtil.fail(WxResponseCode.AFTERSALE_INVALID_STATUS, "不能取消售后"); + } + + aftersale.setStatus(AftersaleConstant.STATUS_CANCEL); + aftersale.setUserId(userId); + aftersaleService.updateById(aftersale); + + // 订单的aftersale_status和售后记录的status是一致的。 + orderService.updateAftersaleStatus(orderId, AftersaleConstant.STATUS_CANCEL); return ResponseUtil.ok(); } diff --git a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxGrouponController.java b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxGrouponController.java index ffc9c0a1..0194bcc5 100644 --- a/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxGrouponController.java +++ b/litemall-wx-api/src/main/java/org/linlinjava/litemall/wx/web/WxGrouponController.java @@ -98,7 +98,7 @@ public class WxGrouponController { } // 订单信息 - LitemallOrder order = orderService.findById(groupon.getOrderId()); + LitemallOrder order = orderService.findById(userId, groupon.getOrderId()); if (null == order) { return ResponseUtil.fail(ORDER_UNKNOWN, "订单不存在"); } @@ -229,7 +229,7 @@ public class WxGrouponController { LitemallGrouponRules rules; LitemallUser creator; for (LitemallGroupon groupon : myGroupons) { - order = orderService.findById(groupon.getOrderId()); + order = orderService.findById(userId, groupon.getOrderId()); rules = rulesService.findById(groupon.getRulesId()); creator = userService.findById(groupon.getCreatorUserId()); diff --git a/litemall-wx/pages/ucenter/aftersaleDetail/aftersaleDetail.js b/litemall-wx/pages/ucenter/aftersaleDetail/aftersaleDetail.js index c53484a5..fd7fbc0c 100644 --- a/litemall-wx/pages/ucenter/aftersaleDetail/aftersaleDetail.js +++ b/litemall-wx/pages/ucenter/aftersaleDetail/aftersaleDetail.js @@ -3,18 +3,18 @@ var api = require('../../../config/api.js'); Page({ data: { - aftersaleId: 0, + orderId: 0, order: {}, orderGoods: [], aftersale: {}, - statusColumns: ['已申请', '处理中', '退款成功', '已拒绝'], + statusColumns: ['未申请', '已申请,待审核', '审核通过,待退款', '退款成功', '审核不通过,已拒绝'], typeColumns: ['未收货退款', '不退货退款', '退货退款'], fileList: [] }, onLoad: function (options) { // 页面初始化 options为页面跳转所带来的参数 this.setData({ - aftersaleId: options.id + orderId: options.id }); this.getAftersaleDetail(); }, @@ -29,7 +29,7 @@ Page({ let that = this; util.request(api.AftersaleDetail, { - id: that.data.aftersaleId + orderId: that.data.orderId }).then(function (res) { if (res.errno === 0) { let _fileList = [] diff --git a/litemall-wx/pages/ucenter/aftersaleList/aftersaleList.js b/litemall-wx/pages/ucenter/aftersaleList/aftersaleList.js index bbc8607c..bc1d2037 100644 --- a/litemall-wx/pages/ucenter/aftersaleList/aftersaleList.js +++ b/litemall-wx/pages/ucenter/aftersaleList/aftersaleList.js @@ -4,7 +4,7 @@ var api = require('../../../config/api.js'); Page({ data: { aftersaleList: [], - showType: 0, + showType: 1, page: 1, limit: 10, totalPages: 1 diff --git a/litemall-wx/pages/ucenter/aftersaleList/aftersaleList.wxml b/litemall-wx/pages/ucenter/aftersaleList/aftersaleList.wxml index 1d9d300c..80fdd1e9 100644 --- a/litemall-wx/pages/ucenter/aftersaleList/aftersaleList.wxml +++ b/litemall-wx/pages/ucenter/aftersaleList/aftersaleList.wxml @@ -1,15 +1,15 @@ - + 申请中 - + 处理中 - + 已完成 - + 已拒绝 @@ -20,9 +20,9 @@ - + - 服务编号:{{item.aftersale.aftersaleSn}} + 售后编号:{{item.aftersale.aftersaleSn}} diff --git a/litemall-wx/pages/ucenter/orderDetail/orderDetail.js b/litemall-wx/pages/ucenter/orderDetail/orderDetail.js index 0a18ba27..feea3934 100644 --- a/litemall-wx/pages/ucenter/orderDetail/orderDetail.js +++ b/litemall-wx/pages/ucenter/orderDetail/orderDetail.js @@ -192,7 +192,12 @@ Page({ }, // “申请售后”点击效果 aftersaleOrder: function () { - util.redirect('/pages/ucenter/aftersale/aftersale?id=' + this.data.orderId ); + if(this.data.orderInfo.aftersaleStatus === 0){ + util.redirect('/pages/ucenter/aftersale/aftersale?id=' + this.data.orderId ); + } + else{ + util.redirect('/pages/ucenter/aftersaleDetail/aftersaleDetail?id=' + this.data.orderId); + } }, onReady: function() { // 页面渲染完成