package com.ruoyi.common.utils; 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; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author :yys * @date : 2025/9/15 15:31 */ public class OrderUtils { /** * List 转换为 Long[] 数组 * @param ids * @return */ public static Long[] listIntegerToLongArray(List ids) { return ids.stream() // 处理null值:如果元素为null,转换为0L(可根据业务调整,比如抛异常) .map(id -> id != null ? id.longValue() : -1L) // 将Stream转换为Long[]数组 .toArray(Long[]::new); } /** * 判断目标id是否在逗号分隔的字符串中 * @param targetId * @param str * @return */ public boolean isStaffIdExist(Object targetId,String str) { // 空值校验,避免空指针 if (str == null || str.trim().isEmpty() || targetId == null) { return false; } // 按逗号分割成数组 String[] idArray = str.split(","); // 遍历数组判断是否包含目标id for (String id : idArray) { // 去除空格(防止字符串中有多余空格,如"1, 121") String cleanId = id.trim(); // 转换为数字并比较 try { if (cleanId.equals(String.valueOf(targetId))) { return true; } } catch (NumberFormatException e) { // 若存在非数字ID,直接返回false return false; } } return false; } /** * 查询当天(基于createTime字段)的记录数量 * @param mapper 实体类对应的BaseMapper * @param 实体类泛型 * @return 当天记录数量 * code 表编码字段 */ public static String countTodayByCreateTime(BaseMapper mapper,String preFix,String code) { // 1. 当天时间范围 LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX); Date startDate = Date.from(todayStart.atZone(ZoneId.systemDefault()).toInstant()); Date endDate = Date.from(todayEnd.atZone(ZoneId.systemDefault()).toInstant()); // 2. 日期字符串 yyyyMMdd String dateStr = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); // 4. 查询今天最后一条编号(按时间倒序,取最新一条) QueryWrapper wrapper = new QueryWrapper<>(); wrapper.ge("create_time", startDate) .lt("create_time", endDate) .orderByDesc("create_time") .last("LIMIT 1"); // 这里必须用 selectMaps 或 selectMap,不要用 selectOne,避免实体类问题 Map result = (Map) 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); } /** * 查询当天(基于createTime字段)的记录数量 * @param mapper 实体类对应的BaseMapper * @param 实体类泛型 * @return 当天记录数量 */ public static String countAfterServiceTodayByCreateTime(BaseMapper 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 ); // 转换为Date类型(如果实体类中createTime是LocalDateTime可直接使用) Date startDate = Date.from(todayStart.atZone(ZoneId.systemDefault()).toInstant()); Date endDate = Date.from(todayEnd.atZone(ZoneId.systemDefault()).toInstant()); // 构建查询条件 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.ge("create_time", startDate) // 大于等于当天开始 .lt("create_time", endDate); // 小于当天结束(避免毫秒精度问题) // 执行查询 Long aLong = mapper.selectCount(queryWrapper); // 拼接订单编号 preFix + 时间(yyyyMMdd) + 订单数量(001) return preFix + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1)); } }