icd调整

This commit is contained in:
caozehui
2026-06-16 19:25:43 +08:00
parent 547d40ce99
commit 82fdd7664b
13 changed files with 793 additions and 201 deletions

View File

@@ -145,6 +145,11 @@
<artifactId>activate-tool</artifactId> <artifactId>activate-tool</artifactId>
<version>1.0.0</version> <version>1.0.0</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>

View File

@@ -18,12 +18,18 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriUtils;
import javax.validation.Valid;
import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
/** /**
* @author caozehui * @author caozehui
* @date 2025-02-10 * @date 2025-02-10
@@ -38,7 +44,7 @@ public class PqIcdPathController extends BaseController {
@OperateInfo(info = LogEnum.BUSINESS_COMMON) @OperateInfo(info = LogEnum.BUSINESS_COMMON)
@GetMapping("/listAll") @GetMapping("/listAll")
@ApiOperation("获取所有icd") @ApiOperation("获取全部icd")
public HttpResult<List<PqIcdPath>> listAll() { public HttpResult<List<PqIcdPath>> listAll() {
String methodDescribe = getMethodDescribe("listAll"); String methodDescribe = getMethodDescribe("listAll");
List<PqIcdPath> result = pqIcdPathService.listAll(); List<PqIcdPath> result = pqIcdPathService.listAll();
@@ -60,7 +66,7 @@ public class PqIcdPathController extends BaseController {
@PostMapping("/add") @PostMapping("/add")
@ApiOperation("新增icd") @ApiOperation("新增icd")
@ApiImplicitParam(name = "param", value = "icd新增参数", required = true) @ApiImplicitParam(name = "param", value = "icd新增参数", required = true)
public HttpResult<Boolean> add(PqIcdPathParam param) { public HttpResult<Boolean> add(@Validated PqIcdPathParam.CreateParam param) {
String methodDescribe = getMethodDescribe("add"); String methodDescribe = getMethodDescribe("add");
LogUtil.njcnDebug(log, "{},新增数据为:{}", methodDescribe, param); LogUtil.njcnDebug(log, "{},新增数据为:{}", methodDescribe, param);
@@ -72,11 +78,27 @@ public class PqIcdPathController extends BaseController {
} }
} }
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.ADD)
@PostMapping("/external/add")
@ApiOperation("外部系统新增icd")
@ApiImplicitParam(name = "param", value = "外部系统icd新增参数", required = true)
public HttpResult<Boolean> externalAdd(@RequestBody List<PqIcdPathParam.ExternalCreateParam> param) {
String methodDescribe = getMethodDescribe("externalAdd");
LogUtil.njcnDebug(log, "{},外部新增数据为:{}", methodDescribe, param);
boolean result = pqIcdPathService.addUpstreamIcd(param);
if (result) {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, true, methodDescribe);
} else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, false, methodDescribe);
}
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.UPDATE) @OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.UPDATE)
@PostMapping("/update") @PostMapping("/update")
@ApiOperation("修改icd") @ApiOperation("修改icd")
@ApiImplicitParam(name = "param", value = "icd修改参数", required = true) @ApiImplicitParam(name = "param", value = "icd修改参数", required = true)
public HttpResult<Boolean> update(PqIcdPathParam.UpdateParam param) { public HttpResult<Boolean> update(@Validated PqIcdPathParam.UpdateParam param) {
String methodDescribe = getMethodDescribe("update"); String methodDescribe = getMethodDescribe("update");
LogUtil.njcnDebug(log, "{},修改数据为:{}", methodDescribe, param); LogUtil.njcnDebug(log, "{},修改数据为:{}", methodDescribe, param);
@@ -88,6 +110,24 @@ public class PqIcdPathController extends BaseController {
} }
} }
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@GetMapping("/standard-list")
@ApiOperation("获取标准ICD列表")
public HttpResult<List<PqIcdPath>> standardList() {
String methodDescribe = getMethodDescribe("standardList");
List<PqIcdPath> result = pqIcdPathService.listStandardIcd();
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@GetMapping("/getById")
@ApiOperation("根据id获取ICD详情")
public HttpResult<PqIcdPath> getById(@RequestParam String id) {
String methodDescribe = getMethodDescribe("getById");
PqIcdPath result = pqIcdPathService.getIcdById(id);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.DELETE) @OperateInfo(info = LogEnum.BUSINESS_COMMON, operateType = OperateType.DELETE)
@PostMapping("/delete") @PostMapping("/delete")
@ApiOperation("删除icd") @ApiOperation("删除icd")
@@ -103,5 +143,17 @@ public class PqIcdPathController extends BaseController {
} }
} }
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@GetMapping("/export/{id}")
@ApiOperation("导出icd")
public ResponseEntity<ByteArrayResource> export(@PathVariable String id) {
PqIcdPath detail = pqIcdPathService.getIcdById(id);
byte[] body = pqIcdPathService.exportIcd(id);
String fileName = UriUtils.encode(detail.getName() + ".zip", StandardCharsets.UTF_8);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename*=UTF-8''" + fileName)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.contentLength(body.length)
.body(new ByteArrayResource(body));
}
} }

View File

@@ -1,9 +1,12 @@
package com.njcn.gather.icd.mapper; package com.njcn.gather.icd.mapper;
import com.github.yulichang.base.MPJBaseMapper; import com.github.yulichang.base.MPJBaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.njcn.gather.icd.pojo.po.PqIcdPath; import com.njcn.gather.icd.pojo.po.PqIcdPath;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* @author caozehui * @author caozehui
* @date 2025-02-10 * @date 2025-02-10
@@ -17,5 +20,19 @@ public interface PqIcdPathMapper extends MPJBaseMapper<PqIcdPath> {
* @return * @return
*/ */
PqIcdPath selectIcdByDevType(@Param("devTypeId") String devTypeId); PqIcdPath selectIcdByDevType(@Param("devTypeId") String devTypeId);
List<PqIcdPath> selectPageList(Page<PqIcdPath> page, @Param("name") String name);
List<PqIcdPath> selectStandardList();
PqIcdPath selectStandardByName(@Param("name") String name);
List<PqIcdPath> selectByIdsWithoutBlob(@Param("ids") List<String> ids);
Long countActiveReferencesToStandards(@Param("standardIds") List<String> standardIds);
PqIcdPath selectDetailById(@Param("id") String id);
PqIcdPath selectExportById(@Param("id") String id);
} }

