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)
private Integer id;
@Schema(description = "订单编号")
private String no;
@Schema(description = "用户水票ID")
private Integer userTicketId;
@Schema(description = "订单编号")
@Schema(description = "关联订单编号")
@TableField(exist = false)
private String orderNo;

View File

@@ -130,10 +130,18 @@ public class GltTicketIssueService {
tenantId, uniqueGoodsIds, orders.size(), success, skipped, failed);
}
/**
* 商品订单支付成功后调后需处理业务
* @param orderNo 订单号
* @param tenantId 租户ID
*/
@Async
// @Scheduled(cron = "0/1 * 4-22 * * ?") 每秒钟执行一次
public void paySuccessExecute(String orderNo, Integer tenantId){
public void paySuccessTask(String orderNo, Integer tenantId){
//1.发送水票
suerTicketRelease(orderNo, tenantId);
//2.优惠券扣减、积分发送、消息通知
}
/**
@@ -148,18 +156,23 @@ public class GltTicketIssueService {
return;
}
//2.跳过已完成发放套票订单
//2.只有水票订单才需要发送水票
if(!(shopOrder.getWaterTicketFlag() != null && shopOrder.getWaterTicketFlag() == 1)){
return;
}
//3.跳过已完成发放套票订单
if(shopOrder.getOrderStatus() == 1){
return;
}
//3.订单商品为空跳过执行
//4.订单商品为空跳过执行
List<ShopOrderGoods> goodsList = shopOrderGoodsService.getListByOrderIdIgnoreTenant(shopOrder.getOrderId());
if (CollectionUtils.isEmpty(goodsList)) {
return;
}
//4.执行水票发放业务【】
//5.执行水票发放业务
AtomicBoolean release = new AtomicBoolean(false);
goodsList.forEach(orderGood ->{
IssueOutcome outcome = transactionTemplate.execute(status -> doIssueOne(tenantId, shopOrder, orderGood));
@@ -168,7 +181,7 @@ public class GltTicketIssueService {
}
});
//5.更新商品订单为已完成、已收到赠品状态
//6.更新商品订单为已完成、已收到赠品状态
if (release.get()) {
shopOrderService.update(new LambdaUpdateWrapper<ShopOrder>()
.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.system.entity.User;
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.GltUserTicket;
import com.gxwebsoft.glt.entity.GltUserTicketLog;
@@ -86,6 +87,9 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
@Resource
private ShopUserAddressMapper shopUserAddressMapper;
@Resource
private OrderNoUtils orderNoUtils;
@Override
public PageResult<GltTicketOrder> pageRel(GltTicketOrderParam param) {
PageParam<GltTicketOrder, GltTicketOrderParam> page = new PageParam<>(param);
@@ -96,7 +100,7 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
List<ShopUserAddress> userAddressList = shopUserAddressMapper.selectBatchIds(addressIdList);
if(CollectionUtils.isNotEmpty(userAddressList)){
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){
ticketOrder.setFullAddress(shopUserAddress.getFullAddress());
}
@@ -131,6 +135,10 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
if (userId == null) {
throw new BusinessException("请先登录");
}
String no = orderNoUtils.generate("S");
gltTicketOrder.setNo(no);
Integer userTicketId = gltTicketOrder.getUserTicketId();
if (userTicketId == null) {
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.system.entity.Payment;
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.ShopUserAddress;
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.entity.ShopOrder;
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.dto.PaymentResponse;
import com.gxwebsoft.payment.enums.PaymentType;
@@ -939,8 +936,8 @@ public class ShopOrderController extends BaseController {
// 更新订单状态并处理支付成功后的业务逻辑(包括累加商品销量)
shopOrderService.updateByOutTradeNo(order);
// //支付成功执行步任务
// gltTicketIssueService.paySuccessExecute(order.getOrderNo(), tenantId);
//支付成功执行步任务
gltTicketIssueService.paySuccessTask(order.getOrderNo(), tenantId);
return "SUCCESS";
}
@@ -968,6 +965,13 @@ public class ShopOrderController extends BaseController {
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 = "用户支付成功后主动同步订单状态")
@PutMapping("/payment-status")
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.gxwebsoft.common.core.exception.BusinessException;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.common.system.redis.OrderNoUtils;
import com.gxwebsoft.shop.config.OrderConfigProperties;
import com.gxwebsoft.shop.dto.OrderCreateRequest;
import com.gxwebsoft.shop.entity.*;
@@ -72,6 +73,9 @@ public class OrderBusinessService {
@Resource
private ShopFlashSaleActivityMapper shopFlashSaleActivityMapper;
@Resource
private OrderNoUtils orderNoUtils;
/**
* 创建订单
*
@@ -319,13 +323,8 @@ public class OrderBusinessService {
log.debug("构建订单对象 - 租户ID{}用户ID{}", shopOrder.getTenantId(), shopOrder.getUserId());
// 生成订单号(如果请求中没有提供)
if (shopOrder.getOrderNo() == null || shopOrder.getOrderNo().trim().isEmpty()) {
String generatedOrderNo = Long.toString(IdUtil.getSnowflakeNextId());
shopOrder.setOrderNo(generatedOrderNo);
log.info("生成新订单号: {}", generatedOrderNo);
} else {
log.info("使用请求中的订单号: {}", shopOrder.getOrderNo());
}
String orderNo = orderNoUtils.generate("L");
shopOrder.setOrderNo(orderNo);
// 设置默认备注
if (shopOrder.getComments() == null) {

View File

@@ -7,17 +7,16 @@ server:
# 数据源配置
spring:
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
password: tYmmMGh5wpwXR3ae
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# redis
redis:
database: 0
host: 8.134.55.105
port: 16379
host: 1Panel-redis-GmNr
port: 6379
password: redis_t74P8C
# 日志配置

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,17 +7,16 @@ server:
# 数据源配置
spring:
datasource:
url: jdbc:mysql://1Panel-mysql-XsWW:3306/gltdb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: gltdb
password: EeD4FtzyA5ksj7Bk
url: jdbc:mysql://47.107.249.41:13306/modules?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: modules
password: tYmmMGh5wpwXR3ae
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# redis
redis:
database: 0
host: 1Panel-redis-GmNr
port: 6379
host: 47.107.249.41
port: 16379
password: redis_t74P8C
# 日志配置
@@ -44,10 +43,8 @@ mqtt:
# 框架配置
config:
# 基础模块接口
# 开发环境接口
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)
# 开发环境证书配置

View File

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