From e70dec0b370563c443d426624829a4fc481895d7 Mon Sep 17 00:00:00 2001
From: guoyujie <guoyujie@ng.com>
Date: 星期二, 18 十一月 2025 15:37:52 +0800
Subject: [PATCH] 更新先保存在redis中再使用定时任务向mysql传递完工任务
---
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java | 143 +++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 131 insertions(+), 12 deletions(-)
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java b/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
index 2fcd474..82791e5 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
@@ -3,7 +3,6 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
-import com.aspose.cad.internal.I.S;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -33,9 +32,9 @@
import com.example.erp.tools.JacksonUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
+import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -51,6 +50,7 @@
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
@Service
@DS("pp")
@@ -1134,12 +1134,7 @@
//鍒ゆ柇鎶ュ伐琛ㄦ槸鍚﹀瓨鍦紝涓嶅瓨鍦ㄥ垯鏂板鎶ュ伐涓诲壇琛ㄦ暟鎹紝瀛樺湪鍒欎慨鏀瑰壇琛ㄦ暟鎹�
if(ReportingWorks.isEmpty()){
//鑾峰彇褰撳墠鏈�澶ф姤宸ュ崟鍙风敓鎴愭姤宸ュ崟鍙�
- String formattedNumber = String.format("%04d", reportingWorkMapper.selectMaxReportingWorkId() + 1);
- //鏍煎紡鍖栧綋鍓嶆棩鏈�
- Date currentDate = new Date();
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
- String formattedDate = dateFormat.format(currentDate);
- String reportingWorkId = "BG" + formattedDate + formattedNumber;
+ String reportingWorkId = this.getTodayMaxReportingId();
reportingWork.setReportingWorkId(reportingWorkId);
reportingWorkDetail.setReportingWorkId(reportingWorkId);
@@ -1592,7 +1587,7 @@
//@Transactional(rollbackFor = Exception.class , noRollbackFor = ServiceException.class)
- public Result mesReportingWorkSv1(Map<String, Object> reportingWorkMap) throws JsonProcessingException {
+ public Result mesReportingWorkSvToRedis(Map<String, Object> reportingWorkMap) throws JsonProcessingException, InterruptedException {
//璁剧疆鍥炴粴鐐�
//Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
@@ -1601,11 +1596,20 @@
String detailJson = JacksonUtil.writeValueAsString(reportingWorkMap.get("detail"));
ReportingWork reportingWork = JacksonUtil.readValue(titleJson, ReportingWork.class);
ReportingWorkDetail reportingWorkDetail = JacksonUtil.readValue(detailJson, ReportingWorkDetail.class);
- String Base_KEY = reportingWork.getProcessId()+":"+reportingWork.getThisProcess()+":"+reportingWork.getDeviceName();
+ String Base_KEY = "reportingWork:"+reportingWork.getProcessId()+"/"+reportingWorkDetail.getTechnologyNumber()+":"+reportingWork.getThisProcess()+":"+reportingWork.getDeviceName();
String reportingWork_KEY = Base_KEY+":title";
- String reportingWorkDetail_KEY = Base_KEY+":detail:"+reportingWorkDetail.getOrderNumber()+":"+reportingWorkDetail.getTechnologyNumber();
+ String reportingWorkDetail_KEY = Base_KEY+":detail:"+reportingWorkDetail.getOrderNumber();
- String process_KEY = reportingWork.getProcessId()+":process:"+reportingWorkDetail.getOrderNumber()+":"+reportingWorkDetail.getTechnologyNumber();
+ String process_KEY = "reportingWork:"+reportingWork.getProcessId()+"/"+reportingWorkDetail.getTechnologyNumber()+":process";
+
+ //鍒ゆ柇閿佹槸鍚﹀瓨鍦紝瀛樺湪绛夊緟5绉�
+ if(Boolean.TRUE.equals(stringRedisTemplate.hasKey("lock:reportingWork"))){
+ Thread.sleep(5*1000);
+ if(Boolean.TRUE.equals(stringRedisTemplate.hasKey("lock:reportingWork"))){
+ throw new ServiceException(Constants.Code_600, "褰撳墠鏈嶅姟鍣ㄦ鍦ㄥ鐞嗘姤宸ユ暟鎹紝璇风◢鍚庨噸璇曪紒");
+ }
+ }
+
//鍒ゆ柇宸ュ簭鏄惁瀛樺湪redis涓�
if(!Boolean.TRUE.equals(stringRedisTemplate.hasKey(process_KEY+":"+reportingWork.getThisProcess()))){
@@ -1650,6 +1654,8 @@
JacksonUtil.readValueObjectToString(reportingWork,new TypeReference<Map<String, String>>() {})
);
}
+ //鑾峰彇鍙姤鏁伴噺
+
//鍒ゆ柇鏄惁redis姝ゆ姤宸ユ槑缁嗕腑key鏄惁瀛樺湪
if(Boolean.TRUE.equals(stringRedisTemplate.hasKey(reportingWorkDetail_KEY))){
stringRedisTemplate.opsForHash().increment(
@@ -1665,4 +1671,117 @@
}
return Result.success("鎻愪氦鎴愬姛");
}
+
+ public void redisToMysqlReportingWork() throws InterruptedException {
+ if(Boolean.TRUE.equals(stringRedisTemplate.hasKey("lock:reportingWork"))){
+ throw new ServiceException(Constants.Code_600, "瀹氭椂浠诲姟:褰撳墠鏈嶅姟鍣ㄦ鍦ㄥ鐞嗘姤宸ユ暟鎹紝璇风◢鍚庨噸璇曪紒");
+ }
+ //鑾峰彇鎵�鏈塳ey
+ String pattern = "reportingWork:*";
+ Set<String> keys = stringRedisTemplate.keys(pattern);
+
+ //鍒ゆ柇redis涓槸鍚﹀瓨鍦ㄦ姤宸ユ暟鎹�,瀛樺湪鍒欐坊鍔犻攣 骞朵笖淇敼key杞Щ鍒颁笂浼爉ysql鐨刱ey涓�
+ if (keys != null && !keys.isEmpty()) {
+ //娣诲姞閿�
+ stringRedisTemplate.opsForValue().set("lock:reportingWork","1",60, TimeUnit.SECONDS);
+
+ if(Boolean.FALSE.equals(stringRedisTemplate.hasKey("upload:*" ))){
+ keys.forEach(key -> {
+ stringRedisTemplate.rename(key, "upload:" + key);
+ });
+ }
+ }
+ //娣诲姞鏆傚仠鏃堕棿锛屾柟寮忚幏鍙杕ap鏃讹紝redis涓暟鎹繕鍦ㄥ彉鍖�
+ Thread.sleep(200);
+
+
+ // 淇濆瓨鏃ュ織锛屾妸redis涓殑鏁版嵁淇濆瓨鍒版棩蹇椾腑
+ Map<String, Map<Object, Object>> map = this.getAllHashesByPattern("upload:reportingWork:*");
+ Log log = new Log();
+ log.setContent(JacksonUtil.writeValueAsString(map));
+ log.setFunction("reportingWorkRedisToMysql");
+ log.setOperator("鑷姩瀹氭椂鎶ュ伐");
+ logService.saveLog(log);
+ //鍒犻櫎閿侊紝璁╂帴鍙g户缁帴鏀舵姤宸�
+ stringRedisTemplate.delete("lock:reportingWork");
+
+ //鑾峰彇鍒版墍鏈夊弬鏁板悗娓呯┖redis搴�
+ // stringRedisTemplate.getConnectionFactory().getConnection().flushDb();
+
+ //浠巖edis涓幏鍙栨墍鏈夋姤宸ヤ富琛ㄦ暟鎹�
+ String titleKeyString = "upload:reportingWork:*:title";
+ Set<String> titleKeys = stringRedisTemplate.keys(titleKeyString);
+ if (titleKeys != null) {
+ titleKeys.forEach(titleKey -> {
+ ReportingWork reportingWork = JSON.parseObject(
+ JSONObject.toJSONString(stringRedisTemplate.opsForHash().entries(titleKey))
+ , ReportingWork.class
+ );
+ //鑾峰彇褰撳ぉ涓�鍏辨湁澶氬皯涓姤宸ョ紪鍙�
+ String reportingWorkId = this.getTodayMaxReportingId();
+ //娣诲姞鎶ュ伐缂栧彿
+ reportingWork.setReportingWorkId(reportingWorkId);
+ //寰�涓昏〃鎻掑叆鎶ュ伐涓绘暟鎹�
+ reportingWorkMapper.insert(reportingWork);
+
+ String detailKeyString = titleKey.replace(":title", ":detail:*");
+ Set<String> detailKeys = stringRedisTemplate.keys(detailKeyString);
+ if (detailKeys != null) {
+ detailKeys.forEach(detailKey -> {
+
+ ReportingWorkDetail reportingWorkDetail = JSON.parseObject(
+ JSONObject.toJSONString(stringRedisTemplate.opsForHash().entries(detailKey))
+ , ReportingWorkDetail.class
+ );
+ reportingWorkDetail.setReportingWorkId(reportingWorkId);
+ reportingWorkDetailMapper.insert(reportingWorkDetail);
+
+ //鏍规嵁璁㈠崟id锛岃鍗曞簭鍙凤紝浠ュ強灏忕墖搴忓彿 鏇存柊灏忕墖娴佺▼鐨勫畬宸ユ暟閲忎互鍙婂埡鐮存暟閲�
+ LambdaUpdateWrapper<OrderProcessDetail> updateWrapper = new LambdaUpdateWrapper<>();
+ updateWrapper.eq(OrderProcessDetail::getOrderNumber, reportingWorkDetail.getOrderNumber())
+ .eq(OrderProcessDetail::getProcessId, reportingWork.getProcessId())
+ .eq(OrderProcessDetail::getOrderId, reportingWork.getOrderId())
+ .eq(OrderProcessDetail::getProcess, reportingWork.getThisProcess())
+ .eq(OrderProcessDetail::getTechnologyNumber, reportingWorkDetail.getTechnologyNumber())
+ .setSql("reporting_work_num_count = reporting_work_num_count +" + reportingWorkDetail.getCompletedQuantity())
+ .setSql("reporting_work_num =reporting_work_num +" + reportingWorkDetail.getCompletedQuantity());
+
+ orderProcessDetailMapper.update(null, updateWrapper);
+ });
+ }
+
+ });
+ }
+ Set<String> uploadKeys = stringRedisTemplate.keys("upload:reportingWork:*");
+ if (uploadKeys != null) {
+ stringRedisTemplate.delete(uploadKeys);
+ }
+
+ }
+
+ public String getTodayMaxReportingId() {
+ String formattedNumber = String.format("%04d", reportingWorkMapper.selectMaxReportingWorkId() + 1);
+ //鏍煎紡鍖栧綋鍓嶆棩鏈�
+ Date currentDate = new Date();
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
+ String formattedDate = dateFormat.format(currentDate);
+ return "BG" + formattedDate + formattedNumber;
+
+ }
+
+
+/*鑾峰彇鎵�鏈夌殑鍙傛暟杞�*/
+ public Map<String, Map<Object, Object>> getAllHashesByPattern(String pattern) {
+ Set<String> keys = stringRedisTemplate.keys(pattern);
+ Map<String, Map<Object, Object>> result = new HashMap<>();
+
+ if (keys != null) {
+ for (String key : keys) {
+ Map<Object, Object> hashData = stringRedisTemplate.opsForHash().entries(key);
+ result.put(key, hashData);
+ }
+ }
+
+ return result;
+ }
}
--
Gitblit v1.8.0