feat(订单): 添加审批支付类型支持

在订单服务中添加审批支付类型处理逻辑,包括:
1. 修改QyUserService接口及相关实现,支持按企业ID查询管理员
2. 扩展支付方式描述和订单提交参数
3. 实现审批支付流程,包括创建审批记录和发送企业微信通知
This commit is contained in:
dzq 2025-06-09 16:45:35 +08:00
parent 59d8ff188a
commit 4da0d35be4
8 changed files with 99 additions and 9 deletions

View File

@ -175,7 +175,7 @@ public class AssetApplicationService {
.findFirst().orElse(null);
QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, postAssetApprovalCommand.getCorpid());
// 获取用户ID
List<String> adminUserIds = qyUserService.selectAdminUserIds();
List<String> adminUserIds = qyUserService.selectAdminUserIds(postAssetApprovalCommand.getCorpid());
String toUser = String.join("|", adminUserIds);
String toparty = "";
String totag = "";

View File

@ -46,11 +46,12 @@ public interface QyUserMapper extends BaseMapper<QyUserEntity> {
"LEFT JOIN sys_user su ON suqy.sys_user_id = su.user_id " +
"LEFT JOIN sys_role sr ON su.role_id = sr.role_id " +
"WHERE qu.deleted = 0 " +
"AND qu.corpid = #{corpid}" +
"AND suqy.deleted = 0 " +
"AND su.deleted = 0 " +
"AND sr.deleted = 0 " +
"AND sr.role_key = 'admin'")
List<String> selectAdminUserIds();
List<String> selectAdminUserIds(@Param("corpid") String corpid);
@Select("SELECT SUM(balance) AS balance, SUM(use_balance) AS useBalance, SUM(balance_limit) AS balanceLimit " +
"FROM qy_user " +

View File

@ -27,7 +27,7 @@ public interface QyUserService extends IService<QyUserEntity> {
QyUserEntity getUserByUserIdAndCorpid(String userid, String corpid);
List<String> selectAdminUserIds();
List<String> selectAdminUserIds(String corpid);
QyUserStatsDTO selectTotalBalance(String corpid);
}

View File

@ -9,6 +9,7 @@ import com.agileboot.domain.qywx.userQySys.db.SysUserQyUserMapper;
import com.agileboot.domain.system.user.db.SysUserEntity;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -55,8 +56,8 @@ public class QyUserServiceImpl extends ServiceImpl<QyUserMapper, QyUserEntity> i
}
@Override
public List<String> selectAdminUserIds() {
return baseMapper.selectAdminUserIds();
public List<String> selectAdminUserIds(String corpid) {
return baseMapper.selectAdminUserIds(corpid);
}
@Override

View File

@ -361,7 +361,7 @@ public class ReturnApprovalApplicationService {
.findFirst().orElse(null);
QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, authCorpInfo.getCorpid());
// 获取用户ID
List<String> adminUserIds = qyUserService.selectAdminUserIds();
List<String> adminUserIds = qyUserService.selectAdminUserIds(command.getCorpid());
String toUser = String.join("|", adminUserIds);
String toparty = "";
String totag = "";

View File

@ -17,10 +17,21 @@ import com.agileboot.domain.cabinet.smartCabinet.db.SmartCabinetEntity;
import com.agileboot.domain.cabinet.smartCabinet.db.SmartCabinetService;
import com.agileboot.domain.common.command.BulkOperationCommand;
import com.agileboot.domain.mqtt.MqttService;
import com.agileboot.domain.qywx.accessToken.AccessTokenApplicationService;
import com.agileboot.domain.qywx.accessToken.db.QyAccessTokenEntity;
import com.agileboot.domain.qywx.api.QywxApiUtil;
import com.agileboot.domain.qywx.api.response.NewsArticle;
import com.agileboot.domain.qywx.authCorpInfo.AuthCorpInfoApplicationService;
import com.agileboot.domain.qywx.authCorpInfo.db.QyAuthCorpInfoEntity;
import com.agileboot.domain.qywx.user.db.QyUserEntity;
import com.agileboot.domain.qywx.user.db.QyUserService;
import com.agileboot.domain.shop.approval.command.AddReturnApprovalCommand;
import com.agileboot.domain.shop.approval.command.UpdateReturnApprovalCommand;
import com.agileboot.domain.shop.approval.model.ReturnApprovalModel;
import com.agileboot.domain.shop.approval.model.ReturnApprovalModelFactory;
import com.agileboot.domain.shop.goods.db.ShopGoodsEntity;
import com.agileboot.domain.shop.goods.db.ShopGoodsService;
import com.agileboot.domain.shop.goods.model.GoodsModel;
import com.agileboot.domain.shop.order.command.SubmitOrderCommand;
import com.agileboot.domain.shop.order.db.*;
import com.agileboot.domain.shop.order.db.dto.OrderWithGoodsDTO;
@ -41,6 +52,7 @@ import com.agileboot.domain.shop.paymentOperationLog.command.AddPaymentOperation
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@ -50,6 +62,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -71,6 +84,10 @@ public class OrderApplicationService {
private final CabinetCellOperationModelFactory cabinetCellOperationModelFactory;
private final PaymentOperationLogApplicationService paymentOperationLogApplicationService;
private final CabinetMainboardService cabinetMainboardService;
private final ReturnApprovalModelFactory modelFactory;
private final AuthCorpInfoApplicationService authCorpInfoApplicationService;
private final AccessTokenApplicationService accessTokenApplicationService;
private final QyUserService qyUserService;
public PageDTO<OrderWithGoodsDTO> getOrderList(SearchShopOrderQuery<OrderWithGoodsDTO> query) {
Page<OrderWithGoodsDTO> page = orderService.getOrderList(query);
@ -195,9 +212,76 @@ public class OrderApplicationService {
handlePaymentSuccess(orderModel.getOrderId(), Integer.valueOf(amountInFen.toPlainString()),
"balance-" + orderModel.getOrderId(), DateUtil.formatDateTime(new Date()));
return new CreateOrderResult(orderModel.getOrderId(), orderModel.getTotalAmount(), null, qyUser.getBalance());
}
} else if (Objects.equals(command.getPaymentType(), "approval")) {
submitAssetApproval(orderModel, goodsList, command.getCorpid(), command.getName());
return new CreateOrderResult(orderModel.getOrderId(), orderModel.getTotalAmount(), null, BigDecimal.valueOf(0));
}else {
throw new ApiException(ErrorCode.Client.COMMON_REQUEST_PARAMETERS_INVALID, "无效的支付类型");
}
}
private void submitAssetApproval(OrderModel orderModel, List<ShopOrderGoodsEntity> orderGoodsList, String corpid, String name) {
ShopOrderGoodsEntity firstOrderGoods = orderGoodsList.get(0);
// 设置商品价格并初始化审批状态
AddReturnApprovalCommand command = new AddReturnApprovalCommand();
command.initBaseEntity();
command.setGoodsId(firstOrderGoods.getGoodsId());
command.setOrderId(orderModel.getOrderId());
command.setReturnImages(command.getReturnImages());
command.setReturnRemark(command.getReturnRemark());
command.setStatus(1);
command.setCreatorId(0L);
command.setCreateTime(new Date());
command.setUpdaterId(0L);
command.setUpdateTime(new Date());
command.setDeleted(false);
// 执行业务逻辑
ReturnApprovalModel returnApprovalModel = modelFactory.create();
returnApprovalModel.loadAddCommand(command);
returnApprovalModel.insert();
// 更新订单商品状态
orderGoodsList.forEach(orderGoods -> {
orderGoods.setStatus(5);
orderGoods.setApprovalId(returnApprovalModel.getApprovalId());
orderGoodsService.updateById(orderGoods);
});
// 如果商品免审批则自动审批
// 发送审核消息
try {
String appid = "QWTONG_YS_WXSHOP";
List<QyAuthCorpInfoEntity> authCorpInfoList = authCorpInfoApplicationService.getByAppid(appid);
QyAuthCorpInfoEntity authCorpInfo = authCorpInfoList.stream()
.filter(a -> command.getCorpid().equals(a.getCorpid()))
.findFirst().orElse(null);
QyAccessTokenEntity accessToken = accessTokenApplicationService.getByAppid(appid, authCorpInfo.getCorpid());
// 获取用户ID
List<String> adminUserIds = qyUserService.selectAdminUserIds(corpid);
String toUser = String.join("|", adminUserIds);
String toparty = "";
String totag = "";
List<NewsArticle> articles = new ArrayList<>();
NewsArticle article = new NewsArticle();
article.setTitle("耗材领用申请通知");
article.setDescription("领用商品:" + firstOrderGoods.getGoodsName());
if (orderGoodsList.size() > 1) {
article.setDescription(name + " 申请领用" + firstOrderGoods.getGoodsName() + "" + orderGoodsList.size() + "件商品");
} else {
article.setDescription(name + " 申请领用" + firstOrderGoods.getGoodsName());
}
article.setPicurl(firstOrderGoods.getCoverImg());
article.setUrl("http://wxshop.ab98.cn/shop-api/api/shop/qy/wechatAuth");
articles.add(article);
QywxApiUtil.sendNewsMessage(accessToken.getAccessToken(), Integer.valueOf(authCorpInfo.getAgentid()),
toUser, toparty, totag, articles);
} catch (Exception e) {
log.error("发送退货审核通知失败", e);
}
}
private WxJsApiPreCreateRequest buildPaymentRequest(OrderModel orderModel) {
WxJsApiPreCreateRequest request = new WxJsApiPreCreateRequest();
@ -242,6 +326,7 @@ public class OrderApplicationService {
// 保存订单商品
goodsModel.insert();
BeanUtils.copyProperties(goodsModel, goods);
// 扣减库存
// 改为收到支付成功后扣减库存

View File

@ -19,9 +19,12 @@ public class SubmitOrderCommand {
@ApiModelProperty("订单主体信息")
private ShopOrderEntity order;
@ApiModelProperty("支付类型 wechat:微信 balance:余额")
@ApiModelProperty("支付类型 wechat:微信 balance:余额 approval:审批")
private String paymentType;
@ApiModelProperty("领用说明")
private String applyRemark;
@ApiModelProperty("订单商品明细列表")
private List<ShopOrderGoodsEntity> goodsList;

View File

@ -85,7 +85,7 @@ public class ShopOrderEntity extends BaseEntity<ShopOrderEntity> {
@TableField("is_deduct_stock")
private Integer isDeductStock;
@ApiModelProperty("支付方式")
@ApiModelProperty("支付方式 wechat:微信 balance:余额 approval:审批")
@TableField("payment_method")
private String paymentMethod;