feat(审批): 添加带商品信息的审批列表查询功能

为了在审批列表中展示商品名称和封面图,新增了`selectApprovalWithGoodsInfo`方法,并在相关实体类中添加了`goodsName`和`coverImg`字段。同时,更新了数据库表结构和查询逻辑,确保审批列表能正确返回商品信息。
This commit is contained in:
dzq 2025-04-09 10:16:27 +08:00
parent 6f2eaf92a8
commit 980d279ba9
10 changed files with 101 additions and 7 deletions

View File

@ -1,12 +1,15 @@
package com.agileboot.api.controller; package com.agileboot.api.controller;
import com.agileboot.common.core.dto.ResponseDTO; import com.agileboot.common.core.dto.ResponseDTO;
import com.agileboot.common.core.page.PageDTO;
import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.ApiException;
import com.agileboot.common.exception.error.ErrorCode; import com.agileboot.common.exception.error.ErrorCode;
import com.agileboot.domain.shop.approval.ReturnApprovalApplicationService; import com.agileboot.domain.shop.approval.ReturnApprovalApplicationService;
import com.agileboot.domain.shop.approval.command.AddReturnApprovalCommand; import com.agileboot.domain.shop.approval.command.AddReturnApprovalCommand;
import com.agileboot.domain.shop.approval.db.ReturnApprovalEntity; import com.agileboot.domain.shop.approval.db.ReturnApprovalEntity;
import com.agileboot.domain.shop.approval.model.ReturnApprovalModel; import com.agileboot.domain.shop.approval.model.ReturnApprovalModel;
import com.agileboot.domain.shop.approval.query.SearchApiReturnApprovalQuery;
import com.agileboot.domain.shop.approval.query.SearchReturnApprovalQuery;
import com.agileboot.domain.shop.order.OrderApplicationService; import com.agileboot.domain.shop.order.OrderApplicationService;
import com.agileboot.domain.shop.order.db.ShopOrderGoodsEntity; import com.agileboot.domain.shop.order.db.ShopOrderGoodsEntity;
@ -14,12 +17,8 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.Date; import java.util.Date;
@ -74,4 +73,11 @@ public class ApprovalApiController {
ReturnApprovalEntity returnApproval = approvalApplicationService.submitApproval(command, orderGoods); ReturnApprovalEntity returnApproval = approvalApplicationService.submitApproval(command, orderGoods);
return ResponseDTO.ok(returnApproval); return ResponseDTO.ok(returnApproval);
} }
@GetMapping("/list")
@ApiOperation(value = "审批列表")
public ResponseDTO<PageDTO<ReturnApprovalEntity>> list(SearchApiReturnApprovalQuery<ReturnApprovalEntity> query) {
PageDTO<ReturnApprovalEntity> page = approvalApplicationService.getApprovalWithGoodsInfo(query);
return ResponseDTO.ok(page);
}
} }

View File

@ -9,6 +9,7 @@ import com.agileboot.domain.shop.approval.db.ReturnApprovalService;
import com.agileboot.domain.shop.approval.dto.ReturnApprovalDTO; import com.agileboot.domain.shop.approval.dto.ReturnApprovalDTO;
import com.agileboot.domain.shop.approval.model.ReturnApprovalModel; import com.agileboot.domain.shop.approval.model.ReturnApprovalModel;
import com.agileboot.domain.shop.approval.model.ReturnApprovalModelFactory; import com.agileboot.domain.shop.approval.model.ReturnApprovalModelFactory;
import com.agileboot.domain.shop.approval.query.SearchApiReturnApprovalQuery;
import com.agileboot.domain.shop.approval.query.SearchReturnApprovalQuery; import com.agileboot.domain.shop.approval.query.SearchReturnApprovalQuery;
import com.agileboot.domain.shop.order.db.ShopOrderGoodsEntity; import com.agileboot.domain.shop.order.db.ShopOrderGoodsEntity;
import com.agileboot.domain.shop.order.model.OrderGoodsModel; import com.agileboot.domain.shop.order.model.OrderGoodsModel;
@ -63,7 +64,7 @@ public class ReturnApprovalApplicationService {
// 设置商品价格并初始化审批状态 // 设置商品价格并初始化审批状态
command.setGoodsId(orderGoods.getGoodsId()); command.setGoodsId(orderGoods.getGoodsId());
command.setOrderId(orderGoods.getOrderId()); command.setOrderId(orderGoods.getOrderId());
command.setGoodsPrice(orderGoods.getPrice()); command.setGoodsPrice(orderGoods.getTotalAmount());
command.setReturnImages(command.getReturnImages()); command.setReturnImages(command.getReturnImages());
command.setReturnRemark(command.getReturnRemark()); command.setReturnRemark(command.getReturnRemark());
command.setStatus(1); command.setStatus(1);
@ -83,4 +84,9 @@ public class ReturnApprovalApplicationService {
return returnApprovalModel.selectById(); return returnApprovalModel.selectById();
} }
public PageDTO<ReturnApprovalEntity> getApprovalWithGoodsInfo(SearchApiReturnApprovalQuery<ReturnApprovalEntity> query) {
Page<ReturnApprovalEntity> page = approvalService.selectApprovalWithGoodsInfo(query);
return new PageDTO<>(page.getRecords(), page.getTotal());
}
} }

View File