View File

@@ -4,10 +4,115 @@
<select id="selectIcdByDevType" resultType="com.njcn.gather.icd.pojo.po.PqIcdPath"> <select id="selectIcdByDevType" resultType="com.njcn.gather.icd.pojo.po.PqIcdPath">
select * select path.*
from pq_icd_path path from pq_icd_path path
inner join pq_dev_type type on path.id = type.icd inner join pq_dev_type type on path.id = type.icd
where type.id = #{devTypeId} where type.id = #{devTypeId}
</select> </select>
<select id="selectPageList" resultType="com.njcn.gather.icd.pojo.po.PqIcdPath">
select p.id,
p.name,
p.state,
p.angle,
p.use_phase_index as usePhaseIndex,
p.Json_Str as jsonStr,
p.Xml_Str as xmlStr,
p.Result as result,
p.Msg as msg,
p.Type as type,
p.Reference_Icd_Id as referenceIcdId,
ref.name as referenceIcdName,
case when p.Icd is null then false else true end as hasIcdFile,
p.create_by as createBy,
p.create_time as createTime,
p.update_by as updateBy,
p.update_time as updateTime
from pq_icd_path p
left join pq_icd_path ref on p.Reference_Icd_Id = ref.id
and ref.state = 1
and ref.Type in (1, 3)
where p.state = 1
<if test="name != null and name != ''">
and p.name like concat('%', #{name}, '%')
</if>
order by p.create_time desc
</select>
<select id="selectStandardList" resultType="com.njcn.gather.icd.pojo.po.PqIcdPath">
select id, name, Type as type
from pq_icd_path
where state = 1
and Type in (1, 3)
order by create_time desc
</select>
<select id="selectStandardByName" resultType="com.njcn.gather.icd.pojo.po.PqIcdPath">
select id, name, Type as type, state
from pq_icd_path
where state = 1
and Type in (1, 3)
and name = #{name}
limit 1
</select>
<select id="selectByIdsWithoutBlob" resultType="com.njcn.gather.icd.pojo.po.PqIcdPath">
select id, name, Type as type, state
from pq_icd_path
where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
and state = 1
</select>
<select id="countActiveReferencesToStandards" resultType="java.lang.Long">
select count(1)
from pq_icd_path
where state = 1
and Type in (2, 4)
and Reference_Icd_Id in
<foreach collection="standardIds" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<select id="selectDetailById" resultType="com.njcn.gather.icd.pojo.po.PqIcdPath">
select p.id,
p.name,
p.state,
p.angle,
p.use_phase_index as usePhaseIndex,
p.Json_Str as jsonStr,
p.Xml_Str as xmlStr,
p.Result as result,
p.Msg as msg,
p.Type as type,
p.Reference_Icd_Id as referenceIcdId,
ref.name as referenceIcdName,
case when p.Icd is null then false else true end as hasIcdFile,
p.create_by as createBy,
p.create_time as createTime,
p.update_by as updateBy,
p.update_time as updateTime
from pq_icd_path p
left join pq_icd_path ref on p.Reference_Icd_Id = ref.id
and ref.state = 1
and ref.Type in (1, 3)
where p.id = #{id}
and p.state = 1
</select>
<select id="selectExportById" resultType="com.njcn.gather.icd.pojo.po.PqIcdPath">
select id,
name,
state,
Json_Str as jsonStr,
Xml_Str as xmlStr,
Icd as icd
from pq_icd_path
where id = #{id}
and state = 1
</select>
</mapper> </mapper>

View File

@@ -1,16 +1,37 @@
package com.njcn.gather.icd.pojo.enums; package com.njcn.gather.icd.pojo.enums;
import lombok.Getter;
/** /**
* @author caozehui * @author caozehui
* @data 2025-11-11 * @data 2025-11-11
*/ */
@Getter
public enum IcdResponseEnum { public enum IcdResponseEnum {
FILE_NOT_NULL("A018001", "映射文件不能为空"), FILE_NOT_NULL("A018001", "映射文件不能为空"),
FILE_TYPE_ERROR("A018002", "映射文件类型错误"), FILE_TYPE_ERROR("A018002", "映射文件类型错误"),
FILE_SIZE_ERROR("A018003", "映射文件大小超出限制"); FILE_SIZE_ERROR("A018003", "映射文件大小超出限制"),
ICD_FILE_NOT_NULL("A018004", "ICD原始文件不能为空"),
ICD_FILE_TYPE_ERROR("A018005", "ICD原始文件类型错误"),
ICD_FILE_READ_ERROR("A018006", "ICD原始文件读取失败"),
JSON_FORMAT_ERROR("A018007", "JSON格式错误"),
XML_FORMAT_ERROR("A018008", "XML格式错误"),
STANDARD_ICD_IN_USE("A018009", "该标准ICD已被非标准ICD引用禁止删除"),
ICD_FILE_NOT_FOUND("A018010", "ICD原始文件不存在"),
ICD_EXPORT_FAILED("A018011", "ICD导出失败"),
ICD_NOT_FOUND("A018012", "ICD不存在"),
RESULT_NOT_NULL("A018013", "结论不能为空"),
MSG_NOT_BLANK("A018014", "当结论为否时,描述不能为空"),
TYPE_NOT_NULL("A018015", "ICD类型不能为空"),
TYPE_VALUE_ERROR("A018016", "ICD类型取值错误"),
REFERENCE_ICD_NOT_BLANK("A018017", "非标准ICD必须选择参照标准ICD"),
REFERENCE_ICD_INVALID("A018018", "参照标准ICD无效"),
GENERATE_FILE("A018019", "文件生成失败"),
ICD_TXT_SYNC_FAILED("A018020", "ICD txt文件同步失败"),
REFERENCE_STANDARD_ICD_NAME_NOT_FOUND("A018021", "参照标准ICD名称不存在");
private String code; private final String code;
private String message; private final String message;
IcdResponseEnum(String code, String message) { IcdResponseEnum(String code, String message) {
this.code = code; this.code = code;

View File

@@ -17,39 +17,63 @@ import javax.validation.constraints.Pattern;
*/ */
@Data @Data
public class PqIcdPathParam { public class PqIcdPathParam {
@ApiModelProperty(value = "名称", required = true) @ApiModelProperty(value = "angle", required = true)
@NotBlank(message = DetectionValidMessage.NAME_NOT_BLANK)
@Pattern(regexp = PatternRegex.ICD_NAME_REGEX, message = DetectionValidMessage.ICD_NAME_FORMAT_ERROR)
private String name;
@ApiModelProperty(value = "存储路径", required = true)
@NotBlank(message = DetectionValidMessage.ICD_PATH_NOT_BLANK)
@Pattern(regexp = PatternRegex.ICD_PATH_REGEX, message = DetectionValidMessage.ICD_PATH_FORMAT_ERROR)
private String path;
@ApiModelProperty(value = "是否支持电压相角、电流相角指标0表示否1表示是", required = true)
private Integer angle; private Integer angle;
@ApiModelProperty(value = "角型接线时是否使用相别的指标来进行检测0表示否1表示是", required = true) @ApiModelProperty(value = "usePhaseIndex", required = true)
private Integer usePhaseIndex; private Integer usePhaseIndex;
@ApiModelProperty(value = "映射文件", required = true) @ApiModelProperty(value = "jsonStr")
private MultipartFile mappingFile; private String jsonStr;
@ApiModelProperty(value = "xmlStr")
private String xmlStr;
@ApiModelProperty(value = "result")
private Integer result;
@ApiModelProperty(value = "msg")
private String msg;
@ApiModelProperty(value = "type")
private Integer type;
@ApiModelProperty(value = "referenceIcdId")
private String referenceIcdId;
/**
* 分页查询实体
*/
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public static class QueryParam extends BaseParam { public static class QueryParam extends BaseParam {
@ApiModelProperty(value = "名称", required = true) @ApiModelProperty(value = "name", required = true)
private String name; private String name;
} }
@Data
@EqualsAndHashCode(callSuper = true)
public static class CreateParam extends PqIcdPathParam {
@ApiModelProperty(value = "icdFile", required = true)
private MultipartFile icdFile;
}
@Data
@EqualsAndHashCode(callSuper = true)
public static class ExternalCreateParam extends PqIcdPathParam {
@ApiModelProperty(value = "id", required = true)
@NotBlank(message = DetectionValidMessage.ID_NOT_BLANK)
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.ID_FORMAT_ERROR)
private String id;
@ApiModelProperty(value = "name", required = true)
@NotBlank(message = DetectionValidMessage.NAME_NOT_BLANK)
@Pattern(regexp = PatternRegex.SCRIPT_NAME_REGEX, message = DetectionValidMessage.ICD_NAME_FORMAT_ERROR)
private String name;
@ApiModelProperty(value = "icdFile", required = true)
@NotBlank(message = IcdExternalValidMessage.ICD_FILE_NOT_BLANK)
private String icdFile;
}
/**
* 更新参数
*/
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public static class UpdateParam extends PqIcdPathParam { public static class UpdateParam extends PqIcdPathParam {
@@ -57,5 +81,12 @@ public class PqIcdPathParam {
@NotBlank(message = DetectionValidMessage.ID_NOT_BLANK) @NotBlank(message = DetectionValidMessage.ID_NOT_BLANK)
@Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.ID_FORMAT_ERROR) @Pattern(regexp = PatternRegex.SYSTEM_ID, message = DetectionValidMessage.ID_FORMAT_ERROR)
private String id; private String id;
@ApiModelProperty(value = "icdFile")
private MultipartFile icdFile;
}
private interface IcdExternalValidMessage {
String ICD_FILE_NOT_BLANK = "ICD原始文件不能为空";
} }
} }

View File

@@ -28,11 +28,6 @@ public class PqIcdPath extends BaseEntity implements Serializable {
*/ */
private String name; private String name;
/**
* icd存储地址
*/
private String path;
/** /**
* 状态0-删除 1-正常 * 状态0-删除 1-正常
*/ */
@@ -46,19 +41,55 @@ public class PqIcdPath extends BaseEntity implements Serializable {
/** /**
* 角型接线时是否使用相别的指标来进行检测0表示否1表示是 * 角型接线时是否使用相别的指标来进行检测0表示否1表示是
*/ */
@TableField("use_phase_index")
private Integer usePhaseIndex; private Integer usePhaseIndex;
/** /**
* 映射文件路径 * 解析后的json字符串
*/ */
@TableField("Json_Str")
private String jsonStr;
/**
* 解析后的xml字符串
*/
@TableField("Xml_Str")
private String xmlStr;
/**
* ICD原始文件二进制
*/
@TableField("Icd")
private byte[] icd;
/**
* 结论
*/
@TableField("Result")
private Integer result;
/**
* 结论描述
*/
@TableField("Msg")
private String msg;
/**
* ICD类型
*/
@TableField("Type")
private Integer type;
/**
* 参照标准ICD
*/
@TableField("Reference_Icd_Id")
private String referenceIcdId;
@TableField(exist = false) @TableField(exist = false)
private FileVO mappingFile; private String referenceIcdName;
@Data @TableField(exist = false)
public static class FileVO{ private Boolean hasIcdFile;
private String name;
private String url;
}
} }

View File

@@ -28,13 +28,22 @@ public interface IPqIcdPathService extends IService<PqIcdPath> {
*/ */
Page<PqIcdPath> listIcd(PqIcdPathParam.QueryParam param); Page<PqIcdPath> listIcd(PqIcdPathParam.QueryParam param);
/**
* 获取所有标准ICD
*
* @return 标准ICD列表
*/
List<PqIcdPath> listStandardIcd();
/** /**
* 新增Icd * 新增Icd
* *
* @param param 新增Icd参数 * @param param 新增Icd参数
* @return 成功返回true失败返回false * @return 成功返回true失败返回false
*/ */
boolean addIcd(PqIcdPathParam param); boolean addIcd(PqIcdPathParam.CreateParam param);
boolean addUpstreamIcd(List<PqIcdPathParam.ExternalCreateParam> param);
/** /**
* 修改Icd * 修改Icd
@@ -52,6 +61,22 @@ public interface IPqIcdPathService extends IService<PqIcdPath> {
*/ */
boolean deleteIcd(List<String> ids); boolean deleteIcd(List<String> ids);
/**
* 根据id获取ICD详情
*
* @param id ICD id
* @return ICD详情
*/
PqIcdPath getIcdById(String id);
/**
* 导出ICD压缩包
*
* @param id ICD id
* @return zip字节数组
*/
byte[] exportIcd(String id);
/** /**
* 根据设备类型id获取Icd * 根据设备类型id获取Icd
* *

View File

@@ -1,5 +1,6 @@
package com.njcn.gather.icd.service.impl; package com.njcn.gather.icd.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
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;
@@ -12,23 +13,26 @@ import com.njcn.gather.icd.pojo.enums.IcdResponseEnum;
import com.njcn.gather.icd.pojo.param.PqIcdPathParam; import com.njcn.gather.icd.pojo.param.PqIcdPathParam;
import com.njcn.gather.icd.pojo.po.PqIcdPath; import com.njcn.gather.icd.pojo.po.PqIcdPath;
import com.njcn.gather.icd.service.IPqIcdPathService; import com.njcn.gather.icd.service.IPqIcdPathService;
import com.njcn.gather.icd.service.support.IcdArchiveBuilder;
import com.njcn.gather.icd.service.support.IcdPayloadAssembler;
import com.njcn.gather.pojo.enums.DetectionResponseEnum; import com.njcn.gather.pojo.enums.DetectionResponseEnum;
import com.njcn.gather.report.pojo.enums.ReportResponseEnum;
import com.njcn.web.factory.PageFactory; import com.njcn.web.factory.PageFactory;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/** /**
* @author caozehui * @author caozehui
@@ -38,174 +42,147 @@ import java.util.List;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class PqIcdPathServiceImpl extends ServiceImpl<PqIcdPathMapper, PqIcdPath> implements IPqIcdPathService { public class PqIcdPathServiceImpl extends ServiceImpl<PqIcdPathMapper, PqIcdPath> implements IPqIcdPathService {
// 手动录入标准ICD
private static final int TYPE_STANDARD = 1;
// 手动录入非标准ICD
private static final int TYPE_NON_STANDARD = 2;
// 上游录入的标准ICD
private static final int TYPE_UPSTREAM_STANDARD = 3;
// 上游录入的非标准ICD
private static final int TYPE_UPSTREAM_NON_STANDARD = 4;
private static final int RESULT_NO = 0;
private static final int RESULT_YES = 1;
@Value("${icd.txt-dir}")
private String icdTxtDir;
private final IcdPayloadAssembler icdPayloadAssembler;
private final IcdArchiveBuilder icdArchiveBuilder;
@Override @Override
public List<PqIcdPath> listAll() { public List<PqIcdPath> listAll() {
return this.lambdaQuery().eq(PqIcdPath::getState, DataStateEnum.ENABLE.getCode()).list(); return this.lambdaQuery()
.select(PqIcdPath::getId, PqIcdPath::getName, PqIcdPath::getType, PqIcdPath::getReferenceIcdId)
.eq(PqIcdPath::getState, DataStateEnum.ENABLE.getCode())
.orderByDesc(PqIcdPath::getCreateTime)
.list();
}
@Override
public List<PqIcdPath> listStandardIcd() {
return this.baseMapper.selectStandardList();
} }
@Override @Override
public Page<PqIcdPath> listIcd(PqIcdPathParam.QueryParam param) { public Page<PqIcdPath> listIcd(PqIcdPathParam.QueryParam param) {
LambdaQueryWrapper<PqIcdPath> wrapper = new LambdaQueryWrapper<>(); Page<PqIcdPath> page = new Page<>(PageFactory.getPageNum(param), PageFactory.getPageSize(param));
wrapper.eq(PqIcdPath::getState, DataStateEnum.ENABLE.getCode()) page.setRecords(this.baseMapper.selectPageList(page, StrUtil.trim(param.getName())));
.like(StrUtil.isNotBlank(param.getName()), PqIcdPath::getName, param.getName())
.orderByDesc(PqIcdPath::getCreateTime);
Page<PqIcdPath> page = this.page(new Page<>(PageFactory.getPageNum(param), PageFactory.getPageSize(param)), wrapper);
String commInstallPath = this.getCommInstallPath();
page.getRecords().forEach(pqIcdPath -> {
PqIcdPath.FileVO fileVO = new PqIcdPath.FileVO();
fileVO.setUrl(commInstallPath + "\\DeviceControl\\Config\\" + pqIcdPath.getName() + ".txt");
fileVO.setName(pqIcdPath.getName() + ".txt");
pqIcdPath.setMappingFile(fileVO);
});
return page; return page;
} }
@Override @Override
@Transactional @Transactional
public boolean addIcd(PqIcdPathParam param) { public boolean addIcd(PqIcdPathParam.CreateParam param) {
param.setName(param.getName().trim()); validateBusinessFields(param, null);
this.checkRepeat(param, false); PqIcdPath pqIcdPath = icdPayloadAssembler.fromCreate(param);
PqIcdPath pqIcdPath = new PqIcdPath(); validateReferenceIcd(pqIcdPath.getType(), pqIcdPath.getReferenceIcdId(), null);
BeanUtils.copyProperties(param, pqIcdPath); boolean saved = this.save(pqIcdPath);
pqIcdPath.setState(DataStateEnum.ENABLE.getCode()); if (saved) {
writeIcdTextFile(resolveIcdTxtDir(), pqIcdPath.getName(), pqIcdPath.getJsonStr());
String commInstallPath = this.getCommInstallPath();
System.out.println("commInstallPath = " + commInstallPath);
long FILE_SIZE_LIMIT = 1 * 1024 * 1024;
MultipartFile mappingFile = param.getMappingFile();
System.out.println("mappingFile = " + ObjectUtil.isNotNull(mappingFile) + " " + !mappingFile.isEmpty());
if (ObjectUtil.isNotNull(mappingFile) && !mappingFile.isEmpty()) {
String mappingFilename = mappingFile.getOriginalFilename();
if (!mappingFilename.endsWith(".txt")) {
throw new BusinessException(IcdResponseEnum.FILE_TYPE_ERROR);
}
if (mappingFile.getSize() > FILE_SIZE_LIMIT) {
throw new BusinessException(IcdResponseEnum.FILE_SIZE_ERROR);
}
try {
// 如果文件存在,则先删除
String mappingFilePath = commInstallPath + "\\DeviceControl\\Config\\" + mappingFilename;
System.out.println("mappingFilePath = " + mappingFilePath);
Path path = Paths.get(mappingFilePath);
File file = path.toFile();
if (file.exists()) {
file.delete();
}
// 保存文件
byte[] bytes = mappingFile.getBytes();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(mappingFilePath));
bufferedOutputStream.write(bytes);
bufferedOutputStream.flush();
bufferedOutputStream.close();
System.out.println("File saved successfully");
} catch (IOException e) {
throw new BusinessException(ReportResponseEnum.FILE_UPLOAD_FAILED);
}
} else {
System.out.println("mappingFile is null or empty");
throw new BusinessException(IcdResponseEnum.FILE_NOT_NULL);
} }
return saved;
//this.executeRestartCmd(commInstallPath);
return this.save(pqIcdPath);
} }
// /** @Override
// * 执行重启通讯服务脚本 @Transactional
// * public boolean addUpstreamIcd(List<PqIcdPathParam.ExternalCreateParam> param) {
// * @param commInstallPath if (CollUtil.isEmpty(param)) {
// */ return true;
// private void executeRestartCmd(String commInstallPath) {
// // 以管理员身份运行bat脚本
// String batFilePath = commInstallPath + "\\重启所有服务.bat";
// try {
// Runtime.getRuntime().exec(batFilePath);
// } catch (IOException e) {
// log.error("重启通讯服务失败", e);
// }
// }
private String getCommInstallPath() {
String workDir = System.getProperty("user.dir");
// String workDir = "D:\\program\\CN_Gather";
// 获取映射文件存放文件夹
String dirPath = workDir + "\\9100";
int index = workDir.indexOf("\\resources\\extraResources\\java");
if (index != -1) {
dirPath = workDir.substring(0, workDir.indexOf("\\resources\\extraResources\\java")) + "\\9100";
} }
return dirPath; Set<String> requestStandardIds = collectRequestStandardIds(param);
boolean allSaved = true;
Path directory = resolveIcdTxtDir();
for (PqIcdPathParam.ExternalCreateParam item : param) {
validateBusinessFields(item, null);
PqIcdPath current = this.baseMapper.selectById(item.getId());
PqIcdPath pqIcdPath = icdPayloadAssembler.fromExternalCreate(item, item.getType(), item.getAngle(), item.getUsePhaseIndex());
String currentId = current == null ? null : current.getId();
String oldName = current == null ? null : current.getName();
validateExternalReferenceIcd(pqIcdPath.getType(), pqIcdPath.getReferenceIcdId(), currentId, requestStandardIds);
boolean saved = current == null ? this.save(pqIcdPath) : this.updateById(pqIcdPath);
if (!saved) {
allSaved = false;
break;
}
if (current == null) {
writeIcdTextFile(directory, pqIcdPath.getName(), pqIcdPath.getJsonStr());
} else {
syncUpdatedIcdTextFile(directory, oldName, pqIcdPath.getName(), pqIcdPath.getJsonStr());
}
}
return allSaved;
} }
@Override @Override
@Transactional @Transactional
public boolean updateIcd(PqIcdPathParam.UpdateParam param) { public boolean updateIcd(PqIcdPathParam.UpdateParam param) {
param.setName(param.getName().trim()); PqIcdPath current = getActiveEntity(param.getId());
this.checkRepeat(param, true); String oldName = current.getName();
PqIcdPath pqIcdPath = new PqIcdPath(); validateBusinessFields(param, current.getId());
BeanUtils.copyProperties(param, pqIcdPath); PqIcdPath pqIcdPath = icdPayloadAssembler.merge(current, param);
validateReferenceIcd(pqIcdPath.getType(), pqIcdPath.getReferenceIcdId(), current.getId());
String commInstallPath = this.getCommInstallPath(); boolean updated = this.updateById(pqIcdPath);
long FILE_SIZE_LIMIT = 1 * 1024 * 1024; if (updated) {
MultipartFile mappingFile = param.getMappingFile(); syncUpdatedIcdTextFile(resolveIcdTxtDir(), oldName, pqIcdPath.getName(), pqIcdPath.getJsonStr());
if (ObjectUtil.isNotNull(mappingFile) && !mappingFile.isEmpty()) {
String mappingFilename = mappingFile.getOriginalFilename();
if (!mappingFilename.endsWith(".txt")) {
throw new BusinessException(IcdResponseEnum.FILE_TYPE_ERROR);
}
if (mappingFile.getSize() > FILE_SIZE_LIMIT) {
throw new BusinessException(IcdResponseEnum.FILE_SIZE_ERROR);
}
try {
// 如果文件存在,则先删除
String mappingFilePath = commInstallPath + "\\DeviceControl\\Config\\" + mappingFilename;
Path path = Paths.get(mappingFilePath);
File file = path.toFile();
if (file.exists()) {
file.delete();
}
// 保存文件
byte[] bytes = mappingFile.getBytes();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(mappingFilePath));
bufferedOutputStream.write(bytes);
bufferedOutputStream.flush();
bufferedOutputStream.close();
} catch (IOException e) {
throw new BusinessException(ReportResponseEnum.FILE_UPLOAD_FAILED);
}
} }
return updated;
//this.executeRestartCmd(commInstallPath);
return this.updateById(pqIcdPath);
} }
@Override @Override
@Transactional @Transactional
public boolean deleteIcd(List<String> ids) { public boolean deleteIcd(List<String> ids) {
List<PqIcdPath> pqIcdPaths = this.listByIds(ids); if (CollUtil.isEmpty(ids)) {
String commInstallPath = this.getCommInstallPath(); return true;
pqIcdPaths.forEach(pqIcdPath -> { }
String mappingFilePath = commInstallPath + "\\DeviceControl\\Config\\" + pqIcdPath.getName() + ".txt"; List<PqIcdPath> pqIcdPaths = this.baseMapper.selectByIdsWithoutBlob(ids);
Path path = Paths.get(mappingFilePath); List<String> standardIds = pqIcdPaths.stream()
File file = path.toFile(); .filter(pqIcdPath -> ObjectUtil.equals(pqIcdPath.getType(), TYPE_STANDARD))
if (file.exists()) { .map(PqIcdPath::getId)
file.delete(); .collect(Collectors.toList());
if (!standardIds.isEmpty()) {
Long count = this.baseMapper.countActiveReferencesToStandards(standardIds);
if (ObjectUtil.isNotNull(count) && count > 0) {
throw new BusinessException(IcdResponseEnum.STANDARD_ICD_IN_USE);
} }
}); }
return this.lambdaUpdate().in(PqIcdPath::getId, ids).set(PqIcdPath::getState, DataStateEnum.DELETED.getCode()).update(); boolean deleted = this.lambdaUpdate().in(PqIcdPath::getId, ids).set(PqIcdPath::getState, DataStateEnum.DELETED.getCode()).update();
if (deleted) {
Path directory = resolveIcdTxtDir();
for (PqIcdPath pqIcdPath : pqIcdPaths) {
deleteIcdTextFile(directory, pqIcdPath.getName());
}
}
return deleted;
}
@Override
public PqIcdPath getIcdById(String id) {
PqIcdPath detail = this.baseMapper.selectDetailById(id);
if (ObjectUtil.isNull(detail)) {
throw new BusinessException(IcdResponseEnum.ICD_NOT_FOUND);
}
return detail;
}
@Override
public byte[] exportIcd(String id) {
PqIcdPath detail = this.baseMapper.selectExportById(id);
if (ObjectUtil.isNull(detail)) {
throw new BusinessException(IcdResponseEnum.ICD_NOT_FOUND);
}
return icdArchiveBuilder.build(detail);
} }
@Override @Override
@@ -213,18 +190,125 @@ public class PqIcdPathServiceImpl extends ServiceImpl<PqIcdPathMapper, PqIcdPath
return this.baseMapper.selectIcdByDevType(devTypeId); return this.baseMapper.selectIcdByDevType(devTypeId);
} }
private void checkRepeat(PqIcdPathParam param, boolean isExcludeSelf) { private void validateBusinessFields(PqIcdPathParam param, String currentId) {
LambdaQueryWrapper<PqIcdPath> wrapper = new LambdaQueryWrapper<>(); if (ObjectUtil.isNull(param.getResult())) {
wrapper.eq(PqIcdPath::getName, param.getName()) throw new BusinessException(IcdResponseEnum.RESULT_NOT_NULL);
.eq(PqIcdPath::getState, DataStateEnum.ENABLE.getCode());
if (isExcludeSelf) {
if (param instanceof PqIcdPathParam.UpdateParam) {
wrapper.ne(PqIcdPath::getId, ((PqIcdPathParam.UpdateParam) param).getId());
}
} }
int count = this.count(wrapper); if (ObjectUtil.equals(param.getResult(), RESULT_NO) && StrUtil.isBlank(param.getMsg())) {
if (count > 0) { throw new BusinessException(IcdResponseEnum.MSG_NOT_BLANK);
throw new BusinessException(DetectionResponseEnum.ICD_PATH_NAME_REPEAT); }
if (ObjectUtil.isNull(param.getType())) {
throw new BusinessException(IcdResponseEnum.TYPE_NOT_NULL);
}
if (!ObjectUtil.equals(param.getType(), TYPE_STANDARD)
&& !ObjectUtil.equals(param.getType(), TYPE_NON_STANDARD)
&& !ObjectUtil.equals(param.getType(), TYPE_UPSTREAM_STANDARD)
&& !ObjectUtil.equals(param.getType(), TYPE_UPSTREAM_NON_STANDARD)) {
throw new BusinessException(IcdResponseEnum.TYPE_VALUE_ERROR);
}
if (requiresReferenceIcd(param.getType()) && StrUtil.isBlank(param.getReferenceIcdId())) {
throw new BusinessException(IcdResponseEnum.REFERENCE_ICD_NOT_BLANK);
}
if (StrUtil.isNotBlank(currentId) && StrUtil.equals(currentId, StrUtil.trim(param.getReferenceIcdId()))) {
throw new BusinessException(IcdResponseEnum.REFERENCE_ICD_INVALID);
} }
} }
private void validateReferenceIcd(Integer type, String referenceIcdId, String currentId) {
if (!requiresReferenceIcd(type)) {
return;
}
if (StrUtil.isNotBlank(currentId) && StrUtil.equals(currentId, referenceIcdId)) {
throw new BusinessException(IcdResponseEnum.REFERENCE_ICD_INVALID);
}
long count = this.lambdaQuery()
.eq(PqIcdPath::getId, referenceIcdId)
.in(PqIcdPath::getType, TYPE_STANDARD, TYPE_UPSTREAM_STANDARD)
.eq(PqIcdPath::getState, DataStateEnum.ENABLE.getCode())
.count();
if (count <= 0L) {
throw new BusinessException(IcdResponseEnum.REFERENCE_ICD_INVALID);
}
}
private void validateExternalReferenceIcd(Integer type, String referenceIcdId, String currentId, Set<String> requestStandardIds) {
if (!requiresReferenceIcd(type)) {
return;
}
String trimmedReferenceId = StrUtil.trim(referenceIcdId);
if (StrUtil.isNotBlank(currentId) && StrUtil.equals(currentId, trimmedReferenceId)) {
throw new BusinessException(IcdResponseEnum.REFERENCE_ICD_INVALID);
}
if (StrUtil.isNotBlank(trimmedReferenceId) && requestStandardIds.contains(trimmedReferenceId)) {
return;
}
validateReferenceIcd(type, trimmedReferenceId, currentId);
}
private Set<String> collectRequestStandardIds(List<PqIcdPathParam.ExternalCreateParam> params) {
Set<String> ids = new HashSet<>();
for (PqIcdPathParam.ExternalCreateParam param : params) {
if (isStandardType(param.getType()) && StrUtil.isNotBlank(param.getId())) {
ids.add(StrUtil.trim(param.getId()));
}
}
return ids;
}
private boolean requiresReferenceIcd(Integer type) {
return ObjectUtil.equals(type, TYPE_NON_STANDARD) || ObjectUtil.equals(type, TYPE_UPSTREAM_NON_STANDARD);
}
private boolean isStandardType(Integer type) {
return ObjectUtil.equals(type, TYPE_STANDARD) || ObjectUtil.equals(type, TYPE_UPSTREAM_STANDARD);
}
private PqIcdPath getActiveEntity(String id) {
PqIcdPath current = this.lambdaQuery()
.eq(PqIcdPath::getId, id)
.eq(PqIcdPath::getState, DataStateEnum.ENABLE.getCode())
.one();
if (ObjectUtil.isNull(current)) {
throw new BusinessException(IcdResponseEnum.ICD_NOT_FOUND);
}
return current;
}
Path resolveIcdTxtDir() {
if (StrUtil.isBlank(icdTxtDir)) {
throw new BusinessException(IcdResponseEnum.ICD_TXT_SYNC_FAILED);
}
return Paths.get(icdTxtDir.trim());
}
void writeIcdTextFile(Path directory, String name, String jsonStr) {
try {
Files.createDirectories(directory);
Files.write(resolveTxtFile(directory, name), StrUtil.nullToDefault(jsonStr, "").getBytes(StandardCharsets.UTF_8),
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE);
} catch (IOException ex) {
log.error("sync icd txt file failed, name={}", name, ex);
throw new BusinessException(IcdResponseEnum.ICD_TXT_SYNC_FAILED);
}
}
void syncUpdatedIcdTextFile(Path directory, String oldName, String newName, String jsonStr) {
if (StrUtil.isNotBlank(oldName) && !StrUtil.equals(oldName, newName)) {
deleteIcdTextFile(directory, oldName);
}
writeIcdTextFile(directory, newName, jsonStr);
}
void deleteIcdTextFile(Path directory, String name) {
try {
Files.deleteIfExists(resolveTxtFile(directory, name));
} catch (IOException ex) {
log.error("delete icd txt file failed, name={}", name, ex);
throw new BusinessException(IcdResponseEnum.ICD_TXT_SYNC_FAILED);
}
}
private Path resolveTxtFile(Path directory, String name) {
return directory.resolve(name + ".txt");
}
} }

