zhaowenxuan
2024-10-21 936e2c79cd741472a6acfe28d730eb644b082cf7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
package com.ltkj.web.controller.mall;
 
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ltkj.common.core.domain.AjaxResult;
import com.ltkj.common.exception.user.DataNotFoundException;
import com.ltkj.framework.config.UserHoder;
import com.ltkj.hosp.domain.TjCustomer;
import com.ltkj.hosp.domain.Wxuser;
import com.ltkj.hosp.service.ITjCustomerService;
import com.ltkj.mall.domain.MallAftersale;
import com.ltkj.mall.domain.MallOrder;
import com.ltkj.mall.domain.MallOrderGoods;
import com.ltkj.mall.mallOrderUtils.AftersaleConstant;
import com.ltkj.mall.mallOrderUtils.OrderConstants;
import com.ltkj.mall.mallOrderUtils.OrderHandleOption;
import com.ltkj.mall.mallOrderUtils.OrderUtil;
import com.ltkj.mall.service.IMallAftersaleService;
import com.ltkj.mall.service.IMallOrderGoodsService;
import com.ltkj.mall.service.IMallOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.weaver.loadtime.Aj;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
 
import javax.annotation.Resource;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.*;
 
/**
 * @Company: 西安路泰科技有限公司
 * @Author: lige
 * @Date: 2023/7/14 09:57
 */
@RestController
@RequestMapping("/cus/aftersale")
@Validated
@Api(tags = "小程序申请售后退款接口")
public class WxMallAftersaleController {
 
    private final Log logger = LogFactory.getLog(WxMallAftersaleController.class);
 
    @Autowired
    private IMallAftersaleService aftersaleService;
    @Autowired
    private IMallOrderService orderService;
    @Autowired
    private IMallOrderGoodsService orderGoodsService;
    @Resource
    private ITjCustomerService customerService;
 
    /**
     * 售后列表
     * 售后状态,0是可申请,1是用户已申请,2是管理员审核通过,3是管理员退款成功,4是管理员审核拒绝,5是用户已取消
     * @return 售后列表
     */
    @GetMapping("/list")
    @ApiOperation(value = "小程序申请售后列表接口")
    public AjaxResult list(Long status){
        Wxuser wxuser = UserHoder.getWxuser();
        if (null == wxuser) {
            return AjaxResult.error();
        }
        LambdaQueryWrapper<MallAftersale> wq=new LambdaQueryWrapper<>();
        wq.eq(MallAftersale::getStatus,status);
        List<MallAftersale> list = aftersaleService.list(wq);
        for (MallAftersale aftersale : list) {
            List<MallOrderGoods> orderGoodsList = orderGoodsService.list(new LambdaQueryWrapper<MallOrderGoods>()
                    .eq(MallOrderGoods::getOrderId,aftersale.getOrderId())
            );
            aftersale.setOrderGoodsList(orderGoodsList);
        }
        return AjaxResult.success(list);
 
    }
 
    /**
     * 售后详情
     *
     * @param orderId 订单ID
     * @return 售后详情
     */
    @GetMapping("/detail")
    @ApiOperation(value = "售后详情")
    public Object detail(@RequestParam String orderId) {
        MallOrder order = Optional.ofNullable(orderService.getOne(new LambdaQueryWrapper<MallOrder>()
                        .eq(MallOrder::getId,orderId)
                ,false)).orElseThrow(()-> new DataNotFoundException("订单不存在"));
 
        order.setOrderHandleOption(OrderConstants.build(order));
        List<MallOrderGoods> orderGoodsList = orderGoodsService.list(new LambdaQueryWrapper<MallOrderGoods>()
                .eq(MallOrderGoods::getOrderId,orderId)
        );
        order.setGoodsVoList(orderGoodsList);
        MallAftersale aftersale = aftersaleService.getOne(new LambdaQueryWrapper<MallAftersale>()
                        .eq(MallAftersale::getOrderId,orderId)
                ,false);
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("aftersale", aftersale);
        data.put("order", order);
        return AjaxResult.success(data);
    }
 
 
 