@ -76,6 +76,14 @@ public class ReturnApprovalEntity extends BaseEntity<ReturnApprovalEntity> {
@TableField("`status`") @TableField("`status`")
private Integer status; private Integer status;
@ApiModelProperty("商品名称")
@TableField(exist = false)
private String goodsName;
@ApiModelProperty("封面图URL")
@TableField(exist = false)
private String coverImg;
@Override @Override
public Serializable pkVal() { public Serializable pkVal() {

View File

@ -17,6 +17,14 @@ import org.apache.ibatis.annotations.Select;
* @since 2025-04-03 * @since 2025-04-03
*/ */
public interface ReturnApprovalMapper extends BaseMapper<ReturnApprovalEntity> { public interface ReturnApprovalMapper extends BaseMapper<ReturnApprovalEntity> {
@Select("SELECT ra.*, sog.goods_name AS goodsName, sog.cover_img AS coverImg " +
"FROM return_approval ra " +
"LEFT JOIN shop_order_goods sog ON ra.order_goods_id = sog.order_goods_id" +
"${ew.customSqlSegment}")
Page<ReturnApprovalEntity> selectApprovalWithGoodsInfo(Page<ReturnApprovalEntity> page,
@Param(Constants.WRAPPER) Wrapper<ReturnApprovalEntity> queryWrapper);
@Select("SELECT * " + @Select("SELECT * " +
"FROM return_approval " + "FROM return_approval " +
"${ew.customSqlSegment}") "${ew.customSqlSegment}")

View File

@ -21,4 +21,6 @@ public interface ReturnApprovalService extends IService<ReturnApprovalEntity> {
List<ReturnApprovalEntity> selectAll(); List<ReturnApprovalEntity> selectAll();
ReturnApprovalEntity getByOrderId(Long orderId); ReturnApprovalEntity getByOrderId(Long orderId);
Page<ReturnApprovalEntity> selectApprovalWithGoodsInfo(AbstractPageQuery<ReturnApprovalEntity> query);
} }

View File

@ -38,4 +38,9 @@ public class ReturnApprovalServiceImpl extends ServiceImpl<ReturnApprovalMapper,
.last("LIMIT 1"); .last("LIMIT 1");
return this.getOne(wrapper); return this.getOne(wrapper);
} }
@Override
public Page<ReturnApprovalEntity> selectApprovalWithGoodsInfo(AbstractPageQuery<ReturnApprovalEntity> query) {
return this.baseMapper.selectApprovalWithGoodsInfo(query.toPage(), query.toQueryWrapper());
}
} }

View File

@ -0,0 +1,40 @@
package com.agileboot.domain.shop.approval.query;
import cn.hutool.core.util.StrUtil;
import com.agileboot.common.core.page.AbstractPageQuery;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class SearchApiReturnApprovalQuery<T> extends AbstractPageQuery<T> {
private Long approvalId;
private Long orderId;
private Long goodsId;
private String goodsName;
private Integer status;
private String returnRemark;
private String auditRemark;
private Date startTime;
private Date endTime;
@Override
public QueryWrapper<T> addQueryCondition() {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
queryWrapper
.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(goodsName), "sog.goods_name", goodsName)
.between(startTime != null && endTime != null, "ra.create_time", startTime, endTime);
this.timeRangeColumn = "create_time";
return queryWrapper;
}
}

View File

@ -52,6 +52,14 @@ public class ShopOrderGoodsEntity extends BaseEntity<ShopOrderGoodsEntity> {
@TableField("total_amount") @TableField("total_amount")
private BigDecimal totalAmount; private BigDecimal totalAmount;
@ApiModelProperty("商品名称")
@TableField("goods_name")
private String goodsName;
@ApiModelProperty("封面图URL")
@TableField("cover_img")
private String coverImg;
@ApiModelProperty("商品状态1正常 2已退货 3已换货 4已完成 5审核中 6退货未通过") @ApiModelProperty("商品状态1正常 2已退货 3已换货 4已完成 5审核中 6退货未通过")
@TableField("`status`") @TableField("`status`")
private Integer status; private Integer status;

View File

@ -35,6 +35,8 @@ public class OrderGoodsModel extends ShopOrderGoodsEntity {
ShopGoodsEntity goods = goodsService.getById(getGoodsId()); ShopGoodsEntity goods = goodsService.getById(getGoodsId());
if (goods != null) { if (goods != null) {
BigDecimal price = goods.getPrice(); BigDecimal price = goods.getPrice();
this.setGoodsName(goods.getGoodsName());
this.setCoverImg(goods.getCoverImg());
this.setPrice(price); this.setPrice(price);
this.setTotalAmount(price.multiply(BigDecimal.valueOf(getQuantity()))); this.setTotalAmount(price.multiply(BigDecimal.valueOf(getQuantity())));
} }

View File

@ -50,3 +50,12 @@ ALTER TABLE `return_approval`
ALTER TABLE `shop_order` ALTER TABLE `shop_order`
ADD COLUMN `biz_order_id` VARCHAR(32) NULL COMMENT '业务系统订单ID对接外部系统' AFTER `trade_id`; ADD COLUMN `biz_order_id` VARCHAR(32) NULL COMMENT '业务系统订单ID对接外部系统' AFTER `trade_id`;
ALTER TABLE shop_order_goods
ADD COLUMN goods_name VARCHAR(255) NOT NULL COMMENT '商品名称',
ADD COLUMN cover_img VARCHAR(512) COMMENT '封面图URL';
UPDATE shop_order_goods sog
INNER JOIN shop_goods sg ON sog.goods_id = sg.goods_id
SET sog.goods_name = sg.goods_name,
sog.cover_img = sg.cover_img;