diff --git a/sql/tools/convertor.py b/sql/tools/convertor.py index 5e664e4..6b4cd81 100644 --- a/sql/tools/convertor.py +++ b/sql/tools/convertor.py @@ -412,7 +412,7 @@ class PostgreSQLConvertor(Convertor): type = type.lower() - if type == "varchar": + if type in ("varchar", "char"): return f"varchar({size})" if type in ("int", "int unsigned", "int unsigned zerofill"): return "int4" @@ -426,13 +426,15 @@ class PostgreSQLConvertor(Convertor): return "date" if type == "json": return "jsonb" + if type == "time": + return "time" if type == "double": return "double precision" if type == "timestamp": return f"timestamp({size})" if size else "timestamp" if type == "bit": return "bool" - if type in ("text", "longtext"): + if type in ("text", "longtext", "mediumtext"): return "text" if type in ("blob", "mediumblob", "longblob"): return "bytea" diff --git a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImChannelMessageMapper.java b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImChannelMessageMapper.java index 6f1cd1a..a847d6c 100644 --- a/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImChannelMessageMapper.java +++ b/yudao-module-im/src/main/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImChannelMessageMapper.java @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.im.controller.admin.manager.message.vo.channel.Im import cn.iocoder.yudao.module.im.dal.dataobject.message.ImChannelMessageDO; import org.apache.ibatis.annotations.Mapper; +import java.util.Collections; import java.util.List; /** @@ -32,7 +33,7 @@ public interface ImChannelMessageMapper extends BaseMapperX return selectList(new LambdaQueryWrapperX() .gt(ImChannelMessageDO::getId, minId) .and(w -> w.isNull(ImChannelMessageDO::getReceiverUserIds) - .or().eq(ImChannelMessageDO::getReceiverUserIds, "") + .or().eq(ImChannelMessageDO::getReceiverUserIds, Collections.emptyList()) .or().apply(MyBatisUtils.findInSet("receiver_user_ids"), userId)) .orderByAsc(ImChannelMessageDO::getId) .last("LIMIT " + size)); diff --git a/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImChannelMessageMapperTest.java b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImChannelMessageMapperTest.java new file mode 100644 index 0000000..ee28369 --- /dev/null +++ b/yudao-module-im/src/test/java/cn/iocoder/yudao/module/im/dal/mysql/message/ImChannelMessageMapperTest.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.im.dal.mysql.message; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; +import cn.iocoder.yudao.module.im.dal.dataobject.message.ImChannelMessageDO; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.test.context.jdbc.Sql; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Sql(statements = "DELETE FROM im_channel_message", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) +public class ImChannelMessageMapperTest extends BaseDbUnitTest { + + @Resource + private ImChannelMessageMapper mapper; + + @Test + public void testSelectListByUserAndMinId_includesBroadcastAndMatchingRecipients() { + ImChannelMessageDO nullRecipients = insertMessage(null); + ImChannelMessageDO emptyRecipients = insertMessage(List.of()); + ImChannelMessageDO matchingRecipients = insertMessage(List.of(1L, 2L)); + insertMessage(List.of(2L, 11L)); // 用户 1 不应误命中用户 11 + ImChannelMessageDO deleted = insertMessage(List.of(1L)); + mapper.deleteById(deleted.getId()); + + List result = mapper.selectListByUserAndMinId(1L, 0L, 100); + + assertEquals(List.of(nullRecipients.getId(), emptyRecipients.getId(), matchingRecipients.getId()), + result.stream().map(ImChannelMessageDO::getId).toList()); + } + + @Test + public void testSelectListByUserAndMinId_respectsCursorAndLimit() { + ImChannelMessageDO cursor = insertMessage(null); + ImChannelMessageDO next = insertMessage(List.of()); + insertMessage(List.of(1L)); + + List result = mapper.selectListByUserAndMinId(1L, cursor.getId(), 1); + + assertEquals(List.of(next.getId()), result.stream().map(ImChannelMessageDO::getId).toList()); + } + + private ImChannelMessageDO insertMessage(List receiverUserIds) { + ImChannelMessageDO message = ImChannelMessageDO.builder() + .channelId(10L) + .materialId(20L) + .type(1) + .content("{}") + .receiverUserIds(receiverUserIds) + .sendTime(LocalDateTime.now()) + .build(); + mapper.insert(message); + return message; + } + +} diff --git a/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java b/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java index ff0c326..bd05fd5 100644 --- a/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java +++ b/yudao-module-mall/yudao-module-product/src/main/java/cn/iocoder/yudao/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java @@ -13,7 +13,7 @@ import lombok.ToString; public class ProductPropertyValuePageReqVO extends PageParam { @Schema(description = "属性项的编号", example = "1024") - private String propertyId; + private Long propertyId; @Schema(description = "名称", example = "红色") private String name;