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();
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<String, String> params = new HashMap<>();
params.put("timestamp", String.valueOf(System.currentTimeMillis()));

View File

@ -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<NewsArticle> 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);

View File

@ -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<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'
AFTER `external_goods_id`;
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='申请领用商品信息表';