From ea4215c39165f49b4cd956a0b51574d90c1d9b97 Mon Sep 17 00:00:00 2001 From: zjh <1084500556@qq.com> Date: 星期五, 28 三月 2025 17:26:59 +0800 Subject: [PATCH] zjh20250328 --- /dev/null | 112 -------------- ltkj-admin/src/test/java/zjhTest.java | 19 - ltkj-hosp/src/main/java/com/ltkj/hosp/idutil/IdUtils.java | 240 ++++++++++++++++++++++++++++++ ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjOrderServiceImpl.java | 4 ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java | 9 - ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java | 33 +++ ltkj-admin/src/main/java/com/ltkj/web/controller/lis/LisApiMethod.java | 4 ltkj-hosp/src/main/java/com/ltkj/hosp/mapper/OrderNumberMapper.java | 17 ++ ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjSamplingServiceImpl.java | 7 ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjSamplingController.java | 11 - ltkj-hosp/src/main/java/com/ltkj/hosp/mapper/TjOrderMapper.java | 4 ltkj-hosp/src/main/java/com/ltkj/hosp/service/ITjOrderService.java | 2 12 files changed, 306 insertions(+), 156 deletions(-) diff --git a/ltkj-admin/src/main/java/com/ltkj/web/controller/lis/LisApiMethod.java b/ltkj-admin/src/main/java/com/ltkj/web/controller/lis/LisApiMethod.java index ea472c0..c47b192 100644 --- a/ltkj-admin/src/main/java/com/ltkj/web/controller/lis/LisApiMethod.java +++ b/ltkj-admin/src/main/java/com/ltkj/web/controller/lis/LisApiMethod.java @@ -2,8 +2,6 @@ import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; import cn.hutool.extra.pinyin.PinyinUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; @@ -11,9 +9,9 @@ import com.ltkj.common.core.domain.AjaxResult; import com.ltkj.common.utils.AgeResult; import com.ltkj.common.utils.DateUtils; -import com.ltkj.common.utils.IdUtils; import com.ltkj.hosp.domain.*; import com.ltkj.hosp.hisDto.OutpintestapplyDetailsDto; +import com.ltkj.hosp.idutil.IdUtils; import com.ltkj.hosp.lisDto.LisSaveSqdxxDto; import com.ltkj.hosp.lisDto.LisSaveSqdxxJyxmlistDto; import com.ltkj.hosp.mapper.TbTransitionMapper; diff --git a/ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java b/ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java index 2beedbf..564e90c 100644 --- a/ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java +++ b/ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java @@ -1,6 +1,5 @@ package com.ltkj.web.controller.service; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; @@ -8,19 +7,17 @@ import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; -import com.alibaba.druid.sql.visitor.functions.If; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ltkj.common.core.domain.AjaxResult; import com.ltkj.common.core.domain.entity.SysDept; import com.ltkj.common.core.domain.entity.SysUser; import com.ltkj.common.core.redis.RedisCache; -import com.ltkj.common.utils.IdUtils; import com.ltkj.common.utils.StringUtils; import com.ltkj.framework.config.MatchUtils; -import com.ltkj.framework.datasource.DynamicDataSourceContextHolder; import com.ltkj.hosp.domain.*; import com.ltkj.hosp.hisDto.*; +import com.ltkj.hosp.idutil.IdUtils; import com.ltkj.hosp.mapper.TjSamplingMapper; import com.ltkj.hosp.pacsDto.SavePacsApply; import com.ltkj.hosp.service.*; @@ -38,10 +35,8 @@ import com.ltkj.web.controller.lis.LisApiMethod; import com.ltkj.web.controller.pacs.PacsApiMethodService; import com.ltkj.web.controller.system.SamplingServiceApi; -import jodd.util.StringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -49,8 +44,6 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java b/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java index 71aee5b..ce54c89 100644 --- a/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java +++ b/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjOrderController.java @@ -56,6 +56,7 @@ import com.ltkj.hosp.dto.UpdateTransitionnewPriceDto; import com.ltkj.hosp.hisDto.OutpinimpapplyDto; import com.ltkj.hosp.hisDto.OutpinmedicapplyDto; +import com.ltkj.hosp.idutil.IdUtils; import com.ltkj.hosp.mapper.TbTransitionMapper; import com.ltkj.hosp.mapper.TestMapper; import com.ltkj.hosp.mapper.TjSamplingMapper; @@ -1107,10 +1108,36 @@ // String tjNumber = (SecurityUtils.getUsername() + idUtils.getTjNumber()); - String tjNumber = idUtils.getTjNumber(); - if (StringUtil.isNotBlank(makeLisTmhPrefix)) tjNumber = makeLisTmhPrefix + tjNumber; - tjOrder.setTjNumber(tjNumber); +// String tjNumber = idUtils.getTjNumber(); + String tjNumber = null; + int a =0; + while (tjNumber ==null){ + if(a>3){ + throw new RuntimeException("鍓嶆柟鎷ユ尋,璇风◢绛�!!!"); + } + try { + String newTjNumberRedisLockAndMysql = idUtils.getNewTjNumberRedisLockAndMysql(); + if (StringUtil.isNotBlank(makeLisTmhPrefix)){ + String tjh= makeLisTmhPrefix + newTjNumberRedisLockAndMysql; + int countByTjNum = tjOrderService.getOrderCountByTjNum(tjh); + if(countByTjNum==0){ + tjNumber=tjh; + } + }else { + int countByTjNum = tjOrderService.getOrderCountByTjNum(newTjNumberRedisLockAndMysql); + if(countByTjNum==0){ + tjNumber=newTjNumberRedisLockAndMysql; + } + } + } catch (Exception e) { + log.error(e.getMessage()); + }finally { + a++; + } + } + + tjOrder.setTjNumber(tjNumber); BigDecimal discount = BigDecimal.valueOf(Double.parseDouble(tjOrder.getTjFlowingWater().getDiscount())); tjOrder.setDiscount(discount.toString()); diff --git a/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjSamplingController.java b/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjSamplingController.java index 14994bb..a68e59b 100644 --- a/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjSamplingController.java +++ b/ltkj-admin/src/main/java/com/ltkj/web/controller/system/TjSamplingController.java @@ -4,20 +4,13 @@ import java.util.*; import java.util.stream.Collectors; import javax.annotation.Resource; -import javax.servlet.ServletSecurityElement; import javax.servlet.http.HttpServletResponse; -import javax.swing.plaf.basic.BasicScrollPaneUI; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.pinyin.PinyinUtil; -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ltkj.common.core.redis.RedisCache; -import com.ltkj.common.utils.IdUtils; import com.ltkj.framework.config.MatchUtils; import com.ltkj.hosp.domain.*; import com.ltkj.hosp.service.*; @@ -28,12 +21,8 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; -import org.aspectj.weaver.AjAttribute; -import org.springframework.beans.BeanUtils; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.web.bind.annotation.*; import com.ltkj.common.annotation.Log; import com.ltkj.common.core.controller.BaseController; diff --git a/ltkj-admin/src/test/java/zjhTest.java b/ltkj-admin/src/test/java/zjhTest.java index a80d879..832f432 100644 --- a/ltkj-admin/src/test/java/zjhTest.java +++ b/ltkj-admin/src/test/java/zjhTest.java @@ -2,6 +2,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.extra.pinyin.PinyinUtil; +import cn.hutool.json.JSONUtil; import com.ltkj.LtkjApplication; import com.ltkj.hosp.domain.TjProject; import com.ltkj.hosp.service.*; @@ -31,6 +32,7 @@ import java.net.URL; import java.time.LocalTime; import java.time.ZonedDateTime; +import java.util.Arrays; import java.util.List; import java.io.BufferedReader; import java.io.InputStreamReader; @@ -130,20 +132,11 @@ // BigDecimal multiply = ordPrice.multiply((new BigDecimal("6.5").divide(BigDecimal.valueOf(10)))); // System.out.println(multiply); - String a="涓诲姩鑴夌‖鍖栵紱\n" + - "宸﹀績鑸掑紶鍔熻兘鍑忎綆銆佹敹缂╁姛鑳芥甯革紱\n" + - "褰╄壊琛�娴佺ず锛氬悇鐡h啘鏈鐥呯悊鎬ц繑娴併��"; -// String s = a.replaceAll("[锛�(][^锛�)]*[\u4e00-\u9fa5]+[^锛�)]*[锛�)]", "") -// .replaceAll("[ 娴嬪畾妫�娴媇", ""); + String input = "鑳嗗泭缁撶煶 鑳嗗泭澹佸唴缁撶煶"; // 杈撳叆瀛楃涓� - String[] split = a.replaceAll("\n", "").split("銆倈锛泑;"); - for (String jg : split) { - if (StringUtil.isNotBlank(jg) && !jg.contains("鏈寮傚父") - && !jg.contains("鏈鏄庢樉寮傚父") && !jg.contains("鏈鍗犱綅") && !jg.contains("鏈") - && !jg.contains("鏈鏄庢樉")&& !jg.contains("姝e父")&& !jg.contains("鍙屼晶妞庨棿瀛旀棤鐙獎")&& !jg.contains("鏃犳畩")) { - System.out.println(jg); - } - } + // 浣跨敤姝e垯鏇挎崲鏈�鍚庝竴涓枩鏉� + String[] split = input.replaceAll("\n", "").split("銆倈锛泑;"); + System.out.println(JSONUtil.parse(split)); // 杈撳嚭缁撴灉 // System.out.println(s); } diff --git a/ltkj-common/src/main/java/com/ltkj/common/utils/IdUtils.java b/ltkj-common/src/main/java/com/ltkj/common/utils/IdUtils.java deleted file mode 100644 index a72b099..0000000 --- a/ltkj-common/src/main/java/com/ltkj/common/utils/IdUtils.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.ltkj.common.utils; - -import cn.hutool.core.util.StrUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Random; - -/** - * @Company: 瑗垮畨璺嘲绉戞妧鏈夐檺鍏徃 - * @Author: zhaowenxuan - * @Date: 2024/10/10 14:55 - */ -@Component -public class IdUtils { - - private static final String LIS_LAST_ID_KEY = "id:generate:lis:id"; - private static final String TJH_LAST_ID_KEY = "id:generate:tjhs:tjh"; - private static final String LIS_LAST_ID_INCR_KEY = "id:generate:lis:id:incr"; - private static final String LIS_CURRENT_DATE_KEY = "id:generate:lis:currentDate"; - -// private static final UidGenerator uidGenerator = new DefaultUidGenerator(); // 浣跨敤榛樿鐨凷nowflake鐢熸垚鍣� - - @Autowired - private StringRedisTemplate stringRedisTemplate; - - public synchronized String generateLisID(String prefix) { - String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date()); - String storedDate = stringRedisTemplate.opsForValue().get(LIS_CURRENT_DATE_KEY); - String lastIdStr = stringRedisTemplate.opsForValue().get(LIS_LAST_ID_KEY); - if (StrUtil.isBlank(lastIdStr))lastIdStr = "0"; - int lastId; - if (storedDate == null || !storedDate.equals(currentDate)) { - lastId = 1; - stringRedisTemplate.opsForValue().set(LIS_LAST_ID_KEY, String.valueOf(lastId)); - stringRedisTemplate.opsForValue().set(LIS_CURRENT_DATE_KEY, currentDate); - } else { - lastId = Integer.parseInt(lastIdStr) + 1; - stringRedisTemplate.opsForValue().set(LIS_LAST_ID_KEY, String.valueOf(lastId)); - } - String yyMMdd = currentDate.substring(2); - return String.format(prefix+"%s%05d", yyMMdd, lastId); - } - - /** - * 鐢熸垚鏃犻檺閫掑鏉$爜鍙� - * @param prefix - * @return - */ - public synchronized String generateLisNextId(String prefix){ - String lastIdStr = stringRedisTemplate.opsForValue().get(LIS_LAST_ID_INCR_KEY); - int current; - if (StrUtil.isBlank(lastIdStr)) { - current = 1; - }else { - current = Integer.parseInt(lastIdStr); - } - int numberLength = String.valueOf(99999).length(); - String result = prefix + String.format("%0" + numberLength + "d", current); - current++; - stringRedisTemplate.opsForValue().set(LIS_LAST_ID_INCR_KEY,String.valueOf(current)); - return result; - } - - - //鐢熸垚浣撴鍙风敤 - private static long lastTimestamp = -1; - private static final Random random = new Random(); - -// public static synchronized String getTjNumber() { -// long timestamp = System.currentTimeMillis(); // 鑾峰彇褰撳墠鏃堕棿鎴筹紙姣锛� -// -// // 濡傛灉鏃堕棿鎴冲拰涓婃鐢熸垚鐨勬椂闂存埑鐩稿悓锛岀敓鎴愪竴涓柊鐨勯殢鏈烘暟 -// if (timestamp == lastTimestamp) { -// return String.format("%09d", (timestamp % 1000000000) + random.nextInt(900) + 100); -// } else { -// lastTimestamp = timestamp; // 鏇存柊鏈�鍚庣敓鎴愭椂闂存埑 -// return String.format("%09d", (timestamp % 1000000000) + random.nextInt(900) + 100); -// } -// } - - - public synchronized String getTjNumber() { - String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date()); - String storedDate = stringRedisTemplate.opsForValue().get(LIS_CURRENT_DATE_KEY); - String lastIdStr = stringRedisTemplate.opsForValue().get(TJH_LAST_ID_KEY); - if (StrUtil.isBlank(lastIdStr))lastIdStr = "0"; - int lastId; - if (storedDate == null || !storedDate.equals(currentDate)) { - lastId = 1; - stringRedisTemplate.opsForValue().set(TJH_LAST_ID_KEY, String.valueOf(lastId)); - stringRedisTemplate.opsForValue().set(LIS_CURRENT_DATE_KEY, currentDate); - } else { - lastId = Integer.parseInt(lastIdStr) + 1; - stringRedisTemplate.opsForValue().set(TJH_LAST_ID_KEY, String.valueOf(lastId)); - } - String yyMMdd = currentDate.substring(2); - return String.format("%s%05d", yyMMdd, lastId); - } - - -// 浣跨敤鍒嗗竷寮廔D鐢熸垚鍣紙濡係nowflake锛� - public static String generateExamNumber() { -// long id = uidGenerator.getUID(); // 鑾峰彇鐢熸垚鐨勫敮涓�ID -// return String.format("%09d", Math.abs(id) % 1000000000); // 鏍煎紡鍖栦负9浣� - return null; - } - -} diff --git a/ltkj-hosp/src/main/java/com/ltkj/hosp/idutil/IdUtils.java b/ltkj-hosp/src/main/java/com/ltkj/hosp/idutil/IdUtils.java new file mode 100644 index 0000000..ae2e541 --- /dev/null +++ b/ltkj-hosp/src/main/java/com/ltkj/hosp/idutil/IdUtils.java @@ -0,0 +1,240 @@ +package com.ltkj.hosp.idutil; + +import cn.hutool.core.util.StrUtil; +import com.ltkj.hosp.mapper.OrderNumberMapper; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +/** + * @Company: 瑗垮畨璺嘲绉戞妧鏈夐檺鍏徃 + * @Author: zhaowenxuan + * @Date: 2024/10/10 14:55 + */ +@Configuration +@Slf4j +public class IdUtils { + + private static final String LIS_LAST_ID_KEY = "id:generate:lis:id"; + private static final String TJH_LAST_ID_KEY = "id:generate:tjhs:tjh"; + private static final String LIS_LAST_ID_INCR_KEY = "id:generate:lis:id:incr"; + private static final String LIS_CURRENT_DATE_KEY = "id:generate:lis:currentDate"; + + @Autowired + private StringRedisTemplate stringRedisTemplate; + @Autowired + private OrderNumberMapper orderNumberMapper; + @Autowired + private RedissonClient redissonClient; + + public synchronized String yuangenerateLisID(String prefix) { + String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date()); + String storedDate = stringRedisTemplate.opsForValue().get(LIS_CURRENT_DATE_KEY); + String lastIdStr = stringRedisTemplate.opsForValue().get(LIS_LAST_ID_KEY); + int lastId; + if (storedDate == null || !storedDate.equals(currentDate)) { + lastId = 1; + stringRedisTemplate.opsForValue().set(LIS_LAST_ID_KEY, String.valueOf(lastId)); + stringRedisTemplate.opsForValue().set(LIS_CURRENT_DATE_KEY, currentDate); + } else { + lastId = Integer.parseInt(lastIdStr) + 1; + stringRedisTemplate.opsForValue().set(LIS_LAST_ID_KEY, String.valueOf(lastId)); + } + String yyMMdd = currentDate.substring(2); + return String.format(prefix+"%s%05d", yyMMdd, lastId); + } + + //redis鍒嗗竷寮忛攣鍜孧ySQL鍏敤 + public String generateLisID(String prefix) { + String lockKey = "lock:tmh:tj_tmh_lock"; + RLock lock = redissonClient.getLock(lockKey); + + try { + if (lock.tryLock(3, 5, TimeUnit.SECONDS)) { + String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date()); + String storedDate = stringRedisTemplate.opsForValue().get(LIS_CURRENT_DATE_KEY); + String lastIdStr = stringRedisTemplate.opsForValue().get(LIS_LAST_ID_KEY); + + // 2. 濡傛灉 Redis 涓病鏈夋垨鑰呯紪鍙蜂涪澶憋紝鏌ヨ鏁版嵁搴撳苟鍚屾鍒� Redis + if (storedDate == null || !storedDate.equals(currentDate) || lastIdStr == null) { + Integer lastIdFromDb = orderNumberMapper.getLastId(currentDate,lockKey); + lastIdFromDb = (lastIdFromDb == null) ? 0 : lastIdFromDb; + + // 鍚屾鍒� Redis + stringRedisTemplate.opsForValue().set(LIS_LAST_ID_KEY, String.valueOf(lastIdFromDb), 1, TimeUnit.DAYS); + stringRedisTemplate.opsForValue().set(LIS_CURRENT_DATE_KEY, currentDate, 1, TimeUnit.DAYS); + } + + // 3. 浣跨敤 Redis 鐨� INCR 淇濊瘉娴佹按鍙峰敮涓� + long lastId = stringRedisTemplate.opsForValue().increment(LIS_LAST_ID_KEY); + + // 4. 鍚屾椂鏇存柊鏁版嵁搴擄紝纭繚涓�鑷存�� + orderNumberMapper.updateLastId(currentDate, (int) lastId,lockKey); + + return String.format(prefix+"%s%05d", currentDate.substring(2), lastId); + } else { + throw new RuntimeException("鑾峰彇鏉$爜鍙峰け璐ワ紝璇烽噸璇�"); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } finally { + if (lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + + /** + * 鐢熸垚鏃犻檺閫掑鏉$爜鍙� + * @param prefix + * @return + */ + public synchronized String generateLisNextId(String prefix){ + String lastIdStr = stringRedisTemplate.opsForValue().get(LIS_LAST_ID_INCR_KEY); + int current; + if (StrUtil.isBlank(lastIdStr)) { + current = 1; + }else { + current = Integer.parseInt(lastIdStr); + } + int numberLength = String.valueOf(99999).length(); + String result = prefix + String.format("%0" + numberLength + "d", current); + current++; + stringRedisTemplate.opsForValue().set(LIS_LAST_ID_INCR_KEY,String.valueOf(current)); + return result; + } + + + //鐢熸垚浣撴鍙风敤 + private static long lastTimestamp = -1; + private static final Random random = new Random(); + +// public static synchronized String getTjNumber() { +// long timestamp = System.currentTimeMillis(); // 鑾峰彇褰撳墠鏃堕棿鎴筹紙姣锛� +// +// // 濡傛灉鏃堕棿鎴冲拰涓婃鐢熸垚鐨勬椂闂存埑鐩稿悓锛岀敓鎴愪竴涓柊鐨勯殢鏈烘暟 +// if (timestamp == lastTimestamp) { +// return String.format("%09d", (timestamp % 1000000000) + random.nextInt(900) + 100); +// } else { +// lastTimestamp = timestamp; // 鏇存柊鏈�鍚庣敓鎴愭椂闂存埑 +// return String.format("%09d", (timestamp % 1000000000) + random.nextInt(900) + 100); +// } +// } + + + public synchronized String getTjNumber() { + String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date()); + String storedDate = stringRedisTemplate.opsForValue().get(LIS_CURRENT_DATE_KEY); + String lastIdStr = stringRedisTemplate.opsForValue().get(TJH_LAST_ID_KEY); + if (StrUtil.isBlank(lastIdStr))lastIdStr = "0"; + int lastId; + if (storedDate == null || !storedDate.equals(currentDate)) { + lastId = 1; + stringRedisTemplate.opsForValue().set(TJH_LAST_ID_KEY, String.valueOf(lastId)); + stringRedisTemplate.opsForValue().set(LIS_CURRENT_DATE_KEY, currentDate); + } else { + lastId = Integer.parseInt(lastIdStr) + 1; + stringRedisTemplate.opsForValue().set(TJH_LAST_ID_KEY, String.valueOf(lastId)); + } + String yyMMdd = currentDate.substring(2); + return String.format("%s%05d", yyMMdd, lastId); + } + + +// 浣跨敤鍒嗗竷寮廔D鐢熸垚鍣紙濡係nowflake锛� + public static String generateExamNumber() { +// long id = uidGenerator.getUID(); // 鑾峰彇鐢熸垚鐨勫敮涓�ID +// return String.format("%09d", Math.abs(id) % 1000000000); // 鏍煎紡鍖栦负9浣� + return null; + } + + +// redis鍒嗗竷寮忛攣 + public String getNewTjNumberRedisLock() { + String lockKey = "lock:tjh:tj_number_lock"; + String lockValue = UUID.randomUUID().toString(); + + Boolean locked = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, 5, TimeUnit.SECONDS); + + if (Boolean.TRUE.equals(locked)) { + try { + String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date()); + String storedDate = stringRedisTemplate.opsForValue().get(LIS_CURRENT_DATE_KEY); + + if (storedDate == null || !storedDate.equals(currentDate)) { + // 鏃ユ湡鍙樻洿锛岄噸缃� Redis 璁℃暟鍣� + stringRedisTemplate.opsForValue().set(TJH_LAST_ID_KEY, "1", 1, TimeUnit.DAYS); + stringRedisTemplate.opsForValue().set(LIS_CURRENT_DATE_KEY, currentDate, 1, TimeUnit.DAYS); + return String.format("%s%05d", currentDate.substring(2), 1); + } + + // 浣跨敤 Redis INCR 纭繚鍞竴鎬� + long lastId = stringRedisTemplate.opsForValue().increment(TJH_LAST_ID_KEY); + return String.format("%s%05d", currentDate.substring(2), lastId); + } finally { + // 閲婃斁閿侊紙纭繚鏄綋鍓嶇嚎绋嬫寔鏈夌殑閿佹墠鍒犻櫎锛� + String currentLockValue = stringRedisTemplate.opsForValue().get(lockKey); + if (lockValue.equals(currentLockValue)) { + stringRedisTemplate.delete(lockKey); + } + } + } else { + throw new RuntimeException("鑾峰彇娴佹按鍙峰け璐ワ紝璇烽噸璇�"); + } + } + +//redis鍒嗗竷寮忛攣鍜孧ySQL鍏敤 + public String getNewTjNumberRedisLockAndMysql() { + String lockKey = "lock:tjh:tj_number_lock"; + RLock lock = redissonClient.getLock(lockKey); + + try { + if (lock.tryLock(5, 10, TimeUnit.SECONDS)) { + String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date()); + + // 1. 鍏堜粠 Redis 鑾峰彇缂栧彿 + String storedDate = stringRedisTemplate.opsForValue().get(LIS_CURRENT_DATE_KEY); + String lastIdStr = stringRedisTemplate.opsForValue().get(TJH_LAST_ID_KEY); + + // 2. 濡傛灉 Redis 涓病鏈夋垨鑰呯紪鍙蜂涪澶憋紝鏌ヨ鏁版嵁搴撳苟鍚屾鍒� Redis + if (storedDate == null || !storedDate.equals(currentDate) || lastIdStr == null) { + Integer lastIdFromDb = orderNumberMapper.getLastId(currentDate,lockKey); + lastIdFromDb = (lastIdFromDb == null) ? 0 : lastIdFromDb; + + // 鍚屾鍒� Redis + stringRedisTemplate.opsForValue().set(TJH_LAST_ID_KEY, String.valueOf(lastIdFromDb), 1, TimeUnit.DAYS); + stringRedisTemplate.opsForValue().set(LIS_CURRENT_DATE_KEY, currentDate, 1, TimeUnit.DAYS); + } + + // 3. 浣跨敤 Redis 鐨� INCR 淇濊瘉娴佹按鍙峰敮涓� + long lastId = stringRedisTemplate.opsForValue().increment(TJH_LAST_ID_KEY); + + // 4. 鍚屾椂鏇存柊鏁版嵁搴擄紝纭繚涓�鑷存�� + orderNumberMapper.updateLastId(currentDate, (int) lastId,lockKey); + + return String.format("%s%05d", currentDate.substring(2), lastId); + } else { + throw new RuntimeException("鑾峰彇浣撴鍙峰け璐ワ紝璇烽噸璇�"); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } finally { + if (lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + + +} diff --git a/ltkj-hosp/src/main/java/com/ltkj/hosp/mapper/OrderNumberMapper.java b/ltkj-hosp/src/main/java/com/ltkj/hosp/mapper/OrderNumberMapper.java new file mode 100644 index 0000000..94510bb --- /dev/null +++ b/ltkj-hosp/src/main/java/com/ltkj/hosp/mapper/OrderNumberMapper.java @@ -0,0 +1,17 @@ +package com.ltkj.hosp.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.poi.ss.formula.functions.T; + +@Mapper +public interface OrderNumberMapper extends BaseMapper<T> { + @Select("SELECT max(last_id) FROM order_number WHERE date_key = #{dateKey} and fl=#{fl}") + Integer getLastId(@Param("dateKey") String dateKey,@Param("fl") String fl); + + @Insert("INSERT INTO order_number(date_key, last_id,fl) VALUES(#{dateKey}, #{lastId},#{fl}) ON DUPLICATE KEY UPDATE last_id = #{lastId}") + void updateLastId(@Param("dateKey") String dateKey, @Param("lastId") int lastId,@Param("fl") String fl); +} diff --git a/ltkj-hosp/src/main/java/com/ltkj/hosp/mapper/TjOrderMapper.java b/ltkj-hosp/src/main/java/com/ltkj/hosp/mapper/TjOrderMapper.java index ac7f7f5..ff61fb4 100644 --- a/ltkj-hosp/src/main/java/com/ltkj/hosp/mapper/TjOrderMapper.java +++ b/ltkj-hosp/src/main/java/com/ltkj/hosp/mapper/TjOrderMapper.java @@ -386,4 +386,8 @@ " a.deleted = 0 \n" + " AND b.org_type = 2 \n") List<String> getJianChaTjNum(); + + + @Select("SELECT count(*) FROM tj_order WHERE tj_number = #{tjNum}") + int getOrderCountByTjNum(String tjNum); } diff --git a/ltkj-hosp/src/main/java/com/ltkj/hosp/service/ITjOrderService.java b/ltkj-hosp/src/main/java/com/ltkj/hosp/service/ITjOrderService.java index 6d78e52..0967411 100644 --- a/ltkj-hosp/src/main/java/com/ltkj/hosp/service/ITjOrderService.java +++ b/ltkj-hosp/src/main/java/com/ltkj/hosp/service/ITjOrderService.java @@ -188,4 +188,6 @@ void tjLispacstongbujianyi(String tjNumber, Long deptId,String nickName, Long userId); Map<String, Object> getTjBgdyList(Integer pageNum, Integer pageSize, Integer dyzt, String tjNum, String name, String dw, String djbeginTime, String djendTime); + + int getOrderCountByTjNum(String tjh); } diff --git a/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjOrderServiceImpl.java b/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjOrderServiceImpl.java index 04bc44d..f2a47fa 100644 --- a/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjOrderServiceImpl.java +++ b/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjOrderServiceImpl.java @@ -449,4 +449,8 @@ map1.put("total",map.get("total")); return map1; } + @Override + public int getOrderCountByTjNum(String tjNum) { + return tjOrderMapper.getOrderCountByTjNum(tjNum); + } } diff --git a/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjSamplingServiceImpl.java b/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjSamplingServiceImpl.java index 18c3ed1..aebbf90 100644 --- a/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjSamplingServiceImpl.java +++ b/ltkj-hosp/src/main/java/com/ltkj/hosp/service/impl/TjSamplingServiceImpl.java @@ -1,19 +1,14 @@ package com.ltkj.hosp.service.impl; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ltkj.common.core.domain.AjaxResult; import com.ltkj.common.utils.DateUtils; -import com.ltkj.common.utils.IdUtils; -import com.ltkj.hosp.domain.TjCustomer; -import com.ltkj.hosp.domain.TjOrder; +import com.ltkj.hosp.idutil.IdUtils; import com.ltkj.hosp.service.ITjCustomerService; import com.ltkj.hosp.service.ITjOrderService; import lombok.extern.slf4j.Slf4j; -- Gitblit v1.8.0