From 9cf87753c9e2a08a46de452418e21f926d0c3958 Mon Sep 17 00:00:00 2001 From: dzq Date: Mon, 28 Apr 2025 09:54:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E9=80=80=E8=B4=A7=E5=AE=A1=E6=89=B9):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AE=A1=E6=89=B9=E6=97=B6=E9=97=B4=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=B9=B6=E6=94=AF=E6=8C=81=E5=AF=BC=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在退货审批模块中,新增了审批时间字段,并优化了查询逻辑以支持按审批时间筛选。同时,添加了导出功能,允许将审批列表导出为Excel文件,提升数据管理效率。 --- .../shop/ReturnApprovalController.java | 22 ++++++- .../ReturnApprovalApplicationService.java | 27 +++++--- .../approval/db/ReturnApprovalEntity.java | 12 +++- .../approval/db/ReturnApprovalMapper.java | 19 +++++- .../approval/db/ReturnApprovalService.java | 6 +- .../db/ReturnApprovalServiceImpl.java | 10 ++- .../approval/dto/ReturnApprovalExcelDTO.java | 63 +++++++++++++++++++ .../query/SearchReturnApprovalQuery.java | 25 +++++--- sql/20250425_payment_log.sql | 6 +- 9 files changed, 159 insertions(+), 31 deletions(-) create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/dto/ReturnApprovalExcelDTO.java diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/controller/shop/ReturnApprovalController.java b/agileboot-admin/src/main/java/com/agileboot/admin/controller/shop/ReturnApprovalController.java index eeaae2e..b5e7dda 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/controller/shop/ReturnApprovalController.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/controller/shop/ReturnApprovalController.java @@ -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> list(SearchReturnApprovalQuery query) { - PageDTO page = approvalApplicationService.getApprovalList(query); + public ResponseDTO> list(SearchReturnApprovalQuery query) { + PageDTO page = approvalApplicationService.getApprovalPage(query); return ResponseDTO.ok(page); } + @Operation(summary = "退货审批列表导出") + @AccessLog(title = "退货审批管理", businessType = BusinessTypeEnum.EXPORT) + @GetMapping("/excel") + public void exportReturnApprovalByExcel(HttpServletResponse response, SearchReturnApprovalQuery query) { + query.setPaymentMethod("wechat"); + query.setStatus(2); + List list = approvalApplicationService.getApprovalList(query); + List excelDTOList = list.stream().map(ReturnApprovalExcelDTO::new).collect(Collectors.toList()); + CustomExcelUtil.writeToResponse(excelDTOList, ReturnApprovalExcelDTO.class, response); + } + @Operation(summary = "新增退货审批") @AccessLog(title = "退货审批管理", businessType = BusinessTypeEnum.ADD) @PostMapping diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java index 248eafb..40701aa 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/ReturnApprovalApplicationService.java @@ -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 getApprovalList(SearchReturnApprovalQuery query) { - Page page = approvalService.getApprovalList(query); - List dtoList = page.getRecords().stream() + public PageDTO getApprovalPage(SearchReturnApprovalQuery query) { + Page page = approvalService.getApprovalPage(query); + /*List 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 getApprovalList(SearchReturnApprovalQuery 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(); } } \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalEntity.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalEntity.java index a9f58a4..d6257ed 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalEntity.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalEntity.java @@ -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 { 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 { @TableField(exist = false) private Integer isInternal; + @ApiModelProperty("支付方式") + @TableField(exist = false) + private String paymentMethod; + @Override public Serializable pkVal() { return this.approvalId; diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalMapper.java index 169d2f2..59a869e 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalMapper.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalMapper.java @@ -27,14 +27,27 @@ public interface ReturnApprovalMapper extends BaseMapper { Page selectApprovalWithGoodsInfo(Page page, @Param(Constants.WRAPPER) Wrapper 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 getApprovalList( + Page getApprovalPage( Page page, @Param(Constants.WRAPPER) Wrapper 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 getApprovalList( + @Param(Constants.WRAPPER) Wrapper queryWrapper + ); + @Select("SELECT * " + "FROM return_approval " + "WHERE status = #{status} " + diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalService.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalService.java index 255e750..4a557b6 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalService.java @@ -16,8 +16,10 @@ import java.util.List; */ public interface ReturnApprovalService extends IService { - Page getApprovalList(AbstractPageQuery query); - + Page getApprovalPage(AbstractPageQuery query); + + List getApprovalList(AbstractPageQuery query); + List selectAll(); ReturnApprovalEntity getByOrderId(Long orderId); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalServiceImpl.java index e8eb1df..d886b62 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalServiceImpl.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/db/ReturnApprovalServiceImpl.java @@ -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 implements ReturnApprovalService { @Override - public Page getApprovalList(AbstractPageQuery query) { - return this.page(query.toPage(), query.toQueryWrapper()); + public Page getApprovalPage(AbstractPageQuery query) { + return baseMapper.getApprovalPage(query.toPage(), query.toQueryWrapper()); + } + + @Override + public List getApprovalList(AbstractPageQuery query) { + return baseMapper.getApprovalList(query.toQueryWrapper()); } @Override diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/dto/ReturnApprovalExcelDTO.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/dto/ReturnApprovalExcelDTO.java new file mode 100644 index 0000000..bba01c7 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/dto/ReturnApprovalExcelDTO.java @@ -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; +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/query/SearchReturnApprovalQuery.java b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/query/SearchReturnApprovalQuery.java index d8d1b56..bb8fac3 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/query/SearchReturnApprovalQuery.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/shop/approval/query/SearchReturnApprovalQuery.java @@ -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 extends AbstractPageQuery { private String auditRemark; private Date startTime; private Date endTime; + private String paymentMethod; + private Date approvalTime; @Override public QueryWrapper addQueryCondition() { QueryWrapper 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; } diff --git a/sql/20250425_payment_log.sql b/sql/20250425_payment_log.sql index bea147e..79afa63 100644 --- a/sql/20250425_payment_log.sql +++ b/sql/20250425_payment_log.sql @@ -20,4 +20,8 @@ AFTER `status`; ALTER TABLE `payment_operation_log` ADD COLUMN `params` TEXT DEFAULT NULL COMMENT '操作参数' -AFTER `remark`; \ No newline at end of file +AFTER `remark`; + +ALTER TABLE `return_approval` +ADD COLUMN `approval_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '审批时间' +AFTER `status`; \ No newline at end of file