同步丢失部分焊接数据bug修复

This commit is contained in:
guoshengxiong 2025-12-23 16:22:35 +08:00
parent 487687c64d
commit bc6d97bb8d
4 changed files with 242 additions and 109 deletions

View File

@ -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<String, Object> map) {
String start = MapUtils.getString(map, "start");
String end = MapUtils.getString(map, "end");
String token = gsWeldingTask.getToken();
List<GsWeldingDev> devs = gsWeldingDevService.list(null);
Map<String, List<Date>> dev2StartTimeMap = gsWeldingRecordService.list(new LambdaQueryWrapper<GsWeldingRecord>()
.ge(GsWeldingRecord::getDevStartWeldingTime, start)
.le(GsWeldingRecord::getDevStartWeldingTime, end)
).stream().collect(Collectors.groupingBy(GsWeldingRecord::getDevSn, Collectors.mapping(GsWeldingRecord::getDevStartWeldingTime, Collectors.toList())));
List<GsWeldingRecord> addGsWeldingRecords = new ArrayList<>();
List<GsWeldingWaveform> addGsWeldingWaveforms = new ArrayList<>();
List<String> dates = gsWeldingTask.generateDailySameTimePoints(start, end);
for (GsWeldingDev dev : devs) {
List<Date> startTimes = Optional.ofNullable(dev2StartTimeMap.get(dev.getDevSn())).map(m -> m).orElse(new ArrayList<>());
JSONObject jsonObject = SxHttpUtil.getWeldingRecords(start, end, dev.getDevSn(), token);
List<GsWeldingRecord> 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<GsWeldingWaveform> weldingWaveforms = gsWeldingTask.buildGsWeldingWaveform(dates, dev, token);
addGsWeldingWaveforms.addAll(weldingWaveforms);
}
saveToDb(addGsWeldingRecords, addGsWeldingWaveforms);
}
@Transactional(rollbackFor = Exception.class)
public void saveToDb(List<GsWeldingRecord> addGsWeldingRecords, List<GsWeldingWaveform> addGsWeldingWaveforms) {
if (CollUtil.isNotEmpty(addGsWeldingRecords)) {
gsWeldingRecordService.saveBatch(addGsWeldingRecords);
}
Map<String, List<GsWeldingRecord>> devSn2GsWeldingRecordMap = addGsWeldingRecords.stream().collect(Collectors.groupingBy(GsWeldingRecord::getDevSn));
for (GsWeldingWaveform waveform : addGsWeldingWaveforms) {
List<GsWeldingRecord> 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);
}
}
}

View File

@ -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<IPage<GsWeldingDevVo>> queryPageList(@ApiIgnore @RequestParam HashMap<String, Object> 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<IPage<GsWeldingDevVo>> queryPageList(@ApiIgnore @RequestParam HashMap<String, Object> param) {
return Result.success(gsWeldingDevService.queryPageList(param));
}
/**
* 列表查询
* @return
*/
/**
* 列表查询
*
* @return
*/
@OperLog(operModul = "焊接设备管理", operType = "列表查询", operDesc = "列表查询焊接设备信息")
@ApiOperation(value = "列表查询焊接设备信息", notes = "列表查询焊接设备信息", httpMethod="GET")
@GetMapping(value = "/list")
public Result<List<GsWeldingDevVo>> queryList(@ApiIgnore @RequestParam HashMap<String, Object> param) {
return Result.success(gsWeldingDevService.queryList(param));
}
@ApiOperation(value = "列表查询焊接设备信息", notes = "列表查询焊接设备信息", httpMethod = "GET")
@GetMapping(value = "/list")
public Result<List<GsWeldingDevVo>> queryList(@ApiIgnore @RequestParam HashMap<String, Object> 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<GsWeldingDevVo> 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<GsWeldingDev> 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<GsWeldingDev> delete(@ApiIgnore @RequestBody HashMap<String ,Object> map) {
gsWeldingDevService.delete(MapUtils.getString(map, "id"));
@ApiOperation(value = "添加焊接设备信息", notes = "添加焊接设备信息", httpMethod = "POST")
@PostMapping(value = "/add")
public Result<GsWeldingDevVo> 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<GsWeldingDev> 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<GsWeldingDev> delete(@ApiIgnore @RequestBody HashMap<String, Object> 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<GsWeldingDevVo> 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<GsWeldingDevVo> 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<String, Object> map) {
sxCall.fillMissSyncData(map);
return Result.success();
}
}

View File

@ -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 ;
}

View File

@ -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<String> generateDailySameTimePoints(String start, String end) {
public List<String> generateDailySameTimePoints(String start, String end) {
List<String> result = new ArrayList<>();
// 1. 参数校验
@ -178,7 +182,7 @@ public class GsWeldingTask {
}
}
private List<GsWeldingWaveform> buildGsWeldingWaveform(List<String> dates, GsWeldingDev dev, String token) {
public List<GsWeldingWaveform> buildGsWeldingWaveform(List<String> dates, GsWeldingDev dev, String token) {
List<GsWeldingWaveform> 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<GsWeldingRecord> buildGsWeldingRecord(JSONObject jsonObject, GsWeldingDev dev) {
public List<GsWeldingRecord> buildGsWeldingRecord(JSONObject jsonObject, GsWeldingDev dev) {
List<GsWeldingRecord> 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<GsWeldingRecord> addGsWeldingRecords, List<GsWeldingWaveform> addGsWeldingWaveforms) {
if (CollUtil.isNotEmpty(addGsWeldingRecords)) {
gsWeldingRecordService.saveBatch(addGsWeldingRecords);
}
Map<String, List<GsWeldingRecord>> devSn2GsWeldingRecordMap = addGsWeldingRecords.stream().collect(Collectors.groupingBy(GsWeldingRecord::getDevSn));
for (GsWeldingWaveform waveform : addGsWeldingWaveforms) {
List<GsWeldingRecord> 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<SysConfig>().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<SysConfig>()
.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<GsWeldingRecord> addGsWeldingRecords, List<GsWeldingWaveform> addGsWeldingWaveforms) {
if (CollUtil.isNotEmpty(addGsWeldingRecords)) {
gsWeldingRecordService.saveBatch(addGsWeldingRecords);
}
Map<String, List<GsWeldingRecord>> devSn2GsWeldingRecordMap = addGsWeldingRecords.stream().collect(Collectors.groupingBy(GsWeldingRecord::getDevSn));
for (GsWeldingWaveform waveform : addGsWeldingWaveforms) {
List<GsWeldingRecord> 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<SysConfig>().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<SysConfig>()
.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<String, Object> 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);
}
}
}