parent
a741c5ab04
commit
da71a8ba41
@ -0,0 +1,33 @@ |
||||
package digital.laboratory.platform.entrustment.enums; |
||||
|
||||
import lombok.Getter; |
||||
|
||||
/** |
||||
* @author ChenJiangBao |
||||
* @version 1.0 |
||||
* @description: 委托信息导出excel表头枚举 |
||||
* @date 2025/7/14 10:47 |
||||
*/ |
||||
@Getter |
||||
public enum EntrustExportHeaderEnum { |
||||
CASE_NAME("caseName", "案件名称"), |
||||
CASE_BRIEF("caseBrief", "案情简要"), |
||||
HAPPEN_TIME("happenTime", "案发时间"), |
||||
SUSPECT_INFO("suspectInfo", "嫌疑人信息"), |
||||
CLIENT_ORG_NAME("clientOrgName", "委托单位"), |
||||
ENTRUST_TIME("entrustmentTime", "送检时间"), |
||||
ACCEPT_NO("acceptNo", "受理编号"), |
||||
ACCEPT_TIME("acceptTime", "受理时间"), |
||||
ENTRUST_REQUIREMENT("entrustRequirement", "鉴定要求"), |
||||
MATERIAL_CHARACTER("materialCharacterDesc", "性状描述"), |
||||
MATERIAL_COUNT("materialCount", "检材数量"), |
||||
MATERIAL_RESULT("materialResult", "检材检测结果"); |
||||
|
||||
private final String field; // 字段名,用于匹配数据
|
||||
private final String header; // Excel列名,用于显示
|
||||
|
||||
EntrustExportHeaderEnum(String field, String header) { |
||||
this.field = field; |
||||
this.header = header; |
||||
} |
||||
} |
@ -0,0 +1,393 @@ |
||||
package digital.laboratory.platform.entrustment.service.impl; |
||||
|
||||
import cn.hutool.core.collection.CollUtil; |
||||
import com.baomidou.mybatisplus.core.toolkit.IdWorker; |
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
||||
import digital.laboratory.platform.common.core.exception.CheckedException; |
||||
import digital.laboratory.platform.common.core.util.R; |
||||
import digital.laboratory.platform.common.mybatis.security.service.DLPUser; |
||||
import digital.laboratory.platform.common.security.util.SecurityUtils; |
||||
import digital.laboratory.platform.entrustment.entity.*; |
||||
import digital.laboratory.platform.entrustment.enums.AnalysisOptionEnums; |
||||
import digital.laboratory.platform.entrustment.enums.EntrustExportHeaderEnum; |
||||
import digital.laboratory.platform.entrustment.enums.EntrustIdentificationSituationType; |
||||
import digital.laboratory.platform.entrustment.enums.EntrustStatusConstants; |
||||
import digital.laboratory.platform.entrustment.mapper.EntrustmentMapper; |
||||
import digital.laboratory.platform.entrustment.service.*; |
||||
import digital.laboratory.platform.entrustment.utils.ExcelUtils; |
||||
import digital.laboratory.platform.entrustment.vo.EntrustmentVO; |
||||
import digital.laboratory.platform.sys.entity.DrugLite; |
||||
import digital.laboratory.platform.sys.enums.entrust.EntrustBiologyType; |
||||
import digital.laboratory.platform.sys.feign.RemoteCommDrugService; |
||||
import org.apache.poi.ss.usermodel.*; |
||||
import org.apache.poi.ss.util.CellRangeAddress; |
||||
import org.apache.poi.xssf.streaming.SXSSFWorkbook; |
||||
import org.springframework.stereotype.Service; |
||||
import org.springframework.web.multipart.MultipartFile; |
||||
|
||||
import javax.annotation.Resource; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.IOException; |
||||
import java.math.BigDecimal; |
||||
import java.net.URLEncoder; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.time.LocalDate; |
||||
import java.time.LocalDateTime; |
||||
import java.time.format.DateTimeFormatter; |
||||
import java.time.temporal.ChronoUnit; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.function.Function; |
||||
import java.util.stream.Collectors; |
||||
|
||||
/** |
||||
* @author ChenJiangBao |
||||
* @version 1.0 |
||||
* @description: excel上传服务层接口 实现类 |
||||
* @date 2025/4/16 11:55 |
||||
*/ |
||||
@Service |
||||
public class ExcelOperationServiceImpl implements ExcelOperationService { |
||||
|
||||
@Resource |
||||
private SampleService sampleService; |
||||
|
||||
@Resource |
||||
private CaseEventService caseEventService; |
||||
|
||||
@Resource |
||||
private EntrustmentService entrustmentService; |
||||
|
||||
@Resource |
||||
private EntrustmentMapper entrustmentMapper; |
||||
|
||||
@Resource |
||||
private EntrustmentIdentificationMaterialService entrustmentIdentificationMaterialService; |
||||
|
||||
@Resource |
||||
private EntrustMaterialCheckoutResultService entrustMaterialCheckoutResultService; |
||||
|
||||
@Resource |
||||
private RemoteCommDrugService remoteCommDrugService; |
||||
|
||||
@Resource |
||||
private SuspectService suspectService; |
||||
|
||||
/** |
||||
* 上传两社人员名单Excel文件,并自动生成检材与检测结果数据 |
||||
* |
||||
* @param file Excel文件(包含人员信息) |
||||
* @param entrustId 委托ID |
||||
* @return 是否成功导入 |
||||
* @throws Exception 发生异常时抛出 |
||||
*/ |
||||
@Override |
||||
public Boolean uploadHairInspectExcel(MultipartFile file, String entrustId) throws Exception { |
||||
|
||||
// 1. 校验委托合法性
|
||||
Entrustment entrustment = entrustmentService.getById(entrustId); |
||||
if (entrustment == null) { |
||||
throw new CheckedException(String.format("委托id为 %s 的委托信息不存在!", entrustId)); |
||||
} |
||||
if (!entrustment.getOldIdentificationResult().equals(EntrustIdentificationSituationType.TWO_AGENCY.getDesc())) { |
||||
throw new CheckedException("当前不支持两社人员之外的委托信息进行导入!"); |
||||
} |
||||
|
||||
// 2. 获取案件与毒品信息
|
||||
// 2.1 校验案件信息
|
||||
CaseEvent cj = caseEventService.validateCaseInfo(entrustment.getCaseId()); |
||||
|
||||
// 2.2 获取默认毒品(海洛因)
|
||||
|
||||
|
||||
// 2.3 获取所有毒品名称映射(便于匹配检测结果)
|
||||
R<List<DrugLite>> innerGetAllR = remoteCommDrugService.innerGetAll(); |
||||
List<DrugLite> drugLiteList = innerGetAllR.getData(); |
||||
Map<String, DrugLite> drugLiteMap = drugLiteList.stream() |
||||
.collect(Collectors.toMap(DrugLite::getName, Function.identity())); |
||||
|
||||
// 3. 读取Excel内容(从第一行数据开始读取)
|
||||
int headIndex = 1; |
||||
List<Map<String, String>> data = ExcelUtils.readExcel(file, headIndex); |
||||
|
||||
// 3.1 获取当前委托下已有检材数,作为orderNo起始编号
|
||||
int orderNo = entrustmentIdentificationMaterialService.lambdaQuery() |
||||
.eq(EntrustmentIdentificationMaterial::getEntrustmentId, entrustId) |
||||
.list().size() + 1; |
||||
|
||||
// 3.2 初始化结果对象集合
|
||||
List<EntrustMaterialCheckoutResult> results = new ArrayList<>(); |
||||
|
||||
ArrayList<Suspect> suspects = new ArrayList<>(); |
||||
for (Map<String, String> datum : data) { |
||||
Suspect suspect = new Suspect(); |
||||
suspect.setName(datum.get("姓名")); |
||||
suspect.setIdNumber(datum.get("身份证号")); |
||||
suspects.add(suspect); |
||||
} |
||||
if (CollUtil.isNotEmpty(suspects)) { |
||||
suspectService.remove(Wrappers.<Suspect>lambdaQuery() |
||||
.eq(Suspect::getEntrustId, entrustId)); |
||||
suspectService.addSuspectList(suspects, entrustId); |
||||
} |
||||
List<EntrustmentIdentificationMaterial> entrustmentIdentificationMaterialList = new ArrayList<>(); |
||||
|
||||
// 4. 遍历Excel数据行,构建检材与检测结果
|
||||
for (Map<String, String> datum : data) { |
||||
// 构建检材对象
|
||||
EntrustmentIdentificationMaterial material = new EntrustmentIdentificationMaterial(); |
||||
material.setEntrustmentId(entrustment.getId()); |
||||
material.setCaseId(entrustment.getCaseId()); |
||||
material.setName(datum.get("姓名") + "毛发"); |
||||
material.setRemark(datum.get("身份证号")); |
||||
|
||||
// 解析身份证号
|
||||
String idNum = datum.get("身份证号"); |
||||
if (idNum != null && idNum.length() == 18) { |
||||
material.setBiologyGender(this.getSexByIdNum(idNum)); |
||||
material.setMaterialAge(Integer.valueOf(this.getAgeByIdNum(idNum))); |
||||
} |
||||
|
||||
material.setDrawPlace(datum.get("采样单位")); |
||||
material.setId(IdWorker.get32UUID().toUpperCase()); |
||||
|
||||
// 检测结果解析
|
||||
ArrayList<DrugLite> matchedDrugs = new ArrayList<>(); |
||||
String[] drugs = datum.get("检测结果").split("、"); |
||||
if (drugs.length == 0 || (drugs.length == 1 && drugs[0].trim().isEmpty())) { |
||||
matchedDrugs.add(drugLiteMap.get("海洛因")); |
||||
} else { |
||||
boolean matched = false; |
||||
for (String drugName : drugs) { |
||||
if (drugLiteMap.containsKey(drugName)) { |
||||
matchedDrugs.add(drugLiteMap.get(drugName)); |
||||
matched = true; |
||||
} |
||||
} |
||||
if (!matched) { |
||||
matchedDrugs.add(drugLiteMap.get("海洛因")); |
||||
} |
||||
} |
||||
material.setCandidateDrugs(matchedDrugs); |
||||
|
||||
// 设置检材默认属性
|
||||
material.setBiologyType(EntrustBiologyType.HAIR.getDesc()); |
||||
material.setType("1"); |
||||
material.setTypeName("生物样本"); |
||||
material.setQuantity(new BigDecimal(50)); |
||||
material.setUnit("mg"); |
||||
material.setForm("黑色头发"); |
||||
material.setFormName("黑色头发"); |
||||
material.setOrderNo(orderNo); |
||||
material.setImEntrustNumber(String.valueOf(orderNo)); |
||||
orderNo++; |
||||
material.setPackComplete(true); |
||||
material.setRtSampleQuantity(0); |
||||
material.setDrawTime(LocalDateTime.now()); |
||||
material.setAnalysisOption(AnalysisOptionEnums.QUALITATIVE.getCode()); |
||||
|
||||
entrustmentIdentificationMaterialService.setMaterialIdentificationNo(material, cj); |
||||
material.setSample1No(sampleService.getNewSampleNo(material.getImNo(), 1)); |
||||
|
||||
entrustmentIdentificationMaterialList.add(material); |
||||
} |
||||
// entrustMaterialCheckoutResultService.saveBatch(results);
|
||||
boolean isSave = entrustmentIdentificationMaterialService.saveBatch(entrustmentIdentificationMaterialList); |
||||
String entrustReq = entrustmentService.buildEntrustReq(entrustmentIdentificationMaterialList); |
||||
entrustment.setEntrustRequirement(entrustReq); |
||||
entrustmentService.updateById(entrustment); |
||||
// 5. 批量保存检材信息和检测结果
|
||||
return isSave; |
||||
} |
||||
|
||||
/** |
||||
* 根据当前用户的机构id查询属于这个机构的委托信息 |
||||
* |
||||
* @param year 年份,用于筛选特定年份的委托信息 |
||||
* @param response |
||||
*/ |
||||
@Override |
||||
public void exportByEntrustOrg(Integer year, HttpServletResponse response) throws IOException { |
||||
DLPUser user = SecurityUtils.getUser(); |
||||
// 查询委托单位是当前用户机构id的委托信息
|
||||
List<EntrustmentVO> entrustmentVOList = entrustmentMapper.getEntrustmentVOList( |
||||
Wrappers.<Entrustment>query() |
||||
.eq("e.client_org_id", user.getOrgId()) |
||||
.eq("e.status", EntrustStatusConstants.ENTRUST_STATUS_ACCEPTED.getStatus()) |
||||
.likeRight(year != null , "e.accept_time", year) |
||||
.orderByDesc("e.accept_time") |
||||
); |
||||
|
||||
if (CollUtil.isEmpty(entrustmentVOList)) { |
||||
throw new CheckedException(String.format("当前用户机构 [%s] 无委托信息!", user.getOrgName())); |
||||
} |
||||
|
||||
// 获取检材信息
|
||||
List<EntrustmentIdentificationMaterial> identificationMaterials = entrustmentIdentificationMaterialService.list( |
||||
Wrappers.<EntrustmentIdentificationMaterial>lambdaQuery() |
||||
.in(EntrustmentIdentificationMaterial::getEntrustmentId, |
||||
entrustmentVOList.stream().map(EntrustmentVO::getId).collect(Collectors.toList())) |
||||
); |
||||
|
||||
// 分组
|
||||
Map<String, List<EntrustmentIdentificationMaterial>> materialGroupMap = identificationMaterials.stream().collect(Collectors.groupingBy(EntrustmentIdentificationMaterial::getEntrustmentId)); |
||||
|
||||
|
||||
|
||||
// 获取嫌疑人信息并根据委托id分组
|
||||
Map<String, String> suspectGroupMap = buildSuspectInfoGroupByEntrustId(entrustmentVOList); |
||||
|
||||
SXSSFWorkbook workbook = new SXSSFWorkbook(); |
||||
Sheet sheet = workbook.createSheet(user.getOrgName() + "已受理委托信息统计"); |
||||
|
||||
// ====== 合并第一行单元格 (0,0) 到 (0, 列数-1)
|
||||
List<EntrustExportHeaderEnum> headers = CollUtil.newArrayList(EntrustExportHeaderEnum.values()); |
||||
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headers.size() - 1)); |
||||
|
||||
// ====== 设置标题行内容
|
||||
Row titleRow = sheet.createRow(0); |
||||
Cell titleCell = titleRow.createCell(0); |
||||
titleCell.setCellValue(user.getOrgName() + "已受理委托信息统计"); |
||||
|
||||
// 可选:设置样式(加粗、居中)
|
||||
CellStyle titleStyle = workbook.createCellStyle(); |
||||
Font font = workbook.createFont(); |
||||
font.setBold(true); |
||||
font.setFontHeightInPoints((short) 14); |
||||
titleStyle.setFont(font); |
||||
titleStyle.setAlignment(HorizontalAlignment.CENTER); |
||||
titleCell.setCellStyle(titleStyle); |
||||
|
||||
// ====== 第二行为表头
|
||||
Row headerRow = sheet.createRow(1); |
||||
for (int i = 0; i < headers.size(); i++) { |
||||
headerRow.createCell(i).setCellValue(headers.get(i).getHeader()); |
||||
// // 设置自动长度
|
||||
// sheet.autoSizeColumn(i);
|
||||
} |
||||
|
||||
// ====== 第三行开始写入数据
|
||||
for (int i = 0; i < entrustmentVOList.size(); i++) { |
||||
EntrustmentVO vo = entrustmentVOList.get(i); |
||||
Row row = sheet.createRow(i + 2); |
||||
|
||||
for (int j = 0; j < headers.size(); j++) { |
||||
EntrustExportHeaderEnum header = headers.get(j); |
||||
Cell cell = row.createCell(j); |
||||
|
||||
switch (header) { |
||||
case CASE_NAME: |
||||
cell.setCellValue(vo.getCaseName()); |
||||
break; |
||||
case CASE_BRIEF: |
||||
cell.setCellValue(vo.getCaseBrief()); |
||||
break; |
||||
case HAPPEN_TIME: |
||||
cell.setCellValue(vo.getHappenTime()); |
||||
break; |
||||
case SUSPECT_INFO: |
||||
cell.setCellValue(suspectGroupMap.get(vo.getId())); |
||||
break; |
||||
case CLIENT_ORG_NAME: |
||||
cell.setCellValue(vo.getClientOrgName()); |
||||
break; |
||||
case ENTRUST_TIME: |
||||
cell.setCellValue(vo.getEntrustmentTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); |
||||
break; |
||||
case ACCEPT_NO: |
||||
cell.setCellValue(vo.getAcceptNo()); |
||||
break; |
||||
case ACCEPT_TIME: |
||||
cell.setCellValue(vo.getAcceptTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); |
||||
break; |
||||
case ENTRUST_REQUIREMENT: |
||||
cell.setCellValue(vo.getEntrustRequirement()); |
||||
break; |
||||
case MATERIAL_CHARACTER: |
||||
cell.setCellValue(entrustMaterialCheckoutResultService.buildMaterialCharacterDesc(materialGroupMap.get(vo.getId()))); |
||||
break; |
||||
case MATERIAL_COUNT: |
||||
cell.setCellValue(vo.getIdentificationMaterialCount()); |
||||
break; |
||||
case MATERIAL_RESULT: |
||||
cell.setCellValue(entrustMaterialCheckoutResultService.buildEntrustMaterialCheckoutResultStr(vo.getId())); |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
// ====== 输出到浏览器
|
||||
// response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
// String filename = user.getOrgName() + "已受理委托信息统计" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + ".xlsx";
|
||||
// response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
|
||||
workbook.write(response.getOutputStream()); |
||||
workbook.close(); |
||||
} |
||||
|
||||
/** |
||||
* 根据委托id分组,拼接嫌疑人姓名和身份证 |
||||
* @param entrustmentVOList |
||||
* @return |
||||
*/ |
||||
private Map<String, String> buildSuspectInfoGroupByEntrustId(List<EntrustmentVO> entrustmentVOList) { |
||||
List<Suspect> suspectList = suspectService.list( |
||||
Wrappers.<Suspect>lambdaQuery() |
||||
.in(Suspect::getEntrustId, |
||||
entrustmentVOList.stream().map(EntrustmentVO::getId).collect(Collectors.toList())) |
||||
); |
||||
|
||||
// 分组
|
||||
Map<String, String> suspectGroupMap = suspectList |
||||
.stream() |
||||
.collect( |
||||
Collectors.groupingBy( // 按照entrustId分组
|
||||
Suspect::getEntrustId, |
||||
Collectors.collectingAndThen( // 收集器:将分组后的列表转换为字符串, 拼接嫌疑人姓名和身份证
|
||||
Collectors.toList(), |
||||
groupList -> groupList |
||||
.stream() |
||||
.map(item -> String.format("%s : %s", item.getName(), item.getIdNumber())) |
||||
.collect(Collectors.joining("、")) |
||||
) |
||||
) |
||||
); |
||||
return suspectGroupMap; |
||||
} |
||||
|
||||
|
||||
public String getSexByIdNum(String idNumber) { |
||||
// 去除空格并转换为大写
|
||||
idNumber = idNumber.trim().toUpperCase(); |
||||
|
||||
// 校验身份证长度
|
||||
if (idNumber.length() == 18) { |
||||
try { |
||||
// 提取性别
|
||||
int genderCode = Integer.parseInt(idNumber.substring(16, 17)); |
||||
return genderCode % 2 == 0 ? "女" : "男"; |
||||
} catch (Exception e) { |
||||
|
||||
} |
||||
} |
||||
return ""; |
||||
} |
||||
|
||||
|
||||
public String getAgeByIdNum(String idNumber) { |
||||
if (idNumber.length() == 18) { |
||||
try { |
||||
// 提取出生日期并计算年龄
|
||||
String birthDateStr = idNumber.substring(6, 14); |
||||
LocalDate birthDate = LocalDate.parse(birthDateStr, DateTimeFormatter.BASIC_ISO_DATE); |
||||
LocalDate currentDate = LocalDate.now(); |
||||
long age = ChronoUnit.YEARS.between(birthDate, currentDate); |
||||
return String.valueOf(age); |
||||
|
||||
} catch (Exception e) { |
||||
} |
||||
} |
||||
return ""; |
||||
} |
||||
} |
@ -1,230 +0,0 @@ |
||||
package digital.laboratory.platform.entrustment.service.impl; |
||||
|
||||
import cn.hutool.core.collection.CollUtil; |
||||
import com.alibaba.fastjson.JSON; |
||||
import com.baomidou.mybatisplus.core.toolkit.IdWorker; |
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
||||
import digital.laboratory.platform.common.core.exception.CheckedException; |
||||
import digital.laboratory.platform.common.core.util.R; |
||||
import digital.laboratory.platform.entrustment.entity.*; |
||||
import digital.laboratory.platform.entrustment.enums.AnalysisOptionEnums; |
||||
import digital.laboratory.platform.entrustment.enums.EntrustIdentificationSituationType; |
||||
import digital.laboratory.platform.entrustment.service.*; |
||||
import digital.laboratory.platform.entrustment.utils.ExcelUtils; |
||||
import digital.laboratory.platform.sys.entity.DrugLite; |
||||
import digital.laboratory.platform.sys.enums.entrust.EntrustBiologyType; |
||||
import digital.laboratory.platform.sys.feign.RemoteCommDrugService; |
||||
import org.springframework.stereotype.Service; |
||||
import org.springframework.web.multipart.MultipartFile; |
||||
|
||||
import javax.annotation.Resource; |
||||
import java.math.BigDecimal; |
||||
import java.time.LocalDate; |
||||
import java.time.LocalDateTime; |
||||
import java.time.format.DateTimeFormatter; |
||||
import java.time.temporal.ChronoUnit; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.function.Function; |
||||
import java.util.stream.Collectors; |
||||
|
||||
/** |
||||
* @author ChenJiangBao |
||||
* @version 1.0 |
||||
* @description: excel上传服务层接口 实现类 |
||||
* @date 2025/4/16 11:55 |
||||
*/ |
||||
@Service |
||||
public class ExcelUploadServiceImpl implements ExcelUploadService { |
||||
|
||||
@Resource |
||||
private SampleService sampleService; |
||||
|
||||
@Resource |
||||
private CaseEventService caseEventService; |
||||
|
||||
@Resource |
||||
private EntrustmentService entrustmentService; |
||||
|
||||
@Resource |
||||
private EntrustmentIdentificationMaterialService entrustmentIdentificationMaterialService; |
||||
|
||||
@Resource |
||||
private RemoteCommDrugService remoteCommDrugService; |
||||
|
||||
@Resource |
||||
private EntrustMaterialCheckoutResultService entrustMaterialCheckoutResultService; |
||||
|
||||
@Resource |
||||
private SuspectService suspectService; |
||||
|
||||
/** |
||||
* 上传两社人员名单Excel文件,并自动生成检材与检测结果数据 |
||||
* |
||||
* @param file Excel文件(包含人员信息) |
||||
* @param entrustId 委托ID |
||||
* @return 是否成功导入 |
||||
* @throws Exception 发生异常时抛出 |
||||
*/ |
||||
@Override |
||||
public Boolean uploadHairInspectExcel(MultipartFile file, String entrustId) throws Exception { |
||||
|
||||
// 1. 校验委托合法性
|
||||
Entrustment entrustment = entrustmentService.getById(entrustId); |
||||
if (entrustment == null) { |
||||
throw new CheckedException(String.format("委托id为 %s 的委托信息不存在!", entrustId)); |
||||
} |
||||
if (!entrustment.getOldIdentificationResult().equals(EntrustIdentificationSituationType.TWO_AGENCY.getDesc())) { |
||||
throw new CheckedException("当前不支持两社人员之外的委托信息进行导入!"); |
||||
} |
||||
|
||||
// 2. 获取案件与毒品信息
|
||||
// 2.1 校验案件信息
|
||||
CaseEvent cj = caseEventService.validateCaseInfo(entrustment.getCaseId()); |
||||
|
||||
// 2.2 获取默认毒品(海洛因)
|
||||
|
||||
|
||||
// 2.3 获取所有毒品名称映射(便于匹配检测结果)
|
||||
R<List<DrugLite>> innerGetAllR = remoteCommDrugService.innerGetAll(); |
||||
List<DrugLite> drugLiteList = innerGetAllR.getData(); |
||||
Map<String, DrugLite> drugLiteMap = drugLiteList.stream() |
||||
.collect(Collectors.toMap(DrugLite::getName, Function.identity())); |
||||
|
||||
// 3. 读取Excel内容(从第一行数据开始读取)
|
||||
int headIndex = 1; |
||||
List<Map<String, String>> data = ExcelUtils.readExcel(file, headIndex); |
||||
|
||||
// 3.1 获取当前委托下已有检材数,作为orderNo起始编号
|
||||
int orderNo = entrustmentIdentificationMaterialService.lambdaQuery() |
||||
.eq(EntrustmentIdentificationMaterial::getEntrustmentId, entrustId) |
||||
.list().size() + 1; |
||||
|
||||
// 3.2 初始化结果对象集合
|
||||
List<EntrustMaterialCheckoutResult> results = new ArrayList<>(); |
||||
|
||||
ArrayList<Suspect> suspects = new ArrayList<>(); |
||||
for (Map<String, String> datum : data) { |
||||
Suspect suspect = new Suspect(); |
||||
suspect.setName(datum.get("姓名")); |
||||
suspect.setIdNumber(datum.get("身份证号")); |
||||
suspects.add(suspect); |
||||
} |
||||
if (CollUtil.isNotEmpty(suspects)){ |
||||
suspectService.remove(Wrappers.<Suspect>lambdaQuery() |
||||
.eq(Suspect::getEntrustId, entrustId)); |
||||
suspectService.addSuspectList(suspects, entrustId); |
||||
} |
||||
List<EntrustmentIdentificationMaterial> entrustmentIdentificationMaterialList = new ArrayList<>(); |
||||
|
||||
// 4. 遍历Excel数据行,构建检材与检测结果
|
||||
for (Map<String, String> datum : data) { |
||||
// 构建检材对象
|
||||
EntrustmentIdentificationMaterial material = new EntrustmentIdentificationMaterial(); |
||||
material.setEntrustmentId(entrustment.getId()); |
||||
material.setCaseId(entrustment.getCaseId()); |
||||
material.setName(datum.get("姓名") + "毛发"); |
||||
material.setRemark(datum.get("身份证号")); |
||||
|
||||
// 解析身份证号
|
||||
String idNum = datum.get("身份证号"); |
||||
if (idNum != null && idNum.length() == 18) { |
||||
material.setBiologyGender(this.getSexByIdNum(idNum)); |
||||
material.setMaterialAge(Integer.valueOf(this.getAgeByIdNum(idNum))); |
||||
} |
||||
|
||||
material.setDrawPlace(datum.get("采样单位")); |
||||
material.setId(IdWorker.get32UUID().toUpperCase()); |
||||
|
||||
// 检测结果解析
|
||||
ArrayList<DrugLite> matchedDrugs = new ArrayList<>(); |
||||
String[] drugs = datum.get("检测结果").split("、"); |
||||
if (drugs.length == 0 || (drugs.length == 1 && drugs[0].trim().isEmpty())){ |
||||
matchedDrugs.add(drugLiteMap.get("海洛因")); |
||||
}else { |
||||
boolean matched = false; |
||||
for (String drugName : drugs) { |
||||
if (drugLiteMap.containsKey(drugName)) { |
||||
matchedDrugs.add(drugLiteMap.get(drugName)); |
||||
matched = true; |
||||
} |
||||
} |
||||
if (!matched) { |
||||
matchedDrugs.add(drugLiteMap.get("海洛因")); |
||||
} |
||||
} |
||||
material.setCandidateDrugs(matchedDrugs); |
||||
// if (!matchedDrugs.isEmpty()) {
|
||||
// EntrustMaterialCheckoutResult result = new EntrustMaterialCheckoutResult();
|
||||
// result.setId(material.getId());
|
||||
// result.setQualitativeResult(JSON.toJSONString(matchedDrugs));
|
||||
// result.setEntrustId(entrustId);
|
||||
// results.add(result);
|
||||
// }
|
||||
|
||||
// 设置检材默认属性
|
||||
material.setBiologyType(EntrustBiologyType.HAIR.getDesc()); |
||||
material.setType("1"); |
||||
material.setTypeName("生物样本"); |
||||
material.setQuantity(new BigDecimal(50)); |
||||
material.setUnit("mg"); |
||||
material.setForm("黑色头发"); |
||||
material.setFormName("黑色头发"); |
||||
material.setOrderNo(orderNo); |
||||
material.setImEntrustNumber(String.valueOf(orderNo)); |
||||
orderNo++; |
||||
material.setPackComplete(true); |
||||
material.setRtSampleQuantity(0); |
||||
material.setDrawTime(LocalDateTime.now()); |
||||
material.setAnalysisOption(AnalysisOptionEnums.QUALITATIVE.getCode()); |
||||
|
||||
entrustmentIdentificationMaterialService.setMaterialIdentificationNo(material, cj); |
||||
material.setSample1No(sampleService.getNewSampleNo(material.getImNo(), 1)); |
||||
|
||||
entrustmentIdentificationMaterialList.add(material); |
||||
} |
||||
// entrustMaterialCheckoutResultService.saveBatch(results);
|
||||
boolean isSave = entrustmentIdentificationMaterialService.saveBatch(entrustmentIdentificationMaterialList); |
||||
String entrustReq = entrustmentService.buildEntrustReq(entrustmentIdentificationMaterialList); |
||||
entrustment.setEntrustRequirement(entrustReq); |
||||
entrustmentService.updateById(entrustment); |
||||
// 5. 批量保存检材信息和检测结果
|
||||
return isSave; |
||||
} |
||||
|
||||
|
||||
public String getSexByIdNum(String idNumber) { |
||||
// 去除空格并转换为大写
|
||||
idNumber = idNumber.trim().toUpperCase(); |
||||
|
||||
// 校验身份证长度
|
||||
if (idNumber.length() == 18) { |
||||
try { |
||||
// 提取性别
|
||||
int genderCode = Integer.parseInt(idNumber.substring(16, 17)); |
||||
return genderCode % 2 == 0 ? "女" : "男"; |
||||
} catch (Exception e) { |
||||
|
||||
} |
||||
} |
||||
return ""; |
||||
} |
||||
|
||||
|
||||
public String getAgeByIdNum(String idNumber) { |
||||
if (idNumber.length() == 18) { |
||||
try { |
||||
// 提取出生日期并计算年龄
|
||||
String birthDateStr = idNumber.substring(6, 14); |
||||
LocalDate birthDate = LocalDate.parse(birthDateStr, DateTimeFormatter.BASIC_ISO_DATE); |
||||
LocalDate currentDate = LocalDate.now(); |
||||
long age = ChronoUnit.YEARS.between(birthDate, currentDate); |
||||
return String.valueOf(age); |
||||
|
||||
} catch (Exception e) { |
||||
} |
||||
} |
||||
return ""; |
||||
} |
||||
} |
Loading…
Reference in new issue