Compare commits

...

3 Commits

Author SHA1 Message Date
wxr
dd6df68061 升级liteflow及处理荧光数据上传 2025-12-12 08:48:36 +08:00
FCL
468e939ab1 Merge remote-tracking branch 'origin/test' into test 2025-12-11 17:53:16 +08:00
FCL
90b0aa5202 feat:报告转pdf、发起iwork流程。 开发中 2025-12-11 17:52:59 +08:00
37 changed files with 1067 additions and 110 deletions

View File

@@ -140,6 +140,7 @@ public interface ErrorCodeConstants {
ErrorCode REPORT_DOCUMENT_DATA_NOT_EXISTS = new ErrorCode(1_032_100_000, "检测报告明细不存在");
ErrorCode REPORT_DOCUMENT_TYPE_NOT_EXISTS = new ErrorCode(1_032_100_000, "报告类型配置不存在");
ErrorCode REPORT_DOCUMENT_MAIN_CORRELATION_NOT_EXISTS = new ErrorCode(1_032_100_000, "报告主数据关系不存在");
ErrorCode REPORT_DOCUMENT_FILE_NOT_EXISTS = new ErrorCode(1_032_100_000, "检测报告附件不存在");
ErrorCode BUSINESS_SAMPLE_DISPATCH_NOT_EXISTS = new ErrorCode(1_032_100_000, "样品调拨不存在");
ErrorCode BUSINESS_SAMPLE_DISPATCH_DETAIL_NOT_EXISTS = new ErrorCode(1_032_100_000, "样品调拨明细不存在");

View File

@@ -18,6 +18,7 @@
</description>
<properties>
<zzjc.tio.version>3.9.1.v20251204-RELEASE</zzjc.tio.version>
<liteflow.version>2.15.2</liteflow.version>
</properties>
<dependencies>
<!-- Spring Cloud 基础 -->
@@ -141,27 +142,27 @@
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.15.1</version>
<version>${liteflow.version}</version>
</dependency>
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-script-javax-pro</artifactId>
<version>2.15.1</version>
<version>${liteflow.version}</version>
</dependency>
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-script-groovy</artifactId>
<version>2.15.1</version>
<version>${liteflow.version}</version>
</dependency>
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-script-qlexpress</artifactId>
<version>2.15.1</version>
<version>${liteflow.version}</version>
</dependency>
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-script-graaljs</artifactId>
<version>2.15.1</version>
<version>${liteflow.version}</version>
</dependency>
<!-- pdfbox -->

View File

@@ -6,7 +6,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.annotation.JsonFormat;

View File

@@ -263,6 +263,31 @@ public interface BusinessAssayTaskDataMapper extends BaseMapperX<BusinessAssayTa
.eq(BusinessAssayTaskDataDO::getIsReported, QmsCommonConstant.NO));
}
default List<BusinessAssayTaskDataExtendRespVO> selectBySampleAssayCodesAndConfigAssayMethodId(List<String> sampleAssayCodes, Long configAssayMethodId) {
return selectJoinList(BusinessAssayTaskDataExtendRespVO.class, new MPJLambdaWrapperX<BusinessAssayTaskDataDO>()
.leftJoin(BusinessSubSampleDO.class, BusinessSubSampleDO::getId, BusinessAssayTaskDataDO::getBusinessSubSampleId)
.selectAll(BusinessAssayTaskDataDO.class)
.selectAs(BusinessSubSampleDO::getSampleName, BusinessAssayTaskDataExtendRespVO::getSampleName)
.selectAs(BusinessSubSampleDO::getSampleCode, BusinessAssayTaskDataExtendRespVO::getSampleCode)
.selectAs(BusinessSubSampleDO::getSampleAssayCode, BusinessAssayTaskDataExtendRespVO::getSampleAssayCode)
.in(BusinessSubSampleDO::getSampleAssayCode, sampleAssayCodes)
.eq(BusinessAssayTaskDataDO::getConfigAssayMethodId, configAssayMethodId)
.eq(BusinessAssayTaskDataDO::getIsReported, QmsCommonConstant.NO));
}
default List<BusinessAssayTaskDataExtendRespVO> selectBySampleAssayCodesAndConfigAssayMethodDictionaryBusinessKey(List<String> sampleAssayCodes, String configAssayMethodDictionaryBusinessKey) {
return selectJoinList(BusinessAssayTaskDataExtendRespVO.class, new MPJLambdaWrapperX<BusinessAssayTaskDataDO>()
.leftJoin(BusinessSubSampleDO.class, BusinessSubSampleDO::getId, BusinessAssayTaskDataDO::getBusinessSubSampleId)
.leftJoin(ConfigAssayMethodDO.class, ConfigAssayMethodDO::getId, BusinessAssayTaskDataDO::getConfigAssayMethodId)
.selectAll(BusinessAssayTaskDataDO.class)
.selectAs(BusinessSubSampleDO::getSampleName, BusinessAssayTaskDataExtendRespVO::getSampleName)
.selectAs(BusinessSubSampleDO::getSampleCode, BusinessAssayTaskDataExtendRespVO::getSampleCode)
.selectAs(BusinessSubSampleDO::getSampleAssayCode, BusinessAssayTaskDataExtendRespVO::getSampleAssayCode)
.in(BusinessSubSampleDO::getSampleAssayCode, sampleAssayCodes)
.eq(ConfigAssayMethodDO::getDictionaryBusinessKey, configAssayMethodDictionaryBusinessKey)
.eq(BusinessAssayTaskDataDO::getIsReported, QmsCommonConstant.NO));
}
default List<BusinessAssayTaskDataExtendRespVO> selectResultAssessmentList(BusinessAssayTaskDataReqVO reqVO) {
MPJLambdaWrapper<BusinessAssayTaskDataDO> mpjLambdaWrapper = new MPJLambdaWrapper<BusinessAssayTaskDataDO>()
.leftJoin(ConfigAssayMethodDO.class, ConfigAssayMethodDO::getId, BusinessAssayTaskDataDO::getConfigAssayMethodId)

View File

@@ -2,14 +2,16 @@ package com.zt.plat.module.qms.business.bus.liteflow.sample.flow;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson2.JSON;
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import com.alibaba.qlexpress4.Express4Runner;
import com.alibaba.qlexpress4.QLOptions;
import com.yomahub.liteflow.annotation.LiteflowComponent;
import com.yomahub.liteflow.core.NodeComponent;
import com.zt.plat.framework.common.exception.ServiceException;
@@ -41,7 +43,7 @@ public class SampleSubProcessUpdateCmp extends NodeComponent {
// private ConfigSubSampleService configSubSampleService;
@Resource
private ExpressRunner expressRunner;
private Express4Runner express4Runner;
@Resource
private ConfigRuleMapper configRuleMapper;
@@ -89,7 +91,7 @@ public class SampleSubProcessUpdateCmp extends NodeComponent {
for (SampleFlowNode flowNode : nextFlowNodeList) {
ConfigRuleDO conditionRule = configRuleMapper.selectLatestConfigRuleByCode(flowNode.getCondition());
Boolean isMeetCondition = false;
DefaultContext<String, Object> context = new DefaultContext<>();
Map<String, Object> context = new HashMap<>();
ConfigSubSampleDO configSubSample = sampleFlowContext.getConfigSubSampleById(businessSubSample.getConfigSubSampleId());
Boolean hasSubSimpleCodeRule = configSubSample != null && StringUtils.isNotBlank(configSubSample.getSimpleCodeRule());
Boolean hasSubSampleEncrypt = businessHandoverRecordSubDOList.stream().filter(f -> f.getBusinessSubSampleId().equals(businessSubSample.getId())).anyMatch(m -> QmsCommonConstant.FlOW_NODE_SAMPLE_ENCRYPT.equals(m.getSampleFlowNodeKey()));
@@ -105,7 +107,8 @@ public class SampleSubProcessUpdateCmp extends NodeComponent {
context.put("hasSubSimpleCodeRule", hasSubSimpleCodeRule);
context.put("hasSubSampleEncrypt", hasSubSampleEncrypt);
try {
isMeetCondition = (Boolean) expressRunner.execute(conditionRule.getExpression(), context, null, false, false);
// isMeetCondition = (Boolean) express4Runner.execute(conditionRule.getExpression(), context, null, false, false);
isMeetCondition = (Boolean) express4Runner.execute(conditionRule.getExpression(), context, QLOptions.DEFAULT_OPTIONS).getResult();
} catch (Exception e) {
e.printStackTrace();
throw new ServiceException(1_032_100_000, e.getMessage());

View File

@@ -4,13 +4,10 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.collections4.map.HashedMap;
@@ -23,18 +20,17 @@ import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONFactory;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.nacos.shaded.io.grpc.Attributes.Key;
import com.alibaba.qlexpress4.Express4Runner;
import com.alibaba.qlexpress4.QLOptions;
import com.alibaba.qlexpress4.QLResult;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import com.zt.plat.framework.common.exception.ServiceException;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils;
import com.zt.plat.module.qms.business.bus.controller.vo.*;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayParameterDataDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayProjectDataDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayReportDataDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayTaskDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayTaskDataDO;
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayTaskDetailDO;
@@ -67,7 +63,6 @@ import com.zt.plat.module.qms.business.bus.dal.mapper.BusinessSubSampleAssessmen
import com.zt.plat.module.qms.business.bus.dal.mapper.BusinessSubSampleMapper;
import com.zt.plat.module.qms.business.config.controller.vo.*;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigAssayMethodProjectAssessmentDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigReportFieldDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigRuleDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigSubSampleDO;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigSubSampleMethodDO;
@@ -104,7 +99,7 @@ import jakarta.annotation.Resource;
public class SampleAnalysisAuditServiceImpl implements SampleAnalysisAuditService {
@Resource
private ExpressRunner expressRunner;
private Express4Runner express4Runner;
@Resource
private AllowanceCalculatorComponent allowanceCalculatorComponent;
@@ -991,12 +986,14 @@ public class SampleAnalysisAuditServiceImpl implements SampleAnalysisAuditServic
int elementScale = businessSubSampleAssessmentProjectDO.getDecimalPosition();
// 计算代表值(均值\
// BigDecimal representativeValue = calculateRepresentativeValue(sortedValues, elementScale);
DefaultContext<String, Object> context = new DefaultContext<>();
Map<String, Object> context = new HashMap<>();
context.put("values", sortedValues);
context.put("scale", elementScale);
BigDecimal representativeValue = null;
try {
representativeValue = (BigDecimal) expressRunner.execute(calculateAssessmentValue.getExpression(), context, null, false, false);
//representativeValue = (BigDecimal) expressRunner.execute(calculateAssessmentValue.getExpression(), context, null, false, false);
QLResult expressResult = express4Runner.execute(calculateAssessmentValue.getExpression(), context, QLOptions.builder().precise(true).build());//高精度计算
representativeValue = (BigDecimal) expressResult.getResult();
} catch (Exception e) {
e.printStackTrace();
}

View File

@@ -0,0 +1,23 @@
package com.zt.plat.module.qms.business.reportdoc.async;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean("asyncTaskExecutor")
public Executor asyncTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("Async-");
executor.initialize();
return executor;
}
}

View File

@@ -21,6 +21,7 @@ import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentTy
import com.zt.plat.module.qms.business.reportdoc.service.ReportDocumentDataService;
import com.zt.plat.module.qms.business.reportdoc.service.ReportDocumentMainService;
import com.zt.plat.module.qms.business.reportdoc.service.ReportDocumentTypeService;
import com.zt.plat.module.qms.common.data.service.DataTemplateService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;

View File

@@ -0,0 +1,118 @@
package com.zt.plat.module.qms.business.reportdoc.controller.admin;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFilePageReqVO;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFileRespVO;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFileSaveReqVO;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import com.zt.plat.framework.business.interceptor.BusinessControllerMarker;
import com.zt.plat.framework.business.annotation.FileUploadController;
import com.zt.plat.framework.business.controller.AbstractFileUploadController;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
import com.zt.plat.framework.common.pojo.PageParam;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.util.object.BeanUtils;
import static com.zt.plat.framework.common.pojo.CommonResult.success;
import com.zt.plat.framework.excel.core.util.ExcelUtils;
import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentFileDO;
import com.zt.plat.module.qms.business.reportdoc.service.ReportDocumentFileService;
@Tag(name = "管理后台 - 检测报告附件")
@RestController
@RequestMapping("/qms/report-document-file")
@Validated
@FileUploadController(source = "qms.reportdocumentfile")
public class ReportDocumentFileController extends AbstractFileUploadController implements BusinessControllerMarker{
static {
FileUploadController annotation = ReportDocumentFileController.class.getAnnotation(FileUploadController.class);
if (annotation != null) {
setFileUploadInfo(annotation);
}
}
@Resource
private ReportDocumentFileService reportDocumentFileService;
@PostMapping("/create")
@Operation(summary = "创建检测报告附件")
@PreAuthorize("@ss.hasPermission('qms:report-document-file:create')")
public CommonResult<ReportDocumentFileRespVO> createReportDocumentFile(@Valid @RequestBody ReportDocumentFileSaveReqVO createReqVO) {
return success(reportDocumentFileService.createReportDocumentFile(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新检测报告附件")
@PreAuthorize("@ss.hasPermission('qms:report-document-file:update')")
public CommonResult<Boolean> updateReportDocumentFile(@Valid @RequestBody ReportDocumentFileSaveReqVO updateReqVO) {
reportDocumentFileService.updateReportDocumentFile(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除检测报告附件")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('qms:report-document-file:delete')")
public CommonResult<Boolean> deleteReportDocumentFile(@RequestParam("id") Long id) {
reportDocumentFileService.deleteReportDocumentFile(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除检测报告附件")
@PreAuthorize("@ss.hasPermission('qms:report-document-file:delete')")
public CommonResult<Boolean> deleteReportDocumentFileList(@RequestBody BatchDeleteReqVO req) {
reportDocumentFileService.deleteReportDocumentFileListByIds(req.getIds());
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得检测报告附件")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('qms:report-document-file:query')")
public CommonResult<ReportDocumentFileRespVO> getReportDocumentFile(@RequestParam("id") Long id) {
ReportDocumentFileDO reportDocumentFile = reportDocumentFileService.getReportDocumentFile(id);
return success(BeanUtils.toBean(reportDocumentFile, ReportDocumentFileRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得检测报告附件分页")
@PreAuthorize("@ss.hasPermission('qms:report-document-file:query')")
public CommonResult<PageResult<ReportDocumentFileRespVO>> getReportDocumentFilePage(@Valid ReportDocumentFilePageReqVO pageReqVO) {
PageResult<ReportDocumentFileDO> pageResult = reportDocumentFileService.getReportDocumentFilePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ReportDocumentFileRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出检测报告附件 Excel")
@PreAuthorize("@ss.hasPermission('qms:report-document-file:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportReportDocumentFileExcel(@Valid ReportDocumentFilePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ReportDocumentFileDO> list = reportDocumentFileService.getReportDocumentFilePage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "检测报告附件.xls", "数据", ReportDocumentFileRespVO.class,
BeanUtils.toBean(list, ReportDocumentFileRespVO.class));
}
}

View File

@@ -14,26 +14,27 @@ import com.zt.plat.framework.excel.core.util.ExcelUtils;
import com.zt.plat.module.qms.business.config.dal.dataobject.ConfigUserSignatureDO;
import com.zt.plat.module.qms.business.config.service.ConfigUserSignatureService;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.*;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentDataDO;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentMainDO;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentTypeDO;
import com.zt.plat.module.qms.business.reportdoc.service.ReportDocumentDataService;
import com.zt.plat.module.qms.business.reportdoc.service.ReportDocumentMainService;
import com.zt.plat.module.qms.business.reportdoc.service.ReportDocumentTypeService;
import com.zt.plat.module.qms.common.data.dal.dataobject.DataTemplateDO;
import com.zt.plat.module.qms.common.data.service.DataTemplateService;
import com.zt.plat.module.qms.enums.QmsCommonConstant;
import com.zt.plat.module.system.api.iwork.dto.IWorkOperationRespDTO;
import com.zt.plat.module.system.api.iwork.dto.IWorkWorkflowCreateReqDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
@@ -59,6 +60,19 @@ public class ReportDocumentMainController extends AbstractFileUploadController i
@Resource private ReportDocumentDataService reportDocumentDataService;
@Resource private ReportDocumentTypeService reportDocumentTypeService;
@Resource private ConfigUserSignatureService configUserSignatureService;
@Resource private DataTemplateService dataTemplateService;
@RequestMapping("/testAsyncTask")
public CommonResult<String> testAsyncTask(@RequestParam Long id) {
ReportDocumentMainSaveReqVO reqVO = new ReportDocumentMainSaveReqVO();
reqVO.setId(id);
reqVO.setFlowStatus("async");
reportDocumentMainService.updateReportDocumentMain(reqVO);
reportDocumentMainService.testAsyncTask(id);
return CommonResult.success("success");
}
@PostMapping("/create")
@Operation(summary = "创建检测报告")
@@ -78,6 +92,11 @@ public class ReportDocumentMainController extends AbstractFileUploadController i
if(typeDO == null){
return error(REPORT_DOCUMENT_TYPE_NOT_EXISTS, "报告类型不存在,请刷新后重试");
}
String dataTemplateKey = typeDO.getReportKey();
DataTemplateDO dataTemplateDO = dataTemplateService.getLatestDataByKey(dataTemplateKey);
if(dataTemplateDO == null)
return error(REPORT_DOCUMENT_TYPE_NOT_EXISTS, "表单编辑器模板不存在,请联系管理员处理");
vo.setDataTemplateId(dataTemplateDO.getId());
vo.setDocumentTitle(typeDO.getName());
vo.setFlowKey(typeDO.getFlowKey());
vo.setDocumentType(typeDO.getDocumentType());
@@ -235,4 +254,23 @@ public class ReportDocumentMainController extends AbstractFileUploadController i
ExcelUtils.write(response, "检测报告业务.xls", "数据", ReportDocumentMainRespVO.class, list);
}
@GetMapping("/testCreateIworkWorkflow")
@Operation(summary = "测试发起iwork流程")
//@PreAuthorize("@ss.hasPermission('qms:report-document-main:query')")
public CommonResult<IWorkOperationRespDTO> createIworkWorkflow() {
IWorkWorkflowCreateReqDTO req = new IWorkWorkflowCreateReqDTO();
req.setJbr("1001");
req.setYybm("2001");
req.setFb("3001");
req.setSqsj("2025-01-01");
req.setYyqx("对外邮寄");
// req.setYyfkUrl("https://files.example.com/evidence.pdf");
req.setYysy("与客户合同用印");
req.setXyywjUrl("http://172.16.46.63:30002/yudao/20251204/%E6%B5%8B%E8%AF%95pdf_1764818842846.pdf?response-cache-control=no-cache%2C%20no-store%2C%20must-revalidate&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20251209T093343Z&X-Amz-SignedHeaders=host&X-Amz-Credential=EKplIEnbNgfYBAZbEJNa%2F20251209%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Expires=86400&X-Amz-Signature=37d63249667ea855f9a51bdf47bbb044d5860c302721f52fff2ba644985bae4c");
req.setYysx("检测报告用印");
req.setYwxtdjbh("JY-20251209-0001");
// CommonResult<IWorkOperationRespDTO> ret = reportDocumentMainService.createIWorkflow(req);
return null;
}
}

View File

@@ -0,0 +1,46 @@
package com.zt.plat.module.qms.business.reportdoc.controller.vo;
import lombok.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.zt.plat.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 检测报告附件分页 Request VO")
@Data
public class ReportDocumentFilePageReqVO extends PageParam {
@Schema(description = "报告id", example = "20899")
private Long mainId;
@Schema(description = "文件表ID", example = "25498")
private Long fileId;
@Schema(description = "文件名称", example = "李四")
private String name;
@Schema(description = "路径")
private String path;
@Schema(description = "文件地址", example = "https://www.iocoder.cn")
private String url;
@Schema(description = "文件类型", example = "1")
private String type;
@Schema(description = "版本")
private Integer version;
@Schema(description = "所属部门")
private String systemDepartmentCode;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "备注")
private String remark;
}

View File

@@ -0,0 +1,58 @@
package com.zt.plat.module.qms.business.reportdoc.controller.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 检测报告附件 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ReportDocumentFileRespVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "29698")
@ExcelProperty("ID")
private Long id;
@Schema(description = "报告id", example = "20899")
@ExcelProperty("报告id")
private Long mainId;
@Schema(description = "文件表ID", example = "25498")
@ExcelProperty("文件表ID")
private Long fileId;
@Schema(description = "文件名称", example = "李四")
@ExcelProperty("文件名称")
private String name;
@Schema(description = "路径")
@ExcelProperty("路径")
private String path;
@Schema(description = "文件地址", example = "https://www.iocoder.cn")
@ExcelProperty("文件地址")
private String url;
@Schema(description = "文件类型", example = "1")
@ExcelProperty("文件类型")
private String type;
@Schema(description = "版本")
@ExcelProperty("版本")
private Integer version;
@Schema(description = "所属部门")
@ExcelProperty("所属部门")
private String systemDepartmentCode;
@Schema(description = "创建时间")
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "备注")
@ExcelProperty("备注")
private String remark;
}

View File

@@ -0,0 +1,40 @@
package com.zt.plat.module.qms.business.reportdoc.controller.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@Schema(description = "管理后台 - 检测报告附件新增/修改 Request VO")
@Data
public class ReportDocumentFileSaveReqVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "29698")
private Long id;
@Schema(description = "报告id", example = "20899")
private Long mainId;
@Schema(description = "文件表ID", example = "25498")
private Long fileId;
@Schema(description = "文件名称", example = "李四")
private String name;
@Schema(description = "路径")
private String path;
@Schema(description = "文件地址", example = "https://www.iocoder.cn")
private String url;
@Schema(description = "文件类型", example = "1")
private String type;
@Schema(description = "版本")
private Integer version;
@Schema(description = "所属部门")
private String systemDepartmentCode;
@Schema(description = "备注")
private String remark;
}

View File

@@ -88,4 +88,10 @@ public class ReportDocumentMainPageReqVO extends PageParam {
@Schema(description = "表单设计器模板id")
private Long dataTemplateId;
@Schema(description = "附件版本")
private Integer documentVersion;
@Schema(description = "异步执行状态")
private String executionStatus;
}

View File

@@ -115,6 +115,13 @@ public class ReportDocumentMainRespVO {
@ExcelProperty("表单设计器模板id")
private Long dataTemplateId;
@Schema(description = "附件版本")
@ExcelProperty("附件版本")
private Integer documentVersion;
@Schema(description = "异步执行状态")
@ExcelProperty("异步执行状态")
private String executionStatus;
//==============================扩展字段=======================================
@Schema(description = "记录数")
@ExcelProperty("记录数")

View File

@@ -90,6 +90,11 @@ public class ReportDocumentMainSaveReqVO {
@Schema(description = "表单设计器模板id")
private Long dataTemplateId;
@Schema(description = "附件版本")
private Integer documentVersion;
@Schema(description = "异步执行状态")
private String executionStatus;
//====================附加属性==============================
@Schema(description = "委托id支持多值")

View File

@@ -0,0 +1,77 @@
package com.zt.plat.module.qms.business.reportdoc.dal.dataobject;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO;
/**
* 检测报告附件 DO
*
* @author 后台管理
*/
@TableName("t_rpt_doc_file")
@KeySequence("t_rpt_doc_file_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
/**
* 支持业务基类继承isBusiness=true 时继承 BusinessBaseDO否则继承 BaseDO
*/
public class ReportDocumentFileDO extends BusinessBaseDO {
/**
* ID
*/
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**
* 报告id
*/
@TableField("MAIN_ID")
private Long mainId;
/**
* 文件表ID
*/
@TableField("FILE_ID")
private Long fileId;
/**
* 文件名称
*/
@TableField("NAME")
private String name;
/**
* 路径
*/
@TableField("PATH")
private String path;
/**
* 文件地址
*/
@TableField("URL")
private String url;
/**
* 文件类型
*/
@TableField("TP")
private String type;
/**
* 版本
*/
@TableField("VER")
private Integer version;
/**
* 所属部门
*/
@TableField("SYS_DEPT_CD")
private String systemDepartmentCode;
/**
* 备注
*/
@TableField("RMK")
private String remark;
}

View File

@@ -141,4 +141,12 @@ public class ReportDocumentMainDO extends BusinessBaseDO {
//表单设计器模板id
@TableField("DAT_TMPL_ID")
private Long dataTemplateId;
//表单设计器模板id
@TableField("DOC_VER")
private Integer documentVersion;
//异步执行状态
@TableField("EXC_STS")
private String executionStatus;
}

View File

@@ -0,0 +1,33 @@
package com.zt.plat.module.qms.business.reportdoc.dal.mapper;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFilePageReqVO;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentFileDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 检测报告附件 Mapper
*
* @author 后台管理
*/
@Mapper
public interface ReportDocumentFileMapper extends BaseMapperX<ReportDocumentFileDO> {
default PageResult<ReportDocumentFileDO> selectPage(ReportDocumentFilePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ReportDocumentFileDO>()
.eqIfPresent(ReportDocumentFileDO::getMainId, reqVO.getMainId())
.eqIfPresent(ReportDocumentFileDO::getFileId, reqVO.getFileId())
.likeIfPresent(ReportDocumentFileDO::getName, reqVO.getName())
.eqIfPresent(ReportDocumentFileDO::getPath, reqVO.getPath())
.eqIfPresent(ReportDocumentFileDO::getUrl, reqVO.getUrl())
.eqIfPresent(ReportDocumentFileDO::getType, reqVO.getType())
.eqIfPresent(ReportDocumentFileDO::getVersion, reqVO.getVersion())
.eqIfPresent(ReportDocumentFileDO::getSystemDepartmentCode, reqVO.getSystemDepartmentCode())
.betweenIfPresent(ReportDocumentFileDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(ReportDocumentFileDO::getRemark, reqVO.getRemark())
.orderByDesc(ReportDocumentFileDO::getId));
}
}

View File

@@ -0,0 +1,203 @@
package com.zt.plat.module.qms.business.reportdoc.service;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zt.plat.framework.common.exception.ServiceException;
import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.framework.security.core.LoginUser;
import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils;
import com.zt.plat.module.infra.api.file.FileApi;
import com.zt.plat.module.infra.api.file.dto.FileCreateReqDTO;
import com.zt.plat.module.infra.api.file.dto.FileRespDTO;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFileSaveReqVO;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentFileDO;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentMainDO;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentTypeDO;
import com.zt.plat.module.qms.common.data.dal.dataobject.DataTemplateDO;
import com.zt.plat.module.qms.common.data.service.DataTemplateService;
import com.zt.plat.module.qms.core.code.SequenceUtil;
import com.zt.plat.module.system.api.iwork.IWorkIntegrationApi;
import com.zt.plat.module.system.api.iwork.dto.IWorkOperationRespDTO;
import com.zt.plat.module.system.api.iwork.dto.IWorkWorkflowCreateReqDTO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Optional;
import static com.zt.plat.module.qms.enums.ErrorCodeConstants.REPORT_DOCUMENT_FILE_NOT_EXISTS;
/*
* 处理报告附件和发起iwork流程
* */
@Service("reportDocumentAssistService")
@Slf4j
public class ReportDocumentAssistService {
@Resource
private IWorkIntegrationApi iWorkIntegrationApi;
@Value("${zzjc.html2pdf.addr:}")
private String html2pdfAddr;
@Resource private ReportDocumentDataService reportDocumentDataService;
@Resource private ReportDocumentTypeService reportDocumentTypeService;
@Resource private ReportDocumentFileService reportDocumentFileService;
@Resource private DataTemplateService dataTemplateService;
@Resource private SequenceUtil sequenceUtil;
@Resource private FileApi fileApi;
private String sequenceKey = "QMS_REPORT_IWORK_CODE";
// todo 判断是否更新pdf
public boolean checkUpdateDocFile(JSONObject variables){
return true;
}
/*
* 更新报告附件并发起iwork流程*/
public void updateDocFileAndCreateIWorkflow(JSONObject variables, ReportDocumentMainDO entity) throws IOException {
// boolean updateDocFileFlag = true;
boolean createIworkWorkflowFlag = false;
JSONArray bpmFieldExtensions = variables.getJSONArray("bpmFieldExtensions");
if(bpmFieldExtensions == null)
bpmFieldExtensions = new JSONArray();
for(int i = 0; i < bpmFieldExtensions.size(); i++){
JSONObject extension = bpmFieldExtensions.getJSONObject(i);
String fieldName = extension.getString("fieldName");
String stringValue = extension.getString("stringValue");
if(fieldName.equals("creatIWorkFlow") && stringValue.equals("1")){
createIworkWorkflowFlag = true;
break;
}
}
ReportDocumentFileDO docFile = generatePdf(entity);
if(createIworkWorkflowFlag){
createIWorkflow(entity, docFile);
}
// todo 判断是否更新pdf
// if(!updateDocFileFlag && createIworkWorkflowFlag){
// ReportDocumentFileDO docFile = reportDocumentFileService.getReportDocumentFile(entity.getId());
// createIWorkflow(entity, docFile);
// return;
// }
//更新报告pdf
// if(updateDocFileFlag){
//
// }
}
/*
* 发起iwork用印*/
public CommonResult<IWorkOperationRespDTO> createIWorkflow(ReportDocumentMainDO entity, ReportDocumentFileDO docFile) {
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
IWorkWorkflowCreateReqDTO dto = new IWorkWorkflowCreateReqDTO();
dto.setJbr(String.valueOf(loginUser.getId()));
dto.setYybm(String.valueOf(loginUser.getVisitDeptId()));
dto.setFb(String.valueOf(loginUser.getVisitCompanyId()));
dto.setSqsj(sdf.format(new Date()));
dto.setYyqx("检测报告用印");
dto.setYysy("检测报告用印");
// dto.setXyywjUrl(docFile.getUrl());
dto.setXyywjUrl("http://172.16.46.63:30002/yudao/20251204/%E6%B5%8B%E8%AF%95pdf_1764818842846.pdf?response-cache-control=no-cache%2C%20no-store%2C%20must-revalidate&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20251209T093343Z&X-Amz-SignedHeaders=host&X-Amz-Credential=EKplIEnbNgfYBAZbEJNa%2F20251209%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Expires=86400&X-Amz-Signature=37d63249667ea855f9a51bdf47bbb044d5860c302721f52fff2ba644985bae4c");
dto.setYwxtdjbh(sequenceUtil.genCode(sequenceKey));
return iWorkIntegrationApi.createWorkflow(dto);
}
/*
* 生成新版pdf文件
* 在reportDocumentFile创建新pdf文件
* */
public ReportDocumentFileDO generatePdf(ReportDocumentMainDO mainDO) throws IOException {
String pageFlag = "1"; //分页处理
Long typeId = mainDO.getReportDocumentTypeId();
ReportDocumentTypeDO typeDO = reportDocumentTypeService.getReportDocumentType(typeId);
DataTemplateDO templateDO = dataTemplateService.getDataTemplate(mainDO.getDataTemplateId());
CommonResult<JSONArray> result = reportDocumentDataService.assembleDynamicData(mainDO, typeDO, pageFlag);
JSONArray data = result.getData();
String templateContent = templateDO.getFormContent();
JSONObject templateData = new JSONObject();
JSONArray tableList = data.getJSONArray(0);
templateData.put("headerData", tableList.getJSONObject(0).clone());
templateData.put("tableList", tableList);
templateData.put("formData", mainDO.getFormData());
templateData.put("signatureData", mainDO.getDocumentSignature());
JSONObject bodyJson = new JSONObject();
bodyJson.put("Template", templateContent);
bodyJson.put("Data", templateData.toJSONString());
String bodyStr = bodyJson.toJSONString();
log.info("html2pdf body: " + bodyStr);
log.info("html2pdf--start at {}", LocalDateTime.now());
HttpResponse response = HttpUtil.createPost(html2pdfAddr)
.body(bodyStr)
.timeout(15000)
.execute();
log.info("html2pdf--end at {}", LocalDateTime.now());
InputStream inputStream = response.bodyStream(); // 关键:返回原始 InputStream
//尝试从响应头中提取文件名
String contentDisposition = response.header("Content-Disposition");
String defaultName = "检测报告.pdf";
String filename = extractFilename(contentDisposition).orElse(defaultName);
//inputStream转byte[]
byte[] fileBytes = IOUtils.toByteArray(inputStream);
//上传到文件服务
FileCreateReqDTO fileCreateReqDTO = new FileCreateReqDTO();
fileCreateReqDTO.setName(filename);
fileCreateReqDTO.setDirectory(null);
fileCreateReqDTO.setType(null);
fileCreateReqDTO.setContent(fileBytes);
CommonResult<FileRespDTO> fileResult = fileApi.createFileWithReturn(fileCreateReqDTO);
if (fileResult == null || !fileResult.isSuccess() || fileResult.getData() == null) {
throw new ServiceException(REPORT_DOCUMENT_FILE_NOT_EXISTS.getCode(), "通过文件服务创建附件失败: " + Optional.ofNullable(fileResult).map(CommonResult::getMsg).orElse("未知错误"));
}
FileRespDTO fileRespDTO = fileResult.getData();
//写入ReportDocumentFile
ReportDocumentFileSaveReqVO fileSaveReqVO = new ReportDocumentFileSaveReqVO();
fileSaveReqVO.setMainId(mainDO.getId());
fileSaveReqVO.setFileId(fileRespDTO.getId());
fileSaveReqVO.setName(filename);
fileSaveReqVO.setPath(fileRespDTO.getDirectory());
fileSaveReqVO.setUrl(fileRespDTO.getUrl());
fileSaveReqVO.setVersion(mainDO.getDocumentVersion());
reportDocumentFileService.createReportDocumentFile(fileSaveReqVO);
return BeanUtils.toBean(fileRespDTO, ReportDocumentFileDO.class);
}
private Optional<String> extractFilename(String contentDisposition) {
if (contentDisposition != null && contentDisposition.contains("filename=")) {
String filename = contentDisposition.substring(contentDisposition.indexOf("filename=") + 9);
filename = filename.replaceAll("\"", "").trim();
return Optional.of(filename);
}
return Optional.empty();
}
// private String encodeFilename(String filename) {
// try {
// return URLEncoder.encode(filename, StandardCharsets.UTF_8.toString())
// .replaceAll("\\+", "%20");
// } catch (Exception e) {
// return "download.bin";
// }
// }
}

View File

@@ -529,13 +529,13 @@ public class ReportDocumentDataServiceImpl implements ReportDocumentDataService
String fixedFields = jsonObject.getString("fixedFields"); //固定检测项。如果固定检测项则以检测项作为数据Key
JSONArray fixedFieldsArray = JSONArray.parseArray(fixedFields);
if(!ObjectUtils.isEmpty(maxRowCountStr)) maxRowCount = Integer.parseInt(maxRowCountStr);
for(int i = 0; i < maxRowCount; i++){
JSONObject row = new JSONObject();
row.put("sampleNameCode", " ");
row.put("sampleName", " ");
row.put("sampleCode", " ");
rowList.add( row);
}
// for(int i = 0; i < maxRowCount; i++){
// JSONObject row = new JSONObject();
// row.put("sampleNameCode", " ");
// row.put("sampleName", " ");
// row.put("sampleCode", " ");
// rowList.add( row);
// }
for(ReportDocumentDataDO dataDO : dataList) {
JSONObject t = new JSONObject();
String documentContent = dataDO.getDocumentContent();
@@ -582,6 +582,13 @@ public class ReportDocumentDataServiceImpl implements ReportDocumentDataService
t.put("sampleCode", emptyText);
rowList.add( t);
}
while(rowList.size() < maxRowCount){
JSONObject t = new JSONObject();
t.put("sampleNameCode", " ");
t.put("sampleName", " ");
t.put("sampleCode", " ");
rowList.add( t);
}
return rowList;
}

View File

@@ -0,0 +1,67 @@
package com.zt.plat.module.qms.business.reportdoc.service;
import java.util.*;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFilePageReqVO;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFileRespVO;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFileSaveReqVO;
import jakarta.validation.*;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentFileDO;
import com.zt.plat.framework.common.pojo.PageResult;
/**
* 检测报告附件 Service 接口
*
* @author 后台管理
*/
public interface ReportDocumentFileService {
ReportDocumentFileDO getByMainIdAndVersion(Long mainId, Integer version);
/**
* 创建检测报告附件
*
* @param createReqVO 创建信息
* @return 编号
*/
ReportDocumentFileRespVO createReportDocumentFile(@Valid ReportDocumentFileSaveReqVO createReqVO);
/**
* 更新检测报告附件
*
* @param updateReqVO 更新信息
*/
void updateReportDocumentFile(@Valid ReportDocumentFileSaveReqVO updateReqVO);
/**
* 删除检测报告附件
*
* @param id 编号
*/
void deleteReportDocumentFile(Long id);
/**
* 批量删除检测报告附件
*
* @param ids 编号
*/
void deleteReportDocumentFileListByIds(List<Long> ids);
/**
* 获得检测报告附件
*
* @param id 编号
* @return 检测报告附件
*/
ReportDocumentFileDO getReportDocumentFile(Long id);
/**
* 获得检测报告附件分页
*
* @param pageReqVO 分页查询
* @return 检测报告附件分页
*/
PageResult<ReportDocumentFileDO> getReportDocumentFilePage(ReportDocumentFilePageReqVO pageReqVO);
}

View File

@@ -0,0 +1,102 @@
package com.zt.plat.module.qms.business.reportdoc.service;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFilePageReqVO;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFileRespVO;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.ReportDocumentFileSaveReqVO;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import java.util.*;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentFileDO;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.module.qms.business.reportdoc.dal.mapper.ReportDocumentFileMapper;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList;
import static com.zt.plat.module.qms.enums.ErrorCodeConstants.*;
/**
* 检测报告附件 Service 实现类
*
* @author 后台管理
*/
@Service
@Validated
public class ReportDocumentFileServiceImpl implements ReportDocumentFileService {
@Resource
private ReportDocumentFileMapper reportDocumentFileMapper;
@Override
public ReportDocumentFileDO getByMainIdAndVersion(Long mainId, Integer version) {
LambdaQueryWrapper<ReportDocumentFileDO> query = new LambdaQueryWrapper<>();
query.eq(ReportDocumentFileDO::getMainId, mainId);
query.eq(ReportDocumentFileDO::getVersion, version);
return reportDocumentFileMapper.selectOne(query);
}
@Override
public ReportDocumentFileRespVO createReportDocumentFile(ReportDocumentFileSaveReqVO createReqVO) {
// 插入
ReportDocumentFileDO reportDocumentFile = BeanUtils.toBean(createReqVO, ReportDocumentFileDO.class);
reportDocumentFileMapper.insert(reportDocumentFile);
// 返回
return BeanUtils.toBean(reportDocumentFile, ReportDocumentFileRespVO.class);
}
@Override
public void updateReportDocumentFile(ReportDocumentFileSaveReqVO updateReqVO) {
// 校验存在
validateReportDocumentFileExists(updateReqVO.getId());
// 更新
ReportDocumentFileDO updateObj = BeanUtils.toBean(updateReqVO, ReportDocumentFileDO.class);
reportDocumentFileMapper.updateById(updateObj);
}
@Override
public void deleteReportDocumentFile(Long id) {
// 校验存在
validateReportDocumentFileExists(id);
// 删除
reportDocumentFileMapper.deleteById(id);
}
@Override
public void deleteReportDocumentFileListByIds(List<Long> ids) {
// 校验存在
validateReportDocumentFileExists(ids);
// 删除
reportDocumentFileMapper.deleteByIds(ids);
}
private void validateReportDocumentFileExists(List<Long> ids) {
List<ReportDocumentFileDO> list = reportDocumentFileMapper.selectByIds(ids);
if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
throw exception(REPORT_DOCUMENT_FILE_NOT_EXISTS);
}
}
private void validateReportDocumentFileExists(Long id) {
if (reportDocumentFileMapper.selectById(id) == null) {
throw exception(REPORT_DOCUMENT_FILE_NOT_EXISTS);
}
}
@Override
public ReportDocumentFileDO getReportDocumentFile(Long id) {
return reportDocumentFileMapper.selectById(id);
}
@Override
public PageResult<ReportDocumentFileDO> getReportDocumentFilePage(ReportDocumentFilePageReqVO pageReqVO) {
return reportDocumentFileMapper.selectPage(pageReqVO);
}
}

View File

@@ -6,6 +6,8 @@ import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessAssayReportDat
import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessSampleEntrustRegistrationDO;
import com.zt.plat.module.qms.business.reportdoc.controller.vo.*;
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentMainDO;
import com.zt.plat.module.system.api.iwork.dto.IWorkOperationRespDTO;
import com.zt.plat.module.system.api.iwork.dto.IWorkWorkflowCreateReqDTO;
import jakarta.validation.Valid;
import java.util.List;
@@ -83,4 +85,6 @@ public interface ReportDocumentMainService {
//发起流程
CommonResult<ReportDocumentMainRespVO> createProcessInstance(ReportDocumentMainSaveReqVO entity);
void testAsyncTask(Long id);
}

View File

@@ -30,13 +30,19 @@ import com.zt.plat.module.qms.business.reportdoc.dal.mapper.ReportDocumentMainMa
import com.zt.plat.module.qms.business.reportdoc.dal.dataobject.ReportDocumentMainDO;
import com.zt.plat.module.qms.enums.QmsBpmConstant;
import com.zt.plat.module.qms.enums.QmsCommonConstant;
import com.zt.plat.module.system.api.iwork.IWorkIntegrationApi;
import com.zt.plat.module.system.api.iwork.dto.IWorkOperationRespDTO;
import com.zt.plat.module.system.api.iwork.dto.IWorkWorkflowCreateReqDTO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -65,6 +71,26 @@ public class ReportDocumentMainServiceImpl implements ReportDocumentMainService,
@Resource private ReportDocumentTypeService reportDocumentTypeService;
@Resource private ConfigUserSignatureService configUserSignatureService;
@Resource private BusinessSampleEntrustRegistrationService businessSampleEntrustRegistrationService;
@Resource private ReportDocumentAssistService reportDocumentAssistService;
/*
* 测试异步执行
* */
@Async("asyncTaskExecutor")
@Override
@Transactional(rollbackFor = Exception.class)
public void testAsyncTask(Long id) {
ReportDocumentMainDO entity = reportDocumentMainMapper.selectById(id);
entity.setFlowStatus("success");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
reportDocumentMainMapper.updateById(entity);
}
/***
* 增加报表数据(按样品)
@@ -390,12 +416,15 @@ public class ReportDocumentMainServiceImpl implements ReportDocumentMainService,
return CommonResult.success(respVO);
}
//流程回调
@Override
@Transactional(rollbackFor = Exception.class)
public CommonResult<JSONObject> callback(QmsBpmDTO reqDTO) {
JSONObject variables = reqDTO.getVariables();
//todo 幂等性
JSONObject variables = reqDTO.getVariables();
//流程状态 1-提交(含退回) 4-取消流程
String PROCESS_STATUS = variables.getString(QmsBpmConstant.PROCESS_INSTANCE_VARIABLE_STATUS);
String mainId = variables.getString("mainId");
@@ -423,7 +452,6 @@ public class ReportDocumentMainServiceImpl implements ReportDocumentMainService,
}
}
}
//"RETURN_FLAG_Activity_001": true 标识驳回到发起环节
if(variables.containsKey(returnFlagKey) && variables.getString(returnFlagKey).equals("true")){
//驳回。流程需要配置退回到发起节点
@@ -441,11 +469,29 @@ public class ReportDocumentMainServiceImpl implements ReportDocumentMainService,
if("1".equals(lastActivityFlag))
entity.setFlowStatus(QmsCommonConstant.COMPLETED); //结束审批
}
boolean updateDocFileFlag = reportDocumentAssistService.checkUpdateDocFile(variables);
if(updateDocFileFlag){
Integer version = entity.getDocumentVersion();
if(version == null)
version = 1;
else
version++;
entity.setDocumentVersion(version); //版本+1
}
reportDocumentMainMapper.updateById(entity);
try {
reportDocumentAssistService.updateDocFileAndCreateIWorkflow( variables, entity);
} catch (IOException e) {
throw new RuntimeException(e);
}
JSONObject ret = new JSONObject();
return CommonResult.success(ret);
}
private void assembleSignature(String currentActivityId, ReportDocumentMainDO entity){
if(ObjectUtils.isEmpty(currentActivityId) || "null".equals(currentActivityId))
return;
@@ -472,4 +518,6 @@ public class ReportDocumentMainServiceImpl implements ReportDocumentMainService,
entity.setDocumentSignature(signObj.toJSONString());
}
}

View File

@@ -7,7 +7,7 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

View File

@@ -3,7 +3,7 @@ package com.zt.plat.module.qms.core.code;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
public class SampleEncryptUtil {

View File

@@ -1,7 +1,7 @@
package com.zt.plat.module.qms.core.legend.security;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.regex.Matcher;

View File

@@ -2,11 +2,13 @@ package com.zt.plat.module.qms.core.qlexpress.cmp;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Component;
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import com.alibaba.qlexpress4.Express4Runner;
import com.alibaba.qlexpress4.QLOptions;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@@ -19,7 +21,7 @@ import lombok.extern.slf4j.Slf4j;
public class AllowanceCalculatorComponent {
@Resource
private ExpressRunner expressRunner;
private Express4Runner express4Runner;
/**
* 计算允差值:支持原生线性公式 和 Express 自定义公式混合模式
@@ -80,11 +82,12 @@ public class AllowanceCalculatorComponent {
* 使用 Express 执行自定义公式
*/
private BigDecimal evaluateCustomFormula(String formula, BigDecimal xValue, int scale) {
DefaultContext<String, Object> context = new DefaultContext<>();
Map<String, Object> context = new HashMap<>();
context.put("X", xValue); // 用户公式中使用 X 作为变量名
try {
Object result = expressRunner.execute(formula, context, null, true, false);
// Object result = expressRunner.execute(formula, context, null, true, false);
Object result = express4Runner.execute(formula, context, QLOptions.builder().precise(true).build());
if (result == null) {
throw new RuntimeException("Express 公式返回结果为 null");

View File

@@ -3,16 +3,19 @@ package com.zt.plat.module.qms.core.qlexpress.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.ql.util.express.ExpressRunner;
import com.alibaba.qlexpress4.Express4Runner;
import com.alibaba.qlexpress4.InitOptions;
import com.alibaba.qlexpress4.security.QLSecurityStrategy;
import com.zt.plat.module.qms.core.qlexpress.function.RoundToScaleHalfEven;
@Configuration
public class QlExpressRuleEngineConfig {
@Bean
public ExpressRunner expressRunner() {
//需要高精度计算支持
ExpressRunner expressRunner = new ExpressRunner(true, false);
public Express4Runner expressRunner() {
//兼容 3 的行为,则在新建 Express4Runner 时, 要将安全策略设置为 “开放”
InitOptions initOptions = InitOptions.builder().securityStrategy(QLSecurityStrategy.open()).build();
Express4Runner expressRunner = new Express4Runner(initOptions);
expressRunner.addFunction("roundToScale", new RoundToScaleHalfEven());
return expressRunner;
}

View File

@@ -3,18 +3,20 @@ package com.zt.plat.module.qms.core.qlexpress.function;
import java.math.BigDecimal;
import java.math.RoundingMode;
import com.ql.util.express.Operator;
import com.alibaba.qlexpress4.runtime.Parameters;
import com.alibaba.qlexpress4.runtime.QContext;
import com.alibaba.qlexpress4.runtime.function.CustomFunction;
public class RoundToScaleHalfEven extends Operator {
public class RoundToScaleHalfEven implements CustomFunction {
@Override
public Object executeInner(Object[] list) throws Exception {
if (list.length != 2) {
public Object call(QContext qContext, Parameters parameters) throws Throwable {
if (parameters.size() != 2) {
throw new Exception("roundToScale函数需要2个参数数值和小数位数");
}
double value = Double.parseDouble(list[0].toString());
int scale = Integer.parseInt(list[1].toString());
double value = Double.parseDouble(parameters.get(0).get().toString());
int scale = Integer.parseInt(parameters.get(1).get().toString());
BigDecimal bd = BigDecimal.valueOf(value);
bd = bd.setScale(scale, RoundingMode.HALF_EVEN);

View File

@@ -4,6 +4,7 @@ import com.zt.plat.module.bpm.api.task.BpmProcessInstanceApi;
import com.zt.plat.module.bpm.api.task.BpmTaskApi;
import com.zt.plat.module.infra.api.file.FileApi;
import com.zt.plat.module.system.api.dept.DeptApi;
import com.zt.plat.module.system.api.iwork.IWorkIntegrationApi;
import com.zt.plat.module.system.api.permission.PermissionApi;
import com.zt.plat.module.system.api.sequence.SequenceApi;
import com.zt.plat.module.system.api.user.AdminUserApi;
@@ -12,6 +13,6 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
@Configuration(value = "qmsRpcConfiguration", proxyBeanMethods = false)
@EnableFeignClients(clients = {FileApi.class, SequenceApi.class, AdminUserApi.class, DeptApi.class, BpmProcessInstanceApi.class, BpmTaskApi.class, PermissionApi.class})
@EnableFeignClients(clients = {FileApi.class, SequenceApi.class, AdminUserApi.class, DeptApi.class, BpmProcessInstanceApi.class, BpmTaskApi.class, PermissionApi.class, IWorkIntegrationApi.class})
public class RpcConfiguration {
}

View File

@@ -1,7 +1,7 @@
package com.zt.plat.module.qms.iot.tcpserver;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ObjectUtils;
import tech.zzjc.tio.core.ChannelContext;
import tech.zzjc.tio.core.Tio;

View File

@@ -10,8 +10,9 @@ import com.zt.plat.module.qms.iot.tcpserver.handler.IotDataHander;
import com.zt.plat.module.qms.iot.tcpserver.publisher.BalanceDataPublisher;
import com.fhs.common.spring.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.stereotype.Component;
import tech.zzjc.tio.cluster.TioClusterConfig;
import tech.zzjc.tio.cluster.TioClusterVo;
@@ -81,7 +82,7 @@ public class IotDeviceBalanceHandler implements IotDataHander {
String[] dataArray = analysisData(data, weightUnit);
weightData = dataArray[0];
weightUnit = dataArray[1];
if (!NumberUtils.isNumber(weightData)) {
if (!NumberUtils.isParsable(weightData)) {
log.error("{},天平接收到的数据不正确!接收到的数据:{} 16进制{}", realClient, data, IotUtils.bytesToHex(data.getBytes("UTF-8")));
return null;
}

View File

@@ -82,6 +82,9 @@ public class XRFDataServiceImpl implements XRFDataService {
//获取荧光样品id列表
List<String> sampleIdList = xrfDeviceSampleList.stream().map(XRFDeviceSampleReqVO::getSampleId).collect(Collectors.toList());
//获取荧光样品编号列表
List<String> sampleCodeList = xrfDeviceSampleList.stream().map(m -> m.getSampleCode()).collect(Collectors.toList());
//查询数据库是否已保存了荧光数据
BusinessXRFDataReqVO existXRFDataSearch = new BusinessXRFDataReqVO();
existXRFDataSearch.setDeviceNo(xrfDeviceSampleFirst.getDeviceNo());
@@ -95,6 +98,9 @@ public class XRFDataServiceImpl implements XRFDataService {
}
//根据设备编号查询荧光元素配置
List<ConfigXRFProjectDO> conYgElementList = configXRFProjectMapper.selectByDeviceNo(xrfDeviceSampleFirst.getDeviceNo());
//根据样品编号及分析方法类型,获取检测任务数据
List<BusinessAssayTaskDataExtendRespVO> businessAssayTaskDataList = businessAssayTaskDataMapper.selectBySampleAssayCodesAndConfigAssayMethodDictionaryBusinessKey(sampleCodeList, "xshxyggpf");
List<BusinessAssayTaskDataDO> businessAssayTaskDataDOList = new ArrayList<>();
List<BusinessAssayProjectDataDO> busElementValueList = new ArrayList<>();
@@ -128,10 +134,12 @@ public class XRFDataServiceImpl implements XRFDataService {
//处理匹配
List<BusinessAssayProjectDataExtendRespVO> tempBusElementValueList = new ArrayList<>();
BusinessAssayTaskDataExtendRespVO businessAssayTaskData = businessAssayTaskDataMapper.selectBySampleCode(ygDeviceSample.getSampleCode());
if (businessAssayTaskData != null) {
List<BusinessAssayProjectDataExtendRespVO> busElementValues = businessAssayProjectDataMapper.selectByBusinessAssayTaskDataId(businessAssayTaskData.getId());
tempBusElementValueList.addAll(busElementValues);
List<BusinessAssayTaskDataExtendRespVO> currBusinessAssayTaskDataList = businessAssayTaskDataList.stream().filter(f -> ygDeviceSample.getSampleCode().equals(f.getSampleAssayCode())).collect(Collectors.toList());
if (currBusinessAssayTaskDataList != null && currBusinessAssayTaskDataList.size() > 0) {
for (BusinessAssayTaskDataExtendRespVO businessAssayTaskData : currBusinessAssayTaskDataList) {
List<BusinessAssayProjectDataExtendRespVO> busElementValues = businessAssayProjectDataMapper.selectByBusinessAssayTaskDataId(businessAssayTaskData.getId());
tempBusElementValueList.addAll(busElementValues);
}
}
//分析元素
@@ -142,9 +150,7 @@ public class XRFDataServiceImpl implements XRFDataService {
continue;
}
//查询是否有特殊转换率
// QmsConYgConverRate conYgConverRate = conYgConverRateService.getOne(Wrappers.<QmsConYgConverRate>query().lambda().eq(QmsConYgConverRate::getDeviceNo, ygDeviceSample.getDeviceNo())
// .eq(QmsConYgConverRate::getLineName, ygDeviceSample.getLineName()).eq(QmsConYgConverRate::getElementName, ygDeviceSampleElement.getElementName()));
//查询是否有特殊转换率
ConfigXRFConversionRateDO conYgConverRate = configXRFConversionRateMapper.selectBy(ygDeviceSample.getDeviceNo(), ygDeviceSample.getLineName(), ygDeviceSampleElement.getXrfProjectName());
ConfigXRFProjectDO conYgElement = null;
@@ -171,16 +177,19 @@ public class XRFDataServiceImpl implements XRFDataService {
conYgElementDataType = conYgElement.getDecimalPosition();
}
Long elementId = conYgElement.getDictionaryProjectId();
BusinessAssayProjectDataExtendRespVO busElementValue = tempBusElementValueList.stream().filter(f -> f.getDictionaryProjectId().equals(elementId) && f.getIsEnabled().equals(1)).findFirst().orElse(null);
if (busElementValue != null) {
//化验数据小数精度四舍六入五单双
if("decimal".equals(busElementValue.getDataType())) {
busElementValue.setValue(elementValue.setScale(busElementValue.getDecimalPosition(), RoundingMode.HALF_EVEN).toPlainString());
} else {
busElementValue.setValue(elementValue.setScale(conYgElementDataType, RoundingMode.HALF_EVEN).toPlainString());
}
busElementValue.setRemark(conYgElement.getShowName() + ": " + busElementValue.getValue());
busElementValueList.add(BeanUtils.toBean(busElementValue, BusinessAssayProjectDataDO.class));
List<BusinessAssayProjectDataExtendRespVO> currBusElementValueList = tempBusElementValueList.stream().filter(f -> f.getDictionaryProjectId().equals(elementId) && f.getIsEnabled().equals(1)).collect(Collectors.toList());
if (currBusElementValueList != null && currBusElementValueList.size() > 0) {
for (BusinessAssayProjectDataExtendRespVO busElementValue : currBusElementValueList) {
//化验数据小数精度四舍六入五单双
if("decimal".equals(busElementValue.getDataType())) {
busElementValue.setValue(elementValue.setScale(busElementValue.getDecimalPosition(), RoundingMode.HALF_EVEN).toPlainString());
} else {
busElementValue.setValue(elementValue.setScale(conYgElementDataType, RoundingMode.HALF_EVEN).toPlainString());
}
busElementValue.setRemark(conYgElement.getShowName() + ": " + busElementValue.getValue());
busElementValueList.add(BeanUtils.toBean(busElementValue, BusinessAssayProjectDataDO.class));
}
}
ReportFieldValueData reportFieldValueData = new ReportFieldValueData();
@@ -191,11 +200,6 @@ public class XRFDataServiceImpl implements XRFDataService {
reportFieldValueData.setUnit(ygDeviceSampleElement.getXrfProjectUnit());
assayDataJson.put(conYgElement.getSaveColumn(), reportFieldValueData);
// if(conYgElementDataType != null && conYgElementDataType.intValue() > -1) {
// BeanUtil.setFieldValue(busYgData, conYgElement.getSaveColumn(), elementValue.setScale(conYgElementDataType, BigDecimal.ROUND_HALF_EVEN).toPlainString());//数据格式化-四舍六入五单双
// } else {
// BeanUtil.setFieldValue(busYgData, conYgElement.getSaveColumn(), elementValue);
// }
}
}
//循环元素修改流程节点
@@ -209,13 +213,15 @@ public class XRFDataServiceImpl implements XRFDataService {
//设置分析数据
busYgData.setAssayData(assayDataJson.toJSONString());
if (businessAssayTaskData != null) {
busYgData.setIsMatched(QmsCommonConstant.YES);
busYgData.setBusinessBaseSampleId(businessAssayTaskData.getBusinessBaseSampleId());
busYgData.setBusinessSubParentSampleId(businessAssayTaskData.getBusinessSubParentSampleId());
busYgData.setBusinessSubSampleId(businessAssayTaskData.getBusinessSubSampleId());
busYgData.setBusinessAssayTaskDataId(businessAssayTaskData.getId());
businessAssayTaskDataDOList.add(BeanUtils.toBean(businessAssayTaskData, BusinessAssayTaskDataDO.class));
if (currBusinessAssayTaskDataList != null && currBusinessAssayTaskDataList.size() > 0) {
for (BusinessAssayTaskDataExtendRespVO businessAssayTaskData : currBusinessAssayTaskDataList) {
busYgData.setIsMatched(QmsCommonConstant.YES);
busYgData.setBusinessBaseSampleId(businessAssayTaskData.getBusinessBaseSampleId());
busYgData.setBusinessSubParentSampleId(businessAssayTaskData.getBusinessSubParentSampleId());
busYgData.setBusinessSubSampleId(businessAssayTaskData.getBusinessSubSampleId());
busYgData.setBusinessAssayTaskDataId(businessAssayTaskData.getId());
businessAssayTaskDataDOList.add(BeanUtils.toBean(businessAssayTaskData, BusinessAssayTaskDataDO.class));
}
}
busYgDataList.add(busYgData);
@@ -227,18 +233,13 @@ public class XRFDataServiceImpl implements XRFDataService {
} else {
conYgLine.setLastSynchronousDataTime(maxSampleTime);
}
//更新配置时间
//更新荧光线配置时间
configXRFLineMapper.updateById(conYgLine);
if (busYgDataList.size() > 0) {
//保存荧光数据
businessXRFDataMapper.insertBatch(busYgDataList);
//更新分样子样
// if(businessAssayTaskDataDOs.size() > 0) {
// busSubCsampleService.updateBatchById(businessAssayTaskDataDOs);
// }
//更新分析结果
if (busElementValueList.size() > 0) {
businessAssayProjectDataMapper.updateBatch(busElementValueList);

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zt.plat.module.qms.business.reportdoc.dal.mapper.ReportDocumentFileMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@@ -2,39 +2,51 @@ package com.zt.plat.module.qms;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.jupiter.api.Test;
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import com.ql.util.express.IExpressContext;
import com.alibaba.qlexpress4.Express4Runner;
import com.alibaba.qlexpress4.InitOptions;
import com.alibaba.qlexpress4.QLOptions;
import com.alibaba.qlexpress4.security.QLSecurityStrategy;
import com.zt.plat.module.qms.core.qlexpress.function.RoundToScaleHalfEven;
public class QLExpressRunnerTest {
@Test
void roundToScaleTest() throws Exception {
ExpressRunner expressRunner = new ExpressRunner(true, false);
expressRunner.addFunction("roundToScale", new RoundToScaleHalfEven());
// ExpressRunner expressRunner = new ExpressRunner(true, false);
Express4Runner express4Runner = new Express4Runner(InitOptions.DEFAULT_OPTIONS);
express4Runner.addFunction("roundToScale", new RoundToScaleHalfEven());
String express_3 = "roundToScale(0.2434, 3)";
Object result_3 = expressRunner.execute(express_3, null, null, false, false);
// Object result_3 = expressRunner.execute(express_3, null, null, false, false);
Object result_3 = express4Runner.execute(express_3, new HashMap<>(), QLOptions.DEFAULT_OPTIONS).getResult();
System.out.println("四舍0.2434 " + result_3);
String express_4 = "roundToScale(0.2416, 3)";
Object result_4 = expressRunner.execute(express_4, null, null, false, false);
// Object result_4 = expressRunner.execute(express_4, null, null, false, false);
Object result_4 = express4Runner.execute(express_4, new HashMap<>(), QLOptions.DEFAULT_OPTIONS).getResult();
System.out.println("六入0.2416 " + result_4);
String express_1 = "roundToScale(0.2445, 3)";
Object result_1 = expressRunner.execute(express_1, null, null, false, false);
// Object result_1 = expressRunner.execute(express_1, null, null, false, false);
Object result_1 = express4Runner.execute(express_1, new HashMap<>(), QLOptions.DEFAULT_OPTIONS).getResult();
System.out.println("偶不变0.2445 " + result_1);
String express_2 = "roundToScale(0.2455, 3)";
Object result_2 = expressRunner.execute(express_2, null, null, false, false);
System.out.println("奇变0.2445 " + result_2);
// Object result_2 = expressRunner.execute(express_2, null, null, false, false);
Object result_2 = express4Runner.execute(express_2, new HashMap<>(), QLOptions.DEFAULT_OPTIONS).getResult();
System.out.println("奇变0.2455 " + result_2);
}
@Test
void calculateAverageValueTest() throws Exception {
ExpressRunner expressRunner = new ExpressRunner(true, false);
//兼容3 将安全策略设置为 “开放”
InitOptions initOptions = InitOptions.builder().securityStrategy(QLSecurityStrategy.open()).build();
Express4Runner expressRunner = new Express4Runner(initOptions);
// Express4Runner expressRunner = new Express4Runner(InitOptions.DEFAULT_OPTIONS);
/**
String exp = ""
+ "function abc(int a, int b) {"
@@ -77,15 +89,19 @@ public class QLExpressRunnerTest {
int elementScale = 2;
DefaultContext<String, Object> context = new DefaultContext<>();
Map<String, Object> context = new HashMap<>();
context.put("values", valuesList);
context.put("scale", elementScale);
Object result = expressRunner.execute(express, context, null, false, false);
// Object result = expressRunner.execute(express, context, null, false, false);
Object result = expressRunner.execute(express, context, QLOptions.DEFAULT_OPTIONS).getResult();
System.out.println(result);
result = expressRunner.execute(express, context, QLOptions.builder().precise(true).build()).getResult();
System.out.println(result);
String[] names = expressRunner.getOutVarNames(express);
for(String s:names){
// String[] names = expressRunner.getOutVarNames(express);
Set<String> outVarNames = expressRunner.getOutVarNames(express);
for(String s: outVarNames){
System.out.println("var : " + s);
}
}