Commit e03a5834 authored by tianbo's avatar tianbo

feat(openapi,cylinder,jg): 新增气瓶合规性校验功能

- 在 CommonController 中添加 cylinderComplianceCheck 方法,用于校验气瓶是否合规 - 在 CommonServiceImpl 中实现 cylinderComplianceCheck 方法,通过 Elasticsearch 查询气瓶信息并判断合规性 - 在 TmCylinderInfoService 中添加 complianceCheck 方法,用于 OpenAPI 接口调用 - 在 TzsJgServiceFeignClient 中添加 cylinderComplianceCheck 方法的 Feign 接口 - 在 CylinderController 中添加 complianceCheck 接口,供外部调用
parent 5bc0b01c
...@@ -10,10 +10,7 @@ import org.apache.logging.log4j.LogManager; ...@@ -10,10 +10,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.typroject.tyboot.component.emq.EmqKeeper; import org.typroject.tyboot.component.emq.EmqKeeper;
import org.typroject.tyboot.component.event.RestEventTrigger; import org.typroject.tyboot.component.event.RestEventTrigger;
import org.typroject.tyboot.core.foundation.enumeration.UserType; import org.typroject.tyboot.core.foundation.enumeration.UserType;
...@@ -21,6 +18,7 @@ import org.typroject.tyboot.core.restful.doc.TycloudOperation; ...@@ -21,6 +18,7 @@ import org.typroject.tyboot.core.restful.doc.TycloudOperation;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.List; import java.util.List;
import java.util.Map;
@RestController @RestController
@RequestMapping(value = "/cylinder") @RequestMapping(value = "/cylinder")
...@@ -124,4 +122,12 @@ public class CylinderController { ...@@ -124,4 +122,12 @@ public class CylinderController {
cylinderFillingDataValidationService.validateCylinderOffloadingData(offloadingData); cylinderFillingDataValidationService.validateCylinderOffloadingData(offloadingData);
return ResponseHelper.buildResponse(cylinderOffloadingService.createCylinderOffloading(offloadingData)); return ResponseHelper.buildResponse(cylinderOffloadingService.createCylinderOffloading(offloadingData));
} }
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@ApiOperation(value = "气瓶是否合规校验")
@GetMapping(value = "/complianceCheck")
@RestEventTrigger(value = "openapiLogEventHandler")
public ResponseModel<Object> complianceCheck(@RequestBody Map<String, List<String>> sequenceCodes) {
return ResponseHelper.buildResponse(cylinderInfoService.complianceCheck(sequenceCodes));
}
} }
...@@ -7,6 +7,7 @@ import com.yeejoin.amos.api.openapi.face.model.TmCylinderInfoModel; ...@@ -7,6 +7,7 @@ import com.yeejoin.amos.api.openapi.face.model.TmCylinderInfoModel;
import com.yeejoin.amos.api.openapi.face.orm.dao.ESCylinderInfoRepository; import com.yeejoin.amos.api.openapi.face.orm.dao.ESCylinderInfoRepository;
import com.yeejoin.amos.api.openapi.face.orm.dao.TmCylinderInfoMapper; import com.yeejoin.amos.api.openapi.face.orm.dao.TmCylinderInfoMapper;
import com.yeejoin.amos.api.openapi.face.orm.entity.TmCylinderInfo; import com.yeejoin.amos.api.openapi.face.orm.entity.TmCylinderInfo;
import com.yeejoin.amos.api.openapi.feign.TzsJgServiceFeignClient;
import com.yeejoin.amos.api.openapi.listener.event.FileToBeDeleteEvent; import com.yeejoin.amos.api.openapi.listener.event.FileToBeDeleteEvent;
import com.yeejoin.amos.api.openapi.publisher.EventPublisher; import com.yeejoin.amos.api.openapi.publisher.EventPublisher;
import com.yeejoin.amos.api.openapi.service.MyBaseServiceImpl; import com.yeejoin.amos.api.openapi.service.MyBaseServiceImpl;
...@@ -22,9 +23,7 @@ import org.typroject.tyboot.core.foundation.utils.Bean; ...@@ -22,9 +23,7 @@ import org.typroject.tyboot.core.foundation.utils.Bean;
import org.typroject.tyboot.core.foundation.utils.ValidationUtil; import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import org.typroject.tyboot.core.restful.exception.instance.BadRequest; import org.typroject.tyboot.core.restful.exception.instance.BadRequest;
import java.util.Arrays; import java.util.*;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -52,6 +51,9 @@ public class TmCylinderInfoService extends MyBaseServiceImpl<TmCylinderInfoModel ...@@ -52,6 +51,9 @@ public class TmCylinderInfoService extends MyBaseServiceImpl<TmCylinderInfoModel
@Autowired @Autowired
private EventPublisher eventPublisher; private EventPublisher eventPublisher;
@Autowired
private TzsJgServiceFeignClient jgServiceFeignClient;
@DSTransactional @DSTransactional
@Transactional(rollbackFor = {java.lang.Exception.class}) @Transactional(rollbackFor = {java.lang.Exception.class})
public String createCylinderInfo(List<TmCylinderInfoModel> model) { public String createCylinderInfo(List<TmCylinderInfoModel> model) {
...@@ -120,4 +122,23 @@ public class TmCylinderInfoService extends MyBaseServiceImpl<TmCylinderInfoModel ...@@ -120,4 +122,23 @@ public class TmCylinderInfoService extends MyBaseServiceImpl<TmCylinderInfoModel
private void syncCylinderInfo(List<TmCylinderInfoModel> model) { private void syncCylinderInfo(List<TmCylinderInfoModel> model) {
syncCylinderDataService.syncCylinderInfo(model); syncCylinderDataService.syncCylinderInfo(model);
} }
/**
* 合规性检查
*
* @param sequenceCodes 气瓶序列号
* @return 合规性检查结果
*/
public Object complianceCheck(Map<String, List<String>> sequenceCodes) {
if (!ValidationUtil.isEmpty(sequenceCodes) && !ValidationUtil.isEmpty(sequenceCodes.get("sequenceCodes"))) {
List<String> sequenceCodeList = sequenceCodes.get("sequenceCodes");
if (sequenceCodeList.size() > 100) {
return new HashMap<String, Object>() {{
put("result", "请不要一次性提交超过100个气瓶.");
}};
}
return jgServiceFeignClient.cylinderComplianceCheck(sequenceCodeList).getResult();
}
return Lists.newArrayList();
}
} }
...@@ -124,4 +124,13 @@ public interface TzsJgServiceFeignClient { ...@@ -124,4 +124,13 @@ public interface TzsJgServiceFeignClient {
*/ */
@RequestMapping(value = "/common/checkRecordUniqueness", method = RequestMethod.GET) @RequestMapping(value = "/common/checkRecordUniqueness", method = RequestMethod.GET)
Boolean selectByRecordAndClaimStatus(@RequestParam("record") String record); Boolean selectByRecordAndClaimStatus(@RequestParam("record") String record);
/**
* 校验气瓶是否合规
*
* @param sequenceCodes 待查询气瓶唯一标识集合
* @return 是否合规数据结果集
*/
@RequestMapping(value = "/common/cylinderComplianceCheck", method = RequestMethod.POST)
ResponseModel<List<Map<String, Object>>> cylinderComplianceCheck(@RequestBody List<String> sequenceCodes);
} }
...@@ -971,4 +971,12 @@ public class CommonController extends BaseController { ...@@ -971,4 +971,12 @@ public class CommonController extends BaseController {
@RequestParam(value = "business", required = false) String business) { @RequestParam(value = "business", required = false) String business) {
return ResponseHelper.buildResponse(commonService.getUnitListByType(type, business, true)); return ResponseHelper.buildResponse(commonService.getUnitListByType(type, business, true));
} }
@TycloudOperation(ApiLevel = UserType.AGENCY)
@PostMapping(value = "/cylinderComplianceCheck")
@ApiOperation(httpMethod = "POST", value = "校验气瓶是否合规", notes = "校验气瓶是否合规")
public ResponseModel<List<Map<String, Object>>> cylinderComplianceCheck(@RequestBody List<String> sequenceCodes) {
return ResponseHelper.buildResponse(commonService.cylinderComplianceCheck(sequenceCodes));
}
} }
...@@ -279,4 +279,6 @@ public interface ICommonService { ...@@ -279,4 +279,6 @@ public interface ICommonService {
JSONArray getPermissionTreeWithCompanyV2(String menuAgent, String permissionType, String path, CompanyBo company, JSONArray params); JSONArray getPermissionTreeWithCompanyV2(String menuAgent, String permissionType, String path, CompanyBo company, JSONArray params);
JSONArray allWorkbenchPermission(String businessType, String appCode); JSONArray allWorkbenchPermission(String businessType, String appCode);
List<Map<String, Object>> cylinderComplianceCheck(List<String> sequenceCodes);
} }
...@@ -14,6 +14,8 @@ import com.alibaba.fastjson.JSONObject; ...@@ -14,6 +14,8 @@ import com.alibaba.fastjson.JSONObject;
import com.aspose.words.SaveFormat; import com.aspose.words.SaveFormat;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.itextpdf.text.DocumentException; import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields; import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.BaseFont;
...@@ -76,6 +78,14 @@ import lombok.extern.slf4j.Slf4j; ...@@ -76,6 +78,14 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.pdfbox.multipdf.PDFMergerUtility; import org.apache.pdfbox.multipdf.PDFMergerUtility;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocument;
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.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.redisson.api.RBucket; import org.redisson.api.RBucket;
import org.redisson.api.RLock; import org.redisson.api.RLock;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
...@@ -121,6 +131,8 @@ import java.util.regex.Pattern; ...@@ -121,6 +131,8 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static com.yeejoin.amos.boot.module.jg.biz.service.impl.DataHandlerServiceImpl.IDX_BIZ_EQUIPMENT_INFO;
/** /**
* 装备分类服务实现类 * 装备分类服务实现类
* *
...@@ -299,6 +311,9 @@ public class CommonServiceImpl implements ICommonService { ...@@ -299,6 +311,9 @@ public class CommonServiceImpl implements ICommonService {
@Autowired @Autowired
private JgResumeInfoServiceImpl jgResumeInfoService; private JgResumeInfoServiceImpl jgResumeInfoService;
@Autowired
private RestHighLevelClient restHighLevelClient;
public static final String DATA_QUALITY_SCORE = "DATA_QUALITY_SCORE"; public static final String DATA_QUALITY_SCORE = "DATA_QUALITY_SCORE";
public static byte[] file2byte(File file) { public static byte[] file2byte(File file) {
...@@ -3256,4 +3271,72 @@ public class CommonServiceImpl implements ICommonService { ...@@ -3256,4 +3271,72 @@ public class CommonServiceImpl implements ICommonService {
return jgResumeInfoService.getBaseMapper().selectResumeInfoByEquips(recordOrPIds, applyNo); return jgResumeInfoService.getBaseMapper().selectResumeInfoByEquips(recordOrPIds, applyNo);
} }
@Override
public List<Map<String, Object>> cylinderComplianceCheck(List<String> sequenceCodes) {
if (ValidationUtil.isEmpty(sequenceCodes)) {
return Lists.newArrayList();
}
List<Map<String, Object>> result = Lists.newArrayList();
try {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
for (String sequenceCode : sequenceCodes) {
String[] keys = sequenceCode.split("-", 2);
BoolQueryBuilder combinationQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("produceUnitCreditCode", keys[0]))
.must(QueryBuilders.termQuery("FACTORY_NUM", keys[1]));
boolQuery.should(combinationQuery);
boolQuery.must(QueryBuilders.matchQuery("SEQUENCE_CODE", sequenceCode));
}
boolQuery.minimumShouldMatch(1);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.query(boolQuery)
.size(1000);
SearchRequest searchRequest = new SearchRequest(IDX_BIZ_EQUIPMENT_INFO)
.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()) {
Map<String, Object> src = hit.getSourceAsMap();
Map<String, Object> map = Maps.newHashMap();
String nextInspectDate = Objects.toString(src.get("NEXT_INSPECT_DATE"), ""); // 下次检验日期
String isIntoManagement = Objects.toString(src.get("IS_INTO_MANAGEMENT"), ""); // 是否已纳管
String useRegistrationCode = Objects.toString(src.get("USE_ORG_CODE"), ""); // 使用登记证号
map.put("sequenceCode", Objects.toString(src.get("produceUnitCreditCode") + "-" + src.get("FACTORY_NUM"), ""));
map.put("useRegistrationCode", useRegistrationCode);
map.put("useUnitName", Objects.toString(src.get("USE_UNIT_NAME"), ""));
map.put("useUnitCreditCode", Objects.toString(src.get("USE_UNIT_CREDIT_CODE"), ""));
map.put("carNumber", Objects.toString(src.get("carNumber"), ""));
// map.put("registrationAuthority", Objects.toString(src.get("##"), ""));
map.put("nextInspectDate", nextInspectDate);
map.put("isIntoManagement", isIntoManagement);
result.add(map);
}
// 判断气瓶合规校验结果
sequenceCodes.forEach(sequenceCode -> {
Map<String, Object> targetCylinder = result.stream().filter(m -> m.get("sequenceCode").equals(sequenceCode)).findFirst().orElse(null);
if (ValidationUtil.isEmpty(targetCylinder)) {
Map<String, Object> map = Maps.newHashMap();
map.put("sequenceCode", sequenceCode);
map.put("checkResult", CylinderComplianceStatus.NOT_EXIST.name());
result.add(map);
} else {
if (ValidationUtil.isEmpty(targetCylinder.get("useRegistrationCode")) || !Boolean.TRUE.equals(targetCylinder.get("isIntoManagement"))) {
targetCylinder.put("checkResult", CylinderComplianceStatus.NOT_REGISTERED.getDesc());
targetCylinder.put("checkResultCode", CylinderComplianceStatus.NOT_REGISTERED.getCode());
} else if (ValidationUtil.isEmpty(targetCylinder.get("nextInspectDate")) || DateUtil.parse((String) targetCylinder.get("nextInspectDate")).getTime() < System.currentTimeMillis()) {
targetCylinder.put("checkResult", CylinderComplianceStatus.EXPIRED_INSPECTION.getDesc());
targetCylinder.put("checkResultCode", CylinderComplianceStatus.EXPIRED_INSPECTION.getCode());
} else {
targetCylinder.put("checkResult", CylinderComplianceStatus.COMPLIANT.getDesc());
targetCylinder.put("checkResultCode", CylinderComplianceStatus.COMPLIANT.getCode());
}
}
});
// 查询合规气瓶使用登记证的发证登记机关
} catch (IOException e) {
log.error("查询气瓶合规信息异常", e);
throw new RuntimeException(e);
}
return result;
}
} }
\ No newline at end of file
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="log" /> <property name="LOG_HOME" value="log" />
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %-50.50logger{50} - %msg [%file:%line] %n" /> <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %-50.50logger{50} [%method] - %msg [%file:%line] %n" />
<!-- 按照每天生成日志文件 --> <!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
......
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