Browse Source

chore[litemall-wx, litemall-wx-api]: 小商城优化

Junling Bu 6 years ago
parent
commit
4611d829e3

+ 16 - 13
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系统自动确认收货以后,此时用户可以删除订单,评价商品,或者再次购买
- *
- * <p>
- * 注意:目前不支持订单退货和售后服务
+ * 当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();
         }

+ 1 - 1
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;
 
 }

+ 1 - 1
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();
 	}
 }

+ 65 - 17
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<LitemallOrderGoods> orderGoodsList = orderGoodsService.queryByOid(order.getId());
+        LitemallOrder order = orderService.findById(userId, orderId);
+        List<LitemallOrderGoods> orderGoodsList = orderGoodsService.queryByOid(orderId);
+        LitemallAftersale aftersale = aftersaleService.findByOrderId(userId, orderId);
 
         Map<String, Object> data = new HashMap<String, Object>();
         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();
     }
 

+ 2 - 2
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());
 

+ 4 - 4
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 = []

+ 1 - 1
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

+ 6 - 6
litemall-wx/pages/ucenter/aftersaleList/aftersaleList.wxml

@@ -1,15 +1,15 @@
 <view class="container">
   <view class="aftersales-switch">
-    <view class="item {{ showType == 0 ? 'active' : ''}}" bindtap="switchTab" data-index='0'>
+    <view class="item {{ showType == 1 ? 'active' : ''}}" bindtap="switchTab" data-index='1'>
       <view class="txt">申请中</view>
     </view>
-    <view class="item {{ showType == 1 ? 'active' : ''}}" bindtap="switchTab" data-index='1'>
+    <view class="item {{ showType == 2 ? 'active' : ''}}" bindtap="switchTab" data-index='2'>
       <view class="txt">处理中</view>
     </view>
-    <view class="item {{ showType == 2 ? 'active' : ''}}" bindtap="switchTab" data-index='2'>
+    <view class="item {{ showType == 3 ? 'active' : ''}}" bindtap="switchTab" data-index='3'>
       <view class="txt">已完成</view>
     </view>
-    <view class="item {{ showType == 3 ? 'active' : ''}}" bindtap="switchTab" data-index='3'>
+    <view class="item {{ showType == 4 ? 'active' : ''}}" bindtap="switchTab" data-index='4'>
       <view class="txt">已拒绝</view>
     </view>
   </view>
@@ -20,9 +20,9 @@
   </view>
 
   <view class="aftersales">
-    <navigator url="../aftersaleDetail/aftersaleDetail?id={{item.aftersale.id}}" class="aftersale" open-type="redirect" wx:for="{{aftersaleList}}" wx:key="id">
+    <navigator url="../aftersaleDetail/aftersaleDetail?id={{item.aftersale.orderId}}" class="aftersale" open-type="redirect" wx:for="{{aftersaleList}}" wx:key="id">
       <view class="h">
-        <view class="l">服务编号:{{item.aftersale.aftersaleSn}}</view>
+        <view class="l">售后编号:{{item.aftersale.aftersaleSn}}</view>
       </view>
       <view class="goods" wx:for="{{item.goodsList}}" wx:key="id" wx:for-item="gitem">
         <view class="img">

+ 6 - 1
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() {
     // 页面渲染完成