1.优化配置

2.商品订单支付成功后增加执行发放水票业务功能
3.送水订单、商品订单优化生产订单号业务
This commit is contained in:
2026-05-08 15:00:06 +08:00
parent 3c7ee5057f
commit 81a9974e64
10 changed files with 89 additions and 127 deletions

View File

@@ -26,10 +26,13 @@ public class GltTicketOrder implements Serializable {
@TableId(value = "id", type = IdType.AUTO) @TableId(value = "id", type = IdType.AUTO)
private Integer id; private Integer id;
@Schema(description = "订单编号")
private String no;
@Schema(description = "用户水票ID") @Schema(description = "用户水票ID")
private Integer userTicketId; private Integer userTicketId;
@Schema(description = "订单编号") @Schema(description = "关联订单编号")
@TableField(exist = false) @TableField(exist = false)
private String orderNo; private String orderNo;

View File

@@ -130,10 +130,18 @@ public class GltTicketIssueService {
tenantId, uniqueGoodsIds, orders.size(), success, skipped, failed); tenantId, uniqueGoodsIds, orders.size(), success, skipped, failed);
} }
/**
* 商品订单支付成功后调后需处理业务
* @param orderNo 订单号
* @param tenantId 租户ID
*/
@Async @Async
// @Scheduled(cron = "0/1 * 4-22 * * ?") 每秒钟执行一次 public void paySuccessTask(String orderNo, Integer tenantId){
public void paySuccessExecute(String orderNo, Integer tenantId){ //1.发送水票
suerTicketRelease(orderNo, tenantId); suerTicketRelease(orderNo, tenantId);
//2.优惠券扣减、积分发送、消息通知
} }
/** /**
@@ -148,18 +156,23 @@ public class GltTicketIssueService {
return; return;
} }
//2.跳过已完成发放套票订单 //2.只有水票订单才需要发送水票
if(!(shopOrder.getWaterTicketFlag() != null && shopOrder.getWaterTicketFlag() == 1)){
return;
}
//3.跳过已完成发放套票订单
if(shopOrder.getOrderStatus() == 1){ if(shopOrder.getOrderStatus() == 1){
return; return;
} }
//3.订单商品为空跳过执行 //4.订单商品为空跳过执行
List<ShopOrderGoods> goodsList = shopOrderGoodsService.getListByOrderIdIgnoreTenant(shopOrder.getOrderId()); List<ShopOrderGoods> goodsList = shopOrderGoodsService.getListByOrderIdIgnoreTenant(shopOrder.getOrderId());
if (CollectionUtils.isEmpty(goodsList)) { if (CollectionUtils.isEmpty(goodsList)) {
return; return;
} }
//4.执行水票发放业务【】 //5.执行水票发放业务
AtomicBoolean release = new AtomicBoolean(false); AtomicBoolean release = new AtomicBoolean(false);
goodsList.forEach(orderGood ->{ goodsList.forEach(orderGood ->{
IssueOutcome outcome = transactionTemplate.execute(status -> doIssueOne(tenantId, shopOrder, orderGood)); IssueOutcome outcome = transactionTemplate.execute(status -> doIssueOne(tenantId, shopOrder, orderGood));
@@ -168,7 +181,7 @@ public class GltTicketIssueService {
} }
}); });
//5.更新商品订单为已完成、已收到赠品状态 //6.更新商品订单为已完成、已收到赠品状态
if (release.get()) { if (release.get()) {
shopOrderService.update(new LambdaUpdateWrapper<ShopOrder>() shopOrderService.update(new LambdaUpdateWrapper<ShopOrder>()
.eq(ShopOrder::getOrderId, shopOrder.getOrderId()) .eq(ShopOrder::getOrderId, shopOrder.getOrderId())

View File

@@ -9,6 +9,7 @@ import com.gxwebsoft.common.core.web.PageParam;
import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.common.system.mapper.UserMapper; import com.gxwebsoft.common.system.mapper.UserMapper;
import com.gxwebsoft.common.system.redis.OrderNoUtils;
import com.gxwebsoft.glt.entity.GltTicketOrder; import com.gxwebsoft.glt.entity.GltTicketOrder;
import com.gxwebsoft.glt.entity.GltUserTicket; import com.gxwebsoft.glt.entity.GltUserTicket;
import com.gxwebsoft.glt.entity.GltUserTicketLog; import com.gxwebsoft.glt.entity.GltUserTicketLog;
@@ -86,6 +87,9 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
@Resource @Resource
private ShopUserAddressMapper shopUserAddressMapper; private ShopUserAddressMapper shopUserAddressMapper;
@Resource
private OrderNoUtils orderNoUtils;
@Override @Override
public PageResult<GltTicketOrder> pageRel(GltTicketOrderParam param) { public PageResult<GltTicketOrder> pageRel(GltTicketOrderParam param) {
PageParam<GltTicketOrder, GltTicketOrderParam> page = new PageParam<>(param); PageParam<GltTicketOrder, GltTicketOrderParam> page = new PageParam<>(param);
@@ -96,7 +100,7 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
List<ShopUserAddress> userAddressList = shopUserAddressMapper.selectBatchIds(addressIdList); List<ShopUserAddress> userAddressList = shopUserAddressMapper.selectBatchIds(addressIdList);
if(CollectionUtils.isNotEmpty(userAddressList)){ if(CollectionUtils.isNotEmpty(userAddressList)){
list.forEach(ticketOrder ->{ list.forEach(ticketOrder ->{
ShopUserAddress shopUserAddress = userAddressList.stream().filter(address -> ticketOrder.getAddressId().equals(address)).findFirst().orElse(null); ShopUserAddress shopUserAddress = userAddressList.stream().filter(address -> ticketOrder.getAddressId().equals(address.getId())).findFirst().orElse(null);
if(shopUserAddress != null){ if(shopUserAddress != null){
ticketOrder.setFullAddress(shopUserAddress.getFullAddress()); ticketOrder.setFullAddress(shopUserAddress.getFullAddress());
} }
@@ -131,6 +135,10 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
if (userId == null) { if (userId == null) {
throw new BusinessException("请先登录"); throw new BusinessException("请先登录");
} }
String no = orderNoUtils.generate("S");
gltTicketOrder.setNo(no);
Integer userTicketId = gltTicketOrder.getUserTicketId(); Integer userTicketId = gltTicketOrder.getUserTicketId();
if (userTicketId == null) { if (userTicketId == null) {
throw new BusinessException("userTicketId不能为空"); throw new BusinessException("userTicketId不能为空");

View File

@@ -14,7 +14,7 @@ import com.gxwebsoft.common.core.utils.WechatPayConfigValidator;
import com.gxwebsoft.common.core.web.BaseController; import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.common.system.entity.Payment; import com.gxwebsoft.common.system.entity.Payment;
import com.gxwebsoft.glt.service.GltTicketIssueService; import com.gxwebsoft.glt.service.GltTicketIssueService;
import com.gxwebsoft.shop.dto.VerifyShopOrderDto; import com.gxwebsoft.shop.dto.*;
import com.gxwebsoft.shop.entity.ShopOrderDelivery; import com.gxwebsoft.shop.entity.ShopOrderDelivery;
import com.gxwebsoft.shop.entity.ShopUserAddress; import com.gxwebsoft.shop.entity.ShopUserAddress;
import com.gxwebsoft.shop.service.*; import com.gxwebsoft.shop.service.*;
@@ -23,9 +23,6 @@ import com.gxwebsoft.shop.service.impl.KuaiDi100Impl;
import com.gxwebsoft.shop.task.OrderAutoCancelTask; import com.gxwebsoft.shop.task.OrderAutoCancelTask;
import com.gxwebsoft.shop.entity.ShopOrder; import com.gxwebsoft.shop.entity.ShopOrder;
import com.gxwebsoft.shop.param.ShopOrderParam; import com.gxwebsoft.shop.param.ShopOrderParam;
import com.gxwebsoft.shop.dto.OrderCreateRequest;
import com.gxwebsoft.shop.dto.OrderPrepayRequest;
import com.gxwebsoft.shop.dto.UpdatePaymentStatusRequest;
import com.gxwebsoft.payment.service.PaymentService; import com.gxwebsoft.payment.service.PaymentService;
import com.gxwebsoft.payment.dto.PaymentResponse; import com.gxwebsoft.payment.dto.PaymentResponse;
import com.gxwebsoft.payment.enums.PaymentType; import com.gxwebsoft.payment.enums.PaymentType;
@@ -939,8 +936,8 @@ public class ShopOrderController extends BaseController {
// 更新订单状态并处理支付成功后的业务逻辑(包括累加商品销量) // 更新订单状态并处理支付成功后的业务逻辑(包括累加商品销量)
shopOrderService.updateByOutTradeNo(order); shopOrderService.updateByOutTradeNo(order);
// //支付成功执行步任务 //支付成功执行步任务
// gltTicketIssueService.paySuccessExecute(order.getOrderNo(), tenantId); gltTicketIssueService.paySuccessTask(order.getOrderNo(), tenantId);
return "SUCCESS"; return "SUCCESS";
} }
@@ -968,6 +965,13 @@ public class ShopOrderController extends BaseController {
return success(shopOrderService.verifyOrder(verifyDto)); return success(shopOrderService.verifyOrder(verifyDto));
} }
@Operation(summary = "支付成功任务", description = "用户支付成功后执行任务")
@PutMapping("/paySuccessTask")
public ApiResult<Boolean> paySuccessTask(@RequestBody PaySuccessTaskDto taskDto){
gltTicketIssueService.paySuccessTask(taskDto.getOrderNo(), taskDto.getTenantId());
return success(Boolean.TRUE);
}
@Operation(summary = "更新订单支付状态", description = "用户支付成功后主动同步订单状态") @Operation(summary = "更新订单支付状态", description = "用户支付成功后主动同步订单状态")
@PutMapping("/payment-status") @PutMapping("/payment-status")
public ApiResult<?> updateOrderPaymentStatus(@RequestBody UpdatePaymentStatusRequest request) { public ApiResult<?> updateOrderPaymentStatus(@RequestBody UpdatePaymentStatusRequest request) {

View File

@@ -0,0 +1,25 @@
package com.gxwebsoft.shop.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 支付成功执行请求类
*
* @author xm
* @since 2026-05-04
*/
@Data
@Schema(name = "PaySuccessTaskDto", description = "支付成功执行请求类")
public class PaySuccessTaskDto {
@Schema(description = "订单号")
@NotBlank(message = "订单号不能为空")
private String orderNo;
@Schema(description = "租户ID", example = "10584")
private Integer tenantId;
}

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gxwebsoft.common.core.exception.BusinessException; import com.gxwebsoft.common.core.exception.BusinessException;
import com.gxwebsoft.common.system.entity.User; import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.common.system.redis.OrderNoUtils;
import com.gxwebsoft.shop.config.OrderConfigProperties; import com.gxwebsoft.shop.config.OrderConfigProperties;
import com.gxwebsoft.shop.dto.OrderCreateRequest; import com.gxwebsoft.shop.dto.OrderCreateRequest;
import com.gxwebsoft.shop.entity.*; import com.gxwebsoft.shop.entity.*;
@@ -72,6 +73,9 @@ public class OrderBusinessService {
@Resource @Resource
private ShopFlashSaleActivityMapper shopFlashSaleActivityMapper; private ShopFlashSaleActivityMapper shopFlashSaleActivityMapper;
@Resource
private OrderNoUtils orderNoUtils;
/** /**
* 创建订单 * 创建订单
* *
@@ -319,13 +323,8 @@ public class OrderBusinessService {
log.debug("构建订单对象 - 租户ID{}用户ID{}", shopOrder.getTenantId(), shopOrder.getUserId()); log.debug("构建订单对象 - 租户ID{}用户ID{}", shopOrder.getTenantId(), shopOrder.getUserId());
// 生成订单号(如果请求中没有提供) // 生成订单号(如果请求中没有提供)
if (shopOrder.getOrderNo() == null || shopOrder.getOrderNo().trim().isEmpty()) { String orderNo = orderNoUtils.generate("L");
String generatedOrderNo = Long.toString(IdUtil.getSnowflakeNextId()); shopOrder.setOrderNo(orderNo);
shopOrder.setOrderNo(generatedOrderNo);
log.info("生成新订单号: {}", generatedOrderNo);
} else {
log.info("使用请求中的订单号: {}", shopOrder.getOrderNo());
}
// 设置默认备注 // 设置默认备注
if (shopOrder.getComments() == null) { if (shopOrder.getComments() == null) {

View File

@@ -7,18 +7,17 @@ server:
# 数据源配置 # 数据源配置
spring: spring:
datasource: datasource:
url: jdbc:mysql://47.107.249.41:13306/modules?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 url: jdbc:mysql://1Panel-mysql-XsWW:3306/modules?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: modules username: modules
password: tYmmMGh5wpwXR3ae password: tYmmMGh5wpwXR3ae
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
# redis redis:
redis: database: 0
database: 0 host: 1Panel-redis-GmNr
host: 8.134.55.105 port: 6379
port: 16379 password: redis_t74P8C
password: redis_t74P8C
# 日志配置 # 日志配置
logging: logging:

View File

@@ -1,86 +0,0 @@
# 服务器配置
server:
port: 9300
# 数据源配置
spring:
datasource:
url: jdbc:mysql://1Panel-mysql-XsWW:3306/gltdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: gltdb
password: EeD4FtzyA5ksj7Bk
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
remove-abandoned: true
# redis
redis:
database: 0
host: 1Panel-redis-GmNr
port: 6379
password: redis_t74P8C
# 日志配置
logging:
file:
name: websoft-modules.log
level:
root: WARN
com.gxwebsoft: ERROR
com.baomidou.mybatisplus: ERROR
socketio:
host: 0.0.0.0 #IP地址
# MQTT配置
mqtt:
enabled: false # 启用MQTT服务
host: tcp://132.232.214.96:1883
username: swdev
password: Sw20250523
client-id-prefix: hjm_car_
topic: /SW_GPS/#
qos: 2
connection-timeout: 10
keep-alive-interval: 20
auto-reconnect: true
# 框架配置
config:
# 文件服务器
file-server: https://file-s209.shoplnk.cn
# 生产环境接口
server-url: https://glt-server.websoft.top/api
# 业务模块接口
api-url: https://glt-api.websoft.top/api
upload-path: /www/wwwroot/file.ws
# 阿里云OSS云存储
endpoint: https://oss-cn-shenzhen.aliyuncs.com
accessKeyId: LTAI4GKGZ9Z2Z8JZ77c3GNZP
accessKeySecret: BiDkpS7UXj72HWwDWaFZxiXjNFBNCM
bucketName: oss-gxwebsoft
bucketDomain: https://oss.wsdns.cn
aliyunDomain: https://oss-gxwebsoft.oss-cn-shenzhen.aliyuncs.com
# 生产环境证书配置
certificate:
load-mode: VOLUME # 生产环境从Docker挂载卷加载
cert-root-path: /www/wwwroot/file.ws
# 支付配置缓存
payment:
cache:
# 支付配置缓存键前缀,生产环境使用 Payment:1* 格式
key-prefix: "Payment:1"
# 缓存过期时间(小时)
expire-hours: 24
# 阿里云翻译配置
aliyun:
translate:
access-key-id: LTAI5tEsyhW4GCKbds1qsopg
access-key-secret: zltFlQrYVAoq2KMFDWgLa3GhkMNeyO
endpoint: mt.cn-hangzhou.aliyuncs.com
wechatpay:
transfer:
scene-id: 1005
scene-report-infos-json: '[{"info_type":"岗位类型","info_content":"配送员"},{"info_type":"报酬说明","info_content":"12月份配送费"}]'

View File

@@ -7,18 +7,17 @@ server:
# 数据源配置 # 数据源配置
spring: spring:
datasource: datasource:
url: jdbc:mysql://1Panel-mysql-XsWW:3306/gltdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai url: jdbc:mysql://47.107.249.41:13306/modules?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: gltdb username: modules
password: EeD4FtzyA5ksj7Bk password: tYmmMGh5wpwXR3ae
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource type: com.alibaba.druid.pool.DruidDataSource
# redis redis:
redis: database: 0
database: 0 host: 47.107.249.41
host: 1Panel-redis-GmNr port: 16379
port: 6379 password: redis_t74P8C
password: redis_t74P8C
# 日志配置 # 日志配置
logging: logging:
@@ -44,10 +43,8 @@ mqtt:
# 框架配置 # 框架配置
config: config:
# 基础模块接口 # 开发环境接口
server-url: https://glt-server.websoft.top/api server-url: https://glt-server.websoft.top/api
# 业务模块接口
api-url: https://glt-api.websoft.top/api
upload-path: /Users/gxwebsoft/Documents/uploads/ # window(D:\Temp) upload-path: /Users/gxwebsoft/Documents/uploads/ # window(D:\Temp)
# 开发环境证书配置 # 开发环境证书配置

View File

@@ -4,7 +4,7 @@ server:
# 多环境配置 # 多环境配置
spring: spring:
profiles: profiles:
active: dev active: local
application: application:
name: server name: server