转换Base64到webp格式和bug修复
This commit is contained in:
parent
b679c12c48
commit
7aa4d307e7
6
pom.xml
6
pom.xml
@ -58,6 +58,12 @@
|
|||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.sejda.imageio</groupId>
|
||||||
|
<artifactId>webp-imageio</artifactId>
|
||||||
|
<version>0.1.6</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jetbrains</groupId>
|
<groupId>org.jetbrains</groupId>
|
||||||
<artifactId>annotations</artifactId>
|
<artifactId>annotations</artifactId>
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
package com.zhgd.xmgl.modules.basicdata.controller;
|
package com.zhgd.xmgl.modules.basicdata.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import com.luciad.imageio.webp.WebPWriteParam;
|
||||||
|
import com.zhgd.annotation.OperLog;
|
||||||
|
import com.zhgd.jeecg.common.api.vo.Result;
|
||||||
import com.zhgd.jeecg.common.execption.OpenAlertException;
|
import com.zhgd.jeecg.common.execption.OpenAlertException;
|
||||||
import com.zhgd.xmgl.modules.basicdata.service.UploadFileService;
|
import com.zhgd.xmgl.modules.basicdata.service.UploadFileService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
@ -12,12 +15,19 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import javax.imageio.IIOImage;
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.imageio.ImageWriteParam;
|
||||||
|
import javax.imageio.ImageWriter;
|
||||||
|
import javax.imageio.stream.ImageOutputStream;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.InputStream;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.OutputStream;
|
import java.io.*;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLConnection;
|
import java.net.URLConnection;
|
||||||
|
import java.util.Base64;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -115,4 +125,96 @@ public class UploadFileController {
|
|||||||
log.error("err:", e);
|
log.error("err:", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OperLog(operModul = "转换图片成webp格式", operType = "", operDesc = "转换图片成webp格式")
|
||||||
|
@PostMapping("/convertBase642webp")
|
||||||
|
public Result<String> convertBase642webp(@RequestBody Map<String, String> request,
|
||||||
|
HttpServletResponse response) {
|
||||||
|
String convertAndBase64Webp = null;
|
||||||
|
try {
|
||||||
|
// 1. 获取并验证Base64数据
|
||||||
|
String base64Data = request.get("base64");
|
||||||
|
if (base64Data == null || base64Data.isEmpty()) {
|
||||||
|
throw new OpenAlertException("Base64 data is required");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 清理Data URL前缀
|
||||||
|
String pureBase64 = base64Data;
|
||||||
|
if (base64Data.contains(",")) {
|
||||||
|
pureBase64 = base64Data.split(",")[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 设置响应头,触发文件下载
|
||||||
|
setDownloadHeaders(response, "converted_image.webp");
|
||||||
|
|
||||||
|
// 4. 获取输出流并直接写入WEBP数据
|
||||||
|
convertAndBase64Webp = getConvertAndBase64Webp(pureBase64);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new OpenAlertException("Conversion failed: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
return Result.success(convertAndBase64Webp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置文件下载的HTTP头
|
||||||
|
*/
|
||||||
|
private void setDownloadHeaders(HttpServletResponse response, String filename) {
|
||||||
|
response.setContentType("image/webp");
|
||||||
|
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
|
||||||
|
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
|
||||||
|
response.setHeader("Pragma", "no-cache");
|
||||||
|
response.setHeader("Expires", "0");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 转换Base64图像为WebP格式并返回Base64字符串
|
||||||
|
*/
|
||||||
|
private String getConvertAndBase64Webp(String pureBase64) throws IOException {
|
||||||
|
// 解码Base64
|
||||||
|
byte[] imageBytes = Base64.getDecoder().decode(pureBase64);
|
||||||
|
|
||||||
|
// 读取原始图片
|
||||||
|
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
|
||||||
|
if (image == null) {
|
||||||
|
throw new OpenAlertException("Invalid image data");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取WebP ImageWriter
|
||||||
|
Iterator<ImageWriter> writers = ImageIO.getImageWritersByMIMEType("image/webp");
|
||||||
|
if (!writers.hasNext()) {
|
||||||
|
throw new OpenAlertException("No WebP ImageWriter found");
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageWriter writer = writers.next();
|
||||||
|
|
||||||
|
// 使用ByteArrayOutputStream来捕获WebP图像数据
|
||||||
|
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(baos)) {
|
||||||
|
|
||||||
|
if (imageOutputStream == null) {
|
||||||
|
throw new OpenAlertException("Cannot create ImageOutputStream");
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.setOutput(imageOutputStream);
|
||||||
|
|
||||||
|
// 配置WebP写入参数
|
||||||
|
WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale());
|
||||||
|
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
|
||||||
|
writeParam.setCompressionType(writeParam.getCompressionTypes()[WebPWriteParam.LOSSY_COMPRESSION]);
|
||||||
|
writeParam.setCompressionQuality(0.8f);
|
||||||
|
|
||||||
|
// 写入图像
|
||||||
|
writer.write(null, new IIOImage(image, null, null), writeParam);
|
||||||
|
|
||||||
|
// 确保所有数据都写入输出流
|
||||||
|
imageOutputStream.flush();
|
||||||
|
|
||||||
|
// 获取WebP图像的字节数组并转换为Base64
|
||||||
|
byte[] webpBytes = baos.toByteArray();
|
||||||
|
return Base64.getEncoder().encodeToString(webpBytes);
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
writer.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,53 +1,28 @@
|
|||||||
package com.zhgd.xmgl.modules.broadcast.controller;
|
package com.zhgd.xmgl.modules.broadcast.controller;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.zhgd.annotation.OperLog;
|
import com.zhgd.annotation.OperLog;
|
||||||
|
import com.zhgd.jeecg.common.api.vo.Result;
|
||||||
|
import com.zhgd.xmgl.modules.broadcast.entity.SmartBroadcastDev;
|
||||||
|
import com.zhgd.xmgl.modules.broadcast.entity.dto.SmartBroadcastDevDto;
|
||||||
|
import com.zhgd.xmgl.modules.broadcast.entity.vo.SmartBroadcastDevVo;
|
||||||
|
import com.zhgd.xmgl.modules.broadcast.service.ISmartBroadcastDevService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParam;
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import io.swagger.annotations.ApiImplicitParams;
|
import io.swagger.annotations.ApiImplicitParams;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
import java.util.HashMap;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.collections.MapUtils;
|
||||||
|
import org.simpleframework.xml.core.Validate;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
import springfox.documentation.annotations.ApiIgnore;
|
import springfox.documentation.annotations.ApiIgnore;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.net.URLDecoder;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
import com.zhgd.jeecg.common.api.vo.Result;
|
|
||||||
import com.zhgd.jeecg.common.system.query.QueryGenerator;
|
|
||||||
import com.zhgd.jeecg.common.util.oConvertUtils;
|
|
||||||
import org.apache.commons.collections.MapUtils;
|
|
||||||
import com.zhgd.xmgl.modules.broadcast.entity.SmartBroadcastDev;
|
|
||||||
import com.zhgd.xmgl.modules.broadcast.entity.vo.SmartBroadcastDevVo;
|
|
||||||
import com.zhgd.xmgl.modules.broadcast.entity.dto.SmartBroadcastDevDto;
|
|
||||||
import com.zhgd.xmgl.modules.broadcast.service.ISmartBroadcastDevService;
|
|
||||||
import org.springframework.context.annotation.Lazy;
|
|
||||||
|
|
||||||
import org.simpleframework.xml.core.Validate;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
|
|
||||||
import org.jeecgframework.poi.excel.ExcelImportUtil;
|
|
||||||
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
|
|
||||||
import org.jeecgframework.poi.excel.entity.ExportParams;
|
|
||||||
import org.jeecgframework.poi.excel.entity.ImportParams;
|
|
||||||
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
|
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
|
||||||
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
|
||||||
import com.alibaba.fastjson.JSON;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -150,4 +125,21 @@ public class SmartBroadcastDevController {
|
|||||||
return Result.success(smartBroadcastDevService.queryById(id));
|
return Result.success(smartBroadcastDevService.queryById(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiOperation(value = "批量删除智能广播设备", notes = "批量删除智能广播设备", httpMethod = "POST")
|
||||||
|
@ApiImplicitParam(name = "ids", value = "智能广播设备ID字符串(多个以,分割)", paramType = "body", required = true, dataType = "String")
|
||||||
|
@PostMapping(value = "/deleteBatch")
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Result deleteBatch(@ApiIgnore @RequestBody HashMap<String, Object> paramMap) {
|
||||||
|
String ids = MapUtils.getString(paramMap, "ids");
|
||||||
|
Result result = new Result<>();
|
||||||
|
if (ids == null || "".equals(ids.trim())) {
|
||||||
|
result.error500("参数不识别!");
|
||||||
|
} else {
|
||||||
|
List<String> idList = Arrays.asList(ids.split(","));
|
||||||
|
smartBroadcastDevService.removeByIds(idList);
|
||||||
|
Result.success("删除成功!");
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -207,6 +207,7 @@ public class RiskListPointController {
|
|||||||
@ApiImplicitParam(name = "updates", value = "对象数组", paramType = "body", required = true, dataType = "Integer"),
|
@ApiImplicitParam(name = "updates", value = "对象数组", paramType = "body", required = true, dataType = "Integer"),
|
||||||
})
|
})
|
||||||
@PostMapping(value = "/batchSetField")
|
@PostMapping(value = "/batchSetField")
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public Result batchSetField(@RequestBody Map<String, Object> param) {
|
public Result batchSetField(@RequestBody Map<String, Object> param) {
|
||||||
List<Map<String, Object>> updates = com.gexin.fastjson.JSON.parseObject(com.gexin.fastjson.JSON.toJSONString(param.get("updates"), SerializerFeature.WriteMapNullValue), new com.gexin.fastjson.TypeReference<List<Map<String, Object>>>() {
|
List<Map<String, Object>> updates = com.gexin.fastjson.JSON.parseObject(com.gexin.fastjson.JSON.toJSONString(param.get("updates"), SerializerFeature.WriteMapNullValue), new com.gexin.fastjson.TypeReference<List<Map<String, Object>>>() {
|
||||||
});
|
});
|
||||||
|
|||||||
@ -25,7 +25,10 @@ import com.zhgd.xmgl.modules.risk.entity.bo.SourceCheckNumBo;
|
|||||||
import com.zhgd.xmgl.modules.risk.entity.vo.CountRisksByLevelVo;
|
import com.zhgd.xmgl.modules.risk.entity.vo.CountRisksByLevelVo;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.vo.HighRiskValByType;
|
import com.zhgd.xmgl.modules.risk.entity.vo.HighRiskValByType;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo;
|
import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo;
|
||||||
import com.zhgd.xmgl.modules.risk.service.*;
|
import com.zhgd.xmgl.modules.risk.service.IRiskListDetailService;
|
||||||
|
import com.zhgd.xmgl.modules.risk.service.IRiskListPotentialAccidentTypeService;
|
||||||
|
import com.zhgd.xmgl.modules.risk.service.IRiskListSourceService;
|
||||||
|
import com.zhgd.xmgl.modules.risk.service.IRiskListSourceUnbuiltService;
|
||||||
import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityQualityInspectionRecord;
|
import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityQualityInspectionRecord;
|
||||||
import com.zhgd.xmgl.modules.xz.security.service.IXzSecurityQualityInspectionRecordService;
|
import com.zhgd.xmgl.modules.xz.security.service.IXzSecurityQualityInspectionRecordService;
|
||||||
import com.zhgd.xmgl.util.ListUtils;
|
import com.zhgd.xmgl.util.ListUtils;
|
||||||
@ -177,85 +180,53 @@ public class RiskListSourceDataCenterController {
|
|||||||
}
|
}
|
||||||
Date begin = DateUtil.parseDate(MapUtils.getString(param, "effectiveTimeEnd_begin"));
|
Date begin = DateUtil.parseDate(MapUtils.getString(param, "effectiveTimeEnd_begin"));
|
||||||
Date end = DateUtil.parseDate(MapUtils.getString(param, "effectiveTimeBegin_end"));
|
Date end = DateUtil.parseDate(MapUtils.getString(param, "effectiveTimeBegin_end"));
|
||||||
List<SourceCheckNumBo> checkNumBos = getSourceCheckNumBo(sourceVos);
|
String projectSn = MapUtils.getString(param, "projectSn");
|
||||||
|
List<XzSecurityQualityInspectionRecord> securityList = xzSecurityQualityInspectionRecordService.list(new LambdaQueryWrapper<XzSecurityQualityInspectionRecord>()
|
||||||
|
.eq(XzSecurityQualityInspectionRecord::getType, 10)
|
||||||
|
.eq(XzSecurityQualityInspectionRecord::getProjectSn, projectSn)
|
||||||
|
);
|
||||||
|
List<RiskListSourceUnbuilt> unbuilts = riskListSourceUnbuiltService.list(new LambdaQueryWrapper<RiskListSourceUnbuilt>()
|
||||||
|
.in(RiskListSourceUnbuilt::getProjectSn, projectSn));
|
||||||
|
Map<Long, Map<String, List<XzSecurityQualityInspectionRecord>>> sourceId2RegionId2SecurityListMap = securityList.stream()
|
||||||
|
.collect(Collectors.groupingBy(
|
||||||
|
XzSecurityQualityInspectionRecord::getEngineeringId,
|
||||||
|
Collectors.collectingAndThen(
|
||||||
|
Collectors.toList(),
|
||||||
|
records -> records.stream()
|
||||||
|
.filter(r -> Objects.nonNull(r.getRegionIds()))
|
||||||
|
.flatMap(record ->
|
||||||
|
Arrays.stream(record.getRegionIds().split(","))
|
||||||
|
.map(String::trim)
|
||||||
|
.filter(regionId -> !regionId.isEmpty())
|
||||||
|
.map(regionId -> new AbstractMap.SimpleEntry<>(regionId, record))
|
||||||
|
)
|
||||||
|
.collect(Collectors.groupingBy(
|
||||||
|
AbstractMap.SimpleEntry::getKey,
|
||||||
|
Collectors.mapping(
|
||||||
|
AbstractMap.SimpleEntry::getValue,
|
||||||
|
Collectors.toList()
|
||||||
|
))))));
|
||||||
|
Map<Long, Map<String, List<RiskListSourceUnbuilt>>> sourceId2RegionId2UnbuiltListMap = unbuilts.stream().collect(Collectors.groupingBy(RiskListSourceUnbuilt::getSourceId,
|
||||||
|
Collectors.groupingBy((RiskListSourceUnbuilt riskListSourceUnbuilt) -> Convert.toStr(riskListSourceUnbuilt.getResponsibleRegionId()))));
|
||||||
//1. 计算有效期内的source的应排查、(未施工+已排查)数量
|
//1. 计算有效期内的source的应排查、(未施工+已排查)数量
|
||||||
for (RiskListSourceVo sourceVo : sourceVos) {
|
for (RiskListSourceVo sourceVo : sourceVos) {
|
||||||
int shouldCheckedNum = 0;
|
int shouldCheckedNum = 0;
|
||||||
int checkedNum = 0;
|
int checkedNum = 0;
|
||||||
Date b = DateUtil.compare((sourceVo.getEffectiveTimeBegin()), begin) < 0 ? sourceVo.getEffectiveTimeBegin() : begin;
|
List<DateTime> dateTimes = getDateTimes(begin, end, sourceVo);
|
||||||
Date e = DateUtil.compare(sourceVo.getEffectiveTimeEnd(), end) < 0 ? sourceVo.getEffectiveTimeEnd() : end;
|
for (DateTime time : dateTimes) {
|
||||||
if (Objects.equals(sourceVo.getCheckPeriod(), 1)) {
|
shouldCheckedNum += sourceVo.getSpecificResponsibilityAreaIds().split(",").length * sourceVo.getCheckNum();
|
||||||
DateRange range = DateUtil.range(b, e, DateField.DAY_OF_YEAR);
|
String areaIds = sourceVo.getSpecificResponsibilityAreaIds();
|
||||||
for (DateTime time : range) {
|
int count = 0;
|
||||||
shouldCheckedNum += sourceVo.getCheckNum();
|
if (StrUtil.isNotBlank(areaIds)) {
|
||||||
long count = checkNumBos.stream().filter(bo -> {
|
count = StrUtil.split(areaIds, ",").stream().map(regionId -> {
|
||||||
boolean b1 = isSameSourceAndTime(begin, end, sourceVo, bo, time);
|
return riskListSourceService.getCalNum(sourceVo, regionId, time, Optional.ofNullable(sourceId2RegionId2SecurityListMap.get(sourceVo.getId())).map(m -> m.get(regionId)).orElse(null),
|
||||||
return b1 && DateUtil.compare(bo.getDate(), DateUtil.offsetDay(time, 1)) < 0;
|
Optional.ofNullable(sourceId2RegionId2UnbuiltListMap.get(sourceVo.getId())).map(m -> m.get(regionId)).orElse(null));
|
||||||
}).count();
|
}).mapToInt(v -> v).sum();
|
||||||
checkedNum += Math.min(sourceVo.getCheckNum(), count);
|
|
||||||
}
|
|
||||||
} else if (Objects.equals(sourceVo.getCheckPeriod(), 2)) {
|
|
||||||
DateRange range = DateUtil.range(DateUtil.beginOfWeek(b), DateUtil.offsetWeek(e, 1), DateField.DAY_OF_WEEK);
|
|
||||||
for (DateTime time : range) {
|
|
||||||
shouldCheckedNum += sourceVo.getCheckNum();
|
|
||||||
long count = checkNumBos.stream().filter(bo -> {
|
|
||||||
boolean b1 = isSameSourceAndTime(begin, end, sourceVo, bo, time);
|
|
||||||
return b1 && DateUtil.compare(bo.getDate(), DateUtil.offsetWeek(time, 1)) < 0;
|
|
||||||
}).count();
|
|
||||||
checkedNum += Math.min(sourceVo.getCheckNum(), count);
|
|
||||||
}
|
|
||||||
} else if (Objects.equals(sourceVo.getCheckPeriod(), 3)) {
|
|
||||||
DateRange range = DateUtil.range(DateUtil.beginOfMonth(b), DateUtil.offsetMonth(e, 1), DateField.MONTH);
|
|
||||||
for (DateTime time : range) {
|
|
||||||
shouldCheckedNum += sourceVo.getCheckNum();
|
|
||||||
checkedNum += checkNumBos.stream().filter(bo -> {
|
|
||||||
boolean b1 = isSameSourceAndTime(begin, end, sourceVo, bo, time);
|
|
||||||
return b1 && DateUtil.compare(bo.getDate(), DateUtil.offsetMonth(time, 1)) < 0;
|
|
||||||
}).count();
|
|
||||||
}
|
|
||||||
} else if (Objects.equals(sourceVo.getCheckPeriod(), 4)) {
|
|
||||||
// 获取起始日期所在季度的第一天
|
|
||||||
DateTime currentQuarterStart = DateUtil.beginOfQuarter(begin);
|
|
||||||
// 循环直到当前季度的第一天晚于结束日期
|
|
||||||
// 注意:这里需要确保 endDate 所在的季度被包含。
|
|
||||||
// 可以判断 currentQuarterStart 是否在 endDate 所在季度的开始之前或相同
|
|
||||||
while (!currentQuarterStart.isAfter(DateUtil.endOfQuarter(end))) {
|
|
||||||
shouldCheckedNum += sourceVo.getCheckNum();
|
|
||||||
DateTime finalCurrentQuarterStart = currentQuarterStart;
|
|
||||||
checkedNum += checkNumBos.stream().filter(bo -> {
|
|
||||||
boolean b1 = isSameSourceAndTime(begin, end, sourceVo, bo, finalCurrentQuarterStart);
|
|
||||||
return b1 && DateUtil.compare(bo.getDate(), DateUtil.offsetMonth(finalCurrentQuarterStart, 3)) < 0;
|
|
||||||
}).count();
|
|
||||||
currentQuarterStart = DateUtil.offsetMonth(currentQuarterStart, 3);
|
|
||||||
}
|
|
||||||
} else if (Objects.equals(sourceVo.getCheckPeriod(), 5)) {
|
|
||||||
// 找到起始日期所在的半年的第一个月的第一天
|
|
||||||
DateTime currentHalfYearStart;
|
|
||||||
int startMonth = DateUtil.month(begin) + 1; // 月份是0-11,所以+1
|
|
||||||
if (startMonth >= 1 && startMonth <= 6) { // 上半年 (1月-6月)
|
|
||||||
currentHalfYearStart = DateUtil.beginOfYear(begin); // 获取年份的开始,即1月1日
|
|
||||||
} else { // 下半年 (7月-12月)
|
|
||||||
currentHalfYearStart = DateUtil.offsetMonth(DateUtil.beginOfYear(begin), 6); // 获取年份的开始,然后偏移6个月,即7月1日
|
|
||||||
}
|
|
||||||
// 循环直到当前半年的第一天晚于结束日期所在的半年的最后一天
|
|
||||||
// 或者简单判断 currentHalfYearStart 是否晚于 endDate
|
|
||||||
while (!currentHalfYearStart.isAfter(DateUtil.endOfYear(end))) { // 确保不超过endDate所在的年末
|
|
||||||
// 进一步判断是否已经超出了endDate
|
|
||||||
if (currentHalfYearStart.isAfter(end) && DateUtil.month(currentHalfYearStart) + 1 > 6) { // 避免过度遍历到下一个年份的下半年
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
shouldCheckedNum += sourceVo.getCheckNum();
|
|
||||||
DateTime finalCurrentHalfYearStart = currentHalfYearStart;
|
|
||||||
checkedNum += checkNumBos.stream().filter(bo -> {
|
|
||||||
boolean b1 = isSameSourceAndTime(begin, end, sourceVo, bo, finalCurrentHalfYearStart);
|
|
||||||
return b1 && DateUtil.compare(bo.getDate(), DateUtil.offsetMonth(DateUtil.beginOfYear(finalCurrentHalfYearStart), 6)) < 0;
|
|
||||||
}).count();
|
|
||||||
// 移动到下一个半年的第一个月
|
|
||||||
currentHalfYearStart = DateUtil.offsetMonth(currentHalfYearStart, 6);
|
|
||||||
}
|
}
|
||||||
|
checkedNum += Math.min(shouldCheckedNum, count);
|
||||||
}
|
}
|
||||||
sourceVo.setShouldCheckedNum(shouldCheckedNum);
|
sourceVo.setShouldCheckedNum(shouldCheckedNum);
|
||||||
sourceVo.setCheckedNum(checkedNum);
|
sourceVo.setAllCheckedNum(checkedNum);
|
||||||
}
|
}
|
||||||
//2. 统计执行率
|
//2. 统计执行率
|
||||||
// 临时Map,存储每个type的应排查总和和已排查总和
|
// 临时Map,存储每个type的应排查总和和已排查总和
|
||||||
@ -268,7 +239,7 @@ public class RiskListSourceDataCenterController {
|
|||||||
vo -> { // 为每个元素创建一个临时的Map
|
vo -> { // 为每个元素创建一个临时的Map
|
||||||
return new HashMap<String, Integer>() {{
|
return new HashMap<String, Integer>() {{
|
||||||
put("totalShould", vo.getShouldCheckedNum());
|
put("totalShould", vo.getShouldCheckedNum());
|
||||||
put("totalHave", vo.getCheckedNum());
|
put("totalHave", vo.getAllCheckedNum());
|
||||||
}};
|
}};
|
||||||
},
|
},
|
||||||
(map1, map2) -> { // 合并函数
|
(map1, map2) -> { // 合并函数
|
||||||
@ -300,6 +271,56 @@ public class RiskListSourceDataCenterController {
|
|||||||
return Result.success(voList);
|
return Result.success(voList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取危险源的时间列表
|
||||||
|
*
|
||||||
|
* @param begin
|
||||||
|
* @param end
|
||||||
|
* @param sourceVo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private List<DateTime> getDateTimes(Date begin, Date end, RiskListSourceVo sourceVo) {
|
||||||
|
Date b = DateUtil.compare((sourceVo.getEffectiveTimeBegin()), begin) > 0 ? sourceVo.getEffectiveTimeBegin() : begin;
|
||||||
|
Date e = DateUtil.compare(sourceVo.getEffectiveTimeEnd(), end) < 0 ? sourceVo.getEffectiveTimeEnd() : end;
|
||||||
|
List<DateTime> dateTimes = new ArrayList<>();
|
||||||
|
if (Objects.equals(sourceVo.getCheckPeriod(), 1)) {
|
||||||
|
dateTimes = DateUtil.rangeToList(b, e, DateField.DAY_OF_YEAR);
|
||||||
|
} else if (Objects.equals(sourceVo.getCheckPeriod(), 2)) {
|
||||||
|
dateTimes = DateUtil.rangeToList(b, e, DateField.DAY_OF_WEEK);
|
||||||
|
} else if (Objects.equals(sourceVo.getCheckPeriod(), 3)) {
|
||||||
|
dateTimes = DateUtil.rangeToList(b, e, DateField.MONTH);
|
||||||
|
} else if (Objects.equals(sourceVo.getCheckPeriod(), 4)) {
|
||||||
|
// 获取起始日期所在季度的第一天
|
||||||
|
DateTime currentQuarterStart = DateUtil.beginOfQuarter(begin);
|
||||||
|
dateTimes.add(currentQuarterStart);
|
||||||
|
while (!currentQuarterStart.isAfter(DateUtil.endOfQuarter(end))) {
|
||||||
|
currentQuarterStart = DateUtil.offsetMonth(currentQuarterStart, 3);
|
||||||
|
dateTimes.add(DateUtil.offsetMonth(currentQuarterStart, 3));
|
||||||
|
}
|
||||||
|
} else if (Objects.equals(sourceVo.getCheckPeriod(), 5)) {
|
||||||
|
// 找到起始日期所在的半年的第一个月的第一天
|
||||||
|
DateTime currentHalfYearStart;
|
||||||
|
int startMonth = DateUtil.month(begin) + 1; // 月份是0-11,所以+1
|
||||||
|
if (startMonth >= 1 && startMonth <= 6) { // 上半年 (1月-6月)
|
||||||
|
currentHalfYearStart = DateUtil.beginOfYear(begin); // 获取年份的开始,即1月1日
|
||||||
|
} else { // 下半年 (7月-12月)
|
||||||
|
currentHalfYearStart = DateUtil.offsetMonth(DateUtil.beginOfYear(begin), 6); // 获取年份的开始,然后偏移6个月,即7月1日
|
||||||
|
}
|
||||||
|
dateTimes.add(currentHalfYearStart);
|
||||||
|
// 循环直到当前半年的第一天晚于结束日期所在的半年的最后一天
|
||||||
|
while (!currentHalfYearStart.isAfter(DateUtil.endOfYear(end))) { // 确保不超过endDate所在的年末
|
||||||
|
// 进一步判断是否已经超出了endDate
|
||||||
|
if (currentHalfYearStart.isAfter(end) && DateUtil.month(currentHalfYearStart) + 1 > 6) { // 避免过度遍历到下一个年份的下半年
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// 移动到下一个半年的第一个月
|
||||||
|
currentHalfYearStart = DateUtil.offsetMonth(currentHalfYearStart, 6);
|
||||||
|
dateTimes.add(currentHalfYearStart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dateTimes;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 相同source并且在时间范围内
|
* 相同source并且在时间范围内
|
||||||
*
|
*
|
||||||
@ -360,80 +381,84 @@ public class RiskListSourceDataCenterController {
|
|||||||
}
|
}
|
||||||
Date begin = DateUtil.parseDate(MapUtils.getString(param, "effectiveTimeEnd_begin"));
|
Date begin = DateUtil.parseDate(MapUtils.getString(param, "effectiveTimeEnd_begin"));
|
||||||
Date end = DateUtil.parseDate(MapUtils.getString(param, "effectiveTimeBegin_end"));
|
Date end = DateUtil.parseDate(MapUtils.getString(param, "effectiveTimeBegin_end"));
|
||||||
List<SourceCheckNumBo> checkNumBos = getSourceCheckNumBo(sourceVos);
|
String projectSn = MapUtils.getString(param, "projectSn");
|
||||||
|
List<XzSecurityQualityInspectionRecord> securityList = xzSecurityQualityInspectionRecordService.list(new LambdaQueryWrapper<XzSecurityQualityInspectionRecord>()
|
||||||
|
.eq(XzSecurityQualityInspectionRecord::getType, 10)
|
||||||
|
.eq(XzSecurityQualityInspectionRecord::getProjectSn, projectSn)
|
||||||
|
);
|
||||||
|
List<RiskListSourceUnbuilt> unbuilts = riskListSourceUnbuiltService.list(new LambdaQueryWrapper<RiskListSourceUnbuilt>()
|
||||||
|
.in(RiskListSourceUnbuilt::getProjectSn, projectSn));
|
||||||
|
Map<Long, Map<String, List<XzSecurityQualityInspectionRecord>>> sourceId2RegionId2SecurityListMap = securityList.stream()
|
||||||
|
.collect(Collectors.groupingBy(
|
||||||
|
XzSecurityQualityInspectionRecord::getEngineeringId,
|
||||||
|
Collectors.collectingAndThen(
|
||||||
|
Collectors.toList(),
|
||||||
|
records -> records.stream()
|
||||||
|
.filter(r -> Objects.nonNull(r.getRegionIds()))
|
||||||
|
.flatMap(record ->
|
||||||
|
Arrays.stream(record.getRegionIds().split(","))
|
||||||
|
.map(String::trim)
|
||||||
|
.filter(regionId -> !regionId.isEmpty())
|
||||||
|
.map(regionId -> new AbstractMap.SimpleEntry<>(regionId, record))
|
||||||
|
)
|
||||||
|
.collect(Collectors.groupingBy(
|
||||||
|
AbstractMap.SimpleEntry::getKey,
|
||||||
|
Collectors.mapping(
|
||||||
|
AbstractMap.SimpleEntry::getValue,
|
||||||
|
Collectors.toList()
|
||||||
|
))))));
|
||||||
|
Map<Long, Map<String, List<RiskListSourceUnbuilt>>> sourceId2RegionId2UnbuiltListMap = unbuilts.stream().collect(Collectors.groupingBy(RiskListSourceUnbuilt::getSourceId,
|
||||||
|
Collectors.groupingBy((RiskListSourceUnbuilt riskListSourceUnbuilt) -> Convert.toStr(riskListSourceUnbuilt.getResponsibleRegionId()))));
|
||||||
//1. 计算有效期内的source的每天的应排查、(未施工+已排查)数量
|
//1. 计算有效期内的source的每天的应排查、(未施工+已排查)数量
|
||||||
List<RiskByDateBo> sourceDateVos = new ArrayList<>();
|
List<RiskByDateBo> sourceDateVos = new ArrayList<>();
|
||||||
for (RiskListSourceVo sourceVo : sourceVos) {
|
for (RiskListSourceVo sourceVo : sourceVos) {
|
||||||
Date b = DateUtil.compare((sourceVo.getEffectiveTimeBegin()), begin) < 0 ? sourceVo.getEffectiveTimeBegin() : begin;
|
List<DateTime> dateTimes = getDateTimes(begin, end, sourceVo);
|
||||||
Date e = DateUtil.compare(sourceVo.getEffectiveTimeEnd(), end) < 0 ? sourceVo.getEffectiveTimeEnd() : end;
|
for (DateTime time : dateTimes) {
|
||||||
if (Objects.equals(sourceVo.getCheckPeriod(), 1)) {
|
int shouldCheckedNum = sourceVo.getSpecificResponsibilityAreaIds().split(",").length * sourceVo.getCheckNum();
|
||||||
DateRange range = DateUtil.range(b, DateUtil.offsetDay(e, 1), DateField.DAY_OF_YEAR);
|
String areaIds = sourceVo.getSpecificResponsibilityAreaIds();
|
||||||
for (DateTime time : range) {
|
int count = 0;
|
||||||
addRiskByDateBo(sourceDateVos, time, DateUtil.offsetWeek(time, 1), sourceVo, checkNumBos, begin, end);
|
if (StrUtil.isNotBlank(areaIds)) {
|
||||||
}
|
count = StrUtil.split(areaIds, ",").stream().map(regionId -> {
|
||||||
} else if (Objects.equals(sourceVo.getCheckPeriod(), 2)) {
|
return riskListSourceService.getCalNum(sourceVo, regionId, time, Optional.ofNullable(sourceId2RegionId2SecurityListMap.get(sourceVo.getId())).map(m -> m.get(regionId)).orElse(null),
|
||||||
DateRange range = DateUtil.range(DateUtil.beginOfWeek(b), DateUtil.offsetWeek(e, 1), DateField.DAY_OF_WEEK);
|
Optional.ofNullable(sourceId2RegionId2UnbuiltListMap.get(sourceVo.getId())).map(m -> m.get(regionId)).orElse(null));
|
||||||
for (DateTime time : range) {
|
}).mapToInt(v -> v).sum();
|
||||||
addRiskByDateBo(sourceDateVos, time, DateUtil.offsetWeek(time, 1), sourceVo, checkNumBos, begin, end);
|
|
||||||
}
|
|
||||||
} else if (Objects.equals(sourceVo.getCheckPeriod(), 3)) {
|
|
||||||
DateRange range = DateUtil.range(DateUtil.beginOfMonth(b), DateUtil.offsetMonth(e, 1), DateField.MONTH);
|
|
||||||
for (DateTime time : range) {
|
|
||||||
addRiskByDateBo(sourceDateVos, time, DateUtil.offsetMonth(time, 1), sourceVo, checkNumBos, begin, end);
|
|
||||||
}
|
|
||||||
} else if (Objects.equals(sourceVo.getCheckPeriod(), 4)) {
|
|
||||||
// 获取起始日期所在季度的第一天
|
|
||||||
DateTime currentQuarterStart = DateUtil.beginOfQuarter(begin);
|
|
||||||
// 循环直到当前季度的第一天晚于结束日期
|
|
||||||
// 注意:这里需要确保 endDate 所在的季度被包含。
|
|
||||||
// 可以判断 currentQuarterStart 是否在 endDate 所在季度的开始之前或相同
|
|
||||||
while (!currentQuarterStart.isAfter(DateUtil.endOfQuarter(end))) {
|
|
||||||
addRiskByDateBo(sourceDateVos, currentQuarterStart, DateUtil.offsetMonth(currentQuarterStart, 3), sourceVo, checkNumBos, begin, end);
|
|
||||||
currentQuarterStart = DateUtil.offsetMonth(currentQuarterStart, 3);
|
|
||||||
}
|
|
||||||
} else if (Objects.equals(sourceVo.getCheckPeriod(), 5)) {
|
|
||||||
// 找到起始日期所在的半年的第一个月的第一天
|
|
||||||
DateTime currentHalfYearStart;
|
|
||||||
int startMonth = DateUtil.month(begin) + 1; // 月份是0-11,所以+1
|
|
||||||
if (startMonth >= 1 && startMonth <= 6) { // 上半年 (1月-6月)
|
|
||||||
currentHalfYearStart = DateUtil.beginOfYear(begin); // 获取年份的开始,即1月1日
|
|
||||||
} else { // 下半年 (7月-12月)
|
|
||||||
currentHalfYearStart = DateUtil.offsetMonth(DateUtil.beginOfYear(begin), 6); // 获取年份的开始,然后偏移6个月,即7月1日
|
|
||||||
}
|
|
||||||
// 循环直到当前半年的第一天晚于结束日期所在的半年的最后一天
|
|
||||||
// 或者简单判断 currentHalfYearStart 是否晚于 endDate
|
|
||||||
while (!currentHalfYearStart.isAfter(DateUtil.endOfYear(end))) { // 确保不超过endDate所在的年末
|
|
||||||
// 进一步判断是否已经超出了endDate
|
|
||||||
if (currentHalfYearStart.isAfter(end) && DateUtil.month(currentHalfYearStart) + 1 > 6) { // 避免过度遍历到下一个年份的下半年
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
addRiskByDateBo(sourceDateVos, currentHalfYearStart, DateUtil.offsetMonth(currentHalfYearStart, 6), sourceVo, checkNumBos, begin, end);
|
|
||||||
// 移动到下一个半年的第一个月
|
|
||||||
currentHalfYearStart = DateUtil.offsetMonth(currentHalfYearStart, 6);
|
|
||||||
}
|
}
|
||||||
|
int checkedNum = Math.min(shouldCheckedNum, count);
|
||||||
|
RiskByDateBo newbo = new RiskByDateBo();
|
||||||
|
newbo.setDate(time);
|
||||||
|
newbo.setShouldCheckedNum(shouldCheckedNum);
|
||||||
|
newbo.setAllCheckedNum(checkedNum);
|
||||||
|
newbo.setSourceId(sourceVo.getId());
|
||||||
|
sourceDateVos.add(newbo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//2. 统计每日执行率
|
//2. 统计每日执行率
|
||||||
// 临时Map,存储每个type的应排查总和和已排查总和
|
// 临时Map,存储每个type的应排查总和和已排查总和
|
||||||
Map<Date, Map<String, Integer>> sumsByType = sourceDateVos.stream().collect(Collectors.groupingBy(RiskByDateBo::getDate,
|
Map<Date, Map<String, Integer>> sumsByType = sourceDateVos.stream()
|
||||||
Collectors.reducing(
|
.collect(Collectors.groupingBy(
|
||||||
new HashMap<String, Integer>() {{
|
RiskByDateBo::getDate,
|
||||||
put("totalShould", 0);
|
Collectors.collectingAndThen(
|
||||||
put("totalHave", 0);
|
Collectors.toList(),
|
||||||
}}, // 初始值
|
list -> {
|
||||||
vo -> { // 为每个元素创建一个临时的Map
|
int totalShould = list.stream().mapToInt(RiskByDateBo::getShouldCheckedNum).sum();
|
||||||
return new HashMap<String, Integer>() {{
|
int totalHave = list.stream().mapToInt(RiskByDateBo::getAllCheckedNum).sum();
|
||||||
put("totalShould", vo.getShouldCheckedNum());
|
return new HashMap<String, Integer>() {{
|
||||||
put("totalHave", vo.getCheckedNum());
|
put("totalShould", totalShould);
|
||||||
}};
|
put("totalHave", totalHave);
|
||||||
},
|
}};
|
||||||
(map1, map2) -> { // 合并函数
|
}
|
||||||
map1.merge("totalShould", map2.get("totalShould"), (integer, integer2) -> NumberUtil.add(integer, integer2).intValue());
|
)
|
||||||
map1.merge("totalHave", map2.get("totalHave"), (integer, integer2) -> NumberUtil.add(integer, integer2).intValue());
|
));
|
||||||
return map1;
|
List<DateTime> dateTimes = DateUtil.rangeToList(begin, end, DateField.DAY_OF_YEAR);
|
||||||
}
|
for (DateTime dateTime : dateTimes) {
|
||||||
)));
|
if (!sumsByType.containsKey(dateTime)) {
|
||||||
|
sumsByType.put(dateTime, new HashMap<String, Integer>() {{
|
||||||
|
put("totalShould", 0);
|
||||||
|
put("totalHave", 0);
|
||||||
|
}});
|
||||||
|
}
|
||||||
|
}
|
||||||
// 计算比率并转换为目标输出格式
|
// 计算比率并转换为目标输出格式
|
||||||
List<TrendOneVo> voList = sumsByType.entrySet().stream()
|
List<TrendOneVo> voList = sumsByType.entrySet().stream()
|
||||||
.sorted(Comparator.comparing(Map.Entry::getKey))
|
.sorted(Comparator.comparing(Map.Entry::getKey))
|
||||||
@ -452,8 +477,7 @@ public class RiskListSourceDataCenterController {
|
|||||||
vo.setX(DateUtil.formatDate(type));
|
vo.setX(DateUtil.formatDate(type));
|
||||||
vo.setY(Convert.toStr(sumRatio));
|
vo.setY(Convert.toStr(sumRatio));
|
||||||
return vo;
|
return vo;
|
||||||
})
|
}).sorted(Comparator.comparing(TrendOneVo::getX)).collect(Collectors.toList());
|
||||||
.collect(Collectors.toList());
|
|
||||||
return Result.success(voList);
|
return Result.success(voList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -214,7 +214,7 @@ public class RiskListSource implements Serializable {
|
|||||||
* 活动频率
|
* 活动频率
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "活动频率")
|
@ApiModelProperty(value = "活动频率")
|
||||||
private java.lang.Integer activityFrequency;
|
private java.lang.String activityFrequency;
|
||||||
/**
|
/**
|
||||||
* 设备设施属性
|
* 设备设施属性
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -19,5 +19,9 @@ public class RiskByDateBo {
|
|||||||
* 已排查数量(隐患+排查记录)
|
* 已排查数量(隐患+排查记录)
|
||||||
*/
|
*/
|
||||||
private java.lang.Integer checkedNum;
|
private java.lang.Integer checkedNum;
|
||||||
|
/**
|
||||||
|
* 已排查数量(隐患+排查记录+未施工数量)
|
||||||
|
*/
|
||||||
|
private java.lang.Integer allCheckedNum;
|
||||||
private Long sourceId;
|
private Long sourceId;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,10 @@ import com.zhgd.xmgl.modules.risk.entity.RiskListSource;
|
|||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import javax.imageio.ImageWriter;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -22,7 +25,7 @@ public class RiskListSourceVo extends RiskListSource {
|
|||||||
@ApiModelProperty(value = "风险值")
|
@ApiModelProperty(value = "风险值")
|
||||||
private BigDecimal riskVal;
|
private BigDecimal riskVal;
|
||||||
/**
|
/**
|
||||||
* 应排查数量
|
* 应排查数量(隐患+排查记录+未施工数量)
|
||||||
*/
|
*/
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
private java.lang.Integer shouldCheckedNum;
|
private java.lang.Integer shouldCheckedNum;
|
||||||
@ -31,6 +34,11 @@ public class RiskListSourceVo extends RiskListSource {
|
|||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "已排查数量(隐患+排查记录)")
|
@ApiModelProperty(value = "已排查数量(隐患+排查记录)")
|
||||||
private java.lang.Integer checkedNum;
|
private java.lang.Integer checkedNum;
|
||||||
|
/**
|
||||||
|
* 已排查数量(隐患+排查记录+未施工数量)
|
||||||
|
*/
|
||||||
|
@JsonIgnore
|
||||||
|
private java.lang.Integer allCheckedNum;
|
||||||
/**
|
/**
|
||||||
* 未施工数量
|
* 未施工数量
|
||||||
*/
|
*/
|
||||||
@ -118,4 +126,16 @@ public class RiskListSourceVo extends RiskListSource {
|
|||||||
@ApiModelProperty(value = "具体责任区域名称(多个,分割)")
|
@ApiModelProperty(value = "具体责任区域名称(多个,分割)")
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private java.lang.String specificResponsibilityAreaNames;
|
private java.lang.String specificResponsibilityAreaNames;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// 检查 WEBP 编码器是否可用
|
||||||
|
Iterator<ImageWriter> writers = ImageIO.getImageWritersByMIMEType("image/webp");
|
||||||
|
if (writers.hasNext()) {
|
||||||
|
System.out.println("✅ WEBP encoder is available!");
|
||||||
|
ImageWriter writer = writers.next();
|
||||||
|
System.out.println("Encoder: " + writer.getClass().getName());
|
||||||
|
} else {
|
||||||
|
System.out.println("❌ WEBP encoder NOT available.");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,12 +4,16 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import com.zhgd.xmgl.base.entity.vo.SectorOneVo;
|
import com.zhgd.xmgl.base.entity.vo.SectorOneVo;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.RiskListSource;
|
import com.zhgd.xmgl.modules.risk.entity.RiskListSource;
|
||||||
|
import com.zhgd.xmgl.modules.risk.entity.RiskListSourceUnbuilt;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.dto.RiskListSourceDto;
|
import com.zhgd.xmgl.modules.risk.entity.dto.RiskListSourceDto;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.vo.CountRisksByLevelVo;
|
import com.zhgd.xmgl.modules.risk.entity.vo.CountRisksByLevelVo;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo;
|
import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.vo.RiskUndoneVo;
|
import com.zhgd.xmgl.modules.risk.entity.vo.RiskUndoneVo;
|
||||||
|
import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityQualityInspectionRecord;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -36,6 +40,18 @@ public interface IRiskListSourceService extends IService<RiskListSource> {
|
|||||||
*/
|
*/
|
||||||
List<RiskListSourceVo> queryList(HashMap<String, Object> param);
|
List<RiskListSourceVo> queryList(HashMap<String, Object> param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算完成的数量
|
||||||
|
*
|
||||||
|
* @param sourceVo
|
||||||
|
* @param regionId
|
||||||
|
* @param date
|
||||||
|
* @param securityList
|
||||||
|
* @param unbuilts
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int getCalNum(RiskListSourceVo sourceVo, String regionId, Date date, @Nullable List<XzSecurityQualityInspectionRecord> securityList, @Nullable List<RiskListSourceUnbuilt> unbuilts);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加管控清单危险源信息
|
* 添加管控清单危险源信息
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package com.zhgd.xmgl.modules.risk.service.impl;
|
package com.zhgd.xmgl.modules.risk.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
@ -14,6 +15,7 @@ import com.zhgd.xmgl.modules.quality.entity.vo.QualityRegionVo;
|
|||||||
import com.zhgd.xmgl.modules.quality.service.IQualityRegionService;
|
import com.zhgd.xmgl.modules.quality.service.IQualityRegionService;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.RiskListPoint;
|
import com.zhgd.xmgl.modules.risk.entity.RiskListPoint;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.RiskListSource;
|
import com.zhgd.xmgl.modules.risk.entity.RiskListSource;
|
||||||
|
import com.zhgd.xmgl.modules.risk.entity.dto.RiskListSourceDto;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.vo.RiskListPointVo;
|
import com.zhgd.xmgl.modules.risk.entity.vo.RiskListPointVo;
|
||||||
import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo;
|
import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo;
|
||||||
import com.zhgd.xmgl.modules.risk.mapper.RiskListPointMapper;
|
import com.zhgd.xmgl.modules.risk.mapper.RiskListPointMapper;
|
||||||
@ -103,6 +105,9 @@ public class RiskListPointServiceImpl extends ServiceImpl<RiskListPointMapper, R
|
|||||||
.in(RiskListSource::getPointId, pointIds));
|
.in(RiskListSource::getPointId, pointIds));
|
||||||
Integer isMySourceToDoForWorkable = MapUtils.getInteger(param, "isMySourceToDoForWorkable");
|
Integer isMySourceToDoForWorkable = MapUtils.getInteger(param, "isMySourceToDoForWorkable");
|
||||||
Integer isMySourceToDo = MapUtils.getInteger(param, "isMySourceToDo");
|
Integer isMySourceToDo = MapUtils.getInteger(param, "isMySourceToDo");
|
||||||
|
for (RiskListPointVo riskListPointVo : list) {
|
||||||
|
riskListPointVo.setHazardSourceNumber((int) sources.stream().filter(riskListSource -> Objects.equals(riskListSource.getPointId(), riskListPointVo.getId())).count());
|
||||||
|
}
|
||||||
if (Objects.equals(isMySourceToDo, 1) || Objects.equals(isMySourceToDoForWorkable, 1)) {
|
if (Objects.equals(isMySourceToDo, 1) || Objects.equals(isMySourceToDoForWorkable, 1)) {
|
||||||
Long regionIds = MapUtils.getLong(param, "regionIds");
|
Long regionIds = MapUtils.getLong(param, "regionIds");
|
||||||
List<RiskListSourceVo> sourceVos = riskListSourceService.queryList(new MapBuilder<String, Object>()
|
List<RiskListSourceVo> sourceVos = riskListSourceService.queryList(new MapBuilder<String, Object>()
|
||||||
@ -158,6 +163,28 @@ public class RiskListPointServiceImpl extends ServiceImpl<RiskListPointMapper, R
|
|||||||
.set(RiskListPoint::getEffectiveTimeEnd, point.getEffectiveTimeEnd())
|
.set(RiskListPoint::getEffectiveTimeEnd, point.getEffectiveTimeEnd())
|
||||||
.eq(RiskListPoint::getId, point.getId())
|
.eq(RiskListPoint::getId, point.getId())
|
||||||
);
|
);
|
||||||
|
editSource(point);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新危险源
|
||||||
|
*
|
||||||
|
* @param point
|
||||||
|
*/
|
||||||
|
private void editSource(RiskListPoint point) {
|
||||||
|
List<RiskListSource> sources = riskListSourceService.list(new LambdaQueryWrapper<RiskListSource>()
|
||||||
|
.eq(RiskListSource::getPointId, point.getId()));
|
||||||
|
for (RiskListSource source : sources) {
|
||||||
|
source.setAreaLocation(point.getAreaLocation());
|
||||||
|
source.setRemark(point.getRiskSituationDescription());
|
||||||
|
source.setActivityFrequency(point.getActivityFrequency());
|
||||||
|
source.setEffectiveTimeBegin(point.getEffectiveTimeBegin());
|
||||||
|
source.setEffectiveTimeEnd(point.getEffectiveTimeEnd());
|
||||||
|
RiskListSourceDto sourceDto = new RiskListSourceDto();
|
||||||
|
BeanUtil.copyProperties(source, sourceDto);
|
||||||
|
sourceDto.setSpecificResponsibilityAreaIds(point.getSpecificResponsibilityAreaIds());
|
||||||
|
riskListSourceService.edit(sourceDto);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -236,7 +236,7 @@ public class RiskListSourceServiceImpl extends ServiceImpl<RiskListSourceMapper,
|
|||||||
List<XzSecurityQualityInspectionRecord> securityList1 = securityList.stream().filter(r -> StrUtil.isNotBlank(r.getInspectTime()) && Objects.equals(r.getEngineeringId(), sourceVo.getId())).collect(Collectors.toList());
|
List<XzSecurityQualityInspectionRecord> securityList1 = securityList.stream().filter(r -> StrUtil.isNotBlank(r.getInspectTime()) && Objects.equals(r.getEngineeringId(), sourceVo.getId())).collect(Collectors.toList());
|
||||||
List<RiskListSourceUnbuilt> unbuilts1 = unbuilts.stream().filter(r -> r.getInspectionTime() != null && Objects.equals(r.getSourceId(), sourceVo.getId())).collect(Collectors.toList());
|
List<RiskListSourceUnbuilt> unbuilts1 = unbuilts.stream().filter(r -> r.getInspectionTime() != null && Objects.equals(r.getSourceId(), sourceVo.getId())).collect(Collectors.toList());
|
||||||
return StrUtil.split(sourceVo.getSpecificResponsibilityAreaIds(), ",").stream().map(Convert::toLong).filter(regionId -> {
|
return StrUtil.split(sourceVo.getSpecificResponsibilityAreaIds(), ",").stream().map(Convert::toLong).filter(regionId -> {
|
||||||
int totalCalNum = getCalNum(sourceVo, String.valueOf(regionId), securityList1, unbuilts1);
|
int totalCalNum = getCalNum(sourceVo, String.valueOf(regionId), new Date(), securityList1, unbuilts1);
|
||||||
int remainingNum = sourceVo.getCheckNum() - totalCalNum;
|
int remainingNum = sourceVo.getCheckNum() - totalCalNum;
|
||||||
return remainingNum > 0;
|
return remainingNum > 0;
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
@ -260,30 +260,26 @@ public class RiskListSourceServiceImpl extends ServiceImpl<RiskListSourceMapper,
|
|||||||
int totalNum = sourceVo.getSpecificResponsibilityAreaIds().split(",").length * sourceVo.getCheckNum();
|
int totalNum = sourceVo.getSpecificResponsibilityAreaIds().split(",").length * sourceVo.getCheckNum();
|
||||||
int totalCalNum = 0;
|
int totalCalNum = 0;
|
||||||
for (String regionId : sourceVo.getSpecificResponsibilityAreaIds().split(",")) {
|
for (String regionId : sourceVo.getSpecificResponsibilityAreaIds().split(",")) {
|
||||||
totalCalNum = getCalNum(sourceVo, regionId, securityList1, unbuilts1);
|
totalCalNum = getCalNum(sourceVo, regionId, new Date(), securityList1, unbuilts1);
|
||||||
}
|
}
|
||||||
return totalNum - totalCalNum;
|
return totalNum - totalCalNum;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* 计算完成的数量
|
public int getCalNum(RiskListSourceVo sourceVo, String regionId, Date date, List<XzSecurityQualityInspectionRecord> securityList, List<RiskListSourceUnbuilt> unbuilts) {
|
||||||
*
|
if (securityList == null) {
|
||||||
* @param sourceVo
|
securityList = new ArrayList<>();
|
||||||
* @param regionId
|
}
|
||||||
* @param securityList
|
if (unbuilts == null) {
|
||||||
* @param unbuilts
|
unbuilts = new ArrayList<>();
|
||||||
* @return
|
}
|
||||||
*/
|
|
||||||
private int getCalNum(RiskListSourceVo sourceVo, String regionId, List<XzSecurityQualityInspectionRecord> securityList, List<RiskListSourceUnbuilt> unbuilts) {
|
|
||||||
String today = DateUtil.today();
|
|
||||||
Date date = new Date();
|
|
||||||
String year = DateUtil.format(date, "yyyy");
|
String year = DateUtil.format(date, "yyyy");
|
||||||
int totalCalNum = 0;
|
int totalCalNum = 0;
|
||||||
if (Objects.equals(sourceVo.getCheckPeriod(), 1)) {
|
if (Objects.equals(sourceVo.getCheckPeriod(), 1)) {
|
||||||
int count = (int) securityList.stream().filter(r -> DateUtil.isSameDay(DateUtil.parseDate(r.getInspectTime()), date) && isContainRegion(r, regionId)).count();
|
int count = (int) securityList.stream().filter(r -> DateUtil.isSameDay(DateUtil.parseDate(r.getInspectTime()), date) && isContainRegion(r, regionId)).count();
|
||||||
int count1 = (int) unbuilts.stream().filter(r -> DateUtil.formatDate(r.getInspectionTime()).startsWith(today) && isEqualRegion(regionId, r)).count();
|
int count1 = (int) unbuilts.stream().filter(r -> DateUtil.formatDate(r.getInspectionTime()).startsWith(DateUtil.formatDate(date)) && isEqualRegion(regionId, r)).count();
|
||||||
totalCalNum += Math.min(count + count1, sourceVo.getCheckNum());
|
totalCalNum += Math.min(count + count1, sourceVo.getCheckNum());
|
||||||
} else if (Objects.equals(sourceVo.getCheckPeriod(), 2)) {
|
} else if (Objects.equals(sourceVo.getCheckPeriod(), 2)) {
|
||||||
int count = (int) securityList.stream().filter(r -> DateUtil.isSameWeek(DateUtil.parseDate(r.getInspectTime()), date, true) && isContainRegion(r, regionId)).count();
|
int count = (int) securityList.stream().filter(r -> DateUtil.isSameWeek(DateUtil.parseDate(r.getInspectTime()), date, true) && isContainRegion(r, regionId)).count();
|
||||||
|
|||||||
BIN
src/main/resources/lib/webp-imageio-core-0.1.3.jar
Normal file
BIN
src/main/resources/lib/webp-imageio-core-0.1.3.jar
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user