View File

@@ -0,0 +1,62 @@
package com.njcn.gather.icd.service.support;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.gather.icd.pojo.enums.IcdResponseEnum;
import com.njcn.gather.icd.pojo.po.PqIcdPath;
import org.springframework.stereotype.Component;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@Component
public class IcdArchiveBuilder {
public byte[] build(PqIcdPath item) {
if (item == null || item.getIcd() == null || item.getIcd().length == 0) {
throw new BusinessException(IcdResponseEnum.ICD_FILE_NOT_FOUND);
}
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(bos, StandardCharsets.UTF_8)) {
writeTextEntry(zos, item.getName() + ".json", item.getJsonStr());
writeTextEntry(zos, item.getName() + ".xml", item.getXmlStr());
writeBinaryEntry(zos, item.getName() + ".icd", item.getIcd());
zos.finish();
return bos.toByteArray();
} catch (IOException ex) {
throw new BusinessException(IcdResponseEnum.ICD_EXPORT_FAILED);
}
}
/**
* 向ZIP流中写入文本条目
*
* @param zos ZIP输出流
* @param name 条目名称(文件路径)
* @param value 文本内容如果为null则写入空字节数组
* @throws IOException 写入异常
*/
private void writeTextEntry(ZipOutputStream zos, String name, String value) throws IOException {
// 将文本转换为UTF-8编码的字节数组null值转换为空数组
writeBinaryEntry(zos, name, value == null ? new byte[0] : value.getBytes(StandardCharsets.UTF_8));
}
/**
* 向ZIP流中写入二进制条目
*
* @param zos ZIP输出流
* @param name 条目名称(文件路径)
* @param data 二进制数据
* @throws IOException 写入异常
*/
private void writeBinaryEntry(ZipOutputStream zos, String name, byte[] data) throws IOException {
// 创建新的ZIP条目并设置文件名
zos.putNextEntry(new ZipEntry(name));
// 写入二进制数据
zos.write(data);
// 关闭当前条目,准备写入下一个条目
zos.closeEntry();
}
}

