From aaedb814d0282549f941d93344da6b1f371b92ce Mon Sep 17 00:00:00 2001 From: zxy Date: Fri, 27 Mar 2026 15:54:23 +0800 Subject: [PATCH] =?UTF-8?q?refactor(heli):=20=E9=87=8D=E6=9E=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=87=87=E9=9B=86=E6=9C=8D=E5=8A=A1=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=92=8C=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataAcquisitionController.java | 11 +- .../DataAcquisitionService.java | 4 +- .../DataAcquisitionServiceImpl.java | 204 +++++++----------- .../src/api/heli/dataacquisition/index.ts | 8 +- .../src/views/heli/dataacquisition/update.vue | 46 ++-- 5 files changed, 114 insertions(+), 159 deletions(-) diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/dataacquisition/DataAcquisitionController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/dataacquisition/DataAcquisitionController.java index d71aff65..b28093e5 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/dataacquisition/DataAcquisitionController.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/dataacquisition/DataAcquisitionController.java @@ -22,6 +22,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; +import java.time.LocalDateTime; import java.util.List; import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; @@ -114,14 +115,14 @@ public class DataAcquisitionController { @GetMapping("/updateTime") @Operation(summary = "更新设备数据采集") @PreAuthorize("@ss.hasPermission('heli:data-acquisition:update')") - public CommonResult updateTime(@RequestParam("code") String code) { - dataAcquisitionService.updateTime(code, null); + public CommonResult updateTime(@RequestParam("acquisitionTime") @org.springframework.format.annotation.DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime acquisitionTime) { + dataAcquisitionService.updateTime(acquisitionTime); return success(true); } - @GetMapping("/stopCode") + @GetMapping("/updateRunningDuration") @Operation(summary = "停止设备数据采集") - public CommonResult stopCode(@RequestParam("code") String code) { - dataAcquisitionService.stopUpdateTask(code); + public CommonResult updateRunningDuration(@RequestParam("code") String code) { + dataAcquisitionService.updateRunningDuration(code); return success(true); } } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/dataacquisition/DataAcquisitionService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/dataacquisition/DataAcquisitionService.java index 4ccf90d6..463289d2 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/dataacquisition/DataAcquisitionService.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/dataacquisition/DataAcquisitionService.java @@ -60,8 +60,8 @@ public interface DataAcquisitionService { List getDataAcquisitionList(String code); - void updateTime(String code,LocalDateTime acquisitionTime); + void updateTime(LocalDateTime acquisitionTime); - void stopUpdateTask(String code); + void updateRunningDuration(String code); } diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/dataacquisition/DataAcquisitionServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/dataacquisition/DataAcquisitionServiceImpl.java index 9ff0f426..2db54037 100644 --- a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/dataacquisition/DataAcquisitionServiceImpl.java +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/dataacquisition/DataAcquisitionServiceImpl.java @@ -1,9 +1,9 @@ package com.chanko.yunxi.mes.module.heli.service.dataacquisition; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.chanko.yunxi.mes.framework.common.exception.ErrorCode; import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; import com.chanko.yunxi.mes.module.heli.controller.admin.dataacquisition.vo.DataAcquisitionPageReqVO; @@ -18,11 +18,9 @@ import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; - -import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; +import java.util.stream.Collectors; /** * 设备数据采集 Service 实现类 @@ -40,9 +38,6 @@ public class DataAcquisitionServiceImpl implements DataAcquisitionService { // 时间格式正则:匹配 数字H 数字M 数字S private static final Pattern TIME_PATTERN = Pattern.compile("(\\d+)H(\\d+)M(\\d+)S"); - // 用于保存正在运行的线程(防止重复启动) - private final Map runningThreads = new ConcurrentHashMap<>(); - @Override public Long createDataAcquisition(DataAcquisitionSaveReqVO createReqVO) { // 插入 @@ -118,138 +113,87 @@ public class DataAcquisitionServiceImpl implements DataAcquisitionService { } @Override - public void updateTime(String code, LocalDateTime acquisitionTime) { - // 1. 根据传入的 code 查询最新一条数据 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(DataAcquisitionDO::getCode, code); - queryWrapper.orderByDesc(DataAcquisitionDO::getId); - queryWrapper.last("limit 1"); - DataAcquisitionDO data = dataAcquisitionMapper.selectOne(queryWrapper); - if (data == null) { - throw exception(new ErrorCode(400, "设备信息不存在!")); - } - // 正在运行的线程,打印运行中的线程code - runningThreads.forEach((key, value) -> { - log.info("正在运行的线程,code:{}", key); - }); - startUpdateTask(data); - + public void updateTime(LocalDateTime acquisitionTime) { // 查询所有数据按 code 分组,并按 id 排序(id 代表插入顺序) -// List allData = dataAcquisitionMapper.selectList( -// new LambdaQueryWrapper() -// .orderByAsc(DataAcquisitionDO::getId) -// ); -// -// if (allData == null || allData.isEmpty()) { -// return; -// } -// -// // 按 code 分组 -// Map> groupedByCode = allData.stream() -// .collect(java.util.stream.Collectors.groupingBy(DataAcquisitionDO::getCode, java.util.stream.Collectors.toList())); -// -// // 遍历每个分组,更新时间 -// for (Map.Entry> entry : groupedByCode.entrySet()) { -// List groupData = entry.getValue(); -// for (int i = 0; i < groupData.size(); i++) { -// DataAcquisitionDO record = groupData.get(i); -// // 第一条记录使用 updateReqVO 的时间,之后的每条增加5秒 -// LocalDateTime newCreateTime = acquisitionTime.plusSeconds(i * 5L); -// -// // 更新该条记录的创建时间 -// record.setCreateTime(newCreateTime); -// dataAcquisitionMapper.updateById(record); -// } -// } - } + List allData = dataAcquisitionMapper.selectList( + new LambdaQueryWrapper() + .orderByAsc(DataAcquisitionDO::getId) + ); - /** - * 外部调用:传入 code → 自动每5秒执行一次时间+5秒 - * - * @param dataAcquisitionDO 外部传入:01#、02#、03#... - */ - public void startUpdateTask(DataAcquisitionDO dataAcquisitionDO) { - String code = dataAcquisitionDO.getCode(); - // 如果已经在运行,不再重复启动 - if (runningThreads.containsKey(code)) { + if (allData == null || allData.isEmpty()) { return; } - Thread thread = new Thread(() -> { - while (!Thread.currentThread().isInterrupted()) { - try { + // 按 code 分组 + Map> groupedByCode = allData.stream() + .collect(Collectors.groupingBy(DataAcquisitionDO::getCode, Collectors.toList())); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(DataAcquisitionDO::getCode, code); - queryWrapper.orderByDesc(DataAcquisitionDO::getId); - queryWrapper.last("limit 1"); - DataAcquisitionDO data = dataAcquisitionMapper.selectOne(queryWrapper); - if (data == null) { - Thread.sleep(5000); - continue; - } + // 遍历每个分组,更新时间 + for (Map.Entry> entry : groupedByCode.entrySet()) { + List groupData = entry.getValue(); + for (int i = 0; i < groupData.size(); i++) { + DataAcquisitionDO record = groupData.get(i); + // 第一条记录使用 updateReqVO 的时间,之后的每条增加5秒 + LocalDateTime newCreateTime = acquisitionTime.plusSeconds(i * 5L); - // 2. 解析时间 28863H41M32S - String timeStr = data.getRunningDuration(); - Matcher matcher = TIME_PATTERN.matcher(timeStr); - if (!matcher.matches()) { - Thread.sleep(5000); - continue; - } - - int hour = Integer.parseInt(matcher.group(1)); - int min = Integer.parseInt(matcher.group(2)); - int sec = Integer.parseInt(matcher.group(3)); - - // 3. +5 秒 - sec += 5; - - // 秒进位 - if (sec >= 60) { - min++; - sec -= 60; - } - // 分钟进位 - if (min >= 60) { - hour++; - min -= 60; - } - - // 4. 拼接新时间(自动补0) - String newTime = String.format("%dH%02dM%02dS", hour, min, sec); - - // 5. 更新数据库 - data.setRunningDuration(newTime); - data.setUpdateTime(LocalDateTime.now()); - dataAcquisitionMapper.updateById(data); - - } catch (Exception e) { - e.printStackTrace(); - } - - // 每5秒执行一次 - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - break; - } + // 更新该条记录的创建时间 + record.setCreateTime(newCreateTime); + dataAcquisitionMapper.updateById(record); } - }); - - thread.start(); - runningThreads.put(code, thread); - } - - /** - * 停止某个 code 的任务 - */ - @Override - public void stopUpdateTask(String code) { - Thread thread = runningThreads.get(code); - if (thread != null) { - thread.interrupt(); - runningThreads.remove(code); } } + @Override + public void updateRunningDuration(String code) { + // 1. 根据传入的 code 查询最新一条数据 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DataAcquisitionDO::getCode, code); + queryWrapper.orderByAsc(DataAcquisitionDO::getId); + List dataAcquisitionDOS = dataAcquisitionMapper.selectList(queryWrapper); + if (CollectionUtil.isEmpty(dataAcquisitionDOS)) { + return; + } + DataAcquisitionDO dataAcquisitionDO = dataAcquisitionDOS.get(0); + String runningDuration = dataAcquisitionDO.getRunningDuration(); + dataAcquisitionDOS.remove(dataAcquisitionDO); + for (DataAcquisitionDO acquisitionDO : dataAcquisitionDOS) { + runningDuration = getString(runningDuration); + acquisitionDO.setRunningDuration(runningDuration); + dataAcquisitionMapper.updateById(acquisitionDO); + } + } + + public static void main(String[] args) { + String duration = "28863H38M22S"; + String string = getString(duration); + System.out.println( string); + } + private static String getString(String runningDuration) { + // 2. 解析时间 28863H41M32S + Matcher matcher = TIME_PATTERN.matcher(runningDuration); + if (!matcher.matches()) { + return runningDuration; + } + int hour = Integer.parseInt(matcher.group(1)); + int min = Integer.parseInt(matcher.group(2)); + int sec = Integer.parseInt(matcher.group(3)); + + // 3. +5 秒 + sec += 5; + + // 秒进位 + if (sec >= 60) { + min++; + sec -= 60; + } + // 分钟进位 + if (min >= 60) { + hour++; + min -= 60; + } + + // 4. 拼接新时间(自动补0) + return String.format("%dH%02dM%02dS", hour, min, sec); + } + } diff --git a/mes-ui/mes-ui-admin-vue3/src/api/heli/dataacquisition/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/heli/dataacquisition/index.ts index 27144376..ea3705e9 100644 --- a/mes-ui/mes-ui-admin-vue3/src/api/heli/dataacquisition/index.ts +++ b/mes-ui/mes-ui-admin-vue3/src/api/heli/dataacquisition/index.ts @@ -48,10 +48,10 @@ export const getDataAcquisitionList = async (code: string) => { return await request.get({ url: `/heli/data-acquisition/getDataAcquisitionList`, params: { code } }) } // 新增客户新表 -export const updateTime = async (code: string) => { - return await request.get({ url: `/heli/data-acquisition/updateTime`,params: {code } }) +export const updateTime = async (acquisitionTime) => { + return await request.get({ url: `/heli/data-acquisition/updateTime`,params: { acquisitionTime } }) } -export const stopCode = async (code: string) => { - return await request.get({ url: `/heli/data-acquisition/updateTime`,params: {code } }) +export const updateRunningDuration = async (code: string) => { + return await request.get({ url: `/heli/data-acquisition/updateRunningDuration`,params: {code } }) } diff --git a/mes-ui/mes-ui-admin-vue3/src/views/heli/dataacquisition/update.vue b/mes-ui/mes-ui-admin-vue3/src/views/heli/dataacquisition/update.vue index 896ffa1e..cbde3851 100644 --- a/mes-ui/mes-ui-admin-vue3/src/views/heli/dataacquisition/update.vue +++ b/mes-ui/mes-ui-admin-vue3/src/views/heli/dataacquisition/update.vue @@ -12,21 +12,34 @@ :inline="true" label-width="108px" > - - - - - - - - - + + + + + 更新 + + + + + - + - 启动 - 停止 + 更新 @@ -64,17 +77,14 @@ const queryFormRef = ref() // 搜索的表单 /** 搜索按钮操作 */code: [{ required: true, message: '设备编号不能为空', trigger: 'blur' }] const handleQuery = async () => { - if (!queryParams.code) { - return message.error('设备编号不能为空') - } - const data = await DataAcquisitionApi.updateTime(queryParams.code) + const data = await DataAcquisitionApi.updateTime(queryParams.acquisitionTime) message.success("更新成功") } -const stopCode = async () => { +const updateRunningDuration = async () => { if (!queryParams.code) { return message.error('设备编号不能为空') } - const data = await DataAcquisitionApi.stopCode(queryParams.code) + const data = await DataAcquisitionApi.updateRunningDuration(queryParams.code) message.success("停止成功") }