From 043c0e8cb958fa0945b314d089314a805f45231e Mon Sep 17 00:00:00 2001 From: dzq Date: Sat, 7 Jun 2025 09:53:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(asset):=20=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E5=95=86=E5=93=81=E5=AE=A1=E6=89=B9=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构资产审批流程,将单个商品审批改为支持多商品审批 - 新增ApprovalGoodsInfo类存储商品信息 - 修改审批逻辑处理多个商品 - 更新数据库表结构 - 调整审批通知消息格式 --- .../controller/AssetApiControllerTest.java | 8 ++- .../domain/asset/AssetApplicationService.java | 65 +++++++++++-------- .../command/PostAssetApprovalCommand.java | 20 ++++-- sql/20250605.sql | 26 +++++++- 4 files changed, 84 insertions(+), 35 deletions(-) diff --git a/agileboot-api/src/test/java/com/agileboot/api/controller/AssetApiControllerTest.java b/agileboot-api/src/test/java/com/agileboot/api/controller/AssetApiControllerTest.java index 195be2f..98a9cc4 100644 --- a/agileboot-api/src/test/java/com/agileboot/api/controller/AssetApiControllerTest.java +++ b/agileboot-api/src/test/java/com/agileboot/api/controller/AssetApiControllerTest.java @@ -70,8 +70,6 @@ public class AssetApiControllerTest { PostAssetApprovalCommand approvalCommand = new PostAssetApprovalCommand(); approvalCommand.setCorpid("wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw"); approvalCommand.setExternalApprovalId(1L); - approvalCommand.setExternalGoodsId(1003L); - approvalCommand.setApplyQuantity(2); approvalCommand.setApprovalType(1); approvalCommand.setApplyRemark("申请说明"); approvalCommand.setMobile("12345678901"); @@ -79,6 +77,12 @@ public class AssetApiControllerTest { approvalCommand.setName("姓名"); approvalCommand.setIsInternal(2); + approvalCommand.setGoodsInfoList(new ArrayList<>()); + PostAssetApprovalCommand.ApprovalGoodsInfo goodsInfo = new PostAssetApprovalCommand.ApprovalGoodsInfo(); + goodsInfo.setExternalGoodsId(1003L); + goodsInfo.setApplyQuantity(2); + approvalCommand.getGoodsInfoList().add(goodsInfo); + // 2.构造请求体 Map params = new HashMap<>(); params.put("timestamp", String.valueOf(System.currentTimeMillis())); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/asset/AssetApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/asset/AssetApplicationService.java index d803edb..ea11366 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/asset/AssetApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/asset/AssetApplicationService.java @@ -97,36 +97,45 @@ public class AssetApplicationService { } - public void postAssetApprovalCommand(PostAssetApprovalCommand command) { - if (command == null || command.getExternalGoodsId() == null || StringUtils.isBlank(command.getCorpid())) { + public void postAssetApprovalCommand(PostAssetApprovalCommand postAssetApprovalCommand) { + if (postAssetApprovalCommand == null || postAssetApprovalCommand.getGoodsInfoList() == null || postAssetApprovalCommand.getGoodsInfoList().isEmpty()) { throw new IllegalArgumentException("ExternalGoodsId cannot be null"); } - if (command.getApplyQuantity() == null || command.getApplyQuantity() <= 0) { - throw new IllegalArgumentException("ApplyQuantity must be greater than 0"); + if (StringUtils.isBlank(postAssetApprovalCommand.getCorpid())) { + throw new IllegalArgumentException("Corpid cannot be null"); } - ShopGoodsEntity shopGoodsEntity = shopGoodsService.getGoodsByExternalGoodsId(command.getCorpid(), command.getExternalGoodsId()); - if (shopGoodsEntity == null) { - throw new IllegalArgumentException("ExternalGoodsId not found"); - } - if (shopGoodsEntity.getStock() == null || shopGoodsEntity.getStock() < command.getApplyQuantity()) { - throw new IllegalArgumentException("Insufficient stock"); + for (PostAssetApprovalCommand.ApprovalGoodsInfo command : postAssetApprovalCommand.getGoodsInfoList()) { + + + if (command.getApplyQuantity() == null || command.getApplyQuantity() <= 0) { + throw new IllegalArgumentException("ApplyQuantity must be greater than 0"); + } + + ShopGoodsEntity shopGoodsEntity = shopGoodsService.getGoodsByExternalGoodsId(postAssetApprovalCommand.getCorpid(), command.getExternalGoodsId()); + if (shopGoodsEntity == null) { + throw new IllegalArgumentException("ExternalGoodsId not found"); + } + if (shopGoodsEntity.getStock() == null || shopGoodsEntity.getStock() < command.getApplyQuantity()) { + throw new IllegalArgumentException("Insufficient stock"); + } + + AddReturnApprovalCommand returnApprovalCommand = new AddReturnApprovalCommand(); + BeanUtils.copyProperties(postAssetApprovalCommand, returnApprovalCommand); + BeanUtils.copyProperties(command, returnApprovalCommand); + returnApprovalCommand.setGoodsId(shopGoodsEntity.getGoodsId()); + returnApprovalCommand.setGoodsPrice(shopGoodsEntity.getPrice()); + if (returnApprovalCommand.getApprovalType() == null) { + returnApprovalCommand.setApprovalType(1); + } + + ReturnApprovalModel returnApprovalModel = returnApprovalModelFactory.create(); + returnApprovalModel.initBaseEntity(); + returnApprovalModel.loadAddCommand(returnApprovalCommand); + returnApprovalCommand.insert(); } - AddReturnApprovalCommand returnApprovalCommand = new AddReturnApprovalCommand(); - BeanUtils.copyProperties(command, returnApprovalCommand); - returnApprovalCommand.setGoodsId(shopGoodsEntity.getGoodsId()); - returnApprovalCommand.setGoodsPrice(shopGoodsEntity.getPrice()); - if (returnApprovalCommand.getApprovalType() == null) { - returnApprovalCommand.setApprovalType(1); - } - - ReturnApprovalModel returnApprovalModel = returnApprovalModelFactory.create(); - returnApprovalModel.initBaseEntity(); - returnApprovalModel.loadAddCommand(returnApprovalCommand); - returnApprovalCommand.insert(); - - + ShopGoodsEntity firstGoods = shopGoodsService.getGoodsByExternalGoodsId(postAssetApprovalCommand.getCorpid(), postAssetApprovalCommand.getGoodsInfoList().get(0).getExternalGoodsId()); // 发送审核消息 try { String appid = "QWTONG_YS_WXSHOP"; @@ -143,8 +152,12 @@ public class AssetApplicationService { List articles = new ArrayList<>(); NewsArticle article = new NewsArticle(); article.setTitle("耗材领用审核通知"); - article.setDescription("申请领用商品:" + shopGoodsEntity.getGoodsName()); - article.setPicurl(shopGoodsEntity.getCoverImg()); + if (postAssetApprovalCommand.getGoodsInfoList().size() > 1) { + article.setDescription(postAssetApprovalCommand.getName() + " 申请领用" + firstGoods.getGoodsName() + "等" + postAssetApprovalCommand.getGoodsInfoList().size() + "件商品"); + } else { + article.setDescription(postAssetApprovalCommand.getName() + " 申请领用" + firstGoods.getGoodsName()); + } + article.setPicurl(firstGoods.getCoverImg()); article.setUrl("http://wxshop.ab98.cn/shop-api/api/shop/qy/wechatAuth"); articles.add(article); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/asset/command/PostAssetApprovalCommand.java b/agileboot-domain/src/main/java/com/agileboot/domain/asset/command/PostAssetApprovalCommand.java index e306682..37ae3ee 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/asset/command/PostAssetApprovalCommand.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/asset/command/PostAssetApprovalCommand.java @@ -5,21 +5,17 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.List; + @EqualsAndHashCode @Data public class PostAssetApprovalCommand { @ApiModelProperty("企业微信id") private String corpid; - @ApiModelProperty("外部归属类型的商品ID") - private Long externalGoodsId; - @ApiModelProperty("外部归属类型的审批ID") private Long externalApprovalId; - @ApiModelProperty("申请数量") - private Integer applyQuantity; - @ApiModelProperty("审批类型(0为借还柜 1为固资通)") private Integer approvalType; @@ -37,4 +33,16 @@ public class PostAssetApprovalCommand { @ApiModelProperty("是否内部用户(0否 1汇邦云用户 2企业微信用户)") private Integer isInternal; + + @ApiModelProperty("审批信息列表") + private List goodsInfoList; + + @Data + public static class ApprovalGoodsInfo { + @ApiModelProperty("外部归属类型的商品ID") + private Long externalGoodsId; + + @ApiModelProperty("申请数量") + private Integer applyQuantity; + } } diff --git a/sql/20250605.sql b/sql/20250605.sql index cd3acf0..2a7fd81 100644 --- a/sql/20250605.sql +++ b/sql/20250605.sql @@ -31,4 +31,28 @@ ALTER TABLE `return_approval` ADD COLUMN `external_approval_id` bigint DEFAULT NULL COMMENT '外部归属类型的审批ID' AFTER `external_goods_id`; ALTER TABLE `return_approval` -ADD INDEX `idx_external_approval_id` (`external_approval_id`); \ No newline at end of file +ADD INDEX `idx_external_approval_id` (`external_approval_id`); + +CREATE TABLE `approval_goods` ( + `approval_goods_id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `approval_id` bigint NOT NULL COMMENT '审批ID', + `goods_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品名称', + `goods_id` bigint NOT NULL COMMENT '关联商品ID', + `external_goods_id` bigint DEFAULT NULL COMMENT '外部归属类型的商品ID', + `corpid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业微信id', + `belong_type` tinyint NOT NULL DEFAULT '0' COMMENT '归属类型(0-借还柜 1-固资通)', + `price` decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '销售价格', + `apply_quantity` int DEFAULT NULL COMMENT '申请数量', + `cover_img` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '封面图URL', + `creator_id` bigint NULL DEFAULT '0' COMMENT '创建者ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater_id` bigint NULL DEFAULT '0' COMMENT '更新者ID', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 1删除)', + PRIMARY KEY (`approval_goods_id`), + KEY `idx_approval_id` (`approval_id`), + KEY `idx_goods_id` (`goods_id`), + KEY `idx_external_goods_id` (`external_goods_id`), + KEY `idx_corpid` (`corpid`), + KEY `idx_update_time` (`update_time`) +) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='申请领用商品信息表'; \ No newline at end of file