package com.sandu.ximon.admin.service;
|
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.ListUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.HexUtil;
|
import cn.hutool.core.util.StrUtil;
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.github.pagehelper.Page;
|
import com.github.pagehelper.PageHelper;
|
import com.sandu.common.execption.BusinessException;
|
import com.sandu.common.object.BaseConditionVO;
|
import com.sandu.common.service.impl.BaseServiceImpl;
|
import com.sandu.common.util.SpringContextHolder;
|
import com.sandu.ximon.admin.dto.PlcTaskDto;
|
import com.sandu.ximon.admin.dto.PlcTaskDto;
|
import com.sandu.ximon.admin.dto.SingleLightOrderDto;
|
import com.sandu.ximon.admin.manager.iot.frame.FrameBuilder;
|
import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame;
|
import com.sandu.ximon.admin.manager.iot.frame.inner.request.A7PlcTimerReqInnerFrame;
|
import com.sandu.ximon.admin.manager.iot.frame.inner.response.A7PlcTimerRespInnerFrame;
|
import com.sandu.ximon.admin.manager.iot.rrpc.dto.WrapResponseCommonFrame;
|
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A7OrderEnum;
|
import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
|
import com.sandu.ximon.admin.manager.iot.rrpc.util.SupplementUtils;
|
import com.sandu.ximon.admin.param.PlcTaskIssueParam;
|
import com.sandu.ximon.admin.param.PlcTaskParam;
|
import com.sandu.ximon.admin.security.SecurityUtils;
|
import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
|
import com.sandu.ximon.admin.utils.TaskOrderUtil;
|
import com.sandu.ximon.admin.vo.*;
|
import com.sandu.ximon.dao.domain.*;
|
import com.sandu.ximon.dao.enums.DeviceRespStatusEnums;
|
import com.sandu.ximon.dao.enums.OrderByEnums;
|
import com.sandu.ximon.dao.mapper.PlcTaskMapper;
|
import lombok.AllArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.time.LocalDateTime;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* plc任务表(PlcTask)表服务接口
|
*
|
* @author van
|
* @since 2022-12-19 16:53:41
|
*/
|
@Service
|
@Slf4j
|
@AllArgsConstructor
|
public class PlcTaskService extends BaseServiceImpl<PlcTaskMapper,PlcTask> {
|
|
private final PoleService poleService;
|
|
private final ClientService clientService;
|
|
private final PlcTaskPoleRelationService plcTaskPoleRelationService;
|
|
private final PlcTaskMapper plcTaskMapper;
|
|
/**
|
* 根据任务信息转成帧负荷
|
*
|
* @return 路灯定时器列表
|
*/
|
private String buildControlFramePayload(String openOrder, String closeOrder, String controlOrder, Integer week) {
|
|
// 添加开灯定时器
|
SingleLightOrderDto openLightOrder = TaskOrderUtil.parseLightOrder(openOrder);
|
SingleLightOrderDto closeLightOrder = TaskOrderUtil.parseLightOrder(closeOrder);
|
String[] controlOrderArray = StrUtil.split(controlOrder, PlcTaskParam.REQUEST_ORDER_LENGTH);
|
Integer[] weekArrays = TaskOrderUtil.parseLightCronWeek2List(week).toArray(new Integer[0]);
|
if (openLightOrder == null || closeLightOrder == null) {
|
throw new BusinessException("解析PLC命令失败");
|
}
|
if (ArrayUtil.isEmpty(weekArrays)) {
|
throw new BusinessException("请设置星期");
|
}
|
|
StringBuilder sb = new StringBuilder();
|
String weekHex = SupplementUtils.suppleZero(HexUtil.toHex(week), 2);
|
|
// 拼接开灯命令
|
sb.append(weekHex);
|
sb.append(SupplementUtils.suppleZero(HexUtil.toHex(openLightOrder.getHour()), 2));
|
sb.append(SupplementUtils.suppleZero(HexUtil.toHex(openLightOrder.getMinute()), 2));
|
sb.append(SupplementUtils.suppleZero(HexUtil.toHex(openLightOrder.getBrightness()), 2));
|
|
// 拼接关灯命令
|
sb.append(weekHex);
|
sb.append(SupplementUtils.suppleZero(HexUtil.toHex(closeLightOrder.getHour()), 2));
|
sb.append(SupplementUtils.suppleZero(HexUtil.toHex(closeLightOrder.getMinute()), 2));
|
sb.append(SupplementUtils.suppleZero(HexUtil.toHex(closeLightOrder.getBrightness()), 2));
|
|
// 拼接亮度控灯命令
|
for (String controlOrderStr : controlOrderArray) {
|
SingleLightOrderDto controlLightOrder = TaskOrderUtil.parseLightOrder(controlOrderStr);
|
if (controlLightOrder != null) {
|
sb.append(weekHex);
|
sb.append(SupplementUtils.suppleZero(HexUtil.toHex(controlLightOrder.getHour()), 2));
|
sb.append(SupplementUtils.suppleZero(HexUtil.toHex(controlLightOrder.getMinute()), 2));
|
sb.append(SupplementUtils.suppleZero(HexUtil.toHex(controlLightOrder.getBrightness()), 2));
|
}
|
}
|
|
return sb.toString();
|
}
|
|
/**
|
* 用于任务新增,下发
|
*
|
* @param plcTask
|
* @param poleIdList
|
* @param framePayload
|
* @param plcAddress
|
* @return
|
*/
|
private List<PlcTaskPoleRelation> sendControllerFrame(PlcTask plcTask, List<Long> poleIdList, String framePayload, String plcAddress) {
|
List<PlcTaskPoleRelation> plcTaskPoleRelationList = new ArrayList<>();
|
//成功
|
List<PlcTaskPoleRelation> success = new ArrayList<>();
|
//失败
|
List<PlcTaskPoleRelation> fail = new ArrayList<>();
|
|
Map map = new HashMap();
|
|
List<Pole> poles = poleService.listByIds(poleIdList);
|
if (CollectionUtil.isEmpty(poles)) {
|
return null;
|
}
|
|
for (Pole pole : poles) {
|
if (pole.getDeviceCode() == null || pole.getDeviceCode().equals("")) {
|
removeById(plcTask.getTaskId());
|
throw new BusinessException("编辑的灯杆或原有任务的灯杆不存在mac,不能下发任务 请检查灯杆是否存在PLC");
|
}
|
PlcTaskPoleRelation plcTaskPoleRelation = new PlcTaskPoleRelation();
|
plcTaskPoleRelation.setPoleId(pole.getId());
|
plcTaskPoleRelation.setTaskId(plcTask.getTaskId());
|
|
// rrpc 发生定时命令
|
plcTaskPoleRelation.setDeviceCode(pole.getDeviceCode());
|
plcTaskPoleRelation.setPlcAddress(plcAddress);
|
// rrpc 发生定时命令
|
try {
|
A7PlcTimerRespInnerFrame a7PlcTimerRespInnerFrame = sendTimeRRpc(framePayload, pole.getDeviceCode(), plcAddress);
|
if (a7PlcTimerRespInnerFrame == null) {
|
plcTaskPoleRelation.setIssueStatus(DeviceRespStatusEnums.OTHER_ERROR.getCode());
|
} else {
|
plcTaskPoleRelation.setIssueStatus(HexUtil.hexToInt(a7PlcTimerRespInnerFrame.getResponseStatus()));
|
}
|
} catch (BusinessException e) {
|
e.printStackTrace();
|
plcTaskPoleRelation.setIssueStatus(DeviceRespStatusEnums.OTHER_ERROR.getCode());
|
}
|
plcTaskPoleRelationList.add(plcTaskPoleRelation);
|
}
|
|
// }
|
return plcTaskPoleRelationList;
|
}
|
|
/**
|
* 发送灯控请求
|
*
|
* @param framePayload 灯控参数
|
* @param deviceCode 设备吗
|
* @return 返回帧
|
*/
|
public A7PlcTimerRespInnerFrame sendTimeRRpc(String framePayload, String deviceCode, String plcAddress) {
|
IRequestFrame requestFrame = FrameBuilder.builderA7().innerFrame(new A7PlcTimerReqInnerFrame(framePayload, plcAddress)).orderType(A7OrderEnum.REQUEST_PLC_DATA.getCode()).build();
|
System.out.println(requestFrame + " --------requestFrame");
|
|
WrapResponseCommonFrame<A7PlcTimerRespInnerFrame> responseCommonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(deviceCode, requestFrame, A7PlcTimerRespInnerFrame.class);
|
System.out.println(responseCommonFrame + " -----------responseCommonFrame");
|
StoreOperationRecordsUtils.storeInnerFrameData(deviceCode, "PLC帧-定时", requestFrame, responseCommonFrame);
|
return Optional.ofNullable(responseCommonFrame).map(WrapResponseCommonFrame::getResponseInnerFrame).orElse(null);
|
}
|
|
/**
|
* 用于任务编辑
|
*
|
* @param poleIdList
|
* @param framePayload
|
* @param plcAddress
|
* @return
|
*/
|
private Map<String, List<PlcTaskPoleRelation>> sendControllerFrame(List<Long> poleIdList, String framePayload, String plcAddress) {
|
|
System.out.println("framePayload:" + framePayload);
|
List<PlcTaskPoleRelation> plcTaskPoleRelationList = new ArrayList<>();
|
//成功
|
List<PlcTaskPoleRelation> success = new ArrayList<>();
|
//失败
|
List<PlcTaskPoleRelation> fail = new ArrayList<>();
|
|
Map<String, List<PlcTaskPoleRelation>> map = new HashMap();
|
|
List<Pole> poles = poleService.listByIds(poleIdList);
|
if (CollectionUtil.isEmpty(poles)) {
|
return null;
|
}
|
|
for (Pole pole : poles) {
|
if (pole.getDeviceCode() == null || pole.getDeviceCode().equals("")) {
|
throw new BusinessException("编辑的灯杆或原有任务的灯杆不存在mac,不能下发任务 请检查灯杆是否存在PLC");
|
}
|
PlcTaskPoleRelation plcTaskPoleRelation = new PlcTaskPoleRelation();
|
plcTaskPoleRelation.setPoleId(pole.getId());
|
//关系表插入灯头地址
|
plcTaskPoleRelation.setPlcAddress(plcAddress);
|
|
|
// rrpc 发生定时命令
|
plcTaskPoleRelation.setPlcAddress(plcAddress);
|
plcTaskPoleRelation.setDeviceCode(pole.getDeviceCode());
|
// rrpc 发生定时命令
|
try {
|
A7PlcTimerRespInnerFrame a7PlcTimerRespInnerFrame = sendTimeRRpc(framePayload, pole.getDeviceCode(), plcAddress);
|
if (a7PlcTimerRespInnerFrame == null) {
|
plcTaskPoleRelation.setIssueStatus(DeviceRespStatusEnums.OTHER_ERROR.getCode());
|
fail.add(plcTaskPoleRelation);
|
} else {
|
plcTaskPoleRelation.setIssueStatus(HexUtil.hexToInt(a7PlcTimerRespInnerFrame.getResponseStatus()));
|
success.add(plcTaskPoleRelation);
|
}
|
} catch (BusinessException e) {
|
plcTaskPoleRelation.setIssueStatus(DeviceRespStatusEnums.OTHER_ERROR.getCode());
|
fail.add(plcTaskPoleRelation);
|
}
|
plcTaskPoleRelationList.add(plcTaskPoleRelation);
|
}
|
|
map.put("success", success);
|
map.put("fail", fail);
|
map.put("all", plcTaskPoleRelationList);
|
log.error("发送控制器帧结果:{}", map);
|
return map;
|
}
|
|
|
|
/**
|
* 新增任务
|
*
|
* @param param
|
* @return
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public String AddPlcTask(PlcTaskParam param) {
|
if (StrUtil.length(param.getControlOrder()) % PlcTaskParam.REQUEST_ORDER_LENGTH != 0) {
|
throw new BusinessException("灯控命令格式不正确");
|
}
|
|
if (!"0001".equals(param.getPlcAddress())
|
&& !"0002".equals(param.getPlcAddress())
|
&& !"0003".equals(param.getPlcAddress())) {
|
throw new BusinessException("灯头地址格式不正确");
|
}
|
|
|
int week = 0;
|
for (Integer w : param.getWeekList()) {
|
week |= w;
|
}
|
|
PlcTask newPlcTask = new PlcTask();
|
newPlcTask.setTaskName(param.getTaskName());
|
|
newPlcTask.setClientId(clientService.getClientId(SecurityUtils.getUserId()));
|
newPlcTask.setUserId(SecurityUtils.getUserId());
|
|
newPlcTask.setWeek(week);
|
newPlcTask.setCreateUser(SecurityUtils.getUsername());
|
newPlcTask.setControlOrder(param.getControlOrder());
|
newPlcTask.setOpenOrder(param.getOpenOrder());
|
newPlcTask.setCloseOrder(param.getCloseOrder());
|
newPlcTask.setPlcAdress(param.getPlcAddress());
|
newPlcTask.setUpdateTime(LocalDateTime.now());
|
newPlcTask.setFramePayload(buildControlFramePayload(param.getOpenOrder(), param.getCloseOrder(), param.getControlOrder(), week));
|
|
if (!save(newPlcTask)) {
|
throw new BusinessException("保存PLC任务失败");
|
}
|
|
List<String> poleCodeList = new ArrayList<>();
|
//传入的灯杆id集合
|
List<Long> poleIdList = new ArrayList<>();
|
//去重
|
for (Long item : param.getPoleIdList()) {
|
if (!poleIdList.contains(item)) {
|
poleIdList.add(item);
|
}
|
}
|
|
if (CollectionUtil.isNotEmpty(poleIdList)) {
|
List<Pole> poleList = SpringContextHolder.getBean(PoleService.class).listByIds(poleIdList);
|
if (CollectionUtil.isNotEmpty(poleList)) {
|
poleCodeList = poleList.stream().map(Pole::getDeviceCode).collect(Collectors.toList());
|
}
|
}
|
|
String content = "{任务ID:" + newPlcTask.getTaskId() + ", 任务名:" + newPlcTask.getTaskName() + "},{内帧指令" + newPlcTask.getFramePayload() + ", 灯杆ID:" + poleIdList.toString() + ", 控制的灯头地址:" + param.getPlcAddress() + " }";
|
StoreOperationRecordsUtils.storeOperationData(poleCodeList, null, "新增PLC任务", content);
|
|
//记录这些灯杆原先的任务
|
List<PlcTaskPoleRelation> oldPlcTaskStatusAndPoles = plcTaskPoleRelationService.list(Wrappers.lambdaQuery(PlcTaskPoleRelation.class)
|
.in(PlcTaskPoleRelation::getPoleId, poleIdList).eq(PlcTaskPoleRelation::getPlcAddress, param.getPlcAddress()));
|
|
|
List<PlcTaskPoleRelation> newPoleMap = new ArrayList<>();
|
if (!poleIdList.isEmpty()) {
|
//新灯杆下发新任务
|
newPoleMap = sendControllerFrame(newPlcTask, poleIdList, newPlcTask.getFramePayload(), param.getPlcAddress());
|
|
}
|
|
newPoleMap.forEach(
|
commend -> {
|
//开关灯时间
|
commend.setSysScheduled(JSON.toJSONString(newPlcTask));
|
System.out.println(commend.getIssueStatus() + "状态");
|
if (commend.getIssueStatus() == 0) {
|
//下发成功 更新系统定时和硬件定时
|
commend.setDeviceScheduled(JSON.toJSONString(newPlcTask));
|
} else {
|
//下发失败 更新系统定时 保留硬件定时 硬件定时
|
// commend.setSysScheduled(s);
|
oldPlcTaskStatusAndPoles.forEach(task -> {
|
if (task.getPlcAddress().equals(commend.getPlcAddress()) && task.getDeviceCode().equals(commend.getDeviceCode())) {
|
//同一个灯头
|
commend.setDeviceScheduled(task.getDeviceScheduled());
|
}
|
});
|
|
}
|
}
|
);
|
|
/**
|
* 下发路灯任务日志记录开始
|
*/
|
|
String content1 = "{任务ID:" + newPlcTask.getTaskId() + ", 任务名:" + newPlcTask.getTaskName() + "}," + " 灯杆ID:" + poleIdList.toString() + " }";
|
StoreOperationRecordsUtils.storeOperationData(poleCodeList, null, "下发PLC任务", content1);
|
/**
|
* 下发路灯任务日志记录结束
|
*/
|
|
|
//删除旧的关系
|
plcTaskPoleRelationService.remove(Wrappers.lambdaQuery(PlcTaskPoleRelation.class)
|
.in(PlcTaskPoleRelation::getPoleId, poleIdList).eq(PlcTaskPoleRelation::getPlcAddress, newPlcTask.getPlcAdress()));
|
|
|
boolean b = true;
|
//保存任务关系
|
if (!newPoleMap.isEmpty()) {
|
b = plcTaskPoleRelationService.saveBatch(newPoleMap);
|
}
|
|
if (!b) {
|
//所有灯杆都下发失败 新增的任务不保留
|
removeById(newPlcTask);
|
throw new BusinessException("指令下发失败,请检查灯杆状态后重新新增任务");
|
} else {
|
return "任务新增成功";
|
}
|
}
|
|
|
/**
|
* 编辑路灯任务
|
*
|
* @param taskId
|
* @param param
|
* @return
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public String newUpdatePlcTask(Long taskId, PlcTaskParam param) {
|
if (StrUtil.length(param.getControlOrder()) % PlcTaskParam.REQUEST_ORDER_LENGTH != 0) {
|
throw new BusinessException("灯控命令格式不正确");
|
}
|
if (!"0001".equals(param.getPlcAddress())
|
&& !"0002".equals(param.getPlcAddress())
|
&& !"0003".equals(param.getPlcAddress())) {
|
throw new BusinessException("灯头地址格式不正确");
|
}
|
|
PlcTask newPlcTask = getById(taskId);
|
|
if (newPlcTask == null) {
|
throw new BusinessException("找不到PLC任务");
|
}
|
|
|
int week = 0;
|
for (Integer w : param.getWeekList()) {
|
week |= w;
|
}
|
|
newPlcTask.setTaskName(param.getTaskName());
|
|
newPlcTask.setClientId(clientService.getClientId(SecurityUtils.getUserId()));
|
newPlcTask.setUserId(SecurityUtils.getUserId());
|
|
newPlcTask.setWeek(week);
|
newPlcTask.setCreateUser(SecurityUtils.getUsername());
|
newPlcTask.setControlOrder(param.getControlOrder());
|
newPlcTask.setOpenOrder(param.getOpenOrder());
|
newPlcTask.setCloseOrder(param.getCloseOrder());
|
newPlcTask.setPlcAdress(param.getPlcAddress());
|
newPlcTask.setUpdateTime(LocalDateTime.now());
|
newPlcTask.setFramePayload(buildControlFramePayload(param.getOpenOrder(), param.getCloseOrder(), param.getControlOrder(), week));
|
|
updateById(newPlcTask);
|
|
//编辑后灯杆ID集合
|
List<Long> poleIdList = new ArrayList<>();
|
//去重
|
for (Long item : param.getPoleIdList()) {
|
if (!poleIdList.contains(item)) {
|
poleIdList.add(item);
|
}
|
}
|
//记录任务编辑器前灯杆ID集合
|
// List<PlcTaskStatusAndPole> oldPlcTaskStatusAndPoles = plcTaskPoleRelationService.listPoleAndStatusIdByTaskId(taskId);
|
List<PlcTaskPoleRelation> oldPlcTaskStatusAndPoles = plcTaskPoleRelationService.
|
list(Wrappers.lambdaQuery(PlcTaskPoleRelation.class).eq(PlcTaskPoleRelation::getTaskId, taskId));
|
List<Long> oldList = oldPlcTaskStatusAndPoles.stream().
|
map(PlcTaskPoleRelation::getPoleId).collect(Collectors.toList());
|
|
//判断poleIdList中是否有旧的灯杆ID (直接下发)
|
List<Long> newPoleIdList = poleIdList.stream().filter(poleId -> !oldList.contains(poleId)).collect(Collectors.toList());
|
//判断poleIdList中是否有新的灯杆ID (覆盖操作)
|
List<Long> oldPoleIdList = poleIdList.stream().filter(poleId -> oldList.contains(poleId)).collect(Collectors.toList());
|
|
|
//oldList中有的灯杆ID,但是poleIdList中没有 (关灯操作)
|
List<Long> closeLight = oldList.stream().filter(poleId -> !poleIdList.contains(poleId)).collect(Collectors.toList());
|
|
|
//取出覆盖操作的关系信息
|
//记录这些灯杆原先的任务
|
List<PlcTaskPoleRelation> oldRelation = new ArrayList<>();
|
|
if (CollectionUtil.isNotEmpty(oldPoleIdList)) {
|
List<Long> oldRelationList = new ArrayList<>();
|
oldRelationList.addAll(oldPoleIdList);
|
oldRelationList.addAll(closeLight);
|
oldRelation = plcTaskPoleRelationService.list(Wrappers.lambdaQuery(PlcTaskPoleRelation.class).in(PlcTaskPoleRelation::getPoleId, oldRelationList)
|
.ne(PlcTaskPoleRelation::getTaskId, taskId).eq(PlcTaskPoleRelation::getPlcAddress, param.getPlcAddress()));
|
}
|
|
//取出任务中原有的任务信息
|
List<PlcTaskPoleRelation> relations = plcTaskPoleRelationService.list(Wrappers.lambdaQuery(PlcTaskPoleRelation.class)
|
.eq(PlcTaskPoleRelation::getTaskId, taskId).eq(PlcTaskPoleRelation::getPlcAddress, param.getPlcAddress()));
|
|
relations.addAll(oldRelation);
|
|
List<PlcTaskPoleRelation> newPoleAll = new ArrayList<>();
|
List<PlcTaskPoleRelation> newPoleSuccess = new ArrayList<>();
|
List<PlcTaskPoleRelation> newPoleFail = new ArrayList<>();
|
if (CollectionUtil.isNotEmpty(newPoleIdList)) {
|
//新灯杆下发新任务
|
Map<String, List<PlcTaskPoleRelation>> newPoleMap = sendControllerFrame(newPoleIdList, newPlcTask.getFramePayload(), param.getPlcAddress());
|
|
if (newPoleMap != null) {
|
//newPoleAll集合后面用于存储关系表
|
newPoleAll = newPoleMap.getOrDefault("all", new ArrayList<>());
|
newPoleSuccess = newPoleMap.getOrDefault("success", new ArrayList<>());
|
newPoleFail = newPoleMap.getOrDefault("fail", new ArrayList<>());
|
}
|
}
|
|
List<PlcTaskPoleRelation> oldPoleFail = new ArrayList<>();
|
List<PlcTaskPoleRelation> oldPoleSuccess = new ArrayList<>();
|
if (CollectionUtil.isNotEmpty(oldPoleIdList)) {
|
//覆盖操作灯杆
|
Map<String, List<PlcTaskPoleRelation>> oldPoleMap = sendControllerFrame(oldPoleIdList, newPlcTask.getFramePayload(), param.getPlcAddress());
|
if (oldPoleMap != null) {
|
oldPoleFail = oldPoleMap.getOrDefault("fail", new ArrayList<>());
|
oldPoleSuccess = oldPoleMap.getOrDefault("success", new ArrayList<>());
|
}
|
}
|
|
|
List<PlcTaskPoleRelation> closePoleFail = new ArrayList<>();
|
List<PlcTaskPoleRelation> closePoleSuccess = new ArrayList<>();
|
System.out.println(closeLight + "closeLight");
|
if (CollectionUtil.isNotEmpty(closeLight) && closeLight != null && closeLight.get(0) != null) {
|
//清除帧指令
|
String framePayloadClose = "";
|
//关灯操作灯杆
|
Map<String, List<PlcTaskPoleRelation>> closePoleMap = sendControllerFrame(closeLight, framePayloadClose, param.getPlcAddress());
|
if (closePoleMap != null) {
|
closePoleFail = closePoleMap.getOrDefault("fail", new ArrayList<>());
|
closePoleSuccess = closePoleMap.getOrDefault("success", new ArrayList<>());
|
}
|
}
|
|
|
/**
|
* 编辑路灯任务日志记录开始
|
*/
|
List<String> poleCodeList = new ArrayList<>();
|
if (CollectionUtil.isNotEmpty(poleIdList)) {
|
List<Pole> poleList = SpringContextHolder.getBean(PoleService.class).listByIds(poleIdList);
|
if (CollectionUtil.isNotEmpty(poleList)) {
|
poleCodeList = poleList.stream().map(Pole::getDeviceCode).collect(Collectors.toList());
|
}
|
}
|
String content = "{任务ID:" + newPlcTask.getTaskId() + ", 任务名:" + newPlcTask.getTaskName() + "},{内帧指令" + newPlcTask.getFramePayload() + ", 灯杆ID:" + poleIdList.toString() + ", 控制的灯头地址:" + param.getPlcAddress() + " }";
|
StoreOperationRecordsUtils.storeOperationData(poleCodeList, null, "编辑PLC任务", content);
|
/**
|
* 编辑路灯任务日志记录结束
|
*/
|
|
|
List<PlcTaskPoleRelation> all = new ArrayList<>();
|
all.addAll(newPoleSuccess);
|
all.addAll(newPoleFail);
|
all.addAll(oldPoleSuccess);
|
all.addAll(oldPoleFail);
|
|
|
if (closePoleFail.size() != 0) {
|
List<PlcTaskPoleRelation> colesFail = new ArrayList<>();
|
//原来任务中本身就下发失败的任务 即硬件定时为空 编辑后进行关灯操作 可直接剔除任务关系
|
closePoleFail.forEach(
|
close -> {
|
relations.forEach(
|
task -> {
|
System.out.println(task.getPlcAddress().equals(close.getPlcAddress()) + " addressResult");
|
System.out.println(close.getPlcAddress() + " close.getPlcAddress()");
|
if (task.getPlcAddress().equals(close.getPlcAddress()) && task.getDeviceCode().equals(close.getDeviceCode())
|
&& task.getDeviceScheduled() != null && !task.getDeviceScheduled().isEmpty()) {
|
colesFail.add(close);
|
}
|
}
|
);
|
all.addAll(colesFail);
|
}
|
);
|
|
}
|
|
|
if (!all.isEmpty()) {
|
List<PlcTaskPoleRelation> finalOldRelation = relations;
|
all.forEach(
|
commend -> {
|
// 更新系统定时
|
commend.setSysScheduled(JSON.toJSONString(newPlcTask));
|
commend.setTaskId(taskId);
|
// 先设置硬件定时为上次的硬件定时 不论成功失败
|
finalOldRelation.forEach(task -> {
|
if (task.getPlcAddress().equals(commend.getPlcAddress()) && task.getDeviceCode().equals(commend.getDeviceCode())) {
|
//同一个灯头
|
commend.setDeviceScheduled(task.getDeviceScheduled());
|
if (commend.getIssueStatus() == 0) {
|
//下发成功 更新系统定时和硬件定时
|
commend.setDeviceScheduled(JSON.toJSONString(newPlcTask));
|
}
|
|
}
|
});
|
|
}
|
);
|
}
|
boolean b = true;
|
|
//编辑前后所有的灯杆ID集合
|
poleIdList.addAll(oldList);
|
//去重
|
List<Long> collect = poleIdList.stream().distinct().collect(Collectors.toList());
|
if (!collect.isEmpty()) {
|
plcTaskPoleRelationService.remove(Wrappers.lambdaQuery(PlcTaskPoleRelation.class)
|
.in(PlcTaskPoleRelation::getPoleId, collect).eq(PlcTaskPoleRelation::getPlcAddress, newPlcTask.getPlcAdress()));
|
|
}
|
|
|
if (!all.isEmpty()) {
|
b = plcTaskPoleRelationService.saveBatch(all);
|
}
|
|
|
/**
|
* 下发路灯任务日志记录开始
|
*/
|
String content1 = "{任务ID:" + newPlcTask.getTaskId() + ", 任务名:" + newPlcTask.getTaskName() + "}," + " 灯杆ID:" + poleCodeList.toString() + " }";
|
StoreOperationRecordsUtils.storeOperationData(poleCodeList, null, "下发路灯任务", content1);
|
/**
|
* 下发路灯任务日志记录结束
|
*/
|
|
if (b) {
|
return "编辑成功";
|
} else {
|
return "编辑失败";
|
}
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
public String delPlcTask(Long taskId) {
|
PlcTask byId = getById(taskId);
|
if (byId == null) {
|
throw new BusinessException("找不到任务信息");
|
}
|
|
//取出任务关系
|
List<PlcTaskPoleRelation> relations = plcTaskPoleRelationService.list(Wrappers.lambdaQuery(PlcTaskPoleRelation.class).eq(PlcTaskPoleRelation::getTaskId, taskId));
|
|
//取出灯杆id
|
List<Long> poleIds = relations.stream().map(PlcTaskPoleRelation::getPoleId).distinct().collect(Collectors.toList());
|
|
if (poleIds != null && poleIds.size() > 0) {
|
//存在任务关系 下发清除任务指令
|
Map<String, List<PlcTaskPoleRelation>> ffff = sendControllerFrame(poleIds, "", byId.getPlcAdress());
|
|
if (ffff == null) {
|
throw new BusinessException("删除失败");
|
}
|
|
/**
|
* 删除控灯任务日志记录开始
|
*/
|
String content = "{控灯任务id:" + taskId + " }";
|
StoreOperationRecordsUtils.storeOperationData(null, null, "删除控灯任务", content);
|
/**
|
* 删除控灯任务日志记录结束
|
*/
|
if (ffff.get("fail").size() == 0) {
|
//全部清除成功 删除全部任务关系
|
plcTaskPoleRelationService.remove(Wrappers.lambdaQuery(PlcTaskPoleRelation.class).eq(PlcTaskPoleRelation::getTaskId, taskId));
|
//删除任务
|
removeById(taskId);
|
return "任务删除成功";
|
} else if (ffff.get("success").size() != ffff.get("all").size()) {
|
//部分成功 删除成功部分的关系 保留任务
|
List<PlcTaskPoleRelation> relations1 = ffff.get("success");
|
if (relations1 != null && relations1.size() > 0) {
|
relations1.forEach(plcTaskPoleRelation -> {
|
plcTaskPoleRelationService.remove(Wrappers.lambdaUpdate(PlcTaskPoleRelation.class)
|
.eq(PlcTaskPoleRelation::getPoleId, plcTaskPoleRelation.getPoleId()).eq(PlcTaskPoleRelation::getTaskId, taskId));
|
});
|
}
|
return "部分任务删除成功,清除任务失败的任务及数据保留!";
|
} else if (ffff.get("fail").size() == ffff.get("all").size()) {
|
//全部失败 保留任务
|
return "任务删除失败 ,请检查硬件设备!";
|
} else {
|
return "任务删除失败,未知错误类型!";
|
}
|
} else {
|
//不存在任务关系 空任务直接删除
|
removeById(taskId);
|
return "任务删除成功";
|
}
|
}
|
|
/**
|
* 下发单个灯杆的任务
|
*/
|
public boolean issuePlcTask(PlcTaskIssueParam param) {
|
|
PlcTaskPoleRelation relation = plcTaskPoleRelationService.getOne(Wrappers.lambdaQuery(PlcTaskPoleRelation.class)
|
.eq(PlcTaskPoleRelation::getPoleId, param.getPoleId()).eq(PlcTaskPoleRelation::getTaskId, param.getTaskId()));
|
|
if (relation == null) {
|
throw new BusinessException("找不到任务关系,无法补发");
|
}
|
PlcTask plcTask = JSONObject.parseObject(relation.getSysScheduled(), PlcTask.class);
|
// PlcTask plcTask = getById(param.getTaskId());
|
if (plcTask == null) {
|
throw new BusinessException("找不到任务");
|
}
|
//转换帧指令
|
String framePayload = buildControlFramePayload(plcTask.getOpenOrder(), plcTask.getCloseOrder(), plcTask.getControlOrder(), plcTask.getWeek());
|
//发送rrpc 得到发送结果
|
List<PlcTaskPoleRelation> plcTaskPoleRelationList = sendControllerFrame(plcTask, ListUtil.toList(param.getPoleId()), framePayload, plcTask.getPlcAdress());
|
|
/**
|
* 下发路灯任务日志记录开始
|
*/
|
List<String> poleCodeList = new ArrayList<>();
|
List<Pole> list = SpringContextHolder.getBean(PoleService.class).list(Wrappers.lambdaQuery(Pole.class).eq(Pole::getId, param.getPoleId()));
|
if (CollectionUtil.isNotEmpty(list)) {
|
poleCodeList = list.stream().map(Pole::getDeviceCode).collect(Collectors.toList());
|
}
|
String content = "{任务ID:" + plcTask.getTaskId() + ", 任务名:" + plcTask.getTaskName() + "}," + " 灯杆ID:" + param.getPoleId() + " }";
|
StoreOperationRecordsUtils.storeOperationData(poleCodeList, null, "下发PLC任务", content);
|
/**
|
* 下发路灯任务日志记录结束
|
*/
|
|
|
if (CollectionUtil.isNotEmpty(plcTaskPoleRelationList)) {
|
PlcTaskPoleRelation plcTaskPoleRelation = plcTaskPoleRelationList.get(0);
|
if (plcTaskPoleRelation.getIssueStatus() == 0) {
|
//下发成功 更新硬件定时 返回成功
|
relation.setDeviceScheduled(JSON.toJSONString(plcTaskPoleRelation));
|
plcTaskPoleRelationService.updateById(relation);
|
return true;
|
} else {
|
return false;
|
}
|
}
|
return false;
|
}
|
|
|
public Map checkTask(PlcTaskParam param) {
|
/**
|
* 重复任务的灯头
|
*/
|
String plcAddress = param.getPlcAddress();
|
List<Long> poleIdList = param.getPoleIdList();
|
List<PlcTaskPoleRelation> plcTaskPoleRelations = plcTaskPoleRelationService.list(Wrappers.lambdaQuery(PlcTaskPoleRelation.class)
|
.in(PlcTaskPoleRelation::getPoleId, poleIdList).eq(PlcTaskPoleRelation::getPlcAddress, plcAddress));
|
//重复的任务id
|
List<Long> taskIds = plcTaskPoleRelations.stream().map(PlcTaskPoleRelation::getTaskId).collect(Collectors.toList());
|
//重复的灯杆id
|
List<Long> oldPoleIds = plcTaskPoleRelations.stream().map(PlcTaskPoleRelation::getPoleId).collect(Collectors.toList());
|
//未重复的灯杆id
|
List<Long> finalOldPoleIds = oldPoleIds;
|
//取出存在于poleIdList而不在oldPoleIds中的灯杆
|
List<Long> newPoleIds = poleIdList.stream().filter(id -> !finalOldPoleIds.contains(id)).collect(Collectors.toList());
|
|
//重复元素只保留一个
|
taskIds = taskIds.stream().distinct().collect(Collectors.toList());
|
oldPoleIds = oldPoleIds.stream().distinct().collect(Collectors.toList());
|
newPoleIds = newPoleIds.stream().distinct().collect(Collectors.toList());
|
Map map = new HashMap();
|
if (!plcTaskPoleRelations.isEmpty()) {
|
|
map.put("result", "false");
|
map.put("newPoleIds", newPoleIds);
|
map.put("oldPoleIds", oldPoleIds);
|
map.put("taskIds", taskIds);
|
} else {
|
map.put("result", "true");
|
map.put("msg", "任务中无重复灯杆地址");
|
}
|
return map;
|
}
|
|
|
public List<PlcTaskDto> listPlcTask(BaseConditionVO conditionVO, String keyword, Integer order, Integer seq) {
|
|
//排序字段
|
String orderByResult = "task_id";
|
//正序、倒叙
|
String orderBySeq = OrderByEnums.ASC.getCode();
|
if (order != null) {
|
switch (order) {
|
case 1:
|
orderByResult = OrderByEnums.LIGHT_TASK_UPDATE_TIME.getCode();
|
break;
|
default:
|
}
|
}
|
if (seq != null) {
|
switch (seq) {
|
case 1:
|
orderBySeq = OrderByEnums.ASC.getCode();
|
break;
|
case 2:
|
orderBySeq = OrderByEnums.DESC.getCode();
|
break;
|
default:
|
break;
|
}
|
}
|
//排序方式
|
String orderBy = orderByResult + " " + orderBySeq;
|
|
PageHelper.startPage(conditionVO.getPageNo(), conditionVO.getPageSize(), orderBy);
|
List<PlcTask> list = baseMapper.listTask(SecurityUtils.getClientId(), keyword, orderBy);
|
|
|
Page<PlcTaskDto> page = new Page<>();
|
BeanUtils.copyProperties(list, page);
|
for (PlcTask plcTask : list) {
|
PlcTaskDto plcTaskDto = new PlcTaskDto();
|
BeanUtils.copyProperties(plcTask, plcTaskDto);
|
plcTaskDto.setWeekList(TaskOrderUtil.parseLightWeek2List(plcTask.getWeek()));
|
|
|
//判断灯头是否存在任务
|
List<PlcTaskPoleRelation> plcTaskPoleRelationList = plcTaskPoleRelationService.list(Wrappers.<PlcTaskPoleRelation>lambdaQuery().eq(PlcTaskPoleRelation::getTaskId, plcTask.getTaskId()));
|
|
//下发成功的灯杆数量
|
Integer successCount = baseMapper.successCount(plcTaskDto.getTaskId());
|
///任务中总的灯杆数量
|
Integer toTalCount = baseMapper.toTalCount(plcTaskDto.getTaskId());
|
if (successCount == null) {
|
successCount = 0;
|
}
|
if (toTalCount == null) {
|
toTalCount = 0;
|
}
|
if (toTalCount == 0) {
|
//任务中没有灯杆
|
plcTaskDto.setSyncStatus("未同步");
|
} else {
|
//任务中有灯杆
|
if (successCount == 0) {
|
//下发成功未0
|
plcTaskDto.setSyncStatus("未同步");
|
} else if (successCount != 0 && successCount < toTalCount) {
|
//存在下发成功 但并未全部成功
|
plcTaskDto.setSyncStatus("部分同步");
|
} else if (toTalCount.equals(successCount) && toTalCount != 0 && successCount != 0) {
|
//全部成功
|
plcTaskDto.setSyncStatus("已同步");
|
} else {
|
//未知类型
|
plcTaskDto.setSyncStatus("同步状态出错");
|
}
|
}
|
page.add(plcTaskDto);
|
}
|
return page;
|
}
|
|
/**
|
* 执行中的路灯任务
|
*
|
* @return
|
*/
|
public List<PlcTaskDto> listTask() {
|
Long clientId = SecurityUtils.getClientId();
|
List<PlcTask> plcTasks = plcTaskMapper.listPlcTask(clientId);
|
Page<PlcTaskDto> page = new Page<>();
|
BeanUtils.copyProperties(plcTasks, page);
|
for (PlcTask plcTask : plcTasks) {
|
PlcTaskDto plcTaskDto = new PlcTaskDto();
|
BeanUtils.copyProperties(plcTask, plcTaskDto);
|
plcTaskDto.setWeekList(TaskOrderUtil.parseLightWeek2List(plcTask.getWeek()));
|
page.add(plcTaskDto);
|
}
|
return page;
|
}
|
|
/**
|
* 任务详情
|
*/
|
public Object detailPlcTask(Long taskId) {
|
PlcTask plcTask = getById(taskId);
|
if (plcTask == null) {
|
throw new BusinessException("找不到任务");
|
}
|
PlcTaskInfoVO vo = new PlcTaskInfoVO();
|
|
// LightTaskDto plcTaskDto = new LightTaskDto();
|
// BeanUtils.copyProperties(plcTask, plcTaskDto);
|
|
plcTask.setWeekList(TaskOrderUtil.parseLightWeek2List(plcTask.getWeek()));
|
|
vo.setPlcTask(plcTask);
|
List<PlcTaskRelationVO> relations = new ArrayList<>();
|
List<PlcTaskPoleRelation> taskPoleRelations = plcTaskPoleRelationService.list(Wrappers.lambdaQuery(PlcTaskPoleRelation.class)
|
.eq(PlcTaskPoleRelation::getTaskId, taskId));
|
if (taskPoleRelations != null && !taskPoleRelations.isEmpty()) {
|
taskPoleRelations.forEach(
|
relation -> {
|
PlcTaskRelationVO plcTaskRelationVO = new PlcTaskRelationVO();
|
plcTaskRelationVO.setPlcAddress(relation.getPlcAddress());
|
plcTaskRelationVO.setIssueStatus(relation.getIssueStatus());
|
plcTaskRelationVO.setPoleId(relation.getPoleId());
|
Pole byId = poleService.getById(relation.getPoleId());
|
if (byId != null) {
|
plcTaskRelationVO.setPoleName(byId.getPoleName());
|
}
|
|
PlcTaskVO sys = JSONObject.parseObject(relation.getSysScheduled(), PlcTaskVO.class);
|
sys.setWeekList(TaskOrderUtil.parseLightWeek2List(sys.getWeek()));
|
plcTaskRelationVO.setSysScheduled(sys);
|
|
PlcTaskVO device = JSONObject.parseObject(relation.getDeviceScheduled(), PlcTaskVO.class);
|
if (device != null) {
|
device.setWeekList(TaskOrderUtil.parseLightWeek2List(device.getWeek()));
|
plcTaskRelationVO.setDeviceScheduled(device);
|
}
|
relations.add(plcTaskRelationVO);
|
}
|
);
|
|
vo.setRelations(relations);
|
}
|
|
// List<LightTaskStatusAndPole> plcTaskStatusAndPoles = plcTaskPoleRelationService.listPoleAndStatusIdByTaskId(taskId);
|
|
// return MapUtil.builder().put("task", plcTask).put("poles", plcTaskStatusAndPoles).build();
|
return vo;
|
}
|
|
|
|
}
|