mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 10:48:43 +08:00 
			
		
		
		
	Merge branch 'master-jdk17' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into develop
# Conflicts: # yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/SmsClientTests.java
This commit is contained in:
		| @@ -46,6 +46,7 @@ public class TenantJobAspect { | |||||||
|                 try { |                 try { | ||||||
|                     joinPoint.proceed(); |                     joinPoint.proceed(); | ||||||
|                 } catch (Throwable e) { |                 } catch (Throwable e) { | ||||||
|  |                     log.error("[execute][租户({}) 执行 Job 发生异常", tenantId, e); | ||||||
|                     results.put(tenantId, ExceptionUtil.getRootCauseMessage(e)); |                     results.put(tenantId, ExceptionUtil.getRootCauseMessage(e)); | ||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
|   | |||||||
| @@ -59,8 +59,8 @@ public class YudaoWebAutoConfiguration implements WebMvcConfigurer { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Bean |     @Bean | ||||||
|     public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogFrameworkService ApiErrorLogFrameworkService) { |     public GlobalExceptionHandler globalExceptionHandler(ApiErrorLogFrameworkService apiErrorLogFrameworkService) { | ||||||
|         return new GlobalExceptionHandler(applicationName, ApiErrorLogFrameworkService); |         return new GlobalExceptionHandler(applicationName, apiErrorLogFrameworkService); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Bean |     @Bean | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| package cn.iocoder.yudao.framework.ai.core.model.deepseek; | package cn.iocoder.yudao.framework.ai.core.model.deepseek; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.ListUtil; | ||||||
| import cn.hutool.core.lang.Assert; | import cn.hutool.core.lang.Assert; | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
| import org.springframework.ai.chat.metadata.ChatGenerationMetadata; | import org.springframework.ai.chat.metadata.ChatGenerationMetadata; | ||||||
| @@ -70,12 +71,12 @@ public class DeepSeekChatModel implements ChatModel { | |||||||
|             OpenAiApi.ChatCompletion chatCompletion = completionEntity.getBody(); |             OpenAiApi.ChatCompletion chatCompletion = completionEntity.getBody(); | ||||||
|             if (chatCompletion == null) { |             if (chatCompletion == null) { | ||||||
|                 log.warn("No chat completion returned for prompt: {}", prompt); |                 log.warn("No chat completion returned for prompt: {}", prompt); | ||||||
|                 return new ChatResponse(List.of()); |                 return new ChatResponse(ListUtil.of()); | ||||||
|             } |             } | ||||||
|             List<OpenAiApi.ChatCompletion.Choice> choices = chatCompletion.choices(); |             List<OpenAiApi.ChatCompletion.Choice> choices = chatCompletion.choices(); | ||||||
|             if (choices == null) { |             if (choices == null) { | ||||||
|                 log.warn("No choices returned for prompt: {}", prompt); |                 log.warn("No choices returned for prompt: {}", prompt); | ||||||
|                 return new ChatResponse(List.of()); |                 return new ChatResponse(ListUtil.of()); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             // 2. 转换 ChatResponse 返回 |             // 2. 转换 ChatResponse 返回 | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| package cn.iocoder.yudao.framework.ai.core.model.xinghuo; | package cn.iocoder.yudao.framework.ai.core.model.xinghuo; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.ListUtil; | ||||||
| import cn.hutool.core.lang.Assert; | import cn.hutool.core.lang.Assert; | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
| import org.springframework.ai.chat.metadata.ChatGenerationMetadata; | import org.springframework.ai.chat.metadata.ChatGenerationMetadata; | ||||||
| @@ -72,12 +73,12 @@ public class XingHuoChatModel implements ChatModel { | |||||||
|             OpenAiApi.ChatCompletion chatCompletion = completionEntity.getBody(); |             OpenAiApi.ChatCompletion chatCompletion = completionEntity.getBody(); | ||||||
|             if (chatCompletion == null) { |             if (chatCompletion == null) { | ||||||
|                 log.warn("No chat completion returned for prompt: {}", prompt); |                 log.warn("No chat completion returned for prompt: {}", prompt); | ||||||
|                 return new ChatResponse(List.of()); |                 return new ChatResponse(ListUtil.of()); | ||||||
|             } |             } | ||||||
|             List<OpenAiApi.ChatCompletion.Choice> choices = chatCompletion.choices(); |             List<OpenAiApi.ChatCompletion.Choice> choices = chatCompletion.choices(); | ||||||
|             if (choices == null) { |             if (choices == null) { | ||||||
|                 log.warn("No choices returned for prompt: {}", prompt); |                 log.warn("No choices returned for prompt: {}", prompt); | ||||||
|                 return new ChatResponse(List.of()); |                 return new ChatResponse(ListUtil.of()); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             // 2. 转换 ChatResponse 返回 |             // 2. 转换 ChatResponse 返回 | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ | |||||||
|  |  | ||||||
| package com.alibaba.cloud.ai.tongyi.audio.transcription; | package com.alibaba.cloud.ai.tongyi.audio.transcription; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.ListUtil; | ||||||
| import com.alibaba.cloud.ai.tongyi.audio.AudioTranscriptionModels; | import com.alibaba.cloud.ai.tongyi.audio.AudioTranscriptionModels; | ||||||
| import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionPrompt; | import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionPrompt; | ||||||
| import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionResponse; | import com.alibaba.cloud.ai.tongyi.audio.transcription.api.AudioTranscriptionResponse; | ||||||
| @@ -82,7 +83,7 @@ public class TongYiAudioTranscriptionModel | |||||||
| 			try { | 			try { | ||||||
| 				transcriptionParam = TranscriptionParam.builder() | 				transcriptionParam = TranscriptionParam.builder() | ||||||
| 						.model(AudioTranscriptionModels.Paraformer_V1) | 						.model(AudioTranscriptionModels.Paraformer_V1) | ||||||
| 						.fileUrls(List.of(String.valueOf(instructions.getURL()))) | 						.fileUrls(ListUtil.of(String.valueOf(instructions.getURL()))) | ||||||
| 						.build(); | 						.build(); | ||||||
| 			} | 			} | ||||||
| 			catch (IOException e) { | 			catch (IOException e) { | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ | |||||||
|  |  | ||||||
| package com.alibaba.cloud.ai.tongyi.chat; | package com.alibaba.cloud.ai.tongyi.chat; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.ListUtil; | ||||||
| import com.alibaba.cloud.ai.tongyi.common.exception.TongYiException; | import com.alibaba.cloud.ai.tongyi.common.exception.TongYiException; | ||||||
| import com.alibaba.dashscope.aigc.conversation.ConversationParam; | import com.alibaba.dashscope.aigc.conversation.ConversationParam; | ||||||
| import com.alibaba.dashscope.aigc.generation.Generation; | import com.alibaba.dashscope.aigc.generation.Generation; | ||||||
| @@ -207,7 +208,7 @@ public class TongYiChatModel extends | |||||||
| 															.getChoices() | 															.getChoices() | ||||||
| 															.get(0) | 															.get(0) | ||||||
| 											)); | 											)); | ||||||
| 									return new ChatResponse(List.of(gen)); | 									return new ChatResponse(ListUtil.of(gen)); | ||||||
| 								}) | 								}) | ||||||
| 				) | 				) | ||||||
| 				.publishOn(Schedulers.parallel()); | 				.publishOn(Schedulers.parallel()); | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ | |||||||
|  |  | ||||||
| package com.alibaba.cloud.ai.tongyi.embedding; | package com.alibaba.cloud.ai.tongyi.embedding; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.ListUtil; | ||||||
| import com.alibaba.cloud.ai.tongyi.common.exception.TongYiException; | import com.alibaba.cloud.ai.tongyi.common.exception.TongYiException; | ||||||
| import com.alibaba.cloud.ai.tongyi.metadata.TongYiTextEmbeddingResponseMetadata; | import com.alibaba.cloud.ai.tongyi.metadata.TongYiTextEmbeddingResponseMetadata; | ||||||
| import com.alibaba.dashscope.embeddings.TextEmbedding; | import com.alibaba.dashscope.embeddings.TextEmbedding; | ||||||
| @@ -100,7 +101,7 @@ public class TongYiTextEmbeddingModel extends AbstractEmbeddingModel { | |||||||
|  |  | ||||||
| 		return this.call( | 		return this.call( | ||||||
| 						new EmbeddingRequest( | 						new EmbeddingRequest( | ||||||
| 								List.of(document.getFormattedContent(this.metadataMode)), | 								ListUtil.of(document.getFormattedContent(this.metadataMode)), | ||||||
| 								null) | 								null) | ||||||
| 				).getResults().stream() | 				).getResults().stream() | ||||||
| 				.map(Embedding::getOutput) | 				.map(Embedding::getOutput) | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| package cn.iocoder.yudao.framework.ai.music; | package cn.iocoder.yudao.framework.ai.music; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.ListUtil; | ||||||
| import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; | import cn.iocoder.yudao.framework.ai.core.model.suno.api.SunoApi; | ||||||
| import org.junit.jupiter.api.Disabled; | import org.junit.jupiter.api.Disabled; | ||||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||||
| @@ -66,7 +67,7 @@ public class SunoApiTests { | |||||||
|         String id = "584729e5-0fe9-4157-86da-1b4803ff42bf"; |         String id = "584729e5-0fe9-4157-86da-1b4803ff42bf"; | ||||||
|  |  | ||||||
|         // 调用方法 |         // 调用方法 | ||||||
|         List<SunoApi.MusicData> musicList = sunoApi.getMusicList(List.of(id)); |         List<SunoApi.MusicData> musicList = sunoApi.getMusicList(ListUtil.of(id)); | ||||||
|         // 打印结果 |         // 打印结果 | ||||||
|         System.out.println(musicList); |         System.out.println(musicList); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package cn.iocoder.yudao.module.crm.service.statistics; | package cn.iocoder.yudao.module.crm.service.statistics; | ||||||
|  |  | ||||||
| import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||||
|  | import cn.hutool.core.collection.ListUtil; | ||||||
| import cn.hutool.core.util.ObjUtil; | import cn.hutool.core.util.ObjUtil; | ||||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO; | import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceReqVO; | ||||||
| import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO; | import cn.iocoder.yudao.module.crm.controller.admin.statistics.vo.performance.CrmStatisticsPerformanceRespVO; | ||||||
| @@ -106,7 +107,7 @@ public class CrmStatisticsPerformanceServiceImpl implements CrmStatisticsPerform | |||||||
|     private List<Long> getUserIds(CrmStatisticsPerformanceReqVO reqVO) { |     private List<Long> getUserIds(CrmStatisticsPerformanceReqVO reqVO) { | ||||||
|         // 情况一:选中某个用户 |         // 情况一:选中某个用户 | ||||||
|         if (ObjUtil.isNotNull(reqVO.getUserId())) { |         if (ObjUtil.isNotNull(reqVO.getUserId())) { | ||||||
|             return List.of(reqVO.getUserId()); |             return ListUtil.of(reqVO.getUserId()); | ||||||
|         } |         } | ||||||
|         // 情况二:选中某个部门 |         // 情况二:选中某个部门 | ||||||
|         // 2.1 获得部门列表 |         // 2.1 获得部门列表 | ||||||
|   | |||||||
| @@ -114,7 +114,8 @@ public class JobLogServiceImplTest extends BaseDbUnitTest { | |||||||
|         assertEquals(1, count); |         assertEquals(1, count); | ||||||
|         List<JobLogDO> logs = jobLogMapper.selectList(); |         List<JobLogDO> logs = jobLogMapper.selectList(); | ||||||
|         assertEquals(1, logs.size()); |         assertEquals(1, logs.size()); | ||||||
|         assertEquals(log02, logs.get(0)); |         // TODO @芋艿:createTime updateTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(log02, logs.get(0), "createTime", "updateTime"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|   | |||||||
| @@ -91,7 +91,8 @@ public class ApiAccessLogServiceImplTest extends BaseDbUnitTest { | |||||||
|         assertEquals(1, count); |         assertEquals(1, count); | ||||||
|         List<ApiAccessLogDO> logs = apiAccessLogMapper.selectList(); |         List<ApiAccessLogDO> logs = apiAccessLogMapper.selectList(); | ||||||
|         assertEquals(1, logs.size()); |         assertEquals(1, logs.size()); | ||||||
|         assertEquals(log02, logs.get(0)); |         // TODO @芋艿:createTime updateTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(log02, logs.get(0), "createTime", "updateTime"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|   | |||||||
| @@ -157,7 +157,8 @@ public class ApiErrorLogServiceImplTest extends BaseDbUnitTest { | |||||||
|         assertEquals(1, count); |         assertEquals(1, count); | ||||||
|         List<ApiErrorLogDO> logs = apiErrorLogMapper.selectList(); |         List<ApiErrorLogDO> logs = apiErrorLogMapper.selectList(); | ||||||
|         assertEquals(1, logs.size()); |         assertEquals(1, logs.size()); | ||||||
|         assertEquals(log02, logs.get(0)); |         // TODO @芋艿:createTime updateTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(log02, logs.get(0), "createTime", "updateTime"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -19,6 +19,7 @@ spring: | |||||||
|   sql: |   sql: | ||||||
|     init: |     init: | ||||||
|       schema-locations: classpath:/sql/create_tables.sql |       schema-locations: classpath:/sql/create_tables.sql | ||||||
|  |       encoding: UTF-8 | ||||||
|  |  | ||||||
|   # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 |   # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 | ||||||
|   data: |   data: | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package cn.iocoder.yudao.module.statistics.service.member; | package cn.iocoder.yudao.module.statistics.service.member; | ||||||
|  |  | ||||||
| import cn.hutool.core.date.LocalDateTimeUtil; | import cn.hutool.core.date.LocalDateTimeUtil; | ||||||
|  | import cn.hutool.core.util.ObjectUtil; | ||||||
| import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||||||
| import cn.iocoder.yudao.framework.ip.core.Area; | import cn.iocoder.yudao.framework.ip.core.Area; | ||||||
| import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum; | import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum; | ||||||
| @@ -15,10 +16,10 @@ import cn.iocoder.yudao.module.statistics.service.pay.PayWalletStatisticsService | |||||||
| import cn.iocoder.yudao.module.statistics.service.pay.bo.RechargeSummaryRespBO; | import cn.iocoder.yudao.module.statistics.service.pay.bo.RechargeSummaryRespBO; | ||||||
| import cn.iocoder.yudao.module.statistics.service.trade.TradeOrderStatisticsService; | import cn.iocoder.yudao.module.statistics.service.trade.TradeOrderStatisticsService; | ||||||
| import cn.iocoder.yudao.module.statistics.service.trade.TradeStatisticsService; | import cn.iocoder.yudao.module.statistics.service.trade.TradeStatisticsService; | ||||||
|  | import jakarta.annotation.Resource; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
|  |  | ||||||
| import jakarta.annotation.Resource; |  | ||||||
| import java.time.Duration; | import java.time.Duration; | ||||||
| import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -69,9 +70,12 @@ public class MemberStatisticsServiceImpl implements MemberStatisticsService { | |||||||
|                 bo -> AreaUtils.getParentIdByType(bo.getAreaId(), AreaTypeEnum.PROVINCE), |                 bo -> AreaUtils.getParentIdByType(bo.getAreaId(), AreaTypeEnum.PROVINCE), | ||||||
|                 bo -> bo, |                 bo -> bo, | ||||||
|                 (a, b) -> new MemberAreaStatisticsRespBO() |                 (a, b) -> new MemberAreaStatisticsRespBO() | ||||||
|                         .setOrderCreateUserCount(a.getOrderCreateUserCount() + b.getOrderCreateUserCount()) |                         .setOrderCreateUserCount(ObjectUtil.defaultIfNull(a.getOrderCreateUserCount(), 0) | ||||||
|                         .setOrderPayUserCount(a.getOrderPayUserCount() + b.getOrderPayUserCount()) |                                 + ObjectUtil.defaultIfNull(b.getOrderCreateUserCount(), 0)) | ||||||
|                         .setOrderPayPrice(a.getOrderPayPrice() + b.getOrderPayPrice())); |                         .setOrderPayUserCount(ObjectUtil.defaultIfNull(a.getOrderPayUserCount(), 0) | ||||||
|  |                                 + ObjectUtil.defaultIfNull(b.getOrderPayUserCount(), 0)) | ||||||
|  |                         .setOrderPayPrice(ObjectUtil.defaultIfNull(a.getOrderPayPrice(), 0) | ||||||
|  |                                 + ObjectUtil.defaultIfNull(b.getOrderPayPrice(), 0))); | ||||||
|         // 拼接数据 |         // 拼接数据 | ||||||
|         List<Area> areaList = AreaUtils.getByType(AreaTypeEnum.PROVINCE, area -> area); |         List<Area> areaList = AreaUtils.getByType(AreaTypeEnum.PROVINCE, area -> area); | ||||||
|         areaList.add(new Area().setId(null).setName("未知")); |         areaList.add(new Area().setId(null).setName("未知")); | ||||||
|   | |||||||
| @@ -17,7 +17,7 @@ public enum TradeOrderOperateTypeEnum { | |||||||
|     ADMIN_UPDATE_PRICE(2, "订单价格 {oldPayPrice} 修改,调整价格 {adjustPrice},实际支付金额为 {newPayPrice} 元"), |     ADMIN_UPDATE_PRICE(2, "订单价格 {oldPayPrice} 修改,调整价格 {adjustPrice},实际支付金额为 {newPayPrice} 元"), | ||||||
|     MEMBER_PAY(10, "用户付款成功"), |     MEMBER_PAY(10, "用户付款成功"), | ||||||
|     ADMIN_UPDATE_ADDRESS(11, "收货地址修改"), |     ADMIN_UPDATE_ADDRESS(11, "收货地址修改"), | ||||||
|     ADMIN_DELIVERY(20, "已发货,快递公司:{deliveryName},快递单号:{logisticsNo}"), |     ADMIN_DELIVERY(20, "已发货,快递公司:{expressName},快递单号:{logisticsNo}"), | ||||||
|     MEMBER_RECEIVE(30, "用户已收货"), |     MEMBER_RECEIVE(30, "用户已收货"), | ||||||
|     SYSTEM_RECEIVE(31, "到期未收货,系统自动确认收货"), |     SYSTEM_RECEIVE(31, "到期未收货,系统自动确认收货"), | ||||||
|     ADMIN_PICK_UP_RECEIVE(32, "管理员自提收货"), |     ADMIN_PICK_UP_RECEIVE(32, "管理员自提收货"), | ||||||
|   | |||||||
| @@ -43,7 +43,8 @@ public interface AfterSaleConvert { | |||||||
|             @Mapping(source = "afterSale.orderId", target = "merchantOrderId"), |             @Mapping(source = "afterSale.orderId", target = "merchantOrderId"), | ||||||
|             @Mapping(source = "afterSale.id", target = "merchantRefundId"), |             @Mapping(source = "afterSale.id", target = "merchantRefundId"), | ||||||
|             @Mapping(source = "afterSale.applyReason", target = "reason"), |             @Mapping(source = "afterSale.applyReason", target = "reason"), | ||||||
|             @Mapping(source = "afterSale.refundPrice", target = "price") |             @Mapping(source = "afterSale.refundPrice", target = "price"), | ||||||
|  |             @Mapping(source = "orderProperties.payAppKey", target = "appKey") | ||||||
|     }) |     }) | ||||||
|     PayRefundCreateReqDTO convert(String userIp, AfterSaleDO afterSale, |     PayRefundCreateReqDTO convert(String userIp, AfterSaleDO afterSale, | ||||||
|                                   TradeOrderProperties orderProperties); |                                   TradeOrderProperties orderProperties); | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.dal.mysql.aftersale; | |||||||
|  |  | ||||||
| import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||||||
| import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleLogDO; | import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleLogDO; | ||||||
|  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||||
| import org.apache.ibatis.annotations.Mapper; | import org.apache.ibatis.annotations.Mapper; | ||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -10,7 +11,9 @@ import java.util.List; | |||||||
| public interface AfterSaleLogMapper extends BaseMapperX<AfterSaleLogDO> { | public interface AfterSaleLogMapper extends BaseMapperX<AfterSaleLogDO> { | ||||||
|  |  | ||||||
|     default List<AfterSaleLogDO> selectListByAfterSaleId(Long afterSaleId) { |     default List<AfterSaleLogDO> selectListByAfterSaleId(Long afterSaleId) { | ||||||
|         return selectList(AfterSaleLogDO::getAfterSaleId, afterSaleId); |         return selectList(new LambdaQueryWrapper<AfterSaleLogDO>() | ||||||
|  |                 .eq(AfterSaleLogDO::getAfterSaleId, afterSaleId) | ||||||
|  |                 .orderByDesc(AfterSaleLogDO::getCreateTime)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.dal.mysql.order; | |||||||
|  |  | ||||||
| import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||||||
| import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderLogDO; | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderLogDO; | ||||||
|  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||||
| import org.apache.ibatis.annotations.Mapper; | import org.apache.ibatis.annotations.Mapper; | ||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| @@ -10,7 +11,9 @@ import java.util.List; | |||||||
| public interface TradeOrderLogMapper extends BaseMapperX<TradeOrderLogDO> { | public interface TradeOrderLogMapper extends BaseMapperX<TradeOrderLogDO> { | ||||||
|  |  | ||||||
|     default List<TradeOrderLogDO> selectListByOrderId(Long orderId) { |     default List<TradeOrderLogDO> selectListByOrderId(Long orderId) { | ||||||
|         return selectList(TradeOrderLogDO::getOrderId, orderId); |         return selectList(new LambdaQueryWrapper<TradeOrderLogDO>() | ||||||
|  |                 .eq(TradeOrderLogDO::getOrderId, orderId) | ||||||
|  |                 .orderByDesc(TradeOrderLogDO::getCreateTime)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ public class ExpressTrackQueryReqDTO { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 快递公司编码 |      * 快递公司编码 | ||||||
|      * |      * <p> | ||||||
|      * 对应 {@link DeliveryExpressDO#getCode()} |      * 对应 {@link DeliveryExpressDO#getCode()} | ||||||
|      */ |      */ | ||||||
|     private String expressCode; |     private String expressCode; | ||||||
| @@ -28,4 +28,9 @@ public class ExpressTrackQueryReqDTO { | |||||||
|      */ |      */ | ||||||
|     private String phone; |     private String phone; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 自定义名称(顺丰专用) | ||||||
|  |      */ | ||||||
|  |     private String customerName; | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -29,4 +29,10 @@ public class KdNiaoExpressQueryReqDTO { | |||||||
|     @JsonProperty("OrderCode") |     @JsonProperty("OrderCode") | ||||||
|     private String orderNo; |     private String orderNo; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 自定义名称(顺丰专用) | ||||||
|  |      */ | ||||||
|  |     @JsonProperty("CustomerName") | ||||||
|  |     private String customerName; | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.trade.framework.delivery.core.client.impl.kdniao | |||||||
| import cn.hutool.core.codec.Base64; | import cn.hutool.core.codec.Base64; | ||||||
| import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||||
| import cn.hutool.core.net.URLEncodeUtil; | import cn.hutool.core.net.URLEncodeUtil; | ||||||
|  | import cn.hutool.core.util.ObjUtil; | ||||||
|  | import cn.hutool.core.util.StrUtil; | ||||||
| import cn.hutool.crypto.digest.DigestUtil; | import cn.hutool.crypto.digest.DigestUtil; | ||||||
| import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||||||
| import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties; | import cn.iocoder.yudao.module.trade.framework.delivery.config.TradeExpressProperties; | ||||||
| @@ -60,6 +62,11 @@ public class KdNiaoExpressClient implements ExpressClient { | |||||||
|         // 发起请求 |         // 发起请求 | ||||||
|         KdNiaoExpressQueryReqDTO requestDTO = INSTANCE.convert(reqDTO) |         KdNiaoExpressQueryReqDTO requestDTO = INSTANCE.convert(reqDTO) | ||||||
|                 .setExpressCode(reqDTO.getExpressCode().toUpperCase()); |                 .setExpressCode(reqDTO.getExpressCode().toUpperCase()); | ||||||
|  |         if (ObjUtil.equal(requestDTO.getExpressCode(), "SF") | ||||||
|  |                 && StrUtil.isBlank(reqDTO.getCustomerName()) | ||||||
|  |                 && StrUtil.length(reqDTO.getPhone()) >= 4) { | ||||||
|  |             requestDTO.setCustomerName(StrUtil.subSufByLength(reqDTO.getPhone(), 4)); | ||||||
|  |         } | ||||||
|         KdNiaoExpressQueryRespDTO respDTO = httpRequest(REAL_TIME_QUERY_URL, REAL_TIME_FREE_REQ_TYPE, |         KdNiaoExpressQueryRespDTO respDTO = httpRequest(REAL_TIME_QUERY_URL, REAL_TIME_FREE_REQ_TYPE, | ||||||
|                 requestDTO, KdNiaoExpressQueryRespDTO.class); |                 requestDTO, KdNiaoExpressQueryRespDTO.class); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -206,7 +206,7 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 查询物流轨迹 |      * 查询物流轨迹 | ||||||
|      * |      * <p> | ||||||
|      * 缓存的目的:考虑及时性要求不高,但是每次调用需要钱 |      * 缓存的目的:考虑及时性要求不高,但是每次调用需要钱 | ||||||
|      * |      * | ||||||
|      * @param code           快递公司编码 |      * @param code           快递公司编码 | ||||||
| @@ -217,9 +217,8 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService { | |||||||
|     @Cacheable(cacheNames = RedisKeyConstants.EXPRESS_TRACK, key = "#code + '-' + #logisticsNo + '-' + #receiverMobile", |     @Cacheable(cacheNames = RedisKeyConstants.EXPRESS_TRACK, key = "#code + '-' + #logisticsNo + '-' + #receiverMobile", | ||||||
|             condition = "#result != null && #result.length() > 0") |             condition = "#result != null && #result.length() > 0") | ||||||
|     public List<ExpressTrackRespDTO> getExpressTrackList(String code, String logisticsNo, String receiverMobile) { |     public List<ExpressTrackRespDTO> getExpressTrackList(String code, String logisticsNo, String receiverMobile) { | ||||||
|         return expressClientFactory.getDefaultExpressClient().getExpressTrackList( |         return expressClientFactory.getDefaultExpressClient().getExpressTrackList(new ExpressTrackQueryReqDTO() | ||||||
|                 new ExpressTrackQueryReqDTO().setExpressCode(code).setLogisticsNo(logisticsNo) |                 .setExpressCode(code).setLogisticsNo(logisticsNo).setPhone(receiverMobile)); | ||||||
|                         .setPhone(receiverMobile)); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // =================== Order Item =================== |     // =================== Order Item =================== | ||||||
|   | |||||||
| @@ -78,12 +78,10 @@ public class TradeMemberPointOrderHandler implements TradeOrderHandler { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) { |     public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) { | ||||||
|         // 扣减(回滚)积分(订单赠送) |  | ||||||
|         reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE_CANCEL_ITEM, |  | ||||||
|                 orderItem.getId()); |  | ||||||
|         // 增加(回滚)积分(订单抵扣) |         // 增加(回滚)积分(订单抵扣) | ||||||
|         addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE_CANCEL_ITEM, |         addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE_CANCEL_ITEM, orderItem.getId()); | ||||||
|                 orderItem.getId()); |         // 扣减(回滚)积分(订单赠送) | ||||||
|  |         reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE_CANCEL_ITEM, orderItem.getId()); | ||||||
|  |  | ||||||
|         // 扣减(回滚)用户经验 |         // 扣减(回滚)用户经验 | ||||||
|         AfterSaleDO afterSale = afterSaleService.getAfterSale(orderItem.getAfterSaleId()); |         AfterSaleDO afterSale = afterSaleService.getAfterSale(orderItem.getAfterSaleId()); | ||||||
|   | |||||||
| @@ -140,17 +140,19 @@ public class MenuServiceImpl implements MenuService { | |||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // 1. 遍历到 parentId 为根节点,则无需判断 |         // 1. 先判断自身是否禁用 | ||||||
|  |         if (CommonStatusEnum.isDisable(node.getStatus())) { | ||||||
|  |             disabledMenuCache.add(node.getId()); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 2. 遍历到 parentId 为根节点,则无需判断 | ||||||
|         Long parentId = node.getParentId(); |         Long parentId = node.getParentId(); | ||||||
|         if (ObjUtil.equal(parentId, ID_ROOT)) { |         if (ObjUtil.equal(parentId, ID_ROOT)) { | ||||||
|             if (CommonStatusEnum.isDisable(node.getStatus())) { |  | ||||||
|                 disabledMenuCache.add(node.getId()); |  | ||||||
|                 return true; |  | ||||||
|             } |  | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // 2. 继续遍历 parent 节点 |         // 3. 继续遍历 parent 节点 | ||||||
|         MenuDO parent = menuMap.get(parentId); |         MenuDO parent = menuMap.get(parentId); | ||||||
|         if (parent == null || isMenuDisabled(parent, menuMap, disabledMenuCache)) { |         if (parent == null || isMenuDisabled(parent, menuMap, disabledMenuCache)) { | ||||||
|             disabledMenuCache.add(node.getId()); |             disabledMenuCache.add(node.getId()); | ||||||
|   | |||||||
| @@ -209,7 +209,8 @@ public class OAuth2ApproveServiceImplTest extends BaseDbUnitTest { | |||||||
|         List<OAuth2ApproveDO> result = oauth2ApproveService.getApproveList(userId, userType, clientId); |         List<OAuth2ApproveDO> result = oauth2ApproveService.getApproveList(userId, userType, clientId); | ||||||
|         // 断言 |         // 断言 | ||||||
|         assertEquals(1, result.size()); |         assertEquals(1, result.size()); | ||||||
|         assertPojoEquals(approve, result.get(0)); |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(approve, result.get(0), "expiresTime"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|   | |||||||
| @@ -50,7 +50,8 @@ class OAuth2CodeServiceImplTest extends BaseDbUnitTest { | |||||||
|                 scopes, redirectUri, state); |                 scopes, redirectUri, state); | ||||||
|         // 断言 |         // 断言 | ||||||
|         OAuth2CodeDO dbCodeDO = oauth2CodeMapper.selectByCode(codeDO.getCode()); |         OAuth2CodeDO dbCodeDO = oauth2CodeMapper.selectByCode(codeDO.getCode()); | ||||||
|         assertPojoEquals(codeDO, dbCodeDO, "createTime", "updateTime", "deleted"); |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(codeDO, dbCodeDO, "expiresTime", "createTime", "updateTime", "deleted"); | ||||||
|         assertEquals(userId, codeDO.getUserId()); |         assertEquals(userId, codeDO.getUserId()); | ||||||
|         assertEquals(userType, codeDO.getUserType()); |         assertEquals(userType, codeDO.getUserType()); | ||||||
|         assertEquals(clientId, codeDO.getClientId()); |         assertEquals(clientId, codeDO.getClientId()); | ||||||
| @@ -92,7 +93,8 @@ class OAuth2CodeServiceImplTest extends BaseDbUnitTest { | |||||||
|  |  | ||||||
|         // 调用 |         // 调用 | ||||||
|         OAuth2CodeDO result = oauth2CodeService.consumeAuthorizationCode(code); |         OAuth2CodeDO result = oauth2CodeService.consumeAuthorizationCode(code); | ||||||
|         assertPojoEquals(codeDO, result); |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(codeDO, result, "expiresTime"); | ||||||
|         assertNull(oauth2CodeMapper.selectByCode(code)); |         assertNull(oauth2CodeMapper.selectByCode(code)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -77,7 +77,8 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { | |||||||
|         OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, userType, clientId, scopes); |         OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, userType, clientId, scopes); | ||||||
|         // 断言访问令牌 |         // 断言访问令牌 | ||||||
|         OAuth2AccessTokenDO dbAccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken()); |         OAuth2AccessTokenDO dbAccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken()); | ||||||
|         assertPojoEquals(accessTokenDO, dbAccessTokenDO, "createTime", "updateTime", "deleted"); |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(accessTokenDO, dbAccessTokenDO, "expiresTime", "createTime", "updateTime", "deleted"); | ||||||
|         assertEquals(userId, accessTokenDO.getUserId()); |         assertEquals(userId, accessTokenDO.getUserId()); | ||||||
|         assertEquals(userType, accessTokenDO.getUserType()); |         assertEquals(userType, accessTokenDO.getUserType()); | ||||||
|         assertEquals(2, accessTokenDO.getUserInfo().size()); |         assertEquals(2, accessTokenDO.getUserInfo().size()); | ||||||
| @@ -88,7 +89,8 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { | |||||||
|         assertFalse(DateUtils.isExpired(accessTokenDO.getExpiresTime())); |         assertFalse(DateUtils.isExpired(accessTokenDO.getExpiresTime())); | ||||||
|         // 断言访问令牌的缓存 |         // 断言访问令牌的缓存 | ||||||
|         OAuth2AccessTokenDO redisAccessTokenDO = oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken()); |         OAuth2AccessTokenDO redisAccessTokenDO = oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken()); | ||||||
|         assertPojoEquals(accessTokenDO, redisAccessTokenDO, "createTime", "updateTime", "deleted"); |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(accessTokenDO, redisAccessTokenDO, "expiresTime", "createTime", "updateTime", "deleted"); | ||||||
|         // 断言刷新令牌 |         // 断言刷新令牌 | ||||||
|         OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectList().get(0); |         OAuth2RefreshTokenDO refreshTokenDO = oauth2RefreshTokenMapper.selectList().get(0); | ||||||
|         assertPojoEquals(accessTokenDO, refreshTokenDO, "id", "expiresTime", "createTime", "updateTime", "deleted"); |         assertPojoEquals(accessTokenDO, refreshTokenDO, "id", "expiresTime", "createTime", "updateTime", "deleted"); | ||||||
| @@ -177,13 +179,15 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { | |||||||
|         assertNull(oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken())); |         assertNull(oauth2AccessTokenRedisDAO.get(accessTokenDO.getAccessToken())); | ||||||
|         // 断言,新的访问令牌 |         // 断言,新的访问令牌 | ||||||
|         OAuth2AccessTokenDO dbAccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(newAccessTokenDO.getAccessToken()); |         OAuth2AccessTokenDO dbAccessTokenDO = oauth2AccessTokenMapper.selectByAccessToken(newAccessTokenDO.getAccessToken()); | ||||||
|         assertPojoEquals(newAccessTokenDO, dbAccessTokenDO, "createTime", "updateTime", "deleted"); |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(newAccessTokenDO, dbAccessTokenDO, "expiresTime", "createTime", "updateTime", "deleted"); | ||||||
|         assertPojoEquals(newAccessTokenDO, refreshTokenDO, "id", "expiresTime", "createTime", "updateTime", "deleted", |         assertPojoEquals(newAccessTokenDO, refreshTokenDO, "id", "expiresTime", "createTime", "updateTime", "deleted", | ||||||
|                 "creator", "updater"); |                 "creator", "updater"); | ||||||
|         assertFalse(DateUtils.isExpired(newAccessTokenDO.getExpiresTime())); |         assertFalse(DateUtils.isExpired(newAccessTokenDO.getExpiresTime())); | ||||||
|         // 断言,新的访问令牌的缓存 |         // 断言,新的访问令牌的缓存 | ||||||
|         OAuth2AccessTokenDO redisAccessTokenDO = oauth2AccessTokenRedisDAO.get(newAccessTokenDO.getAccessToken()); |         OAuth2AccessTokenDO redisAccessTokenDO = oauth2AccessTokenRedisDAO.get(newAccessTokenDO.getAccessToken()); | ||||||
|         assertPojoEquals(newAccessTokenDO, redisAccessTokenDO, "createTime", "updateTime", "deleted"); |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(newAccessTokenDO, redisAccessTokenDO, "expiresTime", "createTime", "updateTime", "deleted"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
| @@ -198,9 +202,11 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { | |||||||
|         // 调用 |         // 调用 | ||||||
|         OAuth2AccessTokenDO result = oauth2TokenService.getAccessToken(accessToken); |         OAuth2AccessTokenDO result = oauth2TokenService.getAccessToken(accessToken); | ||||||
|         // 断言 |         // 断言 | ||||||
|         assertPojoEquals(accessTokenDO, result, "createTime", "updateTime", "deleted", |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(accessTokenDO, result, "expiresTime", "createTime", "updateTime", "deleted", | ||||||
|                 "creator", "updater"); |                 "creator", "updater"); | ||||||
|         assertPojoEquals(accessTokenDO, oauth2AccessTokenRedisDAO.get(accessToken), "createTime", "updateTime", "deleted", |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(accessTokenDO, oauth2AccessTokenRedisDAO.get(accessToken), "expiresTime", "createTime", "updateTime", "deleted", | ||||||
|                 "creator", "updater"); |                 "creator", "updater"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -237,7 +243,8 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { | |||||||
|         // 调研,并断言 |         // 调研,并断言 | ||||||
|         OAuth2AccessTokenDO result = oauth2TokenService.getAccessToken(accessToken); |         OAuth2AccessTokenDO result = oauth2TokenService.getAccessToken(accessToken); | ||||||
|         // 断言 |         // 断言 | ||||||
|         assertPojoEquals(accessTokenDO, result, "createTime", "updateTime", "deleted", |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(accessTokenDO, result, "expiresTime", "createTime", "updateTime", "deleted", | ||||||
|                 "creator", "updater"); |                 "creator", "updater"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -259,7 +266,8 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { | |||||||
|         oauth2RefreshTokenMapper.insert(refreshTokenDO); |         oauth2RefreshTokenMapper.insert(refreshTokenDO); | ||||||
|         // 调用 |         // 调用 | ||||||
|         OAuth2AccessTokenDO result = oauth2TokenService.removeAccessToken(accessTokenDO.getAccessToken()); |         OAuth2AccessTokenDO result = oauth2TokenService.removeAccessToken(accessTokenDO.getAccessToken()); | ||||||
|         assertPojoEquals(accessTokenDO, result, "createTime", "updateTime", "deleted", |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(accessTokenDO, result, "expiresTime", "createTime", "updateTime", "deleted", | ||||||
|                 "creator", "updater"); |                 "creator", "updater"); | ||||||
|         // 断言数据 |         // 断言数据 | ||||||
|         assertNull(oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken())); |         assertNull(oauth2AccessTokenMapper.selectByAccessToken(accessTokenDO.getAccessToken())); | ||||||
| @@ -297,7 +305,8 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { | |||||||
|         // 断言 |         // 断言 | ||||||
|         assertEquals(1, pageResult.getTotal()); |         assertEquals(1, pageResult.getTotal()); | ||||||
|         assertEquals(1, pageResult.getList().size()); |         assertEquals(1, pageResult.getList().size()); | ||||||
|         assertPojoEquals(dbAccessToken, pageResult.getList().get(0)); |         // TODO @芋艿:expiresTime 被屏蔽,仅 win11 会复现,建议后续修复。 | ||||||
|  |         assertPojoEquals(dbAccessToken, pageResult.getList().get(0), "expiresTime"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV