合并装置模块和检测计划模块

This commit is contained in:
2025-01-21 14:41:00 +08:00
parent e3a19da34e
commit 413f668179
118 changed files with 314 additions and 458 deletions

View File

@@ -0,0 +1,324 @@
package com.njcn.gather.device.controller;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.common.pojo.annotation.OperateInfo;
import com.njcn.common.pojo.constant.OperateType;
import com.njcn.common.pojo.enums.common.LogEnum;
import com.njcn.common.pojo.enums.response.CommonResponseEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.common.pojo.response.HttpResult;
import com.njcn.common.utils.LogUtil;
import com.njcn.gather.device.pojo.param.PqDevParam;
import com.njcn.gather.device.pojo.po.PqDev;
import com.njcn.gather.device.pojo.vo.CNDevExcel;
import com.njcn.gather.device.pojo.vo.PqDevExcel;
import com.njcn.gather.device.pojo.vo.PqDevVO;
import com.njcn.gather.device.pojo.vo.PreDetection;
import com.njcn.gather.device.service.IPqDevService;
import com.njcn.gather.device.pojo.enums.DevResponseEnum;
import com.njcn.gather.device.pojo.enums.PatternEnum;
import com.njcn.gather.system.dictionary.pojo.po.DictData;
import com.njcn.gather.system.dictionary.service.IDictDataService;
import com.njcn.web.controller.BaseController;
import com.njcn.web.utils.ExcelUtil;
import com.njcn.web.utils.FileUtil;
import com.njcn.web.utils.HttpResultUtil;
import com.njcn.web.utils.PoiUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author caozehui
* @date 2024/11/06
*/
@Slf4j
@Api(tags = "被检设备")
@RestController
@RequestMapping("/pqDev")
@RequiredArgsConstructor
public class PqDevController extends BaseController {
private final IPqDevService pqDevService;
private final IDictDataService dictDataService;
@OperateInfo
@GetMapping("/aaa")
@ApiOperation("分页查询被检设备")
@ApiImplicitParam(name = "queryParam", value = "查询参数", required = true)
public HttpResult<List<PreDetection>> aaa() {
String methodDescribe = getMethodDescribe("list");
List<PreDetection> devInfo = pqDevService.getDevInfo(Arrays.asList("578c142b7e4e4978a35bd6225aa62a23", "393504f55f1f79bce255bfc195cfdb56"));
Map<String, List<PreDetection>> map = new HashMap();
map.put("deviceList", devInfo);
String jsonString = JSON.toJSONString(map);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, devInfo, methodDescribe);
}
@OperateInfo
@PostMapping("/list")
@ApiOperation("分页查询被检设备")
@ApiImplicitParam(name = "queryParam", value = "查询参数", required = true)
public HttpResult<Page<PqDev>> list(@RequestBody @Validated PqDevParam.QueryParam queryParam) {
String methodDescribe = getMethodDescribe("list");
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, queryParam);
Page<PqDev> result = pqDevService.listPqDevs(queryParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo
@GetMapping("/getById")
@ApiOperation("根据id查询被检设备")
@ApiImplicitParam(name = "id", value = "被检设备id", required = true)
public HttpResult<PqDevVO> getById(@RequestParam("id") String id) {
String methodDescribe = getMethodDescribe("getById");
LogUtil.njcnDebug(log, "{}查询ID为{}", methodDescribe, id);
PqDevVO result = pqDevService.getPqDevById(id);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo(operateType = OperateType.ADD)
@PostMapping("/add")
@ApiOperation("新增被检设备")
@ApiImplicitParam(name = "pqDevParam", value = "被检设备", required = true)
public HttpResult<Object> add(@RequestBody @Validated PqDevParam pqDevParam) {
String methodDescribe = getMethodDescribe("add");
LogUtil.njcnDebug(log, "{},新增数据为:{}", methodDescribe, pqDevParam);
boolean result = pqDevService.addPqDev(pqDevParam);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
}
}
@OperateInfo(operateType = OperateType.UPDATE)
@PostMapping("/update")
@ApiOperation("修改被检设备")
@ApiImplicitParam(name = "updateParam", value = "被检设备", required = true)
public HttpResult<Object> update(@RequestBody @Validated PqDevParam.UpdateParam updateParam) {
String methodDescribe = getMethodDescribe("update");
LogUtil.njcnDebug(log, "{},修改数据为:{}", methodDescribe, updateParam);
boolean result = pqDevService.updatePqDev(updateParam);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
}
}
@OperateInfo(operateType = OperateType.DELETE)
@PostMapping("/delete")
@ApiOperation("删除被检设备")
@ApiImplicitParam(name = "ids", value = "被检设备id", required = true)
public HttpResult<Object> delete(@RequestBody @Validated PqDevParam.DeleteParam param) {
String methodDescribe = getMethodDescribe("delete");
LogUtil.njcnDebug(log, "{}删除ID数据为{}", methodDescribe, String.join(StrUtil.COMMA, param.getIds()));
boolean result = pqDevService.deletePqDev(param);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
}
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.DOWNLOAD)
@PostMapping("/export")
@ApiOperation("导出被检设备数据")
@ApiImplicitParam(name = "queryParam", value = "查询参数", required = true)
public void export(@RequestBody @Validated PqDevParam.QueryParam queryParam) {
String methodDescribe = getMethodDescribe("export");
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, queryParam);
DictData dictData = dictDataService.getDictDataById(queryParam.getPattern());
if (ObjectUtil.isNotNull(dictData)) {
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
List<PqDevExcel.ContrastExportData> data = pqDevService.getContrastExportData(queryParam);
ExcelUtil.exportExcel("被检设备导出数据.xlsx", PqDevExcel.ContrastExportData.class, data);
} else {
List<PqDevExcel.SimulateOrDigitalExportData> data = pqDevService.getSimulateOrDigitExportData(queryParam);
ExcelUtil.exportExcel("被检设备导出数据.xlsx", PqDevExcel.SimulateOrDigitalExportData.class, data);
}
}
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.DOWNLOAD)
@PostMapping("/downloadTemplate")
@ApiOperation("下载被检设备导入文件模板")
public void downloadTemplate() {
pqDevService.downloadTemplate();
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.UPLOAD)
@PostMapping(value = "/importContrast")
@ApiOperation("批量导入被检设备数据")
@ApiImplicitParam(name = "file", value = "被检设备数据文件", required = true)
public HttpResult<Object> importContrastData(@RequestParam("file") MultipartFile file, HttpServletResponse response) {
String methodDescribe = getMethodDescribe("importContrastData");
LogUtil.njcnDebug(log, "{},上传文件为:{}", methodDescribe, file.getOriginalFilename());
ImportParams params = new ImportParams();
params.setHeadRows(2);
params.setNeedVerify(true);
params.setStartSheetIndex(0);
params.setSheetNum(1);
try {
ExcelImportResult<PqDevExcel.ContrastImportData> excelImportResult = ExcelImportUtil.importExcelMore(file.getInputStream(), PqDevExcel.ContrastImportData.class, params);
//如果存在非法数据,将不合格的数据导出
if (excelImportResult.isVerifyFail()) {
// 此处前端要做特殊处理,具体可以参考技术监督的数据导入
Workbook failWorkbook = excelImportResult.getFailWorkbook();
PoiUtil.exportFileByWorkbook(failWorkbook, "非法被检设备数据.xlsx", response);
} else {
//批量录入数据
List<PqDevExcel.ContrastImportData> list = excelImportResult.getList();
pqDevService.importContrastData(list);
}
} catch (Exception e) {
throw new BusinessException(DevResponseEnum.IMPORT_DATA_FAIL);
}
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
/**
* 导出灿能二楼设备
*
* @param queryParam
*/
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.DOWNLOAD)
@PostMapping("/exportCNDev")
@ApiOperation("导出被检设备数据")
@ApiImplicitParam(name = "queryParam", value = "查询参数", required = true)
public void exportCNDev(@RequestBody @Validated PqDevParam.QueryParam queryParam) {
String methodDescribe = getMethodDescribe("exportCNDev");
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, queryParam);
pqDevService.exportCNDev(queryParam);
}
/**
* 下载灿能二楼设备导入文件模板
*/
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.DOWNLOAD)
@PostMapping("/downloadCNDevTemplate")
@ApiOperation("下载被检设备导入文件模板")
public void downloadCNDevTemplate() {
pqDevService.downloadCNDevTemplate();
}
/**
* 导入灿能二楼设备
*/
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.UPLOAD)
@PostMapping(value = "/importCNDev")
@ApiOperation("批量导入设备数据")
@ApiImplicitParam(name = "file", value = "被检设备数据文件", required = true)
public HttpResult<String> importCNDev(@RequestParam("file") MultipartFile file, String patternId, HttpServletResponse response) {
String methodDescribe = getMethodDescribe("importCNDev");
LogUtil.njcnDebug(log, "{},上传文件为:{}", methodDescribe, file.getOriginalFilename());
boolean fileType = FileUtil.judgeFileIsExcel(file.getOriginalFilename());
if (!fileType) {
throw new BusinessException(CommonResponseEnum.FILE_XLSX_ERROR);
}
ImportParams params = new ImportParams();
params.setStartSheetIndex(0);
params.setSheetNum(1);
params.setHeadRows(1);
params.setNeedVerify(true);
List<CNDevExcel> cnDevExcelList;
try {
ExcelImportResult<CNDevExcel> excelImportResult = ExcelImportUtil.importExcelMore(file.getInputStream(), CNDevExcel.class, params);
if (excelImportResult.isVerifyFail()) {
// 此处前端要做特殊处理,具体可以参考技术监督的数据导入
Workbook failWorkbook = excelImportResult.getFailWorkbook();
PoiUtil.exportFileByWorkbook(failWorkbook, "非法被检设备数据.xlsx", response);
// throw new BusinessException(DevResponseEnum.IMPORT_DATA_FORMAT_FAIL);
return null;
} else {
cnDevExcelList = excelImportResult.getList();
}
} catch (Exception e) {
throw new BusinessException(DevResponseEnum.IMPORT_DATA_FAIL);
}
if (ObjectUtil.isNotEmpty(cnDevExcelList)) {
pqDevService.importCNDev(cnDevExcelList, patternId);
}
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@GetMapping("/listUnbound")
@ApiOperation("获取指定模式下所有未绑定的设备")
@ApiImplicitParam(name = "pattern", value = "模式id", required = true)
public HttpResult<List<Map<String, Object>>> listUnbound(@RequestParam("pattern") String pattern) {
String methodDescribe = getMethodDescribe("listUnbound");
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, pattern);
List<Map<String, Object>> result = pqDevService.listUnbound(pattern);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/listByPlanId")
@ApiOperation("根据查询参数查询出所有已绑定的设备")
@ApiImplicitParam(name = "planId", value = "计划id", required = true)
public HttpResult<List<PqDev>> listByPlanId(@RequestBody @Validated PqDevParam.QueryParam param) {
String methodDescribe = getMethodDescribe("listByPlanId");
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, param);
List<PqDev> result = pqDevService.listByPlanId(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.UPDATE)
@PostMapping("/documented")
@ApiOperation("设备归档")
@ApiImplicitParam(name = "id", value = "设备id", required = true)
public HttpResult<List<PqDev>> documented(@RequestBody List<String> ids) {
String methodDescribe = getMethodDescribe("documented");
LogUtil.njcnDebug(log, "{}设备id为{}", methodDescribe, ids);
boolean result = pqDevService.documented(ids);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
}
}
// @OperateInfo(operateType = OperateType.UPDATE)
// @PostMapping("/bindDev")
// @ApiOperation("检测计划绑定设备")
// @ApiImplicitParam(name = "bindPlanParam", value = "绑定参数", required = true)
// public HttpResult<Object> bindDev(@RequestBody @Validated PqDevParam.BindPlanParam bindPlanParam) {
// String methodDescribe = getMethodDescribe("bindDev");
// LogUtil.njcnDebug(log, "{}绑定计划数据为planId={}, pqDevIds={}", methodDescribe, bindPlanParam.getPlanId(), String.join(StrUtil.COMMA, bindPlanParam.getPqDevIds()));
// boolean result = pqDevService.bind(bindPlanParam.getPlanId(), bindPlanParam.getPqDevIds());
// if (result) {
// return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
// } else {
// return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
// }
// }
}

View File