View File

@@ -0,0 +1,90 @@
package com.njcn.gather.icd.service.support;
import cn.hutool.core.util.StrUtil;
import com.njcn.common.pojo.enums.common.DataStateEnum;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.gather.icd.pojo.enums.IcdResponseEnum;
import com.njcn.gather.icd.pojo.param.PqIcdPathParam;
import com.njcn.gather.icd.pojo.po.PqIcdPath;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@Component
@RequiredArgsConstructor
public class IcdPayloadAssembler {
private final IcdPayloadValidator validator;
public PqIcdPath fromCreate(PqIcdPathParam.CreateParam param) {
MultipartFile file = validator.validateIcdFile(param.getIcdFile(), true);
validator.validateJson(param.getJsonStr());
validator.validateXml(param.getXmlStr());
PqIcdPath entity = new PqIcdPath();
applyCommonFields(entity, param);
entity.setName(validator.extractName(file.getOriginalFilename()));
entity.setIcd(getBytes(file));
entity.setState(DataStateEnum.ENABLE.getCode());
return entity;
}
public PqIcdPath fromExternalCreate(PqIcdPathParam.ExternalCreateParam param, int type, int angle, int usePhaseIndex) {
byte[] fileBytes = validator.decodeExternalIcdFile(param.getIcdFile());
validator.validateJson(param.getJsonStr());
validator.validateXml(param.getXmlStr());
PqIcdPath entity = new PqIcdPath();
entity.setId(normalizeNullableText(param.getId()));
param.setType(type);
param.setAngle(angle);
param.setUsePhaseIndex(usePhaseIndex);
applyCommonFields(entity, param);
entity.setName(normalizeNullableText(param.getName()));
entity.setIcd(fileBytes);
entity.setState(DataStateEnum.ENABLE.getCode());
return entity;
}
public PqIcdPath merge(PqIcdPath current, PqIcdPathParam.UpdateParam param) {
MultipartFile file = validator.validateIcdFile(param.getIcdFile(), false);
validator.validateJson(param.getJsonStr());
validator.validateXml(param.getXmlStr());
applyCommonFields(current, param);
if (file != null && !file.isEmpty()) {
current.setName(validator.extractName(file.getOriginalFilename()));
current.setIcd(getBytes(file));
}
return current;
}
private void applyCommonFields(PqIcdPath entity, PqIcdPathParam param) {
entity.setAngle(param.getAngle());
entity.setUsePhaseIndex(param.getUsePhaseIndex());
entity.setJsonStr(param.getJsonStr());
entity.setXmlStr(param.getXmlStr());
entity.setResult(param.getResult());
entity.setMsg(param.getResult() != null && param.getResult() == 1 ? null : normalizeNullableText(param.getMsg()));
entity.setType(param.getType());
entity.setReferenceIcdId(requiresReferenceIcd(param.getType()) ? normalizeNullableText(param.getReferenceIcdId()) : null);
}
private String normalizeNullableText(String value) {
return StrUtil.emptyToNull(StrUtil.trim(value));
}
private boolean requiresReferenceIcd(Integer type) {
return type != null && (type == 2 || type == 4);
}
private byte[] getBytes(MultipartFile file) {
try {
return file.getBytes();
} catch (IOException ex) {
throw new BusinessException(IcdResponseEnum.ICD_FILE_READ_ERROR);
}
}
}

