feat(asset): 支持多商品审批流程

重构资产审批流程,将单个商品审批改为支持多商品审批
- 新增ApprovalGoodsInfo类存储商品信息
- 修改审批逻辑处理多个商品
- 更新数据库表结构
- 调整审批通知消息格式
This commit is contained in:
dzq 2025-06-07 09:53:34 +08:00
parent 02dad5beab
commit 043c0e8cb9
4 changed files with 84 additions and 35 deletions

View File

@ -70,8 +70,6 @@ public class AssetApiControllerTest {
PostAssetApprovalCommand approvalCommand = new PostAssetApprovalCommand(); PostAssetApprovalCommand approvalCommand = new PostAssetApprovalCommand();
approvalCommand.setCorpid("wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw"); approvalCommand.setCorpid("wpZ1ZrEgAA2QTxIRcB4cMtY7hQbTcPAw");
approvalCommand.setExternalApprovalId(1L); approvalCommand.setExternalApprovalId(1L);
approvalCommand.setExternalGoodsId(1003L);
approvalCommand.setApplyQuantity(2);
approvalCommand.setApprovalType(1); approvalCommand.setApprovalType(1);
approvalCommand.setApplyRemark("申请说明"); approvalCommand.setApplyRemark("申请说明");
approvalCommand.setMobile("12345678901"); approvalCommand.setMobile("12345678901");
@ -79,6 +77,12 @@ public class AssetApiControllerTest {
approvalCommand.setName("姓名"); approvalCommand.setName("姓名");
approvalCommand.setIsInternal(2); approvalCommand.setIsInternal(2);
approvalCommand.setGoodsInfoList(new ArrayList<>());
PostAssetApprovalCommand.ApprovalGoodsInfo goodsInfo = new PostAssetApprovalCommand.ApprovalGoodsInfo();
goodsInfo.setExternalGoodsId(1003L);
goodsInfo.setApplyQuantity(2);
approvalCommand.getGoodsInfoList().add(goodsInfo);
// 2.构造请求体 // 2.构造请求体
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
params.put("timestamp", String.valueOf(System.currentTimeMillis())); params.put("timestamp", String.valueOf(System.currentTimeMillis()));

View File

@ -97,36 +97,45 @@ public class AssetApplicationService {
} }
public void postAssetApprovalCommand(PostAssetApprovalCommand command) { public void postAssetApprovalCommand(PostAssetApprovalCommand postAssetApprovalCommand) {
if (command == null || command.getExternalGoodsId() == null || StringUtils.isBlank(command.getCorpid())) { if (postAssetApprovalCommand == null || postAssetApprovalCommand.getGoodsInfoList() == null || postAssetApprovalCommand.getGoodsInfoList().isEmpty()) {
throw new IllegalArgumentException("ExternalGoodsId cannot be null"); throw new IllegalArgumentException("ExternalGoodsId cannot be null");
} }
if (command.getApplyQuantity() == null || command.getApplyQuantity() <= 0) { if (StringUtils.isBlank(postAssetApprovalCommand.getCorpid())) {
throw new IllegalArgumentException("ApplyQuantity must be greater than 0"); throw new IllegalArgumentException("Corpid cannot be null");
} }
ShopGoodsEntity shopGoodsEntity = shopGoodsService.getGoodsByExternalGoodsId(command.getCorpid(), command.getExternalGoodsId()); for (PostAssetApprovalCommand.ApprovalGoodsInfo command : postAssetApprovalCommand.getGoodsInfoList()) {
if (shopGoodsEntity == null) {
throw new IllegalArgumentException("ExternalGoodsId not found");
} if (command.getApplyQuantity() == null || command.getApplyQuantity() <= 0) {
if (shopGoodsEntity.getStock() == null || shopGoodsEntity.getStock() < command.getApplyQuantity()) { throw new IllegalArgumentException("ApplyQuantity must be greater than 0");
throw new IllegalArgumentException("Insufficient stock"); }
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(); ShopGoodsEntity firstGoods = shopGoodsService.getGoodsByExternalGoodsId(postAssetApprovalCommand.getCorpid(), postAssetApprovalCommand.getGoodsInfoList().get(0).getExternalGoodsId());
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();
// 发送审核消息 // 发送审核消息
try { try {
String appid = "QWTONG_YS_WXSHOP"; String appid = "QWTONG_YS_WXSHOP";
@ -143,8 +152,12 @@ public class AssetApplicationService {
List<NewsArticle> articles = new ArrayList<>(); List<NewsArticle> articles = new ArrayList<>();
NewsArticle article = new NewsArticle(); NewsArticle article = new NewsArticle();
article.setTitle("耗材领用审核通知"); article.setTitle("耗材领用审核通知");
article.setDescription("申请领用商品:" + shopGoodsEntity.getGoodsName()); if (postAssetApprovalCommand.getGoodsInfoList().size() > 1) {
article.setPicurl(shopGoodsEntity.getCoverImg()); 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"); article.setUrl("http://wxshop.ab98.cn/shop-api/api/shop/qy/wechatAuth");
articles.add(article); articles.add(article);

View File

@ -5,21 +5,17 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode @EqualsAndHashCode
@Data @Data
public class PostAssetApprovalCommand { public class PostAssetApprovalCommand {
@ApiModelProperty("企业微信id") @ApiModelProperty("企业微信id")
private String corpid; private String corpid;
@ApiModelProperty("外部归属类型的商品ID")
private Long externalGoodsId;
@ApiModelProperty("外部归属类型的审批ID") @ApiModelProperty("外部归属类型的审批ID")
private Long externalApprovalId; private Long externalApprovalId;
@ApiModelProperty("申请数量")
private Integer applyQuantity;
@ApiModelProperty("审批类型0为借还柜 1为固资通") @ApiModelProperty("审批类型0为借还柜 1为固资通")
private Integer approvalType; private Integer approvalType;
@ -37,4 +33,16 @@ public class PostAssetApprovalCommand {
@ApiModelProperty("是否内部用户0否 1汇邦云用户 2企业微信用户") @ApiModelProperty("是否内部用户0否 1汇邦云用户 2企业微信用户")
private Integer isInternal; private Integer isInternal;
@ApiModelProperty("审批信息列表")
private List<ApprovalGoodsInfo> goodsInfoList;
@Data
public static class ApprovalGoodsInfo {
@ApiModelProperty("外部归属类型的商品ID")
private Long externalGoodsId;
@ApiModelProperty("申请数量")
private Integer applyQuantity;
}
} }

View File

@ -31,4 +31,28 @@ ALTER TABLE `return_approval`
ADD COLUMN `external_approval_id` bigint DEFAULT NULL COMMENT '外部归属类型的审批ID' ADD COLUMN `external_approval_id` bigint DEFAULT NULL COMMENT '外部归属类型的审批ID'
AFTER `external_goods_id`; AFTER `external_goods_id`;
ALTER TABLE `return_approval` ALTER TABLE `return_approval`
ADD INDEX `idx_external_approval_id` (`external_approval_id`); 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='申请领用商品信息表';