Commit db733e2f authored by tianbo's avatar tianbo

feat(statistics): 为特种设备添加上线率计算功能

- 新增上线率计算逻辑,针对锅炉、电梯、起重机械等设备类型 - 添加底数和上线率字段到 SkjsEquipCountItemDto 类 - 实现 calculateRate 方法用于计算上线率 - 修改 getEquipOnLineInfo 方法,增加上线率相关数据的获取和计算- 更新 RegionModelDto 类,添加 parentRegionCode 字段 -调整 RegulatoryUnitLevelEnum枚举,使用 level 代替 code
parent 4c4efa38
package com.yeejoin.amos.boot.module.statistics.api.dto;
import lombok.Builder;
import lombok.Data;
/**
......@@ -15,6 +14,11 @@ public class RegionModelDto {
private String regionCode;
/**
* 父级区域-code
*/
private String parentRegionCode;
/**
* 区域-name
*/
private String regionName;
......
......@@ -34,10 +34,29 @@ public class SkjsEquipCountItemDto {
private String dt;
/**
* 电梯-底数
*/
private String dtBaseline;
/**
* 电梯上线率
*/
private String dtOnlineRate;
/**
* 起重机械
*/
private String qzjx;
/**
* 起重机械-底数
*/
private String qzjxBaseline;
/**
* 起重机械上线率
*/
private String qzjxOnlineRate;
/**
* 客运索道
......@@ -45,38 +64,105 @@ public class SkjsEquipCountItemDto {
private String kysd;
/**
* 客运索道-底数
*/
private String kysdBaseline;
/**
* 客运索道上线率
*/
private String kysdOnlineRate;
/**
* 大型游乐设施
*/
private String dxylss;
/**
* 大型游乐设施-底数
*/
private String dxylssBaseline;
/**
* 大型游乐设施上线率
*/
private String dxylssOnlineRate;
/**
* 厂车
*/
private String cc;
/**
* 厂车-底数
*/
private String ccBaseline;
/**
* 厂车上线率
*/
private String ccOnlineRate;
/**
* 锅炉
*/
private String gl;
/**
* 锅炉-底数
*/
private String glBaseline;
/**
* 锅炉上线率
*/
private String glOnlineRate;
/**
* 压力容器
*/
private String ylrq;
/**
* 压力容器-底数
*/
private String ylrqBaseline;
/**
* 压力容器上线率
*/
private String ylrqOnlineRate;
/**
* 压力管道
*/
private String ylgd;
/**
* 压力管道-底数
*/
private String ylgdBaseline;
/**
* 压力管道上线率
*/
private String ylgdOnlineRate;
/**
* 气瓶
*/
private String qp;
/**
* 气瓶-底数
*/
private String qpBaseline;
/**
* 气瓶上线率
*/
private String qpOnlineRate;
public void setDefaultValues() {
this.dt = "0";
this.qzjx = "0";
......
......@@ -15,12 +15,12 @@ public enum RegulatoryUnitLevelEnum {
* *监管单位类型
*/
省局("省局", "headquarter"),
市局("市局", "prefecture-level"),
区县局("区县局", "county");
PROVINCE("省局", "headquarter"),
CITY("市局", "prefecture-level"),
COUNTY("区县局", "county");
private final String name;
private final String code;
private final String level;
public static Map<String, String> getName = new HashMap<>();
public static Map<String, String> getCode = new HashMap<>();
......@@ -28,12 +28,12 @@ public enum RegulatoryUnitLevelEnum {
static {
for (RegulatoryUnitLevelEnum e : RegulatoryUnitLevelEnum.values()) {
getName.put(e.code, e.name);
getCode.put(e.name, e.code);
getName.put(e.level, e.name);
getCode.put(e.name, e.level);
}
}
public static RegulatoryUnitLevelEnum getEnumByCode(String code) {
return Arrays.stream(RegulatoryUnitLevelEnum.values()).filter(r -> r.code.equals(code)).findFirst().orElse(null);
public static RegulatoryUnitLevelEnum getEnumByLevelCode(String levelCode) {
return Arrays.stream(RegulatoryUnitLevelEnum.values()).filter(r -> r.level.equals(levelCode)).findFirst().orElse(null);
}
}
......@@ -48,4 +48,5 @@ public interface ZLStatisticsMapper {
List<CountDto> countUserByPostAndAreaCode(@Param("orgCode") String orgCode, @Param("regionCode") String regionCode, Boolean isOrgCodeExactMatch);
List<Map<String, Object>> getEquBaselineData();
}
......@@ -102,12 +102,17 @@
</select>
<select id="getEquipTotal" resultType="java.lang.Long">
select equip_num from tzs_equip_claim_statistics where city_code = #{cityCode}
select equip_num from tzs_equip_claim_statistics where is_delete = 0 and city_code = #{cityCode}
</select>
<select id="getEquListTotal" resultType="java.lang.Long">
select ${field} from tzs_equip_claim_statistics where city_code = #{cityCode}
select ${field} from tzs_equip_claim_statistics where is_delete = 0 and city_code = #{cityCode}
</select>
<select id="getEquBaselineData" resultType="java.util.Map">
select * from tzs_equip_claim_statistics where is_delete = 0
</select>
<select id="getPersonPage" resultType="java.util.Map">
SELECT
tui.sequence_nbr sequenceNbr,
......
......@@ -21,8 +21,8 @@ import com.yeejoin.amos.boot.module.common.api.dto.DPFilterParamDto;
import com.yeejoin.amos.boot.module.common.api.dto.DPFilterParamForDetailDto;
import com.yeejoin.amos.boot.module.common.api.dto.FormValue;
import com.yeejoin.amos.boot.module.common.api.dto.LegendDataDto;
import com.yeejoin.amos.boot.module.common.api.enums.*;
import com.yeejoin.amos.boot.module.common.api.enums.BusinessTypeEnum;
import com.yeejoin.amos.boot.module.common.api.enums.*;
import com.yeejoin.amos.boot.module.jg.api.dto.EquipBizCountDto;
import com.yeejoin.amos.boot.module.jg.api.dto.FourColorCountDataDto;
import com.yeejoin.amos.boot.module.jg.api.dto.JgUseRegistrationManageDto;
......@@ -48,6 +48,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.elasticsearch.action.search.SearchRequest;
......@@ -880,12 +881,12 @@ public class JGDPStatisticsServiceImpl {
}
private Long calAll(List<Long> everyFinishedNum, List<Long> everyFlowingNum) {
return everyFlowingNum.stream().mapToLong(e -> e).sum() + everyFinishedNum.stream().mapToLong(e -> e).sum() ;
return everyFlowingNum.stream().mapToLong(e -> e).sum() + everyFinishedNum.stream().mapToLong(e -> e).sum();
}
private List<Long> calEveryFinishAndFlowNum(List<Long> everyFinished, List<Long> everyFlowingCount) {
List<Long> all = new ArrayList<>();
for(int i= 0; i< everyFinished.size(); i++ ){
for (int i = 0; i < everyFinished.size(); i++) {
all.add(everyFinished.get(i) + everyFlowingCount.get(i));
}
return all;
......@@ -2261,14 +2262,14 @@ public class JGDPStatisticsServiceImpl {
}
}
// 是否撬装式压力容器
if ("2100".equals(map.getString(EQU_CATEGORY_CODE))){
if ("2100".equals(map.getString(EQU_CATEGORY_CODE))) {
if (!ObjectUtils.isEmpty(map.getString(WHETHER_SKID_MOUNTED_PRESSURE_VESSEL))) {
if ("1".equals(map.getString(WHETHER_SKID_MOUNTED_PRESSURE_VESSEL))){
if ("1".equals(map.getString(WHETHER_SKID_MOUNTED_PRESSURE_VESSEL))) {
BoolQueryBuilder pBuilder = QueryBuilders.boolQuery();
String test = QueryParser.escape(map.getString(WHETHER_SKID_MOUNTED_PRESSURE_VESSEL));
pBuilder.must(QueryBuilders.termQuery(WHETHER_SKID_MOUNTED_PRESSURE_VESSEL, test));
boolMust.must(pBuilder);
}else{
} else {
BoolQueryBuilder orBuilder = QueryBuilders.boolQuery();
orBuilder.should(QueryBuilders.termQuery(WHETHER_SKID_MOUNTED_PRESSURE_VESSEL, "0"));
orBuilder.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(WHETHER_SKID_MOUNTED_PRESSURE_VESSEL)));
......@@ -3666,6 +3667,7 @@ public class JGDPStatisticsServiceImpl {
regionModelDto.setRegionCode(r.getRegionCode().toString());
regionModelDto.setRegionName(r.getRegionName());
regionModelDto.setLevel(r.getLevel());
regionModelDto.setParentRegionCode(r.getParentRegionCode().toString());
regionModelsDto.add(regionModelDto);
});
if (orgCodeP == null || regionModels.isEmpty()) {
......@@ -3694,6 +3696,14 @@ public class JGDPStatisticsServiceImpl {
}
private Object getEquipOnLineInfo(List<RegionModelDto> regionModels) {
List<Map<String, Object>> baselineData;
// 如果是地市数据则计算上线率,上线率=系统已有数据/最新期底数x100%
if (RegulatoryUnitLevelEnum.CITY.getLevel().equals(regionModels.get(0).getLevel())
|| regionModels.stream().anyMatch(e -> RegulatoryUnitLevelEnum.PROVINCE.getLevel().equals(e.getLevel()))) {
baselineData = zlStatisticsMapper.getEquBaselineData();
} else {
baselineData = Lists.newArrayList();
}
// 多线程处理
Map<String, SkjsEquipCountItemDto> countItemMap = regionModels.parallelStream().map(r -> {
String regionCode = r.getRegionCode();
......@@ -3705,7 +3715,7 @@ public class JGDPStatisticsServiceImpl {
if (!ValidationUtil.isEmpty(orgCode)) {
Map<String, Object> data = new HashMap<>();
// 是否按监管机构代码精确匹配
Boolean isOrgBranchCodeExactMatch = !ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByCode(r.getLevel()));
Boolean isOrgBranchCodeExactMatch = !ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByLevelCode(r.getLevel()));
// 0. 气瓶数量统计
long cylinderNum = stCommonService.staticsCenterMapCountDataForCylinder(data, orgCode, false, false, isOrgBranchCodeExactMatch);
countItemDto.setQp(String.valueOf(cylinderNum));
......@@ -3720,6 +3730,30 @@ public class JGDPStatisticsServiceImpl {
countItemDto.setYlrq(String.valueOf(data.get(DPMapStatisticsItemEnum.PRESSURE_VESSELS.getCode())));
// 2. 压力管道长度统计
countItemDto.setYlgd(stCommonService.staticsCenterMapCountDataForPipeline(data, orgCode, true, isOrgBranchCodeExactMatch));
// 如果是地市数据则计算上线率,上线率=系统已有数据/最新期底数x100%
if ("610000".equals(r.getParentRegionCode())) {
Map<String, Object> baselineMap = baselineData.stream().filter(d -> d.get("city_code").equals(regionCode)).findFirst().orElse(null);
if (!ValidationUtil.isEmpty(baselineMap)) {
countItemDto.setGlBaseline(baselineMap.get("boiler").toString());
countItemDto.setGlOnlineRate(calculateRate(countItemDto.getGl(), baselineMap.get("boiler").toString()));
countItemDto.setDtBaseline(baselineMap.get("elevator").toString());
countItemDto.setDtOnlineRate(calculateRate(countItemDto.getDt(), baselineMap.get("elevator").toString()));
countItemDto.setQzjxBaseline(baselineMap.get("lifting").toString());
countItemDto.setQzjxOnlineRate(calculateRate(countItemDto.getQzjx(), baselineMap.get("lifting").toString()));
countItemDto.setKysdBaseline(baselineMap.get("ropeway").toString());
countItemDto.setKysdOnlineRate(calculateRate(countItemDto.getKysd(), baselineMap.get("ropeway").toString()));
countItemDto.setDxylssBaseline(baselineMap.get("rides").toString());
countItemDto.setDxylssOnlineRate(calculateRate(countItemDto.getDxylss(), baselineMap.get("rides").toString()));
countItemDto.setCcBaseline(baselineMap.get("vehicle").toString());
countItemDto.setCcOnlineRate(calculateRate(countItemDto.getCc(), baselineMap.get("vehicle").toString()));
countItemDto.setQpBaseline(baselineMap.get("cylinder").toString());
countItemDto.setQpOnlineRate(calculateRate(countItemDto.getQp(), baselineMap.get("cylinder").toString()));
countItemDto.setYlrqBaseline(baselineMap.get("vessel").toString());
countItemDto.setYlrqOnlineRate(calculateRate(countItemDto.getYlrq(), baselineMap.get("vessel").toString()));
countItemDto.setYlgdBaseline(baselineMap.get("pipeline").toString());
countItemDto.setYlgdOnlineRate(calculateRate(countItemDto.getYlgd(), baselineMap.get("pipeline").toString()));
}
}
} else {
countItemDto.setDefaultValues();
}
......@@ -3732,6 +3766,28 @@ public class JGDPStatisticsServiceImpl {
return countItemDtos;
}
private String calculateRate(String numerator, String denominator) {
double num = NumberUtils.toDouble(numerator, 0.0);
double den = NumberUtils.toDouble(denominator, 0.0);
if (den == 0) {
return num == 0 ? "0%" : "100%";
} else if (num == 0) {
return "0%";
}
double rate = num / den;
if (rate >= 1) {
return "100%";
}
// 如果是整数百分比,则返回不带小数的形式,否则保留两位小数
if (rate * 100 % 1 == 0) {
return String.format("%d%%", (int) (rate * 100));
} else {
return String.format("%.2f%%", rate * 100);
}
}
private Object getCompanyOnLineInfo(List<RegionModelDto> regionModels) {
// 多线程处理
Map<String, SkjsCompanyCountItemDto> companyCountItemDtoMap = regionModels.parallelStream().map(r -> {
......@@ -3740,13 +3796,13 @@ public class JGDPStatisticsServiceImpl {
String orgCode = stCommonService.getAndSetOrgCode(regionCode);
// 按管辖机构统计企业数量时:检验检测机构直接归属省局管辖,则只有省局才统计检验检测机构数量。其他地市区县不统计
// 只有按监管单位统计(r.getLevel()为空或者为省市区县级)才需要判断是否传regionCode
if (!ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByCode(r.getLevel())) || ValidationUtil.isEmpty(r.getLevel())) {
if (!RegulatoryUnitLevelEnum.省局.getCode().equals(r.getLevel())) {
if (!ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByLevelCode(r.getLevel())) || ValidationUtil.isEmpty(r.getLevel())) {
if (!RegulatoryUnitLevelEnum.PROVINCE.getLevel().equals(r.getLevel())) {
conditionRegionCode = null;
}
}
// 按管辖机构统计企业数量时:如果统计本监管单位则使用精确匹配
boolean isOrgCodeExactMatch = !ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByCode(r.getLevel()));
boolean isOrgCodeExactMatch = !ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByLevelCode(r.getLevel()));
SkjsCompanyCountItemDto companyCountItemDto = new SkjsCompanyCountItemDto();
companyCountItemDto.setRegionCode(regionCode);
companyCountItemDto.setRegionName(r.getRegionName());
......@@ -3790,14 +3846,13 @@ public class JGDPStatisticsServiceImpl {
userCountItemDto.setSuperviseKey(regionCode + "_" + r.getRegionName());
//按管辖机构统计企业数量时:检验检测机构直接归属省局管辖,则只有省局才统计检验检测机构数量。其他地市区县不统计
//只有按监管单位统计(r.getLeveL()为空或者为省市区县级)才需要判断是否传regionCode
if (!ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByCode(r.getLevel())) || ValidationUtil.isEmpty(r.getLevel()))
{
if (!RegulatoryUnitLevelEnum.省局.getCode().equals(r.getLevel())) {
if (!ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByLevelCode(r.getLevel())) || ValidationUtil.isEmpty(r.getLevel())) {
if (!RegulatoryUnitLevelEnum.PROVINCE.getLevel().equals(r.getLevel())) {
conditionRegionCode = null;
}
}
//按管辖机构统计企业数量时:如果统计本监管单位则使用精确匹配
boolean isOrgCodeExactMatch = !ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByCode(r.getLevel()));
boolean isOrgCodeExactMatch = !ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByLevelCode(r.getLevel()));
if (StringUtils.isNotEmpty(orgCode)) {
List<CountDto> countDtos = zlStatisticsMapper.countUserByPostAndAreaCode(orgCode, conditionRegionCode, isOrgCodeExactMatch);
// 作业人员
......@@ -3903,6 +3958,7 @@ public class JGDPStatisticsServiceImpl {
List<Map<String, Object>> result = (List<Map<String, Object>>) redisUtils.get(REGULATOR_UNIT_TREE);
return filterByOrgCode(result, orgCode);
}
public List<Map<String, Object>> filterByOrgCode(List<Map<String, Object>> nodeList, String targetOrgCode) {
List<Map<String, Object>> result = new ArrayList<>();
for (Map<String, Object> node : nodeList) {
......@@ -4000,11 +4056,12 @@ public class JGDPStatisticsServiceImpl {
RegionModelDto regionModel = new RegionModelDto();
regionModel.setRegionCode(r.get("companyCode").toString());
regionModel.setRegionName((String) r.get("companyName"));
regionModel.setParentRegionCode((String) parentModel.get("companyCode"));
regionModels.add(regionModel);
});
}
// 如果是省局、地市局、区县局查看,则把各对应省局、地市局、区县局数据单独添加到列表中
if (!ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByCode((String) parentModel.get("level")))) {
if (!ValidationUtil.isEmpty(RegulatoryUnitLevelEnum.getEnumByLevelCode((String) parentModel.get("level")))) {
RegionModelDto regionModel = new RegionModelDto();
regionModel.setRegionCode(parentModel.get("companyCode").toString());
regionModel.setRegionName((String) parentModel.get("companyName"));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment