From 585025c8ae4add40e7b76a9a2ddcaf324fc4b12d Mon Sep 17 00:00:00 2001 From: czc Date: Mon, 17 Jul 2023 15:31:50 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=90=8E=E5=8F=B0=E5=94=AE?= =?UTF-8?q?=E5=90=8E=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/common/constant/Constants.java | 6 ++ .../com/cyl/h5/service/H5OrderService.java | 1 + .../oms/controller/AftersaleController.java | 30 ++++++ .../request/DealWithAftersaleRequest.java | 23 +++++ .../oms/pojo/vo/ManagerRefundOrderVo.java | 3 + .../manager/oms/service/AftersaleService.java | 92 +++++++++++++++++++ .../resources/mapper/oms/AftersaleMapper.xml | 3 +- 7 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 ruoyi-mall/src/main/java/com/cyl/manager/oms/pojo/request/DealWithAftersaleRequest.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index e5e1a09..493cfb7 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -247,4 +247,10 @@ public class Constants public static final Integer INCOMPLETE = 0; public static final Integer COMPLETE = 1; } + + public static class OptType { + public static final Integer AGREE = 1; + public static final Integer REFUSE = 2; + public static final Integer GIVING = 3; + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java index 906ba99..842314e 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java @@ -691,6 +691,7 @@ public class H5OrderService { * @param orderId 订单id * @return */ + @Transactional public String cancelRefund(Long orderId) { Order order = orderMapper.selectById(orderId); if (order == null){ diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/oms/controller/AftersaleController.java b/ruoyi-mall/src/main/java/com/cyl/manager/oms/controller/AftersaleController.java index de33f7f..0b11abe 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/oms/controller/AftersaleController.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/oms/controller/AftersaleController.java @@ -2,10 +2,16 @@ package com.cyl.manager.oms.controller; import java.util.List; +import com.cyl.manager.oms.pojo.request.DealWithAftersaleRequest; import com.cyl.manager.oms.pojo.request.ManagerAftersaleOrderRequest; import com.cyl.manager.oms.pojo.vo.ManagerRefundOrderVo; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.core.redis.RedisService; +import com.ruoyi.common.utils.SecurityUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Page; @@ -38,11 +44,14 @@ import com.ruoyi.common.utils.poi.ExcelUtil; @Api(description ="订单售后接口列表") @RestController @RequestMapping("/oms/aftersale") +@Slf4j public class AftersaleController extends BaseController { @Autowired private AftersaleService service; @Autowired private AftersaleConvert convert; + @Autowired + private RedisService redisService; @ApiOperation("查询订单售后列表") @PreAuthorize("@ss.hasPermi('oms:aftersale:list')") @@ -93,4 +102,25 @@ public class AftersaleController extends BaseController { public ResponseEntity remove(@PathVariable Long id) { return ResponseEntity.ok(service.deleteById(id)); } + + @ApiOperation("售后订单操作") + @PostMapping("/dealWith") + public ResponseEntity updateStatus(@RequestBody DealWithAftersaleRequest request){ + LoginUser user = SecurityUtils.getLoginUser(); + String redisKey = "manager_oms_order_updateOrderStatus_" + user.getUserId(); + String redisValue = user.getUserId() + "_" + System.currentTimeMillis(); + try { + redisService.lock(redisKey, redisValue, 60); + return ResponseEntity.ok(service.dealWith(request, user)); + } catch (Exception e) { + log.error("售后订单操作发生异常", e); + throw new RuntimeException(e.getMessage()); + } finally { + try { + redisService.unLock(redisKey, redisValue); + } catch (Exception e) { + log.error("", e); + } + } + } } diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/oms/pojo/request/DealWithAftersaleRequest.java b/ruoyi-mall/src/main/java/com/cyl/manager/oms/pojo/request/DealWithAftersaleRequest.java new file mode 100644 index 0000000..cd10737 --- /dev/null +++ b/ruoyi-mall/src/main/java/com/cyl/manager/oms/pojo/request/DealWithAftersaleRequest.java @@ -0,0 +1,23 @@ + package com.cyl.manager.oms.pojo.request; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + + + @Data + @ApiModel(value = "商城售后订单处理操作请求体") + public class DealWithAftersaleRequest { + @ApiModelProperty(name = "orderId",value = "订单id",required = true,dataType = "Long") + @NotBlank(message = "订单id不能为空") + private Long orderId; + + @ApiModelProperty(name = "optType",value = "操作类型 1同意 2拒绝 3确认收货",required = true,dataType = "String") + @NotNull(message = "操作类型不能为空") + private Integer optType; + + @ApiModelProperty(name = "remark",value = "拒绝理由 操作类型为2时必填",required = true,dataType = "String") + private String remark; + } \ No newline at end of file diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/oms/pojo/vo/ManagerRefundOrderVo.java b/ruoyi-mall/src/main/java/com/cyl/manager/oms/pojo/vo/ManagerRefundOrderVo.java index 0cfcf00..bc420a7 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/oms/pojo/vo/ManagerRefundOrderVo.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/oms/pojo/vo/ManagerRefundOrderVo.java @@ -72,4 +72,7 @@ import java.util.List; @ApiModelProperty(name = "productInfo", value = "售后单商品数据") private List productList; + + @ApiModelProperty(name = "handleMan", value = "处理人员") + private String handleMan; } diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/AftersaleService.java b/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/AftersaleService.java index cfa2fc4..8809cb9 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/AftersaleService.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/AftersaleService.java @@ -6,15 +6,24 @@ import java.util.*; import java.util.stream.Collectors; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.cyl.manager.oms.domain.Order; import com.cyl.manager.oms.domain.OrderItem; +import com.cyl.manager.oms.domain.OrderOperateHistory; import com.cyl.manager.oms.mapper.OrderItemMapper; import com.cyl.manager.oms.mapper.OrderMapper; +import com.cyl.manager.oms.mapper.OrderOperateHistoryMapper; +import com.cyl.manager.oms.pojo.request.DealWithAftersaleRequest; import com.cyl.manager.oms.pojo.request.ManagerAftersaleOrderRequest; import com.cyl.manager.oms.pojo.vo.ManagerOrderProductVO; import com.cyl.manager.oms.pojo.vo.ManagerRefundOrderVo; import com.github.pagehelper.PageHelper; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.enums.AftersaleStatus; +import com.ruoyi.common.enums.OrderRefundStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.apache.commons.lang3.StringUtils; @@ -22,6 +31,7 @@ import org.springframework.stereotype.Service; import com.cyl.manager.oms.mapper.AftersaleMapper; import com.cyl.manager.oms.domain.Aftersale; import com.cyl.manager.oms.pojo.query.AftersaleQuery; +import org.springframework.transaction.annotation.Transactional; /** * 订单售后Service业务层处理 @@ -40,6 +50,9 @@ public class AftersaleService { @Autowired private OrderItemMapper orderItemMapper; + @Autowired + private OrderOperateHistoryMapper orderOperateHistoryMapper; + /** * 查询订单售后 * @@ -124,4 +137,83 @@ public class AftersaleService { public int deleteById(Long id) { return aftersaleMapper.deleteById(id); } + + /** + * 售后处理 + * @param request 请求体 + * @param user 操作人 + * @return + */ + @Transactional + public String dealWith(DealWithAftersaleRequest request, LoginUser user) { + Order order = orderMapper.selectById(request.getOrderId()); + if (order == null){ + throw new RuntimeException("无该订单"); + } + //目前售后类型只有退款,没有退货退款 + //所以目前只需要查看是否有待处理的售后单 + QueryWrapper aftersaleQw = new QueryWrapper<>(); + aftersaleQw.eq("status", AftersaleStatus.APPLY.getType()); + Aftersale aftersale = aftersaleMapper.selectOne(aftersaleQw); + if (aftersale == null){ + throw new RuntimeException("没有售后单"); + } + //售后状态与售后类型是否对应 + boolean ifAgree = Constants.OptType.AGREE.equals(request.getOptType()); + boolean ifRefuse = Constants.OptType.REFUSE.equals(request.getOptType()); + if (ifAgree || ifRefuse){ + if (!AftersaleStatus.APPLY.getType().equals(aftersale.getStatus())){ + throw new RuntimeException("订单状态有误,请刷新后重试"); + } + } + //拒绝则理由必填 + if (ifRefuse && StrUtil.isBlank(request.getRemark())){ + throw new RuntimeException("请填写拒绝理由"); + } + LocalDateTime optDate = LocalDateTime.now(); + //要创建的订单操作记录,status后续判断再设置 + OrderOperateHistory optHistory = new OrderOperateHistory(); + optHistory.setOrderId(order.getId()); + optHistory.setOperateMan("后台管理员"); + optHistory.setCreateTime(optDate); + optHistory.setCreateBy(user.getUserId()); + optHistory.setUpdateBy(user.getUserId()); + optHistory.setUpdateTime(optDate); + //封装售后wrapper + UpdateWrapper aftersaleWrapper = new UpdateWrapper<>(); + aftersaleWrapper.eq("order_id", request.getOrderId()); + aftersaleWrapper.set("handle_man", user.getUser().getNickName()); + aftersaleWrapper.set("update_time", optDate); + aftersaleWrapper.set("handle_time", optDate); + aftersaleWrapper.set("update_by", user.getUserId()); + //封装订单wrapper + UpdateWrapper orderWrapper = new UpdateWrapper<>(); + orderWrapper.eq("id", request.getOrderId()); + orderWrapper.set("update_time", optDate); + orderWrapper.set("update_by", user.getUserId()); + //更新订单、售后单,创建操作记录 + if (ifRefuse){ + aftersaleWrapper.set("status", AftersaleStatus.REJECT.getType()); + aftersaleWrapper.set("handle_note", request.getRemark()); + orderWrapper.set("aftersale_status", OrderRefundStatus.NO_REFUND.getType()); + optHistory.setOrderStatus(14); + }else if (ifAgree){ + aftersaleWrapper.set("status", AftersaleStatus.WAIT.getType()); + orderWrapper.set("aftersale_status", OrderRefundStatus.WAIT.getType()); + optHistory.setOrderStatus(12); + } + int rows = aftersaleMapper.update(null, aftersaleWrapper); + if (rows < 1){ + throw new RuntimeException("更新售后单失败"); + } + rows = orderMapper.update(null, orderWrapper); + if (rows < 1){ + throw new RuntimeException("更新订单失败"); + } + rows = orderOperateHistoryMapper.insert(optHistory); + if (rows < 1){ + throw new RuntimeException("创建订单操作记录失败"); + } + return "操作成功"; + } } diff --git a/ruoyi-mall/src/main/resources/mapper/oms/AftersaleMapper.xml b/ruoyi-mall/src/main/resources/mapper/oms/AftersaleMapper.xml index 52b6802..5d5e4ab 100644 --- a/ruoyi-mall/src/main/resources/mapper/oms/AftersaleMapper.xml +++ b/ruoyi-mall/src/main/resources/mapper/oms/AftersaleMapper.xml @@ -80,8 +80,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.status aftersaleStatus, a.handle_time handleTime, a.handle_note note, + a.handle_man, c.nickname nickName, - c.phone phone + c.phone_hidden phone FROM oms_aftersale a left join ums_member c on a.member_id = c.id