| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.ruoyi.common.utils.uuid.UUID; |
| | | import org.apache.poi.ss.formula.functions.T; |
| | | import org.springframework.stereotype.Component; |
| | |
| | | * @param mapper 实体类对应的BaseMapper |
| | | * @param <T> 实体类泛型 |
| | | * @return 当天记录数量 |
| | | * code 表编码字段 |
| | | */ |
| | | public static <T> String countTodayByCreateTime(BaseMapper<T> mapper,String preFix) { |
| | | // 获取当天开始时间(00:00:00) |
| | | LocalDateTime todayStart = LocalDateTime.of( |
| | | LocalDateTime.now().toLocalDate(), |
| | | LocalTime.MIN |
| | | ); |
| | | // 获取当天结束时间(23:59:59.999) |
| | | LocalDateTime todayEnd = LocalDateTime.of( |
| | | LocalDateTime.now().toLocalDate(), |
| | | LocalTime.MAX |
| | | ); |
| | | public static <T> String countTodayByCreateTime(BaseMapper<T> mapper,String preFix,String code) { |
| | | // 1. 当天时间范围 |
| | | LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); |
| | | LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX); |
| | | |
| | | // 转换为Date类型(如果实体类中createTime是LocalDateTime可直接使用) |
| | | Date startDate = Date.from(todayStart.atZone(ZoneId.systemDefault()).toInstant()); |
| | | Date endDate = Date.from(todayEnd.atZone(ZoneId.systemDefault()).toInstant()); |
| | | |
| | | // 构建查询条件 |
| | | QueryWrapper<T> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.ge("create_time", startDate) // 大于等于当天开始 |
| | | .lt("create_time", endDate); // 小于当天结束(避免毫秒精度问题) |
| | | // 2. 日期字符串 yyyyMMdd |
| | | String dateStr = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); |
| | | |
| | | // 执行查询 |
| | | Long aLong = mapper.selectCount(queryWrapper); |
| | | // 拼接订单编号 preFix + 时间(yyyyMMdd) + 订单数量(001) |
| | | return preFix + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1)) + "-" + new Date().getTime(); |
| | | // 4. 查询今天最后一条编号(按时间倒序,取最新一条) |
| | | QueryWrapper<T> wrapper = new QueryWrapper<>(); |
| | | wrapper.ge("create_time", startDate) |
| | | .lt("create_time", endDate) |
| | | .orderByDesc("create_time") |
| | | .last("LIMIT 1"); |
| | | |
| | | // 这里必须用 selectMaps 或 selectMap,不要用 selectOne,避免实体类问题 |
| | | Map<String, Object> result = (Map<String, Object>) mapper.selectOne(wrapper); |
| | | |
| | | long nextSeq = 1; |
| | | if (result != null && result.get(code) != null) { |
| | | String fullCode = result.get(code).toString(); // 例如:ABC20250122005 |
| | | |
| | | // ✅ 关键:截取最后 3 位序号 |
| | | String seqStr = fullCode.substring(fullCode.length() - 3); |
| | | nextSeq = Long.parseLong(seqStr) + 1; |
| | | } |
| | | |
| | | // 5. 生成编号 |
| | | return preFix + dateStr + String.format("%03d", nextSeq); |
| | | } |
| | | |
| | | |