From 7b1c5fe622cb1b88591d076a7839dea16d3fcb90 Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Fri, 23 May 2025 15:54:52 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E6=89=B9=E9=87=8F=E5=AF=BC=E5=87=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/api/domain/SysFileInfo.java | 1 + .../core/web/page/GenericsTableDataInfo.java | 1 - .../microservices-modules-pms/pom.xml | 12 + .../service/IPmsProductModuleService.java | 9 + .../impl/PmsProductModuleServiceImpl.java | 59 +- .../PmsProjectTestcaseController.java | 16 + .../project/domain/PmsProjectTestcase.java | 28 +- .../domain/vo/PendingOutputDataVo.java | 68 ++ .../domain/vo/PmsProjectTestcaseDetailVo.java | 22 + .../domain/vo/PmsProjectTestcaseInputVo.java | 21 + .../domain/vo/PmsProjectTestcaseStepVo.java | 17 + .../domain/vo/PmsProjectTestcaseUpdateVo.java | 21 + .../domain/vo/PmsProjectTestcaseVo.java | 39 + .../mapper/PmsProjectTestcaseMapper.java | 10 + .../mapper/PmsProjectTestcaseStepMapper.java | 8 + .../service/IPmsProjectTestcaseService.java | 12 + .../impl/PmsProjectTestcaseServiceImpl.java | 691 +++++++++++++++++- .../mapper/pms/PmsProjectTestcaseMapper.xml | 47 +- .../pms/PmsProjectTestcaseStepMapper.xml | 10 + 19 files changed, 1063 insertions(+), 29 deletions(-) create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PendingOutputDataVo.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseStepVo.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java diff --git a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/domain/SysFileInfo.java b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/domain/SysFileInfo.java index 2bea71571..9e5be2192 100644 --- a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/domain/SysFileInfo.java +++ b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/domain/SysFileInfo.java @@ -6,6 +6,7 @@ import com.microservices.common.core.web.domain.BaseEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; + import java.io.File; /** diff --git a/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/web/page/GenericsTableDataInfo.java b/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/web/page/GenericsTableDataInfo.java index 2c3d20621..207a9bdc7 100644 --- a/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/web/page/GenericsTableDataInfo.java +++ b/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/web/page/GenericsTableDataInfo.java @@ -88,7 +88,6 @@ public class GenericsTableDataInfo implements Serializable { this.code = HttpStatus.SUCCESS; this.msg = "查询成功"; } - /** * 分页 * diff --git a/microservices-modules/microservices-modules-pms/pom.xml b/microservices-modules/microservices-modules-pms/pom.xml index 041a97b79..33d86dfc1 100644 --- a/microservices-modules/microservices-modules-pms/pom.xml +++ b/microservices-modules/microservices-modules-pms/pom.xml @@ -121,6 +121,12 @@ httpclient 4.5.14 + + + + + + com.hankcs @@ -139,6 +145,12 @@ 0.4.8 compile + + + + + + diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductModuleService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductModuleService.java index 0493a6628..cdb39e1e7 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductModuleService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/IPmsProductModuleService.java @@ -67,6 +67,15 @@ public interface IPmsProductModuleService */ List selectPmsProductModuleTreeList(PmsProductModule pmsProductModule, int type); + /** + * 构建模块的树状结构 + * + * @param projectid 模块搜索条件 + * @param type 模块类型(1产品模块 2测试用例模块, 3测试单,实际取测试用例模块) + * @return 模块树状结构 + */ + List getPmsProductModuleTreeList(Long projectid, int type); + /** * 查询模块及模块子级ID列表 * @param parentModuleId 父级模块ID diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductModuleServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductModuleServiceImpl.java index 69699d590..d6791cc77 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductModuleServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductModuleServiceImpl.java @@ -303,7 +303,7 @@ public class PmsProductModuleServiceImpl implements IPmsProductModuleService // 设置各节点数量为测试单执行用例数量 moduleList.forEach(x -> x.setNodeDataCount(x.getTestsheetCasesCount())); // 排除0测试单执行用例数据 -// moduleList = moduleList.stream().filter(e -> e.getTestsheetCasesCount() > 0).collect(Collectors.toList()); + moduleList = moduleList.stream().filter(e -> e.getTestsheetCasesCount() > 0).collect(Collectors.toList()); // 计算全部测试单数量 PmsProjectTestsheetCases pmsProjectTestsheetCases = new PmsProjectTestsheetCases(); pmsProjectTestsheetCases.setProjectTestsheetId(Long.valueOf(pmsProductModule.getParams().get("projectTestsheetId").toString())); @@ -351,6 +351,63 @@ public class PmsProductModuleServiceImpl implements IPmsProductModuleService return buildModuleTreeSelect(moduleList); } + @Override + public List getPmsProductModuleTreeList(Long projectId, int type) { + List moduleList; + PmsProductModule pmsProductModule = new PmsProductModule(); + pmsProductModule.setPmsProjectId(projectId); + //模块类型(1产品模块 2测试用例模块, 3测试单,实际取测试用例模块) + if (PmsConstants.TESTSHEET_TAG_AND_MODULE_TYPE.equals(type)) { + pmsProductModule.setType(PmsConstants.TESTCASE_TAG_AND_MODULE_TYPE); + moduleList = pmsProductModuleMapper.selectPmsProductModuleForTestsheetList(pmsProductModule); + } else { + pmsProductModule.setType(type); + moduleList = pmsProductModuleMapper.selectPmsProductModuleList(pmsProductModule); + } + + Integer allNodeDataCount; + Integer noModuleNodeDataCount; + String allNodeName = "全部模块"; + if (type == PmsConstants.PRODUCT_TAG_AND_MODULE_TYPE) { + // 设置各节点数量为需求数量 + moduleList.forEach(x -> x.setNodeDataCount(x.getRequirementCount())); + + + } else if (type == PmsConstants.TESTSHEET_TAG_AND_MODULE_TYPE) { + // 设置各节点数量为测试单执行用例数量 + moduleList.forEach(x -> x.setNodeDataCount(x.getTestsheetCasesCount())); + // 排除0测试单执行用例数据 + moduleList = moduleList.stream().filter(e -> e.getTestsheetCasesCount() > 0).collect(Collectors.toList()); + } else { + // 设置各节点数量为测试用例数量 + moduleList.forEach(x -> x.setNodeDataCount(x.getTestCaseCount())); + } + // 父级需求数需包含子级需求数 + aggregateCounts(moduleList, 0L); + + // 构建顶级模块(全部需求) + PmsProductModule allPmsProductModule=new PmsProductModule(); + allPmsProductModule.setPmsProductIdentifier(pmsProductModule.getPmsProductIdentifier()); + allPmsProductModule.setId(0L); + allPmsProductModule.setModuleName(allNodeName); + allPmsProductModule.setIsFixedModule(true); + moduleList.add(allPmsProductModule); + // 模块根据id排序 + moduleList = moduleList.stream() + .sorted(Comparator.comparing(PmsProductModule::getId)) + .sorted(Comparator.comparing(PmsProductModule::getIsFixedModule)) + .collect(Collectors.toList()); + // 构建无所属模块 + PmsProductModule noPmsProductModule = new PmsProductModule(); + noPmsProductModule.setPmsProductIdentifier(pmsProductModule.getPmsProductIdentifier()); + noPmsProductModule.setId(-1L); + noPmsProductModule.setModuleName(NO_MODULE(type)); + noPmsProductModule.setParentId(0L); + noPmsProductModule.setIsFixedModule(true); + moduleList.add(noPmsProductModule); + return buildModuleTreeSelect(moduleList); + } + @Override public List selectChildrenPmsProductModuleIdList(Long parentModuleId) { List pmsProductModuleList=new ArrayList<>(); diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectTestcaseController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectTestcaseController.java index 751038176..a15d8e82f 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectTestcaseController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectTestcaseController.java @@ -9,15 +9,19 @@ import com.microservices.common.log.annotation.Log; import com.microservices.common.log.enums.BusinessType; import com.microservices.common.security.annotation.Logical; import com.microservices.common.security.annotation.RequiresPermissions; +import com.microservices.pms.product.domain.vo.TreeSelect; import com.microservices.pms.product.service.IPmsProductModuleService; import com.microservices.pms.project.domain.PmsProjectTestcase; import com.microservices.pms.project.domain.vo.*; import com.microservices.pms.project.service.IPmsProjectTestcaseService; +import com.microservices.pms.utils.PmsConstants; import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.io.IOException; import java.util.List; /** @@ -132,4 +136,16 @@ public class PmsProjectTestcaseController extends BaseController { @RequestBody JSONObject batchUpdateVo) { return toAjax(pmsProjectTestcaseService.batchUpdatePmsProjectTestcase(batchUpdateVo)); } + + /** + * 批量下载测试用例 + */ + @ApiOperation(value = "批量下载测试用例") + @GetMapping("/data/{projectId}/download") + public ResponseEntity download(@PathVariable("projectId") Long projectId)throws IOException { + PmsProjectTestcaseModuleSearchVo pmsProjectTestcaseModuleSearchVo = new PmsProjectTestcaseModuleSearchVo(); + pmsProjectTestcaseModuleSearchVo.setPmsProjectId(projectId); + List treeSelects = pmsProductModuleService.getPmsProductModuleTreeList(projectId, PmsConstants.TESTCASE_TAG_AND_MODULE_TYPE); + return pmsProjectTestcaseService.generateWord(treeSelects, projectId); + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java index 5cc54fc38..6bec1d1ba 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java @@ -125,23 +125,29 @@ public class PmsProjectTestcase extends BaseEntity { @ApiModelProperty(value = "测试步骤列表") private List testcaseStepList; - /** - * 预留字段1 - */ - @JsonIgnore - private String reservedField1; +// /** +// * 预留字段1 +// */ +// @JsonIgnore +// private String reservedField1; /** - * 预留字段2 + * 测试用例描述 */ - @JsonIgnore - private String reservedField2; + @ApiModelProperty(value = "测试用例描述") + private String description; /** - * 预留字段3 + * 测试方法 */ - @JsonIgnore - private String reservedField3; + @ApiModelProperty(value = "测试方法") + private String testMethod; + + /** + * 测试终止条件 + */ + @ApiModelProperty(value = "测试终止条件") + private String terminationConditions; @ApiModelProperty(value = "测试用例标识") private String identifier; diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PendingOutputDataVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PendingOutputDataVo.java new file mode 100644 index 000000000..d3b39ecb7 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PendingOutputDataVo.java @@ -0,0 +1,68 @@ +package com.microservices.pms.project.domain.vo; + +import lombok.Data; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +@Data +public class PendingOutputDataVo { + private Long id; + + private Long pms_projiect_id; + + private String title; + + private Long type_id; + + private String tag_ids; + + private List content_list; + + private List expected_result; + + private String update_by; + + private LocalDate update_time; + + private String create_by; + + private LocalDate create_time; + + private String test_type; + + private String description; + + private String test_method; + + private String termination_conditions; + + private String identifier; + + private String preconditions; + + + + public PendingOutputDataVo() { + content_list = new ArrayList<>(); + expected_result = new ArrayList<>(); + } + + // 添加元素的方法 + public void addToContent(String item) { + content_list.add(item); + } + + public void addToExpected(String item) { + expected_result.add(item); + } + + public void addContent(String item) { + this.content_list.add(item); + } + + public void addExpected(String item) { + this.expected_result.add(item); + } +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseDetailVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseDetailVo.java index 1cbff13b7..14b6d6738 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseDetailVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseDetailVo.java @@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.Size; import java.util.List; /** @@ -35,6 +36,27 @@ public class PmsProjectTestcaseDetailVo extends PmsProjectTestcaseDataVo { @ApiModelProperty(value = "备注") private String remark; + /** + * 测试用例描述 + */ + @ApiModelProperty(value = "测试用例描述") + @Size(max = 500, message = "长度需要小于500") + private String description; + + /** + * 测试方法 + */ + @ApiModelProperty(value = "测试方法") + @Size(max = 255, message = "长度需要小于255") + private String testMethod; + + /** + * 测试终止条件 + */ + @ApiModelProperty(value = "测试终止条件") + @Size(max = 500, message = "长度需要小于500") + private String terminationConditions; + /** * 测试步骤列表 */ diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseInputVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseInputVo.java index 05aa4ab44..4b0a4b3c6 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseInputVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseInputVo.java @@ -84,6 +84,27 @@ public class PmsProjectTestcaseInputVo { @Size(max = 500, message = "长度需要小于500") private String remark; + /** + * 测试用例描述 + */ + @ApiModelProperty(value = "测试用例描述") + @Size(max = 500, message = "长度需要小于500") + private String description; + + /** + * 测试方法 + */ + @ApiModelProperty(value = "测试方法") + @Size(max = 255, message = "长度需要小于255") + private String testMethod; + + /** + * 测试终止条件 + */ + @ApiModelProperty(value = "测试终止条件") + @Size(max = 500, message = "长度需要小于500") + private String terminationConditions; + /** * 测试步骤列表 */ diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseStepVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseStepVo.java new file mode 100644 index 000000000..4d04e4666 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseStepVo.java @@ -0,0 +1,17 @@ +package com.microservices.pms.project.domain.vo; + +import lombok.Data; + +@Data +public class PmsProjectTestcaseStepVo { + private Long index; + + private String content; + + private String expectedResult; + + private String updateBy; + + private String createBy; + +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseUpdateVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseUpdateVo.java index f6f8ed78b..b1837ac5f 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseUpdateVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseUpdateVo.java @@ -80,6 +80,27 @@ public class PmsProjectTestcaseUpdateVo { @Size(max = 500, message = "长度需要小于500") private String remark; + /** + * 测试用例描述 + */ + @ApiModelProperty(value = "测试用例描述") + @Size(max = 500, message = "长度需要小于500") + private String description; + + /** + * 测试方法 + */ + @ApiModelProperty(value = "测试方法") + @Size(max = 255, message = "长度需要小于255") + private String testMethod; + + /** + * 测试终止条件 + */ + @ApiModelProperty(value = "测试终止条件") + @Size(max = 500, message = "长度需要小于500") + private String terminationConditions; + /** * 测试步骤列表 */ diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java new file mode 100644 index 000000000..3d8900a55 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java @@ -0,0 +1,39 @@ +package com.microservices.pms.project.domain.vo; + +import lombok.Data; + +import java.time.LocalDate; +import java.util.Date; + +@Data +public class PmsProjectTestcaseVo { + private Long id; + + private Long pmsProjiectId; + + private String title; + + private Long typeId; + + private String tagIds; + + private Long pmsModuleId; + + private LocalDate updateTime; + + private String updateBy; + + private LocalDate createTime; + + private String createBy; + + private String preconditions; + + private String description; + + private String testMethod; + + private String terminationConditions; + + private String identifier; +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseMapper.java index f5549ae80..78ae95257 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseMapper.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseMapper.java @@ -2,6 +2,8 @@ package com.microservices.pms.project.mapper; import com.microservices.pms.project.domain.PmsProjectTestcase; import com.microservices.pms.project.domain.vo.PmsProjectTestcaseBatchUpdateVo; +import com.microservices.pms.project.domain.vo.PmsProjectTestcaseStepVo; +import com.microservices.pms.project.domain.vo.PmsProjectTestcaseVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -112,4 +114,12 @@ public interface PmsProjectTestcaseMapper { List selectProjectIdListInTestcaseIdList(@Param("idList") List idList); int deletePmsProjectTestcaseByProjectId(@Param("projectId") Long projectId); + + /** + * 获取testcasevo中部分字段 + * + * @param pms_project_id 关联的项目号 + */ + public List getTestcase(Long pms_project_id); + } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseStepMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseStepMapper.java index 8f7b74815..13a48ab27 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseStepMapper.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseStepMapper.java @@ -1,6 +1,7 @@ package com.microservices.pms.project.mapper; import com.microservices.pms.project.domain.PmsProjectTestcaseStep; +import com.microservices.pms.project.domain.vo.PmsProjectTestcaseStepVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -77,4 +78,11 @@ public interface PmsProjectTestcaseStepMapper { * @return 操作步骤 */ PmsProjectTestcaseStep selectPmsProjectTestcaseStepByIndexAndTestcaseId(@Param("index") Long index, @Param("testcaseId") Long testcaseId); + + /** + * 获取testCaseStepvo中部分字段 + * + * @param PmsProjectTestcase_id 关联的测试用例号 + */ + public List getTestcaseStep(Long PmsProjectTestcase_id); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectTestcaseService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectTestcaseService.java index 052fca224..c094e91bd 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectTestcaseService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectTestcaseService.java @@ -3,10 +3,13 @@ package com.microservices.pms.project.service; import com.alibaba.fastjson2.JSONObject; import com.microservices.common.core.web.page.GenericsTableDataInfo; import com.microservices.pms.product.domain.vo.ProductReqSpecsAssociatedTestcaseDataVo; +import com.microservices.pms.product.domain.vo.TreeSelect; import com.microservices.pms.project.domain.PmsProjectTestcase; import com.microservices.pms.project.domain.vo.PmsProjectTestcaseDataVo; import com.microservices.pms.project.domain.vo.PmsProjectTestcaseDetailVo; +import org.springframework.http.ResponseEntity; +import java.io.IOException; import java.util.List; /** @@ -118,4 +121,13 @@ public interface IPmsProjectTestcaseService { List selectReqSpecsAssociatedTestcaseList(Long reqSpecsId); PmsProjectTestcase copyPmsProjectTestcase(Long testcaseId); + + /** + * 获取测试用例列表 + * + * @param treeSelects 模块树结构 + * @param projectId 项目id + * @return 导出word数据流 + */ + ResponseEntity generateWord(List treeSelects, Long projectId)throws IOException; } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java index 18d6a4072..d8a7eacdf 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java @@ -15,15 +15,14 @@ import com.microservices.pms.product.domain.PmsProductModule; import com.microservices.pms.product.domain.PmsProductRequirement; import com.microservices.pms.product.domain.enums.ProductReqStatus; import com.microservices.pms.product.domain.vo.ProductReqSpecsAssociatedTestcaseDataVo; +import com.microservices.pms.product.domain.vo.TreeSelect; import com.microservices.pms.product.service.IPmsProductModuleService; import com.microservices.pms.product.service.IPmsProductRequirementService; import com.microservices.pms.product.service.IPmsProductRequirementTagService; import com.microservices.pms.project.domain.*; -import com.microservices.pms.project.domain.vo.PmsProjectTestcaseBatchUpdateVo; -import com.microservices.pms.project.domain.vo.PmsProjectTestcaseDataVo; -import com.microservices.pms.project.domain.vo.PmsProjectTestcaseDetailVo; -import com.microservices.pms.project.domain.vo.PmsProjectTestcaseStepDataVo; +import com.microservices.pms.project.domain.vo.*; import com.microservices.pms.project.mapper.PmsProjectTestcaseMapper; +import com.microservices.pms.project.mapper.PmsProjectTestcaseStepMapper; import com.microservices.pms.project.mapper.PmsProjectTestsheetCasesMapper; import com.microservices.pms.project.service.IPmsProjectService; import com.microservices.pms.project.service.IPmsProjectTestcaseService; @@ -32,12 +31,23 @@ import com.microservices.pms.project.service.IPmsProjectTestcaseTypeService; import com.microservices.pms.utils.PmsConstants; import com.microservices.pms.utils.PmsUtils; import com.microservices.system.api.domain.SysUser; +import org.apache.poi.xwpf.usermodel.*; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Stack; import java.util.stream.Collectors; import static com.microservices.common.core.utils.PageUtils.startPage; @@ -70,6 +80,8 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService private PmsProjectTestsheetCasesMapper pmsProjectTestsheetCasesMapper; @Autowired private IPmsProductRequirementService pmsProductRequirementService; + @Autowired + private PmsProjectTestcaseStepMapper pmsProjectTestcaseStepMappe; /** * 查询测试用例管理 @@ -168,6 +180,9 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService PmsProjectTestcaseDetailVo pmsProjectTestcaseDetailVo = pmsProjectTestcaseDataVo.toPmsProjectTestcaseDetailVo(); pmsProjectTestcaseDetailVo.setPreconditions(pmsProjectTestcase.getPreconditions()); pmsProjectTestcaseDetailVo.setRemark(pmsProjectTestcase.getRemark()); + pmsProjectTestcaseDetailVo.setDescription(pmsProjectTestcase.getDescription()); + pmsProjectTestcaseDetailVo.setTestMethod(pmsProjectTestcase.getTestMethod()); + pmsProjectTestcaseDetailVo.setTerminationConditions(pmsProjectTestcase.getTerminationConditions()); // 设置测试步骤列表 PmsProjectTestcaseStep pmsProjectTestcaseStepSearch = new PmsProjectTestcaseStep(); pmsProjectTestcaseStepSearch.setPmsTestcaseId(pmsProjectTestcase.getId()); @@ -493,4 +508,672 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService } } + + //测试用例导出相关 + /** + * 从数据库osredem-microservices,表pms_project_testcase中获取测试用例信息存到集合中 + * + * @param item 项目id + **/ + public List getTestcase(Long item) { + return pmsProjectTestcaseMapper.getTestcase(item); + } + + /** + * 从数据库osredem-microservices,表pms_project_testcase_step中获取测试步骤信息存到集合中 + * + * @param item 表pms_project_testcase中index + **/ + public List getTestcaseStep(Long item) { + return pmsProjectTestcaseStepMappe.getTestcaseStep(item); + } + + private String typeIdtoSting(Long typeId) { + if (typeId == null) { + return "未知类型"; // 或抛出明确的异常 + } + if (typeId == 1) { + return "功能测试"; + } else if (typeId == 2) { + return "性能测试"; + } else if (typeId == 3) { + return "接口测试"; + } else if (typeId == 4) { + return "安装部署"; + } else if (typeId == 5) { + return "安全相关"; + } else if (typeId == 6) { + return "配置相关"; + } else if (typeId == 7) { + return "其他"; + } + return "未知类型"; + } + /** + * 将项目id下所有测试用例信息存到集合中 + * + * @param item 项目id + **/ + public List GetPendingOutputData(Long item, Long moduleId) { + List outputDatas = new ArrayList(); + // 数据库中信息类存到testcases集合中 + List testcases = getTestcase(item); + + for (PmsProjectTestcaseVo testcase : testcases) { + if (testcase.getPmsModuleId() == moduleId) { + List steps = getTestcaseStep(testcase.getId()); + PendingOutputDataVo pendingOutputData = new PendingOutputDataVo(); + pendingOutputData.setId(testcase.getId()); + pendingOutputData.setTitle(testcase.getTitle()); + pendingOutputData.setTag_ids(testcase.getTagIds()); + pendingOutputData.setTest_type(typeIdtoSting(testcase.getTypeId())); + pendingOutputData.setTitle(testcase.getTitle()); + pendingOutputData.setPreconditions(testcase.getPreconditions()); + pendingOutputData.setUpdate_by(testcase.getUpdateBy()); + pendingOutputData.setUpdate_time(testcase.getUpdateTime()); + pendingOutputData.setCreate_by(testcase.getCreateBy()); + pendingOutputData.setCreate_time(testcase.getCreateTime()); + pendingOutputData.setDescription(testcase.getDescription()); + pendingOutputData.setTest_method(testcase.getTestMethod()); + pendingOutputData.setTermination_conditions(testcase.getTerminationConditions()); + pendingOutputData.setIdentifier(testcase.getIdentifier()); + if (steps != null) { + for (PmsProjectTestcaseStepVo step : steps) { + pendingOutputData.addContent(step.getContent()); + pendingOutputData.addExpected(step.getExpectedResult()); + } + } + outputDatas.add(pendingOutputData); + } + } + return outputDatas; + } + + + /** + * 水平合并单元格(跨列合并) + * + * @param wordExtractor 表格对象 + * @param indentation 缩进值 1cm = 567 + * @param text 写入单元格字符串 + * @param isCenter 表格中段落是否居中 + * @param isBold 表格中段落是否加租 + */ + private void autoWrap(XWPFTableCell wordExtractor, Integer indentation, String text, boolean isCenter, boolean isBold) { + XWPFParagraph paragraph = wordExtractor.getParagraphs().get(0); + // 设置单元格文本垂直居中 + CTTcPr tcPr = wordExtractor.getCTTc().addNewTcPr(); + CTVerticalJc va = tcPr.addNewVAlign(); + va.setVal(STVerticalJc.CENTER); + // 设置段前段后间距 + CTP ctp = paragraph.getCTP(); + CTPPr pPr = ctp.isSetPPr() ? ctp.getPPr() : ctp.addNewPPr(); + CTSpacing spacing = pPr.isSetSpacing() ? pPr.getSpacing() : pPr.addNewSpacing(); + spacing.setBefore(BigInteger.valueOf(0)); // 段前间距 + spacing.setAfter(BigInteger.valueOf(0)); + //设置居中 + if (isCenter) { + paragraph.setAlignment(ParagraphAlignment.CENTER); + } + // 设置缩进 + CTInd ind = pPr.isSetInd() ? pPr.getInd() : pPr.addNewInd(); + ind.setLeft(BigInteger.valueOf(indentation)); // 1cm = 567 + // 设置自动换行 + CTPPr pPr2 = paragraph.getCTP().addNewPPr(); + CTSpacing spacing2 = pPr2.addNewSpacing(); + spacing2.setLineRule(STLineSpacingRule.AUTO); + // 设置字体样式 + XWPFRun run = paragraph.createRun(); + run.setText(text);//填写单元格内容 + //设置字体为五号 10.5*2 + CTRPr rPr = run.getCTR().isSetRPr() ? run.getCTR().getRPr() : run.getCTR().addNewRPr(); + rPr.addNewSz().setVal(BigInteger.valueOf(21)); + rPr.addNewSzCs().setVal(BigInteger.valueOf(21)); + // 字体样式 + run.setFontFamily("Times New Roman"); + run.setFontFamily("宋体", XWPFRun.FontCharRange.eastAsia); + run.setBold(isBold); // 是否加粗 + } + + /** + * 水平合并单元格(跨列合并) + * + * @param table 表格对象 + * @param row 行索引 + * @param startCol 起始列索引 + * @param endCol 结束列索引 + */ + private static void mergeCellsHorizontally(XWPFTable table, int row, int startCol, int endCol) { + for (int cellIndex = startCol; cellIndex <= endCol; cellIndex++) { + XWPFTableCell cell = table.getRow(row).getCell(cellIndex); + if (cellIndex == startCol) { + // 第一个单元格设置合并范围 + cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART); + } else { + // 后续单元格标记为继续合并 + cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE); + } + } + } + + /** + * 隐藏表格的最后一行 + * + * @param xwpfTabletable 表格对象 + */ + private void hideTableRow(XWPFTable xwpfTabletable) { + XWPFTableRow templateRow = xwpfTabletable.getRow(xwpfTabletable.getNumberOfRows()-1); // 使用最后一行作为模板 + CTTrPr trPr = templateRow.getCtRow().isSetTrPr() ? templateRow.getCtRow().getTrPr() : templateRow.getCtRow().addNewTrPr(); + trPr.addNewHidden();//.setVal("on"); // 隐藏模板行 + + //隐藏行中段落 + for (XWPFTableCell cell : templateRow.getTableCells()) { + for (XWPFParagraph paragraph : cell.getParagraphs()) { + CTPPr pPr = paragraph.getCTP().isSetPPr() ? + paragraph.getCTP().getPPr() : + paragraph.getCTP().addNewPPr(); + pPr.addNewRPr().addNewVanish();//.setVal("on"); + } + } + } + + + /** + * 设置表格边框格式 + * + * @param xwpfTabletable 表格对象 + */ + private void setTableBorders(XWPFTable xwpfTabletable) { + CTTblPr tblPr = xwpfTabletable.getCTTbl().getTblPr(); + CTTblBorders borders = tblPr.isSetTblBorders() ? tblPr.getTblBorders() : tblPr.addNewTblBorders(); + + // 设置上边框 + CTBorder top = borders.isSetTop() ? borders.getTop() : borders.addNewTop(); + top.setVal(STBorder.SINGLE); // 边框类型:单线 + top.setSz(BigInteger.valueOf(12)); // 边框大小:8 = 1pt + top.setColor("000000"); // 边框颜色:黑色 + + // 设置下边框 + CTBorder bottom = borders.isSetBottom() ? borders.getBottom() : borders.addNewBottom(); + bottom.setVal(STBorder.SINGLE); + bottom.setSz(BigInteger.valueOf(6)); + bottom.setColor("000000"); + + // 设置左边框 + CTBorder left = borders.isSetLeft() ? borders.getLeft() : borders.addNewLeft(); + left.setVal(STBorder.SINGLE); + left.setSz(BigInteger.valueOf(12)); + left.setColor("000000"); + + // 设置右边框 + CTBorder right = borders.isSetRight() ? borders.getRight() : borders.addNewRight(); + right.setVal(STBorder.SINGLE); + right.setSz(BigInteger.valueOf(12)); + right.setColor("000000"); + + // 设置内部水平边框 + CTBorder insideH = borders.isSetInsideH() ? borders.getInsideH() : borders.addNewInsideH(); + insideH.setVal(STBorder.SINGLE); + insideH.setSz(BigInteger.valueOf(6)); // 比外边框细一些 + insideH.setColor("000000"); + + // 设置内部垂直边框 + CTBorder insideV = borders.isSetInsideV() ? borders.getInsideV() : borders.addNewInsideV(); + insideV.setVal(STBorder.SINGLE); + insideV.setSz(BigInteger.valueOf(6)); + insideV.setColor("000000"); + } + + private void fillTbale(XWPFTable xwpfTable, PendingOutputDataVo pendingOutputData) { + for (XWPFTableRow row : xwpfTable.getRows()) { + // 遍历行中的每个单元格 + for (XWPFTableCell cell : row.getTableCells()) { + XWPFParagraph paragraph = cell.getParagraphs().get(0); + // 设置单元格文本垂直居中 + CTTcPr tcPr = cell.getCTTc().addNewTcPr(); + CTVerticalJc va = tcPr.addNewVAlign(); + va.setVal(STVerticalJc.CENTER); + // 设置段前段后间距 + CTP ctp = paragraph.getCTP(); + CTPPr pPr = ctp.isSetPPr() ? ctp.getPPr() : ctp.addNewPPr(); + CTSpacing spacing = pPr.isSetSpacing() ? pPr.getSpacing() : pPr.addNewSpacing(); + spacing.setBefore(BigInteger.valueOf(0)); // 段前间距 + spacing.setAfter(BigInteger.valueOf(0)); + } + } + //固定文本部分 + autoWrap(xwpfTable.getRow(0).getCell(0), 125,"测试用例名称",false,true); + autoWrap(xwpfTable.getRow(1).getCell(0), 125,"测试用例标识",false,true); + autoWrap(xwpfTable.getRow(1).getCell(5), 125,"测试追踪",false,true); + autoWrap(xwpfTable.getRow(2).getCell(0), 125,"测试用例描述",false,true); + autoWrap(xwpfTable.getRow(3).getCell(0), 125,"测试方法",false,true); + autoWrap(xwpfTable.getRow(4).getCell(0), 125,"测试类型",false,true); + autoWrap(xwpfTable.getRow(5).getCell(0), 62,"前提和约束(包括初始化要求)",false,true); + autoWrap(xwpfTable.getRow(6).getCell(0), 125,"测试终止条件",false,true); + autoWrap(xwpfTable.getRow(7).getCell(0), 125,"测试过程",true,true); + autoWrap(xwpfTable.getRow(8).getCell(0), 125,"序号",false,true); + autoWrap(xwpfTable.getRow(8).getCell(1), 125,"输入及操作步骤",true,true); + autoWrap(xwpfTable.getRow(8).getCell(4), 125,"期望测试结果",true,true); + autoWrap(xwpfTable.getRow(8).getCell(6), 125,"评估准则",true,true); + autoWrap(xwpfTable.getRow(8).getCell(8), 125,"实际测试结果",true,true); + autoWrap(xwpfTable.getRow(xwpfTable.getNumberOfRows() - 4).getCell(0), 62,"设计人员",false,true); + autoWrap(xwpfTable.getRow(xwpfTable.getNumberOfRows() - 4).getCell(4), 62,"设计日期",false,true); + autoWrap(xwpfTable.getRow(xwpfTable.getNumberOfRows() - 3).getCell(0), 62,"测试人员",false,true); + autoWrap(xwpfTable.getRow(xwpfTable.getNumberOfRows() - 3).getCell(4), 62,"测试执行时间",false,true); + autoWrap(xwpfTable.getRow(xwpfTable.getNumberOfRows() - 2).getCell(0), 62,"执行结果",false,true); + + //需要通过调取数据库中信息填入部分 + autoWrap(xwpfTable.getRow(0).getCell(3), 62,pendingOutputData.getTitle(),false,false); + autoWrap(xwpfTable.getRow(1).getCell(3), 62,pendingOutputData.getIdentifier(),false,false); + autoWrap(xwpfTable.getRow(2).getCell(3), 62,pendingOutputData.getDescription(),false,false); + autoWrap(xwpfTable.getRow(3).getCell(3), 62,pendingOutputData.getTest_method(),false,false); + autoWrap(xwpfTable.getRow(4).getCell(3), 62,pendingOutputData.getTest_type(),false,false); + autoWrap(xwpfTable.getRow(5).getCell(3), 62,pendingOutputData.getPreconditions(),false,false); + autoWrap(xwpfTable.getRow(6).getCell(3), 62,pendingOutputData.getTermination_conditions(),false,false); + List content = pendingOutputData.getContent_list(); + List expected = pendingOutputData.getExpected_result(); + int i; + for(i = 0;i columnWidths = new ArrayList<>(); + columnWidths.add("7.6%"); + columnWidths.add("11%"); + columnWidths.add("4.8%"); + columnWidths.add("11.1%"); + columnWidths.add("19.8%"); + columnWidths.add("7.3%"); + columnWidths.add("9%"); + columnWidths.add("9.1%"); + columnWidths.add("20.1%"); + + XWPFTableRow firstRow = table.getRow(0); + for (int rowIndex = 0; rowIndex < table.getNumberOfRows(); rowIndex++) { + XWPFTableRow row = table.getRow(rowIndex); + for (int colIndex = 0; colIndex < columnWidths.size(); colIndex++) { + row.getCell(colIndex).setWidth(columnWidths.get(colIndex)); + } + } + + // 生成模板第1行(通过合并方式) + mergeCellsHorizontally(table, 0, 0, 2); + mergeCellsHorizontally(table, 0, 3, 8); + // 生成模板第2行(通过合并方式) + mergeCellsHorizontally(table, 1, 0, 2); + mergeCellsHorizontally(table, 1, 3, 4); + mergeCellsHorizontally(table, 1, 5, 6); + mergeCellsHorizontally(table, 1, 7, 8); + // 生成模板第3行(通过合并方式) + mergeCellsHorizontally(table, 2, 0, 2); + mergeCellsHorizontally(table, 2, 3, 8); + // 生成模板第4行(通过合并方式) + mergeCellsHorizontally(table, 3, 0, 2); + mergeCellsHorizontally(table, 3, 3, 8); + // 生成模板第5行(通过合并方式) + mergeCellsHorizontally(table, 4, 0, 2); + mergeCellsHorizontally(table, 4, 3, 8); + // 生成模板第6行(通过合并方式) + mergeCellsHorizontally(table, 5, 0, 2); + mergeCellsHorizontally(table, 5, 3, 8); + // 生成模板第7行(通过合并方式) + mergeCellsHorizontally(table, 6, 0, 2); + mergeCellsHorizontally(table, 6, 3, 8); + // 生成模板第8行(通过合并方式) + mergeCellsHorizontally(table, 7, 0, 8); + // 生成模板第9行(通过合并方式) + mergeCellsHorizontally(table, 8, 1, 3); + mergeCellsHorizontally(table, 8, 4, 5); + mergeCellsHorizontally(table, 8, 6, 7); + // 生成模板操作步骤 + for (int stepRowIndex = 0; stepRowIndex < stepNumber; stepRowIndex++) { + mergeCellsHorizontally(table, stepRowIndex + 9, 1, 3); + mergeCellsHorizontally(table, stepRowIndex + 9, 4, 5); + mergeCellsHorizontally(table, stepRowIndex + 9, 6, 7); + } + //生成模版倒数第三行 + mergeCellsHorizontally(table, table.getNumberOfRows() - 4, 0, 1); + mergeCellsHorizontally(table, table.getNumberOfRows() - 4, 2, 3); + mergeCellsHorizontally(table, table.getNumberOfRows() - 4, 4, 5); + mergeCellsHorizontally(table, table.getNumberOfRows() - 4, 6, 8); + //生成模版倒数第二行 + mergeCellsHorizontally(table, table.getNumberOfRows() - 3, 0, 1); + mergeCellsHorizontally(table, table.getNumberOfRows() - 3, 2, 3); + mergeCellsHorizontally(table, table.getNumberOfRows() - 3, 4, 5); + mergeCellsHorizontally(table, table.getNumberOfRows() - 3, 6, 8); + //生成模版倒数第一行 + mergeCellsHorizontally(table, table.getNumberOfRows() - 2, 0, 1); + mergeCellsHorizontally(table, table.getNumberOfRows() - 2, 2, 8); + + // 在表格中填值 + fillTbale(table, pendingOutputData); + + } + + + // 添加表格标题(应该是<章节号>-<表格序号>) + private static void addNumberedTableTitle(XWPFDocument doc, String titleText, int chapter, int tableCount) { + XWPFParagraph titleParagraph = doc.createParagraph(); + titleParagraph.setAlignment(ParagraphAlignment.CENTER); + XWPFRun run = titleParagraph.createRun(); + run.setText("表"); + //run.setText("表 " + chapter + "-" + tableNumber); +// run.setText("表 " + titleText); +// // 设置标题样式 + run.setFontFamily("Times New Roman"); + run.setFontFamily("宋体", XWPFRun.FontCharRange.eastAsia); + run.setFontSize(12); + + // 创建域开始字符 + XWPFRun startRun = titleParagraph.createRun(); + CTFldChar startFldChar = startRun.getCTR().addNewFldChar(); + startFldChar.setFldCharType(STFldCharType.BEGIN); + + // 创建域代码 + XWPFRun codeRun = titleParagraph.createRun(); + String domainCode = " SEQ Table \\* ARABIC \\s " + chapter; + codeRun.setText(domainCode); + codeRun.setFontSize(12); // 设置字体大小,可根据需要调整 + codeRun.setFontFamily("Times New Roman"); + codeRun.setFontFamily("宋体", XWPFRun.FontCharRange.eastAsia); + + // 创建域分隔字符 + XWPFRun sepRun = titleParagraph.createRun(); + CTFldChar sepFldChar = sepRun.getCTR().addNewFldChar(); + sepFldChar.setFldCharType(STFldCharType.SEPARATE); + + // 创建域结果 + XWPFRun resultRun = titleParagraph.createRun(); + resultRun.setText(chapter + " - " + tableCount); + resultRun.setFontSize(12); // 设置字体大小,可根据需要调整 + resultRun.setFontFamily("Times New Roman"); + resultRun.setFontFamily("宋体", XWPFRun.FontCharRange.eastAsia); + + // 创建域结束字符 + XWPFRun endRun = titleParagraph.createRun(); + CTFldChar endFldChar = endRun.getCTR().addNewFldChar(); + endFldChar.setFldCharType(STFldCharType.END); + + XWPFRun titlerun = titleParagraph.createRun(); + titlerun.setText(titleText); + titlerun.setFontSize(12); // 设置字体大小,可根据需要调整 + titlerun.setFontFamily("Times New Roman"); + titlerun.setFontFamily("宋体", XWPFRun.FontCharRange.eastAsia); + } + + /** + * 创建标题样式 + * @param document 文档 + * @param styleId 样式 ID + * @param styleName 样式名称 + * @param fontSize 字体大小 + */ + private static void createTitleStyle(XWPFDocument document, String styleId, String styleName, int fontSize, int level, BigInteger numId) { + // 获取文档的样式管理器 + XWPFStyles styles = document.createStyles(); + // 创建新的样式 + CTStyle ctStyle = CTStyle.Factory.newInstance(); + ctStyle.setStyleId(styleId); + + CTString styleNameCT = CTString.Factory.newInstance(); + styleNameCT.setVal(styleName); + ctStyle.setName(styleNameCT); + + // 设置样式类型为段落样式 + CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance(); + indentNumber.setVal(BigInteger.valueOf(1)); + ctStyle.setType(STStyleType.PARAGRAPH); + + // 设置字体和字号 + CTPPr ppr = ctStyle.addNewPPr(); + CTSpacing spacing = ppr.addNewSpacing(); + spacing.setAfter(BigInteger.valueOf(0)); + spacing.setLineRule(STLineSpacingRule.AUTO); + + CTDecimalNumber outlineLvl = ppr.addNewOutlineLvl(); + // 根据样式 ID 确定大纲级别 + if ("Heading1".equals(styleId)) { + outlineLvl.setVal(BigInteger.valueOf(0)); + } else if ("Heading2".equals(styleId)) { + outlineLvl.setVal(BigInteger.valueOf(1)); + } else if ("Heading3".equals(styleId)) { + outlineLvl.setVal(BigInteger.valueOf(2)); + } else if ("Heading4".equals(styleId)) { + outlineLvl.setVal(BigInteger.valueOf(3)); + } else if ("Heading5".equals(styleId)) { + outlineLvl.setVal(BigInteger.valueOf(4)); + } + + // 关联编号 + CTNumPr numPr = ppr.addNewNumPr(); + numPr.addNewNumId().setVal(numId); + numPr.addNewIlvl().setVal(BigInteger.valueOf(level - 1)); + + // 设置字体样式 + CTRPr rpr = ctStyle.addNewRPr(); + CTFonts fonts = rpr.addNewRFonts(); + fonts.setEastAsia("宋体"); + fonts.setAscii("Times New Roman"); + fonts.setHAnsi("Times New Roman"); + if(styles.getNumberOfStyles() < 4){ + rpr.addNewSz().setVal(BigInteger.valueOf(fontSize * 2)); + }else{ + rpr.addNewSz().setVal(BigInteger.valueOf(24)); + } + + // 将样式添加到样式管理器中 + styles.addStyle(new XWPFStyle(ctStyle)); + } + + // 创建多级列表编号模板 + private static BigInteger createMultiLevelNumbering(XWPFDocument doc) { + XWPFNumbering numbering = doc.createNumbering(); + // 获取或创建 CTNumbering(POI 4.1.2 兼容方式) + CTNumbering ctNumbering; + try { + Field f = XWPFNumbering.class.getDeclaredField("ctNumbering"); + f.setAccessible(true); + ctNumbering = (CTNumbering) f.get(numbering); + if (ctNumbering == null) { + ctNumbering = CTNumbering.Factory.newInstance(); + f.set(numbering, ctNumbering); + } + } catch (Exception e) { + throw new RuntimeException("无法初始化编号系统", e); + } + + CTAbstractNum abstractNum = CTAbstractNum.Factory.newInstance(); + abstractNum.setAbstractNumId(BigInteger.ZERO); + + // 级别1样式:1. + CTLvl lvl1 = abstractNum.addNewLvl(); + lvl1.setIlvl(BigInteger.ZERO); + lvl1.addNewNumFmt().setVal(STNumberFormat.DECIMAL); + lvl1.addNewLvlText().setVal("%1."); + lvl1.addNewLvlJc().setVal(STJc.LEFT); + lvl1.addNewStart().setVal(BigInteger.ONE); + + // 级别2样式:1.1 + CTLvl lvl2 = abstractNum.addNewLvl(); + lvl2.setIlvl(BigInteger.ONE); + lvl2.addNewNumFmt().setVal(STNumberFormat.DECIMAL); + lvl2.addNewLvlText().setVal("%1.%2."); + lvl2.addNewLvlJc().setVal(STJc.LEFT); + lvl2.addNewStart().setVal(BigInteger.ONE); + + // 级别3样式:1.1.1 + CTLvl lvl3 = abstractNum.addNewLvl(); + lvl3.setIlvl(BigInteger.valueOf(2)); + lvl3.addNewNumFmt().setVal(STNumberFormat.DECIMAL); + lvl3.addNewLvlText().setVal("%1.%2.%3."); + lvl3.addNewLvlJc().setVal(STJc.LEFT); + lvl3.addNewStart().setVal(BigInteger.ONE); + + // 级别4样式:1.1.1.1 + CTLvl lvl4 = abstractNum.addNewLvl(); + lvl4.setIlvl(BigInteger.valueOf(3)); + lvl4.addNewNumFmt().setVal(STNumberFormat.DECIMAL); + lvl4.addNewLvlText().setVal("%1.%2.%3.%4."); + lvl4.addNewLvlJc().setVal(STJc.LEFT); + lvl4.addNewStart().setVal(BigInteger.ONE); + + // 级别5样式:1.1.1.1.1 + CTLvl lvl5 = abstractNum.addNewLvl(); + lvl5.setIlvl(BigInteger.valueOf(4)); + lvl5.addNewNumFmt().setVal(STNumberFormat.DECIMAL); + lvl5.addNewLvlText().setVal("%1.%2.%3.%4.%5."); + lvl5.addNewLvlJc().setVal(STJc.LEFT); + lvl5.addNewStart().setVal(BigInteger.ONE); + + // 注册到文档 + ctNumbering.addNewAbstractNum().set(abstractNum); + + CTNum num = ctNumbering.addNewNum(); + num.setNumId(BigInteger.ONE); + num.addNewAbstractNumId().setVal(BigInteger.ZERO); + + return BigInteger.ONE; + } + + private static void addNumberedHeading(XWPFDocument doc, String text, int level) { + XWPFParagraph para = doc.createParagraph(); + para.setStyle("Heading" + level); + XWPFRun run = para.createRun(); + run.setText(text); + } + + // 插入分页符(另起一页),生成最后一个表格后不用插入 + private void insertTable(XWPFDocument doc,List pendingOutputDatas, int chapter) { + for (int i = 0; i < pendingOutputDatas.size(); i++) { + PendingOutputDataVo pendingOutputData = pendingOutputDatas.get(i); + //addNumberedTableTitle(doc, pendingOutputData.getTitle()); + addNumberedTableTitle(doc, pendingOutputData.getTitle(), chapter,i + 1); + creatTableTemplate(doc,pendingOutputData); + + if (i < pendingOutputDatas.size() - 1){ + XWPFParagraph pageBreak = doc.createParagraph(); + XWPFRun pageBreakRun = pageBreak.createRun(); + pageBreakRun.addBreak(BreakType.PAGE); + } + } + } + + private void iterateTraversl(Long projectId, List treeSelects, XWPFDocument document){ + // 获取文档的样式管理器 + //XWPFStyles styles = document.createStyles(); + // 使用栈进行迭代遍历 + Stack stack = new Stack<>(); + // 先将所有根节点压入栈 + if (treeSelects != null) { + for (int i = treeSelects.size() - 1; i >= 0; i--) { + stack.push(treeSelects.get(i)); + } + } + + int chapter = 1; + while (!stack.isEmpty()) { + TreeSelect current = stack.pop(); + + // 处理当前节点,这里简单打印节点信息,你可以根据需求修改 + //System.out.println("ID: " + current.getId() + ", 名称: " + current.getLabel() + ", 层级:" + current.getLevel() + ", 父ID: " + current.getParentId() + ", 是否叶子节点: " + current.getIsLeaf() ); + if (current.getIsLeaf()) { + if(current.getId() > 0){ + addNumberedHeading(document, current.getLabel(), current.getLevel()); + List pendingOutputDatas = GetPendingOutputData(projectId, current.getId()); + insertTable(document, pendingOutputDatas, chapter); + chapter = chapter + 1; + } else { + addNumberedHeading(document, current.getLabel(), current.getLevel()); + List pendingOutputDatas = GetPendingOutputData(projectId, null); + insertTable(document, pendingOutputDatas, chapter); + chapter = chapter + 1; + } + } else{ + if(current.getId() > 0){ + addNumberedHeading(document, current.getLabel(), current.getLevel()); + } + } + //处理当前节点结束 + + // 将子节点压入栈 + List children = current.getChildren(); + if (children != null) { + for (int i = children.size() - 1; i >= 0; i--) { + stack.push(children.get(i)); + } + } + } + } + + public ResponseEntity generateWord(List treeSelects, Long projectId) throws IOException { + // 创建一个新的 Word 文档 + XWPFDocument document = new XWPFDocument(); + + // 创建多级编号样式 + BigInteger numId = createMultiLevelNumbering(document); + // 创建关联编号的标题样式 + createTitleStyle(document, "Heading1", "标题1", 18, 1, numId); + createTitleStyle(document, "Heading2", "标题2", 16, 2, numId); + createTitleStyle(document, "Heading3", "标题3", 14, 3, numId); + createTitleStyle(document, "Heading4", "标题4", 12, 4, numId); + createTitleStyle(document, "Heading5", "标题5", 12, 5, numId); + // 写入标题"测试用例" + XWPFParagraph title = document.createParagraph(); + title.setAlignment(ParagraphAlignment.CENTER); // 居中 + XWPFRun titleRun = title.createRun(); + titleRun.setText("测试用例"); + titleRun.setFontSize(22); // 字体大小 + titleRun.setFontFamily("宋体"); // 字体样式 + // 添加带自动编号的内容 + iterateTraversl(projectId, treeSelects, document); + + // 将文档写入输出流 + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + document.write(outputStream); + document.close(); + + // 设置响应头 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setContentDispositionFormData("attachment", "testCase" + "_" + projectId + ".docx"); + + return new ResponseEntity<>(outputStream.toByteArray(), headers, HttpStatus.OK); + } + } diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml index db06427f2..3f443e3d3 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml @@ -21,9 +21,9 @@ - - - + + + @@ -127,9 +127,9 @@ create_by, del_flag, `index`, - reserved_field_1, - reserved_field_2, - reserved_field_3, + description, + test_method, + termination_conditions, identifier, product_req_specs_id, @@ -149,9 +149,9 @@ #{createBy}, #{delFlag}, #{index}, - #{reservedField1}, - #{reservedField2}, - #{reservedField3}, + #{description}, + #{testMethod}, + #{terminatonConditions}, #{identifier}, #{productReqSpecsId}, @@ -175,9 +175,9 @@ create_by = #{createBy}, del_flag = #{delFlag}, `index` = #{index}, - reserved_field_1 = #{reservedField1}, - reserved_field_2 = #{reservedField2}, - reserved_field_3 = #{reservedField3}, + description = #{description}, + test_method = #{testMethod}, + termination_conditions = #{terminatonConditions}, identifier = #{identifier}, product_req_specs_id = #{productReqSpecsId}, @@ -296,4 +296,27 @@ #{id} + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseStepMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseStepMapper.xml index 01a7d8b7c..32df69ec8 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseStepMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseStepMapper.xml @@ -58,6 +58,16 @@ where `index` = #{index} and pms_testcase_id=#{testcaseId} + + + + + + + + From 72cb98c5928de6219c2c9779cdb250ad6102e34b Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Tue, 27 May 2025 16:00:22 +0800 Subject: [PATCH 02/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E5=AF=BC=E5=85=A5=E3=80=81=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/api/domain/SysFileInfo.java | 1 - .../core/web/page/GenericsTableDataInfo.java | 1 + .../impl/PmsProductModuleServiceImpl.java | 2 +- .../PmsProjectTestcaseController.java | 33 ++- .../project/domain/PmsProjectTestcase.java | 6 - .../domain/vo/PmsProjectTestcaseVo.java | 1 - .../mapper/PmsProjectTestcaseMapper.java | 1 - .../service/IPmsProjectTestcaseService.java | 15 +- .../impl/PmsProjectTestcaseServiceImpl.java | 242 +++++++++++++++--- .../mapper/pms/PmsProjectTestcaseMapper.xml | 12 +- 10 files changed, 253 insertions(+), 61 deletions(-) diff --git a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/domain/SysFileInfo.java b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/domain/SysFileInfo.java index 9e5be2192..2bea71571 100644 --- a/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/domain/SysFileInfo.java +++ b/microservices-api/microservices-api-system/src/main/java/com/microservices/system/api/domain/SysFileInfo.java @@ -6,7 +6,6 @@ import com.microservices.common.core.web.domain.BaseEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; - import java.io.File; /** diff --git a/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/web/page/GenericsTableDataInfo.java b/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/web/page/GenericsTableDataInfo.java index 207a9bdc7..2c3d20621 100644 --- a/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/web/page/GenericsTableDataInfo.java +++ b/microservices-common/microservices-common-core/src/main/java/com/microservices/common/core/web/page/GenericsTableDataInfo.java @@ -88,6 +88,7 @@ public class GenericsTableDataInfo implements Serializable { this.code = HttpStatus.SUCCESS; this.msg = "查询成功"; } + /** * 分页 * diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductModuleServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductModuleServiceImpl.java index d6791cc77..53e975621 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductModuleServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/product/service/impl/PmsProductModuleServiceImpl.java @@ -303,7 +303,7 @@ public class PmsProductModuleServiceImpl implements IPmsProductModuleService // 设置各节点数量为测试单执行用例数量 moduleList.forEach(x -> x.setNodeDataCount(x.getTestsheetCasesCount())); // 排除0测试单执行用例数据 - moduleList = moduleList.stream().filter(e -> e.getTestsheetCasesCount() > 0).collect(Collectors.toList()); +// moduleList = moduleList.stream().filter(e -> e.getTestsheetCasesCount() > 0).collect(Collectors.toList()); // 计算全部测试单数量 PmsProjectTestsheetCases pmsProjectTestsheetCases = new PmsProjectTestsheetCases(); pmsProjectTestsheetCases.setProjectTestsheetId(Long.valueOf(pmsProductModule.getParams().get("projectTestsheetId").toString())); diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectTestcaseController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectTestcaseController.java index a15d8e82f..da1d6f05a 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectTestcaseController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectTestcaseController.java @@ -17,10 +17,11 @@ import com.microservices.pms.project.service.IPmsProjectTestcaseService; import com.microservices.pms.utils.PmsConstants; import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; @@ -141,11 +142,35 @@ public class PmsProjectTestcaseController extends BaseController { * 批量下载测试用例 */ @ApiOperation(value = "批量下载测试用例") - @GetMapping("/data/{projectId}/download") - public ResponseEntity download(@PathVariable("projectId") Long projectId)throws IOException { + @GetMapping("/{projectId}/download") + public void download(@PathVariable("projectId") Long projectId, HttpServletResponse response)throws IOException { PmsProjectTestcaseModuleSearchVo pmsProjectTestcaseModuleSearchVo = new PmsProjectTestcaseModuleSearchVo(); pmsProjectTestcaseModuleSearchVo.setPmsProjectId(projectId); List treeSelects = pmsProductModuleService.getPmsProductModuleTreeList(projectId, PmsConstants.TESTCASE_TAG_AND_MODULE_TYPE); - return pmsProjectTestcaseService.generateWord(treeSelects, projectId); + pmsProjectTestcaseService.generateWord(treeSelects, projectId, response); } + + /** + * 批量导入测试用例 + */ + @ApiOperation(value = "批量导入测试用例") + @PostMapping("/{projectId}/upload") + public AjaxResult upload(@RequestPart("file") MultipartFile file, @PathVariable("projectId") Long projectId) throws IOException { + if (file.isEmpty()) { + return error("上传的文件为空,请选择有效的文件"); + } + + String fileName = file.getOriginalFilename(); + if (fileName == null) { + return error("无法获取文件名,请检查上传的文件"); + } + + if (fileName.endsWith(".docx")) { + pmsProjectTestcaseService.testcaseImport(projectId, file); + return success("上传的文件是 docx 格式"); + } else { + return error("上传的文件不是 docx 格式,请上传 docx 文件"); + } + } + } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java index 6bec1d1ba..82efb63df 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java @@ -125,12 +125,6 @@ public class PmsProjectTestcase extends BaseEntity { @ApiModelProperty(value = "测试步骤列表") private List testcaseStepList; -// /** -// * 预留字段1 -// */ -// @JsonIgnore -// private String reservedField1; - /** * 测试用例描述 */ diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java index 3d8900a55..bab940530 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java @@ -3,7 +3,6 @@ package com.microservices.pms.project.domain.vo; import lombok.Data; import java.time.LocalDate; -import java.util.Date; @Data public class PmsProjectTestcaseVo { diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseMapper.java index 78ae95257..64b80c1e5 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseMapper.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestcaseMapper.java @@ -2,7 +2,6 @@ package com.microservices.pms.project.mapper; import com.microservices.pms.project.domain.PmsProjectTestcase; import com.microservices.pms.project.domain.vo.PmsProjectTestcaseBatchUpdateVo; -import com.microservices.pms.project.domain.vo.PmsProjectTestcaseStepVo; import com.microservices.pms.project.domain.vo.PmsProjectTestcaseVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectTestcaseService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectTestcaseService.java index c094e91bd..7bbcd9d2c 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectTestcaseService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectTestcaseService.java @@ -7,8 +7,9 @@ import com.microservices.pms.product.domain.vo.TreeSelect; import com.microservices.pms.project.domain.PmsProjectTestcase; import com.microservices.pms.project.domain.vo.PmsProjectTestcaseDataVo; import com.microservices.pms.project.domain.vo.PmsProjectTestcaseDetailVo; -import org.springframework.http.ResponseEntity; +import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; @@ -126,8 +127,16 @@ public interface IPmsProjectTestcaseService { * 获取测试用例列表 * * @param treeSelects 模块树结构 - * @param projectId 项目id + * @param projectId 项目id + * @param response * @return 导出word数据流 */ - ResponseEntity generateWord(List treeSelects, Long projectId)throws IOException; + void generateWord(List treeSelects, Long projectId, HttpServletResponse response)throws IOException; + + /** + * 处理docx文件将测试用例导入到数据库 + * @param projectId 项目id + * @param file 导入的docx文件 + */ + void testcaseImport(Long projectId, MultipartFile file) throws IOException; } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java index d8a7eacdf..32896a61b 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java @@ -34,20 +34,21 @@ import com.microservices.system.api.domain.SysUser; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; -import java.io.ByteArrayOutputStream; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.lang.reflect.Field; import java.math.BigInteger; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Stack; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.*; import java.util.stream.Collectors; import static com.microservices.common.core.utils.PageUtils.startPage; @@ -81,7 +82,7 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService @Autowired private IPmsProductRequirementService pmsProductRequirementService; @Autowired - private PmsProjectTestcaseStepMapper pmsProjectTestcaseStepMappe; + private PmsProjectTestcaseStepMapper pmsProjectTestcaseStepMapper; /** * 查询测试用例管理 @@ -525,29 +526,26 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService * @param item 表pms_project_testcase中index **/ public List getTestcaseStep(Long item) { - return pmsProjectTestcaseStepMappe.getTestcaseStep(item); + return pmsProjectTestcaseStepMapper.getTestcaseStep(item); } private String typeIdtoSting(Long typeId) { - if (typeId == null) { - return "未知类型"; // 或抛出明确的异常 + switch (Math.toIntExact(typeId)) { + case 1: + return "功能测试"; + case 2: + return "性能测试"; + case 3: + return "接口测试"; + case 4: + return "安装部署"; + case 5: + return "安全相关"; + case 6: + return "配置相关"; + default: + return "其他"; } - if (typeId == 1) { - return "功能测试"; - } else if (typeId == 2) { - return "性能测试"; - } else if (typeId == 3) { - return "接口测试"; - } else if (typeId == 4) { - return "安装部署"; - } else if (typeId == 5) { - return "安全相关"; - } else if (typeId == 6) { - return "配置相关"; - } else if (typeId == 7) { - return "其他"; - } - return "未知类型"; } /** * 将项目id下所有测试用例信息存到集合中 @@ -1141,7 +1139,7 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService } } - public ResponseEntity generateWord(List treeSelects, Long projectId) throws IOException { + public void generateWord(List treeSelects, Long projectId, HttpServletResponse response) throws IOException { // 创建一个新的 Word 文档 XWPFDocument document = new XWPFDocument(); @@ -1163,17 +1161,185 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService // 添加带自动编号的内容 iterateTraversl(projectId, treeSelects, document); - // 将文档写入输出流 - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - document.write(outputStream); - document.close(); - // 设置响应头 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); - headers.setContentDispositionFormData("attachment", "testCase" + "_" + projectId + ".docx"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + response.setHeader("Content-Disposition", "attachment; filename=testCase_" + projectId + ".docx"); - return new ResponseEntity<>(outputStream.toByteArray(), headers, HttpStatus.OK); + // 将文档写入响应输出流 + OutputStream outputStream = response.getOutputStream(); + document.write(outputStream); + outputStream.flush(); + outputStream.close(); + document.close(); + } + + // 导入测试用例相关 + /** + * 处理docx文件将测试用例导入到数据库 + * @param projectId 项目id + * @param file 导入的docx文件 + */ + public void testcaseImport(Long projectId, MultipartFile file) throws IOException { + List>>> allTables = extractTableDates(file); + insertTestcaseValue(allTables, projectId); + } + + /** + * 获取word中所有表格中的行列数据,并存储到集合中 + * @param file 导入的docx文件 + * @return List>>> 存储表格内行列数据的集合 + */ + private List>>> extractTableDates(MultipartFile file) throws IOException { + InputStream inputStream = file.getInputStream(); + XWPFDocument document = new XWPFDocument(inputStream); + + List>>> allTables = new ArrayList<>(); + // 获取文档中的所有表格 + List tables = document.getTables(); + + for (int i = 0; i < tables.size(); i++) { + XWPFTable table = tables.get(i); + Map>> tableData = new HashMap<>(); + List> rows = new ArrayList<>(); + + // 遍历表格中的每一行 + for (XWPFTableRow row : table.getRows()) { + List rowData = new ArrayList<>(); + // 遍历行中的每一列 + for (XWPFTableCell cell : row.getTableCells()) { + // 获取单元格文本 + StringBuilder cellText = new StringBuilder(); + for (XWPFParagraph paragraph : cell.getParagraphs()) { + for (XWPFRun run : paragraph.getRuns()) { + cellText.append(run.getText(0)); + } + } + rowData.add(cellText.toString().trim()); + } + rows.add(rowData); + } + + tableData.put("table_" + (i + 1), rows); + if(tableData.get("table_" + (i + 1)).get(0).size() == 2 && tableData.get("table_" + (i + 1)).get(1).size() == 4 && tableData.get("table_" + (i + 1)).get(2).size() == 2){} + allTables.add(tableData); + } + return allTables; + } + + /** + * 将集合中表格行列数据写入数据库中 + * @param tableRows 单个表格的行列数据 + * @return boolean 返回是否时测试用例表格数据 + */ + private boolean testcaseTableValidation(List> tableRows) { + if (tableRows.size()>12) { + return tableRows.get(0).size() == 2 && tableRows.get(1).size() == 4 && tableRows.get(8).size() == 5; + } + return false; + } + + /** + * 将集合中表格行列数据写入数据库中 + * @param allTables 所有表格的行列数据 + * @param projectId 当前项目ID + */ + private void insertTestcaseValue(List>>> allTables, Long projectId) throws IOException { + // 遍历所有表格 + for (int tableIndex = 0; tableIndex < allTables.size(); tableIndex++) { + Map>> tableMap = allTables.get(tableIndex); + // 假设每个 map 只有一个键值对 + String tableName = tableMap.keySet().iterator().next(); + List> tableRows = tableMap.get(tableName); + System.out.println("Table " + tableName + " rows: " + tableRows.size()); + if(testcaseTableValidation(tableRows)){ + PmsProjectTestcase testcase = new PmsProjectTestcase(); + List testcaseSteps = new ArrayList<>(); + testcase.setPmsProjectId(projectId); + testcase.setTitle(getTableCellValue(tableRows,0,1)); + testcase.setIdentifier(getTableCellValue(tableRows,1,1)); + testcase.setDescription(getTableCellValue(tableRows,2,1)); + testcase.setTestMethod(getTableCellValue(tableRows,3,1)); + String testType = getTableCellValue(tableRows,4,1); + testcase.setTypeId(TypeToId(testType)); + testcase.setPreconditions(getTableCellValue(tableRows,5,1)); + testcase.setTerminationConditions(getTableCellValue(tableRows,6,1)); + for(int i = 9; i < tableRows.size(); i++){ + if (tableRows.get(i).size() > 4 && getTableCellValue(tableRows, i, 1) != null){ + PmsProjectTestcaseStep testcaseStep = new PmsProjectTestcaseStep(); + testcaseStep.setIndex(i - 8L); + testcaseStep.setContent(getTableCellValue(tableRows, i, 1)); + testcaseStep.setExpectedResult(getTableCellValue(tableRows, i, 2)); + testcaseSteps.add(testcaseStep); + } else { + testcase.setCreateBy(getTableCellValue(tableRows, i, 1)); + Date date = stringToDateUsingDateTimeFormatter(getTableCellValue(tableRows, i , 3), "yyyy-MM-dd"); + testcase.setCreateTime(date); + break; + } + } + testcase.setTestcaseStepList(testcaseSteps); + + testcase.setAssigneeGitlinkId(1L); + // 获取当前项目下测试用例的最大索引值 + Long maxIndex = pmsProjectTestcaseMapper.selectPmsProjectTestcaseMaxIndexByProjectId(testcase.getPmsProjectId()); + if (maxIndex == null) { + maxIndex = 1L; + } + testcase.setIndex(++maxIndex); + pmsProjectTestcaseMapper.insertPmsProjectTestcase(testcase); + // 批量新增测试步骤 + pmsProjectTestcaseStepService.batchInsertPmsProjectTestcaseStep(testcase.getId(), testcase.getTestcaseStepList()); + } + } + } + + /** + * 使用 DateTimeFormatter 和 LocalDate 将 String 转换为 Date + * @param dateStr 日期字符串 + * @param pattern 日期格式模式 + * @return 转换后的 Date 对象 + */ + public static Date stringToDateUsingDateTimeFormatter(String dateStr, String pattern) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + LocalDate localDate = LocalDate.parse(dateStr, formatter); + Instant instant = localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant(); + return Date.from(instant); + } + + + private Long TypeToId(String type){ + switch (type) { + case "功能测试": + return 1L; + case "性能测试": + return 2L; + case "接口测试": + return 3L; + case "安装部署": + return 4L; + case "安全相关": + return 5L; + case "配置相关": + return 6L; + default: + // 其它类型 + return 7L; + } + } + + /** + * 使用 DateTimeFormatter 和 LocalDate 将 String 转换为 Date + * @param rows 单个表格所有行列数据 + * @param targetRowIndex 定位单元格的行索引 + * @param targetColIndex 定位单元格的列索引 + * @return cell获取的表格中字符串 + */ + private String getTableCellValue(List> rows, int targetRowIndex, int targetColIndex) { + String cell = null; + if (targetRowIndex < rows.size() && targetColIndex < rows.get(targetRowIndex).size()) { + cell = rows.get(targetRowIndex).get(targetColIndex); + } + return cell; } } diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml index 3f443e3d3..2a1b4cc4d 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml @@ -45,9 +45,9 @@ create_by, del_flag, `index`, - reserved_field_1, - reserved_field_2, - reserved_field_3, + description, + test_method, + termination_conditions, identifier, product_req_specs_id from pms_project_testcase @@ -129,7 +129,7 @@ `index`, description, test_method, - termination_conditions, + termination_conditions, identifier, product_req_specs_id, @@ -151,7 +151,7 @@ #{index}, #{description}, #{testMethod}, - #{terminatonConditions}, + #{terminationConditions}, #{identifier}, #{productReqSpecsId}, @@ -177,7 +177,7 @@ `index` = #{index}, description = #{description}, test_method = #{testMethod}, - termination_conditions = #{terminatonConditions}, + termination_conditions = #{terminationConditions}, identifier = #{identifier}, product_req_specs_id = #{productReqSpecsId}, From e8a6db6ac85e15107a64f3e72d7043247344dafa Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Thu, 29 May 2025 14:48:42 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=20"=E6=B5=8B=E8=AF=95=E8=BF=BD=E8=B8=AA"?= =?UTF-8?q?=E3=80=81"=E6=98=AF=E5=90=A6=E5=AF=BC=E5=85=A5"=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=AF=BC=E5=85=A5=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=E5=90=8E=E5=88=97=E8=A1=A8=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/domain/PmsProjectTestcase.java | 6 +++ .../domain/vo/PmsProjectTestcaseInputVo.java | 8 ++++ .../impl/PmsProjectTestcaseServiceImpl.java | 40 ++++++++++++------- .../mapper/pms/PmsProjectTestcaseMapper.xml | 10 ++++- 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java index 82efb63df..38fd8274c 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsProjectTestcase.java @@ -146,9 +146,15 @@ public class PmsProjectTestcase extends BaseEntity { @ApiModelProperty(value = "测试用例标识") private String identifier; + @ApiModelProperty(value = "测试追踪") + private String testTracking; + @ApiModelProperty(value = "产品需求id") private Long productReqSpecsId; + @ApiModelProperty(value = "是否导入") + private Long isImport; + public PmsProjectTestcaseDataVo toPmsProjectTestcaseDataVo() { PmsProjectTestcaseDataVo target = new PmsProjectTestcaseDataVo(); BeanUtils.copyProperties(this, target); diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseInputVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseInputVo.java index 4b0a4b3c6..66c93cf29 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseInputVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseInputVo.java @@ -105,6 +105,14 @@ public class PmsProjectTestcaseInputVo { @Size(max = 500, message = "长度需要小于500") private String terminationConditions; + @ApiModelProperty(value = "测试用例标识") + @Size(max = 255, message = "长度需要小于500") + private String identifier; + + @ApiModelProperty(value = "测试追踪") + @Size(max = 255, message = "长度需要小于500") + private String testTracking; + /** * 测试步骤列表 */ diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java index 32896a61b..7fbf345e2 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java @@ -149,20 +149,22 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService , x -> pmsProductModuleService.selectPmsProductModuleById(x, false) , pmsProjectTestcase.getPmsModuleId())); } - // 设置需求创建人 - pmsProjectTestcaseDataVo.setCreateBy( - PmsUtils.getSelectObjectInCache( - hashMap - , pmsCommonService::getNickNameByUsername - , pmsProjectTestcase.getCreateBy()) - ); - // 设置需求更新人 - pmsProjectTestcaseDataVo.setUpdateBy( - PmsUtils.getSelectObjectInCache( - hashMap - , pmsCommonService::getNickNameByUsername - , pmsProjectTestcase.getUpdateBy()) - ); + if (pmsProjectTestcase.getIsImport() != null) { + // 设置需求创建人 + pmsProjectTestcaseDataVo.setCreateBy( + PmsUtils.getSelectObjectInCache( + hashMap + , pmsCommonService::getNickNameByUsername + , pmsProjectTestcase.getCreateBy()) + ); + // 设置需求更新人 + pmsProjectTestcaseDataVo.setUpdateBy( + PmsUtils.getSelectObjectInCache( + hashMap + , pmsCommonService::getNickNameByUsername + , pmsProjectTestcase.getUpdateBy()) + ); + } // 设置产品需求 if (pmsProjectTestcase.getProductReqSpecsId() != null) { pmsProjectTestcaseDataVo.setProductReqSpecs( @@ -1277,8 +1279,18 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService break; } } + testcase.setIsImport(1L); testcase.setTestcaseStepList(testcaseSteps); + if (testcase.getAssigneeGitlinkId() == null) { + // 未设置维护用户时默认为当前操作用户 + testcase.setAssigneeGitlinkId(SecurityUtils.getGitlinkUserId()); + } + if (testcase.getTypeId() == null) { + // 设置类型为默认值 + PmsProjectTestcaseType defaultType = pmsProjectTestcaseTypeService.selectDefaultPmsProjectTestcaseType(); + testcase.setTypeId(defaultType.getId()); + } testcase.setAssigneeGitlinkId(1L); // 获取当前项目下测试用例的最大索引值 Long maxIndex = pmsProjectTestcaseMapper.selectPmsProjectTestcaseMaxIndexByProjectId(testcase.getPmsProjectId()); diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml index 2a1b4cc4d..0fc419d35 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml @@ -25,7 +25,9 @@ + + @@ -131,7 +133,9 @@ test_method, termination_conditions, identifier, + test_tracking, product_req_specs_id, + is_import, #{title}, @@ -153,7 +157,9 @@ #{testMethod}, #{terminationConditions}, #{identifier}, + #{test_tracking}, #{productReqSpecsId}, + #{isImport}, @@ -179,7 +185,9 @@ test_method = #{testMethod}, termination_conditions = #{terminationConditions}, identifier = #{identifier}, - product_req_specs_id = #{productReqSpecsId}, + #{test_tracking}, + #{productReqSpecsId}, + #{isImport}, where id = #{id} From 618b62d22d0e51498f9fb200bb0d716f25053bc1 Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Thu, 29 May 2025 14:53:32 +0800 Subject: [PATCH 04/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=20"=E6=B5=8B=E8=AF=95=E8=BF=BD=E8=B8=AA"?= =?UTF-8?q?=E3=80=81"=E6=98=AF=E5=90=A6=E5=AF=BC=E5=85=A5"=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=AF=BC=E5=85=A5=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=E5=90=8E=E5=88=97=E8=A1=A8=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml index 0fc419d35..a378e5a52 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml @@ -185,7 +185,7 @@ test_method = #{testMethod}, termination_conditions = #{terminationConditions}, identifier = #{identifier}, - #{test_tracking}, + #{testTracking}, #{productReqSpecsId}, #{isImport}, From 2218278c589958649c31917cd1ed5d93f0b9c721 Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Thu, 29 May 2025 16:59:06 +0800 Subject: [PATCH 05/12] =?UTF-8?q?=20=E8=8E=B7=E5=8F=96=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E7=AE=A1=E7=90=86=E8=AF=A6=E7=BB=86=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=20=E9=94=99=E8=AF=AF=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/service/impl/PmsProjectTestcaseServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java index 7fbf345e2..2986229d2 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java @@ -96,7 +96,9 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService if (pmsProjectTestcase == null) { throw new ServiceException("该测试用例不存在(测试用例ID[%s])", id); } - pmsProjectService.selectPmsProjectById(pmsProjectTestcase.getPmsProjectId()); + if(pmsProjectTestcase.getIsImport() == null){ + pmsProjectService.selectPmsProjectById(pmsProjectTestcase.getPmsProjectId()); + } return pmsProjectTestcase; } From 51fe5866e35c3c369c863fcdd73d25d4779c6443 Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Thu, 29 May 2025 19:35:30 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=20=E8=8E=B7=E5=8F=96=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=E7=AE=A1=E7=90=86=E8=AF=A6=E7=BB=86=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E7=94=A8=E6=88=B7=E6=9C=AA=E6=89=BE=E5=88=B0?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/service/impl/PmsProjectTestcaseServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java index 2986229d2..40b2e37cd 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectTestcaseServiceImpl.java @@ -195,7 +195,9 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService // 设置附件列表 pmsProjectTestcaseDetailVo.setFileList(pmsCommonService.getAllFileByFileIdentifiers(pmsProjectTestcase.getFileIdentifiers())); - pmsCommonService.setBaseEntityVo(pmsProjectTestcaseDetailVo, pmsProjectTestcase); + if(pmsProjectTestcase.getIsImport() == null) { + pmsCommonService.setBaseEntityVo(pmsProjectTestcaseDetailVo, pmsProjectTestcase); + } return pmsProjectTestcaseDetailVo; } From 2f06bf137d39e7f25f7230aaec6eeb937a972b39 Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Fri, 30 May 2025 09:40:26 +0800 Subject: [PATCH 07/12] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtest=5Ftracking?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml index a378e5a52..a8aef45f2 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml @@ -157,7 +157,7 @@ #{testMethod}, #{terminationConditions}, #{identifier}, - #{test_tracking}, + #{testTracking}, #{productReqSpecsId}, #{isImport}, From 34867e4580d38b3eb4ca3726e6c3cf56b1e57b46 Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Fri, 30 May 2025 10:27:03 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dtest=5Ftracking?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pms/project/domain/vo/PmsProjectTestcaseVo.java | 2 ++ .../src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml | 1 + 2 files changed, 3 insertions(+) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java index bab940530..c1f06033d 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectTestcaseVo.java @@ -35,4 +35,6 @@ public class PmsProjectTestcaseVo { private String terminationConditions; private String identifier; + + private String testTracking; } diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml index a8aef45f2..d70ac0497 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestcaseMapper.xml @@ -322,6 +322,7 @@ +