diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 12f85bc..cf47c98 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -127,6 +127,7 @@ /** * 实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完) + * 新增在检测中的原始记录和证书打印的集成状态 */ @ApiOperation("实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完)") @PostMapping("/myExecutive/list") @@ -160,7 +161,7 @@ if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); + return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); } /** @@ -176,6 +177,11 @@ return labExecutiveInfoService.sampleReceive(requestList); } + @ApiOperation("实验室检测-扫描增加任务到检测中(任务分发管理中待分发->检测中 / 实验室任务待检测->检测中)") + @PostMapping("/myExecutive/add") + public ReturnDTO sampleAdd(@RequestBody @Valid List requestList) { + return labExecutiveInfoService.sampleAdd(requestList); + } /** * 实验室检测-负责人/检定人扫描检完(检测中->检测完) */ diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 12f85bc..cf47c98 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -127,6 +127,7 @@ /** * 实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完) + * 新增在检测中的原始记录和证书打印的集成状态 */ @ApiOperation("实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完)") @PostMapping("/myExecutive/list") @@ -160,7 +161,7 @@ if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); + return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); } /** @@ -176,6 +177,11 @@ return labExecutiveInfoService.sampleReceive(requestList); } + @ApiOperation("实验室检测-扫描增加任务到检测中(任务分发管理中待分发->检测中 / 实验室任务待检测->检测中)") + @PostMapping("/myExecutive/add") + public ReturnDTO sampleAdd(@RequestBody @Valid List requestList) { + return labExecutiveInfoService.sampleAdd(requestList); + } /** * 实验室检测-负责人/检定人扫描检完(检测中->检测完) */ diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java new file mode 100644 index 0000000..6eb10f7 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums.business; + +/** + * 检定文件状态 + */ +public interface MeasureFileStatusEnum { + + Integer NOT_EXIST_FILE = 1; //表示原始记录未填写 + Integer ORIGINAL_RECORD = 2; //表示原始记录填写,证书未填写 + Integer CERTIFICATE = 3; //表示证书填写,未生成证书,进入审批流 + Integer CERTIFICATE_PASS = 4; //表示证书填写,审批通过 + Integer CERTIFICATE_REJECT = 5; //表示证书填写,被驳回 + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 12f85bc..cf47c98 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -127,6 +127,7 @@ /** * 实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完) + * 新增在检测中的原始记录和证书打印的集成状态 */ @ApiOperation("实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完)") @PostMapping("/myExecutive/list") @@ -160,7 +161,7 @@ if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); + return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); } /** @@ -176,6 +177,11 @@ return labExecutiveInfoService.sampleReceive(requestList); } + @ApiOperation("实验室检测-扫描增加任务到检测中(任务分发管理中待分发->检测中 / 实验室任务待检测->检测中)") + @PostMapping("/myExecutive/add") + public ReturnDTO sampleAdd(@RequestBody @Valid List requestList) { + return labExecutiveInfoService.sampleAdd(requestList); + } /** * 实验室检测-负责人/检定人扫描检完(检测中->检测完) */ diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java new file mode 100644 index 0000000..6eb10f7 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums.business; + +/** + * 检定文件状态 + */ +public interface MeasureFileStatusEnum { + + Integer NOT_EXIST_FILE = 1; //表示原始记录未填写 + Integer ORIGINAL_RECORD = 2; //表示原始记录填写,证书未填写 + Integer CERTIFICATE = 3; //表示证书填写,未生成证书,进入审批流 + Integer CERTIFICATE_PASS = 4; //表示证书填写,审批通过 + Integer CERTIFICATE_REJECT = 5; //表示证书填写,被驳回 + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index eee4b35..8a0468e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -120,6 +120,10 @@ private String labelBind; @JSONField(serialize = false) private String orderCode; + + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") + private Integer sampleFileStatus; + public String getOrderCode() { return orderNo; } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 12f85bc..cf47c98 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -127,6 +127,7 @@ /** * 实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完) + * 新增在检测中的原始记录和证书打印的集成状态 */ @ApiOperation("实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完)") @PostMapping("/myExecutive/list") @@ -160,7 +161,7 @@ if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); + return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); } /** @@ -176,6 +177,11 @@ return labExecutiveInfoService.sampleReceive(requestList); } + @ApiOperation("实验室检测-扫描增加任务到检测中(任务分发管理中待分发->检测中 / 实验室任务待检测->检测中)") + @PostMapping("/myExecutive/add") + public ReturnDTO sampleAdd(@RequestBody @Valid List requestList) { + return labExecutiveInfoService.sampleAdd(requestList); + } /** * 实验室检测-负责人/检定人扫描检完(检测中->检测完) */ diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java new file mode 100644 index 0000000..6eb10f7 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums.business; + +/** + * 检定文件状态 + */ +public interface MeasureFileStatusEnum { + + Integer NOT_EXIST_FILE = 1; //表示原始记录未填写 + Integer ORIGINAL_RECORD = 2; //表示原始记录填写,证书未填写 + Integer CERTIFICATE = 3; //表示证书填写,未生成证书,进入审批流 + Integer CERTIFICATE_PASS = 4; //表示证书填写,审批通过 + Integer CERTIFICATE_REJECT = 5; //表示证书填写,被驳回 + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index eee4b35..8a0468e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -120,6 +120,10 @@ private String labelBind; @JSONField(serialize = false) private String orderCode; + + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") + private Integer sampleFileStatus; + public String getOrderCode() { return orderNo; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java index 00f5e89..67c4320 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java @@ -21,4 +21,8 @@ @NotNull(message = "样品id不能为空") @ApiModelProperty(value = "样品id", dataType = "Long") private Long sampleId; + + + @ApiModelProperty(value = "应出具证书数量(扫描添加到检测中接口传)", dataType = "Integer") + private Integer requireCertifications = 1; } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 12f85bc..cf47c98 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -127,6 +127,7 @@ /** * 实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完) + * 新增在检测中的原始记录和证书打印的集成状态 */ @ApiOperation("实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完)") @PostMapping("/myExecutive/list") @@ -160,7 +161,7 @@ if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); + return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); } /** @@ -176,6 +177,11 @@ return labExecutiveInfoService.sampleReceive(requestList); } + @ApiOperation("实验室检测-扫描增加任务到检测中(任务分发管理中待分发->检测中 / 实验室任务待检测->检测中)") + @PostMapping("/myExecutive/add") + public ReturnDTO sampleAdd(@RequestBody @Valid List requestList) { + return labExecutiveInfoService.sampleAdd(requestList); + } /** * 实验室检测-负责人/检定人扫描检完(检测中->检测完) */ diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java new file mode 100644 index 0000000..6eb10f7 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums.business; + +/** + * 检定文件状态 + */ +public interface MeasureFileStatusEnum { + + Integer NOT_EXIST_FILE = 1; //表示原始记录未填写 + Integer ORIGINAL_RECORD = 2; //表示原始记录填写,证书未填写 + Integer CERTIFICATE = 3; //表示证书填写,未生成证书,进入审批流 + Integer CERTIFICATE_PASS = 4; //表示证书填写,审批通过 + Integer CERTIFICATE_REJECT = 5; //表示证书填写,被驳回 + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index eee4b35..8a0468e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -120,6 +120,10 @@ private String labelBind; @JSONField(serialize = false) private String orderCode; + + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") + private Integer sampleFileStatus; + public String getOrderCode() { return orderNo; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java index 00f5e89..67c4320 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java @@ -21,4 +21,8 @@ @NotNull(message = "样品id不能为空") @ApiModelProperty(value = "样品id", dataType = "Long") private Long sampleId; + + + @ApiModelProperty(value = "应出具证书数量(扫描添加到检测中接口传)", dataType = "Integer") + private Integer requireCertifications = 1; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index 44cfd33..596c934 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,10 +13,12 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.enums.business.HandOutPropertyEnum; +import com.casic.missiles.enums.business.MeasureFileStatusEnum; import com.casic.missiles.enums.business.MeasureStatusEnum; import com.casic.missiles.enums.business.OrderStatusEnum; import com.casic.missiles.enums.meter.MeterDictEnum; @@ -42,6 +44,7 @@ import org.springframework.util.CollectionUtils; import java.util.*; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -54,7 +57,7 @@ */ @Slf4j @Service -public class BusinessLabExecutiveInfoServiceImpl extends ServiceImpl implements IBusinessLabExecutiveInfoService { +public class BusinessLabExecutiveInfoServiceImpl extends ServiceImpl implements IBusinessLabExecutiveInfoService, MeasureFileStatusEnum { @Autowired private BusinessLabExecutiveInfoMapper labExecutiveInfoMapper; @Autowired @@ -76,13 +79,16 @@ @Autowired private BusinessOrderMapper orderMapper; + @Autowired + private BusinessOriginalRecordMapper originalRecordMapper; + @Override - public Page handOutListPage(Page page, SampleHandOutListRequest handOutListRequest) throws Exception{ + public Page handOutListPage(Page page, SampleHandOutListRequest handOutListRequest) throws Exception { //查询委托书和样品关联表中的各状态的样品 Page handOutList = orderSampleRelationMapper.selectSampleListByStatus(page, handOutListRequest); log.info("任务分发-当前查询样品状态为:{}", handOutListRequest.getSampleStatus()); List records = handOutList.getRecords(); - if(CollectionUtils.isEmpty(records)){ + if (CollectionUtils.isEmpty(records)) { return new Page<>(); } records.parallelStream().forEach(handOut -> { @@ -167,10 +173,10 @@ } @Override - public SampleHandOutDetailResponse handOutListDetail(SampleHandOutDetailRequest request) throws Exception{ + public SampleHandOutDetailResponse handOutListDetail(SampleHandOutDetailRequest request) throws Exception { //根据样品id和委托书id查询样品、委托书、委托方 SampleHandOutDetailResponse sampleDetail = orderSampleRelationMapper.selectSampleDetail(request.getOrderId(), request.getSampleId()); - if(Objects.isNull(sampleDetail)){ + if (Objects.isNull(sampleDetail)) { throw new BusinessException(BusinessExceptionEnum.NON_EXIST_ORDER_OR_SAMPLE); } //根据样品id和委托书id查询检定流程、退回信息 @@ -190,11 +196,11 @@ //是否存在样品的实验室检定信息标准模板 //后续可采用该方式和模板分类方式实现自动分发 List initListResponses = labExecutiveTemplateInfoMapper.selectExecutiveList(handOutInitListRequest); - if(!CollectionUtils.isEmpty(initListResponses)){ + if (!CollectionUtils.isEmpty(initListResponses)) { return initListResponses; } - if(StringUtils.isEmpty(handOutInitListRequest.getMeasureContent())){ + if (StringUtils.isEmpty(handOutInitListRequest.getMeasureContent())) { return new ArrayList<>(); } //根据样品的检定项目去关键字匹配实验室能力信息 @@ -223,7 +229,7 @@ List labExecutiveInfos = new ArrayList<>(); for (int i = 0; i < sortedList.size(); i++) { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); - if(0 == i){ + if (0 == i) { //将第一个置为待分配(负责人可查看) labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); } @@ -240,14 +246,14 @@ } //更新样品状态为检测中 int updateFlag = orderSampleRelationMapper.updateByOrderIdAndSampleId(orderId, sampleId, SampleStatusEnum.IN_MEASURE); - if(this.saveBatch(labExecutiveInfos) && updateFlag > 0){ + if (this.saveBatch(labExecutiveInfos) && updateFlag > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override - public Page deptLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception{ + public Page deptLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception { //本级部门主管可见本部门的检测 //根据用户id查询,用户角色中TIPS为director即为主管,取用户的部门id AuthUser user = ShiroKit.getUser(); @@ -256,7 +262,7 @@ }); Map resultMap = selectDirectDept(user); - if(CollectionUtils.isEmpty(resultMap) || Objects.isNull(resultMap.get("deptId"))){ + if (CollectionUtils.isEmpty(resultMap) || Objects.isNull(resultMap.get("deptId"))) { return new Page<>(); } Long deptId = (Long) resultMap.get("deptId"); @@ -281,12 +287,12 @@ List statusList = new ArrayList<>(); statusList.add(MeasureStatusEnum.TO_MEASURE); statusList.add(MeasureStatusEnum.IN_MEASURE); - resultPage = labExecutiveInfoMapper.selectListByDeptIdAndStatus(page, labExecutiveListRequest, deptId,null, statusList); + resultPage = labExecutiveInfoMapper.selectListByDeptIdAndStatus(page, labExecutiveListRequest, deptId, null, statusList); resultPage.getRecords().parallelStream().forEach(lab -> { lab.setCurrentSegmentId(deptId); lab.setCurrentSegment(deptName); //查询证书报告表 - if(MeasureStatusEnum.IN_MEASURE.equals(lab.getMeasureStatus())){ + if (MeasureStatusEnum.IN_MEASURE.equals(lab.getMeasureStatus())) { Integer alreadyCertificateNum = getAlreadyCertificateNum(lab.getOrderId(), lab.getSampleId(), deptId); lab.setAlreadyCertifications(alreadyCertificateNum); } @@ -300,7 +306,7 @@ enrichLabExecutiveRecords(resultPage); break; } - if(!CollectionUtils.isEmpty(resultPage.getRecords())){ + if (!CollectionUtils.isEmpty(resultPage.getRecords())) { for (SampleLabExecutiveListResponse record : resultPage.getRecords()) { DictCodeUtils.convertDictCodeToName(record); } @@ -309,7 +315,7 @@ } @Override - public Page myLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception{ + public Page myLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception { AuthUser user = ShiroKit.getUser(); Assert.isFalse(Objects.isNull(user), () -> { throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); @@ -317,7 +323,7 @@ //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); // if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); - if(Objects.isNull(meterStaff)) return new Page<>(); + if (Objects.isNull(meterStaff)) return new Page<>(); Long userId = meterStaff.getId(); String measureStatus = labExecutiveListRequest.getMeasureStatus(); @@ -336,13 +342,24 @@ //检测中,查询本人检测中 //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: + List originalRecords = originalRecordMapper.selectList(null); + + Map originalRecordMap = originalRecords.stream() + .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId() + e.getOrderId()), e -> e.getMeasureCategory())); + //需要审批状态, + List certificateReportList = certificateReportMapper.selectList(null); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId() + e.getOrderId()), e -> e)); + resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); + //获取所有的原始记录和证书 resultPage.getRecords().forEach(lab -> { lab.setCurrentSegmentId(lab.getMeasureDeptId()); lab.setCurrentSegment(lab.getMeasureDeptName()); //本实验室在一个流程中若有多次检测,这里的证书信息是多次的总和,已出具的是当前本人的(后续根据需求定义调整) Integer alreadyCertificateNum = getAlreadyCertificateNum(lab.getOrderId(), lab.getSampleId(), lab.getMeasureDeptId()); lab.setAlreadyCertifications(alreadyCertificateNum); + sampleFIleStatus(originalRecordMap, certificateReportMap, lab); }); break; @@ -351,9 +368,10 @@ resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.MEASURE_COMPLETE); //查询样品检定到的其他实验室或样品检测完成 enrichLabExecutiveRecords(resultPage); + break; } - if(!CollectionUtils.isEmpty(resultPage.getRecords())){ + if (!CollectionUtils.isEmpty(resultPage.getRecords())) { for (SampleLabExecutiveListResponse record : resultPage.getRecords()) { DictCodeUtils.convertDictCodeToName(record); } @@ -361,13 +379,46 @@ return resultPage; } + /** + * 判断文件的状态 + */ + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + //判断不含原始记录的情况 + if (!originalRecordMap.containsKey(key)) { + lab.setSampleFileStatus(NOT_EXIST_FILE); + return; + } + //判断不含有证书的情况 + if (!certificateReportMap.containsKey(key)) { + lab.setSampleFileStatus(ORIGINAL_RECORD); + return; + } + //判断没有通过或者驳回的证书报告 + BusinessCertificateReport certificateReport = certificateReportMap.get(key); + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + lab.setSampleFileStatus(CERTIFICATE); + return; + } + //判断通过的状态 + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + lab.setSampleFileStatus(CERTIFICATE_PASS); + return; + } + //判断驳回的状态 + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + lab.setSampleFileStatus(CERTIFICATE_REJECT); + } + return; + } + @Override public List myExecutiveAmount() { //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id AuthUser user = ShiroKit.getUser(); MeterStaff meterStaff = getMeterStaffInfo(user); // if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); - if(Objects.isNull(meterStaff)) return new ArrayList<>(); + if (Objects.isNull(meterStaff)) return new ArrayList<>(); Long userId = meterStaff.getId(); Page page = getSampleLabExecutiveListResponsePage(); Page page1 = getSampleLabExecutiveListResponsePage(); @@ -399,22 +450,71 @@ }); //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //查询扫描样品中为该用户待检测中的样品列表 List preList = labExecutiveInfoMapper.selectListForSampleOperate(requestList, userId, MeasureStatusEnum.TO_MEASURE); - if(CollectionUtils.isEmpty(preList)){ + if (CollectionUtils.isEmpty(preList)) { throw new BusinessException(BusinessExceptionEnum.RECEIVE_SAMPLE_NOT_EXIST); } int updateFlag = labExecutiveInfoMapper.updateForSampleInMeasureOperate(preList, userId, MeasureStatusEnum.IN_MEASURE); - if(updateFlag > 0){ + if (updateFlag > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.RECEIVE_SAMPLE_NOT_EXIST); } @Override + public ReturnDTO sampleAdd(List requestList) { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id + MeterStaff meterStaff = getMeterStaffInfo(user); + if (Objects.isNull(meterStaff)) { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + } + Long userId = meterStaff.getId(); + List existSampleList = new ArrayList<>(); + for (SampleOperateRequest request : requestList) { + //检查样品是否已在检测流程中,提示 + QueryWrapper wrapper = new QueryWrapper<>(); + List statusList = Arrays.asList(MeasureStatusEnum.TO_MEASURE, MeasureStatusEnum.IN_MEASURE, MeasureStatusEnum.MEASURE_COMPLETE); + wrapper.eq("order_id", request.getOrderId()); + wrapper.eq("sample_id", request.getSampleId()); + wrapper.in("measure_status", statusList); + if (labExecutiveInfoMapper.selectCount(wrapper) > 0) { + existSampleList.add(request.getSampleId()); + continue; + } + //删除从实验室待检测中扫描过来的任务的情况中原有的检测节点 + wrapper.eq("measure_status", MeasureStatusEnum.TO_ALLOCATE); + this.baseMapper.delete(wrapper); + //增加检测节点 + BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); + labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.IN_MEASURE); + labExecutiveInfo.setStartTime(DateUtil.now()); + labExecutiveInfo.setOrderId(request.getOrderId()); + labExecutiveInfo.setSampleId(request.getSampleId()); + labExecutiveInfo.setMeasureDeptId(user.getDeptId()); + labExecutiveInfo.setMeasurePersonId(userId); + labExecutiveInfo.setMeasureSequence(1); + labExecutiveInfo.setIsAuto(0);//默认手动检定 + labExecutiveInfo.setRequireCertifications(request.getRequireCertifications()); + labExecutiveInfo.setCreateUser(ShiroKit.getUser().getId()); + int insertFlag = this.baseMapper.insert(labExecutiveInfo); + //更新样品状态为检测中 + int updateFlag = orderSampleRelationMapper.updateByOrderIdAndSampleId(request.getOrderId(), request.getSampleId(), SampleStatusEnum.IN_MEASURE); + if (insertFlag <= 0 || updateFlag <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + return ReturnUtil.success(); + } + + @Override @Transactional public ReturnDTO sampleExecutiveComplete(List requestList) { //查询是否在该用户的检测中有该样品,没有则返回提示信息,有则更新检测状态、更新样品状态(判断是否全部实验室检测完成) @@ -424,16 +524,16 @@ }); //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //查询扫描样品中为该用户检测中的样品列表 List preList = labExecutiveInfoMapper.selectListForSampleOperate(requestList, userId, MeasureStatusEnum.IN_MEASURE); - if(CollectionUtils.isEmpty(preList)){ + if (CollectionUtils.isEmpty(preList)) { throw new BusinessException(BusinessExceptionEnum.COMPLETE_SAMPLE_NOT_EXIST); } int updateFlag = labExecutiveInfoMapper.updateForSampleMeasureCompleteOperate(preList, userId, MeasureStatusEnum.MEASURE_COMPLETE); - if(updateFlag > 0){ + if (updateFlag > 0) { preList.forEach(pre -> { //是否全部实验室完成,所有实验室无检测完外的其他状态或空才是样品的检测完(有终止状态会把样品状态直接更新为待归还,有退回的状态会从表中删除加入到log表) QueryWrapper wrapper = new QueryWrapper<>(); @@ -444,7 +544,7 @@ StringUtils.isEmpty(lab.getMeasureStatus()) || !StringUtils.equals(MeasureStatusEnum.MEASURE_COMPLETE, lab.getMeasureStatus()) ).collect(Collectors.toList()); //全部实验室检测完成 - if(CollectionUtils.isEmpty(unExecutiveInfos)){ + if (CollectionUtils.isEmpty(unExecutiveInfos)) { //更新样品状态为检测完 orderSampleRelationMapper.updateByOrderIdAndSampleId(pre.getOrderId(), pre.getSampleId(), SampleStatusEnum.MEASURE_COMPLETE); @@ -459,14 +559,14 @@ BusinessLabExecutiveTemplateInfo templateInfo = getBusinessLabExecutiveTemplateInfo(maxNo, i, lab); labList.add(templateInfo); } - if(labExecutiveTemplateInfoService.saveBatch(labList)) log.info("实验室检测记录批量保存为实验室检测模板成功"); - }else { + if (labExecutiveTemplateInfoService.saveBatch(labList)) log.info("实验室检测记录批量保存为实验室检测模板成功"); + } else { //更新下一个审批的实验室为待分配 //注:分发员不可以调整待分配/检测中等有状态的节点(只能调整无状态的) Optional minSeqLab = labExecutiveInfos.stream().filter(dto -> StringUtils.isEmpty(dto.getMeasureStatus()) /*&& Objects.isNull(dto.getMeasurePersonId())*/ ).sorted(Comparator.comparing(BusinessLabExecutiveInfo::getMeasureStatus)).findFirst(); - if(minSeqLab.isPresent()){ + if (minSeqLab.isPresent()) { BusinessLabExecutiveInfo labExecutiveInfo = minSeqLab.get(); labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); labExecutiveInfoMapper.updateById(labExecutiveInfo); @@ -489,7 +589,7 @@ statusList.add(SampleStatusEnum.IN_MEASURE); wrapper1.in("sample_status", statusList); //同一事务中可查到更新后的数量 - if(orderSampleRelationMapper.selectCount(wrapper1) == 0){ + if (orderSampleRelationMapper.selectCount(wrapper1) == 0) { BusinessOrder businessOrder = new BusinessOrder(); businessOrder.setId(pre.getOrderId()); businessOrder.setStatus(OrderStatusEnum.COMPLETE); @@ -529,8 +629,9 @@ List addList = new ArrayList<>(); for (UpdateExecutiveListDTO executiveDTO : executiveList) { //待分配状态分发员可更新检定员 - if(StringUtils.isNotEmpty(executiveDTO.getMeasureStatus()) && !MeasureStatusEnum.TO_ALLOCATE.equals(executiveDTO.getMeasureStatus())) continue; - if(Objects.isNull(executiveDTO.getId())){ + if (StringUtils.isNotEmpty(executiveDTO.getMeasureStatus()) && !MeasureStatusEnum.TO_ALLOCATE.equals(executiveDTO.getMeasureStatus())) + continue; + if (Objects.isNull(executiveDTO.getId())) { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); labExecutiveInfo.setId(executiveDTO.getId()); labExecutiveInfo.setOrderId(request.getOrderId()); @@ -540,7 +641,7 @@ labExecutiveInfo.setMeasureSequence(executiveDTO.getMeasureSequence()); labExecutiveInfo.setRequireCertifications(executiveDTO.getRequireCertifications()); addList.add(labExecutiveInfo); - }else{ + } else { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); labExecutiveInfo.setId(executiveDTO.getId()); labExecutiveInfo.setMeasureDeptId(executiveDTO.getMeasureSegmentId()); @@ -562,16 +663,16 @@ throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); }); MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); - if(request.getMeasurePersonId() != userId){ + if (request.getMeasurePersonId() != userId) { throw new BusinessException(BusinessExceptionEnum.CANNOT_CHANGE_MEASURE_INFO); } BusinessLabExecutiveInfo executiveInfo = new BusinessLabExecutiveInfo(); executiveInfo.setId(request.getId()); executiveInfo.setRequireCertifications(request.getRequireCertifications()); - if(labExecutiveInfoMapper.updateById(executiveInfo) > 0){ + if (labExecutiveInfoMapper.updateById(executiveInfo) > 0) { return ReturnUtil.success(); } log.info("更新实验室应出具证书信息失败,主键id:{}", request.getId()); @@ -579,10 +680,10 @@ } @Override - public ExecutiveDetailResponse executiveDetail(ExecutiveDetailRequest request) throws Exception{ + public ExecutiveDetailResponse executiveDetail(ExecutiveDetailRequest request) throws Exception { //根据样品id和委托书id查询样品、委托书、委托方 SampleHandOutDetailResponse sampleDetail = orderSampleRelationMapper.selectSampleDetail(request.getOrderId(), request.getSampleId()); - if(Objects.isNull(sampleDetail)){ + if (Objects.isNull(sampleDetail)) { throw new BusinessException(BusinessExceptionEnum.NON_EXIST_ORDER_OR_SAMPLE); } ExecutiveDetailResponse detailResponse = ConvertUtils.sourceToTarget(sampleDetail, ExecutiveDetailResponse.class); @@ -602,7 +703,7 @@ throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); }); MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //删除实验室检测列表中退回数据 @@ -610,14 +711,14 @@ //退回操作记录表中增加数据 BusinessLabExecutiveOperateLog operateLog = getBusinessLabExecutiveOperateLog(request, user, userId); int insertFlag = labExecutiveOperateLogMapper.insert(operateLog); - if(deleteFlag > 0 && insertFlag > 0){ + if (deleteFlag > 0 && insertFlag > 0) { //退回后会将下一个要执行的实验室检测状态更新为待分配,将后面的实验室顺序变更为连续(都进行减1) //更新所有状态为空的实验室检测的序号为当前减1 int seqUpdateFlag = labExecutiveInfoMapper.updateForSendBack(request.getOrderId(), request.getSampleId()); //更新所有状态为空的实验室检测中序号最小的记录的状态为待分配 Long id = labExecutiveInfoMapper.selectMinSeq(request.getOrderId(), request.getSampleId()); //仅分发了一个实验室检测或无实验室可分配的情况 - if(seqUpdateFlag <= 0 && Objects.isNull(id)){ + if (seqUpdateFlag <= 0 && Objects.isNull(id)) { //将样品状态变为待分发 orderSampleRelationMapper.updateByOrderIdAndSampleId(request.getOrderId(), request.getSampleId(), SampleStatusEnum.TO_HANDOUT); return ReturnUtil.success(); @@ -626,7 +727,7 @@ info.setId(id); info.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); int statusUpdateFlag = labExecutiveInfoMapper.updateById(info); - if(seqUpdateFlag > 0 && statusUpdateFlag > 0) return ReturnUtil.success(); + if (seqUpdateFlag > 0 && statusUpdateFlag > 0) return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -638,7 +739,7 @@ labExecutiveInfo.setMeasurePersonId(sampleAllocateRequest.getMeasurePersonId()); labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_MEASURE); labExecutiveInfo.setRequireCertifications(sampleAllocateRequest.getRequireCertifications()); - if(labExecutiveInfoMapper.updateById(labExecutiveInfo) > 0){ + if (labExecutiveInfoMapper.updateById(labExecutiveInfo) > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 12f85bc..cf47c98 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -127,6 +127,7 @@ /** * 实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完) + * 新增在检测中的原始记录和证书打印的集成状态 */ @ApiOperation("实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完)") @PostMapping("/myExecutive/list") @@ -160,7 +161,7 @@ if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); + return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); } /** @@ -176,6 +177,11 @@ return labExecutiveInfoService.sampleReceive(requestList); } + @ApiOperation("实验室检测-扫描增加任务到检测中(任务分发管理中待分发->检测中 / 实验室任务待检测->检测中)") + @PostMapping("/myExecutive/add") + public ReturnDTO sampleAdd(@RequestBody @Valid List requestList) { + return labExecutiveInfoService.sampleAdd(requestList); + } /** * 实验室检测-负责人/检定人扫描检完(检测中->检测完) */ diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java new file mode 100644 index 0000000..6eb10f7 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums.business; + +/** + * 检定文件状态 + */ +public interface MeasureFileStatusEnum { + + Integer NOT_EXIST_FILE = 1; //表示原始记录未填写 + Integer ORIGINAL_RECORD = 2; //表示原始记录填写,证书未填写 + Integer CERTIFICATE = 3; //表示证书填写,未生成证书,进入审批流 + Integer CERTIFICATE_PASS = 4; //表示证书填写,审批通过 + Integer CERTIFICATE_REJECT = 5; //表示证书填写,被驳回 + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index eee4b35..8a0468e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -120,6 +120,10 @@ private String labelBind; @JSONField(serialize = false) private String orderCode; + + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") + private Integer sampleFileStatus; + public String getOrderCode() { return orderNo; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java index 00f5e89..67c4320 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java @@ -21,4 +21,8 @@ @NotNull(message = "样品id不能为空") @ApiModelProperty(value = "样品id", dataType = "Long") private Long sampleId; + + + @ApiModelProperty(value = "应出具证书数量(扫描添加到检测中接口传)", dataType = "Integer") + private Integer requireCertifications = 1; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index 44cfd33..596c934 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,10 +13,12 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.enums.business.HandOutPropertyEnum; +import com.casic.missiles.enums.business.MeasureFileStatusEnum; import com.casic.missiles.enums.business.MeasureStatusEnum; import com.casic.missiles.enums.business.OrderStatusEnum; import com.casic.missiles.enums.meter.MeterDictEnum; @@ -42,6 +44,7 @@ import org.springframework.util.CollectionUtils; import java.util.*; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -54,7 +57,7 @@ */ @Slf4j @Service -public class BusinessLabExecutiveInfoServiceImpl extends ServiceImpl implements IBusinessLabExecutiveInfoService { +public class BusinessLabExecutiveInfoServiceImpl extends ServiceImpl implements IBusinessLabExecutiveInfoService, MeasureFileStatusEnum { @Autowired private BusinessLabExecutiveInfoMapper labExecutiveInfoMapper; @Autowired @@ -76,13 +79,16 @@ @Autowired private BusinessOrderMapper orderMapper; + @Autowired + private BusinessOriginalRecordMapper originalRecordMapper; + @Override - public Page handOutListPage(Page page, SampleHandOutListRequest handOutListRequest) throws Exception{ + public Page handOutListPage(Page page, SampleHandOutListRequest handOutListRequest) throws Exception { //查询委托书和样品关联表中的各状态的样品 Page handOutList = orderSampleRelationMapper.selectSampleListByStatus(page, handOutListRequest); log.info("任务分发-当前查询样品状态为:{}", handOutListRequest.getSampleStatus()); List records = handOutList.getRecords(); - if(CollectionUtils.isEmpty(records)){ + if (CollectionUtils.isEmpty(records)) { return new Page<>(); } records.parallelStream().forEach(handOut -> { @@ -167,10 +173,10 @@ } @Override - public SampleHandOutDetailResponse handOutListDetail(SampleHandOutDetailRequest request) throws Exception{ + public SampleHandOutDetailResponse handOutListDetail(SampleHandOutDetailRequest request) throws Exception { //根据样品id和委托书id查询样品、委托书、委托方 SampleHandOutDetailResponse sampleDetail = orderSampleRelationMapper.selectSampleDetail(request.getOrderId(), request.getSampleId()); - if(Objects.isNull(sampleDetail)){ + if (Objects.isNull(sampleDetail)) { throw new BusinessException(BusinessExceptionEnum.NON_EXIST_ORDER_OR_SAMPLE); } //根据样品id和委托书id查询检定流程、退回信息 @@ -190,11 +196,11 @@ //是否存在样品的实验室检定信息标准模板 //后续可采用该方式和模板分类方式实现自动分发 List initListResponses = labExecutiveTemplateInfoMapper.selectExecutiveList(handOutInitListRequest); - if(!CollectionUtils.isEmpty(initListResponses)){ + if (!CollectionUtils.isEmpty(initListResponses)) { return initListResponses; } - if(StringUtils.isEmpty(handOutInitListRequest.getMeasureContent())){ + if (StringUtils.isEmpty(handOutInitListRequest.getMeasureContent())) { return new ArrayList<>(); } //根据样品的检定项目去关键字匹配实验室能力信息 @@ -223,7 +229,7 @@ List labExecutiveInfos = new ArrayList<>(); for (int i = 0; i < sortedList.size(); i++) { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); - if(0 == i){ + if (0 == i) { //将第一个置为待分配(负责人可查看) labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); } @@ -240,14 +246,14 @@ } //更新样品状态为检测中 int updateFlag = orderSampleRelationMapper.updateByOrderIdAndSampleId(orderId, sampleId, SampleStatusEnum.IN_MEASURE); - if(this.saveBatch(labExecutiveInfos) && updateFlag > 0){ + if (this.saveBatch(labExecutiveInfos) && updateFlag > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override - public Page deptLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception{ + public Page deptLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception { //本级部门主管可见本部门的检测 //根据用户id查询,用户角色中TIPS为director即为主管,取用户的部门id AuthUser user = ShiroKit.getUser(); @@ -256,7 +262,7 @@ }); Map resultMap = selectDirectDept(user); - if(CollectionUtils.isEmpty(resultMap) || Objects.isNull(resultMap.get("deptId"))){ + if (CollectionUtils.isEmpty(resultMap) || Objects.isNull(resultMap.get("deptId"))) { return new Page<>(); } Long deptId = (Long) resultMap.get("deptId"); @@ -281,12 +287,12 @@ List statusList = new ArrayList<>(); statusList.add(MeasureStatusEnum.TO_MEASURE); statusList.add(MeasureStatusEnum.IN_MEASURE); - resultPage = labExecutiveInfoMapper.selectListByDeptIdAndStatus(page, labExecutiveListRequest, deptId,null, statusList); + resultPage = labExecutiveInfoMapper.selectListByDeptIdAndStatus(page, labExecutiveListRequest, deptId, null, statusList); resultPage.getRecords().parallelStream().forEach(lab -> { lab.setCurrentSegmentId(deptId); lab.setCurrentSegment(deptName); //查询证书报告表 - if(MeasureStatusEnum.IN_MEASURE.equals(lab.getMeasureStatus())){ + if (MeasureStatusEnum.IN_MEASURE.equals(lab.getMeasureStatus())) { Integer alreadyCertificateNum = getAlreadyCertificateNum(lab.getOrderId(), lab.getSampleId(), deptId); lab.setAlreadyCertifications(alreadyCertificateNum); } @@ -300,7 +306,7 @@ enrichLabExecutiveRecords(resultPage); break; } - if(!CollectionUtils.isEmpty(resultPage.getRecords())){ + if (!CollectionUtils.isEmpty(resultPage.getRecords())) { for (SampleLabExecutiveListResponse record : resultPage.getRecords()) { DictCodeUtils.convertDictCodeToName(record); } @@ -309,7 +315,7 @@ } @Override - public Page myLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception{ + public Page myLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception { AuthUser user = ShiroKit.getUser(); Assert.isFalse(Objects.isNull(user), () -> { throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); @@ -317,7 +323,7 @@ //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); // if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); - if(Objects.isNull(meterStaff)) return new Page<>(); + if (Objects.isNull(meterStaff)) return new Page<>(); Long userId = meterStaff.getId(); String measureStatus = labExecutiveListRequest.getMeasureStatus(); @@ -336,13 +342,24 @@ //检测中,查询本人检测中 //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: + List originalRecords = originalRecordMapper.selectList(null); + + Map originalRecordMap = originalRecords.stream() + .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId() + e.getOrderId()), e -> e.getMeasureCategory())); + //需要审批状态, + List certificateReportList = certificateReportMapper.selectList(null); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId() + e.getOrderId()), e -> e)); + resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); + //获取所有的原始记录和证书 resultPage.getRecords().forEach(lab -> { lab.setCurrentSegmentId(lab.getMeasureDeptId()); lab.setCurrentSegment(lab.getMeasureDeptName()); //本实验室在一个流程中若有多次检测,这里的证书信息是多次的总和,已出具的是当前本人的(后续根据需求定义调整) Integer alreadyCertificateNum = getAlreadyCertificateNum(lab.getOrderId(), lab.getSampleId(), lab.getMeasureDeptId()); lab.setAlreadyCertifications(alreadyCertificateNum); + sampleFIleStatus(originalRecordMap, certificateReportMap, lab); }); break; @@ -351,9 +368,10 @@ resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.MEASURE_COMPLETE); //查询样品检定到的其他实验室或样品检测完成 enrichLabExecutiveRecords(resultPage); + break; } - if(!CollectionUtils.isEmpty(resultPage.getRecords())){ + if (!CollectionUtils.isEmpty(resultPage.getRecords())) { for (SampleLabExecutiveListResponse record : resultPage.getRecords()) { DictCodeUtils.convertDictCodeToName(record); } @@ -361,13 +379,46 @@ return resultPage; } + /** + * 判断文件的状态 + */ + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + //判断不含原始记录的情况 + if (!originalRecordMap.containsKey(key)) { + lab.setSampleFileStatus(NOT_EXIST_FILE); + return; + } + //判断不含有证书的情况 + if (!certificateReportMap.containsKey(key)) { + lab.setSampleFileStatus(ORIGINAL_RECORD); + return; + } + //判断没有通过或者驳回的证书报告 + BusinessCertificateReport certificateReport = certificateReportMap.get(key); + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + lab.setSampleFileStatus(CERTIFICATE); + return; + } + //判断通过的状态 + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + lab.setSampleFileStatus(CERTIFICATE_PASS); + return; + } + //判断驳回的状态 + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + lab.setSampleFileStatus(CERTIFICATE_REJECT); + } + return; + } + @Override public List myExecutiveAmount() { //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id AuthUser user = ShiroKit.getUser(); MeterStaff meterStaff = getMeterStaffInfo(user); // if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); - if(Objects.isNull(meterStaff)) return new ArrayList<>(); + if (Objects.isNull(meterStaff)) return new ArrayList<>(); Long userId = meterStaff.getId(); Page page = getSampleLabExecutiveListResponsePage(); Page page1 = getSampleLabExecutiveListResponsePage(); @@ -399,22 +450,71 @@ }); //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //查询扫描样品中为该用户待检测中的样品列表 List preList = labExecutiveInfoMapper.selectListForSampleOperate(requestList, userId, MeasureStatusEnum.TO_MEASURE); - if(CollectionUtils.isEmpty(preList)){ + if (CollectionUtils.isEmpty(preList)) { throw new BusinessException(BusinessExceptionEnum.RECEIVE_SAMPLE_NOT_EXIST); } int updateFlag = labExecutiveInfoMapper.updateForSampleInMeasureOperate(preList, userId, MeasureStatusEnum.IN_MEASURE); - if(updateFlag > 0){ + if (updateFlag > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.RECEIVE_SAMPLE_NOT_EXIST); } @Override + public ReturnDTO sampleAdd(List requestList) { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id + MeterStaff meterStaff = getMeterStaffInfo(user); + if (Objects.isNull(meterStaff)) { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + } + Long userId = meterStaff.getId(); + List existSampleList = new ArrayList<>(); + for (SampleOperateRequest request : requestList) { + //检查样品是否已在检测流程中,提示 + QueryWrapper wrapper = new QueryWrapper<>(); + List statusList = Arrays.asList(MeasureStatusEnum.TO_MEASURE, MeasureStatusEnum.IN_MEASURE, MeasureStatusEnum.MEASURE_COMPLETE); + wrapper.eq("order_id", request.getOrderId()); + wrapper.eq("sample_id", request.getSampleId()); + wrapper.in("measure_status", statusList); + if (labExecutiveInfoMapper.selectCount(wrapper) > 0) { + existSampleList.add(request.getSampleId()); + continue; + } + //删除从实验室待检测中扫描过来的任务的情况中原有的检测节点 + wrapper.eq("measure_status", MeasureStatusEnum.TO_ALLOCATE); + this.baseMapper.delete(wrapper); + //增加检测节点 + BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); + labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.IN_MEASURE); + labExecutiveInfo.setStartTime(DateUtil.now()); + labExecutiveInfo.setOrderId(request.getOrderId()); + labExecutiveInfo.setSampleId(request.getSampleId()); + labExecutiveInfo.setMeasureDeptId(user.getDeptId()); + labExecutiveInfo.setMeasurePersonId(userId); + labExecutiveInfo.setMeasureSequence(1); + labExecutiveInfo.setIsAuto(0);//默认手动检定 + labExecutiveInfo.setRequireCertifications(request.getRequireCertifications()); + labExecutiveInfo.setCreateUser(ShiroKit.getUser().getId()); + int insertFlag = this.baseMapper.insert(labExecutiveInfo); + //更新样品状态为检测中 + int updateFlag = orderSampleRelationMapper.updateByOrderIdAndSampleId(request.getOrderId(), request.getSampleId(), SampleStatusEnum.IN_MEASURE); + if (insertFlag <= 0 || updateFlag <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + return ReturnUtil.success(); + } + + @Override @Transactional public ReturnDTO sampleExecutiveComplete(List requestList) { //查询是否在该用户的检测中有该样品,没有则返回提示信息,有则更新检测状态、更新样品状态(判断是否全部实验室检测完成) @@ -424,16 +524,16 @@ }); //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //查询扫描样品中为该用户检测中的样品列表 List preList = labExecutiveInfoMapper.selectListForSampleOperate(requestList, userId, MeasureStatusEnum.IN_MEASURE); - if(CollectionUtils.isEmpty(preList)){ + if (CollectionUtils.isEmpty(preList)) { throw new BusinessException(BusinessExceptionEnum.COMPLETE_SAMPLE_NOT_EXIST); } int updateFlag = labExecutiveInfoMapper.updateForSampleMeasureCompleteOperate(preList, userId, MeasureStatusEnum.MEASURE_COMPLETE); - if(updateFlag > 0){ + if (updateFlag > 0) { preList.forEach(pre -> { //是否全部实验室完成,所有实验室无检测完外的其他状态或空才是样品的检测完(有终止状态会把样品状态直接更新为待归还,有退回的状态会从表中删除加入到log表) QueryWrapper wrapper = new QueryWrapper<>(); @@ -444,7 +544,7 @@ StringUtils.isEmpty(lab.getMeasureStatus()) || !StringUtils.equals(MeasureStatusEnum.MEASURE_COMPLETE, lab.getMeasureStatus()) ).collect(Collectors.toList()); //全部实验室检测完成 - if(CollectionUtils.isEmpty(unExecutiveInfos)){ + if (CollectionUtils.isEmpty(unExecutiveInfos)) { //更新样品状态为检测完 orderSampleRelationMapper.updateByOrderIdAndSampleId(pre.getOrderId(), pre.getSampleId(), SampleStatusEnum.MEASURE_COMPLETE); @@ -459,14 +559,14 @@ BusinessLabExecutiveTemplateInfo templateInfo = getBusinessLabExecutiveTemplateInfo(maxNo, i, lab); labList.add(templateInfo); } - if(labExecutiveTemplateInfoService.saveBatch(labList)) log.info("实验室检测记录批量保存为实验室检测模板成功"); - }else { + if (labExecutiveTemplateInfoService.saveBatch(labList)) log.info("实验室检测记录批量保存为实验室检测模板成功"); + } else { //更新下一个审批的实验室为待分配 //注:分发员不可以调整待分配/检测中等有状态的节点(只能调整无状态的) Optional minSeqLab = labExecutiveInfos.stream().filter(dto -> StringUtils.isEmpty(dto.getMeasureStatus()) /*&& Objects.isNull(dto.getMeasurePersonId())*/ ).sorted(Comparator.comparing(BusinessLabExecutiveInfo::getMeasureStatus)).findFirst(); - if(minSeqLab.isPresent()){ + if (minSeqLab.isPresent()) { BusinessLabExecutiveInfo labExecutiveInfo = minSeqLab.get(); labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); labExecutiveInfoMapper.updateById(labExecutiveInfo); @@ -489,7 +589,7 @@ statusList.add(SampleStatusEnum.IN_MEASURE); wrapper1.in("sample_status", statusList); //同一事务中可查到更新后的数量 - if(orderSampleRelationMapper.selectCount(wrapper1) == 0){ + if (orderSampleRelationMapper.selectCount(wrapper1) == 0) { BusinessOrder businessOrder = new BusinessOrder(); businessOrder.setId(pre.getOrderId()); businessOrder.setStatus(OrderStatusEnum.COMPLETE); @@ -529,8 +629,9 @@ List addList = new ArrayList<>(); for (UpdateExecutiveListDTO executiveDTO : executiveList) { //待分配状态分发员可更新检定员 - if(StringUtils.isNotEmpty(executiveDTO.getMeasureStatus()) && !MeasureStatusEnum.TO_ALLOCATE.equals(executiveDTO.getMeasureStatus())) continue; - if(Objects.isNull(executiveDTO.getId())){ + if (StringUtils.isNotEmpty(executiveDTO.getMeasureStatus()) && !MeasureStatusEnum.TO_ALLOCATE.equals(executiveDTO.getMeasureStatus())) + continue; + if (Objects.isNull(executiveDTO.getId())) { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); labExecutiveInfo.setId(executiveDTO.getId()); labExecutiveInfo.setOrderId(request.getOrderId()); @@ -540,7 +641,7 @@ labExecutiveInfo.setMeasureSequence(executiveDTO.getMeasureSequence()); labExecutiveInfo.setRequireCertifications(executiveDTO.getRequireCertifications()); addList.add(labExecutiveInfo); - }else{ + } else { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); labExecutiveInfo.setId(executiveDTO.getId()); labExecutiveInfo.setMeasureDeptId(executiveDTO.getMeasureSegmentId()); @@ -562,16 +663,16 @@ throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); }); MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); - if(request.getMeasurePersonId() != userId){ + if (request.getMeasurePersonId() != userId) { throw new BusinessException(BusinessExceptionEnum.CANNOT_CHANGE_MEASURE_INFO); } BusinessLabExecutiveInfo executiveInfo = new BusinessLabExecutiveInfo(); executiveInfo.setId(request.getId()); executiveInfo.setRequireCertifications(request.getRequireCertifications()); - if(labExecutiveInfoMapper.updateById(executiveInfo) > 0){ + if (labExecutiveInfoMapper.updateById(executiveInfo) > 0) { return ReturnUtil.success(); } log.info("更新实验室应出具证书信息失败,主键id:{}", request.getId()); @@ -579,10 +680,10 @@ } @Override - public ExecutiveDetailResponse executiveDetail(ExecutiveDetailRequest request) throws Exception{ + public ExecutiveDetailResponse executiveDetail(ExecutiveDetailRequest request) throws Exception { //根据样品id和委托书id查询样品、委托书、委托方 SampleHandOutDetailResponse sampleDetail = orderSampleRelationMapper.selectSampleDetail(request.getOrderId(), request.getSampleId()); - if(Objects.isNull(sampleDetail)){ + if (Objects.isNull(sampleDetail)) { throw new BusinessException(BusinessExceptionEnum.NON_EXIST_ORDER_OR_SAMPLE); } ExecutiveDetailResponse detailResponse = ConvertUtils.sourceToTarget(sampleDetail, ExecutiveDetailResponse.class); @@ -602,7 +703,7 @@ throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); }); MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //删除实验室检测列表中退回数据 @@ -610,14 +711,14 @@ //退回操作记录表中增加数据 BusinessLabExecutiveOperateLog operateLog = getBusinessLabExecutiveOperateLog(request, user, userId); int insertFlag = labExecutiveOperateLogMapper.insert(operateLog); - if(deleteFlag > 0 && insertFlag > 0){ + if (deleteFlag > 0 && insertFlag > 0) { //退回后会将下一个要执行的实验室检测状态更新为待分配,将后面的实验室顺序变更为连续(都进行减1) //更新所有状态为空的实验室检测的序号为当前减1 int seqUpdateFlag = labExecutiveInfoMapper.updateForSendBack(request.getOrderId(), request.getSampleId()); //更新所有状态为空的实验室检测中序号最小的记录的状态为待分配 Long id = labExecutiveInfoMapper.selectMinSeq(request.getOrderId(), request.getSampleId()); //仅分发了一个实验室检测或无实验室可分配的情况 - if(seqUpdateFlag <= 0 && Objects.isNull(id)){ + if (seqUpdateFlag <= 0 && Objects.isNull(id)) { //将样品状态变为待分发 orderSampleRelationMapper.updateByOrderIdAndSampleId(request.getOrderId(), request.getSampleId(), SampleStatusEnum.TO_HANDOUT); return ReturnUtil.success(); @@ -626,7 +727,7 @@ info.setId(id); info.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); int statusUpdateFlag = labExecutiveInfoMapper.updateById(info); - if(seqUpdateFlag > 0 && statusUpdateFlag > 0) return ReturnUtil.success(); + if (seqUpdateFlag > 0 && statusUpdateFlag > 0) return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -638,7 +739,7 @@ labExecutiveInfo.setMeasurePersonId(sampleAllocateRequest.getMeasurePersonId()); labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_MEASURE); labExecutiveInfo.setRequireCertifications(sampleAllocateRequest.getRequireCertifications()); - if(labExecutiveInfoMapper.updateById(labExecutiveInfo) > 0){ + if (labExecutiveInfoMapper.updateById(labExecutiveInfo) > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java index e98da87..1cb6bb4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java @@ -36,6 +36,8 @@ ReturnDTO sampleReceive(List requestList); + ReturnDTO sampleAdd(List requestList); + ReturnDTO sampleExecutiveComplete(List requestList); ReturnDTO updateExecutiveList(UpdateExecutiveListRequest requestList); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 12f85bc..cf47c98 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -127,6 +127,7 @@ /** * 实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完) + * 新增在检测中的原始记录和证书打印的集成状态 */ @ApiOperation("实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完)") @PostMapping("/myExecutive/list") @@ -160,7 +161,7 @@ if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); + return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); } /** @@ -176,6 +177,11 @@ return labExecutiveInfoService.sampleReceive(requestList); } + @ApiOperation("实验室检测-扫描增加任务到检测中(任务分发管理中待分发->检测中 / 实验室任务待检测->检测中)") + @PostMapping("/myExecutive/add") + public ReturnDTO sampleAdd(@RequestBody @Valid List requestList) { + return labExecutiveInfoService.sampleAdd(requestList); + } /** * 实验室检测-负责人/检定人扫描检完(检测中->检测完) */ diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java new file mode 100644 index 0000000..6eb10f7 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums.business; + +/** + * 检定文件状态 + */ +public interface MeasureFileStatusEnum { + + Integer NOT_EXIST_FILE = 1; //表示原始记录未填写 + Integer ORIGINAL_RECORD = 2; //表示原始记录填写,证书未填写 + Integer CERTIFICATE = 3; //表示证书填写,未生成证书,进入审批流 + Integer CERTIFICATE_PASS = 4; //表示证书填写,审批通过 + Integer CERTIFICATE_REJECT = 5; //表示证书填写,被驳回 + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index eee4b35..8a0468e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -120,6 +120,10 @@ private String labelBind; @JSONField(serialize = false) private String orderCode; + + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") + private Integer sampleFileStatus; + public String getOrderCode() { return orderNo; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java index 00f5e89..67c4320 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java @@ -21,4 +21,8 @@ @NotNull(message = "样品id不能为空") @ApiModelProperty(value = "样品id", dataType = "Long") private Long sampleId; + + + @ApiModelProperty(value = "应出具证书数量(扫描添加到检测中接口传)", dataType = "Integer") + private Integer requireCertifications = 1; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index 44cfd33..596c934 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,10 +13,12 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.enums.business.HandOutPropertyEnum; +import com.casic.missiles.enums.business.MeasureFileStatusEnum; import com.casic.missiles.enums.business.MeasureStatusEnum; import com.casic.missiles.enums.business.OrderStatusEnum; import com.casic.missiles.enums.meter.MeterDictEnum; @@ -42,6 +44,7 @@ import org.springframework.util.CollectionUtils; import java.util.*; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -54,7 +57,7 @@ */ @Slf4j @Service -public class BusinessLabExecutiveInfoServiceImpl extends ServiceImpl implements IBusinessLabExecutiveInfoService { +public class BusinessLabExecutiveInfoServiceImpl extends ServiceImpl implements IBusinessLabExecutiveInfoService, MeasureFileStatusEnum { @Autowired private BusinessLabExecutiveInfoMapper labExecutiveInfoMapper; @Autowired @@ -76,13 +79,16 @@ @Autowired private BusinessOrderMapper orderMapper; + @Autowired + private BusinessOriginalRecordMapper originalRecordMapper; + @Override - public Page handOutListPage(Page page, SampleHandOutListRequest handOutListRequest) throws Exception{ + public Page handOutListPage(Page page, SampleHandOutListRequest handOutListRequest) throws Exception { //查询委托书和样品关联表中的各状态的样品 Page handOutList = orderSampleRelationMapper.selectSampleListByStatus(page, handOutListRequest); log.info("任务分发-当前查询样品状态为:{}", handOutListRequest.getSampleStatus()); List records = handOutList.getRecords(); - if(CollectionUtils.isEmpty(records)){ + if (CollectionUtils.isEmpty(records)) { return new Page<>(); } records.parallelStream().forEach(handOut -> { @@ -167,10 +173,10 @@ } @Override - public SampleHandOutDetailResponse handOutListDetail(SampleHandOutDetailRequest request) throws Exception{ + public SampleHandOutDetailResponse handOutListDetail(SampleHandOutDetailRequest request) throws Exception { //根据样品id和委托书id查询样品、委托书、委托方 SampleHandOutDetailResponse sampleDetail = orderSampleRelationMapper.selectSampleDetail(request.getOrderId(), request.getSampleId()); - if(Objects.isNull(sampleDetail)){ + if (Objects.isNull(sampleDetail)) { throw new BusinessException(BusinessExceptionEnum.NON_EXIST_ORDER_OR_SAMPLE); } //根据样品id和委托书id查询检定流程、退回信息 @@ -190,11 +196,11 @@ //是否存在样品的实验室检定信息标准模板 //后续可采用该方式和模板分类方式实现自动分发 List initListResponses = labExecutiveTemplateInfoMapper.selectExecutiveList(handOutInitListRequest); - if(!CollectionUtils.isEmpty(initListResponses)){ + if (!CollectionUtils.isEmpty(initListResponses)) { return initListResponses; } - if(StringUtils.isEmpty(handOutInitListRequest.getMeasureContent())){ + if (StringUtils.isEmpty(handOutInitListRequest.getMeasureContent())) { return new ArrayList<>(); } //根据样品的检定项目去关键字匹配实验室能力信息 @@ -223,7 +229,7 @@ List labExecutiveInfos = new ArrayList<>(); for (int i = 0; i < sortedList.size(); i++) { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); - if(0 == i){ + if (0 == i) { //将第一个置为待分配(负责人可查看) labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); } @@ -240,14 +246,14 @@ } //更新样品状态为检测中 int updateFlag = orderSampleRelationMapper.updateByOrderIdAndSampleId(orderId, sampleId, SampleStatusEnum.IN_MEASURE); - if(this.saveBatch(labExecutiveInfos) && updateFlag > 0){ + if (this.saveBatch(labExecutiveInfos) && updateFlag > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override - public Page deptLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception{ + public Page deptLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception { //本级部门主管可见本部门的检测 //根据用户id查询,用户角色中TIPS为director即为主管,取用户的部门id AuthUser user = ShiroKit.getUser(); @@ -256,7 +262,7 @@ }); Map resultMap = selectDirectDept(user); - if(CollectionUtils.isEmpty(resultMap) || Objects.isNull(resultMap.get("deptId"))){ + if (CollectionUtils.isEmpty(resultMap) || Objects.isNull(resultMap.get("deptId"))) { return new Page<>(); } Long deptId = (Long) resultMap.get("deptId"); @@ -281,12 +287,12 @@ List statusList = new ArrayList<>(); statusList.add(MeasureStatusEnum.TO_MEASURE); statusList.add(MeasureStatusEnum.IN_MEASURE); - resultPage = labExecutiveInfoMapper.selectListByDeptIdAndStatus(page, labExecutiveListRequest, deptId,null, statusList); + resultPage = labExecutiveInfoMapper.selectListByDeptIdAndStatus(page, labExecutiveListRequest, deptId, null, statusList); resultPage.getRecords().parallelStream().forEach(lab -> { lab.setCurrentSegmentId(deptId); lab.setCurrentSegment(deptName); //查询证书报告表 - if(MeasureStatusEnum.IN_MEASURE.equals(lab.getMeasureStatus())){ + if (MeasureStatusEnum.IN_MEASURE.equals(lab.getMeasureStatus())) { Integer alreadyCertificateNum = getAlreadyCertificateNum(lab.getOrderId(), lab.getSampleId(), deptId); lab.setAlreadyCertifications(alreadyCertificateNum); } @@ -300,7 +306,7 @@ enrichLabExecutiveRecords(resultPage); break; } - if(!CollectionUtils.isEmpty(resultPage.getRecords())){ + if (!CollectionUtils.isEmpty(resultPage.getRecords())) { for (SampleLabExecutiveListResponse record : resultPage.getRecords()) { DictCodeUtils.convertDictCodeToName(record); } @@ -309,7 +315,7 @@ } @Override - public Page myLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception{ + public Page myLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception { AuthUser user = ShiroKit.getUser(); Assert.isFalse(Objects.isNull(user), () -> { throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); @@ -317,7 +323,7 @@ //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); // if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); - if(Objects.isNull(meterStaff)) return new Page<>(); + if (Objects.isNull(meterStaff)) return new Page<>(); Long userId = meterStaff.getId(); String measureStatus = labExecutiveListRequest.getMeasureStatus(); @@ -336,13 +342,24 @@ //检测中,查询本人检测中 //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: + List originalRecords = originalRecordMapper.selectList(null); + + Map originalRecordMap = originalRecords.stream() + .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId() + e.getOrderId()), e -> e.getMeasureCategory())); + //需要审批状态, + List certificateReportList = certificateReportMapper.selectList(null); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId() + e.getOrderId()), e -> e)); + resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); + //获取所有的原始记录和证书 resultPage.getRecords().forEach(lab -> { lab.setCurrentSegmentId(lab.getMeasureDeptId()); lab.setCurrentSegment(lab.getMeasureDeptName()); //本实验室在一个流程中若有多次检测,这里的证书信息是多次的总和,已出具的是当前本人的(后续根据需求定义调整) Integer alreadyCertificateNum = getAlreadyCertificateNum(lab.getOrderId(), lab.getSampleId(), lab.getMeasureDeptId()); lab.setAlreadyCertifications(alreadyCertificateNum); + sampleFIleStatus(originalRecordMap, certificateReportMap, lab); }); break; @@ -351,9 +368,10 @@ resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.MEASURE_COMPLETE); //查询样品检定到的其他实验室或样品检测完成 enrichLabExecutiveRecords(resultPage); + break; } - if(!CollectionUtils.isEmpty(resultPage.getRecords())){ + if (!CollectionUtils.isEmpty(resultPage.getRecords())) { for (SampleLabExecutiveListResponse record : resultPage.getRecords()) { DictCodeUtils.convertDictCodeToName(record); } @@ -361,13 +379,46 @@ return resultPage; } + /** + * 判断文件的状态 + */ + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + //判断不含原始记录的情况 + if (!originalRecordMap.containsKey(key)) { + lab.setSampleFileStatus(NOT_EXIST_FILE); + return; + } + //判断不含有证书的情况 + if (!certificateReportMap.containsKey(key)) { + lab.setSampleFileStatus(ORIGINAL_RECORD); + return; + } + //判断没有通过或者驳回的证书报告 + BusinessCertificateReport certificateReport = certificateReportMap.get(key); + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + lab.setSampleFileStatus(CERTIFICATE); + return; + } + //判断通过的状态 + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + lab.setSampleFileStatus(CERTIFICATE_PASS); + return; + } + //判断驳回的状态 + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + lab.setSampleFileStatus(CERTIFICATE_REJECT); + } + return; + } + @Override public List myExecutiveAmount() { //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id AuthUser user = ShiroKit.getUser(); MeterStaff meterStaff = getMeterStaffInfo(user); // if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); - if(Objects.isNull(meterStaff)) return new ArrayList<>(); + if (Objects.isNull(meterStaff)) return new ArrayList<>(); Long userId = meterStaff.getId(); Page page = getSampleLabExecutiveListResponsePage(); Page page1 = getSampleLabExecutiveListResponsePage(); @@ -399,22 +450,71 @@ }); //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //查询扫描样品中为该用户待检测中的样品列表 List preList = labExecutiveInfoMapper.selectListForSampleOperate(requestList, userId, MeasureStatusEnum.TO_MEASURE); - if(CollectionUtils.isEmpty(preList)){ + if (CollectionUtils.isEmpty(preList)) { throw new BusinessException(BusinessExceptionEnum.RECEIVE_SAMPLE_NOT_EXIST); } int updateFlag = labExecutiveInfoMapper.updateForSampleInMeasureOperate(preList, userId, MeasureStatusEnum.IN_MEASURE); - if(updateFlag > 0){ + if (updateFlag > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.RECEIVE_SAMPLE_NOT_EXIST); } @Override + public ReturnDTO sampleAdd(List requestList) { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id + MeterStaff meterStaff = getMeterStaffInfo(user); + if (Objects.isNull(meterStaff)) { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + } + Long userId = meterStaff.getId(); + List existSampleList = new ArrayList<>(); + for (SampleOperateRequest request : requestList) { + //检查样品是否已在检测流程中,提示 + QueryWrapper wrapper = new QueryWrapper<>(); + List statusList = Arrays.asList(MeasureStatusEnum.TO_MEASURE, MeasureStatusEnum.IN_MEASURE, MeasureStatusEnum.MEASURE_COMPLETE); + wrapper.eq("order_id", request.getOrderId()); + wrapper.eq("sample_id", request.getSampleId()); + wrapper.in("measure_status", statusList); + if (labExecutiveInfoMapper.selectCount(wrapper) > 0) { + existSampleList.add(request.getSampleId()); + continue; + } + //删除从实验室待检测中扫描过来的任务的情况中原有的检测节点 + wrapper.eq("measure_status", MeasureStatusEnum.TO_ALLOCATE); + this.baseMapper.delete(wrapper); + //增加检测节点 + BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); + labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.IN_MEASURE); + labExecutiveInfo.setStartTime(DateUtil.now()); + labExecutiveInfo.setOrderId(request.getOrderId()); + labExecutiveInfo.setSampleId(request.getSampleId()); + labExecutiveInfo.setMeasureDeptId(user.getDeptId()); + labExecutiveInfo.setMeasurePersonId(userId); + labExecutiveInfo.setMeasureSequence(1); + labExecutiveInfo.setIsAuto(0);//默认手动检定 + labExecutiveInfo.setRequireCertifications(request.getRequireCertifications()); + labExecutiveInfo.setCreateUser(ShiroKit.getUser().getId()); + int insertFlag = this.baseMapper.insert(labExecutiveInfo); + //更新样品状态为检测中 + int updateFlag = orderSampleRelationMapper.updateByOrderIdAndSampleId(request.getOrderId(), request.getSampleId(), SampleStatusEnum.IN_MEASURE); + if (insertFlag <= 0 || updateFlag <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + return ReturnUtil.success(); + } + + @Override @Transactional public ReturnDTO sampleExecutiveComplete(List requestList) { //查询是否在该用户的检测中有该样品,没有则返回提示信息,有则更新检测状态、更新样品状态(判断是否全部实验室检测完成) @@ -424,16 +524,16 @@ }); //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //查询扫描样品中为该用户检测中的样品列表 List preList = labExecutiveInfoMapper.selectListForSampleOperate(requestList, userId, MeasureStatusEnum.IN_MEASURE); - if(CollectionUtils.isEmpty(preList)){ + if (CollectionUtils.isEmpty(preList)) { throw new BusinessException(BusinessExceptionEnum.COMPLETE_SAMPLE_NOT_EXIST); } int updateFlag = labExecutiveInfoMapper.updateForSampleMeasureCompleteOperate(preList, userId, MeasureStatusEnum.MEASURE_COMPLETE); - if(updateFlag > 0){ + if (updateFlag > 0) { preList.forEach(pre -> { //是否全部实验室完成,所有实验室无检测完外的其他状态或空才是样品的检测完(有终止状态会把样品状态直接更新为待归还,有退回的状态会从表中删除加入到log表) QueryWrapper wrapper = new QueryWrapper<>(); @@ -444,7 +544,7 @@ StringUtils.isEmpty(lab.getMeasureStatus()) || !StringUtils.equals(MeasureStatusEnum.MEASURE_COMPLETE, lab.getMeasureStatus()) ).collect(Collectors.toList()); //全部实验室检测完成 - if(CollectionUtils.isEmpty(unExecutiveInfos)){ + if (CollectionUtils.isEmpty(unExecutiveInfos)) { //更新样品状态为检测完 orderSampleRelationMapper.updateByOrderIdAndSampleId(pre.getOrderId(), pre.getSampleId(), SampleStatusEnum.MEASURE_COMPLETE); @@ -459,14 +559,14 @@ BusinessLabExecutiveTemplateInfo templateInfo = getBusinessLabExecutiveTemplateInfo(maxNo, i, lab); labList.add(templateInfo); } - if(labExecutiveTemplateInfoService.saveBatch(labList)) log.info("实验室检测记录批量保存为实验室检测模板成功"); - }else { + if (labExecutiveTemplateInfoService.saveBatch(labList)) log.info("实验室检测记录批量保存为实验室检测模板成功"); + } else { //更新下一个审批的实验室为待分配 //注:分发员不可以调整待分配/检测中等有状态的节点(只能调整无状态的) Optional minSeqLab = labExecutiveInfos.stream().filter(dto -> StringUtils.isEmpty(dto.getMeasureStatus()) /*&& Objects.isNull(dto.getMeasurePersonId())*/ ).sorted(Comparator.comparing(BusinessLabExecutiveInfo::getMeasureStatus)).findFirst(); - if(minSeqLab.isPresent()){ + if (minSeqLab.isPresent()) { BusinessLabExecutiveInfo labExecutiveInfo = minSeqLab.get(); labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); labExecutiveInfoMapper.updateById(labExecutiveInfo); @@ -489,7 +589,7 @@ statusList.add(SampleStatusEnum.IN_MEASURE); wrapper1.in("sample_status", statusList); //同一事务中可查到更新后的数量 - if(orderSampleRelationMapper.selectCount(wrapper1) == 0){ + if (orderSampleRelationMapper.selectCount(wrapper1) == 0) { BusinessOrder businessOrder = new BusinessOrder(); businessOrder.setId(pre.getOrderId()); businessOrder.setStatus(OrderStatusEnum.COMPLETE); @@ -529,8 +629,9 @@ List addList = new ArrayList<>(); for (UpdateExecutiveListDTO executiveDTO : executiveList) { //待分配状态分发员可更新检定员 - if(StringUtils.isNotEmpty(executiveDTO.getMeasureStatus()) && !MeasureStatusEnum.TO_ALLOCATE.equals(executiveDTO.getMeasureStatus())) continue; - if(Objects.isNull(executiveDTO.getId())){ + if (StringUtils.isNotEmpty(executiveDTO.getMeasureStatus()) && !MeasureStatusEnum.TO_ALLOCATE.equals(executiveDTO.getMeasureStatus())) + continue; + if (Objects.isNull(executiveDTO.getId())) { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); labExecutiveInfo.setId(executiveDTO.getId()); labExecutiveInfo.setOrderId(request.getOrderId()); @@ -540,7 +641,7 @@ labExecutiveInfo.setMeasureSequence(executiveDTO.getMeasureSequence()); labExecutiveInfo.setRequireCertifications(executiveDTO.getRequireCertifications()); addList.add(labExecutiveInfo); - }else{ + } else { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); labExecutiveInfo.setId(executiveDTO.getId()); labExecutiveInfo.setMeasureDeptId(executiveDTO.getMeasureSegmentId()); @@ -562,16 +663,16 @@ throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); }); MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); - if(request.getMeasurePersonId() != userId){ + if (request.getMeasurePersonId() != userId) { throw new BusinessException(BusinessExceptionEnum.CANNOT_CHANGE_MEASURE_INFO); } BusinessLabExecutiveInfo executiveInfo = new BusinessLabExecutiveInfo(); executiveInfo.setId(request.getId()); executiveInfo.setRequireCertifications(request.getRequireCertifications()); - if(labExecutiveInfoMapper.updateById(executiveInfo) > 0){ + if (labExecutiveInfoMapper.updateById(executiveInfo) > 0) { return ReturnUtil.success(); } log.info("更新实验室应出具证书信息失败,主键id:{}", request.getId()); @@ -579,10 +680,10 @@ } @Override - public ExecutiveDetailResponse executiveDetail(ExecutiveDetailRequest request) throws Exception{ + public ExecutiveDetailResponse executiveDetail(ExecutiveDetailRequest request) throws Exception { //根据样品id和委托书id查询样品、委托书、委托方 SampleHandOutDetailResponse sampleDetail = orderSampleRelationMapper.selectSampleDetail(request.getOrderId(), request.getSampleId()); - if(Objects.isNull(sampleDetail)){ + if (Objects.isNull(sampleDetail)) { throw new BusinessException(BusinessExceptionEnum.NON_EXIST_ORDER_OR_SAMPLE); } ExecutiveDetailResponse detailResponse = ConvertUtils.sourceToTarget(sampleDetail, ExecutiveDetailResponse.class); @@ -602,7 +703,7 @@ throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); }); MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //删除实验室检测列表中退回数据 @@ -610,14 +711,14 @@ //退回操作记录表中增加数据 BusinessLabExecutiveOperateLog operateLog = getBusinessLabExecutiveOperateLog(request, user, userId); int insertFlag = labExecutiveOperateLogMapper.insert(operateLog); - if(deleteFlag > 0 && insertFlag > 0){ + if (deleteFlag > 0 && insertFlag > 0) { //退回后会将下一个要执行的实验室检测状态更新为待分配,将后面的实验室顺序变更为连续(都进行减1) //更新所有状态为空的实验室检测的序号为当前减1 int seqUpdateFlag = labExecutiveInfoMapper.updateForSendBack(request.getOrderId(), request.getSampleId()); //更新所有状态为空的实验室检测中序号最小的记录的状态为待分配 Long id = labExecutiveInfoMapper.selectMinSeq(request.getOrderId(), request.getSampleId()); //仅分发了一个实验室检测或无实验室可分配的情况 - if(seqUpdateFlag <= 0 && Objects.isNull(id)){ + if (seqUpdateFlag <= 0 && Objects.isNull(id)) { //将样品状态变为待分发 orderSampleRelationMapper.updateByOrderIdAndSampleId(request.getOrderId(), request.getSampleId(), SampleStatusEnum.TO_HANDOUT); return ReturnUtil.success(); @@ -626,7 +727,7 @@ info.setId(id); info.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); int statusUpdateFlag = labExecutiveInfoMapper.updateById(info); - if(seqUpdateFlag > 0 && statusUpdateFlag > 0) return ReturnUtil.success(); + if (seqUpdateFlag > 0 && statusUpdateFlag > 0) return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -638,7 +739,7 @@ labExecutiveInfo.setMeasurePersonId(sampleAllocateRequest.getMeasurePersonId()); labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_MEASURE); labExecutiveInfo.setRequireCertifications(sampleAllocateRequest.getRequireCertifications()); - if(labExecutiveInfoMapper.updateById(labExecutiveInfo) > 0){ + if (labExecutiveInfoMapper.updateById(labExecutiveInfo) > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java index e98da87..1cb6bb4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java @@ -36,6 +36,8 @@ ReturnDTO sampleReceive(List requestList); + ReturnDTO sampleAdd(List requestList); + ReturnDTO sampleExecutiveComplete(List requestList); ReturnDTO updateExecutiveList(UpdateExecutiveListRequest requestList); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index 667c9e1..4fb3b33 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,20 +1,17 @@ package com.casic.missiles.service.listeners.register; -import cn.afterturn.easypoi.word.WordExportUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.CropPicture; import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.service.listeners.util.ParseWord07; +import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; -import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java index 12f85bc..cf47c98 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessLabExecutiveInfoController.java @@ -127,6 +127,7 @@ /** * 实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完) + * 新增在检测中的原始记录和证书打印的集成状态 */ @ApiOperation("实验室检测-我的检测-查询各状态列表(待检测、检测中、检测完)") @PostMapping("/myExecutive/list") @@ -160,7 +161,7 @@ if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); + return labExecutiveInfoService.allocateStaff(sampleAllocateRequest); } /** @@ -176,6 +177,11 @@ return labExecutiveInfoService.sampleReceive(requestList); } + @ApiOperation("实验室检测-扫描增加任务到检测中(任务分发管理中待分发->检测中 / 实验室任务待检测->检测中)") + @PostMapping("/myExecutive/add") + public ReturnDTO sampleAdd(@RequestBody @Valid List requestList) { + return labExecutiveInfoService.sampleAdd(requestList); + } /** * 实验室检测-负责人/检定人扫描检完(检测中->检测完) */ diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java new file mode 100644 index 0000000..6eb10f7 --- /dev/null +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/MeasureFileStatusEnum.java @@ -0,0 +1,14 @@ +package com.casic.missiles.enums.business; + +/** + * 检定文件状态 + */ +public interface MeasureFileStatusEnum { + + Integer NOT_EXIST_FILE = 1; //表示原始记录未填写 + Integer ORIGINAL_RECORD = 2; //表示原始记录填写,证书未填写 + Integer CERTIFICATE = 3; //表示证书填写,未生成证书,进入审批流 + Integer CERTIFICATE_PASS = 4; //表示证书填写,审批通过 + Integer CERTIFICATE_REJECT = 5; //表示证书填写,被驳回 + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index eee4b35..8a0468e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -120,6 +120,10 @@ private String labelBind; @JSONField(serialize = false) private String orderCode; + + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") + private Integer sampleFileStatus; + public String getOrderCode() { return orderNo; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java index 00f5e89..67c4320 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleOperateRequest.java @@ -21,4 +21,8 @@ @NotNull(message = "样品id不能为空") @ApiModelProperty(value = "样品id", dataType = "Long") private Long sampleId; + + + @ApiModelProperty(value = "应出具证书数量(扫描添加到检测中接口传)", dataType = "Integer") + private Integer requireCertifications = 1; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index 44cfd33..596c934 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,10 +13,12 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; import com.casic.missiles.enums.business.HandOutPropertyEnum; +import com.casic.missiles.enums.business.MeasureFileStatusEnum; import com.casic.missiles.enums.business.MeasureStatusEnum; import com.casic.missiles.enums.business.OrderStatusEnum; import com.casic.missiles.enums.meter.MeterDictEnum; @@ -42,6 +44,7 @@ import org.springframework.util.CollectionUtils; import java.util.*; +import java.util.stream.Collector; import java.util.stream.Collectors; /** @@ -54,7 +57,7 @@ */ @Slf4j @Service -public class BusinessLabExecutiveInfoServiceImpl extends ServiceImpl implements IBusinessLabExecutiveInfoService { +public class BusinessLabExecutiveInfoServiceImpl extends ServiceImpl implements IBusinessLabExecutiveInfoService, MeasureFileStatusEnum { @Autowired private BusinessLabExecutiveInfoMapper labExecutiveInfoMapper; @Autowired @@ -76,13 +79,16 @@ @Autowired private BusinessOrderMapper orderMapper; + @Autowired + private BusinessOriginalRecordMapper originalRecordMapper; + @Override - public Page handOutListPage(Page page, SampleHandOutListRequest handOutListRequest) throws Exception{ + public Page handOutListPage(Page page, SampleHandOutListRequest handOutListRequest) throws Exception { //查询委托书和样品关联表中的各状态的样品 Page handOutList = orderSampleRelationMapper.selectSampleListByStatus(page, handOutListRequest); log.info("任务分发-当前查询样品状态为:{}", handOutListRequest.getSampleStatus()); List records = handOutList.getRecords(); - if(CollectionUtils.isEmpty(records)){ + if (CollectionUtils.isEmpty(records)) { return new Page<>(); } records.parallelStream().forEach(handOut -> { @@ -167,10 +173,10 @@ } @Override - public SampleHandOutDetailResponse handOutListDetail(SampleHandOutDetailRequest request) throws Exception{ + public SampleHandOutDetailResponse handOutListDetail(SampleHandOutDetailRequest request) throws Exception { //根据样品id和委托书id查询样品、委托书、委托方 SampleHandOutDetailResponse sampleDetail = orderSampleRelationMapper.selectSampleDetail(request.getOrderId(), request.getSampleId()); - if(Objects.isNull(sampleDetail)){ + if (Objects.isNull(sampleDetail)) { throw new BusinessException(BusinessExceptionEnum.NON_EXIST_ORDER_OR_SAMPLE); } //根据样品id和委托书id查询检定流程、退回信息 @@ -190,11 +196,11 @@ //是否存在样品的实验室检定信息标准模板 //后续可采用该方式和模板分类方式实现自动分发 List initListResponses = labExecutiveTemplateInfoMapper.selectExecutiveList(handOutInitListRequest); - if(!CollectionUtils.isEmpty(initListResponses)){ + if (!CollectionUtils.isEmpty(initListResponses)) { return initListResponses; } - if(StringUtils.isEmpty(handOutInitListRequest.getMeasureContent())){ + if (StringUtils.isEmpty(handOutInitListRequest.getMeasureContent())) { return new ArrayList<>(); } //根据样品的检定项目去关键字匹配实验室能力信息 @@ -223,7 +229,7 @@ List labExecutiveInfos = new ArrayList<>(); for (int i = 0; i < sortedList.size(); i++) { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); - if(0 == i){ + if (0 == i) { //将第一个置为待分配(负责人可查看) labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); } @@ -240,14 +246,14 @@ } //更新样品状态为检测中 int updateFlag = orderSampleRelationMapper.updateByOrderIdAndSampleId(orderId, sampleId, SampleStatusEnum.IN_MEASURE); - if(this.saveBatch(labExecutiveInfos) && updateFlag > 0){ + if (this.saveBatch(labExecutiveInfos) && updateFlag > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @Override - public Page deptLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception{ + public Page deptLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception { //本级部门主管可见本部门的检测 //根据用户id查询,用户角色中TIPS为director即为主管,取用户的部门id AuthUser user = ShiroKit.getUser(); @@ -256,7 +262,7 @@ }); Map resultMap = selectDirectDept(user); - if(CollectionUtils.isEmpty(resultMap) || Objects.isNull(resultMap.get("deptId"))){ + if (CollectionUtils.isEmpty(resultMap) || Objects.isNull(resultMap.get("deptId"))) { return new Page<>(); } Long deptId = (Long) resultMap.get("deptId"); @@ -281,12 +287,12 @@ List statusList = new ArrayList<>(); statusList.add(MeasureStatusEnum.TO_MEASURE); statusList.add(MeasureStatusEnum.IN_MEASURE); - resultPage = labExecutiveInfoMapper.selectListByDeptIdAndStatus(page, labExecutiveListRequest, deptId,null, statusList); + resultPage = labExecutiveInfoMapper.selectListByDeptIdAndStatus(page, labExecutiveListRequest, deptId, null, statusList); resultPage.getRecords().parallelStream().forEach(lab -> { lab.setCurrentSegmentId(deptId); lab.setCurrentSegment(deptName); //查询证书报告表 - if(MeasureStatusEnum.IN_MEASURE.equals(lab.getMeasureStatus())){ + if (MeasureStatusEnum.IN_MEASURE.equals(lab.getMeasureStatus())) { Integer alreadyCertificateNum = getAlreadyCertificateNum(lab.getOrderId(), lab.getSampleId(), deptId); lab.setAlreadyCertifications(alreadyCertificateNum); } @@ -300,7 +306,7 @@ enrichLabExecutiveRecords(resultPage); break; } - if(!CollectionUtils.isEmpty(resultPage.getRecords())){ + if (!CollectionUtils.isEmpty(resultPage.getRecords())) { for (SampleLabExecutiveListResponse record : resultPage.getRecords()) { DictCodeUtils.convertDictCodeToName(record); } @@ -309,7 +315,7 @@ } @Override - public Page myLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception{ + public Page myLabExecutiveListPage(Page page, SampleLabExecutiveListRequest labExecutiveListRequest) throws Exception { AuthUser user = ShiroKit.getUser(); Assert.isFalse(Objects.isNull(user), () -> { throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); @@ -317,7 +323,7 @@ //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); // if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); - if(Objects.isNull(meterStaff)) return new Page<>(); + if (Objects.isNull(meterStaff)) return new Page<>(); Long userId = meterStaff.getId(); String measureStatus = labExecutiveListRequest.getMeasureStatus(); @@ -336,13 +342,24 @@ //检测中,查询本人检测中 //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: + List originalRecords = originalRecordMapper.selectList(null); + + Map originalRecordMap = originalRecords.stream() + .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId() + e.getOrderId()), e -> e.getMeasureCategory())); + //需要审批状态, + List certificateReportList = certificateReportMapper.selectList(null); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId() + e.getOrderId()), e -> e)); + resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); + //获取所有的原始记录和证书 resultPage.getRecords().forEach(lab -> { lab.setCurrentSegmentId(lab.getMeasureDeptId()); lab.setCurrentSegment(lab.getMeasureDeptName()); //本实验室在一个流程中若有多次检测,这里的证书信息是多次的总和,已出具的是当前本人的(后续根据需求定义调整) Integer alreadyCertificateNum = getAlreadyCertificateNum(lab.getOrderId(), lab.getSampleId(), lab.getMeasureDeptId()); lab.setAlreadyCertifications(alreadyCertificateNum); + sampleFIleStatus(originalRecordMap, certificateReportMap, lab); }); break; @@ -351,9 +368,10 @@ resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.MEASURE_COMPLETE); //查询样品检定到的其他实验室或样品检测完成 enrichLabExecutiveRecords(resultPage); + break; } - if(!CollectionUtils.isEmpty(resultPage.getRecords())){ + if (!CollectionUtils.isEmpty(resultPage.getRecords())) { for (SampleLabExecutiveListResponse record : resultPage.getRecords()) { DictCodeUtils.convertDictCodeToName(record); } @@ -361,13 +379,46 @@ return resultPage; } + /** + * 判断文件的状态 + */ + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + //判断不含原始记录的情况 + if (!originalRecordMap.containsKey(key)) { + lab.setSampleFileStatus(NOT_EXIST_FILE); + return; + } + //判断不含有证书的情况 + if (!certificateReportMap.containsKey(key)) { + lab.setSampleFileStatus(ORIGINAL_RECORD); + return; + } + //判断没有通过或者驳回的证书报告 + BusinessCertificateReport certificateReport = certificateReportMap.get(key); + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + lab.setSampleFileStatus(CERTIFICATE); + return; + } + //判断通过的状态 + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + lab.setSampleFileStatus(CERTIFICATE_PASS); + return; + } + //判断驳回的状态 + if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + lab.setSampleFileStatus(CERTIFICATE_REJECT); + } + return; + } + @Override public List myExecutiveAmount() { //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id AuthUser user = ShiroKit.getUser(); MeterStaff meterStaff = getMeterStaffInfo(user); // if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); - if(Objects.isNull(meterStaff)) return new ArrayList<>(); + if (Objects.isNull(meterStaff)) return new ArrayList<>(); Long userId = meterStaff.getId(); Page page = getSampleLabExecutiveListResponsePage(); Page page1 = getSampleLabExecutiveListResponsePage(); @@ -399,22 +450,71 @@ }); //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //查询扫描样品中为该用户待检测中的样品列表 List preList = labExecutiveInfoMapper.selectListForSampleOperate(requestList, userId, MeasureStatusEnum.TO_MEASURE); - if(CollectionUtils.isEmpty(preList)){ + if (CollectionUtils.isEmpty(preList)) { throw new BusinessException(BusinessExceptionEnum.RECEIVE_SAMPLE_NOT_EXIST); } int updateFlag = labExecutiveInfoMapper.updateForSampleInMeasureOperate(preList, userId, MeasureStatusEnum.IN_MEASURE); - if(updateFlag > 0){ + if (updateFlag > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.RECEIVE_SAMPLE_NOT_EXIST); } @Override + public ReturnDTO sampleAdd(List requestList) { + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id + MeterStaff meterStaff = getMeterStaffInfo(user); + if (Objects.isNull(meterStaff)) { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + } + Long userId = meterStaff.getId(); + List existSampleList = new ArrayList<>(); + for (SampleOperateRequest request : requestList) { + //检查样品是否已在检测流程中,提示 + QueryWrapper wrapper = new QueryWrapper<>(); + List statusList = Arrays.asList(MeasureStatusEnum.TO_MEASURE, MeasureStatusEnum.IN_MEASURE, MeasureStatusEnum.MEASURE_COMPLETE); + wrapper.eq("order_id", request.getOrderId()); + wrapper.eq("sample_id", request.getSampleId()); + wrapper.in("measure_status", statusList); + if (labExecutiveInfoMapper.selectCount(wrapper) > 0) { + existSampleList.add(request.getSampleId()); + continue; + } + //删除从实验室待检测中扫描过来的任务的情况中原有的检测节点 + wrapper.eq("measure_status", MeasureStatusEnum.TO_ALLOCATE); + this.baseMapper.delete(wrapper); + //增加检测节点 + BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); + labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.IN_MEASURE); + labExecutiveInfo.setStartTime(DateUtil.now()); + labExecutiveInfo.setOrderId(request.getOrderId()); + labExecutiveInfo.setSampleId(request.getSampleId()); + labExecutiveInfo.setMeasureDeptId(user.getDeptId()); + labExecutiveInfo.setMeasurePersonId(userId); + labExecutiveInfo.setMeasureSequence(1); + labExecutiveInfo.setIsAuto(0);//默认手动检定 + labExecutiveInfo.setRequireCertifications(request.getRequireCertifications()); + labExecutiveInfo.setCreateUser(ShiroKit.getUser().getId()); + int insertFlag = this.baseMapper.insert(labExecutiveInfo); + //更新样品状态为检测中 + int updateFlag = orderSampleRelationMapper.updateByOrderIdAndSampleId(request.getOrderId(), request.getSampleId(), SampleStatusEnum.IN_MEASURE); + if (insertFlag <= 0 || updateFlag <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + return ReturnUtil.success(); + } + + @Override @Transactional public ReturnDTO sampleExecutiveComplete(List requestList) { //查询是否在该用户的检测中有该样品,没有则返回提示信息,有则更新检测状态、更新样品状态(判断是否全部实验室检测完成) @@ -424,16 +524,16 @@ }); //登录用户id获取计量人员id,实验室检测信息中存储的是计量人员id MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //查询扫描样品中为该用户检测中的样品列表 List preList = labExecutiveInfoMapper.selectListForSampleOperate(requestList, userId, MeasureStatusEnum.IN_MEASURE); - if(CollectionUtils.isEmpty(preList)){ + if (CollectionUtils.isEmpty(preList)) { throw new BusinessException(BusinessExceptionEnum.COMPLETE_SAMPLE_NOT_EXIST); } int updateFlag = labExecutiveInfoMapper.updateForSampleMeasureCompleteOperate(preList, userId, MeasureStatusEnum.MEASURE_COMPLETE); - if(updateFlag > 0){ + if (updateFlag > 0) { preList.forEach(pre -> { //是否全部实验室完成,所有实验室无检测完外的其他状态或空才是样品的检测完(有终止状态会把样品状态直接更新为待归还,有退回的状态会从表中删除加入到log表) QueryWrapper wrapper = new QueryWrapper<>(); @@ -444,7 +544,7 @@ StringUtils.isEmpty(lab.getMeasureStatus()) || !StringUtils.equals(MeasureStatusEnum.MEASURE_COMPLETE, lab.getMeasureStatus()) ).collect(Collectors.toList()); //全部实验室检测完成 - if(CollectionUtils.isEmpty(unExecutiveInfos)){ + if (CollectionUtils.isEmpty(unExecutiveInfos)) { //更新样品状态为检测完 orderSampleRelationMapper.updateByOrderIdAndSampleId(pre.getOrderId(), pre.getSampleId(), SampleStatusEnum.MEASURE_COMPLETE); @@ -459,14 +559,14 @@ BusinessLabExecutiveTemplateInfo templateInfo = getBusinessLabExecutiveTemplateInfo(maxNo, i, lab); labList.add(templateInfo); } - if(labExecutiveTemplateInfoService.saveBatch(labList)) log.info("实验室检测记录批量保存为实验室检测模板成功"); - }else { + if (labExecutiveTemplateInfoService.saveBatch(labList)) log.info("实验室检测记录批量保存为实验室检测模板成功"); + } else { //更新下一个审批的实验室为待分配 //注:分发员不可以调整待分配/检测中等有状态的节点(只能调整无状态的) Optional minSeqLab = labExecutiveInfos.stream().filter(dto -> StringUtils.isEmpty(dto.getMeasureStatus()) /*&& Objects.isNull(dto.getMeasurePersonId())*/ ).sorted(Comparator.comparing(BusinessLabExecutiveInfo::getMeasureStatus)).findFirst(); - if(minSeqLab.isPresent()){ + if (minSeqLab.isPresent()) { BusinessLabExecutiveInfo labExecutiveInfo = minSeqLab.get(); labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); labExecutiveInfoMapper.updateById(labExecutiveInfo); @@ -489,7 +589,7 @@ statusList.add(SampleStatusEnum.IN_MEASURE); wrapper1.in("sample_status", statusList); //同一事务中可查到更新后的数量 - if(orderSampleRelationMapper.selectCount(wrapper1) == 0){ + if (orderSampleRelationMapper.selectCount(wrapper1) == 0) { BusinessOrder businessOrder = new BusinessOrder(); businessOrder.setId(pre.getOrderId()); businessOrder.setStatus(OrderStatusEnum.COMPLETE); @@ -529,8 +629,9 @@ List addList = new ArrayList<>(); for (UpdateExecutiveListDTO executiveDTO : executiveList) { //待分配状态分发员可更新检定员 - if(StringUtils.isNotEmpty(executiveDTO.getMeasureStatus()) && !MeasureStatusEnum.TO_ALLOCATE.equals(executiveDTO.getMeasureStatus())) continue; - if(Objects.isNull(executiveDTO.getId())){ + if (StringUtils.isNotEmpty(executiveDTO.getMeasureStatus()) && !MeasureStatusEnum.TO_ALLOCATE.equals(executiveDTO.getMeasureStatus())) + continue; + if (Objects.isNull(executiveDTO.getId())) { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); labExecutiveInfo.setId(executiveDTO.getId()); labExecutiveInfo.setOrderId(request.getOrderId()); @@ -540,7 +641,7 @@ labExecutiveInfo.setMeasureSequence(executiveDTO.getMeasureSequence()); labExecutiveInfo.setRequireCertifications(executiveDTO.getRequireCertifications()); addList.add(labExecutiveInfo); - }else{ + } else { BusinessLabExecutiveInfo labExecutiveInfo = new BusinessLabExecutiveInfo(); labExecutiveInfo.setId(executiveDTO.getId()); labExecutiveInfo.setMeasureDeptId(executiveDTO.getMeasureSegmentId()); @@ -562,16 +663,16 @@ throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); }); MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); - if(request.getMeasurePersonId() != userId){ + if (request.getMeasurePersonId() != userId) { throw new BusinessException(BusinessExceptionEnum.CANNOT_CHANGE_MEASURE_INFO); } BusinessLabExecutiveInfo executiveInfo = new BusinessLabExecutiveInfo(); executiveInfo.setId(request.getId()); executiveInfo.setRequireCertifications(request.getRequireCertifications()); - if(labExecutiveInfoMapper.updateById(executiveInfo) > 0){ + if (labExecutiveInfoMapper.updateById(executiveInfo) > 0) { return ReturnUtil.success(); } log.info("更新实验室应出具证书信息失败,主键id:{}", request.getId()); @@ -579,10 +680,10 @@ } @Override - public ExecutiveDetailResponse executiveDetail(ExecutiveDetailRequest request) throws Exception{ + public ExecutiveDetailResponse executiveDetail(ExecutiveDetailRequest request) throws Exception { //根据样品id和委托书id查询样品、委托书、委托方 SampleHandOutDetailResponse sampleDetail = orderSampleRelationMapper.selectSampleDetail(request.getOrderId(), request.getSampleId()); - if(Objects.isNull(sampleDetail)){ + if (Objects.isNull(sampleDetail)) { throw new BusinessException(BusinessExceptionEnum.NON_EXIST_ORDER_OR_SAMPLE); } ExecutiveDetailResponse detailResponse = ConvertUtils.sourceToTarget(sampleDetail, ExecutiveDetailResponse.class); @@ -602,7 +703,7 @@ throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); }); MeterStaff meterStaff = getMeterStaffInfo(user); - if(Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); + if (Objects.isNull(meterStaff)) throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_NOT_STAFF); Long userId = meterStaff.getId(); //删除实验室检测列表中退回数据 @@ -610,14 +711,14 @@ //退回操作记录表中增加数据 BusinessLabExecutiveOperateLog operateLog = getBusinessLabExecutiveOperateLog(request, user, userId); int insertFlag = labExecutiveOperateLogMapper.insert(operateLog); - if(deleteFlag > 0 && insertFlag > 0){ + if (deleteFlag > 0 && insertFlag > 0) { //退回后会将下一个要执行的实验室检测状态更新为待分配,将后面的实验室顺序变更为连续(都进行减1) //更新所有状态为空的实验室检测的序号为当前减1 int seqUpdateFlag = labExecutiveInfoMapper.updateForSendBack(request.getOrderId(), request.getSampleId()); //更新所有状态为空的实验室检测中序号最小的记录的状态为待分配 Long id = labExecutiveInfoMapper.selectMinSeq(request.getOrderId(), request.getSampleId()); //仅分发了一个实验室检测或无实验室可分配的情况 - if(seqUpdateFlag <= 0 && Objects.isNull(id)){ + if (seqUpdateFlag <= 0 && Objects.isNull(id)) { //将样品状态变为待分发 orderSampleRelationMapper.updateByOrderIdAndSampleId(request.getOrderId(), request.getSampleId(), SampleStatusEnum.TO_HANDOUT); return ReturnUtil.success(); @@ -626,7 +727,7 @@ info.setId(id); info.setMeasureStatus(MeasureStatusEnum.TO_ALLOCATE); int statusUpdateFlag = labExecutiveInfoMapper.updateById(info); - if(seqUpdateFlag > 0 && statusUpdateFlag > 0) return ReturnUtil.success(); + if (seqUpdateFlag > 0 && statusUpdateFlag > 0) return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -638,7 +739,7 @@ labExecutiveInfo.setMeasurePersonId(sampleAllocateRequest.getMeasurePersonId()); labExecutiveInfo.setMeasureStatus(MeasureStatusEnum.TO_MEASURE); labExecutiveInfo.setRequireCertifications(sampleAllocateRequest.getRequireCertifications()); - if(labExecutiveInfoMapper.updateById(labExecutiveInfo) > 0){ + if (labExecutiveInfoMapper.updateById(labExecutiveInfo) > 0) { return ReturnUtil.success(); } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java index e98da87..1cb6bb4 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessLabExecutiveInfoService.java @@ -36,6 +36,8 @@ ReturnDTO sampleReceive(List requestList); + ReturnDTO sampleAdd(List requestList); + ReturnDTO sampleExecutiveComplete(List requestList); ReturnDTO updateExecutiveList(UpdateExecutiveListRequest requestList); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index 667c9e1..4fb3b33 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,20 +1,17 @@ package com.casic.missiles.service.listeners.register; -import cn.afterturn.easypoi.word.WordExportUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.CropPicture; import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.service.listeners.util.ParseWord07; +import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; -import liquibase.pro.packaged.E; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ParseWord07.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ParseWord07.java index faf91dd..ff8a500 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ParseWord07.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ParseWord07.java @@ -9,12 +9,14 @@ import cn.afterturn.easypoi.word.parse.excel.ExcelMapParse; import cn.hutool.core.collection.CollectionUtil; import liquibase.pro.packaged.A; +import liquibase.pro.packaged.C; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.ObjectUtils; import java.math.BigInteger; import java.util.*; @@ -98,15 +100,20 @@ if (currentText.contains("fe:") && currentText.startsWith("{{")) { currentText = currentText.replace("fe:", "").replace("{{", "").replace("}}", ""); String[] keys = currentText.replaceAll("\\s{1,}", " ").trim().split(" "); - List list = (List) PoiPublicUtil.getParamsValue(keys[0], map); - list.forEach((objx) -> { - if (objx instanceof ImageEntity) { - currentRun.setText("", 0); - ExcelMapParse.addAnImage((ImageEntity) objx, currentRun); - } else { - PoiPublicUtil.setWordText(currentRun, objx.toString()); - } - }); + Object object = PoiPublicUtil.getParamsValue(keys[0], map); + if (object instanceof List) { + List list = (List) object; + list.forEach((objx) -> { + if (objx instanceof ImageEntity) { + currentRun.setText("", 0); + ExcelMapParse.addAnImage((ImageEntity) objx, currentRun); + } else { + PoiPublicUtil.setWordText(currentRun, objx.toString()); + } + }); + }else { + currentRun.setText("", 0); + } } else { Object obj = PoiPublicUtil.getRealValue(currentText, map); if (obj instanceof ImageEntity) { @@ -125,29 +132,38 @@ //先执行预匹配,获取最大的长度,在进行之下的扩容 private Boolean checkThisTableCellIterator(List cells, XWPFTable table, - Map map, int row, Integer maxExpansionLength, Integer differExpansionLength) throws Exception { + Map map) throws Exception { + Integer differExpansionLength = 0; int cellIndex = 0; + //获取当前#fe所在的列数 while (cellIndex < cells.size()) { String text = cells.get(cellIndex).getText().trim(); if (text != null && text.contains("#fe:") && text.startsWith("{{")) { + text = text.replace("#fe:", "").replace("{{", "").replace("}}", ""); + String[] keys = text.replaceAll("\\s{1,}", " ").trim().split(" "); + Object result = PoiPublicUtil.getParamsValue(keys[0], map); + if (result instanceof List) { + differExpansionLength = ((List) result).size(); + } break; } cellIndex++; } - int currentIndex = cells.size() - 1; - //涉及扩容 - while (cells.size() - currentIndex < differExpansionLength) { - cells.get(0).getTableRow().createCell(); - } - //合并,且去除合并包含都是一列的情况 - if (currentIndex + 1 < (maxExpansionLength - differExpansionLength)) { - //列合并 - mergeCellsHorizontal(cells, currentIndex, currentIndex + differExpansionLength - 1); - } - if (cellIndex >= currentIndex) { + String text = ""; + if (cellIndex < cells.size()) { + //如果查询不到#fe则进行退去匹配 + text = cells.get(cellIndex).getText().trim(); + if (StringUtils.isEmpty(text) || !text.contains("#fe:") || !text.startsWith("{{")) { + return false; + } + } else { return false; } - String text = cells.get(cellIndex).getText().trim(); + //涉及扩容,是否满足可以使用的行列 + while (cells.size() - cellIndex < differExpansionLength) { + cells.get(0).getTableRow().createCell(); + } + text = cells.get(cellIndex).getText().trim(); return parseNextColAndAddCol(cells, text, cellIndex, map, table); } @@ -170,8 +186,20 @@ //涉及扩容 Integer differCol = cells.size() - cellIndex; BigInteger weight = table.getCTTbl().getTblGrid().getGridColList().get(0).getW(); - for (CTTblGridCol ctTblGridCol : table.getCTTbl().getTblGrid().getGridColList()) { - ctTblGridCol.setW(weight); + Boolean extend = false; + //改变不了原来的格式,例如光标位置 + int tempResultIndex = resultIndex, tempCellIndex = cellIndex; + while (tempResultIndex < resultList.size() && tempCellIndex < cells.size()) { + if (tempResultIndex >= differCol) { + extend = true; + } + tempResultIndex++; + tempCellIndex++; + } + if (extend) { + for (CTTblGridCol ctTblGridCol : table.getCTTbl().getTblGrid().getGridColList()) { + ctTblGridCol.setW(weight); + } } //改变不了原来的格式,例如光标位置 while (resultIndex < resultList.size() && cellIndex < cells.size()) { @@ -246,6 +274,14 @@ return initialMergeRow; } + /** + * 如果是两行标题进行合并列,则进行预处理匹配,匹配到第二列的情况+加上空行的情况,目前暂时只支持两行的标题情况 + * + * @param positionIndex 位置索引 + * @param table + * @param mergeColNames 合并表头参数 + * @return + */ private List checkThisTableCellMergeIndex(int positionIndex, XWPFTable table, List mergeColNames) { Map mergeColNameMap = mergeColNames.stream().collect( Collectors.toMap(e -> e, e -> e) @@ -254,7 +290,10 @@ List mergeIndexList = new ArrayList<>(); for (int i = 0; i <= positionIndex; i++) { XWPFTableRow row = table.getRow(i); - //标题合并行 + if (ObjectUtils.isEmpty(row)) { + continue; + } + //标题合并行,其实探测当前行,如果往下探测空行次数累加,得到列数就是当前的次数, while (colIndex < row.getTableCells().size()) { String titleText = row.getTableCells().get(colIndex).getText(); if (StringUtils.isNotEmpty(titleText)) { @@ -262,17 +301,18 @@ //合并两行的存在 if (i < positionIndex) { Integer mergerIndex = 0; - List cells = table.getRow(positionIndex).getTableCells(); + List cells = table.getRow(i + 1).getTableCells(); for (int j = 0; j < cells.size(); ) { //获取当前所在行为空, if (StringUtils.isNotEmpty(cells.get(j).getText())) { if (++mergerIndex > colIndex) { - mergeIndexList.add(j - 1); + mergeIndexList.add(j); break; } - while (StringUtils.isNotEmpty(cells.get(++j).getText())) { + while (++j < cells.size() && StringUtils.isNotEmpty(cells.get(j).getText())) { } } else { + //每次为空行比较一下 j++; if (++mergerIndex > colIndex) { mergeIndexList.add(j - 1); @@ -311,7 +351,12 @@ } - public void mergeCellsHorizontal(List cells, int fromCell, int toCell) { + /** + * @param cells 当前列参数 + * @param fromCell 开始列下标 + * @param toCell 截止列下标 + */ + private void mergeCellsHorizontal(List cells, int fromCell, int toCell) { for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) { XWPFTableCell cell = cells.get(cellIndex); if (cellIndex == fromCell) { @@ -418,15 +463,19 @@ private void parseThisTable(XWPFTable table, Map map, List mergeColNames) throws Exception { //默认为当前单元格的长度 - Integer maxExpansionLength = tryMatchMaxLength(table, map); - Integer differExpansionLength = maxExpansionLength - table.getRow(0).getTableCells().size(); +// Integer maxExpansionLength = tryMatchMaxLength(table, map); + //当前表格要占用的长度 +// Integer differExpansionLength = maxExpansionLength - table.getRow(0).getTableCells().size(); //执行匹配,进行行列扩展 for (int i = 0; i < table.getNumberOfRows(); ++i) { XWPFTableRow row = table.getRow(i); List cells = row.getTableCells(); //增加对该行列循环填充参数的添加 - checkThisTableCellIterator(cells, table, map, i, maxExpansionLength, differExpansionLength); - //检测该行的首个字母是否是 + Boolean colFillIn = checkThisTableCellIterator(cells, table, map); + if (colFillIn) { + continue; + } + //检测该行的首个字母是否是包含表格中表 Object listObj = this.checkThisTableIsNeedIterator(cells.get(0), map, mergeColNames); if (listObj == null) { this.parseThisRow(cells, map);