feat(approval): 添加审批相关功能及每月限购数量字段

- 新增审批ID字段和根据审批ID查询订单商品接口
- 添加商品每月限购数量字段及相关DTO映射
- 实现审批处理逻辑和获取审批订单商品列表功能
- 修复审批流程中corpid硬编码问题
This commit is contained in:
dzq 2025-06-09 15:23:35 +08:00
parent 909f61fdd5
commit b96fd06aea
10 changed files with 93 additions and 8 deletions

View File

@ -24,6 +24,7 @@ import org.apache.commons.lang3.StringUtils;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 审批请求控制器
@ -80,6 +81,32 @@ public class ApprovalApiController {
}
}
@PostMapping("/handle/asset")
@ApiOperation(value = "处理审批操作")
public ResponseDTO<String> handleAssetApproval(@Valid @RequestBody UpdateReturnApprovalCommand command) {
if (command.getApprovalId() == null) {
return ResponseDTO.fail(new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "审批ID不能为空"));
}
if (command.getStatus() == null) {
return ResponseDTO.fail(new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "操作状态不能为空"));
}
try {
if (command.getStatus() == 2) {
approvalApplicationService.approveApproval(command);
} else if (command.getStatus() == 3) {
approvalApplicationService.rejectApproval(command);
} else {
return ResponseDTO.fail(new ApiException(ErrorCode.Internal.INTERNAL_ERROR, "无效的操作状态"));
}
return ResponseDTO.ok("操作成功");
} catch (Exception e) {
log.error("审批操作失败", e);
return ResponseDTO.fail(new ApiException(ErrorCode.Internal.INTERNAL_ERROR, e.getMessage()));
}
}
/**
* 提交退货审批申请
*
@ -117,4 +144,11 @@ public class ApprovalApiController {
PageDTO<ReturnApprovalEntity> page = approvalApplicationService.getApprovalWithGoodsInfo(query);
return ResponseDTO.ok(page);
}
@GetMapping("/getApprovalOrderGoods")
@ApiOperation(value = "审批列表")
public ResponseDTO<List<ShopOrderGoodsEntity>> getApprovalOrderGoods(Long approvalId) {
List<ShopOrderGoodsEntity> list = approvalApplicationService.getApprovalOrderGoods(approvalId);
return ResponseDTO.ok(list);
}
}

View File

@ -67,6 +67,9 @@ public class AssetApplicationService {
if (command.getStock() != null) {
shopGoodsEntity.setStock(command.getStock());
}
if (command.getStock() != null) {
shopGoodsEntity.setMonthlyPurchaseLimit(command.getMonthlyPurchaseLimit());
}
if (command.getAutoApproval() != null) {
shopGoodsEntity.setAutoApproval(command.getAutoApproval());
}
@ -168,9 +171,9 @@ public class AssetApplicationService {
String appid = "QWTONG_YS_WXSHOP";
List<QyAuthCorpInfoEntity> authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid);
QyAuthCorpInfoEntity authCorpInfo = authCorpInfoList.stream()
.filter(a -> WeixinConstants.corpid.equals(a.getCorpid()))
.filter(a -> postAssetApprovalCommand.getCorpid().equals(a.getCorpid()))
.findFirst().orElse(null);
QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, authCorpInfo.getCorpid());
QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, postAssetApprovalCommand.getCorpid());
// 获取用户ID
List<String> adminUserIds = qyUserService.selectAdminUserIds();
String toUser = String.join("|", adminUserIds);

View File

@ -1,5 +1,6 @@
package com.agileboot.domain.asset.command;
import com.agileboot.common.annotation.ExcelColumn;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@ -48,5 +49,8 @@ public class PostAssetGoodsCommand {
@ApiModelProperty("归属类型0-借还柜 1-固资通)")
private Integer belongType;
@ApiModelProperty("每人每月限购数量")
private String monthlyPurchaseLimit;
}
}

View File

@ -26,6 +26,7 @@ import com.agileboot.domain.shop.approval.query.SearchReturnApprovalQuery;
import com.agileboot.domain.shop.goods.model.GoodsModel;
import com.agileboot.domain.shop.goods.model.GoodsModelFactory;
import com.agileboot.domain.shop.order.db.ShopOrderGoodsEntity;
import com.agileboot.domain.shop.order.db.ShopOrderGoodsService;
import com.agileboot.domain.shop.order.model.OrderGoodsModel;
import com.agileboot.domain.shop.order.model.OrderGoodsModelFactory;
import com.agileboot.domain.shop.order.model.OrderModel;
@ -59,6 +60,7 @@ public class ReturnApprovalApplicationService {
private final ReturnApprovalService approvalService;
private final ReturnApprovalModelFactory modelFactory;
private final ShopOrderGoodsService shopOrderGoodsService;
private final OrderGoodsModelFactory orderGoodsModelFactory;
private final OrderModelFactory orderModelFactory;
private final PaymentApplicationService paymentApplicationService;
@ -187,9 +189,9 @@ public class ReturnApprovalApplicationService {
} else if (Objects.equals(orderModel.getPaymentMethod(), "balance")) {
// 余额退款
try {
QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid("QWTONG_YS_WXSHOP", WeixinConstants.corpid);
QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid("QWTONG_YS_WXSHOP", command.getCorpid());
String userid = QywxApiUtil.convertToUserid(accessToken.getAccessToken(), orderModel.getOpenid()).getUserid();
QyUserEntity qyUser = userService.getUserByUserIdAndCorpid(userid, WeixinConstants.corpid);
QyUserEntity qyUser = userService.getUserByUserIdAndCorpid(userid, command.getCorpid());
if (null != qyUser) {
qyUser.setBalance(qyUser.getBalance().add(command.getReturnAmount()));
qyUser.setUseBalance(qyUser.getUseBalance().subtract(command.getReturnAmount()));
@ -204,7 +206,7 @@ public class ReturnApprovalApplicationService {
if (StringUtils.isNotBlank(command.getAuditName())) {
model.setAuditName(command.getAuditName());
} else if (StringUtils.isNotBlank(command.getUserid())) {
QyUserEntity qyUserEntity = qyUserService.getUserByUserIdAndCorpid(command.getUserid(), WeixinConstants.corpid);
QyUserEntity qyUserEntity = qyUserService.getUserByUserIdAndCorpid(command.getUserid(), command.getCorpid());
if (null != qyUserEntity) {
model.setAuditName(qyUserEntity.getName());
}
@ -234,6 +236,11 @@ public class ReturnApprovalApplicationService {
cabinetCellModel.updateById();
}
public void approveAssetApproval(UpdateReturnApprovalCommand command) {
}
/**
* 提交退货审批申请
* @param command 添加退货审批命令
@ -278,7 +285,7 @@ public class ReturnApprovalApplicationService {
String appid = "QWTONG_YS_WXSHOP";
List<QyAuthCorpInfoEntity> authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid);
QyAuthCorpInfoEntity authCorpInfo = authCorpInfoList.stream()
.filter(a -> WeixinConstants.corpid.equals(a.getCorpid()))
.filter(a -> command.getCorpid().equals(a.getCorpid()))
.findFirst().orElse(null);
QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, authCorpInfo.getCorpid());
// 获取用户ID
@ -308,6 +315,10 @@ public class ReturnApprovalApplicationService {
return new PageDTO<>(page.getRecords(), page.getTotal());
}
public List<ShopOrderGoodsEntity> getApprovalOrderGoods(Long approvalId) {
return shopOrderGoodsService.selectOrderGoodsByApprovalId(approvalId);
}
/**
* 审批驳回退货申请
* @param command 更新退货审批命令包含驳回原因
@ -318,7 +329,7 @@ public class ReturnApprovalApplicationService {
// 审批人信息
if (StringUtils.isNotBlank(command.getUserid())) {
QyUserEntity qyUserEntity = qyUserService.getUserByUserIdAndCorpid(command.getUserid(), WeixinConstants.corpid);
QyUserEntity qyUserEntity = qyUserService.getUserByUserIdAndCorpid(command.getUserid(), command.getCorpid());
if (null != qyUserEntity) {
model.setAuditName(qyUserEntity.getName());
}

View File

@ -48,6 +48,10 @@ public class ShopGoodsEntity extends BaseEntity<ShopGoodsEntity> {
@TableField("corpid")
private String corpid;
@ApiModelProperty("每人每月限购数量")
@TableField("monthly_purchase_limit")
private String monthlyPurchaseLimit;
@ApiModelProperty("销售价格")
@TableField("price")
private BigDecimal price;

View File

@ -9,6 +9,9 @@ import com.agileboot.domain.shop.goods.db.SearchGoodsDO;
import com.agileboot.domain.system.user.db.SysUserEntity;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ExcelSheet(name = "商品列表")
@ -98,4 +101,7 @@ public class ShopGoodsDTO {
@ExcelColumn(name = "商品使用说明")
private String usageInstruction;
@ExcelColumn(name = "每人每月限购数量")
private String monthlyPurchaseLimit;
}

View File

@ -36,6 +36,10 @@ public class ShopOrderGoodsEntity extends BaseEntity<ShopOrderGoodsEntity> {
@TableField("order_id")
private Long orderId;
@ApiModelProperty("审批ID")
@TableField("approval_id")
private Long approvalId;
@ApiModelProperty("关联商品ID")
@TableField("goods_id")
private Long goodsId;

View File

@ -24,4 +24,6 @@ public interface ShopOrderGoodsService extends IService<ShopOrderGoodsEntity> {
List<TodayLatestOrderGoodsDTO> selectTodayLatestOrderGoods();
List<ShopOrderGoodsEntity> selectUnReturnOrderGoods();
List<ShopOrderGoodsEntity> selectOrderGoodsByApprovalId(Long approvalId);
}

View File

@ -1,6 +1,7 @@
package com.agileboot.domain.shop.order.db;
import com.agileboot.domain.shop.order.dto.TopGoodsDTO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@ -42,4 +43,12 @@ public class ShopOrderGoodsServiceImpl extends ServiceImpl<ShopOrderGoodsMapper,
return baseMapper.selectUnReturnOrderGoods();
}
@Override
public List<ShopOrderGoodsEntity> selectOrderGoodsByApprovalId(Long approvalId) {
QueryWrapper<ShopOrderGoodsEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("approval_id", approvalId)
.eq("deleted", 0);
return this.list(queryWrapper);
}
}

View File

@ -65,4 +65,12 @@ ALTER TABLE `shop_order`
ADD COLUMN `corpid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业微信id';
ALTER TABLE `shop_order_goods`
ADD COLUMN `corpid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业微信id';
ADD COLUMN `corpid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业微信id';
ALTER TABLE `shop_goods`
ADD COLUMN `monthly_purchase_limit` INT DEFAULT NULL COMMENT '每人每月限购数量'
AFTER `corpid`;
ALTER TABLE `shop_order_goods`
ADD COLUMN `approval_id` bigint NULL COMMENT '审批ID'
AFTER `order_id`;