From bc6d97bb8d9496d8103c290a30256712d84226ac Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Tue, 23 Dec 2025 16:22:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=B8=A2=E5=A4=B1=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=84=8A=E6=8E=A5=E6=95=B0=E6=8D=AEbug=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/zhgd/xmgl/call/SxCall.java | 87 +++++++++ .../gs/controller/GsWeldingDevController.java | 169 ++++++++++-------- .../modules/gs/entity/GsWeldingRecord.java | 7 +- .../com/zhgd/xmgl/task/GsWeldingTask.java | 88 +++++---- 4 files changed, 242 insertions(+), 109 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/call/SxCall.java diff --git a/src/main/java/com/zhgd/xmgl/call/SxCall.java b/src/main/java/com/zhgd/xmgl/call/SxCall.java new file mode 100644 index 000000000..e1b76c17e --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/call/SxCall.java @@ -0,0 +1,87 @@ +package com.zhgd.xmgl.call; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zhgd.redis.lock.RedisRepository; +import com.zhgd.xmgl.modules.gs.entity.GsWeldingDev; +import com.zhgd.xmgl.modules.gs.entity.GsWeldingRecord; +import com.zhgd.xmgl.modules.gs.entity.GsWeldingWaveform; +import com.zhgd.xmgl.modules.gs.service.IGsWeldingDevService; +import com.zhgd.xmgl.modules.gs.service.IGsWeldingRecordService; +import com.zhgd.xmgl.modules.gs.service.IGsWeldingWaveformService; +import com.zhgd.xmgl.task.GsWeldingTask; +import com.zhgd.xmgl.task.SxHttpUtil; +import org.apache.commons.collections.MapUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class SxCall { + @Lazy + @Autowired + private IGsWeldingDevService gsWeldingDevService; + @Lazy + @Autowired + private RedisRepository redisRepository; + @Lazy + @Autowired + private GsWeldingTask gsWeldingTask; + @Lazy + @Autowired + private IGsWeldingRecordService gsWeldingRecordService; + @Lazy + @Autowired + private IGsWeldingWaveformService gsWeldingWaveformService; + + public void fillMissSyncData(Map map) { + String start = MapUtils.getString(map, "start"); + String end = MapUtils.getString(map, "end"); + String token = gsWeldingTask.getToken(); + List devs = gsWeldingDevService.list(null); + Map> dev2StartTimeMap = gsWeldingRecordService.list(new LambdaQueryWrapper() + .ge(GsWeldingRecord::getDevStartWeldingTime, start) + .le(GsWeldingRecord::getDevStartWeldingTime, end) + ).stream().collect(Collectors.groupingBy(GsWeldingRecord::getDevSn, Collectors.mapping(GsWeldingRecord::getDevStartWeldingTime, Collectors.toList()))); + List addGsWeldingRecords = new ArrayList<>(); + List addGsWeldingWaveforms = new ArrayList<>(); + List dates = gsWeldingTask.generateDailySameTimePoints(start, end); + for (GsWeldingDev dev : devs) { + List startTimes = Optional.ofNullable(dev2StartTimeMap.get(dev.getDevSn())).map(m -> m).orElse(new ArrayList<>()); + JSONObject jsonObject = SxHttpUtil.getWeldingRecords(start, end, dev.getDevSn(), token); + List records = gsWeldingTask.buildGsWeldingRecord(jsonObject, dev); + records = records.stream().filter(r -> !startTimes.contains(r.getDevStartWeldingTime())).collect(Collectors.toList()); + if (CollUtil.isEmpty(records)) { + continue; + } + addGsWeldingRecords.addAll(records); + List weldingWaveforms = gsWeldingTask.buildGsWeldingWaveform(dates, dev, token); + addGsWeldingWaveforms.addAll(weldingWaveforms); + } + saveToDb(addGsWeldingRecords, addGsWeldingWaveforms); + } + + @Transactional(rollbackFor = Exception.class) + public void saveToDb(List addGsWeldingRecords, List addGsWeldingWaveforms) { + if (CollUtil.isNotEmpty(addGsWeldingRecords)) { + gsWeldingRecordService.saveBatch(addGsWeldingRecords); + } + Map> devSn2GsWeldingRecordMap = addGsWeldingRecords.stream().collect(Collectors.groupingBy(GsWeldingRecord::getDevSn)); + for (GsWeldingWaveform waveform : addGsWeldingWaveforms) { + List records = devSn2GsWeldingRecordMap.get(waveform.getDevSn()); + records.stream().filter(o -> DateUtil.compare(o.getStartWeldingTime(), waveform.getUploadTime()) <= 0 && DateUtil.compare(o.getEndWeldingTime(), waveform.getUploadTime()) >= 0).findFirst().ifPresent(o -> { + waveform.setWeldingRecordId(o.getId()); + }); + } + addGsWeldingWaveforms = addGsWeldingWaveforms.stream().filter(wf -> Objects.nonNull(wf.getWeldingRecordId())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(addGsWeldingWaveforms)) { + gsWeldingWaveformService.saveBatch(addGsWeldingWaveforms); + } + } +} diff --git a/src/main/java/com/zhgd/xmgl/modules/gs/controller/GsWeldingDevController.java b/src/main/java/com/zhgd/xmgl/modules/gs/controller/GsWeldingDevController.java index 969a54358..bac4eedf9 100644 --- a/src/main/java/com/zhgd/xmgl/modules/gs/controller/GsWeldingDevController.java +++ b/src/main/java/com/zhgd/xmgl/modules/gs/controller/GsWeldingDevController.java @@ -3,6 +3,7 @@ package com.zhgd.xmgl.modules.gs.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.xmgl.call.SxCall; import com.zhgd.xmgl.modules.gs.entity.GsWeldingDev; import com.zhgd.xmgl.modules.gs.entity.dto.GsWeldingDevDto; import com.zhgd.xmgl.modules.gs.entity.vo.GsWeldingDevVo; @@ -23,11 +24,11 @@ import java.util.HashMap; import java.util.List; - /** +/** * @Title: Controller * @Description: 焊接设备 * @author: pds - * @date: 2025-12-01 + * @date: 2025-12-01 * @version: V1.0 */ @RestController @@ -36,85 +37,107 @@ import java.util.List; @Api(tags = "焊接设备相关Api") public class GsWeldingDevController { @Lazy - @Autowired - private IGsWeldingDevService gsWeldingDevService; + @Autowired + private IGsWeldingDevService gsWeldingDevService; + @Lazy + @Autowired + private SxCall sxCall; - /** - * 分页列表查询 - * @return - */ + /** + * 分页列表查询 + * + * @return + */ @OperLog(operModul = "焊接设备管理", operType = "分页查询", operDesc = "分页列表查询焊接设备信息") - @ApiOperation(value = "分页列表查询焊接设备信息", notes = "分页列表查询焊接设备信息", httpMethod="GET") - @ApiImplicitParams({ - @ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"), - @ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"), - }) - @GetMapping(value = "/page") - public Result> queryPageList(@ApiIgnore @RequestParam HashMap param) { - return Result.success(gsWeldingDevService.queryPageList(param)); - } + @ApiOperation(value = "分页列表查询焊接设备信息", notes = "分页列表查询焊接设备信息", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"), + }) + @GetMapping(value = "/page") + public Result> queryPageList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(gsWeldingDevService.queryPageList(param)); + } - /** - * 列表查询 - * @return - */ + /** + * 列表查询 + * + * @return + */ @OperLog(operModul = "焊接设备管理", operType = "列表查询", operDesc = "列表查询焊接设备信息") - @ApiOperation(value = "列表查询焊接设备信息", notes = "列表查询焊接设备信息", httpMethod="GET") - @GetMapping(value = "/list") - public Result> queryList(@ApiIgnore @RequestParam HashMap param) { - return Result.success(gsWeldingDevService.queryList(param)); - } + @ApiOperation(value = "列表查询焊接设备信息", notes = "列表查询焊接设备信息", httpMethod = "GET") + @GetMapping(value = "/list") + public Result> queryList(@ApiIgnore @RequestParam HashMap param) { + return Result.success(gsWeldingDevService.queryList(param)); + } - /** - * 添加 - * @param gsWeldingDevDto - * @return - */ + /** + * 添加 + * + * @param gsWeldingDevDto + * @return + */ @OperLog(operModul = "焊接设备管理", operType = "添加", operDesc = "添加焊接设备信息") - @ApiOperation(value = "添加焊接设备信息", notes = "添加焊接设备信息" , httpMethod="POST") - @PostMapping(value = "/add") - public Result add(@RequestBody @Validate GsWeldingDevDto gsWeldingDevDto) { - gsWeldingDevService.add(gsWeldingDevDto); - return Result.ok(); - } - - /** - * 编辑 - * @param gsWeldingDevDto - * @return - */ - @OperLog(operModul = "焊接设备管理", operType = "编辑", operDesc = "编辑焊接设备信息") - @ApiOperation(value = "编辑焊接设备信息", notes = "编辑焊接设备信息" , httpMethod="POST") - @PostMapping(value = "/edit") - public Result edit(@RequestBody GsWeldingDevDto gsWeldingDevDto) { - gsWeldingDevService.edit(gsWeldingDevDto); - return Result.ok(); - } - - /** - * 通过id删除 - * @return - */ - @OperLog(operModul = "焊接设备管理", operType = "删除", operDesc = "删除焊接设备信息") - @ApiOperation(value = "删除焊接设备信息", notes = "删除焊接设备信息" , httpMethod="POST") - @ApiImplicitParam(name = "id", value = "焊接设备ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}") - @PostMapping(value = "/delete") - public Result delete(@ApiIgnore @RequestBody HashMap map) { - gsWeldingDevService.delete(MapUtils.getString(map, "id")); + @ApiOperation(value = "添加焊接设备信息", notes = "添加焊接设备信息", httpMethod = "POST") + @PostMapping(value = "/add") + public Result add(@RequestBody @Validate GsWeldingDevDto gsWeldingDevDto) { + gsWeldingDevService.add(gsWeldingDevDto); return Result.ok(); - } + } - /** - * 通过id查询 - * @param id - * @return - */ + /** + * 编辑 + * + * @param gsWeldingDevDto + * @return + */ + @OperLog(operModul = "焊接设备管理", operType = "编辑", operDesc = "编辑焊接设备信息") + @ApiOperation(value = "编辑焊接设备信息", notes = "编辑焊接设备信息", httpMethod = "POST") + @PostMapping(value = "/edit") + public Result edit(@RequestBody GsWeldingDevDto gsWeldingDevDto) { + gsWeldingDevService.edit(gsWeldingDevDto); + return Result.ok(); + } + + /** + * 通过id删除 + * + * @return + */ + @OperLog(operModul = "焊接设备管理", operType = "删除", operDesc = "删除焊接设备信息") + @ApiOperation(value = "删除焊接设备信息", notes = "删除焊接设备信息", httpMethod = "POST") + @ApiImplicitParam(name = "id", value = "焊接设备ID", paramType = "body", required = true, dataType = "String", example = "{\"id\":\"1\"}") + @PostMapping(value = "/delete") + public Result delete(@ApiIgnore @RequestBody HashMap map) { + gsWeldingDevService.delete(MapUtils.getString(map, "id")); + return Result.ok(); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ @OperLog(operModul = "焊接设备管理", operType = "通过id查询", operDesc = "通过id查询焊接设备信息") - @ApiOperation(value = "通过id查询焊接设备信息", notes = "通过id查询焊接设备信息" , httpMethod="GET") - @ApiImplicitParam(name = "id", value = "焊接设备ID", paramType = "query", required = true, dataType = "Integer") - @GetMapping(value = "/queryById") - public Result queryById(@RequestParam(name="id",required=true) String id) { - return Result.success(gsWeldingDevService.queryById(id)); - } + @ApiOperation(value = "通过id查询焊接设备信息", notes = "通过id查询焊接设备信息", httpMethod = "GET") + @ApiImplicitParam(name = "id", value = "焊接设备ID", paramType = "query", required = true, dataType = "Integer") + @GetMapping(value = "/queryById") + public Result queryById(@RequestParam(name = "id", required = true) String id) { + return Result.success(gsWeldingDevService.queryById(id)); + } + + @OperLog(operModul = "焊接设备管理", operType = "", operDesc = "补充漏的焊接数据") + @ApiOperation(value = "补充漏的焊接数据", notes = "补充漏的焊接数据", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "start", value = "开始:yyyy-MM-dd HH:mm:ss", paramType = "query", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "end", value = "结束:yyyy-MM-dd HH:mm:ss", paramType = "query", required = true, dataType = "Integer"), + }) + @PostMapping(value = "/fillMissSyncData") + public Result fillMissSyncData(@ApiIgnore @RequestBody HashMap map) { + sxCall.fillMissSyncData(map); + return Result.success(); + } + } diff --git a/src/main/java/com/zhgd/xmgl/modules/gs/entity/GsWeldingRecord.java b/src/main/java/com/zhgd/xmgl/modules/gs/entity/GsWeldingRecord.java index 879dbbddf..f0633104d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/gs/entity/GsWeldingRecord.java +++ b/src/main/java/com/zhgd/xmgl/modules/gs/entity/GsWeldingRecord.java @@ -124,5 +124,10 @@ public class GsWeldingRecord implements Serializable { /**预置电压(V)结束*/ @ApiModelProperty(value="预置电压(V)结束") private java.math.BigDecimal presetVoltageEnd ; - + /**设备开始焊接时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value="设备开始焊接时间") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private java.util.Date devStartWeldingTime ; } diff --git a/src/main/java/com/zhgd/xmgl/task/GsWeldingTask.java b/src/main/java/com/zhgd/xmgl/task/GsWeldingTask.java index 693be8906..15f7db7c1 100644 --- a/src/main/java/com/zhgd/xmgl/task/GsWeldingTask.java +++ b/src/main/java/com/zhgd/xmgl/task/GsWeldingTask.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.google.common.collect.Lists; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.redis.lock.RedisRepository; +import com.zhgd.xmgl.call.SxCall; import com.zhgd.xmgl.modules.basicdata.entity.SysConfig; import com.zhgd.xmgl.modules.basicdata.service.ISysConfigService; import com.zhgd.xmgl.modules.gs.entity.GsWeldingDev; @@ -55,9 +56,12 @@ public class GsWeldingTask { @Lazy @Autowired private IGsWeldingWaveformService gsWeldingWaveformService; -// @Lazy + // @Lazy // @Autowired // private IGsWeldingDevDailyRecordService gsWeldingDevDailyRecordService; + @Lazy + @Autowired + private SxCall sxCall; /** * 定时保存焊接记录 @@ -95,7 +99,7 @@ public class GsWeldingTask { } } - private String getToken() { + public String getToken() { return redisRepository.getOrSet(GS_WELDING_TASK_TOKEN, () -> { return SxHttpUtil.getToken(); }, 60 * 60 * 2L); @@ -117,7 +121,7 @@ public class GsWeldingTask { * 2025-09-05 16:00:00 (第三天同一时间) * 2025-09-05 17:00:01 (结束时间) */ - private List generateDailySameTimePoints(String start, String end) { + public List generateDailySameTimePoints(String start, String end) { List result = new ArrayList<>(); // 1. 参数校验 @@ -178,7 +182,7 @@ public class GsWeldingTask { } } - private List buildGsWeldingWaveform(List dates, GsWeldingDev dev, String token) { + public List buildGsWeldingWaveform(List dates, GsWeldingDev dev, String token) { List gsWeldingWaveformList = Lists.newArrayList(); for (int i = 0; i < dates.size() - 1; i++) { JSONObject jsonObject = SxHttpUtil.getGsWaveforms(dates.get(i), dates.get(i + 1), dev.getDevSn(), token); @@ -208,7 +212,7 @@ public class GsWeldingTask { return gsWeldingWaveformList; } - private List buildGsWeldingRecord(JSONObject jsonObject, GsWeldingDev dev) { + public List buildGsWeldingRecord(JSONObject jsonObject, GsWeldingDev dev) { List gsWeldingRecordList = Lists.newArrayList(); checkErr(jsonObject, "请求查询设备焊接记录历史异常"); JSONArray dataList = jsonObject.getJSONArray("dataList"); @@ -226,6 +230,7 @@ public class GsWeldingTask { record.setEquipmentName(dev.getDevName()); record.setOperatorName(jo1.getString("D09")); record.setStartWeldingTime(DateUtil.parseDateTime(jo1.getString("D04"))); + record.setDevStartWeldingTime(record.getStartWeldingTime()); record.setEndWeldingTime(DateUtil.parseDateTime(jo1.getString("D05"))); record.setWeldingWireConsumption(jo1.getBigDecimal("D11")); record.setDuration(jo1.getBigDecimal("D12")); @@ -245,36 +250,6 @@ public class GsWeldingTask { } } - @Transactional(rollbackFor = Exception.class) - public void saveToDb(String queryTimeKey, String end, List addGsWeldingRecords, List addGsWeldingWaveforms) { - if (CollUtil.isNotEmpty(addGsWeldingRecords)) { - gsWeldingRecordService.saveBatch(addGsWeldingRecords); - } - Map> devSn2GsWeldingRecordMap = addGsWeldingRecords.stream().collect(Collectors.groupingBy(GsWeldingRecord::getDevSn)); - for (GsWeldingWaveform waveform : addGsWeldingWaveforms) { - List records = devSn2GsWeldingRecordMap.get(waveform.getDevSn()); - records.stream().filter(o -> DateUtil.compare(o.getStartWeldingTime(), waveform.getUploadTime()) <= 0 && DateUtil.compare(o.getEndWeldingTime(), waveform.getUploadTime()) >= 0).findFirst().ifPresent(o -> { - waveform.setWeldingRecordId(o.getId()); - }); - } - if (CollUtil.isNotEmpty(addGsWeldingWaveforms)) { - gsWeldingWaveformService.saveBatch(addGsWeldingWaveforms); - } - SysConfig customKey = sysConfigService.getOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, queryTimeKey)); - if (customKey == null) { - SysConfig entity = new SysConfig(); - entity.setConfigKey(SAVE_GS_WELDING_RECORD_START_TIME); - entity.setConfigValue(end); - entity.setDescription("获取松下数据"); - sysConfigService.save(entity); - } else { - sysConfigService.update(null, new LambdaUpdateWrapper() - .set(SysConfig::getConfigValue, end) - .eq(SysConfig::getConfigKey, queryTimeKey) - ); - } - } - // @GetMapping("getWeldingDevDailyRecordsByRange") // public void getWeldingDevDailyRecordsByRange(String start, String end) { @@ -337,6 +312,35 @@ public class GsWeldingTask { // } // } + @Transactional(rollbackFor = Exception.class) + public void saveToDb(String queryTimeKey, String end, List addGsWeldingRecords, List addGsWeldingWaveforms) { + if (CollUtil.isNotEmpty(addGsWeldingRecords)) { + gsWeldingRecordService.saveBatch(addGsWeldingRecords); + } + Map> devSn2GsWeldingRecordMap = addGsWeldingRecords.stream().collect(Collectors.groupingBy(GsWeldingRecord::getDevSn)); + for (GsWeldingWaveform waveform : addGsWeldingWaveforms) { + List records = devSn2GsWeldingRecordMap.get(waveform.getDevSn()); + records.stream().filter(o -> DateUtil.compare(o.getStartWeldingTime(), waveform.getUploadTime()) <= 0 && DateUtil.compare(o.getEndWeldingTime(), waveform.getUploadTime()) >= 0).findFirst().ifPresent(o -> { + waveform.setWeldingRecordId(o.getId()); + }); + } + if (CollUtil.isNotEmpty(addGsWeldingWaveforms)) { + gsWeldingWaveformService.saveBatch(addGsWeldingWaveforms); + } + SysConfig customKey = sysConfigService.getOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, queryTimeKey)); + if (customKey == null) { + SysConfig entity = new SysConfig(); + entity.setConfigKey(SAVE_GS_WELDING_RECORD_START_TIME); + entity.setConfigValue(end); + entity.setDescription("获取松下数据"); + sysConfigService.save(entity); + } else { + sysConfigService.update(null, new LambdaUpdateWrapper() + .set(SysConfig::getConfigValue, end) + .eq(SysConfig::getConfigKey, queryTimeKey) + ); + } + } /** * 请求设备实时数据接口 @@ -402,4 +406,18 @@ public class GsWeldingTask { } } + @SchedulerLock(name = "fillEmptyData", lockAtMostFor = 1000 * 60 * 2, lockAtLeastFor = 1000 * 60 * 1) + @Scheduled(cron = "0 0 3 * * ?") + @RequestMapping("fillEmptyData") + public void fillEmptyData() { + try { + HashMap hashMap = new HashMap<>(); + hashMap.put("start", DateUtil.formatDateTime(DateUtil.offsetDay(new Date(), -2))); + hashMap.put("end", DateUtil.formatDateTime(DateUtil.beginOfDay(new Date()))); + sxCall.fillMissSyncData(hashMap); + } catch (Exception e) { + log.error("fillEmptyData:", e); + } + } + }