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