diff --git a/src/main/java/com/gxwebsoft/glt/entity/GltTicketOrder.java b/src/main/java/com/gxwebsoft/glt/entity/GltTicketOrder.java index 02a60ea..9060d9c 100644 --- a/src/main/java/com/gxwebsoft/glt/entity/GltTicketOrder.java +++ b/src/main/java/com/gxwebsoft/glt/entity/GltTicketOrder.java @@ -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; diff --git a/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java b/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java index 5cd7fbb..985ae98 100644 --- a/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java +++ b/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java @@ -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 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() .eq(ShopOrder::getOrderId, shopOrder.getOrderId()) diff --git a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java index 3951b4c..519d576 100644 --- a/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java +++ b/src/main/java/com/gxwebsoft/glt/service/impl/GltTicketOrderServiceImpl.java @@ -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 pageRel(GltTicketOrderParam param) { PageParam page = new PageParam<>(param); @@ -96,7 +100,7 @@ public class GltTicketOrderServiceImpl extends ServiceImpl 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 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) { diff --git a/src/main/java/com/gxwebsoft/shop/dto/PaySuccessTaskDto.java b/src/main/java/com/gxwebsoft/shop/dto/PaySuccessTaskDto.java new file mode 100644 index 0000000..85a4cb9 --- /dev/null +++ b/src/main/java/com/gxwebsoft/shop/dto/PaySuccessTaskDto.java @@ -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; + +} diff --git a/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java b/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java index 232bbd7..b21251c 100644 --- a/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java +++ b/src/main/java/com/gxwebsoft/shop/service/OrderBusinessService.java @@ -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) { diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 7c3a897..aeccfea 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -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: diff --git a/src/main/resources/application-glt3.yml b/src/main/resources/application-glt3.yml deleted file mode 100644 index 6bd8987..0000000 --- a/src/main/resources/application-glt3.yml +++ /dev/null @@ -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月份配送费"}]' diff --git a/src/main/resources/application-glt2.yml b/src/main/resources/application-local.yml similarity index 80% rename from src/main/resources/application-glt2.yml rename to src/main/resources/application-local.yml index b583eb8..e1e85a2 100644 --- a/src/main/resources/application-glt2.yml +++ b/src/main/resources/application-local.yml @@ -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) # 开发环境证书配置 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 261f2a1..f61bd6f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,7 +4,7 @@ server: # 多环境配置 spring: profiles: - active: dev + active: local application: name: server