View File

@@ -0,0 +1,66 @@
package com.njcn.gather.icd.service.support;
import com.alibaba.fastjson.JSON;
import com.njcn.common.pojo.exception.BusinessException;
import com.njcn.gather.icd.pojo.enums.IcdResponseEnum;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
import java.util.Base64;
import java.util.Locale;
@Component
public class IcdPayloadValidator {
public MultipartFile validateIcdFile(MultipartFile file, boolean required) {
if ((file == null || file.isEmpty()) && required) {
throw new BusinessException(IcdResponseEnum.ICD_FILE_NOT_NULL);
}
if (file == null || file.isEmpty()) {
return null;
}
String originalName = file.getOriginalFilename();
if (originalName == null || !originalName.toLowerCase(Locale.ROOT).endsWith(".icd")) {
throw new BusinessException(IcdResponseEnum.ICD_FILE_TYPE_ERROR);
}
return file;
}
public String extractName(String originalName) {
int suffixIndex = originalName.toLowerCase(Locale.ROOT).lastIndexOf(".icd");
return suffixIndex >= 0 ? originalName.substring(0, suffixIndex) : originalName;
}
public byte[] decodeExternalIcdFile(String base64Content) {
if (base64Content == null || base64Content.trim().isEmpty()) {
throw new BusinessException(IcdResponseEnum.ICD_FILE_NOT_NULL);
}
try {
return Base64.getDecoder().decode(base64Content.trim());
} catch (IllegalArgumentException ex) {
throw new BusinessException(IcdResponseEnum.ICD_FILE_READ_ERROR);
}
}
public void validateJson(String jsonStr) {
try {
JSON.parse(jsonStr);
} catch (Exception ex) {
throw new BusinessException(IcdResponseEnum.JSON_FORMAT_ERROR);
}
}
public void validateXml(String xmlStr) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 禁用 DOCTYPE 声明
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.newDocumentBuilder().parse(new InputSource(new StringReader(xmlStr)));
} catch (Exception ex) {
throw new BusinessException(IcdResponseEnum.XML_FORMAT_ERROR);
}
}
}

View File

@@ -109,6 +109,9 @@ qr:
db: db:
type: mysql type: mysql
icd:
txt-dir: D:\icd-txt
# 比对录波需要的配置,晚点再做优化 # 比对录波需要的配置,晚点再做优化
# 系统配置 # 系统配置