@@ -0,0 +1,29 @@
package com.njcn.gather.device.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.njcn.gather.device.pojo.po.PqDev;
import com.njcn.gather.device.pojo.vo.PreDetection;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author caozehui
* @date 2024-11-06
*/
public interface PqDevMapper extends MPJBaseMapper<PqDev> {
/**
* 根据装置id集合获取装置信息
* @param devIds 装置id
* @return: java.util.List<com.njcn.gather.device.pojo.vo.PreDetection>
* @Author: wr
* @Date: 2024/12/12 11:46
*/
List<PreDetection> selectDevInfo(@Param("devIds") List<String> devIds);
void finishPlan(@Param("planId")String planId);
void updateReportState(@Param("id")String id);
}

View File

@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.njcn.gather.device.mapper.PqDevMapper">
<!-- 通用查询映射结果 -->
<resultMap id="DevResultMap" type="com.njcn.gather.device.pojo.vo.PreDetection">
<id column="Id" property="devId" />
<id column="Name" property="devName" />
<id column="IP" property="devIP" />
<result column="Port" property="port" />
<result column="Dev_Type" property="devType" />
<result column="" property="icdType" />
<result column="Series" property="devCode" />
<result column="Dev_Key" property="devKey" />
<result column="icdType" property="icdType" />
<result column="Dev_Volt" property="devVolt" />
<result column="Dev_Curr" property="devCurr" />
<collection
property="monitorList"
column="{ devId = Id}"
select="com.njcn.gather.monitor.mapper.PqMonitorMapper.selectMonitorInfo"
>
</collection>
</resultMap>
<select id="selectDevInfo" resultMap="DevResultMap">
SELECT
d.Id,
d.Name,
d.IP,
( select name from pq_dev_type sd where d.Dev_Type= sd.id) as Dev_Type,
d.Port,
d.Dev_Chns as devChns,
d.Series,
d.Dev_Key,
d.Dev_Volt,
d.Dev_Curr,
p.name icdType
FROM
pq_dev d
inner join pq_icd_path p on d.Icd_Id = p.id
<where>
<if test="devIds !=null and devIds.size()!=0">
AND d.Id in
<foreach collection="devIds" open="(" close=")" item="item" separator=",">
#{item}
</foreach>
</if>
</where>
</select>
<update id="finishPlan" >
update ad_plan set Test_State = 2 where id = #{planId}
</update>
<update id="updateReportState" >
update pq_dev set Report_State = 1 where id = #{id}
</update>
</mapper>

View File

@@ -0,0 +1,210 @@
package com.njcn.gather.device.pojo.constant;
/**
* @author caozehui
* @date 2024/11/06
*/
public interface DevValidMessage {
String ID_NOT_BLANK = "id不能为空请检查id参数";
String ID_FORMAT_ERROR = "id格式错误请检查id参数";
String PORT_RANGE_ERROR = "端口号范围错误请检查port参数";
String NAME_NOT_BLANK = "名称不能为空请检查name参数";
String NAME_FORMAT_ERROR = "名称格式错误请检查name参数";
String PATTERN_NOT_BLANK = "模式不能为空请检查pattern参数";
String DEV_TYPE_NOT_BLANK = "设备类型不能为空请检查devType参数";
String DEV_CHNS_NOT_NULL = "设备通道系数不能为空请检查devChns参数";
String DEV_VOLT_NOT_NULL = "额定电压不能为空请检查devVolt参数";
String DEV_CURR_NOT_NULL = "额定电流不能为空请检查devCurr参数";
String MANUFACTURER_NOT_BLANK = "设备厂家不能为空请检查manufacturer参数";
String CREATEDATETIME_NOT_NULL = "出厂日期不能为空请检查producedDate参数";
String CREATEDATETIME_FORMAT_ERROR = "出厂日期格式错误请检查createDateTime参数";
String FACTORYNO_NOT_BLANK = "出厂编号不能为空请检查factoryNo参数";
String FIRMWARE_NOT_BLANK = "固件版本不能为空请检查firmware参数";
String SOFTWARE_NOT_BLANK = "软件版本不能为空请检查software参数";
String PROTOCOL_NOT_BLANK = "通讯协议不能为空请检查protocol参数";
String IP_NOT_BLANK = "IP地址不能为空请检查ip参数";
String IP_FORMAT_ERROR = "IP地址格式错误请检查ip参数";
String PORT_NOT_NULL = "端口号不能为空请检查port参数";
String ENCRYPTION_NOT_NULL = "是否为加密版本不能为空请检查encryption参数";
String RECHECK_NUM_NOT_NULL = "检测次数不能为空请检查reCheckNum参数";
String PLAN_ID_NOT_NULL = "检测计划ID不能为空请检查planId参数";
String PQ_DEV_IDS_NOT_NULL = "设备ID集合不能为null请检查pqDevIds参数";
String ARRIVE_DATE_FORMAT_ERROR = "送样日期格式错误请检查arrivedDateTime参数";
String ENCRYPTION_FLAG_FORMAT_ERROR = "是否为加密版本格式错误请检查encryptionFlag参数";
String RECHECK_NUM_FORMAT_ERROR = "检测次数格式错误请检查recheckNum参数";
String PATTERN_FORMAT_ERROR = "模式格式错误请检查pattern参数";
String SOURCE_IDS_NOT_EMPTY = "检测源ID不能为空请检查sourceIds参数";
String SOURCE_ID_FORMAT_ERROR = "检测源ID格式错误请检查sourceIds参数";
String DEV_TYPE_FORMAT_ERROR = "设备类型格式错误请检查devType参数";
String DEV_CHNS_RANGE_ERROR = "设备通道系数错误请检查devChns参数";
String MANUFACTURER_FORMAT_ERROR = "设备厂家格式错误请检查manufacturer参数";
String PROTOCOL_FORMAT_ERROR = "通讯协议格式错误请检查protocol参数";
String PLAN_ID_FORMAT_ERROR = "检测计划ID格式错误请检查planId参数";
String STANDARD_TIME_FORMAT_ERROR = "标准推行时间格式错误请检查standardTime参数";
String SCRIPT_TYPE_NOT_BLANK = "检测脚本类型不能为空请检查scriptType参数";
String STANDARD_NAME_NOT_BLANK = "参照标准名称不能为空请检查standardName参数";
String STANDARD_NAME_FORMAT_ERROR = "参照标准名称格式错误请检查standardName参数";
String STANDARD_TIME_NOT_BLANK = "标准推行时间不能为空请检查standardTime参数";
String SCRIPT_TYPE_FORMAT_ERROR = "检测脚本类型格式错误请检查scriptType参数";
String DEV_LEVEL_NOT_BLANK = "设备等级不能为空请检查devLevel参数";
String DEV_LEVEL_FORMAT_ERROR = "设备等级格式错误请检查devLevel参数";
String ENABLE_FORMAT_ERROR = "是否启用格式错误请检查enable参数";
String ERR_SYS_ID_NOT_BLANK = "误差体系ID不能为空请检查errSysId参数";
String ERR_SYS_DTLS_ERROR_TYPE_NOT_BLANK = "误差项类型不能为空请检查errorType参数";
String ERR_SYS_DTLS_ERROR_TYPE_FORMAT_ERROR = "误差项类型格式错误请检查errorType参数";
String ERR_SYS_DTLS_SCRIPT_TYPE_NOT_BLANK = "脚本项类型不能为空请检查scriptType参数";
String ERR_SYS_DTLS_SCRIPT_TYPE_FORMAT_ERROR = "脚本项类型格式错误请检查scriptType参数";
String START_VALUE_NOT_NULL = "起始值不能为空请检查startValue参数";
String START_FLAG_NOT_NULL = "是否包含起始值不能为空请检查startFlag参数";
String END_VALUE_NOT_NULL = "结束值不能为空请检查endValue参数";
String END_FLAG_NOT_NULL = "是否包含结束值不能为空请检查endFlag参数";
String CONDITION_TYPE_NOT_BLANK = "判断条件类型不能为空请检查conditionType参数";
String ERROR_VALUE_FORMAT_ERROR = "误差值格式错误请检查errorValue参数";
String MAX_ERROR_VALUE_NOT_NULL = "最大误差值不能为空请检查maxErrorValue参数";
String ERROR_VALUE_TYPE_NOT_BLANK = "误差值类型不能为空请检查errorValueType参数";
String PQ_SOURCE_TYPE_NOT_BLANK = "检测源类型不能为空请检查pqSourceType参数";
String PQ_SOURCE_TYPE_FORMAT_ERROR = "检测源类型格式错误请检查pqSourceType参数";
String ENABLE_NOT_NULL = "状态不能为空请检查enable参数";
String PQ_SOURCE_NAME_FORMAT_ERROR = "检测源名称格式错误请检查pqSourceName参数";
String PQ_SOURCE_PARAMETER_ID_NOT_BLANK = "检测源参数ID不能为空请检查pqSourceParameterId参数";
String PQ_SOURCE_PARAMETER_PID_NOT_BLANK = "检测源参数PID不能为空请检查pqSourceParameterId参数";
String PQ_SOURCE_PARAMETER_TYPE_NOT_BLANK = "检测源参数类型不能为空请检查pqSourceParameterType参数";
String PQ_SOURCE_PARAMETER_REMARK_NOT_BLANK = "检测源参数描述不能为空请检查pqSourceParameterRemark参数";
String PQ_SOURCE_PARAMETER_VALUE_NOT_BLANK = "参数值不能为空请检查pqSourceParameterValue参数";
String DEV_ID_NOT_BLANK = "设备ID不能为空";
String DEV_ID_FORMAT_ERROR = "设备ID格式错误";
String BELONG_LINE_NOT_BLANK = "所属母线不能为空";
String PT_NOT_NULL = "PT变比不能为空";
String CT_NOT_NULL = "CT变比不能为空";
String WIRING_TYPE_NOT_BLANK = "接线方式不能为空";
String WIRING_TYPE_FORMAT_ERROR = "接线方式格式错误";
String DATASOURCE_ID_NOT_EMPTY = "数据源ID不能为空";
String SCRIPT_ID_NOT_BLANK = "检测脚本ID不能为空";
String SCRIPT_ID_FORMAT_ERROR = "检测脚本ID格式错误";
String ERROR_SYS_ID_NOT_BLANK = "误差体系ID不能为空";
String ERROR_SYS_ID_FORMAT_ERROR = "误差体系ID格式错误";
String TIME_CHECK_NOT_NULL = "守时检测不能为空";
String TIME_CHECK_FORMAT_ERROR = "守时检测格式错误";
String TEST_STATE_NOT_NULL = "检测状态不能为空";
String TEST_STATE_FORMAT_ERROR = "检测状态格式错误";
String REPORT_STATE_NOT_NULL = "报告生成状态不能为空";
String REPORT_STATE_FORMAT_ERROR = "报告生成状态格式错误";
String CHECK_RESULT_STATE_NOT_NULL = "检测结果不能为空";
String CHECK_RESULT_STATE_FORMAT_ERROR = "检测结果格式错误";
String CHECK_STATE_FORMAT_ERROR = "检测状态格式错误";
String CHECK_RESULT_FORMAT_ERROR = "检测结果格式错误";
String DOCUMENT_STATE_FORMAT_ERROR = "归档状态格式错误";
String MONITOR_CODE_FORMAT_ERROR = "监测点编码格式错误";
String MONITOR_NUM_NOT_NULL = "监测点序号不能为空";
String FACTOR_FLAG_FORMAT_ERROR = "是否支持系数校准格式错误";
String MONITOR_NUM_FORMAT_ERROR = "监测点序号格式错误";
String SOURC_NOT_BLANK = "检测源不能为空";
String DATASOURCE_NOT_BLANK = "数据源不能为空";
String SCRIPT_NOT_BLANK = "检测脚本不能为空";
String ERRORSYS_NOT_BLANK = "误差体系不能为空";
String TIMECHECK_NOT_BLANK = "是否做守时检测不能为空";
String FACTOR_FLAG_NOT_BLANK = "是否支持系数校准不能为空";
String CONDITION_TYPE_FORMAT_ERROR = "判断条件类型格式错误请检查conditionType参数";
String SORT_NOT_NULL = "排序不能为空";
}

View File

@@ -0,0 +1,31 @@
package com.njcn.gather.device.pojo.enums;
import lombok.Getter;
/**
* @author caozehui
* @data 2024-12-12
*/
@Getter
public enum CheckResultEnum {
NOT_ACCORD("不符合", 0),
ACCORD("符合", 1),
UNCHECKED("未检", 2);
private final Integer value;
private final String msg;
CheckResultEnum(String msg, Integer value) {
this.msg = msg;
this.value = value;
}
public static String getMsgByValue(Integer value) {
for (CheckStateEnum state : CheckStateEnum.values()) {
if (state.getValue().equals(value)) {
return state.getMsg();
}
}
return null;
}
}

View File

