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 wq=new LambdaQueryWrapper<>(); wq.eq(MallAftersale::getStatus,status); List list = aftersaleService.list(wq); for (MallAftersale aftersale : list) { List orderGoodsList = orderGoodsService.list(new LambdaQueryWrapper() .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() .eq(MallOrder::getId,orderId) ,false)).orElseThrow(()-> new DataNotFoundException("订单不存在")); order.setOrderHandleOption(OrderConstants.build(order)); List orderGoodsList = orderGoodsService.list(new LambdaQueryWrapper() .eq(MallOrderGoods::getOrderId,orderId) ); order.setGoodsVoList(orderGoodsList); MallAftersale aftersale = aftersaleService.getOne(new LambdaQueryWrapper() .eq(MallAftersale::getOrderId,orderId) ,false); Map data = new HashMap(); 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() {}, aftersaleAdd); aftersale.setUserId(wxuser.getId()); MallOrder order = Optional.ofNullable(orderService.getOne(new LambdaQueryWrapper() .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() .eq(MallAftersale::getOrderId,order.getId()) .eq(MallAftersale::getUserId,aftersale.getUserId()) ); TjCustomer one = customerService.getOne(new LambdaQueryWrapper().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() .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(); } }