Commit 4611d829 authored by Junling Bu's avatar Junling Bu
Browse files

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

parent 11a95ac7
...@@ -62,11 +62,8 @@ import static org.linlinjava.litemall.wx.util.WxResponseCode.*; ...@@ -62,11 +62,8 @@ import static org.linlinjava.litemall.wx.util.WxResponseCode.*;
* 当101用户未付款时,此时用户可以进行的操作是取消订单,或者付款操作 * 当101用户未付款时,此时用户可以进行的操作是取消订单,或者付款操作
* 当201支付完成而商家未发货时,此时用户可以取消订单并申请退款 * 当201支付完成而商家未发货时,此时用户可以取消订单并申请退款
* 当301商家已发货时,此时用户可以有确认收货的操作 * 当301商家已发货时,此时用户可以有确认收货的操作
* 当401用户确认收货以后,此时用户可以进行的操作是删除订单,评价商品,或者再次购买 * 当401用户确认收货以后,此时用户可以进行的操作是删除订单,评价商品,申请售后,或者再次购买
* 当402系统自动确认收货以后,此时用户可以删除订单,评价商品,或者再次购买 * 当402系统自动确认收货以后,此时用户可以删除订单,评价商品,申请售后,或者再次购买
*
* <p>
* 注意:目前不支持订单退货和售后服务
*/ */
@Service @Service
public class WxOrderService { public class WxOrderService {
...@@ -108,6 +105,8 @@ public class WxOrderService { ...@@ -108,6 +105,8 @@ public class WxOrderService {
private CouponVerifyService couponVerifyService; private CouponVerifyService couponVerifyService;
@Autowired @Autowired
private TaskService taskService; private TaskService taskService;
@Autowired
private LitemallAftersaleService aftersaleService;
/** /**
* 订单列表 * 订单列表
...@@ -139,6 +138,7 @@ public class WxOrderService { ...@@ -139,6 +138,7 @@ public class WxOrderService {
orderVo.put("actualPrice", o.getActualPrice()); orderVo.put("actualPrice", o.getActualPrice());
orderVo.put("orderStatusText", OrderUtil.orderStatusText(o)); orderVo.put("orderStatusText", OrderUtil.orderStatusText(o));
orderVo.put("handleOption", OrderUtil.build(o)); orderVo.put("handleOption", OrderUtil.build(o));
orderVo.put("aftersaleStatus", o.getAftersaleStatus());
LitemallGroupon groupon = grouponService.queryByOrderId(o.getId()); LitemallGroupon groupon = grouponService.queryByOrderId(o.getId());
if (groupon != null) { if (groupon != null) {
...@@ -180,7 +180,7 @@ public class WxOrderService { ...@@ -180,7 +180,7 @@ public class WxOrderService {
} }
// 订单信息 // 订单信息
LitemallOrder order = orderService.findById(orderId); LitemallOrder order = orderService.findById(userId, orderId);
if (null == order) { if (null == order) {
return ResponseUtil.fail(ORDER_UNKNOWN, "订单不存在"); return ResponseUtil.fail(ORDER_UNKNOWN, "订单不存在");
} }
...@@ -201,6 +201,7 @@ public class WxOrderService { ...@@ -201,6 +201,7 @@ public class WxOrderService {
orderVo.put("actualPrice", order.getActualPrice()); orderVo.put("actualPrice", order.getActualPrice());
orderVo.put("orderStatusText", OrderUtil.orderStatusText(order)); orderVo.put("orderStatusText", OrderUtil.orderStatusText(order));
orderVo.put("handleOption", OrderUtil.build(order)); orderVo.put("handleOption", OrderUtil.build(order));
orderVo.put("aftersaleStatus", order.getAftersaleStatus());
orderVo.put("expCode", order.getShipChannel()); orderVo.put("expCode", order.getShipChannel());
orderVo.put("expName", expressService.getVendorName(order.getShipChannel())); orderVo.put("expName", expressService.getVendorName(order.getShipChannel()));
orderVo.put("expNo", order.getShipSn()); orderVo.put("expNo", order.getShipSn());
...@@ -496,7 +497,7 @@ public class WxOrderService { ...@@ -496,7 +497,7 @@ public class WxOrderService {
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
LitemallOrder order = orderService.findById(orderId); LitemallOrder order = orderService.findById(userId, orderId);
if (order == null) { if (order == null) {
return ResponseUtil.badArgumentValue(); return ResponseUtil.badArgumentValue();
} }
...@@ -553,7 +554,7 @@ public class WxOrderService { ...@@ -553,7 +554,7 @@ public class WxOrderService {
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
LitemallOrder order = orderService.findById(orderId); LitemallOrder order = orderService.findById(userId, orderId);
if (order == null) { if (order == null) {
return ResponseUtil.badArgumentValue(); return ResponseUtil.badArgumentValue();
} }
...@@ -615,7 +616,7 @@ public class WxOrderService { ...@@ -615,7 +616,7 @@ public class WxOrderService {
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
LitemallOrder order = orderService.findById(orderId); LitemallOrder order = orderService.findById(userId, orderId);
if (order == null) { if (order == null) {
return ResponseUtil.badArgumentValue(); return ResponseUtil.badArgumentValue();
} }
...@@ -789,7 +790,7 @@ public class WxOrderService { ...@@ -789,7 +790,7 @@ public class WxOrderService {
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
LitemallOrder order = orderService.findById(orderId); LitemallOrder order = orderService.findById(userId, orderId);
if (order == null) { if (order == null) {
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
...@@ -834,7 +835,7 @@ public class WxOrderService { ...@@ -834,7 +835,7 @@ public class WxOrderService {
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
LitemallOrder order = orderService.findById(orderId); LitemallOrder order = orderService.findById(userId, orderId);
if (order == null) { if (order == null) {
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
...@@ -877,7 +878,7 @@ public class WxOrderService { ...@@ -877,7 +878,7 @@ public class WxOrderService {
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
LitemallOrder order = orderService.findById(orderId); LitemallOrder order = orderService.findById(userId, orderId);
if (order == null) { if (order == null) {
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
...@@ -893,6 +894,8 @@ public class WxOrderService { ...@@ -893,6 +894,8 @@ public class WxOrderService {
// 订单order_status没有字段用于标识删除 // 订单order_status没有字段用于标识删除
// 而是存在专门的delete字段表示是否删除 // 而是存在专门的delete字段表示是否删除
orderService.deleteById(orderId); orderService.deleteById(orderId);
// 售后也同时删除
aftersaleService.deleteByOrderId(userId, orderId);
return ResponseUtil.ok(); return ResponseUtil.ok();
} }
...@@ -946,7 +949,7 @@ public class WxOrderService { ...@@ -946,7 +949,7 @@ public class WxOrderService {
return ResponseUtil.badArgumentValue(); return ResponseUtil.badArgumentValue();
} }
Integer orderId = orderGoods.getOrderId(); Integer orderId = orderGoods.getOrderId();
LitemallOrder order = orderService.findById(orderId); LitemallOrder order = orderService.findById(userId, orderId);
if (order == null) { if (order == null) {
return ResponseUtil.badArgumentValue(); return ResponseUtil.badArgumentValue();
} }
......
...@@ -38,6 +38,6 @@ public class WxResponseCode { ...@@ -38,6 +38,6 @@ public class WxResponseCode {
public static final int AFTERSALE_UNALLOWED = 750; public static final int AFTERSALE_UNALLOWED = 750;
public static final int AFTERSALE_INVALID_AMOUNT = 751; public static final int AFTERSALE_INVALID_AMOUNT = 751;
public static final int AFTERSALE_IS_REQUESTED = 752; public static final int AFTERSALE_INVALID_STATUS = 752;
} }
...@@ -168,7 +168,7 @@ public class WxAddressController extends GetRegionService { ...@@ -168,7 +168,7 @@ public class WxAddressController extends GetRegionService {
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
addressService.delete(id); addressService.delete(userId, id);
return ResponseUtil.ok(); return ResponseUtil.ok();
} }
} }
\ No newline at end of file
...@@ -27,6 +27,8 @@ import java.util.Map; ...@@ -27,6 +27,8 @@ import java.util.Map;
* 售后服务 * 售后服务
* *
* 目前只支持订单整体售后,不支持订单商品单个售后 * 目前只支持订单整体售后,不支持订单商品单个售后
*
* 一个订单只能有一个售后记录
*/ */
@RestController @RestController
@RequestMapping("/wx/aftersale") @RequestMapping("/wx/aftersale")
...@@ -82,25 +84,18 @@ public class WxAftersaleController { ...@@ -82,25 +84,18 @@ public class WxAftersaleController {
/** /**
* 售后详情 * 售后详情
* *
* @param id 售后ID * @param orderId 订单ID
* @return 售后详情 * @return 售后详情
*/ */
@GetMapping("detail") @GetMapping("detail")
public Object detail(@LoginUser Integer userId, @NotNull Integer id) { public Object detail(@LoginUser Integer userId, @NotNull Integer orderId) {
if (userId == null) { if (userId == null) {
return ResponseUtil.unlogin(); return ResponseUtil.unlogin();
} }
LitemallAftersale aftersale = aftersaleService.findById(id); LitemallOrder order = orderService.findById(userId, orderId);
if(id == null){ List<LitemallOrderGoods> orderGoodsList = orderGoodsService.queryByOid(orderId);
return ResponseUtil.badArgumentValue(); LitemallAftersale aftersale = aftersaleService.findByOrderId(userId, orderId);
}
if(!userId.equals(aftersale.getUserId())){
return ResponseUtil.badArgumentValue();
}
LitemallOrder order = orderService.findById(aftersale.getOrderId());
List<LitemallOrderGoods> orderGoodsList = orderGoodsService.queryByOid(order.getId());
Map<String, Object> data = new HashMap<String, Object>(); Map<String, Object> data = new HashMap<String, Object>();
data.put("aftersale", aftersale); data.put("aftersale", aftersale);
...@@ -130,7 +125,7 @@ public class WxAftersaleController { ...@@ -130,7 +125,7 @@ public class WxAftersaleController {
if(orderId == null){ if(orderId == null){
return ResponseUtil.badArgument(); return ResponseUtil.badArgument();
} }
LitemallOrder order = orderService.findById(orderId); LitemallOrder order = orderService.findById(userId, orderId);
if(order == null){ if(order == null){
return ResponseUtil.badArgumentValue(); return ResponseUtil.badArgumentValue();
} }
...@@ -138,23 +133,76 @@ public class WxAftersaleController { ...@@ -138,23 +133,76 @@ public class WxAftersaleController {
return ResponseUtil.badArgumentValue(); return ResponseUtil.badArgumentValue();
} }
// 订单必须完成才能进入售后流程。
if(!OrderUtil.isConfirmStatus(order) && !OrderUtil.isAutoConfirmStatus(order)){ 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()); BigDecimal amount = order.getActualPrice().subtract(order.getFreightPrice());
if(aftersale.getAmount().compareTo(amount) > 0){ if(aftersale.getAmount().compareTo(amount) > 0){
return ResponseUtil.fail(WxResponseCode.AFTERSALE_INVALID_AMOUNT, "退款金额不正确"); return ResponseUtil.fail(WxResponseCode.AFTERSALE_INVALID_AMOUNT, "退款金额不正确");
} }
Short afterStatus = order.getAftersaleStatus();
if(aftersaleService.countByOrderIdWithoutReject(userId, orderId) > 0){ if(afterStatus.equals(AftersaleConstant.STATUS_RECEPT) || afterStatus.equals(AftersaleConstant.STATUS_REFUND)){
return ResponseUtil.fail(WxResponseCode.AFTERSALE_UNALLOWED, "已申请售后"); return ResponseUtil.fail(WxResponseCode.AFTERSALE_INVALID_AMOUNT, "已申请售后");
} }
// 如果有旧的售后记录则删除(例如用户已取消,管理员拒绝)
aftersaleService.deleteByOrderId(userId, orderId);
aftersale.setStatus(AftersaleConstant.STATUS_REQUEST); aftersale.setStatus(AftersaleConstant.STATUS_REQUEST);
aftersale.setAftersaleSn(aftersaleService.generateAftersaleSn(userId)); aftersale.setAftersaleSn(aftersaleService.generateAftersaleSn(userId));
aftersale.setUserId(userId); aftersale.setUserId(userId);
aftersaleService.add(aftersale); 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(); return ResponseUtil.ok();
} }
......
...@@ -98,7 +98,7 @@ public class WxGrouponController { ...@@ -98,7 +98,7 @@ public class WxGrouponController {
} }
// 订单信息 // 订单信息
LitemallOrder order = orderService.findById(groupon.getOrderId()); LitemallOrder order = orderService.findById(userId, groupon.getOrderId());
if (null == order) { if (null == order) {
return ResponseUtil.fail(ORDER_UNKNOWN, "订单不存在"); return ResponseUtil.fail(ORDER_UNKNOWN, "订单不存在");
} }
...@@ -229,7 +229,7 @@ public class WxGrouponController { ...@@ -229,7 +229,7 @@ public class WxGrouponController {
LitemallGrouponRules rules; LitemallGrouponRules rules;
LitemallUser creator; LitemallUser creator;
for (LitemallGroupon groupon : myGroupons) { for (LitemallGroupon groupon : myGroupons) {
order = orderService.findById(groupon.getOrderId()); order = orderService.findById(userId, groupon.getOrderId());
rules = rulesService.findById(groupon.getRulesId()); rules = rulesService.findById(groupon.getRulesId());
creator = userService.findById(groupon.getCreatorUserId()); creator = userService.findById(groupon.getCreatorUserId());
......
...@@ -3,18 +3,18 @@ var api = require('../../../config/api.js'); ...@@ -3,18 +3,18 @@ var api = require('../../../config/api.js');
Page({ Page({
data: { data: {
aftersaleId: 0, orderId: 0,
order: {}, order: {},
orderGoods: [], orderGoods: [],
aftersale: {}, aftersale: {},
statusColumns: ['已申请', '处理中', '退款成功', '已拒绝'], statusColumns: ['未申请', '已申请,待审核', '审核通过,待退款', '退款成功', '审核不通过,已拒绝'],
typeColumns: ['未收货退款', '不退货退款', '退货退款'], typeColumns: ['未收货退款', '不退货退款', '退货退款'],
fileList: [] fileList: []
}, },
onLoad: function (options) { onLoad: function (options) {
// 页面初始化 options为页面跳转所带来的参数 // 页面初始化 options为页面跳转所带来的参数
this.setData({ this.setData({
aftersaleId: options.id orderId: options.id
}); });
this.getAftersaleDetail(); this.getAftersaleDetail();
}, },
...@@ -29,7 +29,7 @@ Page({ ...@@ -29,7 +29,7 @@ Page({
let that = this; let that = this;
util.request(api.AftersaleDetail, { util.request(api.AftersaleDetail, {
id: that.data.aftersaleId orderId: that.data.orderId
}).then(function (res) { }).then(function (res) {
if (res.errno === 0) { if (res.errno === 0) {
let _fileList = [] let _fileList = []
......
...@@ -4,7 +4,7 @@ var api = require('../../../config/api.js'); ...@@ -4,7 +4,7 @@ var api = require('../../../config/api.js');
Page({ Page({
data: { data: {
aftersaleList: [], aftersaleList: [],
showType: 0, showType: 1,
page: 1, page: 1,
limit: 10, limit: 10,
totalPages: 1 totalPages: 1
......
<view class="container"> <view class="container">
<view class="aftersales-switch"> <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 class="txt">申请中</view>
</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 class="txt">处理中</view>
</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 class="txt">已完成</view>
</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 class="txt">已拒绝</view>
</view> </view>
</view> </view>
...@@ -20,9 +20,9 @@ ...@@ -20,9 +20,9 @@
</view> </view>
<view class="aftersales"> <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="h">
<view class="l">服务编号:{{item.aftersale.aftersaleSn}}</view> <view class="l">售后编号:{{item.aftersale.aftersaleSn}}</view>
</view> </view>
<view class="goods" wx:for="{{item.goodsList}}" wx:key="id" wx:for-item="gitem"> <view class="goods" wx:for="{{item.goodsList}}" wx:key="id" wx:for-item="gitem">
<view class="img"> <view class="img">
......
...@@ -192,7 +192,12 @@ Page({ ...@@ -192,7 +192,12 @@ Page({
}, },
// “申请售后”点击效果 // “申请售后”点击效果
aftersaleOrder: function () { 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() { onReady: function() {
// 页面渲染完成 // 页面渲染完成
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment