检测计划相关功能代码

This commit is contained in:
caozehui
2025-07-18 10:04:43 +08:00
parent c9ac33864a
commit 55793dcecd
32 changed files with 1150 additions and 328 deletions

View File

@@ -1,17 +1,27 @@
package com.njcn.gather.plan.controller;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
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.DataStateEnum;
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.enums.CommonEnum;
import com.njcn.gather.device.pojo.param.PqDevParam;
import com.njcn.gather.device.pojo.po.PqStandardDev;
import com.njcn.gather.device.pojo.vo.PqDevVO;
import com.njcn.gather.device.service.IPqDevService;
import com.njcn.gather.plan.pojo.param.AdPlanParam;
import com.njcn.gather.plan.pojo.po.AdPlan;
import com.njcn.gather.plan.pojo.vo.AdPlanVO;
import com.njcn.gather.plan.service.IAdPlanService;
import com.njcn.gather.type.pojo.po.DevType;
import com.njcn.gather.type.service.IDevTypeService;
import com.njcn.web.controller.BaseController;
import com.njcn.web.utils.FileUtil;
import com.njcn.web.utils.HttpResultUtil;
@@ -28,6 +38,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -42,15 +53,17 @@ import java.util.Map;
public class AdPlanController extends BaseController {
private final IAdPlanService adPlanService;
private final IPqDevService pqDevService;
private final IDevTypeService devTypeService;
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/list")
@ApiOperation("分页查询检测计划")
@ApiImplicitParam(name = "queryParam", value = "查询参数", required = true)
public HttpResult<Page<AdPlanVO>> list(@RequestBody @Validated AdPlanParam.QueryParam queryParam) {
public HttpResult<List<AdPlanVO>> list(@RequestBody @Validated AdPlanParam.QueryParam queryParam) {
String methodDescribe = getMethodDescribe("list");
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, queryParam);
Page<AdPlanVO> result = adPlanService.listAdPlan(queryParam);
List<AdPlanVO> result = adPlanService.listAdPlan(queryParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@@ -77,6 +90,7 @@ public class AdPlanController extends BaseController {
String methodDescribe = getMethodDescribe("update");
LogUtil.njcnDebug(log, "{},修改数据为:{}", methodDescribe, updateParam);
boolean result = adPlanService.updateAdPlan(updateParam);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
} else {
@@ -87,11 +101,11 @@ public class AdPlanController extends BaseController {
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.DELETE)
@PostMapping("/delete")
@ApiOperation("删除检测计划")
@ApiImplicitParam(name = "ids", value = "检测计划id", required = true)
public HttpResult<Boolean> delete(@RequestBody List<String> ids) {
@ApiImplicitParam(name = "ids", value = "计划id列表", required = true)
public HttpResult<Boolean> delete(@RequestBody List<String> ids, @RequestParam("pattern") String pattern) {
String methodDescribe = getMethodDescribe("delete");
LogUtil.njcnDebug(log, "{}删除ID数据为{}", methodDescribe, String.join(StrUtil.COMMA, ids));
boolean result = adPlanService.deleteAdPlan(ids);
LogUtil.njcnDebug(log, "{}删除ID数据为{}", methodDescribe, String.join(StrUtil.COMMA, ids), pattern);
boolean result = adPlanService.deleteAdPlan(ids, pattern);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
} else {
@@ -146,7 +160,7 @@ public class AdPlanController extends BaseController {
boolean result = adPlanService.importPlan(file, patternId, response);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
}else{
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
}
}
@@ -172,19 +186,178 @@ public class AdPlanController extends BaseController {
adPlanService.analyse(ids);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/splitPlan")
@ApiOperation("拆分检测计划")
@ApiImplicitParam(name = "param", value = "检测计划", required = true)
public HttpResult<Boolean> splitPlan(@RequestBody @Validated AdPlanParam.SplitParam param) {
String methodDescribe = getMethodDescribe("splitPlan");
LogUtil.njcnDebug(log, "{}拆分数据为:{}", methodDescribe, param);
boolean result = adPlanService.splitPlan(param);
@PostMapping("/listByPlanId")
@ApiOperation("查询出所有已绑定的设备")
@ApiImplicitParam(name = "planId", value = "计划id", required = true)
public HttpResult<List<PqDevVO>> listByPlanId(@RequestBody @Validated PqDevParam.QueryParam param) {
String methodDescribe = getMethodDescribe("listByPlanId");
LogUtil.njcnDebug(log, "{}查询数据为:{}", methodDescribe, param);
AdPlan plan = adPlanService.getById(param.getPlanIdList().get(0));
if (CommonEnum.FATHER_ID.getValue().equals(plan.getFatherPlanId())) {
List<AdPlan> planList = adPlanService.lambdaQuery().eq(AdPlan::getFatherPlanId, param.getPlanIdList().get(0)).list();
List<String> planIdList = planList.stream().map(AdPlan::getId).collect(Collectors.toList());
param.getPlanIdList().addAll(planIdList);
}
List<PqDevVO> pqDevVOList = pqDevService.listByPlanId(param);
List<AdPlan> planList = adPlanService.listByIds(param.getPlanIdList());
pqDevVOList.forEach(pqDevVO -> {
DevType devType = devTypeService.getById(pqDevVO.getDevType());
if (ObjectUtil.isNotNull(devType)) {
pqDevVO.setDevType(devType.getName());
pqDevVO.setDevVolt(devType.getDevVolt());
pqDevVO.setDevCurr(devType.getDevCurr());
pqDevVO.setDevChns(devType.getDevChns());
}
if (StrUtil.isNotBlank(pqDevVO.getPlanId())) {
AdPlan plan1 = planList.stream().filter(p -> p.getId().equals(pqDevVO.getPlanId())).findFirst().get();
if (ObjectUtil.isNotNull(plan1) && plan.getId().equals(plan1.getFatherPlanId())) {
pqDevVO.setBoundPlanName(plan1.getName());
pqDevVO.setAssign(DataStateEnum.ENABLE.getCode());
} else {
pqDevVO.setAssign(DataStateEnum.DELETED.getCode());
}
} else {
pqDevVO.setAssign(DataStateEnum.DELETED.getCode());
}
});
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, pqDevVOList, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/listDevByPlanId")
@ApiOperation("根据计划id分页查询被检设备")
@ApiImplicitParam(name = "queryParam", value = "查询参数", required = true)
public HttpResult<Page<PqDevVO>> listDevByPlanId(@RequestBody @Validated PqDevParam.QueryParam param) {
String methodDescribe = getMethodDescribe("listDevByPlanId");
LogUtil.njcnDebug(log, "{},查询数据为:{}", methodDescribe, param);
AdPlan plan = adPlanService.getById(param.getPlanIdList().get(0));
if (CommonEnum.FATHER_ID.getValue().equals(plan.getFatherPlanId())) {
List<AdPlan> planList = adPlanService.lambdaQuery().eq(AdPlan::getFatherPlanId, param.getPlanIdList().get(0)).list();
List<String> planIdList = planList.stream().map(AdPlan::getId).collect(Collectors.toList());
param.getPlanIdList().addAll(planIdList);
}
Page<PqDevVO> pqDevVOPage = pqDevService.listPqDevs(param);
List<AdPlan> planList = adPlanService.listByIds(param.getPlanIdList());
for (PqDevVO pqDevVO : pqDevVOPage.getRecords()) {
if (StrUtil.isNotBlank(pqDevVO.getPlanId())) {
AdPlan plan1 = planList.stream().filter(p -> p.getId().equals(pqDevVO.getPlanId())).findFirst().get();
if (!ObjectUtil.isNotNull(plan1) && plan.getId().equals(plan1.getFatherPlanId())) {
pqDevVO.setBoundPlanName(plan1.getName());
pqDevVO.setAssign(DataStateEnum.ENABLE.getCode());
} else {
pqDevVO.setAssign(DataStateEnum.DELETED.getCode());
}
} else {
pqDevVO.setAssign(DataStateEnum.DELETED.getCode());
}
}
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, pqDevVOPage, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.UPDATE)
@GetMapping("/updateSubPlanName")
@ApiOperation("修改子计划名称")
@ApiImplicitParams({
@ApiImplicitParam(name = "planId", value = "计划id", required = true),
@ApiImplicitParam(name = "name", value = "计划名称", required = true)
})
public HttpResult<Boolean> updateSubPlanName(@RequestParam("planId") String planId, @RequestParam("name") String name) {
String methodDescribe = getMethodDescribe("updateSubPlanName");
LogUtil.njcnDebug(log, "{},修改数据为:{}", methodDescribe, planId, name);
boolean result = adPlanService.updateSubPlanName(planId, name);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
}
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@GetMapping("/getUnBoundStandardDev")
@ApiOperation("根据父计划ID获取未被子计划绑定的标准设备")
@ApiImplicitParam(name = "fatherPlanId", value = "父计划ID", required = true)
public HttpResult<List<PqStandardDev>> getUnBoundStandardDev(@RequestParam("fatherPlanId") String fatherPlanId) {
String methodDescribe = getMethodDescribe("getUnBoundStandardDev");
LogUtil.njcnDebug(log, "{}父计划ID为{}", methodDescribe, fatherPlanId);
List<PqStandardDev> result = adPlanService.getUnBoundStandardDev(fatherPlanId);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@GetMapping("/getBoundStandardDev")
@ApiOperation("根据计划ID获取已绑定的标准设备")
@ApiImplicitParam(name = "planId", value = "计划ID", required = true)
public HttpResult<List<PqStandardDev>> getBoundStandardDev(@RequestParam("planId") String planId) {
String methodDescribe = getMethodDescribe("getUnBoundStandardDev");
LogUtil.njcnDebug(log, "{}计划ID为{}", methodDescribe, planId);
List<PqStandardDev> result = adPlanService.getBoundStandardDev(planId);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/updateBindStandardDev")
@ApiOperation("子计划绑定/解绑标准设备")
@ApiImplicitParam(name = "param", value = "绑定/解绑参数", required = true)
public HttpResult<Boolean> updateBindStandardDev(@RequestBody @Validated PqDevParam.BindPlanParam param) {
String methodDescribe = getMethodDescribe("updateBindStandardDev");
LogUtil.njcnDebug(log, "{},绑定/解绑参数为:{}", methodDescribe, param);
boolean result = adPlanService.updateBindStandardDev(param.getPlanId(), param.getDevIds());
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
}
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/updateBindDev")
@ApiOperation("子计划绑定/解绑被检设备")
@ApiImplicitParam(name = "param", value = "绑定/解绑参数", required = true)
public HttpResult<Boolean> updateBindDev(@RequestBody @Validated PqDevParam.BindPlanParam param) {
String methodDescribe = getMethodDescribe("updateBindDev");
LogUtil.njcnDebug(log, "{},绑定/解绑参数为:{}", methodDescribe, param);
boolean result = adPlanService.updateBindDev(param.getPlanId(), param.getDevIds());
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
}
}
// @OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.DELETE)
// @PostMapping("/deleteSubPlan")
// @ApiOperation("删除子计划")
// @ApiImplicitParam(name = "ids", value = "子计划id列表", required = true)
// public HttpResult<Boolean> deleteSubPlan(@RequestBody List<String> ids) {
// String methodDescribe = getMethodDescribe("deleteSubPlan");
// LogUtil.njcnDebug(log, "{}删除ID数据为{}", methodDescribe, String.join(StrUtil.COMMA, ids));
// boolean result = adPlanService.deleteAdPlan(ids);
// if (result) {
// return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
// } else {
// return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
// }
// }
@OperateInfo(operateType = OperateType.DOWNLOAD)
@PostMapping("/exportSubPlan")
@ApiOperation("导出子计划")
@ApiImplicitParam(name = "planId", value = "子计划id", required = true)
public void exportSubPlan(@RequestParam("planId") String planId, HttpServletResponse response) {
String methodDescribe = getMethodDescribe("exportSubPlan");
LogUtil.njcnDebug(log, "{}导出ID数据为{}", methodDescribe, planId);
adPlanService.exportSubPlan(planId, response);
}
}

View File

@@ -0,0 +1,24 @@
package com.njcn.gather.plan.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.njcn.gather.device.pojo.po.PqStandardDev;
import com.njcn.gather.plan.pojo.po.AdPlanStandardDev;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author caozehui
* @date 2025-07-16
*/
public interface AdPlanStandardDevMapper extends MPJBaseMapper<AdPlanStandardDev> {
/**
* 根据计划id查询标准设备列表
*
* @param planIdList
* @return
*/
List<PqStandardDev> listByPlanId(@Param("planIdList") List<String> planIdList);
}

View File

@@ -0,0 +1,17 @@
<?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.plan.mapper.AdPlanStandardDevMapper">
<select id="listByPlanId" resultType="com.njcn.gather.device.pojo.po.PqStandardDev">
select standard_dev.*
from ad_plan_standard_dev plan_std_dev left join pq_standard_dev standard_dev on plan_std_dev.Standard_Dev_Id = standard_dev.Id
<if test="planIdList!= null and planIdList.size() != 0">
where plan_std_dev.Plan_Id in
<foreach collection="planIdList" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</select>
</mapper>

View File

@@ -27,12 +27,7 @@ public class AdPlanParam {
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.PATTERN_FORMAT_ERROR)
private String pattern;
// @ApiModelProperty(value = "父计划ID")
// @Pattern(regexp = PatternRegex.SYSTEM_ID, message = DeviceValidMessage.PATTERN_FORMAT_ERROR)
// private String fatherPlanId;
@ApiModelProperty(value = "检测源ID列表", required = true)
@NotEmpty(message = DetectionValidMessage.SOURCE_IDS_NOT_EMPTY)
private List<@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.SOURCE_ID_FORMAT_ERROR) String> sourceIds;
@ApiModelProperty(value = "数据源ID列表", required = true)
@@ -40,8 +35,6 @@ public class AdPlanParam {
private List<String> datasourceIds;
@ApiModelProperty(value = "检测脚本ID", required = true)
@NotBlank(message = DetectionValidMessage.SCRIPT_ID_NOT_BLANK)
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.SCRIPT_ID_FORMAT_ERROR)
private String scriptId;
@ApiModelProperty(value = "误差体系ID", required = true)
@@ -56,7 +49,6 @@ public class AdPlanParam {
private Integer timeCheck;
@ApiModelProperty("被检设备ID列表")
@NotNull(message = DetectionValidMessage.PQ_DEV_IDS_NOT_NULL)
private List<String> devIds;
@ApiModelProperty(value = "是否关联报告")
@@ -70,6 +62,16 @@ public class AdPlanParam {
@NotBlank(message = DetectionValidMessage.DATA_RULE_NOT_BLANK)
private String dataRule;
@ApiModelProperty(value = "父计划ID")
private String fatherPlanId;
@ApiModelProperty(value = "标准设备ID列表")
private List<String> standardDevIds;
@ApiModelProperty(value = "测试项ID列表")
private List<@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.SOURCE_ID_FORMAT_ERROR)String> testItems;
/**
* 分页查询实体
*/
@@ -117,15 +119,4 @@ public class AdPlanParam {
private String planId;
private List<String> devIds;
}
@Data
public class SplitParam {
@ApiModelProperty(value = "id", required = true)
@NotBlank(message = DetectionValidMessage.ID_NOT_BLANK)
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.PID_FORMAT_ERROR)
private String pId;
@ApiModelProperty(value = "拆分后的计划", required = true)
private List<AdPlanParam> splitPlans;
}
}

View File

@@ -90,14 +90,25 @@ public class AdPlan extends BaseEntity implements Serializable {
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String reportTemplateId;
/**
* 数据处理原则。任意值、部分值、所有值、cp95值、平均值
*/
private String dataRule;
/**
* 状态0-删除 1-正常
*/
private Integer state;
/**
* 数据处理原则。任意值、部分值、所有值、cp95值、平均值
* 检测项ID中间使用英文逗号分割
*/
private String dataRule;
private String testItem;
/**
* 来源
*/
private String origin;
}

View File

@@ -0,0 +1,28 @@
package com.njcn.gather.plan.pojo.po;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* @author caozehui
* @date 2025-07-16
*/
@Data
@TableName("ad_plan_standard_dev")
public class AdPlanStandardDev implements Serializable {
private static final long serialVersionUID = 153286652772158825L;
/**
* 检测计划id
*/
private String planId;
/**
* 标准设备id
*/
private String standardDevId;
}

View File

@@ -41,7 +41,7 @@ public class AdPlanExcel {
@NotNull(message = DetectionValidMessage.TIMECHECK_NOT_NULL)
private Integer timeCheck;
@Excel(name = "关联报告模*", width = 20, replace = {"否_0", "是_1"}, needMerge = true, orderNum = "7")
@Excel(name = "关联报告模*", width = 20, replace = {"否_0", "是_1"}, needMerge = true, orderNum = "7")
@NotNull(message = DetectionValidMessage.ASSOCIATE_REPORT_NOT_NULL)
private Integer associateReport;

View File

@@ -1,5 +1,6 @@
package com.njcn.gather.plan.pojo.vo;
import com.njcn.gather.device.pojo.vo.PqDevVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -118,4 +119,34 @@ public class AdPlanVO {
* 检测进度
*/
private Float progress;
/**
* 标准设备ID列表
*/
private List<String> standardDevIds;
/**
* 标准设备名称
*/
private String standardDevNameStr;
/**
* 测试项id列表
*/
private List<String> testItems;
/**
* 测试项name列表
*/
private String testItemNameStr;
/**
* 计划绑定的被检设备列表
*/
private List<PqDevVO> pqDevVOList;
/**
* 来源
*/
private String origin;
}

View File

@@ -0,0 +1,43 @@
package com.njcn.gather.plan.pojo.vo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
/**
* @author caozehui
* @data 2025-07-16
*/
@Data
public class ContrastPlanExcel {
private String id;
@Excel(name = "名称*", width = 30, orderNum = "1")
private String name;
@Excel(name = "标准设备*", width = 50, orderNum = "2")
private String standardDev;
@Excel(name = "数据源*", width = 50, orderNum = "3")
private String datasourceId;
@Excel(name = "检测项*", width = 50, orderNum = "4")
private String testItem;
@Excel(name = "误差体系*", width = 50, orderNum = "5")
private String errorSysId;
@Excel(name = "数据处理原则*", width = 20, orderNum = "6")
private String dataRule;
@Excel(name = "是否做守时检测*", width = 30, orderNum = "7")
private Integer timeCheck;
@Excel(name = "关联报告模板*", width = 30, orderNum = "8", replace = {"否_0", "是_1"})
private Integer associateReport;
@Excel(name = "报告模版(当关联报告模版为是时必填)", width = 40, orderNum = "9")
private String reportTemplateId;
}

View File

@@ -2,6 +2,8 @@ package com.njcn.gather.plan.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.gather.device.pojo.param.PqDevParam;
import com.njcn.gather.device.pojo.po.PqStandardDev;
import com.njcn.gather.plan.pojo.param.AdPlanParam;
import com.njcn.gather.plan.pojo.po.AdPlan;
import com.njcn.gather.plan.pojo.vo.AdPlanExcel;
@@ -24,7 +26,7 @@ public interface IAdPlanService extends IService<AdPlan> {
* @param queryParam 分页查询参数
* @return 分页查询结果
*/
Page<AdPlanVO> listAdPlan(AdPlanParam.QueryParam queryParam);
List<AdPlanVO> listAdPlan(AdPlanParam.QueryParam queryParam);
/**
* 新增检测计划
@@ -46,9 +48,11 @@ public interface IAdPlanService extends IService<AdPlan> {
* 删除检测计划
*
* @param ids 检测计划id列表
* @param pattern 模式Id
*
* @return 删除成功则返回true否则返回false
*/
boolean deleteAdPlan(List<String> ids);
boolean deleteAdPlan(List<String> ids,String pattern);
/**
* 根据模式查询检测计划
@@ -125,11 +129,56 @@ public interface IAdPlanService extends IService<AdPlan> {
*/
boolean importPlan(MultipartFile file, String patternId, HttpServletResponse response);
/**
* 拆分计划
* 根据父计划Id获取未被子计划绑定的标准设备
*
* @param param
* @param fatherPlanId
* @return
*/
boolean splitPlan(AdPlanParam.SplitParam param);
List<PqStandardDev> getUnBoundStandardDev(String fatherPlanId);
/**
* 根据计划Id获取已绑定标准设备
*
* @param planId
* @return
*/
List<PqStandardDev> getBoundStandardDev(String planId);
/**
* 修改子计划名称
*
* @param planId
* @param name
*
* @return
*/
boolean updateSubPlanName(String planId, String name);
/**
* 子计划绑定/解绑被检设备
*
* @param planId
* @param pqDevIds
* @return
*/
boolean updateBindDev(String planId, List<String> pqDevIds);
/**
* 子计划绑定/解绑标准设备
*
* @param planId
* @param standardDevIds
* @return
*/
boolean updateBindStandardDev(String planId, List<String> standardDevIds);
/**
* 根据计划Id导出子计划数据
*
* @param planId
* @param response
*/
void exportSubPlan(String planId, HttpServletResponse response);
}

View File

@@ -0,0 +1,65 @@
package com.njcn.gather.plan.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.gather.plan.pojo.po.AdPlanStandardDev;
import java.util.List;
/**
* @author caozehui
* @date 2025-07-16
*/
public interface IAdPlanStandardDevService extends IService<AdPlanStandardDev> {
/**
* 添加检测计划-标准设备关联关系
*
* @param planId
* @param standardDevIds
* @return
*/
boolean addAdPlanStandardDev(String planId, List<String> standardDevIds);
/**
* 修改检测计划-标准设备关联关系
*
* @param planId
* @param standardDevIds
* @return
*/
boolean updateAdPlanStandardDev(String planId, List<String> standardDevIds);
/**
* 删除检测计划-标准设备关联关系
*
* @param planIds
* @return
*/
boolean deleteAdPlanStandardDev(List<String> planIds);
/**
* 删除检测计划-标准设备关联关系
*
* @param planId
* @param standardDevIds
* @return
*/
boolean deleteAdPlanStandardDev(String planId, List<String> standardDevIds);
/**
* 根据检测计划id获取标准设备名称字符串
*
* @param id
* @return
*/
String getStandardDevNameStrByPlanId(String id);
/**
* 根据检测计划id获取关联关系
*
* @param planIds
* @return
*/
List<AdPlanStandardDev> listByPlanId(List<String> planIds);
}

View File

@@ -6,13 +6,13 @@ import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.CharsetUtil;
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.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.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.common.pojo.exception.BusinessException;
@@ -22,7 +22,9 @@ import com.njcn.gather.device.pojo.enums.*;
import com.njcn.gather.device.pojo.param.PqDevParam;
import com.njcn.gather.device.pojo.po.PqDev;
import com.njcn.gather.device.pojo.po.PqDevSub;
import com.njcn.gather.device.pojo.po.PqStandardDev;
import com.njcn.gather.device.pojo.vo.CNDevExcel;
import com.njcn.gather.device.pojo.vo.ContrastDevExcel;
import com.njcn.gather.device.pojo.vo.PqDevVO;
import com.njcn.gather.device.pojo.vo.ProvinceDevExcel;
import com.njcn.gather.device.service.IPqDevService;
@@ -30,15 +32,19 @@ import com.njcn.gather.device.service.IPqDevSubService;
import com.njcn.gather.err.pojo.po.PqErrSys;
import com.njcn.gather.err.service.IPqErrSysService;
import com.njcn.gather.plan.mapper.AdPlanMapper;
import com.njcn.gather.plan.mapper.AdPlanStandardDevMapper;
import com.njcn.gather.plan.pojo.enums.DataSourceEnum;
import com.njcn.gather.plan.pojo.enums.PlanReportStateEnum;
import com.njcn.gather.plan.pojo.param.AdPlanParam;
import com.njcn.gather.plan.pojo.po.AdPlan;
import com.njcn.gather.plan.pojo.po.AdPlanStandardDev;
import com.njcn.gather.plan.pojo.vo.AdPlanVO;
import com.njcn.gather.plan.pojo.vo.CNPlanExcel;
import com.njcn.gather.plan.pojo.vo.ContrastPlanExcel;
import com.njcn.gather.plan.pojo.vo.ProvincePlanExcel;
import com.njcn.gather.plan.service.IAdPlanService;
import com.njcn.gather.plan.service.IAdPlanSourceService;
import com.njcn.gather.plan.service.IAdPlanStandardDevService;
import com.njcn.gather.pojo.enums.DetectionResponseEnum;
import com.njcn.gather.report.pojo.po.PqReport;
import com.njcn.gather.script.pojo.po.PqScript;
@@ -61,7 +67,6 @@ import com.njcn.gather.system.dictionary.service.IDictTreeService;
import com.njcn.gather.system.dictionary.service.IDictTypeService;
import com.njcn.gather.type.pojo.po.DevType;
import com.njcn.gather.type.service.IDevTypeService;
import com.njcn.web.factory.PageFactory;
import com.njcn.web.utils.ExcelUtil;
import com.njcn.web.utils.HttpServletUtil;
import com.njcn.web.utils.PoiUtil;
@@ -109,63 +114,107 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
private final AdHarmonicService adHarmonicService;
private final PqDevMapper pqDevMapper;
private final IPqDevSubService pqDevSubService;
private final IAdPlanStandardDevService adPlanStandardDevService;
private final AdPlanStandardDevMapper adPlanStandardDevMapper;
private final IAdPlanStandardDevService adPlanContrastStandardDevService;
@Override
public Page<AdPlanVO> listAdPlan(AdPlanParam.QueryParam queryParam) {
Page<AdPlan> page1 = this.page(new Page<>(PageFactory.getPageNum(queryParam), PageFactory.getPageSize(queryParam)), this.getQueryWrapper(queryParam));
List<AdPlan> adPlans = page1.getRecords();
List<AdPlanVO> adPlanVOList = adPlans.stream().map(adPlan -> {
public List<AdPlanVO> listAdPlan(AdPlanParam.QueryParam queryParam) {
// Page<AdPlan> page1 = this.page(new Page<>(PageFactory.getPageNum(queryParam), PageFactory.getPageSize(queryParam)), );
// List<AdPlan> adPlans = page1.getRecords();
// List<AdPlanVO> adPlanVOList = adPlans.stream().map(adPlan -> {
// AdPlanVO adPlanVO = new AdPlanVO();
// BeanUtil.copyProperties(adPlan, adPlanVO);
// this.setAdPlanVO(adPlanVO, adPlan);
// return adPlanVO;
// }).collect(Collectors.toList());
//
// Page<AdPlanVO> page2 = new Page<>(PageFactory.getPageNum(queryParam), PageFactory.getPageSize(queryParam));
// page2.setTotal(page1.getTotal());
// page2.setOrders(page1.orders());
// page2.setPages(page1.getPages());
// page2.setRecords(adPlanVOList);
List<AdPlan> adPlanList = this.list(this.getQueryWrapper(queryParam));
List<AdPlanVO> planVOList = adPlanList.stream().map(adPlan -> {
AdPlanVO adPlanVO = new AdPlanVO();
BeanUtil.copyProperties(adPlan, adPlanVO);
adPlanVO.setCreateTime(adPlanVO.getCreateTime().replace("T", " "));
adPlanVO.setDatasourceIds(Arrays.asList(adPlan.getDatasourceId().split(StrUtil.COMMA)));
if (StrUtil.isNotBlank(adPlan.getReportTemplateId())) {
PqReport report = this.baseMapper.getPqReportById(adPlan.getReportTemplateId());
adPlanVO.setReportTemplateName(report.getName() + "_" + report.getVersion());
}
adPlanVO.setScriptName(pqScriptService.getPqScriptById(adPlanVO.getScriptId()).getName());
adPlanVO.setErrorSysName(pqErrSysService.getPqErrSysById(adPlanVO.getErrorSysId()).getName());
List<PqSource> pqSourceList = adPlanSourceService.listPqSourceByPlanId(adPlanVO.getId());
adPlanVO.setSourceIds(pqSourceList.stream().map(PqSource::getId).collect(Collectors.toList()));
adPlanVO.setSourceName(pqSourceList.stream().map(PqSource::getName).collect(Collectors.toList()));
PqDevParam.QueryParam queryParam1 = new PqDevParam.QueryParam();
queryParam1.setPlanId(adPlanVO.getId());
List<PqDevVO> pqDevVOList = pqDevMapper.selectByQueryParam(queryParam1);
if (CollUtil.isNotEmpty(pqDevVOList)) {
long count = pqDevVOList.stream().filter(pqDev -> CheckStateEnum.CHECKED.getValue().equals(pqDev.getCheckState())).count();
adPlanVO.setProgress((float) count / pqDevVOList.size());
} else {
adPlanVO.setProgress(0.0f);
}
this.setAdPlanVO(adPlanVO, adPlan);
return adPlanVO;
}).collect(Collectors.toList());
return planVOList;
}
Page<AdPlanVO> page2 = new Page<>(PageFactory.getPageNum(queryParam), PageFactory.getPageSize(queryParam));
page2.setTotal(page1.getTotal());
page2.setOrders(page1.orders());
page2.setPages(page1.getPages());
page2.setRecords(adPlanVOList);
return page2;
private void setAdPlanVO(AdPlanVO adPlanVO, AdPlan adPlan) {
adPlanVO.setCreateTime(adPlanVO.getCreateTime().replace("T", " "));
adPlanVO.setDatasourceIds(Arrays.asList(adPlan.getDatasourceId().split(StrUtil.COMMA)));
if (StrUtil.isNotBlank(adPlan.getReportTemplateId())) {
PqReport report = this.baseMapper.getPqReportById(adPlan.getReportTemplateId());
adPlanVO.setReportTemplateName(report.getName() + "_" + report.getVersion());
}
if (StrUtil.isNotBlank(adPlanVO.getScriptId())) {
adPlanVO.setScriptName(pqScriptService.getPqScriptById(adPlanVO.getScriptId()).getName());
}
adPlanVO.setErrorSysName(pqErrSysService.getPqErrSysById(adPlanVO.getErrorSysId()).getName());
List<PqSource> pqSourceList = adPlanSourceService.listPqSourceByPlanId(adPlanVO.getId());
adPlanVO.setSourceIds(pqSourceList.stream().map(PqSource::getId).collect(Collectors.toList()));
adPlanVO.setSourceName(pqSourceList.stream().map(PqSource::getName).collect(Collectors.toList()));
PqDevParam.QueryParam queryParam1 = new PqDevParam.QueryParam();
queryParam1.setPlanIdList(Arrays.asList(adPlan.getId()));
List<PqDevVO> pqDevVOList = pqDevMapper.selectByQueryParam(queryParam1);
if (CollUtil.isNotEmpty(pqDevVOList)) {
long count = pqDevVOList.stream().filter(pqDev -> CheckStateEnum.CHECKED.getValue().equals(pqDev.getCheckState())).count();
adPlanVO.setProgress((float) count / pqDevVOList.size());
} else {
adPlanVO.setProgress(0.0f);
}
if (StrUtil.isNotBlank(adPlan.getTestItem())) {
adPlanVO.setTestItems(Arrays.asList(adPlan.getTestItem().split(StrUtil.COMMA)));
List<DictTree> dictTreeList = dictTreeService.listByIds(adPlanVO.getTestItems());
adPlanVO.setTestItemNameStr(dictTreeList.stream().map(DictTree::getName).reduce((a, b) -> a + "," + b).orElse(""));
}
List<String> planIdList = new ArrayList<>();
planIdList.add(adPlan.getId());
if (CommonEnum.FATHER_ID.getValue().equals(adPlan.getFatherPlanId())) {
List<AdPlan> childrenPlan = this.lambdaQuery().eq(AdPlan::getFatherPlanId, adPlan.getId()).eq(AdPlan::getState, DataStateEnum.ENABLE.getCode()).list();
List<String> childrenPlanIds = childrenPlan.stream().map(AdPlan::getId).collect(Collectors.toList());
planIdList.addAll(childrenPlanIds);
}
List<PqStandardDev> pqStandardDevs = adPlanStandardDevMapper.listByPlanId(planIdList);
adPlanVO.setStandardDevIds(pqStandardDevs.stream().map(PqStandardDev::getId).collect(Collectors.toList()));
adPlanVO.setStandardDevNameStr(pqStandardDevs.stream().map(PqStandardDev::getName).reduce((a, b) -> a + "," + b).orElse(""));
}
@Override
@Transactional
public boolean addAdPlan(AdPlanParam param) {
this.checkRepeat(param, false);
param.setName(param.getName().trim());
this.checkRepeat(param, false, CommonEnum.FATHER_ID.getValue());
AdPlan adPlan = new AdPlan();
BeanUtil.copyProperties(param, adPlan);
adPlan.setName(param.getName().trim());
String planId = UUID.randomUUID().toString().replaceAll("-", "");
adPlan.setId(planId);
adPlan.setDatasourceId(String.join(StrUtil.COMMA, param.getDatasourceIds()));
adPlan.setState(DataStateEnum.ENABLE.getCode());
// 默认为顶级检测计划
adPlan.setFatherPlanId(CommonEnum.FATHER_ID.getValue());
if (StrUtil.isBlank(param.getFatherPlanId())) {
// 默认为顶级检测计划
adPlan.setFatherPlanId(CommonEnum.FATHER_ID.getValue());
} else {
AdPlan plan = this.getById(param.getFatherPlanId());
adPlan.setFatherPlanId(param.getFatherPlanId());
adPlan.setOrigin(plan.getName());
}
adPlan.setTestState(CheckStateEnum.UNCHECKED.getValue());
adPlan.setReportState(PlanReportStateEnum.REPORT_STATE_NOT_GENERATED.getValue());
adPlan.setResult(CheckResultEnum.UNCHECKED.getValue());
@@ -179,9 +228,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
adPlan.setReportTemplateId(reportId);
}
}
// 新增检测计划、检测源关联
adPlanSourceService.addAdPlanSource(planId, param.getSourceIds());
// 绑定被检设备
if (ObjectUtil.isNotEmpty(param.getDevIds())) {
// 新增时,绑定设备
pqDevService.bind(planId, param.getDevIds());
@@ -190,10 +237,26 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
pqDevService.updatePqDevTimeCheckResult(param.getDevIds(), TimeCheckResultEnum.UNKNOWN);
}
//新增相关计划
//检测项
if (CollUtil.isNotEmpty(param.getTestItems())) {
adPlan.setTestItem(String.join(StrUtil.COMMA, param.getTestItems()));
}
this.save(adPlan);
tableGenService.deleteTable(Arrays.asList(adPlan.getCode().toString()));
tableGenService.genAdNonHarmonicTable(adPlan.getCode().toString());
DictData dictData = dictDataService.getDictDataById(param.getPattern());
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
// 关联标准设备
if (CollUtil.isNotEmpty(param.getStandardDevIds())) {
adPlanStandardDevService.deleteAdPlanStandardDev(param.getFatherPlanId(), param.getStandardDevIds());
adPlanStandardDevService.addAdPlanStandardDev(planId, param.getStandardDevIds());
}
} else {
// 关联检测源
adPlanSourceService.addAdPlanSource(planId, param.getSourceIds());
tableGenService.deleteTable(Arrays.asList(adPlan.getCode().toString()));
tableGenService.genAdNonHarmonicTable(adPlan.getCode().toString());
}
return true;
}
@@ -201,7 +264,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
@Transactional
public boolean updateAdPlan(AdPlanParam.UpdateParam param) {
param.setName(param.getName().trim());
this.checkRepeat(param, true);
this.checkRepeat(param, true, CommonEnum.FATHER_ID.getValue());
AdPlan plan1 = this.getById(param.getId());
AdPlan plan2 = new AdPlan();
@@ -210,11 +273,6 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
String reportTemplateName = param.getReportTemplateName();
String[] split = reportTemplateName.split("_");
String reportId = this.baseMapper.getReportIdByNameAndVersion(split[0], split[1]);
// if (plan1.getTestState() != CheckStateEnum.UNCHECKED.getValue()) {
// if (!reportId.equals(plan1.getReportTemplateId())) {
// throw new BusinessException(DetectionResponseEnum.CANNOT_CHANGE_REPORT_WHEN_CHECKING);
// }
// }
if (StrUtil.isNotBlank(reportId)) {
plan2.setReportTemplateId(reportId);
}
@@ -230,30 +288,67 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
if (!plan1.getErrorSysId().equals(param.getErrorSysId())) {
throw new BusinessException(DetectionResponseEnum.CANNOT_CHANGE_ERROR_SYS_WHEN_CHECKING);
}
// if (param.getAssociateReport() != null && param.getAssociateReport() != plan1.getAssociateReport()) {
// throw new BusinessException(DetectionResponseEnum.CANNOT_CHANGE_REPORT_WHEN_CHECKING);
// }
}
BeanUtil.copyProperties(param, plan2);
plan2.setDatasourceId(String.join(StrUtil.COMMA, param.getDatasourceIds()));
// 修改检测计划、检测源关联
adPlanSourceService.updateAdPlanSource(param.getId(), param.getSourceIds());
plan2.setTestState(pqDevService.bind(param.getId(), param.getDevIds()));
if (CollUtil.isNotEmpty(param.getTestItems())) {
plan2.setTestItem(String.join(StrUtil.COMMA, param.getTestItems()));
}
DictData dictData = dictDataService.getDictDataById(param.getPattern());
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
List<AdPlan> childrenPlan = this.lambdaQuery().eq(AdPlan::getFatherPlanId, param.getId()).list();
List<String> childrenPlanIds = childrenPlan.stream().map(AdPlan::getId).collect(Collectors.toList());
// 修改与标准设备的关联关系
List<AdPlanStandardDev> adPlanStandardDevList = adPlanStandardDevService.lambdaQuery().in(CollectionUtil.isNotEmpty(childrenPlanIds), AdPlanStandardDev::getPlanId, childrenPlanIds).list();
if (CollUtil.isNotEmpty(adPlanStandardDevList)) {
throw new BusinessException(DetectionResponseEnum.PLEASE_UNASSIGN_STANDARD_DEV);
}
//List<String> standardDevIds = adPlanStandardDevList.stream().map(AdPlanStandardDev::getStandardDevId).collect(Collectors.toList());
//param.getStandardDevIds().removeAll(standardDevIds);
adPlanStandardDevService.updateAdPlanStandardDev(param.getId(), param.getStandardDevIds());
// 修改与被检设备的关联关系
PqDevParam.QueryParam param1 = new PqDevParam.QueryParam();
param1.setPlanIdList(childrenPlanIds);
List<PqDevVO> pqDevVOList = pqDevService.listByPlanId(param1);
if (CollUtil.isNotEmpty(pqDevVOList)) {
throw new BusinessException(DetectionResponseEnum.PLEASE_UNASSIGN_DEVICE);
}
// List<String> devIds = pqDevVOList.stream().map(PqDevVO::getId).collect(Collectors.toList());
// param.getDevIds().removeAll(devIds);
plan2.setTestState(pqDevService.bind(param.getId(), param.getDevIds()));
} else {
// 修改检测计划、检测源关联
adPlanSourceService.updateAdPlanSource(param.getId(), param.getSourceIds());
}
return this.updateById(plan2);
}
@Override
@Transactional
public boolean deleteAdPlan(List<String> ids) {
public boolean deleteAdPlan(List<String> ids, String pattern) {
DictData dictData = dictDataService.getDictDataById(pattern);
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
List<AdPlan> planList = this.lambdaQuery().in(AdPlan::getFatherPlanId, ids).eq(AdPlan::getState, DataStateEnum.ENABLE.getCode()).list();
if (CollUtil.isNotEmpty(planList)) {
throw new BusinessException(DetectionResponseEnum.PLAN_HAS_CHILDREN);
}
// 删除检测计划、标准设备关联
adPlanStandardDevService.deleteAdPlanStandardDev(ids);
}
for (String id : ids) {
PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam();
queryParam.setPlanId(id);
queryParam.setPlanIdList(Arrays.asList(id));
if (ObjectUtils.isNotEmpty(pqDevService.listByPlanId(queryParam))) {
throw new BusinessException(DetectionResponseEnum.PLAN_HAS_DEVICE_BIND);
}
}
// 删除检测计划、检测源关联
adPlanSourceService.deleteAdPlanSourceByPlanIds(ids);
@@ -329,6 +424,12 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
PqReport report = this.baseMapper.getPqReportById(adPlan.getReportTemplateId());
adPlan.setReportTemplateId(report.getName() + "_" + report.getVersion());
}
if (StrUtil.isNotBlank(adPlan.getTestItem())) {
String[] split = adPlan.getTestItem().split(StrUtil.COMMA);
List<DictTree> dictTreeList = dictTreeService.list(new QueryWrapper<DictTree>().in("id", split).eq("state", DataStateEnum.DELETED.getCode()));
String testItemStr = dictTreeList.stream().map(dictTree -> dictTree.getName()).reduce((a, b) -> a + "," + b).orElse("");
adPlan.setTestItem(testItemStr);
}
});
}
@@ -419,7 +520,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
}
}
PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam();
queryParam.setPlanId(planId);
queryParam.setPlanIdList(Arrays.asList(planId));
List<PqDevVO> pqDevVOList1 = pqDevMapper.selectByQueryParam(queryParam);
List<PqDev> collect = pqDevVOList1.stream().filter(x -> !x.getCheckState().equals(CheckStateEnum.UNCHECKED.getValue())).collect(Collectors.toList());
if (CollUtil.isEmpty(collect)) {
@@ -466,7 +567,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
List<PqDevVO> allDevList = new ArrayList<>();
for (AdPlan plan : planList) {
PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam();
queryParam.setPlanId(plan.getId());
queryParam.setPlanIdList(Arrays.asList(plan.getId()));
List<PqDevVO> pqDevVOList = pqDevMapper.selectByQueryParam(queryParam);
pqDevVOList = pqDevVOList.stream().filter(x -> !x.getCheckResult().equals(CheckResultEnum.UNCHECKED.getValue())).collect(Collectors.toList());
allDevList.addAll(pqDevVOList);
@@ -484,7 +585,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
} else {
AdPlan plan = planList.get(0);
PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam();
queryParam.setPlanId(plan.getId());
queryParam.setPlanIdList(Arrays.asList(plan.getId()));
List<PqDevVO> pqDevVOList = pqDevMapper.selectByQueryParam(queryParam);
pqDevVOList = pqDevVOList.stream().filter(x -> !x.getCheckResult().equals(CheckResultEnum.UNCHECKED.getValue())).collect(Collectors.toList());
@@ -497,22 +598,62 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
@Override
public void exportPlan(AdPlanParam.QueryParam queryParam) {
String currrentScene = sysTestConfigService.getCurrrentScene();
SceneEnum sceneEnum = SceneEnum.getSceneEnum(currrentScene);
switch (sceneEnum) {
case PROVINCE_PLATFORM:
this.exportProvincePlan(queryParam);
break;
case LEAVE_FACTORY_TEST:
this.exportCNPlan(queryParam);
break;
case SELF_TEST:
break;
default:
break;
DictData dictData = dictDataService.getDictDataById(queryParam.getPatternId());
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
this.exportContrastPlan(queryParam);
} else {
String currrentScene = sysTestConfigService.getCurrrentScene();
SceneEnum sceneEnum = SceneEnum.getSceneEnum(currrentScene);
switch (sceneEnum) {
case PROVINCE_PLATFORM:
this.exportProvincePlan(queryParam);
break;
case LEAVE_FACTORY_TEST:
this.exportCNPlan(queryParam);
break;
case SELF_TEST:
break;
default:
break;
}
}
}
private void exportContrastPlan(AdPlanParam.QueryParam queryParam) {
List<AdPlan> planList = this.list(this.getQueryWrapper(queryParam));
this.visualize(planList);
List<ContrastPlanExcel> planExcelList = BeanUtil.copyToList(planList, ContrastPlanExcel.class);
List<Map<String, Object>> sheetsList = new ArrayList<>();
planExcelList.forEach(plan -> {
Map<String, Object> sheet = new HashMap<>();
ExportParams exportParams = new ExportParams();
exportParams.setSheetName(plan.getName());
sheet.put("title", exportParams);
sheet.put("entity", ContrastDevExcel.class);
PqDevParam.QueryParam param = new PqDevParam.QueryParam();
param.setPlanIdList(Arrays.asList(plan.getId()));
List<PqDevVO> pqDevVOList = pqDevService.listByPlanId(param);
List<ContrastDevExcel> exportContrastDevData = pqDevService.getExportContrastDevData(pqDevVOList);
sheet.put("data", exportContrastDevData);
sheetsList.add(sheet);
String standardDevNameStrByPlanId = adPlanContrastStandardDevService.getStandardDevNameStrByPlanId(plan.getId());
plan.setStandardDev(standardDevNameStrByPlanId);
});
Map<String, Object> sheet1 = new HashMap<>();
ExportParams exportParams1 = new ExportParams();
exportParams1.setSheetName("检测计划");
sheet1.put("title", exportParams1);
sheet1.put("entity", ContrastPlanExcel.class);
sheet1.put("data", planExcelList);
sheetsList.add(0, sheet1);
ExcelUtil.exportExcel("检测计划导出数据.xlsx", sheetsList);
}
@Override
public void downloadTemplate(String patternId) {
String currrentScene = sysTestConfigService.getCurrrentScene();
@@ -549,8 +690,73 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
}
@Override
public boolean splitPlan(AdPlanParam.SplitParam param) {
return false;
public List<PqStandardDev> getUnBoundStandardDev(String fatherPlanId) {
return adPlanStandardDevMapper.listByPlanId(Collections.singletonList(fatherPlanId));
}
@Override
public List<PqStandardDev> getBoundStandardDev(String planId) {
return adPlanStandardDevMapper.listByPlanId(Collections.singletonList(planId));
}
@Override
@Transactional
public boolean updateSubPlanName(String planId, String name) {
AdPlan plan = new AdPlan();
plan.setId(planId);
plan.setName(name);
return this.updateById(plan);
}
@Override
public boolean updateBindDev(String planId, List<String> pqDevIds) {
List<AdPlan> list = new ArrayList<>();
AdPlan plan = this.getById(planId);
plan.setTestState(pqDevService.bind(planId, pqDevIds));
list.add(plan);
// 同时修改父计划的绑定
AdPlan fatherPlan = this.getById(plan.getFatherPlanId());
if (ObjectUtil.isNotNull(fatherPlan)) {
fatherPlan.setTestState(pqDevService.bind(fatherPlan.getId(), pqDevIds));
list.add(fatherPlan);
}
return this.updateBatchById(list);
}
@Override
@Transactional
public boolean updateBindStandardDev(String planId, List<String> standardDevIds) {
// 处理已有的
List<AdPlanStandardDev> adPlanStandardDevs = adPlanStandardDevService.listByPlanId(Collections.singletonList(planId));
// 同时修改父计划的绑定
AdPlan plan = this.getById(planId);
List<String> standardDevIds1 = adPlanStandardDevs.stream().map(AdPlanStandardDev::getStandardDevId).collect(Collectors.toList());
adPlanStandardDevService.addAdPlanStandardDev(plan.getFatherPlanId(), standardDevIds1);
adPlanStandardDevService.deleteAdPlanStandardDev(plan.getFatherPlanId(), standardDevIds);
adPlanStandardDevService.updateAdPlanStandardDev(planId, standardDevIds);
return true;
}
@Override
public void exportSubPlan(String planId, HttpServletResponse response) {
// 子计划数据
AdPlan subPlan = this.getById(planId);
//子计划绑定的标准设备
List<PqStandardDev> pqStandardDevs = adPlanStandardDevMapper.listByPlanId(Collections.singletonList(planId));
// 子计划绑定的被检设备
PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam();
queryParam.setPlanIdList(Collections.singletonList(planId));
List<PqDev> pqDevList = pqDevService.list(new QueryWrapper<PqDev>().eq("Plan_Id", planId));
List<PqDevSub> pqDevSubList = new ArrayList<>();
if (CollUtil.isNotEmpty(pqDevList)) {
pqDevSubList.addAll(pqDevSubService.list(new QueryWrapper<PqDevSub>().in("dev_Id", pqDevList.stream().map(PqDev::getId).collect(Collectors.toList()))));
}
}
/**
@@ -567,7 +773,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
planExcelList.get(i).setSource(pqSources.stream().map(PqSource::getName).collect(Collectors.joining(StrUtil.COMMA)));
PqDevParam.QueryParam queryParam1 = new PqDevParam.QueryParam();
queryParam1.setPlanId(planList.get(i).getId());
queryParam1.setPlanIdList(Arrays.asList(planList.get(i).getId()));
List<PqDevVO> pqDevVOList = pqDevMapper.selectByQueryParam(queryParam1);
pqDevService.visualizeProvinceDev(pqDevVOList);
List<ProvinceDevExcel> deviceExportData = BeanUtil.copyToList(pqDevVOList, ProvinceDevExcel.class);
@@ -590,7 +796,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
planExcelList.get(i).setSource(pqSources.stream().map(PqSource::getName).collect(Collectors.joining(StrUtil.COMMA)));
PqDevParam.QueryParam queryParam1 = new PqDevParam.QueryParam();
queryParam1.setPlanId(planList.get(i).getId());
queryParam1.setPlanIdList(Arrays.asList(planList.get(i).getId()));
List<PqDevVO> pqDevs = pqDevMapper.selectByQueryParam(queryParam1);
pqDevService.visualizeCNDev(pqDevs);
List<CNDevExcel> deviceExportData = BeanUtil.copyToList(pqDevs, CNDevExcel.class);
@@ -642,7 +848,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
AdPlanParam adPlanParam = new AdPlanParam();
adPlanParam.setName(planExcel.getName());
adPlanParam.setPattern(patternId);
checkRepeat(adPlanParam, false);
checkRepeat(adPlanParam, false, CommonEnum.FATHER_ID.getValue());
String planId = UUID.randomUUID().toString().replaceAll("-", "");
adPlans.get(i).setId(planId);
@@ -722,7 +928,7 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
AdPlanParam adPlanParam = new AdPlanParam();
adPlanParam.setName(planExcel.getName());
adPlanParam.setPattern(patternId);
checkRepeat(adPlanParam, false);
checkRepeat(adPlanParam, false, CommonEnum.FATHER_ID.getValue());
String planId = UUID.randomUUID().toString().replaceAll("-", "");
adPlans.get(i).setId(planId);
@@ -938,11 +1144,12 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
* @param param 计划参数
* @param isExcludeSelf 是否排除自己
*/
private void checkRepeat(AdPlanParam param, boolean isExcludeSelf) {
private void checkRepeat(AdPlanParam param, boolean isExcludeSelf, String fatherPlanId) {
QueryWrapper<AdPlan> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("state", DataStateEnum.ENABLE.getCode())
.eq("Name", param.getName())
.eq("Pattern", param.getPattern());
.eq("Pattern", param.getPattern())
.eq("Father_Plan_Id", fatherPlanId);
if (isExcludeSelf) {
if (param instanceof AdPlanParam.UpdateParam) {
queryWrapper.ne("id", ((AdPlanParam.UpdateParam) param).getId());
@@ -950,7 +1157,11 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
}
int count = this.count(queryWrapper);
if (count > 0) {
throw new BusinessException(DetectionResponseEnum.PLAN_REPEATED);
if (!CommonEnum.FATHER_ID.getValue().equals(fatherPlanId)) {
throw new BusinessException(DetectionResponseEnum.PLAN_REPEATED_IN_SAME_LEVEL);
} else {
throw new BusinessException(DetectionResponseEnum.PLAN_REPEATED);
}
}
}
@@ -1109,12 +1320,26 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
List<PullDown> pullDowns = new ArrayList<>();
PullDown pullDown = null;
List<Map<String, Object>> maps = pqSourceService.listAllPqSource(patternId);
if (ObjectUtil.isNotEmpty(maps)) {
DictData dictData = dictDataService.getDictDataById(patternId);
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
} else {
List<Map<String, Object>> maps = pqSourceService.listAllPqSource(patternId);
if (ObjectUtil.isNotEmpty(maps)) {
pullDown = new PullDown();
pullDown.setFirstCol(1);
pullDown.setLastCol(1);
pullDown.setStrings(maps.stream().map(m -> (String) m.get("name")).collect(Collectors.toList()));
pullDowns.add(pullDown);
}
// 检测脚本
List<Map<String, Object>> maps1 = pqScriptService.listAllPqScript(null);
List<String> scriptNameList = maps1.stream().map(m -> (String) m.get("name")).collect(Collectors.toList());
pullDown = new PullDown();
pullDown.setFirstCol(1);
pullDown.setLastCol(1);
pullDown.setStrings(maps.stream().map(m -> (String) m.get("name")).collect(Collectors.toList()));
pullDown.setFirstCol(3);
pullDown.setLastCol(3);
pullDown.setStrings(scriptNameList);
pullDowns.add(pullDown);
}
@@ -1130,14 +1355,6 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
pullDowns.add(pullDown);
}
// 检测脚本
List<Map<String, Object>> maps1 = pqScriptService.listAllPqScript(null);
List<String> scriptNameList = maps1.stream().map(m -> (String) m.get("name")).collect(Collectors.toList());
pullDown = new PullDown();
pullDown.setFirstCol(3);
pullDown.setLastCol(3);
pullDown.setStrings(scriptNameList);
pullDowns.add(pullDown);
// 误差体系
List<Map<String, Object>> maps2 = pqErrSysService.listAllPqErrSys();
List<String> errSysNameList = maps2.stream().map(m -> (String) m.get("name")).collect(Collectors.toList());
@@ -1181,30 +1398,14 @@ public class AdPlanServiceImpl extends ServiceImpl<AdPlanMapper, AdPlan> impleme
pullDown.setStrings(strings);
pullDowns.add(pullDown);
// 检测状态
// pullDown = new PullDown();
// pullDown.setFirstCol(9);
// pullDown.setLastCol(9);
// pullDown.setStrings(Arrays.asList(CheckStateEnum.UNCHECKED.getMsg(), CheckStateEnum.CHECKING.getMsg(), CheckStateEnum.CHECKED.getMsg()));
// pullDowns.add(pullDown);
// 报告生成状态
// pullDown = new PullDown();
// pullDown.setFirstCol(10);
// pullDown.setLastCol(10);
// pullDown.setStrings(Arrays.asList(PlanReportStateEnum.REPORT_STATE_NOT_GENERATED.getMsg(), PlanReportStateEnum.REPORT_STATE_PARTIALLY_GENERATED.getMsg(), PlanReportStateEnum.REPORT_STATE_ALL_GENERATED.getMsg()));
// pullDowns.add(pullDown);
//检测结果
// pullDown = new PullDown();
// pullDown.setFirstCol(11);
// pullDown.setLastCol(11);
// pullDown.setStrings(Arrays.asList(CheckResultEnum.UNCHECKED.getMsg(), CheckResultEnum.ACCORD.getMsg(), CheckResultEnum.UNCHECKED.getMsg()));
// pullDowns.add(pullDown);
switch (scene) {
case PROVINCE_PLATFORM:
List<PullDown> provinceDevPullDownList = pqDevService.getProvinceDevPullDownList(9);
List<PullDown> provinceDevPullDownList = null;
if (PatternEnum.CONTRAST.getValue().equals(dictData.getCode())) {
provinceDevPullDownList = pqDevService.getContrastDevPullDownList(9);
} else {
provinceDevPullDownList = pqDevService.getProvinceDevPullDownList(9);
}
pullDowns.addAll(provinceDevPullDownList);
break;
case LEAVE_FACTORY_TEST:

View File

@@ -1,6 +1,7 @@
package com.njcn.gather.plan.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.gather.plan.mapper.AdPlanSourceMapper;
import com.njcn.gather.plan.pojo.po.AdPlanSource;
@@ -44,9 +45,12 @@ public class AdPlanSourceServiceImpl extends ServiceImpl<AdPlanSourceMapper, AdP
@Override
@Transactional
public boolean deleteAdPlanSourceByPlanIds(List<String> planIds) {
QueryWrapper<AdPlanSource> queryWrapper = new QueryWrapper<>();
queryWrapper.in("ad_plan_source.Plan_Id", planIds);
return this.remove(queryWrapper);
if(CollectionUtils.isNotEmpty(planIds)){
QueryWrapper<AdPlanSource> queryWrapper = new QueryWrapper<>();
queryWrapper.in("ad_plan_source.Plan_Id", planIds);
return this.remove(queryWrapper);
}
return false;
}
@Override

View File

@@ -0,0 +1,75 @@
package com.njcn.gather.plan.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.gather.device.pojo.po.PqStandardDev;
import com.njcn.gather.plan.mapper.AdPlanStandardDevMapper;
import com.njcn.gather.plan.pojo.po.AdPlanStandardDev;
import com.njcn.gather.plan.service.IAdPlanStandardDevService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author caozehui
* @date 2025-07-16
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class AdPlanStandardDevServiceImpl extends ServiceImpl<AdPlanStandardDevMapper, AdPlanStandardDev> implements IAdPlanStandardDevService {
@Override
public boolean addAdPlanStandardDev(String planId, List<String> standardDevIds) {
List<AdPlanStandardDev> adPlanStandardDevList = new ArrayList<>();
for (String standardDevId : standardDevIds) {
AdPlanStandardDev adPlanStandardDev = new AdPlanStandardDev();
adPlanStandardDev.setPlanId(planId);
adPlanStandardDev.setStandardDevId(standardDevId);
adPlanStandardDevList.add(adPlanStandardDev);
}
return this.saveBatch(adPlanStandardDevList);
}
@Override
public boolean updateAdPlanStandardDev(String planId, List<String> standardDevIds) {
this.deleteAdPlanStandardDev(Collections.singletonList(planId));
return this.addAdPlanStandardDev(planId, standardDevIds);
}
@Override
public boolean deleteAdPlanStandardDev(List<String> planIds) {
if (CollectionUtil.isNotEmpty(planIds)) {
QueryWrapper<AdPlanStandardDev> queryWrapper = new QueryWrapper<>();
queryWrapper.in("Plan_Id", planIds);
return this.remove(queryWrapper);
}
return false;
}
@Override
public boolean deleteAdPlanStandardDev(String planId, List<String> standardDevIds) {
if (CollectionUtil.isNotEmpty(standardDevIds)) {
QueryWrapper<AdPlanStandardDev> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("Plan_Id", planId).in("Standard_Dev_Id", standardDevIds);
return this.remove(queryWrapper);
}
return false;
}
@Override
public String getStandardDevNameStrByPlanId(String id) {
List<PqStandardDev> pqStandardDevs = this.baseMapper.listByPlanId(Collections.singletonList(id));
return pqStandardDevs.stream().map(PqStandardDev::getName).reduce((a, b) -> a + "," + b).orElse("");
}
@Override
public List<AdPlanStandardDev> listByPlanId(List<String> planIds) {
return this.lambdaQuery().in(AdPlanStandardDev::getPlanId, planIds).list();
}
}