    /**
     * 申请售后
     * @return 操作结果
     */
    @PostMapping("/submit")
    @ApiOperation(value = "申请售后")
    public AjaxResult submit(@Valid @RequestBody MallAftersale aftersaleAdd) {
        Wxuser wxuser = UserHoder.getWxuser();
        if (null == wxuser) {
            return AjaxResult.error();
        }
        MallAftersale aftersale = Convert.convert(new TypeReference<MallAftersale>() {}, aftersaleAdd);
        aftersale.setUserId(wxuser.getId());
 
        MallOrder order = Optional.ofNullable(orderService.getOne(new LambdaQueryWrapper<MallOrder>()
                        .eq(MallOrder::getId,aftersale.getOrderId())
                        .eq(MallOrder::getUserId,aftersale.getUserId())
                ,false)).orElseThrow(()-> new DataNotFoundException("订单不存在"));
 
        OrderHandleOption handleOption = OrderUtil.build(order);
        if (!handleOption.isRefund()) {
            return AjaxResult.error("订单不能退款");
        }
        // 设置订单申请退款状态
        order.setOrderStatus(OrderUtil.STATUS_REFUND.longValue());
 
        // 订单必须完成才能进入售后流程。
        if(OrderConstants.isShipStatus(order)){
            return AjaxResult.error("订单已完成 不能申请售后");
        }
        BigDecimal amount = order.getActualPrice();
        if(aftersale.getAmount().compareTo(amount) > 0){
            return AjaxResult.error("退款金额不正确");
        }
        Integer afterStatus = order.getAftersaleStatus();
        if(afterStatus.equals(AftersaleConstant.STATUS_RECEPT) || afterStatus.equals(AftersaleConstant.STATUS_REFUND)){
            return AjaxResult.error("已申请售后");
        }
        // 如果有旧的售后记录则删除(例如用户已取消,管理员拒绝)
        aftersaleService.remove(new LambdaQueryWrapper<MallAftersale>()
                .eq(MallAftersale::getOrderId,order.getId())
                .eq(MallAftersale::getUserId,aftersale.getUserId())
        );
 
        TjCustomer one = customerService.getOne(new LambdaQueryWrapper<TjCustomer>().eq(TjCustomer::getCusIdcard, order.getIdCard()));
        aftersale.setCusName(one.getCusName());
        aftersale.setCusIdCard(order.getIdCard());
        aftersale.setCreateTime(new Date());
        aftersale.setStatus(Long.valueOf(AftersaleConstant.STATUS_REQUEST));
        aftersale.setAftersaleSn(aftersaleService.generateAftersaleSn(aftersale.getUserId()));
        aftersaleService.save(aftersale);
 
        // 订单的aftersale_status和售后记录的status是一致的。
        order.setAftersaleStatus(Integer.valueOf(AftersaleConstant.STATUS_REQUEST));
        order.setUpdateTime(new Date());
        orderService.updateById(order);
 
        return AjaxResult.success();
    }
 
    /**
     * 取消售后
     * 如果管理员还没有审核,用户可以取消自己的售后申请
     * @return 操作结果
     */
    @GetMapping("/cancel")
    @ApiOperation(value = "取消售后")
    public Object cancel(@RequestParam(value = "id") String id) {
        Wxuser wxuser = UserHoder.getWxuser();
        if (null == wxuser) {
            return AjaxResult.error();
        }
 
        MallAftersale aftersale = Optional.ofNullable(aftersaleService.getOne(new LambdaQueryWrapper<MallAftersale>()
                        .eq(MallAftersale::getOrderId,id)
                        .eq(MallAftersale::getUserId,wxuser.getId())
                ,false)).orElseThrow(()->new DataNotFoundException("售后数据不存在"));
 
        MallOrder order = orderService.getById(aftersale.getOrderId());
        // 订单必须完成才能进入售后流程。
        if(OrderConstants.isShipStatus(order)){
            return AjaxResult.error("不支持售后");
        }
        Integer afterStatus = order.getAftersaleStatus();
        if(!afterStatus.equals(Integer.valueOf(AftersaleConstant.STATUS_REQUEST))){
            return AjaxResult.error("不能取消售后");
        }
 
        aftersale.setStatus(Long.valueOf(AftersaleConstant.STATUS_CANCEL));
        aftersale.setUpdateTime(new Date());
        aftersaleService.updateMallAftersale(aftersale);
        // 订单的aftersale_status和售后记录的status是一致的。
        order.setAftersaleStatus(Integer.valueOf(AftersaleConstant.STATUS_CANCEL));
        order.setUpdateTime(new Date());
        order.setOrderStatus(Long.valueOf(OrderConstants.STATUS_PAY));
        orderService.updateById(order);
 
        return AjaxResult.success();
    }
 
 
 
}