@@ -0,0 +1,35 @@
package com.njcn.gather.device.pojo.enums;
import lombok.Getter;
/**
* @author caozehui
* @data 2024-12-12
*/
@Getter
public enum CheckStateEnum {
UNCHECKED("未检", 0),
CHECKING("检测中", 1),
CHECKED("检测完成", 2),
/**
* 检测计划没有该状态,只有未检、检测中、检测完成三种状态。被检设备有这种状态
*/
DOCUMENTED("归档", 3);
private final Integer value;
private final String msg;
CheckStateEnum(String msg, Integer value) {
this.msg = msg;
this.value = value;
}
public static String getMsgByValue(Integer value) {
for (CheckStateEnum state : CheckStateEnum.values()) {
if (state.getValue().equals(value)) {
return state.getMsg();
}
}
return null;
}
}

View File

@@ -0,0 +1,32 @@
package com.njcn.gather.device.pojo.enums;
import lombok.Getter;
/**
* @author caozehui
* @data 2024-12-13
*/
@Getter
public enum CommonEnum {
FATHER_ID("0", ""),
NO("0", ""),
YES("1", ""),
COEFFICIENT_TEST("0","系数校验"),
PRE_TEST("1","预检测"),
FORMAL_TEST("2","正式检测"),
TIME_TEST("3","守时检测"),
PHASE_TEST("4","相序检测"),
;
private String value;
private String msg;
CommonEnum(String value, String msg) {
this.value = value;
this.msg = msg;
}
}

View File

@@ -0,0 +1,21 @@
package com.njcn.gather.device.pojo.enums;
import lombok.Getter;
/**
* @author caozehui
* @data 2024-12-12
*/
@Getter
public enum DevDocumentStateEnum {
UNDOCUMENTED("未归档", 0),
DOCUMENTED("归档", 1);
private final Integer value;
private final String msg;
DevDocumentStateEnum(String msg, Integer value) {
this.msg = msg;
this.value = value;
}
}

View File

@@ -0,0 +1,31 @@
package com.njcn.gather.device.pojo.enums;
import lombok.Getter;
/**
* @author caozehui
* @data 2024-12-12
*/
@Getter
public enum DevReportStateEnum {
NOT_GENERATED("未生成", 0),
GENERATED("已生成", 1),
UNCHECKED("未检", 2);
private final Integer value;
private final String msg;
DevReportStateEnum(String msg, Integer value) {
this.msg = msg;
this.value = value;
}
public static String getMsgByValue(Integer value) {
for (CheckStateEnum state : CheckStateEnum.values()) {
if (state.getValue().equals(value)) {
return state.getMsg();
}
}
return null;
}
}

View File

@@ -0,0 +1,37 @@
package com.njcn.gather.device.pojo.enums;
import lombok.Getter;
@Getter
public enum DevResponseEnum {
//NAME_REPEAT("A001001", "名称重复"),
IMPORT_DATA_FAIL("A001002", "导入数据失败"),
SERIES_AND_DEVKEY_NOT_BLANK("A001003", "加密设备的序列号和设备密钥不能为空"),
PQ_SOURCE_GEN_NAME_ERROR("A001004", "检测源生成名称出错"),
ERR_SOURCE_GEN_NAME_ERROR("A001005", "误差体系生成名称出错"),
PQ_ERRSYS_GEN_NAME_ERROR("A001005", "误差体系生成名称出错"),
PLAN_HAS_DEVICE_BIND("A001006", "检测计划下已绑定设备,请先解绑设备"),
PQ_DEV_REPEAT("A001007", "重复的被检设备"),
PQ_DEV_HAS_MONITOR("A001008", "该设备下关联有监测点,请先移除监测点"),
HAS_NOT_UNCHECKED_DEVICE("A001009", "设备在检测中或已被检测过,请勿解除绑定"),
IMPORT_PLAN_DATA_FAIL("A001010", "导入的检测计划为空"),
IMPORT_DATA_FORMAT_FAIL("A001011", "导入数据格式错误"),
IMPORT_SOURCE_ERROR("A001012","当前模式下一个检测计划只能有一个检测源" ),
IMPORT_DATASOURCE_ERROR("A001013","当前模式下一个检测计划只能有一个数据源" ),
DEV_UN_CHECKED("A001013","装置还未检测完成!" ),
DEV_UN_REPORT("A001013","装置报告未生成!" ),
DEVICE_DIS_ERROR("A001014","装置配置异常" ),
DEVICE_DELETE("A001015","设备无法删除,已绑定计划! " )
;
private final String message;
private final String code;
DevResponseEnum(String code, String message) {
this.code = code;
this.message = message;
}
}

View File

@@ -0,0 +1,31 @@
package com.njcn.gather.device.pojo.enums;
import lombok.Getter;
/**
* @author caozehui
* @data 2024-12-14
*/
@Getter
public enum FactorCheckResultEnum {
NOT_QUALIFY(0, "不合格"),
QUALIFY(1, "合格"),
UNKNOWN(2, "/");
private final Integer value;
private final String msg;
FactorCheckResultEnum(Integer value, String msg) {
this.value = value;
this.msg = msg;
}
public static String getMsgByValue(Integer value) {
for (FactorCheckResultEnum e : FactorCheckResultEnum.values()) {
if (e.getValue().equals(value)) {
return e.getMsg();
}
}
return null;
}
}

View File

@@ -0,0 +1,22 @@
package com.njcn.gather.device.pojo.enums;
import lombok.Getter;
/**
* @author caozehui
* @data 2024-12-12
*/
@Getter
public enum PatternEnum {
SIMULATE("Simulate", "模拟式"),
DIGITAL("Digital", "数字式"),
CONTRAST("Contrast", "比对式");
private String value;
private String msg;
PatternEnum(String value, String msg) {
this.value = value;
this.msg = msg;
}
}

View File

@@ -0,0 +1,22 @@
package com.njcn.gather.device.pojo.enums;
import lombok.Getter;
/**
* @author caozehui
* @data 2024-12-12
*/
@Getter
public enum PlanReportStateEnum {
REPORT_STATE_NOT_GENERATED("未生成", 0),
REPORT_STATE_PARTIALLY_GENERATED("部分生成", 1),
REPORT_STATE_ALL_GENERATED("全部生成", 2);
private final Integer value;
private final String msg;
PlanReportStateEnum(String msg, Integer value) {
this.msg = msg;
this.value = value;
}
}

View File

@@ -0,0 +1,31 @@
package com.njcn.gather.device.pojo.enums;
import lombok.Getter;
/**
* @author caozehui
* @data 2024-12-14
*/
@Getter
public enum TimeCheckResultEnum {
NOT_QUALIFY(0, "不合格"),
QUALIFY(1, "合格"),
UNKNOWN(2, "/");
private final Integer value;
private final String msg;
TimeCheckResultEnum(Integer value, String msg) {
this.value = value;
this.msg = msg;
}
public static String getMsgByValue(Integer value) {
for (TimeCheckResultEnum e : TimeCheckResultEnum.values()) {
if (e.getValue().equals(value)) {
return e.getMsg();
}
}
return null;
}
}

View File

@@ -0,0 +1,238 @@
package com.njcn.gather.device.pojo.param;
import com.njcn.common.pojo.constant.PatternRegex;
import com.njcn.gather.monitor.pojo.param.PqMonitorParam;
import com.njcn.gather.device.pojo.constant.DevValidMessage;
import com.njcn.web.pojo.annotation.DateTimeStrValid;
import com.njcn.web.pojo.param.BaseParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Range;
import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.List;
/**
* @author caozehui
* @date 2024/11/06
*/
@Data
public class PqDevParam {
@ApiModelProperty(value = "名称", required = true)
//@NotBlank(message = DevValidMessage.NAME_NOT_BLANK)
//@Pattern(regexp = PatternRegex.DEV_NAME_REGEX, message = DevValidMessage.NAME_FORMAT_ERROR)
private String name;
@ApiModelProperty(value = "设备模式,字典表(数字、模拟、比对)", required = true)
@NotBlank(message = DevValidMessage.PATTERN_NOT_BLANK)
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DevValidMessage.PATTERN_FORMAT_ERROR)
private String pattern;
@ApiModelProperty(value = "设备类型,字典表", required = true)
@NotBlank(message = DevValidMessage.DEV_TYPE_NOT_BLANK)
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DevValidMessage.DEV_TYPE_FORMAT_ERROR)
private String devType;
@ApiModelProperty(value = "设备通道数", required = true)
@NotNull(message = DevValidMessage.DEV_CHNS_NOT_NULL)
@Min(value = 1, message = DevValidMessage.DEV_CHNS_RANGE_ERROR)
private Integer devChns;
@ApiModelProperty(value = "额定电压V", required = true)
@NotNull(message = DevValidMessage.DEV_VOLT_NOT_NULL)
private Float devVolt;
@ApiModelProperty(value = "额定电流A", required = true)
@NotNull(message = DevValidMessage.DEV_CURR_NOT_NULL)
private Float devCurr;
@ApiModelProperty(value = "设备厂家,字典表", required = true)
//@NotBlank(message = DevValidMessage.MANUFACTURER_NOT_BLANK)
//@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DevValidMessage.MANUFACTURER_FORMAT_ERROR)
private String manufacturer;
@ApiModelProperty(value = "出厂日期", required = true)
//@NotBlank(message = DevValidMessage.CREATEDATETIME_NOT_NULL)
//@DateTimeStrValid(format = "yyyy-MM-dd", message = DevValidMessage.CREATEDATETIME_FORMAT_ERROR)
private String createDate;
@ApiModelProperty(value = "设备序列号", required = true)
@NotBlank(message = DevValidMessage.FACTORYNO_NOT_BLANK)
private String createId;
@ApiModelProperty(value = "固件版本", required = true)
//@NotBlank(message = DevValidMessage.FIRMWARE_NOT_BLANK)
private String hardwareVersion;
@ApiModelProperty(value = "软件版本", required = true)
//@NotBlank(message = DevValidMessage.SOFTWARE_NOT_BLANK)
private String softwareVersion;
@ApiModelProperty(value = "通讯协议", required = true)
@NotBlank(message = DevValidMessage.PROTOCOL_NOT_BLANK)
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DevValidMessage.PROTOCOL_FORMAT_ERROR)
private String protocol;
@ApiModelProperty(value = "IP地址", required = true)
@NotBlank(message = DevValidMessage.IP_NOT_BLANK)
@Pattern(regexp = PatternRegex.IP_REGEX, message = DevValidMessage.IP_FORMAT_ERROR)
private String ip;
@ApiModelProperty(value = "端口号", required = true)
@NotNull(message = DevValidMessage.PORT_NOT_NULL)
@Range(min = 1, max = 65535, message = DevValidMessage.PORT_RANGE_ERROR)
private Integer port;
@ApiModelProperty(value = "装置是否为加密版本", required = true)
@NotNull(message = DevValidMessage.ENCRYPTION_NOT_NULL)
@Min(value = 0, message = DevValidMessage.ENCRYPTION_FLAG_FORMAT_ERROR)
@Max(value = 1, message = DevValidMessage.ENCRYPTION_FLAG_FORMAT_ERROR)
private Integer encryptionFlag;
@ApiModelProperty("装置识别码3ds加密")
private String series;
@ApiModelProperty("装置秘钥3ds加密")
private String devKey;
@ApiModelProperty("样品编号")
private String sampleId;
@ApiModelProperty(value = "送样日期")
@DateTimeStrValid(message = DevValidMessage.ARRIVE_DATE_FORMAT_ERROR)
private String arrivedDate;
@ApiModelProperty("所属地市名称")
private String cityName;
@ApiModelProperty("所属供电公司名称")
private String gdName;
@ApiModelProperty("所属电站名称")
private String subName;
@ApiModelProperty("报告路径")
private String reportPath;
@ApiModelProperty("设备关键信息二维码")
private String qrCode;
@ApiModelProperty(value = "检测次数,默认为0", required = true)
@NotNull(message = DevValidMessage.RECHECK_NUM_NOT_NULL)
@Min(value = 0, message = DevValidMessage.RECHECK_NUM_FORMAT_ERROR)
private Integer reCheckNum;
@ApiModelProperty("是否支持系数校准")
@Min(value = 0, message = DevValidMessage.FACTOR_FLAG_FORMAT_ERROR)
@Max(value = 1, message = DevValidMessage.FACTOR_FLAG_FORMAT_ERROR)
private String factorFlag;
@ApiModelProperty("监测点台账列表")
@Valid
private List<PqMonitorParam> monitorList;
@ApiModelProperty("icdId")
private String icdId;
//
// @ApiModelProperty("power")
// private String power;
@ApiModelProperty("预投计划")
private String preinvestmentPlan;
/**
* 更新操作实体
*/
@Data
@EqualsAndHashCode(callSuper = true)
public static class UpdateParam extends PqDevParam {
@ApiModelProperty(value = "id", required = true)
@NotBlank(message = DevValidMessage.ID_NOT_BLANK)
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DevValidMessage.ID_FORMAT_ERROR)
private String id;
// @ApiModelProperty("检测状态")
// @Min(value = 0, message = DevValidMessage.CHECK_STATE_FORMAT_ERROR)
// @Max(value = 3, message = DevValidMessage.CHECK_STATE_FORMAT_ERROR)
// private Integer checkState;
//
// @ApiModelProperty("检测结果")
// @Min(value = 0, message = DevValidMessage.CHECK_RESULT_FORMAT_ERROR)
// @Max(value = 2, message = DevValidMessage.CHECK_RESULT_FORMAT_ERROR)
// private Integer checkResult;
//
// @ApiModelProperty("报告状态")
// @Min(value = 0, message = DevValidMessage.REPORT_STATE_FORMAT_ERROR)
// @Max(value = 2, message = DevValidMessage.REPORT_STATE_FORMAT_ERROR)
// private Integer reportState;
//
// @ApiModelProperty("归档状态")
// @Min(value = 0, message = DevValidMessage.DOCUMENT_STATE_FORMAT_ERROR)
// @Max(value = 1, message = DevValidMessage.DOCUMENT_STATE_FORMAT_ERROR)
// private Integer documentState;
}
/**
* 分页查询实体
*/
@Data
@EqualsAndHashCode(callSuper = true)
public static class QueryParam extends BaseParam {
@ApiModelProperty("名称")
// @Pattern(regexp = PatternRegex.DEV_NAME_REGEX, message = DevValidMessage.NAME_FORMAT_ERROR)
private String name;
@ApiModelProperty(value = "设备模式,字典表(数字、模拟、比对)")
private String pattern;
@ApiModelProperty("设备厂家")
private String manufacturer;
@ApiModelProperty("检测计划ID")
//@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DevValidMessage.PLAN_ID_FORMAT_ERROR)
private String planId;
@ApiModelProperty("检测状态列表")
private List<
@Min(value = 0, message = DevValidMessage.CHECK_STATE_FORMAT_ERROR)
@Max(value = 3, message = DevValidMessage.CHECK_STATE_FORMAT_ERROR) Integer> checkStateList;
@ApiModelProperty("检测结果")
@Min(value = 0, message = DevValidMessage.CHECK_RESULT_FORMAT_ERROR)
@Max(value = 2, message = DevValidMessage.CHECK_RESULT_FORMAT_ERROR)
private Integer checkResult;
@ApiModelProperty("报告状态")
@Min(value = 0, message = DevValidMessage.REPORT_STATE_FORMAT_ERROR)
@Max(value = 2, message = DevValidMessage.REPORT_STATE_FORMAT_ERROR)
private Integer reportState;
}
@Data
public static class DeleteParam {
@ApiModelProperty(value = "ids")
private List<@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DevValidMessage.ID_FORMAT_ERROR) String> ids;
@ApiModelProperty(value = "设备模式,字典表(数字、模拟、比对)", required = true)
@NotBlank(message = DevValidMessage.PATTERN_NOT_BLANK)
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DevValidMessage.PATTERN_FORMAT_ERROR)
private String pattern;
}
@Data
public static class BindPlanParam {
@ApiModelProperty("检测计划ID")
@NotNull(message = DevValidMessage.PLAN_ID_NOT_NULL)
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DevValidMessage.PLAN_ID_FORMAT_ERROR)
private String planId;
@ApiModelProperty("被检设备ID列表")
@NotNull(message = DevValidMessage.PQ_DEV_IDS_NOT_NULL)
private List<String> pqDevIds;
}
}

