Browse Source

2026-07-02

优化定时任务(人员等级、加工中心)
master
fengyuan_yang 4 weeks ago
parent
commit
7b21774862
  1. 27
      src/main/java/com/spring/modules/part/service/impl/RoutingManagementServiceImpl.java
  2. 60
      src/main/java/com/spring/modules/part/task/PartRelatedTask.java

27
src/main/java/com/spring/modules/part/service/impl/RoutingManagementServiceImpl.java

@ -1588,15 +1588,19 @@ public class RoutingManagementServiceImpl extends ServiceImpl<RoutingManagementM
}
// 修改
if (!toUpdate.isEmpty()) {
// 分批修改
// SQL更新条件使用 list[0].site需按site分组后再分批避免跨site时误用首条site
Map<String, List<PersonnelLevel>> updatesBySite = toUpdate.stream()
.collect(Collectors.groupingBy(PersonnelLevel::getSite));
int batchSize = 100; // 假设每批100条记录
for (int i = 0; i < toUpdate.size(); i += batchSize) {
int end = Math.min(i + batchSize, toUpdate.size());
List<PersonnelLevel> subList = toUpdate.subList(i, end);
for (List<PersonnelLevel> siteUpdateList : updatesBySite.values()) {
for (int i = 0; i < siteUpdateList.size(); i += batchSize) {
int end = Math.min(i + batchSize, siteUpdateList.size());
List<PersonnelLevel> subList = siteUpdateList.subList(i, end);
routingManagementMapper.syncUpdateLaborClass(subList);
}
}
}
}
/**
* 同步加工中心到PLM
@ -1667,16 +1671,17 @@ public class RoutingManagementServiceImpl extends ServiceImpl<RoutingManagementM
}
// 修改
if (!toUpdate.isEmpty()) {
// 分批修改
// SQL更新条件使用 list[0].site需按site分组后再分批避免跨site时误用首条site
Map<String, List<WorkCenter>> updatesBySite = toUpdate.stream()
.collect(Collectors.groupingBy(WorkCenter::getSite));
int batchSize = 50; // 假设每批100条记录
for (int i = 0; i < toUpdate.size(); i += batchSize) {
int end = Math.min(i + batchSize, toUpdate.size());
List<WorkCenter> subList = toUpdate.subList(i, end);
for (List<WorkCenter> siteUpdateList : updatesBySite.values()) {
for (int i = 0; i < siteUpdateList.size(); i += batchSize) {
int end = Math.min(i + batchSize, siteUpdateList.size());
List<WorkCenter> subList = siteUpdateList.subList(i, end);
routingManagementMapper.syncUpdateWorkCenter(subList);
}
// for (WorkCenter workCenter : toUpdate) {
// routingManagementMapper.syncUpdateWorkCenter(workCenter);
// }
}
}
}

60
src/main/java/com/spring/modules/part/task/PartRelatedTask.java

@ -1,12 +1,8 @@
package com.spring.modules.part.task;
import com.spring.common.utils.DateUtils;
import com.spring.modules.base.vo.PersonnelLevelVo;
import com.spring.modules.base.vo.WorkCenterCostVo;
import com.spring.modules.part.service.PartInformationService;
import com.spring.modules.part.service.PartService;
import com.spring.modules.part.service.RoutingManagementService;
import com.spring.modules.part.vo.InventoryPartUnitCostSumVo;
import com.spring.modules.part.vo.LocationInformationVo;
import com.spring.modules.part.vo.WorkCenterVo;
import lombok.extern.slf4j.Slf4j;
@ -19,6 +15,11 @@ import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@Component
@Configuration
@EnableScheduling
@ -34,51 +35,80 @@ public class PartRelatedTask {
@Scheduled(cron = "${task.data.syncDataToPLM}")
public void executeDeviceCollect() {
String siteCon = convertToSQLString(useSite);
String siteCon = buildSiteCon();
if ("()".equals(siteCon)) {
logger.warn("未配置可用站点,跳过同步。use-site={}", useSite);
return;
}
// 同步人员等级
try {
logger.info("开始同步人员等级...");
logger.info("开始同步人员等级,siteCon={}", siteCon);
PersonnelLevelVo laborClassVo = new PersonnelLevelVo();
laborClassVo.setSiteCon(siteCon);
routingManagementService.syncLaborClassToPLM(laborClassVo);
logger.info("同步人员等级完成");
logger.info("同步人员等级完成,siteCon={}", siteCon);
} catch (Exception e) {
logger.error("同步人员等级失败: " + e.getMessage(), e);
logger.error("同步人员等级失败,siteCon={},error={}", siteCon, e.getMessage(), e);
}
// 同步加工中心
try {
logger.info("开始同步加工中心...");
logger.info("开始同步加工中心,siteCon={}", siteCon);
WorkCenterVo workCenterVo = new WorkCenterVo();
workCenterVo.setSiteCon(siteCon);
routingManagementService.syncWorkCenterToPLM(workCenterVo);
logger.info("同步加工中心完成");
logger.info("同步加工中心完成,siteCon={}", siteCon);
} catch (Exception e) {
logger.error("同步加工中心失败: " + e.getMessage(), e);
logger.error("同步加工中心失败,siteCon={},error={}", siteCon, e.getMessage(), e);
}
// 同步加工中心成本
try {
logger.info("开始同步加工中心成本...");
logger.info("开始同步加工中心成本,siteCon={}", siteCon);
WorkCenterCostVo workCenterCostVo = new WorkCenterCostVo();
workCenterCostVo.setSiteCon(siteCon);
routingManagementService.syncWorkCenterCostToPLM(workCenterCostVo);
logger.info("同步加工中心成本完成");
logger.info("同步加工中心成本完成,siteCon={}", siteCon);
} catch (Exception e) {
logger.error("同步加工中心成本失败: " + e.getMessage(), e);
logger.error("同步加工中心成本失败,siteCon={},error={}", siteCon, e.getMessage(), e);
}
}
@Scheduled(cron = "${task.data.syncLocationToPLM}")
public void executeDeviceCollect2() {
String siteCon = convertToSQLString(useSite);
String siteCon = buildSiteCon();
if ("()".equals(siteCon)) {
logger.warn("未配置可用站点,跳过库位同步。use-site={}", useSite);
return;
}
// 同步库位
LocationInformationVo locationVo = new LocationInformationVo();
locationVo.setSiteCon(siteCon);
routingManagementService.syncLocationToPLM(locationVo);
}
private List<String> parseSites(String siteConfig) {
if (siteConfig == null || siteConfig.trim().isEmpty()) {
return Collections.emptyList();
}
return Arrays.stream(siteConfig.split(","))
.map(String::trim)
.filter(site -> !site.isEmpty())
.distinct()
.collect(Collectors.toList());
}
private String buildSiteCon() {
List<String> sites = parseSites(useSite);
if (sites.isEmpty()) {
return "()";
}
return convertToSQLString(String.join(",", sites));
}
public static String convertToSQLString(String input) {
if (input == null || input.isEmpty()) {
return "()";

Loading…
Cancel
Save