feat(退货审批): 添加审批时间字段并支持导出功能

在退货审批模块中,新增了审批时间字段,并优化了查询逻辑以支持按审批时间筛选。同时,添加了导出功能,允许将审批列表导出为Excel文件,提升数据管理效率。
This commit is contained in:
dzq 2025-04-28 09:54:08 +08:00
parent 8e543c8c92
commit 9cf87753c9
9 changed files with 159 additions and 31 deletions

View File

@ -5,15 +5,20 @@ import com.agileboot.common.core.base.BaseController;
import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.common.enums.common.BusinessTypeEnum;
import com.agileboot.common.utils.poi.CustomExcelUtil;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.shop.approval.ReturnApprovalApplicationService;
import com.agileboot.domain.shop.approval.command.AddReturnApprovalCommand;
import com.agileboot.domain.shop.approval.command.UpdateReturnApprovalCommand;
import com.agileboot.domain.shop.approval.db.ReturnApprovalEntity;
import com.agileboot.domain.shop.approval.dto.ReturnApprovalDTO;
import com.agileboot.domain.shop.approval.dto.ReturnApprovalExcelDTO;
import com.agileboot.domain.shop.approval.query.SearchReturnApprovalQuery;
import com.agileboot.domain.shop.order.db.ShopOrderEntity;
import com.agileboot.domain.shop.order.dto.ShopOrderExcelDTO;
import io.swagger.v3.oas.annotations.Operation;
import java.util.List;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
@ -36,11 +41,22 @@ public class ReturnApprovalController extends BaseController {
@Operation(summary = "退货审批列表")
@GetMapping
public ResponseDTO<PageDTO<ReturnApprovalDTO>> list(SearchReturnApprovalQuery<ReturnApprovalEntity> query) {
PageDTO<ReturnApprovalDTO> page = approvalApplicationService.getApprovalList(query);
public ResponseDTO<PageDTO<ReturnApprovalEntity>> list(SearchReturnApprovalQuery<ReturnApprovalEntity> query) {
PageDTO<ReturnApprovalEntity> page = approvalApplicationService.getApprovalPage(query);
return ResponseDTO.ok(page);
}
@Operation(summary = "退货审批列表导出")
@AccessLog(title = "退货审批管理", businessType = BusinessTypeEnum.EXPORT)
@GetMapping("/excel")
public void exportReturnApprovalByExcel(HttpServletResponse response, SearchReturnApprovalQuery<ReturnApprovalEntity> query) {
query.setPaymentMethod("wechat");
query.setStatus(2);
List<ReturnApprovalEntity> list = approvalApplicationService.getApprovalList(query);
List<ReturnApprovalExcelDTO> excelDTOList = list.stream().map(ReturnApprovalExcelDTO::new).collect(Collectors.toList());
CustomExcelUtil.writeToResponse(excelDTOList, ReturnApprovalExcelDTO.class, response);
}
@Operation(summary = "新增退货审批")
@AccessLog(title = "退货审批管理", businessType = BusinessTypeEnum.ADD)
@PostMapping

View File

@ -19,7 +19,6 @@ import com.agileboot.domain.shop.approval.command.AddReturnApprovalCommand;
import com.agileboot.domain.shop.approval.command.UpdateReturnApprovalCommand;
import com.agileboot.domain.shop.approval.db.ReturnApprovalEntity;
import com.agileboot.domain.shop.approval.db.ReturnApprovalService;
import com.agileboot.domain.shop.approval.dto.ReturnApprovalDTO;
import com.agileboot.domain.shop.approval.model.ReturnApprovalModel;
import com.agileboot.domain.shop.approval.model.ReturnApprovalModelFactory;
import com.agileboot.domain.shop.approval.query.SearchApiReturnApprovalQuery;
@ -43,10 +42,9 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.stereotype.Service;
@ -75,14 +73,23 @@ public class ReturnApprovalApplicationService {
/**
* 获取退货审批列表
* @param query 查询条件
* @return 分页的退货审批DTO列表
* @return 分页的退货审批列表
*/
public PageDTO<ReturnApprovalDTO> getApprovalList(SearchReturnApprovalQuery<ReturnApprovalEntity> query) {
Page<ReturnApprovalEntity> page = approvalService.getApprovalList(query);
List<ReturnApprovalDTO> dtoList = page.getRecords().stream()
public PageDTO<ReturnApprovalEntity> getApprovalPage(SearchReturnApprovalQuery<ReturnApprovalEntity> query) {
Page<ReturnApprovalEntity> page = approvalService.getApprovalPage(query);
/*List<ReturnApprovalDTO> dtoList = page.getRecords().stream()
.map(ReturnApprovalDTO::new)
.collect(Collectors.toList());
return new PageDTO<>(dtoList, page.getTotal());
.collect(Collectors.toList());*/
return new PageDTO<>(page.getRecords(), page.getTotal());
}
/**
* 获取退货审批列表
* @param query 查询条件
* @return 退货审批列表
*/
public List<ReturnApprovalEntity> getApprovalList(SearchReturnApprovalQuery<ReturnApprovalEntity> query) {
return approvalService.getApprovalList(query);
}
/**
@ -207,6 +214,7 @@ public class ReturnApprovalApplicationService {
model.setAuditImages(command.getAuditImages());
model.setAuditRemark(command.getAuditRemark());
model.setReturnAmount(command.getReturnAmount());
model.setApprovalTime(new Date());
model.setStatus(2); // 2表示审核通过状态
model.updateById();
@ -318,6 +326,7 @@ public class ReturnApprovalApplicationService {
model.setStatus(3);
model.setAuditImages(command.getAuditImages());
model.setAuditRemark(command.getAuditRemark());
model.setApprovalTime(new Date());
model.updateById();
}
}

View File

@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
@ -77,9 +79,13 @@ public class ReturnApprovalEntity extends BaseEntity<ReturnApprovalEntity> {
private String auditName;
@ApiModelProperty("审批状态(1待审核 2已通过 3已驳回)")
@TableField("`status`")
@TableField("status")
private Integer status;
@ApiModelProperty("审批时间")
@TableField("approval_time")
private Date approvalTime;
@ApiModelProperty("商品名称")
@TableField(exist = false)
private String goodsName;
@ -104,6 +110,10 @@ public class ReturnApprovalEntity extends BaseEntity<ReturnApprovalEntity> {
@TableField(exist = false)
private Integer isInternal;
@ApiModelProperty("支付方式")
@TableField(exist = false)
private String paymentMethod;
@Override
public Serializable pkVal() {
return this.approvalId;

View File

@ -27,14 +27,27 @@ public interface ReturnApprovalMapper extends BaseMapper<ReturnApprovalEntity> {
Page<ReturnApprovalEntity> selectApprovalWithGoodsInfo(Page<ReturnApprovalEntity> page,
@Param(Constants.WRAPPER) Wrapper<ReturnApprovalEntity> queryWrapper);
@Select("SELECT * " +
"FROM return_approval " +
@Select("SELECT ra.*, sog.goods_name AS goodsName, sog.cover_img AS coverImg, " +
"so.mobile, so.userid, so.name, so.payment_method AS paymentMethod " +
"FROM return_approval ra " +
"LEFT JOIN shop_order so ON ra.order_id = so.order_id AND so.deleted = 0 " +
"LEFT JOIN shop_order_goods sog ON ra.order_goods_id = sog.order_goods_id AND sog.deleted = 0 " +
"${ew.customSqlSegment}")
Page<ReturnApprovalEntity> getApprovalList(
Page<ReturnApprovalEntity> getApprovalPage(
Page<ReturnApprovalEntity> page,
@Param(Constants.WRAPPER) Wrapper<ReturnApprovalEntity> queryWrapper
);
@Select("SELECT ra.*, sog.goods_name AS goodsName, sog.cover_img AS coverImg, " +
"so.mobile, so.userid, so.name, so.payment_method AS paymentMethod " +
"FROM return_approval ra " +
"LEFT JOIN shop_order so ON ra.order_id = so.order_id AND so.deleted = 0 " +
"LEFT JOIN shop_order_goods sog ON ra.order_goods_id = sog.order_goods_id AND sog.deleted = 0 " +
"${ew.customSqlSegment}")
List<ReturnApprovalEntity> getApprovalList(
@Param(Constants.WRAPPER) Wrapper<ReturnApprovalEntity> queryWrapper
);
@Select("SELECT * " +
"FROM return_approval " +
"WHERE status = #{status} " +

View File

@ -16,7 +16,9 @@ import java.util.List;
*/
public interface ReturnApprovalService extends IService<ReturnApprovalEntity> {
Page<ReturnApprovalEntity> getApprovalList(AbstractPageQuery<ReturnApprovalEntity> query);
Page<ReturnApprovalEntity> getApprovalPage(AbstractPageQuery<ReturnApprovalEntity> query);
List<ReturnApprovalEntity> getApprovalList(AbstractPageQuery<ReturnApprovalEntity> query);
List<ReturnApprovalEntity> selectAll();

View File

@ -1,7 +1,6 @@
package com.agileboot.domain.shop.approval.db;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -21,8 +20,13 @@ import java.util.List;
public class ReturnApprovalServiceImpl extends ServiceImpl<ReturnApprovalMapper, ReturnApprovalEntity> implements ReturnApprovalService {
@Override
public Page<ReturnApprovalEntity> getApprovalList(AbstractPageQuery<ReturnApprovalEntity> query) {
return this.page(query.toPage(), query.toQueryWrapper());
public Page<ReturnApprovalEntity> getApprovalPage(AbstractPageQuery<ReturnApprovalEntity> query) {
return baseMapper.getApprovalPage(query.toPage(), query.toQueryWrapper());
}
@Override
public List<ReturnApprovalEntity> getApprovalList(AbstractPageQuery<ReturnApprovalEntity> query) {
return baseMapper.getApprovalList(query.toQueryWrapper());
}
@Override

View File

@ -0,0 +1,63 @@
package com.agileboot.domain.shop.approval.dto;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import com.agileboot.common.annotation.ExcelColumn;
import com.agileboot.domain.shop.approval.db.ReturnApprovalEntity;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ReturnApprovalExcelDTO {
public ReturnApprovalExcelDTO(ReturnApprovalEntity entity) {
if (entity != null) {
BeanUtil.copyProperties(entity, this);
this.statusStr = convertStatus(entity.getStatus());
this.createTimeStr = entity.getCreateTime() != null ?
DateUtil.format(entity.getCreateTime(), "yyyy-MM-dd HH:mm:ss") : "";
this.approvalTimeStr = entity.getApprovalTime() != null ?
DateUtil.format(entity.getApprovalTime(), "yyyy-MM-dd HH:mm:ss") : "";
}
}
private String convertStatus(Integer status) {
if (status == null) return "-";
switch (status) {
case 1: return "待审核";
case 2: return "已通过";
case 3: return "已驳回";
default: return "未知状态";
}
}
@ExcelColumn(name = "审批编号")
private Long approvalId;
@ExcelColumn(name = "归还数量")
private Integer returnQuantity;
@ExcelColumn(name = "商品单价")
private BigDecimal goodsPrice;
@ExcelColumn(name = "退还金额")
private BigDecimal returnAmount;
@ExcelColumn(name = "审批状态")
private String statusStr;
@ExcelColumn(name = "创建时间")
private String createTimeStr;
@ExcelColumn(name = "审批人")
private String auditName;
@ExcelColumn(name = "商品名称")
private String goodsName;
@ExcelColumn(name = "手机号码")
private String mobile;
@ExcelColumn(name = "审批时间")
private String approvalTimeStr;
}

View File

@ -1,5 +1,6 @@
package com.agileboot.domain.shop.approval.query;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@ -19,22 +20,28 @@ public class SearchReturnApprovalQuery<T> extends AbstractPageQuery<T> {
private String auditRemark;
private Date startTime;
private Date endTime;
private String paymentMethod;
private Date approvalTime;
@Override
public QueryWrapper<T> addQueryCondition() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
queryWrapper
.eq(approvalId != null, "approval_id", approvalId)
.eq(orderId != null, "order_id", orderId)
.eq(goodsId != null, "goods_id", goodsId)
.eq(status != null, "status", status)
.like(StrUtil.isNotEmpty(returnRemark), "return_remark", returnRemark)
.like(StrUtil.isNotEmpty(auditRemark), "audit_remark", auditRemark)
.between(startTime != null && endTime != null, "create_time", startTime, endTime)
.orderByDesc("create_time");
.eq(approvalId != null, "ra.approval_id", approvalId)
.eq(orderId != null, "ra.order_id", orderId)
.eq(goodsId != null, "ra.goods_id", goodsId)
.eq(status != null, "ra.status", status)
.like(StrUtil.isNotEmpty(returnRemark), "ra.return_remark", returnRemark)
.like(StrUtil.isNotEmpty(auditRemark), "ra.audit_remark", auditRemark)
.like(StrUtil.isNotEmpty(paymentMethod), "so.payment_method", paymentMethod)
// .between(startTime != null && endTime != null, "ra.create_time", startTime, endTime)
.between(approvalTime != null, "ra.approval_time",
approvalTime == null ? null : DateUtil.beginOfDay(approvalTime).toJdkDate(),
approvalTime == null ? null : DateUtil.endOfDay(approvalTime).toJdkDate())
.orderByDesc("ra.create_time");
this.timeRangeColumn = "create_time";
this.timeRangeColumn = "ra.create_time";
return queryWrapper;
}

View File

@ -21,3 +21,7 @@ AFTER `status`;
ALTER TABLE `payment_operation_log`
ADD COLUMN `params` TEXT DEFAULT NULL COMMENT '操作参数'
AFTER `remark`;
ALTER TABLE `return_approval`
ADD COLUMN `approval_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '审批时间'
AFTER `status`;