View File

@@ -0,0 +1,219 @@
package com.njcn.gather.device.pojo.po;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.njcn.db.mybatisplus.bo.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* @author caozehui
* @date 2024/11/06
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("pq_dev")
public class PqDev extends BaseEntity implements Serializable {
private static final long serialVersionUID = -45763424394344208L;
/**
* 主键装置序号ID
*/
private String id;
/**
* 设备名称
*/
private String name;
/**
* 设备模式,字典表(数字、模拟、比对)
*/
private String pattern;
/**
* 设备类型,字典表
*/
private String devType;
/**
* 设备通道数
*/
private Integer devChns;
/**
* 额定电压V
*/
private Double devVolt;
/**
* 额定电流A
*/
private Double devCurr;
/**
* 设备厂家,字典表
*/
private String manufacturer;
/**
* 出厂日期
*/
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate createDate;
/**
* 设备序列号
*/
private String createId;
/**
* 固件版本
*/
private String hardwareVersion;
/**
* 软件版本
*/
private String softwareVersion;
/**
* 通讯协议,字典表(MMS、PODIF)
*/
private String protocol;
/**
* IP地址
*/
private String ip;
/**
* 端口号
*/
private Integer port;
/**
* 装置是否为加密版本
*/
private Integer encryptionFlag;
/**
* 装置识别码3ds加密
*/
@TableField(fill = FieldFill.UPDATE)
private String series;
/**
* 装置秘钥3ds加密
*/
@TableField(fill = FieldFill.UPDATE)
private String devKey;
/**
* 样品编号
*/
private String sampleId;
/**
* 送样日期
*/
@TableField(updateStrategy = FieldStrategy.IGNORED)
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate arrivedDate;
/**
* 所属地市名称
*/
private String cityName;
/**
* 所属供电公司名称
*/
private String gdName;
/**
* 所属电站名称
*/
private String subName;
/**
* 检测状态
*/
private Integer checkState;
/**
* 检测结果
*/
private Integer checkResult;
/**
* 报告状态
*/
private Integer reportState;
/**
* 报告路径
*/
private String reportPath;
/**
* 设备关键信息二维码
*/
private String qrCode;
/**
* 检测次数,默认为0
*/
@TableField(value = "ReCheck_Num")
private Integer reCheckNum;
/**
* 状态0-删除 1-正常
*/
private Integer state;
/**
* 检测计划id
*/
private String planId;
/**
* 守时检测结果0:不合格, 1:合格)
*/
private Integer timeCheckResult;
/**
* 是否支持系数校准0:不支持,1:支持)
*/
private Integer factorFlag;
/**
* 系数校准结果0:不合格1:合格)
*/
private Integer factorCheckResult;
private String icdId;
@TableField("Check_Time")
private LocalDateTime checkTime;
@TableField("Preinvestment_Plan")
private String preinvestmentPlan;
}

View File

@@ -0,0 +1,59 @@
package com.njcn.gather.device.pojo.vo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.njcn.common.pojo.constant.PatternRegex;
import com.njcn.gather.device.pojo.constant.DevValidMessage;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
/**
* @author caozehui
* @data 2025-01-15
*/
@Data
public class CNDevExcel {
@Excel(name = "预投计划*", width = 20, orderNum = "1")
private String preinvestmentPlan;
@Excel(name = "设备编号*", width = 20, orderNum = "2")
@NotBlank(message = DevValidMessage.NAME_NOT_BLANK)
@Pattern(regexp = PatternRegex.DEV_NAME_REGEX, message = DevValidMessage.NAME_FORMAT_ERROR)
private String name;
@Excel(name = "设备类型*", width = 20, orderNum = "3")
@NotBlank(message = DevValidMessage.DEV_TYPE_NOT_BLANK)
private String devType;
@Excel(name = "通讯协议*", width = 15, orderNum = "4")
@NotBlank(message = DevValidMessage.PROTOCOL_NOT_BLANK)
private String protocol;
@Excel(name = "是否加密*", width = 20, replace = {"否_0", "是_1"}, orderNum = "5")
@NotNull(message = DevValidMessage.ENCRYPTION_NOT_NULL)
private Integer encryptionFlag;
@Excel(name = "识别码", width = 30, orderNum = "6")
private String series;
@Excel(name = "秘钥", width = 30, orderNum = "7")
private String devKey;
@Excel(name = "是否支持系数校准*", width = 25, replace = {"否_0", "是_1"}, orderNum = "8")
private Integer factorFlag;
@Excel(name = "IP地址*", width = 20, replace = {"否_0", "是_1"}, orderNum = "9")
@NotBlank(message = DevValidMessage.IP_NOT_BLANK)
@Pattern(regexp = PatternRegex.IP_REGEX, message = DevValidMessage.IP_FORMAT_ERROR)
private String ip;
@Excel(name = "端口号*", width = 15, orderNum = "10")
@NotNull(message = DevValidMessage.PORT_NOT_NULL)
@Range(min = 1, max = 65535, message = DevValidMessage.PORT_RANGE_ERROR)
private Integer port;
}

View File

