Selaa lähdekoodia

去棒一高线主表并发重复问题解决

qiangxuan 4 päivää sitten
vanhempi
sitoutus
a17f3e1d2b

+ 3 - 70
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/billetActual/service/impl/BilletHotsendBaseServiceImpl.java

@@ -772,27 +772,7 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 			// 保存棒一信息
 			RollClubOne rollClubOne = new RollClubOne();
 			BeanUtils.copyProperties(billetHotsend, rollClubOne);
-			rollClubOne.setSize(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getLength())); //定尺
-			rollClubOne.setSteel(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getGrade())); //钢种
-			rollClubOne.setSpec(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getSpec())); //规格
-			rollClubOne.setBlankOutput(rollClubCommonList.stream().mapToDouble(RollClubCommon::getBilletWeight).sum());//出坯量总和
-			LambdaQueryWrapper<RollClubOne> queryWrapper1 = new LambdaQueryWrapper<>();
-			queryWrapper1.eq(RollClubOne::getCcmNo, billetHotsend.getCcmNo())
-					.eq(RollClubOne::getHeatNo, billetHotsend.getHeatNo())
-					.eq(RollClubOne::getShift, billetHotsend.getShift())
-					.eq(RollClubOne::getShiftGroup, billetHotsend.getShiftGroup());
-			RollClubOne rollClubOne1 = rollClubOneService.getOne(queryWrapper1);
-
-			if (oConvertUtils.isEmpty(rollClubOne1)){
-				rollClubOne.setCreateDate(new Date());
-				rollClubOne.setAmountTotal(rollClubCommonList.size());// 总支数
-				rollClubOneService.save(rollClubOne);
-			}else {
-				rollClubOne1.setAmountTotal(rollClubOne1.getAmountTotal() + rollClubCommonList.size());// 总支数
-				rollClubOne1.setBlankOutput(rollClubOne1.getBlankOutput() + rollClubOne.getBlankOutput());
-				rollClubOne1.setUpdateTime(new Date());
-				rollClubOneService.updateById(rollClubOne1);
-			}
+			rollClubOneService.saveOrUpdateByUniqueKey(rollClubOne, rollClubCommonList);
 			// 保存棒一明细信息
 			List<RollClubOneDetails> rollClubOneDetailsList = new ArrayList<>();
 			rollClubCommonList.forEach(x ->{
@@ -919,55 +899,8 @@ public class BilletHotsendBaseServiceImpl extends ServiceImpl<BilletHotsendBaseM
 		if ("roll_height".equals(billetHotsendDetailsVo.getBelongTable())){
 			RollHeight rollHeight = new RollHeight();
 			BeanUtils.copyProperties(billetHotsend, rollHeight);
-			rollHeight.setSize(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getLength())); //定尺
-			rollHeight.setSteel(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getGrade())); //钢种
-			rollHeight.setSpec(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getSpec())); //规格
-			rollHeight.setBlankOutput(rollClubCommonList.stream().mapToDouble(RollClubCommon::getBilletWeight).sum());//出坯量总和
-			LambdaQueryWrapper<RollHeight> queryWrapper1 = new LambdaQueryWrapper<>();
-			queryWrapper1.eq(RollHeight::getCcmNo, billetHotsend.getCcmNo())
-					.eq(RollHeight::getHeatNo, billetHotsend.getHeatNo())
-					.eq(RollHeight::getShift, billetHotsend.getShift())
-					.eq(RollHeight::getShiftGroup, billetHotsend.getShiftGroup());
-			RollHeight rollHeight1 = rollHeightService.getOne(queryWrapper1);
-			if (oConvertUtils.isEmpty(rollHeight1)){
-				String distinctAssemblyNumber = rollClubCommonList.stream()
-						.map(RollClubCommon::getAssemblyNumber)
-						.filter(assemblyNumber -> assemblyNumber!= null)
-						.distinct()
-						.collect(Collectors.joining(","));
-				rollHeight.setCreateDate(new Date());
-				rollHeight.setAmountTotal(rollClubCommonList.size());// 总支数
-				rollHeight.setAssemblyNumber(distinctAssemblyNumber); // 设置去重后的 assemblyNumber
-				rollHeightService.save(rollHeight);
-			}else {
-				rollHeight1.setAmountTotal(rollHeight1.getAmountTotal() + rollClubCommonList.size());// 总支数
-				rollHeight1.setBlankOutput(rollHeight1.getBlankOutput() + rollHeight.getBlankOutput());//出坯量
-				rollHeight1.setUpdateTime(new Date());
-
-				String assemblyNumber = "";
-				if (oConvertUtils.isNotEmpty(rollHeight1.getAssemblyNumber())){
-					assemblyNumber = rollHeight1.getAssemblyNumber() + "," + rollClubCommonList.stream()
-							.map(RollClubCommon::getAssemblyNumber)
-							.filter(x -> x != null)
-							.distinct()
-							.collect(Collectors.joining(","));
-					// 对 assemblyNumber 进行二次去重
-					String finalAssemblyNumber = Arrays.stream(assemblyNumber.split(","))
-							.filter(s -> !s.isEmpty())
-							.distinct()
-							.collect(Collectors.joining(","));
-					rollHeight1.setAssemblyNumber(finalAssemblyNumber);
-				}else {
-					assemblyNumber = rollClubCommonList.stream()
-							.map(RollClubCommon::getAssemblyNumber)
-							.filter(x -> x != null)
-							.distinct()
-							.collect(Collectors.joining(","));
-					rollHeight1.setAssemblyNumber(assemblyNumber);
-				}
-
-				rollHeightService.updateById(rollHeight1);
-			}
+			// 保存轧钢高线主表信息
+			rollHeightService.saveOrUpdateByUniqueKey(rollHeight, rollClubCommonList);
 			// 保存高线明细信息
 			List<RollHeightDetails> rollHeightDetailsList = new ArrayList<>();
 			rollClubCommonList.forEach(x ->{

+ 6 - 1
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/rollClubOne/mapper/RollClubOneMapper.java

@@ -13,5 +13,10 @@ import org.jeecg.modules.rollClubOne.entity.RollClubOne;
  * @Version: V1.0
  */
 public interface RollClubOneMapper extends BaseMapper<RollClubOne> {
-
+    /**
+     * 插入或更新记录
+     * 当唯一索引冲突时,更新相关字段
+     */
+    int insertOrUpdate(@Param("entity") RollClubOne entity,
+                       @Param("commonListSize") int commonListSize);
 }

+ 27 - 1
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/rollClubOne/mapper/xml/RollClubOneMapper.xml

@@ -1,5 +1,31 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.rollClubOne.mapper.RollClubOneMapper">
-
+    <insert id="insertOrUpdate">
+        INSERT INTO roll_club_one
+        (id, create_by, create_time, update_by, update_time, sys_org_code, create_date,
+         ccm_no, heat_no, shift_group, shift, size, steel, spec, decide_weight,
+         amount_total, blank_output, cc, mn, si, ss, pp, vv, nb, is_upd)
+        VALUES
+            (#{entity.id}, #{entity.createBy}, NOW(), #{entity.updateBy}, NOW(),
+             #{entity.sysOrgCode}, #{entity.createDate},
+             #{entity.ccmNo}, #{entity.heatNo}, #{entity.shiftGroup}, #{entity.shift},
+             #{entity.size}, #{entity.steel}, #{entity.spec}, #{entity.decideWeight},
+             #{commonListSize}, #{entity.blankOutput}, #{entity.cc}, #{entity.mn},
+             #{entity.si}, #{entity.ss}, #{entity.pp}, #{entity.vv}, #{entity.nb},
+             #{entity.isUpd})
+            ON DUPLICATE KEY UPDATE
+                                 update_by = #{entity.updateBy},
+                                 update_time = NOW(),
+                                 amount_total = amount_total + #{commonListSize},
+                                 blank_output = blank_output + #{entity.blankOutput},
+                                 cc = IFNULL(#{entity.cc}, cc),
+                                 mn = IFNULL(#{entity.mn}, mn),
+                                 si = IFNULL(#{entity.si}, si),
+                                 ss = IFNULL(#{entity.ss}, ss),
+                                 pp = IFNULL(#{entity.pp}, pp),
+                                 vv = IFNULL(#{entity.vv}, vv),
+                                 nb = IFNULL(#{entity.nb}, nb),
+                                 is_upd = IFNULL(#{entity.isUpd}, is_upd)
+    </insert>
 </mapper>

+ 7 - 0
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/rollClubOne/service/IRollClubOneService.java

@@ -1,8 +1,11 @@
 package org.jeecg.modules.rollClubOne.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.billetActual.entity.RollClubCommon;
 import org.jeecg.modules.rollClubOne.entity.RollClubOne;
 
+import java.util.List;
+
 
 /**
  * @Description: 轧钢棒一
@@ -11,5 +14,9 @@ import org.jeecg.modules.rollClubOne.entity.RollClubOne;
  * @Version: V1.0
  */
 public interface IRollClubOneService extends IService<RollClubOne> {
+    /**
+     * 保存或更新记录(使用INSERT ON DUPLICATE KEY UPDATE)
+     */
+    void saveOrUpdateByUniqueKey(RollClubOne entity, List<RollClubCommon> rollClubCommonList);
 
 }

+ 23 - 0
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/rollClubOne/service/impl/RollClubOneServiceImpl.java

@@ -1,11 +1,16 @@
 package org.jeecg.modules.rollClubOne.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.billetActual.entity.RollClubCommon;
 import org.jeecg.modules.rollClubOne.entity.RollClubOne;
 import org.jeecg.modules.rollClubOne.mapper.RollClubOneMapper;
 import org.jeecg.modules.rollClubOne.service.IRollClubOneService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
 
 
 /**
@@ -17,5 +22,23 @@ import org.springframework.stereotype.Service;
 @Service
 public class RollClubOneServiceImpl extends ServiceImpl<RollClubOneMapper, RollClubOne> implements IRollClubOneService {
 
+    @Autowired
+    private RollClubOneMapper rollClubOneMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveOrUpdateByUniqueKey(RollClubOne rollClubOne, List<RollClubCommon> rollClubCommonList) {
+        if (rollClubCommonList == null || rollClubCommonList.isEmpty()) {
+            throw new IllegalArgumentException("rollClubCommonList不能为空");
+        }
+        rollClubOne.setId(String.valueOf(IdWorker.getId()));
+        // 设置定尺、钢种、规格和出坯量
+        rollClubOne.setSize(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getLength()));//定尺
+        rollClubOne.setSteel(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getGrade()));//钢种
+        rollClubOne.setSpec(String.valueOf(rollClubCommonList.stream().findFirst().orElse(null).getSpec()));//规格
+        rollClubOne.setBlankOutput(rollClubCommonList.stream().mapToDouble(RollClubCommon::getBilletWeight).sum());//出坯量总和
+        // 执行插入或更新操作
+        rollClubOneMapper.insertOrUpdate(rollClubOne, rollClubCommonList.size());
+    }
 
 }

+ 8 - 0
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/rollHeight/mapper/RollHeightMapper.java

@@ -2,6 +2,7 @@ package org.jeecg.modules.rollHeight.mapper;
 
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.rollHeight.entity.RollHeight;
 
 /**
@@ -12,4 +13,11 @@ import org.jeecg.modules.rollHeight.entity.RollHeight;
  */
 public interface RollHeightMapper extends BaseMapper<RollHeight> {
 
+    /**
+     * 插入或更新记录
+     * 当唯一索引冲突时,更新相关字段
+     */
+    int insertOrUpdate(@Param("entity") RollHeight entity,
+                       @Param("commonListSize") int commonListSize,
+                       @Param("assemblyNumbers") String assemblyNumbers);
 }

+ 32 - 0
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/rollHeight/mapper/xml/RollHeightMapper.xml

@@ -2,4 +2,36 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.jeecg.modules.rollHeight.mapper.RollHeightMapper">
 
+    <insert id="insertOrUpdate">
+        INSERT INTO roll_height
+        (id, create_by, create_time, update_by, update_time, sys_org_code, create_date,
+         ccm_no, heat_no, shift_group, shift, size, steel, spec, decide_weight,
+         amount_total, blank_output, cc, mn, si, ss, pp, vv, nb, is_upd, assembly_number)
+        VALUES
+            (#{entity.id}, #{entity.createBy}, NOW(), #{entity.updateBy}, NOW(),
+             #{entity.sysOrgCode}, #{entity.createDate},
+             #{entity.ccmNo}, #{entity.heatNo}, #{entity.shiftGroup}, #{entity.shift},
+             #{entity.size}, #{entity.steel}, #{entity.spec}, #{entity.decideWeight},
+             #{commonListSize}, #{entity.blankOutput}, #{entity.cc}, #{entity.mn},
+             #{entity.si}, #{entity.ss}, #{entity.pp}, #{entity.vv}, #{entity.nb},
+             #{entity.isUpd}, #{assemblyNumbers})
+            ON DUPLICATE KEY UPDATE
+                                 update_by = #{entity.updateBy},
+                                 update_time = NOW(),
+                                 amount_total = amount_total + #{commonListSize},
+                                 blank_output = blank_output + #{entity.blankOutput},
+                                 cc = IFNULL(#{entity.cc}, cc),
+                                 mn = IFNULL(#{entity.mn}, mn),
+                                 si = IFNULL(#{entity.si}, si),
+                                 ss = IFNULL(#{entity.ss}, ss),
+                                 pp = IFNULL(#{entity.pp}, pp),
+                                 vv = IFNULL(#{entity.vv}, vv),
+                                 nb = IFNULL(#{entity.nb}, nb),
+                                 is_upd = IFNULL(#{entity.isUpd}, is_upd),
+                                 assembly_number = CONCAT(
+                                 CASE WHEN assembly_number IS NULL OR assembly_number = '' THEN '' ELSE CONCAT(assembly_number, ',') END,
+                                 #{assemblyNumbers}
+                                 )
+    </insert>
+
 </mapper>

+ 9 - 0
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/rollHeight/service/IRollHeightService.java

@@ -1,9 +1,12 @@
 package org.jeecg.modules.rollHeight.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.billetActual.entity.RollClubCommon;
 import org.jeecg.modules.rollHeight.entity.DestinationStatistics;
 import org.jeecg.modules.rollHeight.entity.RollHeight;
 
+import java.util.List;
+
 
 /**
  * @Description: 轧钢高线
@@ -15,4 +18,10 @@ public interface IRollHeightService extends IService<RollHeight> {
 
     DestinationStatistics queryByCcmNoHandle(String ccmNo);
 
+
+    /**
+     * 保存或更新记录(使用INSERT ON DUPLICATE KEY UPDATE)
+     */
+    void saveOrUpdateByUniqueKey(RollHeight entity, List<RollClubCommon> commonList);
+
 }

+ 34 - 0
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/rollHeight/service/impl/RollHeightServiceImpl.java

@@ -1,9 +1,11 @@
 package org.jeecg.modules.rollHeight.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.jeecg.common.util.oConvertUtils;
 
+import org.jeecg.modules.billetActual.entity.RollClubCommon;
 import org.jeecg.modules.rollHeight.entity.DestinationStatistics;
 import org.jeecg.modules.rollHeight.entity.DestinationStatisticsDetails;
 import org.jeecg.modules.rollHeight.entity.RollHeight;
@@ -13,6 +15,7 @@ import org.jeecg.modules.rollHeight.service.IRollHeightDetailsService;
 import org.jeecg.modules.rollHeight.service.IRollHeightService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -32,6 +35,9 @@ public class RollHeightServiceImpl extends ServiceImpl<RollHeightMapper, RollHei
     @Autowired
     private IRollHeightDetailsService rollHeightDetailsService;
 
+    @Autowired
+    private RollHeightMapper rollHeightMapper;
+
     @Override
     public DestinationStatistics queryByCcmNoHandle(String ccmNo) {
         DestinationStatistics destinationStatistics = new DestinationStatistics();
@@ -94,4 +100,32 @@ public class RollHeightServiceImpl extends ServiceImpl<RollHeightMapper, RollHei
         destinationStatistics.setStatisticsDetailsList(rollHeightStatisticsDetailsList);
         return destinationStatistics;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveOrUpdateByUniqueKey(RollHeight rollHeight, List<RollClubCommon> commonList) {
+        if (commonList == null || commonList.isEmpty()) {
+            throw new IllegalArgumentException("commonList不能为空");
+        }
+
+        // 生成分布式ID
+        rollHeight.setId(String.valueOf(IdWorker.getId()));
+
+        // 设置定尺、钢种、规格和出坯量
+        RollClubCommon firstCommon = commonList.stream().findFirst().orElseThrow(() -> new IllegalStateException("commonList不能为空"));
+        rollHeight.setSize(String.valueOf(firstCommon.getLength()));
+        rollHeight.setSteel(String.valueOf(firstCommon.getGrade()));
+        rollHeight.setSpec(String.valueOf(firstCommon.getSpec()));
+        rollHeight.setBlankOutput(commonList.stream().mapToDouble(RollClubCommon::getBilletWeight).sum());
+
+        // 处理组坯号(assemblyNumber) - 去重后合并
+        String distinctAssemblyNumbers = commonList.stream()
+                .map(RollClubCommon::getAssemblyNumber)
+                .filter(assemblyNumber -> assemblyNumber != null && !assemblyNumber.isEmpty())
+                .distinct()
+                .collect(Collectors.joining(","));
+
+        // 执行插入或更新操作
+        rollHeightMapper.insertOrUpdate(rollHeight, commonList.size(), distinctAssemblyNumbers);
+    }
 }