1.优化配置
2.商品订单支付成功后增加执行发放水票业务功能 3.送水订单、商品订单优化生产订单号业务
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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不能为空");
|
||||
|
||||
@@ -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) {
|
||||
|
||||
25
src/main/java/com/gxwebsoft/shop/dto/PaySuccessTaskDto.java
Normal file
25
src/main/java/com/gxwebsoft/shop/dto/PaySuccessTaskDto.java
Normal 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;
|
||||
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -7,18 +7,17 @@ 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
|
||||
password: redis_t74P8C
|
||||
redis:
|
||||
database: 0
|
||||
host: 1Panel-redis-GmNr
|
||||
port: 6379
|
||||
password: redis_t74P8C
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
|
||||
@@ -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月份配送费"}]'
|
||||
@@ -7,18 +7,17 @@ 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
|
||||
password: redis_t74P8C
|
||||
redis:
|
||||
database: 0
|
||||
host: 47.107.249.41
|
||||
port: 16379
|
||||
password: redis_t74P8C
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
@@ -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)
|
||||
|
||||
# 开发环境证书配置
|
||||
@@ -4,7 +4,7 @@ server:
|
||||
# 多环境配置
|
||||
spring:
|
||||
profiles:
|
||||
active: dev
|
||||
active: local
|
||||
|
||||
application:
|
||||
name: server
|
||||
|
||||
Reference in New Issue
Block a user