@@ -0,0 +1,211 @@
package com.njcn.gather.device.pojo.vo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
import com.njcn.common.pojo.constant.PatternRegex;
import com.njcn.gather.monitor.pojo.vo.PqMonitorExcel;
import com.njcn.gather.device.pojo.constant.DevValidMessage;
import com.njcn.web.pojo.annotation.DateTimeStrValid;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;
/**
* @author caozehui
* @data 2024/11/7
*/
@Data
public class PqDevExcel implements Serializable {
private static final long serialVersionUID = 1L;
@Excel(name = "名称", width = 20, needMerge = true)
@NotBlank(message = DevValidMessage.NAME_NOT_BLANK)
@Pattern(regexp = PatternRegex.DEV_NAME_REGEX, message = DevValidMessage.NAME_FORMAT_ERROR)
private String name;
@Excel(name = "设备类型", width = 20, orderNum = "2", needMerge = true)
@NotBlank(message = DevValidMessage.DEV_TYPE_NOT_BLANK)
private String devType;
@Excel(name = "设备通道数", width = 20, orderNum = "3", needMerge = true)
@NotNull(message = DevValidMessage.DEV_CHNS_NOT_NULL)
private Integer devChns;
@Excel(name = "额定电压V", width = 15, orderNum = "4", needMerge = true)
@NotNull(message = DevValidMessage.DEV_VOLT_NOT_NULL)
private Float devVolt;
@Excel(name = "额定电流A", width = 15, orderNum = "5", needMerge = true)
@NotNull(message = DevValidMessage.DEV_CURR_NOT_NULL)
private Float devCurr;
@Excel(name = "设备厂家", width = 20, orderNum = "6", needMerge = true)
@NotBlank(message = DevValidMessage.MANUFACTURER_NOT_BLANK)
private String manufacturer;
@Excel(name = "设备序列号", width = 40, orderNum = "8", needMerge = true)
@NotBlank(message = DevValidMessage.FACTORYNO_NOT_BLANK)
private String createId;
@Excel(name = "固件版本", width = 15, orderNum = "9", needMerge = true)
@NotBlank(message = DevValidMessage.FIRMWARE_NOT_BLANK)
private String hardwareVersion;
@Excel(name = "软件版本", width = 15, orderNum = "10", needMerge = true)
@NotBlank(message = DevValidMessage.SOFTWARE_NOT_BLANK)
private String softwareVersion;
@Excel(name = "通讯协议", width = 15, orderNum = "11", needMerge = true)
@NotBlank(message = DevValidMessage.PROTOCOL_NOT_BLANK)
private String protocol;
@Excel(name = "IP地址", width = 20, orderNum = "12", needMerge = true)
@NotBlank(message = DevValidMessage.IP_NOT_BLANK)
@Pattern(regexp = PatternRegex.IP_REGEX, message = DevValidMessage.IP_FORMAT_ERROR)
private String ip;
@Excel(name = "端口号", orderNum = "13", needMerge = true)
@NotNull(message = DevValidMessage.PORT_NOT_NULL)
@Range(min = 1, max = 65535, message = DevValidMessage.PORT_RANGE_ERROR)
private Integer port;
@Excel(name = "是否为加密版本(否\\是)", width = 20, replace = {"否_0", "是_1"}, orderNum = "14", needMerge = true)
@NotNull(message = DevValidMessage.ENCRYPTION_NOT_NULL)
private Integer encryptionFlag;
@Excel(name = "识别码(当为加密版本时必填)", width = 30, orderNum = "15", needMerge = true)
private String series;
@Excel(name = "秘钥(当为加密版本时必填)", width = 30, orderNum = "16", needMerge = true)
private String devKey;
@Excel(name = "所属地市名称", width = 20, orderNum = "19", needMerge = true)
private String cityName;
@Excel(name = "所属供电公司名称", width = 20, orderNum = "20", needMerge = true)
private String gdName;
@Excel(name = "所属电站名称", width = 20, orderNum = "21", needMerge = true)
private String subName;
@Excel(name = "关键信息二维码", width = 20, orderNum = "30", needMerge = true)
private String qrCode;
@Excel(name = "检测次数", width = 15, orderNum = "31", needMerge = true)
@NotNull(message = DevValidMessage.RECHECK_NUM_NOT_NULL)
private Integer reCheckNum;
@Data
@EqualsAndHashCode(callSuper = true)
public static class ExportData extends PqDevExcel {
@Excel(name = "设备模式", width = 20, orderNum = "1", needMerge = true)
@NotBlank(message = DevValidMessage.PATTERN_NOT_BLANK)
private String pattern;
@Excel(name = "出厂日期yyyy-MM-dd", width = 25, format = "yyyy-MM-dd", orderNum = "7", needMerge = true)
@NotNull(message = DevValidMessage.CREATEDATETIME_NOT_NULL)
private LocalDate createDate;
@Excel(name = "是否支持系数校准(否\\是)", width = 15, replace = {"否_0", "是_1"}, orderNum = "22", needMerge = true)
private Integer factorFlag;
@Excel(name = "守时检测结果(不合格\\合格\\/", replace = {"不合格_0", "合格_1", "/_2"}, width = 15, orderNum = "23", needMerge = true)
private Integer timeCheckResult;
@Excel(name = "系数校准结果(不合格\\合格\\/", width = 15, replace = {"不合格_0", "合格_1", "/_2"}, orderNum = "24", needMerge = true)
private Integer factorCheckResult;
@Excel(name = "检测状态(未检\\检测中\\检测完成\\归档)", width = 15, replace = {"未检_0", "检测中_1", "检测完成_2", "归档_3"}, orderNum = "25", needMerge = true)
private Integer checkState;
@Excel(name = "检测结果(不符合\\符合\\未检)", width = 15, replace = {"不符合_0", "符合_1", "未检_2"}, orderNum = "26", needMerge = true)
private Integer checkResult;
@Excel(name = "报告状态(未生成\\已生成\\未检)", width = 15, replace = {"未生成_0", "已生成_1", "未检_2"}, orderNum = "27", needMerge = true)
private Integer reportState;
// @Excel(name = "归档状态(未归档\\归档)", width = 15, replace = {"未归档_0", "归档_1"}, orderNum = "28", needMerge = true)
// private Integer documentState;
@Excel(name = "报告路径", width = 20, orderNum = "29", needMerge = true)
private String reportPath;
}
/**
* 模拟式和比对式设备导出数据
*/
@Data
@EqualsAndHashCode(callSuper = true)
public static class SimulateOrDigitalExportData extends ExportData {
@Excel(name = "样品编号", width = 40, orderNum = "17", needMerge = true)
private String sampleId;
@Excel(name = "送样日期yyyy-MM-dd", width = 25, format = "yyyy-MM-dd", orderNum = "18", needMerge = true)
private LocalDate arrivedDate;
}
/**
* 比对式设备导出数据
*/
@Data
@EqualsAndHashCode(callSuper = true)
public static class ContrastExportData extends ExportData {
@ExcelCollection(name = "检测点台账", orderNum = "32")
List<PqMonitorExcel.ExportData> monitorList;
}
/**
* 被检设备导入数据
*/
@Data
@EqualsAndHashCode(callSuper = true)
public static class ImportData extends PqDevExcel {
@Excel(name = "出厂日期yyyy-MM-dd", width = 25, format = "yyyy-MM-dd", orderNum = "7", needMerge = true)
@NotNull(message = DevValidMessage.CREATEDATETIME_NOT_NULL)
@DateTimeStrValid(message = DevValidMessage.CREATEDATETIME_FORMAT_ERROR)
private String createDate;
@Excel(name = "是否支持系数校准(否\\是)", width = 15, replace = {"否_0", "是_1"}, orderNum = "22", needMerge = true)
@NotBlank(message = DevValidMessage.FACTOR_FLAG_NOT_BLANK)
private String factorFlag;
}
/**
* 模拟式和比对式设备导入数据
*/
@Data
@EqualsAndHashCode(callSuper = true)
public static class SimulateOrDigitalImportData extends ImportData {
@Excel(name = "样品编号", width = 40, orderNum = "17", needMerge = true)
private String sampleId;
@Excel(name = "送样日期yyyy-MM-dd", width = 25, format = "yyyy-MM-dd", orderNum = "18", needMerge = true)
@DateTimeStrValid(message = DevValidMessage.ARRIVE_DATE_FORMAT_ERROR)
private String arrivedDate;
}
/**
* 对比式设备导入数据
*/
@Data
@EqualsAndHashCode(callSuper = true)
public static class ContrastImportData extends ImportData {
@ExcelCollection(name = "检测点台账", orderNum = "32")
List<PqMonitorExcel.ImportData> monitorList;
}
}

View File

@@ -0,0 +1,91 @@
package com.njcn.gather.device.pojo.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.njcn.gather.monitor.pojo.po.PqMonitor;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author caozehui
* @data 2024-12-13
*/
@Data
public class PqDevVO {
private String id;
private String name;
private String pattern;
private String devType;
private Integer devChns;
private Float devVolt;
private Float devCurr;
private String manufacturer;
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate createDate;
private String createId;
private String hardwareVersion;
private String softwareVersion;
private String protocol;
private String ip;
private Integer port;
private Integer encryptionFlag;
private String series;
private String devKey;
private String sampleId;
@JsonFormat(pattern = "yyyy-MM-dd")
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate arrivedDate;
private String cityName;
private String gdName;
private String subName;
private Integer checkState;
private Integer checkResult;
private Integer reportState;
// private Integer documentState;
private String reportPath;
private String qrCode;
private Integer reCheckNum;
private List<PqMonitor> monitorList;
private LocalDateTime checkTime;
}

View File

@@ -0,0 +1,129 @@
package com.njcn.gather.device.pojo.vo;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.annotation.JSONField;
import com.njcn.gather.util.DeviceUtil;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author wr
* @description 预检测装置报文初始化
* @date 2024/12/12 11:21
*/
@Data
@NoArgsConstructor
public class PreDetection {
/**
* 装置ip
*/
@JSONField(serialize = false)
private String devId;
/**
* 装置ip
*/
@JSONField(serialize = false)
private String devName;
/**
* 装置ip
*/
@JSONField(name = "devIP")
private String devIP;
/**
* 装置端口
*/
@JSONField(name = "port")
private Integer port;
/**
* 设备类型,字典表
*/
@JSONField(name = "devType")
private String devType;
/**
* icd设备类型
*/
@JSONField(name = "icdType")
private String icdType;
/**
* 装置识别码3ds加密
*/
@JSONField(name = "devCode")
private String devCode;
/**
* 装置秘钥3ds加密
*/
@JSONField(name = "devKey")
private String devKey;
@JSONField(serialize = false)
private Integer devChns;
private Double devVolt;
private Double devCurr;
/**
* 监测点信息
*/
@JSONField(name = "monitorList")
private List<MonitorListDTO> monitorList;
@Data
@NoArgsConstructor
public static class MonitorListDTO {
/**
* 监测点id
*/
@JSONField(name = "lineId")
private String lineId;
/**
* 监测点线路号
*/
@JSONField(name = "line")
private Integer line;
/**
* 监测点线路号
*/
@JSONField(name = "pt")
private Integer pt;
/**
* 监测点线路号
*/
@JSONField(name = "pt")
private Integer ct;
}
public String getDevKey() {
if (StrUtil.isNotBlank(devKey)) {
String key = DeviceUtil.decoderString(1, devKey);
if (StrUtil.isNotBlank(key)) {
return key;
}
}
return null;
}
public String getDevCode() {
if (StrUtil.isNotBlank(devCode)) {
String code = DeviceUtil.decoderString(1, devCode);
if (StrUtil.isNotBlank(code)) {
return code;
}
}
return null;
}
}

View File

@@ -0,0 +1,210 @@
package com.njcn.gather.device.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.gather.device.pojo.enums.TimeCheckResultEnum;
import com.njcn.gather.device.pojo.param.PqDevParam;
import com.njcn.gather.device.pojo.po.PqDev;
import com.njcn.gather.device.pojo.vo.CNDevExcel;
import com.njcn.gather.device.pojo.vo.PqDevExcel;
import com.njcn.gather.device.pojo.vo.PqDevVO;
import com.njcn.gather.device.pojo.vo.PreDetection;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author caozehui
* @date 2024/11/06
*/
public interface IPqDevService extends IService<PqDev> {
/**
* 分页查询被检设备列表
*
* @param queryParam 查询参数
* @return 分页数据,包含被检设备列表
*/
Page<PqDev> listPqDevs(PqDevParam.QueryParam queryParam);
/**
* 新增被检设备信息
*
* @param pqDevParam 被检设备信息
* @return 新增成功返回true否则返回false
*/
boolean addPqDev(PqDevParam pqDevParam);
/**
* 修改被检设备信息
*
* @param updateParam 被检设备信息
* @return 修改成功返回true否则返回false
*/
boolean updatePqDev(PqDevParam.UpdateParam updateParam);
/**
* 删除被检设备信息
*
* @param param 被检设备信息
* @return 删除成功返回true否则返回false
*/
boolean deletePqDev(PqDevParam.DeleteParam param);
/**
* 批量更新被检设备守时检测结果
*
* @param ids 被检设备id列表
* @param result 守时检测结果
* @return 更新成功返回true否则返回false
*/
boolean updatePqDevTimeCheckResult(List<String> ids, TimeCheckResultEnum result);
/**
* 获取模拟式||数字式设备导出时所需的数据
*
* @param queryParam 查询参数
* @return
*/
List<PqDevExcel.SimulateOrDigitalExportData> getSimulateOrDigitExportData(PqDevParam.QueryParam queryParam);
/**
* 获取比对式设备导出时所需的数据
*
* @param queryParam 查询参数
* @return 比对式设备导出时所需的数据
*/
List<PqDevExcel.ContrastExportData> getContrastExportData(PqDevParam.QueryParam queryParam);
/**
* 下载模板文件
*/
void downloadTemplate();
/**
* 批量导入被检设备信息
*
* @param sgEventExcels 批量导入的数据
*/
void importContrastData(List<PqDevExcel.ContrastImportData> sgEventExcels);
/**
* 批量导入被检设备信息
*
* @param sgEventExcels 批量导入的数据
*/
void importSimulateAndDigitalData(List<PqDevExcel.SimulateOrDigitalImportData> sgEventExcels);
/**
* 获取所有未绑定的设备
*
* @param pattern 模式Id
* @return 未绑定的设备列表
*/
List<Map<String, Object>> listUnbound(String pattern);
/**
* 根据计划id获取绑定的设备
*
* @param param 计划id
* @return 绑定的设备列表
*/
List<PqDev> listByPlanId(PqDevParam.QueryParam param);
/**
* 绑定计划
*
* @param planId 计划id
* @param devIds 设备id列表
* @return 绑定成功返回true否则返回false
*/
Integer bind(String planId, List<String> devIds);
/**
* 获取饼图数据
*
* @param planId 检测计划id
* @return 饼图数据
*/
//List<List<Map<String, Object>>> getPieData(String planId);
/**
* 根据id获取被检设备信息
*
* @param id 被检设备id
* @return
*/
PqDevVO getPqDevById(String id);
/**
* 获取所有非未检测状态的设备
*
* @return 所有非未检测状态的设备列表
*/
List<PqDev> listUnchecked();
/**
* 可视化各种id回显字典值解码等操作
*
* @param sourceList
*/
void visualize(List<PqDev> sourceList);
/**
* 逆向可视化
*/
void reverseVisualize(List<PqDev> sourceList);
/**
* 获取装置信息和装置下监测点信息
*
* @param devIds
* @return: java.util.List<com.njcn.gather.device.pojo.vo.PreDetection>
* @Author: wr
* @Date: 2024/12/12 15:50
*/
List<PreDetection> getDevInfo(@Param("devIds") List<String> devIds);
/**
* 设备归档操作
* @param id 设备id
* @return 归档成功返回true否则返回false
*/
boolean documented(List<String> id);
/**
* 正式监测完成,修改中断状态
* @param ids
* @param valueType
* @param code
* @return
*/
boolean updateResult(List<String> ids,List<String> valueType ,String code);
void updatePqDevReportState(String devId, int i);
int countUnReportDev(String planId);
/**
* 导出灿能二楼设备数据
*
* @param queryParam
*/
void exportCNDev(PqDevParam.QueryParam queryParam);
/**
* 下载灿能二楼设备模板文件
*/
void downloadCNDevTemplate();
/**
* 导入灿能二楼设备数据
*
* @param cnDevExcelList 灿能二楼设备数据列表
* @param patternId 模式Id
*/
void importCNDev(List<CNDevExcel> cnDevExcelList, String patternId);
}

