Commit 4b733d54 authored by 韩桐桐's avatar 韩桐桐

feat(ys): 【验收】安全问题分析 + 教育培训统计 + 体系建设统计

parent 1584322f
package com.yeejoin.amos.boot.module.common.biz.service.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
......@@ -26,6 +10,20 @@ import com.yeejoin.amos.boot.module.common.api.entity.DynamicFormColumn;
import com.yeejoin.amos.boot.module.common.api.entity.DynamicFormInstance;
import com.yeejoin.amos.boot.module.common.api.mapper.DynamicFormInstanceMapper;
import com.yeejoin.amos.boot.module.common.api.service.IDynamicFormInstanceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* 动态表单实例表服务实现类
......@@ -136,18 +134,18 @@ public class DynamicFormInstanceServiceImpl extends BaseService<DynamicFormInsta
List<DynamicFormColumn> columns = dynamicFormColumnService.list(new LambdaQueryWrapper<DynamicFormColumn>().eq(DynamicFormColumn::getGroupCode, groupCode));
Map<String, Object> fieldCodes = Bean.listToMap(columns, "fieldCode", "queryStrategy", DynamicFormColumn.class);
Page page = new Page();
if (current > 0){
page.setCurrent((long) (current - 1) *size);
if (current > 0) {
page.setCurrent((long) (current - 1) * size);
page.setSize(size);
}
if (!params.isEmpty()&&params !=null){
if (!params.get("sort").isEmpty() && params.get("sort") != null){
if (!params.isEmpty() && params != null) {
if (!ValidationUtil.isEmpty(params.get("sort")) && params.get("sort") != null) {
String[] sorts = params.get("sort").split(",");
params.put("date",sorts[0]);
params.put("lift",sorts[1]);
params.put("date", sorts[0]);
params.put("lift", sorts[1]);
}
}
return this.getBaseMapper().pageList(page, RequestContext.getAppKey(), fieldCodes, groupCode, params);
return this.getBaseMapper().pageList(page, null, fieldCodes, groupCode, params);
}
// 不存在值班数据则不查找 修改sql 方法去除 by kongfm 2021-09-14
public IPage<Map<String, Object>> pageListNew(int current, int size, String groupCode, String beginDate, String endDate) {
......
package com.yeejoin.amos.boot.module.ys.api.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Optional;
/**
* <pre>
* 维保到期预警枚举
* </pre>
*/
@Getter
@AllArgsConstructor
public enum MaintenanceExpiredEarlyWarningEnum {
// 设备
QP("2300", "气瓶", "cylinderMaintenanceExpiredEarlyWarning"),
QZJX("4000", "起重机械", "liftingMachineryMaintenanceExpiredEarlyWarning"),
KYSD("9000", "客运索道", "passengerRopeWayMaintenanceExpiredEarlyWarning"),
YLSS("6000", "游乐设施", "amusementFacilitiesMaintenanceExpiredEarlyWarning"),
GL("1000", "锅炉", "boilerMaintenanceExpiredEarlyWarning"),
YLGD("8000", "压力管道", "pressurePipeMaintenanceExpiredEarlyWarning"),
CNJDCL("5000", "场内机动车辆", "yardMotorVehicleMaintenanceExpiredEarlyWarning"),
// 体系建设统计
TXJS("0001", "体系建设", "systemConstructionStatistics"),
// 教育培训统计
JYPX("0002", "教育培训", "educationAndTrainingStatistics");
private String typeCode; // 设备类型代码 || 业务类型代码
private String typeName; // 设备类型名称
private String groupCode; // 分组代码
/**
* 根据设备类型代码获取对应的枚举实例。
*
* @param equTypeCode 设备类型代码
* @return 对应的枚举实例,如果不存在则返回 Optional.empty()
*/
public static Optional<MaintenanceExpiredEarlyWarningEnum> getEnum(String equTypeCode) {
for (MaintenanceExpiredEarlyWarningEnum status : MaintenanceExpiredEarlyWarningEnum.values()) {
if (status.getTypeCode().equals(equTypeCode)) {
return Optional.of(status);
}
}
return Optional.empty();
}
@Override
public String toString() {
return String.format("MaintenanceExpiredEarlyWarningEnum{equTypeCode='%s', equTypeName='%s', groupCode='%s'}",
typeCode, typeName, groupCode);
}
}
package com.yeejoin.amos.boot.module.ys.biz.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yeejoin.amos.boot.biz.common.controller.BaseController;
import com.yeejoin.amos.boot.module.common.api.entity.DynamicFormInstance;
import com.yeejoin.amos.boot.module.common.biz.service.impl.DynamicFormInstanceServiceImpl;
import com.yeejoin.amos.boot.module.ys.api.enums.MaintenanceExpiredEarlyWarningEnum;
import com.yeejoin.amos.boot.module.ys.biz.service.impl.CommonServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.typroject.tyboot.core.foundation.enumeration.UserType;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import org.typroject.tyboot.core.restful.utils.ResponseHelper;
import org.typroject.tyboot.core.restful.utils.ResponseModel;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author system_generator
* @date 2024-09-24
*/
@RestController
@Api(tags = "维保过期预警分析")
@RequestMapping(value = "/maintenanceEarlyWarningWarning/{equTypeCode}")
public class MaintenanceEarlyWarningController extends BaseController {
private static final String SXCode = "50";
private static final HashMap<String, String> unitTypeMap = new HashMap<>();
@Autowired
private DynamicFormInstanceServiceImpl dynamicFormInstanceService;
@Autowired
private CommonServiceImpl commonService;
static {
unitTypeMap.put("useUnit", "使用单位");
}
/**
* 从URL中获取对应的 MaintenanceExpiredEarlyWarningEnum 枚举
*
* @param equTypeCode 设备类型代码
* @return 对应的 MaintenanceExpiredEarlyWarningEnum 枚举
* @throws BadRequest 如果设备类型代码无效
*/
public MaintenanceExpiredEarlyWarningEnum getWaringEnumsForPath(String equTypeCode) {
return MaintenanceExpiredEarlyWarningEnum.getEnum(equTypeCode)
.orElseThrow(() -> new BadRequest("Invalid equipment type code: " + equTypeCode));
}
/**
* 新增或者更新接口
*
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/saveOrUpdate")
@ApiOperation(httpMethod = "POST", value = "新增或者更新接口", notes = "新增或者更新接口")
public ResponseModel<Object> saveOrUpdate(
@PathVariable(value = "equTypeCode") String equTypeCode,
@RequestBody Map<String, Object> model) {
String groupCode = getWaringEnumsForPath(equTypeCode).getGroupCode();
String instanceId = (String) model.get("instanceId");
try {
// 判断是更新还是新增操作
if (!ValidationUtil.isEmpty(instanceId)) {
// 更新操作:先删除再保存
LambdaQueryWrapper<DynamicFormInstance> lambda =
new QueryWrapper<DynamicFormInstance>().lambda();
lambda.eq(DynamicFormInstance::getInstanceId, instanceId);
dynamicFormInstanceService.getBaseMapper().delete(lambda);
}
// 保存新实例或更新后的实例
// 兼容附件格式新
model.keySet().stream()
.filter(key -> key.endsWith("file") || key.endsWith("File"))
.forEach(key -> model.put(key, JSONObject.toJSONString(model.get(key))));
dynamicFormInstanceService.commonSave(groupCode, model);
return ResponseHelper.buildResponse(instanceId != null
? Long.parseLong(instanceId)
: Long.MIN_VALUE);
} catch (Exception e) {
return ResponseHelper.buildResponse("Error saving or updating instance: " + e.getMessage());
}
}
/**
* 根据sequenceNbr删除
*
* @param instanceId 主键
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@DeleteMapping(value = "/deleteBySeq")
@ApiOperation(httpMethod = "DELETE", value = "根据instanceId删除", notes = "根据sequenceNbr删除")
public ResponseModel<Integer> deleteBySeq(@RequestParam(value = "instanceId") String instanceId) {
LambdaQueryWrapper<DynamicFormInstance> lambda = new QueryWrapper<DynamicFormInstance>().lambda();
lambda.eq(DynamicFormInstance::getInstanceId, instanceId);
return ResponseHelper.buildResponse(dynamicFormInstanceService.getBaseMapper().delete(lambda));
}
/**
* 根据sequenceNbr查询
*
* @param instanceId 主键
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/detailBySeq")
@ApiOperation(httpMethod = "GET", value = "根据sequenceNbr查询单个", notes = "根据sequenceNbr查询单个")
public ResponseModel<Map<String, Object>> detailBySeq(@PathVariable(value = "equTypeCode") String equTypeCode,
@RequestParam(value = "instanceId") Long instanceId) {
String groupCode = getWaringEnumsForPath(equTypeCode).getGroupCode();
Map<String, Object> oneMap = dynamicFormInstanceService.getOneMap(instanceId, groupCode);
// 兼容附件格式返回
oneMap.keySet().stream()
.filter(key -> key.endsWith("file") || key.endsWith("File"))
.forEach(key -> oneMap.put(key, JSONObject.parseArray((String) oneMap.get(key))));
return ResponseHelper.buildResponse(oneMap);
}
/**
* 列表分页查询
*
* @param current 当前页
* @param current 每页大小
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/page")
@ApiOperation(httpMethod = "GET", value = "分页查询", notes = "分页查询")
public ResponseModel<IPage<Map<String, Object>>> queryForPage(@RequestParam(value = "current") int current,
@RequestParam(value = "size") int size,
@PathVariable(value = "equTypeCode") String equTypeCode) {
MaintenanceExpiredEarlyWarningEnum enums = getWaringEnumsForPath(equTypeCode);
IPage<Map<String, Object>> mapIPage = dynamicFormInstanceService.pageList(current, size, enums.getGroupCode());
List<Map<String, Object>> records = mapIPage.getRecords();
List<Map<String, Object>> collect = records.stream().peek(item -> {
String useCompany = (String) item.get("useCompany");
String unitType = (String) item.get("unitType");
if (!ValidationUtil.isEmpty(useCompany)){
item.put("useCompany", useCompany.split("_")[1]);
}
if (!ValidationUtil.isEmpty(unitType)){
item.put("equType", enums.getTypeName());
}
item.put("unitType", unitTypeMap.get(unitType));
}).collect(Collectors.toList());
mapIPage.setRecords(collect);
return ResponseHelper.buildResponse(mapIPage);
}
/**
* 图标统计数量
*
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/statistics")
@ApiOperation(httpMethod = "GET", value = "图标统计数量", notes = "图标统计数量")
public ResponseModel<JSONObject> statistics(@PathVariable(value = "equTypeCode") String equTypeCode) {
MaintenanceExpiredEarlyWarningEnum enums = getWaringEnumsForPath(equTypeCode);
// 问题设备数
long numberOfProblemEqu = dynamicFormInstanceService.pageList(1, 2, enums.getGroupCode()).getTotal();
// 气瓶总设备数
long numberOfCylinder = commonService.staticsCenterMapCountDataForCylinder(SXCode);
// 各类型设备总数
long totalNumberOfEqu;
if (enums.getTypeCode().equals("2300")) {
totalNumberOfEqu = numberOfCylinder;
} else {
totalNumberOfEqu = commonService.staticsCenterMapCountDataForEquip(enums.getTypeCode(), numberOfCylinder, SXCode);
}
return ResponseHelper.buildResponse(new JSONObject()
.fluentPut("numberOfProblemEqu", numberOfProblemEqu)
.fluentPut("totalNumberOfEqu", totalNumberOfEqu));
}
}
package com.yeejoin.amos.boot.module.ys.biz.service.impl;
import com.yeejoin.amos.boot.module.ymt.api.enums.EquipmentClassifityEnum;
import com.yeejoin.amos.boot.module.ys.api.vo.SortVo;
import com.yeejoin.amos.boot.module.ys.biz.service.CommonService;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicLong;
/**
* 公共服务实现类
......@@ -16,6 +33,14 @@ import java.util.Optional;
public class CommonServiceImpl implements CommonService {
/**
* 气瓶设备类别
*/
public final static String EQU_CATEGORY_CYLINDER = "2300";
@Autowired
private RestHighLevelClient restHighLevelClient;
/**
* 排序 :页面列表排序功能支持,将 "字段,ascend" 或 "字段,descend" 转化为对应JSONObject
*
* @param sort "字段,ascend" 或 "字段,descend"
......@@ -58,4 +83,82 @@ public class CommonServiceImpl implements CommonService {
return sb.toString();
}
/**
* 气瓶数量统计
*
* @param orgCode 区域code
* @return
*/
public long staticsCenterMapCountDataForCylinder(String orgCode) {
long num = 0;
CountRequest request = new CountRequest();
request.indices("idx_biz_view_jg_all");
BoolQueryBuilder boolMust = QueryBuilders.boolQuery();
// 按照管辖机构区域信息模糊查询
boolMust.must(QueryBuilders.wildcardQuery("ORG_BRANCH_CODE.keyword", QueryParser.escape(orgCode) + "*"));
// 设备类别精确查询气瓶
boolMust.must(QueryBuilders.termQuery("EQU_CATEGORY_CODE", EQU_CATEGORY_CYLINDER));
// 只统计已纳管设备
boolMust.must(QueryBuilders.termQuery("IS_INTO_MANAGEMENT", Boolean.TRUE));
// 只统计有监管码的、状态不是草稿且不是已拒领的
boolMust.must(QueryBuilders.existsQuery("SUPERVISORY_CODE"));
boolMust.mustNot(QueryBuilders.termQuery("STATUS", "草稿"));
boolMust.mustNot(QueryBuilders.termQuery("STATUS", "已拒领"));
request.query(boolMust);
try {
CountResponse response = restHighLevelClient.count(request, RequestOptions.DEFAULT);
num = response.getCount();
} catch (IOException e) {
throw new RuntimeException(e);
}
return num;
}
/**
* 八大类设备数量统计
* @param equTypeCode
* @param cylinderNum
* @param orgCode
* @return
*/
public long staticsCenterMapCountDataForEquip(String equTypeCode, long cylinderNum, String orgCode) {
AtomicLong result = new AtomicLong(0L);
SearchRequest request = new SearchRequest();
request.indices("idx_biz_view_jg_all");
BoolQueryBuilder boolMust = QueryBuilders.boolQuery();
// 按照管辖机构区域信息模糊查询
boolMust.must(QueryBuilders.wildcardQuery("ORG_BRANCH_CODE.keyword", QueryParser.escape(orgCode) + "*"));
// 只统计已纳管设备
boolMust.must(QueryBuilders.termQuery("IS_INTO_MANAGEMENT", Boolean.TRUE));
// 只统计有监管码的、状态不是草稿且不是已拒领的
boolMust.must(QueryBuilders.existsQuery("SUPERVISORY_CODE"));
boolMust.mustNot(QueryBuilders.termQuery("STATUS", "草稿"));
boolMust.mustNot(QueryBuilders.termQuery("STATUS", "已拒领"));
boolMust.must(QueryBuilders.termQuery("EQU_LIST_CODE", equTypeCode));
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(boolMust);
// 默认size为10 ,数据库有脏数据,所以需要多查询一些
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("count_by_equ_list_code").field("EQU_LIST_CODE").size(20);
builder.aggregation(aggregationBuilder);
request.source(builder);
try {
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
Terms terms = response.getAggregations().get("count_by_equ_list_code");
for (Terms.Bucket bucket : terms.getBuckets()) {
if (equTypeCode.equals(bucket.getKeyAsString())) {
// 压力容器里包括气瓶,所以需要特殊处理
long count = bucket.getDocCount();
result.set(bucket.getKeyAsString().equals(EquipmentClassifityEnum.YLRQ.getCode())
? count - cylinderNum
: count);
break;
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return result.get();
}
}
\ No newline at end of file
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