View File

@@ -0,0 +1,877 @@
package com.njcn.gather.device.service.impl;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.common.pojo.poi.PullDown;
import com.njcn.db.mybatisplus.constant.DbConstant;
import com.njcn.gather.device.mapper.PqDevMapper;
import com.njcn.gather.device.pojo.enums.TimeCheckResultEnum;
import com.njcn.gather.device.pojo.param.PqDevParam;
import com.njcn.gather.device.pojo.po.PqDev;
import com.njcn.gather.device.pojo.vo.CNDevExcel;
import com.njcn.gather.device.pojo.vo.PqDevExcel;
import com.njcn.gather.device.pojo.vo.PqDevVO;
import com.njcn.gather.device.pojo.vo.PreDetection;
import com.njcn.gather.device.service.IPqDevService;
import com.njcn.gather.monitor.pojo.po.PqMonitor;
import com.njcn.gather.monitor.pojo.vo.PqMonitorExcel;
import com.njcn.gather.monitor.service.IPqMonitorService;
import com.njcn.gather.device.pojo.enums.*;
import com.njcn.gather.type.entity.DevType;
import com.njcn.gather.type.service.IDevTypeService;
import com.njcn.gather.storage.service.DetectionDataDealService;
import com.njcn.gather.system.config.pojo.po.SysTestConfig;
import com.njcn.gather.system.config.service.ISysTestConfigService;
import com.njcn.gather.system.dictionary.pojo.po.DictData;
import com.njcn.gather.system.dictionary.pojo.po.DictType;
import com.njcn.gather.system.dictionary.service.IDictDataService;
import com.njcn.gather.system.dictionary.service.IDictTypeService;
import com.njcn.gather.util.DeviceUtil;
import com.njcn.web.factory.PageFactory;
import com.njcn.web.utils.ExcelUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author caozehui
* @date 2024/11/06
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class PqDevServiceImpl extends ServiceImpl<PqDevMapper, PqDev> implements IPqDevService {
private final IDictDataService dictDataService;
private final IPqMonitorService pqMonitorService;
private final DetectionDataDealService detectionDataDealService;
private final IDevTypeService devTypeService;
private final ISysTestConfigService sysTestConfigService;
private final IDictTypeService dictTypeService;
@Override
public Page<PqDev> listPqDevs(PqDevParam.QueryParam queryParam) {
Page<PqDev> page = this.page(new Page<>(PageFactory.getPageNum(queryParam), PageFactory.getPageSize(queryParam)), this.getQueryWrapper(queryParam));
page.getRecords().forEach(p -> {
if (ObjectUtil.isNotNull(p.getSeries())) {
p.setSeries(DeviceUtil.decoderString(1, p.getSeries()));
}
if (ObjectUtil.isNotNull(p.getDevKey())) {
p.setDevKey(DeviceUtil.decoderString(1, p.getDevKey()));
}
});
return page;
}
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean addPqDev(PqDevParam pqDevParam) {
this.checkRepeat(pqDevParam, false);
PqDev pqDev = new PqDev();
BeanUtil.copyProperties(pqDevParam, pqDev);
if (pqDevParam.getEncryptionFlag() == 1) {
if (StrUtil.isNotBlank(pqDevParam.getSeries()) && StrUtil.isNotBlank(pqDevParam.getDevKey())) {
pqDev.setSeries(DeviceUtil.encodeString(1, pqDev.getSeries()));
pqDev.setDevKey(DeviceUtil.encodeString(1, pqDev.getDevKey()));
} else {
throw new BusinessException(DevResponseEnum.SERIES_AND_DEVKEY_NOT_BLANK);
}
}
// 新增时默认设置
pqDev.setTimeCheckResult(TimeCheckResultEnum.UNKNOWN.getValue());
pqDev.setFactorCheckResult(FactorCheckResultEnum.UNKNOWN.getValue());
pqDev.setCheckState(CheckStateEnum.UNCHECKED.getValue());
pqDev.setReportState(DevReportStateEnum.UNCHECKED.getValue());
// pqDev.setDocumentState(DevDocumentStateEnum.UNDOCUMENTED.getValue());
pqDev.setCheckResult(CheckResultEnum.UNCHECKED.getValue());
String id = UUID.randomUUID().toString().replaceAll("-", "");
pqDev.setId(id);
// 比对式设备添加监测点
if (PatternEnum.CONTRAST.getValue().equals(dictDataService.getDictDataById(pqDevParam.getPattern()).getCode())) {
if (ObjectUtil.isNotEmpty(pqDevParam.getMonitorList())) {
pqMonitorService.addPqMonitorByDevId(id, pqDevParam.getMonitorList());
}
}
pqDev.setState(DataStateEnum.ENABLE.getCode());
return this.save(pqDev);
}
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean updatePqDev(PqDevParam.UpdateParam updateParam) {
this.checkRepeat(updateParam, true);
PqDev pqDev = new PqDev();
BeanUtil.copyProperties(updateParam, pqDev);
if (pqDev.getEncryptionFlag() == 1) {
if (StrUtil.isNotBlank(pqDev.getSeries()) && StrUtil.isNotBlank(pqDev.getDevKey())) {
pqDev.setSeries(DeviceUtil.encodeString(1, pqDev.getSeries()));
pqDev.setDevKey(DeviceUtil.encodeString(1, pqDev.getDevKey()));
} else {
throw new BusinessException(DevResponseEnum.SERIES_AND_DEVKEY_NOT_BLANK);
}
}
// 比对式设备修改监测点
if (PatternEnum.CONTRAST.getValue().equals(dictDataService.getDictDataById(updateParam.getPattern()).getCode())) {
if (ObjectUtil.isNotEmpty(updateParam.getMonitorList())) {
pqMonitorService.updatePqMonitorByDevId(updateParam.getId(), updateParam.getMonitorList());
}
}
return this.updateById(pqDev);
}
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean deletePqDev(PqDevParam.DeleteParam param) {
if (PatternEnum.CONTRAST.getValue().equals(dictDataService.getDictDataById(param.getPattern()).getCode())) {
for (String id : param.getIds()) {
if (ObjectUtils.isEmpty(pqMonitorService.listPqMonitorByDevId(id))) {
throw new BusinessException(DevResponseEnum.PQ_DEV_HAS_MONITOR);
}
}
}
if (CollUtil.isNotEmpty(param.getIds())) {
MPJLambdaWrapper<PqDev> queryWrapper = new MPJLambdaWrapper<>();
queryWrapper.selectAll(PqDev.class)
.selectAs("t1.Name", PqDev::getPlanId)
.leftJoin("ad_plan t1 on t1.Id = t.Plan_Id")
.in(PqDev::getId, param.getIds())
.eq(PqDev::getState, DataStateEnum.ENABLE.getCode());
List<PqDev> devList = this.baseMapper.selectJoinList(PqDev.class, queryWrapper);
Map<String, List<PqDev>> collect = devList.stream().filter(x -> StrUtil.isNotBlank(x.getPlanId())).collect(Collectors.groupingBy(PqDev::getPlanId));
StringBuffer str;
if (CollUtil.isNotEmpty(collect)) {
str = new StringBuffer();
collect.forEach((k, v) -> {
str.append(k + ": ");
for (int i = 0; i < v.size(); i++) {
if ( i==v.size()-1) {
str.append(v.get(i).getName());
} else {
str.append(v.get(i).getName() + ",");
}
}
str.append(" &&");
});
} else {
str = null;
}
if (ObjectUtil.isNotNull(str)) {
throw new BusinessException(DevResponseEnum.DEVICE_DELETE, str.toString());
}
return this.lambdaUpdate().set(PqDev::getState, DataStateEnum.DELETED.getCode()).in(PqDev::getId, param.getIds()).update();
}
return true;
}
@Override
@Transactional(rollbackFor = {Exception.class})
public boolean updatePqDevTimeCheckResult(List<String> ids, TimeCheckResultEnum result) {
return this.lambdaUpdate().set(PqDev::getTimeCheckResult, result.getValue()).in(PqDev::getId, ids).update();
}
@Override
public List<PqDevExcel.SimulateOrDigitalExportData> getSimulateOrDigitExportData(PqDevParam.QueryParam queryParam) {
List<PqDev> pqDevs = this.list(this.getQueryWrapper(queryParam));
if (ObjectUtil.isNotNull(pqDevs)) {
this.visualize(pqDevs);
List<PqDevExcel.SimulateOrDigitalExportData> pqDevExcels = BeanUtil.copyToList(pqDevs, PqDevExcel.SimulateOrDigitalExportData.class);
return pqDevExcels;
} else {
return Collections.emptyList();
}
}
@Override
public List<PqDevExcel.ContrastExportData> getContrastExportData(PqDevParam.QueryParam queryParam) {
List<PqDev> pqDevs = this.list(this.getQueryWrapper(queryParam));
if (ObjectUtil.isNotEmpty(pqDevs)) {
this.visualize(pqDevs);
List<PqDevExcel.ContrastExportData> pqDevExcels = BeanUtil.copyToList(pqDevs, PqDevExcel.ContrastExportData.class);
for (int i = 0; i < pqDevs.size(); i++) {
List<PqMonitorExcel.ExportData> monitorExportList = BeanUtil.copyToList(pqMonitorService.listPqMonitorByDevId(pqDevs.get(i).getId()), PqMonitorExcel.ExportData.class);
monitorExportList.forEach(monitor -> {
monitor.setPtType(dictDataService.getDictDataById(monitor.getPtType()).getName());
});
pqDevExcels.get(i).setMonitorList(monitorExportList);
}
return pqDevExcels;
} else {
return Collections.emptyList();
}
}
@Override
public void downloadTemplate() {
ExcelUtil.exportExcel("被检设备模板.xlsx", PqDevExcel.ContrastImportData.class, Collections.emptyList());
}
@Override
@Transactional(rollbackFor = {Exception.class})
public void importContrastData(List<PqDevExcel.ContrastImportData> pqDevExcelList) {
List<PqDev> devList = new ArrayList<>();
List<PqMonitor> monitorList = new ArrayList<>();
String patternId = dictDataService.getDictDataByName(PatternEnum.CONTRAST.getMsg()).getId();
pqDevExcelList.forEach(pqDevExcel -> {
PqDev pqDev = new PqDev();
BeanUtil.copyProperties(pqDevExcel, pqDev);
pqDev.setId(UUID.randomUUID().toString().replaceAll("-", ""));
pqDev.setPattern(patternId);
// pqDev.setTimeCheckResult(TimeCheckResultEnum.UNKNOWN.getValue());
// pqDev.setFactorCheckResult(FactorCheckResultEnum.UNKNOWN.getValue());
// pqDev.setCheckState(CheckStateEnum.UNCHECKED.getValue());
// pqDev.setReportState(DevReportStateEnum.UNCHECKED.getValue());
// pqDev.setDocumentState(DevDocumentStateEnum.UNDOCUMENTED.getValue());
// pqDev.setCheckResult(CheckResultEnum.UNCHECKED.getValue());
devList.add(pqDev);
// 新增与被检设备绑定的监测点
List<PqMonitor> monitors = pqDevExcel.getMonitorList().stream()
.map(monitor -> {
PqMonitor monitorPo = new PqMonitor();
BeanUtil.copyProperties(monitor, monitorPo);
monitorPo.setId(UUID.randomUUID().toString().replaceAll("-", ""));
monitorPo.setDevId(pqDev.getId());
monitorPo.setPtType(dictDataService.getDictDataByName(monitor.getPtType()).getId());
return monitorPo;
}).collect(Collectors.toList());
monitorList.addAll(monitors);
});
//逆向可视化
this.reverseVisualize(devList);
this.saveBatch(devList);
pqMonitorService.saveBatch(monitorList);
}
@Override
@Transactional(rollbackFor = {Exception.class})
public void importSimulateAndDigitalData(List<PqDevExcel.SimulateOrDigitalImportData> pqDevExcelList) {
List<PqDev> pqDevList = BeanUtil.copyToList(pqDevExcelList, PqDev.class);
//逆向可视化
this.reverseVisualize(pqDevList);
this.saveBatch(pqDevList);
}
@Override
public List<Map<String, Object>> listUnbound(String pattern) {
List<PqDev> pqDevList = this.lambdaQuery()
.eq(PqDev::getPattern, pattern)
.eq(PqDev::getState, DataStateEnum.ENABLE.getCode())
.isNull(PqDev::getPlanId)
.orderByAsc(PqDev::getCreateTime).list();
List<Map<String, Object>> result = pqDevList.stream().map(pqDev -> {
Map<String, Object> map = new HashMap<>();
map.put("id", pqDev.getId());
map.put("name", pqDev.getName());
return map;
}).collect(Collectors.toList());
return result;
}
@Override
public List<PqDev> listByPlanId(PqDevParam.QueryParam param) {
if (StrUtil.isBlank(param.getPlanId())) {
return Collections.emptyList();
}
List<PqDev> pqDevList = this.lambdaQuery()
.eq(PqDev::getPlanId, param.getPlanId())
.like(StrUtil.isNotBlank(param.getName()), PqDev::getName, param.getName())
.in(ObjectUtil.isNotEmpty(param.getCheckStateList()), PqDev::getCheckState, param.getCheckStateList())
.eq(ObjectUtil.isNotNull(param.getCheckResult()), PqDev::getCheckResult, param.getCheckResult())
.eq(ObjectUtil.isNotNull(param.getCheckResult()), PqDev::getCheckResult, param.getCheckResult())
.eq(ObjectUtil.isNotNull(param.getReportState()), PqDev::getReportState, param.getReportState())
.eq(PqDev::getState, DataStateEnum.ENABLE.getCode())
.orderByAsc(PqDev::getCreateTime)
.list();
// List<Map<String, Object>> result = pqDevList.stream().map(pqDev -> {
// Map<String, Object> map = new HashMap<>();
// map.put("id", pqDev.getId());
// map.put("name", pqDev.getName());
// return map;
// }).collect(Collectors.toList());
return pqDevList;
}
@Override
@Transactional(rollbackFor = {Exception.class})
public Integer bind(String planId, List<String> devIds) {
//先将这个绑定的计划全部剔除掉
this.lambdaUpdate().set(PqDev::getPlanId, null).eq(PqDev::getPlanId, planId).update();
//然后进行状态绑定
if (ObjectUtil.isNotEmpty(devIds)) {
this.lambdaUpdate().set(PqDev::getPlanId, planId).in(PqDev::getId, devIds).update();
List<PqDev> list = this.list(new LambdaQueryWrapper<PqDev>().in(PqDev::getId, devIds));
//判断是否有处了未检的其他设备
List<Integer> notUnchecked = list.stream().map(PqDev::getCheckState).filter(x -> !x.equals(CheckStateEnum.UNCHECKED.getValue())).distinct().collect(Collectors.toList());
if (CollUtil.isNotEmpty(notUnchecked)) {
List<Integer> unchecked = list.stream().map(PqDev::getCheckState).filter(x -> x.equals(CheckStateEnum.UNCHECKED.getValue())).distinct().collect(Collectors.toList());
if (CollUtil.isNotEmpty(unchecked)) {
return CheckStateEnum.CHECKING.getValue();
}
List<Integer> checking = list.stream().map(PqDev::getCheckState).filter(x -> x.equals(CheckStateEnum.CHECKING.getValue())).distinct().collect(Collectors.toList());
if (checking.size() == notUnchecked.size()) {
return CheckStateEnum.CHECKING.getValue();
}
List<Integer> checked = list.stream().map(PqDev::getCheckState).filter(x -> x.equals(CheckStateEnum.CHECKED.getValue()) ||
x.equals(CheckStateEnum.DOCUMENTED.getValue())
).distinct().collect(Collectors.toList());
if (checked.size() == notUnchecked.size()) {
return CheckStateEnum.CHECKED.getValue();
}
}
}
return CheckStateEnum.UNCHECKED.getValue();
}
// @Override
// public List getPieData(String planId) {
// List<PqDev> pqDevList = this.lambdaQuery().eq(PqDev::getPlanId, planId).eq(PqDev::getState, DataStateEnum.ENABLE.getCode()).list();
// Map<Integer, Long> checkStateMap = pqDevList.stream().collect(Collectors.groupingBy(PqDev::getCheckState, Collectors.counting()));
// Map<Integer, Long> checkResultMap = pqDevList.stream().collect(Collectors.groupingBy(PqDev::getCheckResult, Collectors.counting()));
// Map<Integer, Long> reportStateMap = pqDevList.stream().collect(Collectors.groupingBy(PqDev::getReportState, Collectors.counting()));
//
// List<Map<String, Object>> checkStateData = getCheckStatePieData(checkStateMap);
// List<Map<String, Object>> checkResultData = getCheckResultPieData(checkResultMap);
// List<Map<String, Object>> reportStateData = getReportStatePieData(reportStateMap);
//
// List<List<Map<String, Object>>> result = new ArrayList<>();
// result.add(checkStateData);
// result.add(checkResultData);
// result.add(reportStateData);
// return result;
// }
@Override
public PqDevVO getPqDevById(String id) {
PqDev pqDev = this.getById(id);
PqDevVO pqDevVO = new PqDevVO();
BeanUtil.copyProperties(pqDev, pqDevVO);
List<PqMonitor> monitorList = pqMonitorService.listPqMonitorByDevId(id);
if (ObjectUtil.isNotEmpty(monitorList)) {
pqDevVO.setMonitorList(monitorList);
}
return pqDevVO;
}
@Override
public List<PqDev> listUnchecked() {
return this.lambdaQuery()
.eq(PqDev::getCheckState, CheckStateEnum.UNCHECKED.getValue())
.eq(PqDev::getState, DataStateEnum.ENABLE.getCode())
.orderByAsc(PqDev::getCreateTime).list();
}
@Override
public void visualize(List<PqDev> sourceList) {
sourceList.forEach(pqDev -> {
if (StrUtil.isNotBlank(pqDev.getPattern())) {
DictData dictData = dictDataService.getDictDataById(pqDev.getPattern());
if (ObjectUtil.isNotNull(dictData)) {
pqDev.setPattern(dictData.getName());
}
}
if (StrUtil.isNotBlank(pqDev.getDevType())) {
DevType devType = devTypeService.getById(pqDev.getDevType());
if (ObjectUtil.isNotNull(devType)) {
pqDev.setDevType(devType.getName());
}
}
if (StrUtil.isNotBlank(pqDev.getManufacturer())) {
DictData dictData = dictDataService.getDictDataById(pqDev.getManufacturer());
if (ObjectUtil.isNotNull(dictData)) {
pqDev.setManufacturer(dictData.getName());
}
}
if (StrUtil.isNotBlank(pqDev.getProtocol())) {
DictData dictData = dictDataService.getDictDataById(pqDev.getProtocol());
if (ObjectUtil.isNotNull(dictData)) {
pqDev.setProtocol(dictData.getName());
}
}
if (StrUtil.isNotBlank(pqDev.getSeries())) {
pqDev.setSeries(DeviceUtil.decoderString(1, pqDev.getSeries()));
}
if (StrUtil.isNotBlank(pqDev.getDevKey())) {
pqDev.setDevKey(DeviceUtil.decoderString(1, pqDev.getDevKey()));
}
});
}
@Override
public void reverseVisualize(List<PqDev> sourceList) {
sourceList.forEach(pqDev -> {
// if (StrUtil.isNotBlank(pqDev.getPattern())) {
// DictData dictData = dictDataService.getDictDataByName(pqDev.getPattern());
// if (ObjectUtil.isNotNull(dictData)) {
// pqDev.setPattern(dictData.getId());
// }
// }
if (StrUtil.isNotBlank(pqDev.getDevType())) {
DevType devType = devTypeService.getById(pqDev.getDevType());
if (ObjectUtil.isNotNull(devType)) {
pqDev.setDevType(devType.getName());
}
}
if (StrUtil.isNotBlank(pqDev.getManufacturer())) {
DictData dictData = dictDataService.getDictDataByName(pqDev.getManufacturer());
if (ObjectUtil.isNotNull(dictData)) {
pqDev.setManufacturer(dictData.getId());
}
}
if (StrUtil.isNotBlank(pqDev.getProtocol())) {
DictData dictData = dictDataService.getDictDataByName(pqDev.getProtocol());
if (ObjectUtil.isNotNull(dictData)) {
pqDev.setProtocol(dictData.getId());
}
}
if (StrUtil.isNotBlank(pqDev.getSeries())) {
pqDev.setSeries(DeviceUtil.encodeString(1, pqDev.getSeries()));
}
if (StrUtil.isNotBlank(pqDev.getDevKey())) {
pqDev.setDevKey(DeviceUtil.encodeString(1, pqDev.getDevKey()));
}
pqDev.setState(DataStateEnum.ENABLE.getCode());
pqDev.setTimeCheckResult(TimeCheckResultEnum.UNKNOWN.getValue());
pqDev.setFactorCheckResult(FactorCheckResultEnum.UNKNOWN.getValue());
pqDev.setCheckState(CheckStateEnum.UNCHECKED.getValue());
pqDev.setReportState(DevReportStateEnum.UNCHECKED.getValue());
// pqDev.setDocumentState(DevDocumentStateEnum.UNDOCUMENTED.getValue());
pqDev.setCheckResult(CheckResultEnum.UNCHECKED.getValue());
});
}
/**
* 获取查询条件wrapper
*
* @param queryParam 查询条件
* @return
*/
private Wrapper getQueryWrapper(PqDevParam.QueryParam queryParam) {
QueryWrapper<PqDev> queryWrapper = new QueryWrapper<>();
if (ObjectUtil.isNotNull(queryParam)) {
queryWrapper
.like(StrUtil.isNotBlank(queryParam.getName()), "pq_dev.name", queryParam.getName())
.eq(StrUtil.isNotBlank(queryParam.getPattern()), "pq_dev.pattern", queryParam.getPattern())
.eq(StrUtil.isNotBlank(queryParam.getManufacturer()), "pq_dev.manufacturer", queryParam.getManufacturer())
.between(ObjectUtil.isAllNotEmpty(queryParam.getSearchBeginTime(), queryParam.getSearchEndTime()), "pq_dev.Create_Date", queryParam.getSearchBeginTime(), queryParam.getSearchEndTime());
//排序
if (ObjectUtil.isAllNotEmpty(queryParam.getSortBy(), queryParam.getOrderBy())) {
queryWrapper.orderBy(true, queryParam.getOrderBy().equals(DbConstant.ASC), StrUtil.toUnderlineCase(queryParam.getSortBy()));
}
}
queryWrapper.eq("pq_dev.state", DataStateEnum.ENABLE.getCode()).orderBy(true, true, "pq_dev.Create_Time");
return queryWrapper;
}
@Override
public List<PreDetection> getDevInfo(List<String> devIds) {
List<PreDetection> preDetections = this.baseMapper.selectDevInfo(devIds);
if (devIds.size() != preDetections.size()) {
throw new BusinessException(DevResponseEnum.DEVICE_DIS_ERROR);
}
for (PreDetection preDetection : preDetections) {
List<PreDetection.MonitorListDTO> monitorList = preDetection.getMonitorList();
if (CollUtil.isEmpty(monitorList)) {
PreDetection.MonitorListDTO monitorListDTO;
for (int i = 1; i <= preDetection.getDevChns(); i++) {
monitorListDTO = new PreDetection.MonitorListDTO();
monitorListDTO.setLineId(preDetection.getDevIP() + "_" + i);
monitorListDTO.setLine(i);
monitorListDTO.setPt(1);
monitorListDTO.setCt(1);
monitorList.add(monitorListDTO);
}
preDetection.setMonitorList(monitorList);
}
}
return preDetections;
}
@Override
// @Transactional(rollbackFor = {Exception.class})
public boolean documented(List<String> ids) {
if (CollUtil.isNotEmpty(ids)) {
for (String id : ids) {
// 只有检测完成的设备才可以进行归档
PqDev pqDev = this.getById(id);
if (ObjectUtil.isNotNull(pqDev)) {
if (!pqDev.getCheckState().equals(CheckStateEnum.CHECKED.getValue())) {
throw new BusinessException(DevResponseEnum.DEV_UN_CHECKED);
}
if (!pqDev.getReportState().equals(DevReportStateEnum.GENERATED.getValue())) {
throw new BusinessException(DevResponseEnum.DEV_UN_REPORT);
}
boolean update = this.lambdaUpdate()
.set(PqDev::getCheckState, CheckStateEnum.DOCUMENTED.getValue())
.eq(PqDev::getId, id)
.update();
if (update) {
// 判断计划下所有设备是否都已归档,如果是则将计划改为已完成
// 查询该计划下所有设备的检测状态,是否有不为归档的
LambdaQueryWrapper<PqDev> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PqDev::getPlanId, pqDev.getPlanId())
.eq(PqDev::getState, DataStateEnum.ENABLE.getCode())
.ne(PqDev::getCheckState, CheckStateEnum.DOCUMENTED.getValue());
int count = this.count(queryWrapper);
if (count == 0) {
// 如果非归档状态的设备数量为0则更新计划已完成
this.baseMapper.finishPlan(pqDev.getPlanId());
}
}
} else {
throw new BusinessException(DevResponseEnum.DEV_UN_CHECKED);
}
}
}
return true;
}
@Override
public boolean updateResult(List<String> ids, List<String> valueType, String code) {
if (CollUtil.isNotEmpty(ids)) {
SysTestConfig config = sysTestConfigService.getOneConfig();
Map<String, Integer> result = detectionDataDealService.devResult(ids, valueType, code);
List<PqDev> list = this.list(new LambdaQueryWrapper<PqDev>().in(PqDev::getId, ids));
for (PqDev pqDev : list) {
if (result.containsKey(pqDev.getId())) {
Integer checkState;
if (pqDev.getReCheckNum() >= config.getMaxTime()) {
// 装置报告生成 todo...
this.baseMapper.updateReportState(pqDev.getId());
// 装置归档
checkState = CheckStateEnum.DOCUMENTED.getValue();
} else {
checkState = CheckStateEnum.CHECKED.getValue();
}
this.update(new LambdaUpdateWrapper<PqDev>()
.set(PqDev::getReCheckNum, pqDev.getReCheckNum() + 1)
.set(PqDev::getCheckState, checkState)
.set(PqDev::getCheckResult, result.get(pqDev.getId()))
.set(PqDev::getCheckTime, LocalDateTime.now())
.set(PqDev::getReportState, DevReportStateEnum.NOT_GENERATED.getValue())
.eq(PqDev::getId, pqDev.getId()));
if (pqDev.getCheckState().equals(CheckStateEnum.DOCUMENTED.getValue())) {
// 判断计划下所有设备是否都已归档,如果是则将计划改为已完成
// 查询该计划下所有设备的检测状态,是否有不为归档的
LambdaQueryWrapper<PqDev> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PqDev::getPlanId, pqDev.getPlanId())
.eq(PqDev::getState, DataStateEnum.ENABLE.getCode())
.ne(PqDev::getCheckState, CheckStateEnum.DOCUMENTED.getValue());
int count = this.count(queryWrapper);
if (count == 0) {
// 如果非归档状态的设备数量为0则更新计划已完成
this.baseMapper.finishPlan(pqDev.getPlanId());
}
}
}
}
}
return true;
}
@Override
public void updatePqDevReportState(String devId, int reportState) {
LambdaUpdateWrapper<PqDev> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(PqDev::getId, devId)
.set(PqDev::getReportState, reportState);
this.update(updateWrapper);
}
@Override
public int countUnReportDev(String planId) {
// 查询该计划下所有设备的检测状态,是否有未生成的
LambdaQueryWrapper<PqDev> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PqDev::getPlanId, planId)
.eq(PqDev::getState, DataStateEnum.ENABLE.getCode())
.ne(PqDev::getReportState, DevReportStateEnum.GENERATED.getValue());
return this.count(queryWrapper);
}
@Override
public void exportCNDev(PqDevParam.QueryParam queryParam) {
List<PqDev> pqDevs = this.list(this.getQueryWrapper(queryParam));
List<CNDevExcel> pqDevExcels = null;
if (ObjectUtil.isNotEmpty(pqDevs)) {
this.visualizeCNDev(pqDevs);
pqDevExcels = BeanUtil.copyToList(pqDevs, CNDevExcel.class);
}
ExcelUtil.exportExcelPullDown(new ExportParams(), "被检设备导出数据.xlsx", this.getCNDevPullDownList(), CNDevExcel.class, ObjectUtil.isEmpty(pqDevExcels) ? new ArrayList<>() : pqDevExcels);
}
@Override
public void downloadCNDevTemplate() {
ExcelUtil.exportExcelPullDown(new ExportParams(), "被检设备模板.xlsx", this.getCNDevPullDownList(), CNDevExcel.class, new ArrayList<>());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void importCNDev(List<CNDevExcel> cnDevExcelList, String patternId) {
List<PqDev> oldDevList = BeanUtil.copyToList(cnDevExcelList, PqDev.class);
//逆向可视化
this.reverseVisualizeCNDev(oldDevList);
List<PqDev> newDevList = new ArrayList<>();
PqDevParam param = new PqDevParam.UpdateParam();
oldDevList.forEach(pqDev -> {
pqDev.setCreateId(pqDev.getName());
pqDev.setTimeCheckResult(TimeCheckResultEnum.UNKNOWN.getValue());
pqDev.setFactorCheckResult(FactorCheckResultEnum.UNKNOWN.getValue());
pqDev.setCheckState(CheckStateEnum.UNCHECKED.getValue());
pqDev.setReportState(DevReportStateEnum.UNCHECKED.getValue());
pqDev.setCheckResult(CheckResultEnum.UNCHECKED.getValue());
pqDev.setPattern(patternId);
pqDev.setState(DataStateEnum.ENABLE.getCode());
if (pqDev.getEncryptionFlag() == 1) {
if (StrUtil.isNotBlank(pqDev.getSeries()) && StrUtil.isNotBlank(pqDev.getDevKey())) {
pqDev.setSeries(DeviceUtil.encodeString(1, pqDev.getSeries()));
pqDev.setDevKey(DeviceUtil.encodeString(1, pqDev.getDevKey()));
} else {
throw new BusinessException(DevResponseEnum.SERIES_AND_DEVKEY_NOT_BLANK);
}
}
String name = pqDev.getName();
if (name.contains("-")) {
String[] split = name.split("-");
if (split.length == 2) {
long start = Long.parseLong(split[0]);
long end = Long.parseLong(split[1]);
// 避免起始大于结束
if (start > end) {
long temp = start;
start = end;
end = temp;
}
for (long i = start; i <= end; i++) {
PqDev dev = new PqDev();
BeanUtil.copyProperties(pqDev, dev);
dev.setName(String.valueOf(i));
dev.setCreateId(String.valueOf(i));
param.setName(dev.getName());
param.setCreateId(dev.getName());
param.setDevType(dev.getDevType());
this.checkRepeat(param, false);
long count = newDevList.stream().filter(d -> d.getName().equals(dev.getName())).count();
if (count == 0) {
newDevList.add(dev);
}
}
} else {
throw new BusinessException(DevResponseEnum.IMPORT_DATA_FORMAT_FAIL);
}
} else {
param.setName(pqDev.getName());
param.setCreateId(pqDev.getCreateId());
param.setDevType(pqDev.getDevType());
this.checkRepeat(param, false);
long count = newDevList.stream().filter(dev -> dev.getName().equals(pqDev.getName())).count();
if (count == 0) {
newDevList.add(pqDev);
}
}
});
this.saveBatch(newDevList);
}
/**
* 获取检测状态饼状图数据
*
* @param map 检测状态分组map
* @return 检测状态饼状图数据
*/
// private List<Map<String, Object>> getCheckStatePieData(Map<Integer, Long> map) {
// List<Map<String, Object>> result = new ArrayList<>();
// for (CheckStateEnum e : CheckStateEnum.values()) {
// Map<String, Object> temp = new HashMap<>();
// temp.put("name", e.getMsg());
// temp.put("value", map.getOrDefault(e.getValue(), 0L));
// result.add(temp);
// }
// return result;
// }
/**
* 获取检测结果饼状图数据
*
* @param map 检测结果分组map
* @return 检测结果饼状图数据
*/
// private List<Map<String, Object>> getCheckResultPieData(Map<Integer, Long> map) {
// List<Map<String, Object>> result = new ArrayList<>();
// for (CheckResultEnum e : CheckResultEnum.values()) {
// Map<String, Object> temp = new HashMap<>();
// temp.put("name", e.getMsg());
// temp.put("value", map.getOrDefault(e.getValue(), 0L));
// result.add(temp);
// }
// return result;
// }
/**
* 获取报告状态饼状图数据
*
* @param map 报告状态分组map
* @return 报告状态饼状图数据
*/
// private List<Map<String, Object>> getReportStatePieData(Map<Integer, Long> map) {
// List<Map<String, Object>> result = new ArrayList<>();
// for (DevReportStateEnum e : DevReportStateEnum.values()) {
// Map<String, Object> temp = new HashMap<>();
// temp.put("name", e.getMsg());
// temp.put("value", map.getOrDefault(e.getValue(), 0L));
// result.add(temp);
// }
// return result;
// }
/**
* 检查设备是否重复
*
* @param param 设备参数
* @param isExcludeSelf 是否排除自己
*/
private void checkRepeat(PqDevParam param, boolean isExcludeSelf) {
QueryWrapper<PqDev> queryWrapper = new QueryWrapper<>();
queryWrapper
.eq("state", DataStateEnum.ENABLE.getCode())
.eq("Dev_Type", param.getDevType())
.and(q -> q.eq("name", param.getName()).or()
.eq("Create_Id", param.getCreateId())); //设备序列号重复
// .eq("pattern", param.getPattern())
// .eq("manufacturer", param.getManufacturer())
// .eq("Dev_Type", param.getDevType()).or()
if (isExcludeSelf) {
if (param instanceof PqDevParam.UpdateParam) {
queryWrapper.ne("id", ((PqDevParam.UpdateParam) param).getId());
}
}
int count = this.count(queryWrapper);
if (count > 0) {
throw new BusinessException(DevResponseEnum.PQ_DEV_REPEAT);
}
}
private List<PullDown> getCNDevPullDownList() {
List<PullDown> pullDowns = new ArrayList<>();
// 预投计划
List<DictData> dictDataList = null;
PullDown pullDown = null;
DictType dictType = dictTypeService.getByCode("Preinvestment_Plan");
if (ObjectUtil.isNotNull(dictType)) {
dictDataList = dictDataService.getDictDataByTypeId(dictType.getId());
pullDown = new PullDown();
pullDown.setFirstCol(0);
pullDown.setLastCol(0);
pullDown.setStrings(dictDataList.stream().map(DictData::getName).collect(Collectors.toList()));
pullDowns.add(pullDown);
}
// 设备类型
List<DevType> devTypeList = devTypeService.listAll();
pullDown = new PullDown();
pullDown.setFirstCol(2);
pullDown.setLastCol(2);
pullDown.setStrings(devTypeList.stream().map(DevType::getName).collect(Collectors.toList()));
pullDowns.add(pullDown);
// 通讯协议
dictType = dictTypeService.getByCode("Protocol");
if (ObjectUtil.isNotNull(dictType)) {
dictDataList = dictDataService.getDictDataByTypeId(dictType.getId());
pullDown = new PullDown();
pullDown.setFirstCol(3);
pullDown.setLastCol(3);
pullDown.setStrings(dictDataList.stream().map(DictData::getName).collect(Collectors.toList()));
pullDowns.add(pullDown);
}
// 是否加密
pullDown = new PullDown();
pullDown.setFirstCol(4);
pullDown.setLastCol(4);
pullDown.setStrings(Arrays.asList("", ""));
pullDowns.add(pullDown);
// 是否支持系数校准
pullDown = new PullDown();
pullDown.setFirstCol(7);
pullDown.setLastCol(7);
pullDown.setStrings(Arrays.asList("", ""));
pullDowns.add(pullDown);
return pullDowns;
}
/**
* 可视化-灿能二楼设备
*
* @param pqDevs
*/
private void visualizeCNDev(List<PqDev> pqDevs) {
pqDevs.forEach(pqDev -> {
pqDev.setPreinvestmentPlan(dictDataService.getDictDataById(pqDev.getPreinvestmentPlan()).getName());
pqDev.setDevType(devTypeService.getById(pqDev.getDevType()).getName());
pqDev.setProtocol(dictDataService.getDictDataById(pqDev.getProtocol()).getName());
});
}
/**
* 逆向可视化-灿能二楼设备
*
* @param pqDevs
*/
public void reverseVisualizeCNDev(List<PqDev> pqDevs) {
pqDevs.forEach(pqDev -> {
pqDev.setPreinvestmentPlan(dictDataService.getDictDataByName(pqDev.getPreinvestmentPlan()).getId());
DevType devType = devTypeService.getByName(pqDev.getDevType());
pqDev.setDevType(devType.getId());
pqDev.setIcdId(devType.getIcd());
pqDev.setDevVolt(devType.getDevVolt());
pqDev.setDevCurr(devType.getDevCurr());
pqDev.setDevChns(devType.getDevChns());
pqDev.setProtocol(dictDataService.getDictDataByName(pqDev.getProtocol()).getId());
});
}
}