From 992a07f15454507ec961775b84c2d67653d05c7c Mon Sep 17 00:00:00 2001 From: OTTO <731554297@qq.com> Date: Wed, 9 Apr 2025 14:33:26 +0800 Subject: [PATCH 01/98] =?UTF-8?q?feat(=E9=A1=B9=E7=9B=AE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9F=A5=E8=AF=86=E5=BA=93=E4=BC=98=E5=8C=96):=20=E7=9F=A5?= =?UTF-8?q?=E8=AF=86=E5=BA=93=E7=9B=B4=E6=8E=A5=E5=88=9B=E5=BB=BA=E7=9A=84?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E9=9C=80=E8=A6=81=E8=83=BD=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: OTTO <731554297@qq.com> --- .../controller/PmsDocumentController.java | 40 ++++----- .../document/service/IPmsDocumentService.java | 3 + .../service/impl/PmsDocumentServiceImpl.java | 82 +++++++++++++------ 3 files changed, 81 insertions(+), 44 deletions(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/controller/PmsDocumentController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/controller/PmsDocumentController.java index 225c79ab5..0712f6382 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/controller/PmsDocumentController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/controller/PmsDocumentController.java @@ -20,7 +20,7 @@ import java.util.List; /** * 项目管理-文档库Controller - * + * * @author wanjia * @date 2024-01-08 */ @@ -30,8 +30,7 @@ import java.util.List; @ApiImplicitParams({ @ApiImplicitParam(name = "enterpriseIdentifier", value = "企业标识", paramType = "path", dataType = "String") }) -public class PmsDocumentController extends BaseController -{ +public class PmsDocumentController extends BaseController { @Autowired private IPmsDocumentService pmsDocumentService; @@ -46,8 +45,7 @@ public class PmsDocumentController extends BaseController @ApiImplicitParam(name = "orderByColumn", value = "排序列(更新时间:updateTime,创建时间:createTime)", paramType = "query", dataType = "String"), @ApiImplicitParam(name = "isAsc", value = "排序的方向desc或者asc,默认asc", paramType = "query", dataType = "String") }) - public GenericsTableDataInfo list( @Validated PmsDocumentSearchVo pmsDocumentSearchVo) - { + public GenericsTableDataInfo list(@Validated PmsDocumentSearchVo pmsDocumentSearchVo) { return pmsDocumentService.selectPmsDocumentVoList(pmsDocumentSearchVo); } @@ -58,8 +56,7 @@ public class PmsDocumentController extends BaseController @Log(title = "项目管理-文档库", businessType = BusinessType.EXPORT) @PostMapping("/export") @ApiOperation(value = "导出项目管理-文档库列表", hidden = true) - public void export(HttpServletResponse response, PmsDocument pmsDocument) - { + public void export(HttpServletResponse response, PmsDocument pmsDocument) { List list = pmsDocumentService.selectPmsDocumentList(pmsDocument); ExcelUtil util = new ExcelUtil(PmsDocument.class); util.exportExcel(response, list, "项目管理-文档库数据"); @@ -71,8 +68,7 @@ public class PmsDocumentController extends BaseController // @RequiresPermissions("pms:document:query") @GetMapping(value = "/{id}") @ApiOperation(value = "获取项目管理-文档库详细信息") - public AjaxResult getInfo(@PathVariable("id") Long id, @ApiParam("企业id") @RequestParam(name = "enterpriseId") Long enterpriseId) - { + public AjaxResult getInfo(@PathVariable("id") Long id, @ApiParam("企业id") @RequestParam(name = "enterpriseId") Long enterpriseId) { return success(pmsDocumentService.selectPmsDocumentDetailVoByIdAndEnterpriseId(id, enterpriseId)); } @@ -83,8 +79,7 @@ public class PmsDocumentController extends BaseController @Log(title = "项目管理-文档库", businessType = BusinessType.INSERT) @PostMapping @ApiOperation(value = "新增项目管理-文档库") - public AjaxResult add(@RequestBody @Validated PmsDocumentInputVo pmsDocumentInputVo) - { + public AjaxResult add(@RequestBody @Validated PmsDocumentInputVo pmsDocumentInputVo) { return toAjax(pmsDocumentService.insertPmsDocument(pmsDocumentInputVo.toPmsDocument())); } @@ -95,8 +90,7 @@ public class PmsDocumentController extends BaseController @Log(title = "新增附件类型文档", businessType = BusinessType.INSERT) @PostMapping("/fileType") @ApiOperation(value = "新增附件类型文档") - public AjaxResult addFileTypeDoc(@RequestBody @Validated PmsFileTypeDocumentInputVo pmsFileTypeDocumentInputVo) - { + public AjaxResult addFileTypeDoc(@RequestBody @Validated PmsFileTypeDocumentInputVo pmsFileTypeDocumentInputVo) { return toAjax(pmsDocumentService.insertPmsFileTypeDocument(pmsFileTypeDocumentInputVo)); } @@ -107,8 +101,7 @@ public class PmsDocumentController extends BaseController @Log(title = "项目管理-文档库", businessType = BusinessType.UPDATE) @PutMapping @ApiOperation(value = "修改项目管理-文档库") - public AjaxResult edit(@RequestBody PmsDocumentUpdateVo pmsDocumentUpdateVo) - { + public AjaxResult edit(@RequestBody PmsDocumentUpdateVo pmsDocumentUpdateVo) { return toAjax(pmsDocumentService.updatePmsDocument(pmsDocumentUpdateVo.toPmsDocument())); } @@ -117,12 +110,11 @@ public class PmsDocumentController extends BaseController */ // @RequiresPermissions("pms:document:remove") @Log(title = "项目管理-文档库", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") + @DeleteMapping("/{ids}") @ApiOperation(value = "删除项目管理-文档库") public AjaxResult remove(@PathVariable Long[] ids, @ApiParam("企业id") @RequestParam(name = "enterpriseId") Long enterpriseId, - @ApiParam("项目id") @RequestParam(name = "pmsProjectId", defaultValue = "0") Long pmsProjectId) - { + @ApiParam("项目id") @RequestParam(name = "pmsProjectId", defaultValue = "0") Long pmsProjectId) { return toAjax(pmsDocumentService.deletePmsDocumentByIds(ids, enterpriseId, pmsProjectId)); } @@ -131,8 +123,16 @@ public class PmsDocumentController extends BaseController */ @GetMapping(value = "/optionalWikiRepoList") @ApiOperation(value = "导入wiki时可选的仓库列表") - public AjaxResult getOptionalWikiRepoList(@Validated OptionalWikiReposSearchVo optionalWikiReposSearchVo) - { + public AjaxResult getOptionalWikiRepoList(@Validated OptionalWikiReposSearchVo optionalWikiReposSearchVo) { return success(pmsDocumentService.getOptionalWikiRepoList(optionalWikiReposSearchVo)); } + + /** + * 下载文档类型文件 + */ + @GetMapping(value = "/downloadDoc/{docId}") + @ApiOperation(value = "下载文档类型文件") + public void downloadDoc(@PathVariable String enterpriseIdentifier, @PathVariable Long docId, HttpServletResponse response) { + pmsDocumentService.downloadDoc(response, enterpriseIdentifier, docId); + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/service/IPmsDocumentService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/service/IPmsDocumentService.java index 9f1ac213a..a58a1881b 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/service/IPmsDocumentService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/service/IPmsDocumentService.java @@ -5,6 +5,7 @@ import com.microservices.common.core.web.page.GenericsTableDataInfo; import com.microservices.pms.document.domain.PmsDocument; import com.microservices.pms.document.domain.vo.*; +import javax.servlet.http.HttpServletResponse; import java.util.List; /** @@ -93,4 +94,6 @@ public interface IPmsDocumentService * @return */ JSONObject getOptionalWikiRepoList(OptionalWikiReposSearchVo optionalWikiReposSearchVo); + + void downloadDoc(HttpServletResponse response, String enterpriseIdentifier, Long docId); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/service/impl/PmsDocumentServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/service/impl/PmsDocumentServiceImpl.java index 24d28a868..cdc1723e3 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/service/impl/PmsDocumentServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/document/service/impl/PmsDocumentServiceImpl.java @@ -5,6 +5,7 @@ import com.microservices.common.core.constant.HttpStatus; import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.utils.DateUtils; import com.microservices.common.core.utils.StringUtils; +import com.microservices.common.core.utils.file.FileUtils; import com.microservices.common.core.web.page.Breadcrumb; import com.microservices.common.core.web.page.GenericsTableDataInfo; import com.microservices.common.httpClient.util.GitLinkRequestHelper; @@ -21,6 +22,7 @@ import com.microservices.pms.enums.PmsDocumentType; import com.microservices.pms.project.mapper.PmsProjectRepositoryMapper; import com.microservices.pms.project.service.IPmsProjectService; import com.microservices.pms.utils.PmsGitLinkRequestUrl; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -28,7 +30,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; @@ -38,13 +45,13 @@ import static com.microservices.common.httpClient.constant.GitLinkConstants.DATA /** * 项目管理-文档库Service业务层处理 - * + * * @author wanjia * @date 2024-01-08 */ +@Slf4j @Service -public class PmsDocumentServiceImpl implements IPmsDocumentService -{ +public class PmsDocumentServiceImpl implements IPmsDocumentService { private static final Logger logger = LoggerFactory.getLogger(PmsDocumentServiceImpl.class); @Resource private PmsDocumentMapper pmsDocumentMapper; @@ -69,13 +76,12 @@ public class PmsDocumentServiceImpl implements IPmsDocumentService /** * 查询项目管理-文档库 - * + * * @param id 项目管理-文档库主键 * @return 项目管理-文档库 */ @Override - public PmsDocument selectPmsDocumentByIdAndEnterpriseId(Long id, Long enterpriseId) - { + public PmsDocument selectPmsDocumentByIdAndEnterpriseId(Long id, Long enterpriseId) { boolean isEnterpriseAdmin = pmsCommonService.hasDocsManageRole(enterpriseId); return pmsDocumentMapper.selectPmsDocumentByIdAndEnterpriseId(id, enterpriseId, isEnterpriseAdmin, SecurityUtils.getUsername()); } @@ -97,13 +103,12 @@ public class PmsDocumentServiceImpl implements IPmsDocumentService /** * 查询项目管理-文档库列表 - * + * * @param pmsDocument 项目管理-文档库 * @return 项目管理-文档库 */ @Override - public List selectPmsDocumentList(PmsDocument pmsDocument) - { + public List selectPmsDocumentList(PmsDocument pmsDocument) { checkAuthAndReturnAdminStatus(pmsDocument.getPmsEnterpriseId()); return pmsDocumentMapper.selectPmsDocumentList(pmsDocument); } @@ -116,7 +121,7 @@ public class PmsDocumentServiceImpl implements IPmsDocumentService pmsDocumentSearchVo.setCurrentUserName(currentUserName); startPage(); List pmsDocumentList = pmsDocumentMapper.selectPmsDocumentListBySearchInput(pmsDocumentSearchVo); - GenericsTableDataInfo page = toPage(pmsDocumentList,this::buildPmsDocumentVo); + GenericsTableDataInfo page = toPage(pmsDocumentList, this::buildPmsDocumentVo); //构建面包屑列表 if (pmsDocumentSearchVo.getParentId() != 0) { List breadcrumbs = buildBreadcrumbs(pmsDocumentSearchVo.getParentId()); @@ -132,21 +137,53 @@ public class PmsDocumentServiceImpl implements IPmsDocumentService PmsEnterprise pmsEnterprise = pmsEnterpriseService.selectPmsEnterpriseById(enterpriseId); Map queryParams = buildRepoListQueryParams(optionalWikiReposSearchVo); try { - return gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_ORGANIZATION_REPO_LIST(pmsEnterprise.getEnterpriseIdentifier(), queryParams)); + return gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_ORGANIZATION_REPO_LIST(pmsEnterprise.getEnterpriseIdentifier(), queryParams)); } catch (URISyntaxException e) { throw new RuntimeException(e); } } + @Override + public void downloadDoc(HttpServletResponse response, String enterpriseIdentifier, Long docId) { + PmsEnterprise enterprise = pmsEnterpriseService.selectPmsEnterpriseByIdentifier(enterpriseIdentifier); + PmsDocument pmsDocument = selectPmsDocumentByIdAndEnterpriseId(docId, enterprise.getId()); + if (!pmsDocument.getDocType().equals(PmsDocumentType.DOCUMENT.getKey())) { + throw new ServiceException("当前接口仅允许下载文档类型"); + } + Path tempFilePath = null; + try { + String docFileName = pmsDocument.getName() + ".md"; + FileUtils.setAttachmentResponseHeader(response, docFileName); + // 创建临时文件 + tempFilePath = Files.createTempFile(pmsDocument.getName(), ".md"); + String content = ""; + if (pmsDocument.getContent() != null) { + content = pmsDocument.getContent(); + } + Files.write(tempFilePath, content.getBytes(StandardCharsets.UTF_8)); + FileUtils.writeBytes(tempFilePath.toString(), response.getOutputStream()); + } catch (IOException e) { + log.error("文档下载失败:{}", e.getMessage()); + throw new ServiceException("文档下载失败"); + } finally { + if (tempFilePath != null) { + try { + Files.deleteIfExists(tempFilePath); + } catch (IOException e) { + log.error("删除临时文件失败:{}", e.getMessage()); + } + } + } + } + /** * 新增项目管理-文档库 - * + * * @param pmsDocument 项目管理-文档库 * @return 结果 */ @Override - public int insertPmsDocument(PmsDocument pmsDocument) - { + public int insertPmsDocument(PmsDocument pmsDocument) { checkPmsProjectById(pmsDocument.getPmsProjectId()); checkAuthAndReturnAdminStatus(pmsDocument.getPmsEnterpriseId()); String currentUserName = SecurityUtils.getUsername(); @@ -169,13 +206,12 @@ public class PmsDocumentServiceImpl implements IPmsDocumentService /** * 修改项目管理-文档库 - * + * * @param pmsDocument 项目管理-文档库 * @return 结果 */ @Override - public int updatePmsDocument(PmsDocument pmsDocument) - { + public int updatePmsDocument(PmsDocument pmsDocument) { checkPmsProjectById(pmsDocument.getPmsProjectId()); String currentUserName = SecurityUtils.getUsername(); boolean isEnterpriseAdmin = checkAuthAndReturnAdminStatus(pmsDocument.getPmsEnterpriseId()); @@ -195,8 +231,7 @@ public class PmsDocumentServiceImpl implements IPmsDocumentService * @return 结果 */ @Override - public int deletePmsDocumentByIds(Long[] ids, Long enterpriseId, Long projectId) - { + public int deletePmsDocumentByIds(Long[] ids, Long enterpriseId, Long projectId) { checkPmsProjectById(projectId); String currentUserName = SecurityUtils.getUsername(); boolean isEnterpriseAdmin = checkAuthAndReturnAdminStatus(enterpriseId); @@ -207,13 +242,12 @@ public class PmsDocumentServiceImpl implements IPmsDocumentService /** * 删除项目管理-文档库信息 - * + * * @param id 项目管理-文档库主键 * @return 结果 */ @Override - public int deletePmsDocumentById(Long id, Long enterpriseId, Long projectId) - { + public int deletePmsDocumentById(Long id, Long enterpriseId, Long projectId) { checkPmsProjectById(projectId); String currentUserName = SecurityUtils.getUsername(); boolean isEnterpriseAdmin = checkAuthAndReturnAdminStatus(enterpriseId); @@ -303,7 +337,7 @@ public class PmsDocumentServiceImpl implements IPmsDocumentService throw new ServiceException("文件类型的文档名称个数与文件标识个数不匹配"); } List pmsDocumentList = new ArrayList<>(); - for (int i=0; i < names.length; i++) { + for (int i = 0; i < names.length; i++) { PmsDocument pmsDocument = new PmsDocument(); BeanUtils.copyProperties(pmsFileTypeDocumentInputVo, pmsDocument); pmsDocument.setName(names[i]); @@ -373,7 +407,7 @@ public class PmsDocumentServiceImpl implements IPmsDocumentService queryParams.put("pm_project_repository_ids", unlinkedRepoIdsString); } queryParams.put("search", optionalWikiReposSearchVo.getSearch()); - queryParams.put("page" , String.valueOf(optionalWikiReposSearchVo.getPage())); + queryParams.put("page", String.valueOf(optionalWikiReposSearchVo.getPage())); queryParams.put("limit", String.valueOf(optionalWikiReposSearchVo.getLimit())); queryParams.put("sort_by", optionalWikiReposSearchVo.getSortBy()); queryParams.put("sort_direction", "desc"); From 9d6bbe57851efed409d563880725685e3eb43dc8 Mon Sep 17 00:00:00 2001 From: liuhuazhong Date: Mon, 12 May 2025 17:06:49 +0800 Subject: [PATCH 02/98] =?UTF-8?q?fix=20=E3=80=90=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E5=BA=93=E3=80=91=E5=9B=BE=E7=89=87=E5=9C=B0=E5=9D=80=E6=8B=BC?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AchievementsServiceImpl.java | 3 +++ .../resourceLibrary/service/ProjectResourceLibraryService.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java index d62f21f92..35a9ae70d 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java @@ -84,6 +84,9 @@ public class AchievementsServiceImpl implements IAchievementsService { } } a.setUserImg(img); + + a.setImages(buildFileInfoByIdents(a.getImages(), a.getSource())); + a.setAttachments(buildFileInfoByIdents(a.getAttachments(), a.getSource())); } return a; } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/ProjectResourceLibraryService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/ProjectResourceLibraryService.java index bd473e1af..0ce46e54d 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/ProjectResourceLibraryService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/ProjectResourceLibraryService.java @@ -83,7 +83,7 @@ public class ProjectResourceLibraryService { if (v.startsWith("http")) { String urlPath = getUrlPath(v); if (StringUtils.isNotEmpty(urlPath)) { - if (urlPath.startsWith("/")) { + if (urlPath.startsWith("/api")) { a.setV(gitLinkUrl + urlPath); }else { a.setV(gitLinkUrl +"/api"+ urlPath); From 6f7d969ce9f816196835c9905355249e0dc2f0ad Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Tue, 13 May 2025 10:46:07 +0800 Subject: [PATCH 03/98] =?UTF-8?q?feat(Wiki=E5=8E=86=E5=8F=B2=E7=89=88?= =?UTF-8?q?=E6=9C=AC):wiki=E5=8E=86=E5=8F=B2=E7=89=88=E6=9C=AC=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=8F=8A=E5=8E=86=E5=8F=B2=E7=89=88=E6=9C=AC=E8=AF=A6?= =?UTF-8?q?=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wiki/contoller/wiki/WikiController.java | 52 ++++++++++++++++-- .../wiki/domain/wiki/vo/AuthorMessage.java | 2 + .../wiki/domain/wiki/vo/CommitMessage.java | 2 + .../wiki/domain/wiki/vo/WikiRevisionsVo.java | 12 +++++ .../wiki/service/wiki/WikiService.java | 54 +++++++++++++++---- 5 files changed, 108 insertions(+), 14 deletions(-) create mode 100644 microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/WikiRevisionsVo.java diff --git a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/wiki/WikiController.java b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/wiki/WikiController.java index 2ab3a2282..199667fc2 100644 --- a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/wiki/WikiController.java +++ b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/wiki/WikiController.java @@ -1,13 +1,11 @@ package com.microservices.wiki.contoller.wiki; +import com.microservices.common.core.constant.HttpStatus; import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.web.domain.AjaxResult; import com.microservices.wiki.domain.sys.User; import com.microservices.wiki.domain.wiki.Wiki; -import com.microservices.wiki.domain.wiki.vo.WikiAllVo; -import com.microservices.wiki.domain.wiki.vo.WikiContent; -import com.microservices.wiki.domain.wiki.vo.WikiDeleteVo; -import com.microservices.wiki.domain.wiki.vo.WikiPageVo; +import com.microservices.wiki.domain.wiki.vo.*; import com.microservices.wiki.refactoring.response.HttpClientResult; import com.microservices.wiki.refactoring.utils.BeanCopyUtils; import com.microservices.wiki.refactoring.utils.FastJsonUtils; @@ -36,6 +34,9 @@ public class WikiController { @Value("${gitea-wiki-api-base-url}") private String giteaApiBaseUrl; + @Value("${gitea-hat-wiki-api-base-url}") + private String giteaHatApiBaseUrl; + @Value("${gitea-wiki-token}") private String token; @@ -138,6 +139,44 @@ public class WikiController { return new AjaxResult(httpClientResult.getCode(), "", httpClientResult.getContent()); } + @ApiOperation("getWikiRevisions") + @GetMapping("/getWikiRevisions") + public AjaxResult getWikiRevisions( + HttpServletRequest request, + @ApiParam(value = "owner of the repo", required = true) @RequestParam(defaultValue = "") String owner, + @ApiParam(value = "name of the repo", required = true) @RequestParam(defaultValue = "") String repo, + @ApiParam(value = "name of the wikipage", required = true) @RequestParam(defaultValue = "") String pageName, + @ApiParam(value = "id of the project", required = true) @RequestParam(defaultValue = "") Integer projectId) throws Exception { + String giteaToken = wikiService.getGiteaToken(request, projectId); + //未获取有效giteaToken时,赋值内置giteaToken + giteaToken = giteaToken == null ? token : giteaToken; + WikiRevisionsVo wikiRevisionsVo = wikiService.getWikiRevisions(owner, repo, pageName, giteaApiDomain+giteaApiBaseUrl, giteaToken); + return new AjaxResult(HttpStatus.SUCCESS,"操作成功", wikiRevisionsVo); + } + + @ApiOperation("getPreviousWiki") + @GetMapping("/getPreviousWiki") + public AjaxResult getPreviousWiki( + HttpServletRequest request, + @ApiParam(value = "owner of the repo", required = true) @RequestParam(defaultValue = "") String owner, + @ApiParam(value = "name of the repo", required = true) @RequestParam(defaultValue = "") String repo, + @ApiParam(value = "name of the wikipage", required = true) @RequestParam(defaultValue = "") String pageName, + @ApiParam(value = "id of the project", required = true) @RequestParam(defaultValue = "") Integer projectId, + @ApiParam(value = "id of the project", required = true) @RequestParam(defaultValue = "") String sha) throws Exception { + String giteaToken = wikiService.getGiteaToken(request, projectId); + //未获取有效giteaToken时,赋值内置giteaToken + giteaToken = giteaToken == null ? token : giteaToken; + HttpClientResult httpClientResult = wikiService.getPreviousWiki(owner, repo, pageName, sha, giteaApiDomain+giteaHatApiBaseUrl, giteaToken); + if (httpClientResult == null) { + throw new ServiceException("获取wiki历史版本数据异常"); + } + if (httpClientResult.getCode() != 200) { + return new AjaxResult(httpClientResult.getCode(),"操作失败", httpClientResult.getContent()); + } + WikiContent wikiContent = getWikiContent(httpClientResult); + return new AjaxResult(httpClientResult.getCode(), "操作成功", wikiContent); + } + @@ -150,7 +189,10 @@ public class WikiController { WikiContent wikiContent = FastJsonUtils.toBean(httpClientResult.getContent(), WikiContent.class); if (wikiContent != null && wikiContent.getLast_commit() != null && wikiContent.getLast_commit().getAuthor() != null) { - wikiContent.setImage_url(userService.getRemoteUserLogoByUserLogin(wikiContent.getLast_commit().getAuthor().getName())); + String image_url = userService.getRemoteUserLogoByUserLogin(wikiContent.getLast_commit().getCommiter().getName()); + wikiContent.setImage_url(image_url); + wikiContent.getLast_commit().getCommiter().setImage_url(image_url); + wikiContent.getLast_commit().getAuthor().setImage_url(image_url); User commitUser = userService.getUserByLogin(wikiContent.getLast_commit().getAuthor().getName()); if(commitUser != null){ wikiContent.setUserName(StringUtils.isEmpty(commitUser.getNickname()) ? commitUser.getLogin() : commitUser.getNickname()); diff --git a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/AuthorMessage.java b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/AuthorMessage.java index 8afa2c137..313850c58 100644 --- a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/AuthorMessage.java +++ b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/AuthorMessage.java @@ -12,4 +12,6 @@ public class AuthorMessage { private Date date; private String email; + + private String image_url; } diff --git a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/CommitMessage.java b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/CommitMessage.java index 227cb49bc..85010221e 100644 --- a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/CommitMessage.java +++ b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/CommitMessage.java @@ -9,4 +9,6 @@ public class CommitMessage { private String message; private AuthorMessage author; + + private AuthorMessage commiter; } diff --git a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/WikiRevisionsVo.java b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/WikiRevisionsVo.java new file mode 100644 index 000000000..24343ed59 --- /dev/null +++ b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/domain/wiki/vo/WikiRevisionsVo.java @@ -0,0 +1,12 @@ +package com.microservices.wiki.domain.wiki.vo; + +import lombok.Data; + +import java.util.List; + +@Data +public class WikiRevisionsVo { + private List commits; + + private Integer count; +} diff --git a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/service/wiki/WikiService.java b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/service/wiki/WikiService.java index 2f3a2e01b..7906589e9 100644 --- a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/service/wiki/WikiService.java +++ b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/service/wiki/WikiService.java @@ -1,11 +1,13 @@ package com.microservices.wiki.service.wiki; import cn.hutool.core.util.ZipUtil; +import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.github.jhonnymertz.wkhtmltopdf.wrapper.Pdf; import com.github.jhonnymertz.wkhtmltopdf.wrapper.configurations.WrapperConfig; import com.github.jhonnymertz.wkhtmltopdf.wrapper.params.Param; import com.microservices.common.core.exception.ServiceException; +import com.microservices.common.core.web.domain.AjaxResult; import com.microservices.wiki.domain.projects.Projects; import com.microservices.wiki.domain.sys.UserVo; import com.microservices.wiki.domain.wiki.Wiki; @@ -13,6 +15,7 @@ import com.microservices.wiki.domain.wiki.WikiContentSimple; import com.microservices.wiki.domain.wiki.WikiPage; import com.microservices.wiki.domain.wiki.vo.WikiCloneLinkVo; import com.microservices.wiki.domain.wiki.vo.WikiPageVo; +import com.microservices.wiki.domain.wiki.vo.WikiRevisionsVo; import com.microservices.wiki.domain.wiki.vo.WikiVo; import com.microservices.wiki.mapper.members.MembersMapper; import com.microservices.wiki.mapper.projects.ProjectsMapper; @@ -82,9 +85,9 @@ public class WikiService { urlFormat += "?access_token=" + giteaToken; } String completeUrl = giteaApiDomain + urlFormat; - logger.info("completeUrl:" + completeUrl); + logger.info("getWikiPages completeUrl:{}", completeUrl); HttpClientResult httpClientResult = HttpClientUtils.doGet(completeUrl, null); - logger.info("httpClientResultCode:" + httpClientResult.getCode()); + logger.info("httpClientResultCode:{}", httpClientResult.getCode()); return httpClientResult; } @@ -106,7 +109,7 @@ public class WikiService { urlFormat += "?access_token=" + giteaToken; } String completeUrl = URL + urlFormat; - logger.info("completeUrl: " + completeUrl); + logger.info("getWiki completeUrl: {}", completeUrl); return HttpClientUtils.doGet(completeUrl, null, null); } @@ -117,7 +120,7 @@ public class WikiService { Map params; WikiVo wikiVo = BeanCopyUtils.beanPropertiesCopy(wiki, WikiVo.class); params = ConvertBean.convertToStringMap(wikiVo); - logger.info("completeUrl: " + URL + urlFormat); + logger.info("completeUrl: {}{}", URL, urlFormat); String completeUrl = URL + urlFormat; return HttpClientUtils.doPost(completeUrl, null, params); } @@ -129,7 +132,7 @@ public class WikiService { String pageName = wiki.getTitle(); String urlFormat = String.format("/repos/%s/%s/wiki/page/%s?access_token=%s", owner, repo, pageName, giteaToken); String completeUrl = URL + urlFormat; - logger.info("delete completeUrl " + completeUrl); + logger.info("delete completeUrl {}", completeUrl); return HttpClientUtils.doDelete(completeUrl); } @@ -140,10 +143,43 @@ public class WikiService { String urlFormat = String.format("/repos/%s/%s/wiki/page/%s?access_token=%s", owner, repo, pageName, giteaToken); WikiVo wikiVo = BeanCopyUtils.beanPropertiesCopy(wiki, WikiVo.class); String completeUrl = URL + urlFormat; - logger.info("completeUrl: " + completeUrl); + logger.info("completeUrl: {}", completeUrl); return HttpClientUtils.doPatch(completeUrl, ConvertBean.convertToStringMap(wikiVo)); } + public WikiRevisionsVo getWikiRevisions(String owner, String repo, String pageName, String URL, String giteaToken) throws Exception { + String urlFormat = String.format("/repos/%s/%s/wiki/revisions/%s", owner, repo, pageName); + if (giteaToken != null) { + urlFormat += "?access_token=" + giteaToken; + } + String completeUrl = URL + urlFormat; + logger.info("getWikiRevisions completeUrl: {}", completeUrl); + HttpClientResult httpClientResult = HttpClientUtils.doGet(completeUrl, null, null); + if (httpClientResult == null) { + throw new ServiceException("获取wiki历史版本列表数据异常"); + } + if (httpClientResult.getCode() != 200) { + throw new ServiceException(httpClientResult.getCode(),"操作失败", httpClientResult.getContent()); + } + WikiRevisionsVo wikiRevisionsVo = JSON.parseObject(httpClientResult.getContent(), WikiRevisionsVo.class); + wikiRevisionsVo.getCommits().forEach(commit -> { + commit.getCommiter().setImage_url(userService.getRemoteUserLogoByUserLogin(commit.getCommiter().getName())); + commit.getAuthor().setImage_url(userService.getRemoteUserLogoByUserLogin(commit.getAuthor().getName())); + }); + + return wikiRevisionsVo; + } + + public HttpClientResult getPreviousWiki(String owner, String repo, String pageName, String sha, String URL, String giteaToken) throws Exception { + String urlFormat = String.format("/repos/%s/%s/wiki/revisions/%s/%s", owner, repo, pageName, sha); + if (giteaToken != null) { + urlFormat += "?access_token=" + giteaToken; + } + String completeUrl = URL + urlFormat; + logger.info("getPreviousWiki completeUrl: {}", completeUrl); + return HttpClientUtils.doGet(completeUrl, null, null); + } + public String StringToURLEncode(String s) throws UnsupportedEncodingException { s = java.net.URLEncoder.encode(s, "UTF-8").replaceAll("\\+", "-").replaceAll("\\*", "%2A"); @@ -224,7 +260,7 @@ public class WikiService { if (httpClientResult1.getCode() == 200) { WikiContentSimple wikiContentSimple = FastJsonUtils.toBean(httpClientResult1.getContent(), WikiContentSimple.class); fileUtils.writeStringToFile(wikiContentSimple.getContent_base64(), wikiContentSimple.getTitle() + ".md", dirPath); - logger.info("wikiContent" + wikiContentSimple.getSimple_content()); + logger.info("wikiContent:{}", wikiContentSimple.getSimple_content()); } } downLoadZip(response, repoName, dirPath); @@ -309,7 +345,7 @@ public class WikiService { org.apache.commons.io.FileUtils.forceDelete(new File(completeDestPath)); org.apache.commons.io.FileUtils.forceDelete(new File(dirPath)); } catch (IOException e) { - logger.warn("delete scratch zip file fail: " + completeDestPath); + logger.warn("delete scratch zip file fail: {}", completeDestPath); } } @@ -332,7 +368,7 @@ public class WikiService { try { org.apache.commons.io.FileUtils.forceDelete(new File(filePath)); } catch (IOException e) { - logger.warn("delete scratch file fail: " + filePath); + logger.warn("delete scratch file fail: {}", filePath); } } } From f6eb2f990193c0c58b6bd3dd1e444cf11b35ebc1 Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Tue, 13 May 2025 11:14:38 +0800 Subject: [PATCH 04/98] =?UTF-8?q?=E5=A6=82=E6=9E=9C=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E4=BA=BA=E4=B8=BA=E7=A9=BA=E8=8E=B7=E5=8F=96=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E8=B4=9F=E8=B4=A3=E4=BA=BA=E7=9A=84=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/mapper/dms/AchievementsMapper.xml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index eed37323c..c4933a155 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -251,7 +251,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, achievement_name,images,field_1,field_2,field_3,source,source_id + select id, achievement_name,images,field_1,field_2,field_3,a.summary,source,source_id from achievements where is_featured ='1' order by update_time desc @@ -333,14 +333,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by DATE_FORMAT(created_at, '%m-%d') - select t.achievement_name as name, t.w as watcher, t.f as faviter, (t.w + t.f) as total, t.id as `id`,t.owner_name - as userName + as userName,t.gender,t.userNickName from (select a.achievement_name, a.id,a.owner_name, + IFNULL(u.nickname,a.owner_name) as "userNickName", + ue.gender as "gender", (select IFNULL(count(*), 0) from favorites where favorite_type = 'Achievements' and favorite_id = a.id) as f, (select IFNULL(count(*), 0) from watchers where watchable_type = 'Achievements' and watchable_id = a.id) as w - from achievements a) as t + from achievements a + left join users u on a.owner_name = u.login + left join user_extensions ue on u.id = ue.user_id + ) as t order by (f+w) desc limit 0,3 From 99c4842442ff75550fb29ecf867b60d752acc5d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Wed, 14 May 2025 19:07:04 +0800 Subject: [PATCH 08/98] =?UTF-8?q?fix=20=E3=80=90=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E5=BA=93=E3=80=91=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/dms/AchievementsMapper.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index 04dd3c447..d371ceb43 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -389,7 +389,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select COUNT(*) from achievements a where source = #{s} - and tags = #{t} + + and tags = #{t} + + and show_ach_name like concat('%', #{showAchievementName}, '%') and achievement_name like concat('%', #{achievementName}, '%') and field_1 = #{field1} and field_2 = #{field2} @@ -76,7 +78,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, achievement_name,images,field_1,field_2,field_3,a.summary,source,source_id + select id,IFNULL(show_ach_name,achievement_name) as show_ach_name,achievement_name,images,field_1,field_2,field_3,summary,source,source_id from achievements where is_featured ='1' order by update_time desc @@ -249,7 +254,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -75,10 +75,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and hot_rank = #{hotRank} and create_by = #{createBy} + order by create_time desc - select id,IFNULL(show_ach_name,achievement_name) as show_ach_name,achievement_name,images,field_1,field_2,field_3,summary,source,source_id + select id,IFNULL(show_ach_name,achievement_name) as "showAchievementName",achievement_name,images,field_1,field_2,field_3,summary,source,source_id from achievements where is_featured ='1' order by update_time desc @@ -254,7 +255,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select * from ( select erl.id, e.id as expert_id,e.user_id, e.expert_name, e.highest_degree, e.graduated_from, - u.nickname as "userNickName",ue.gender as "gender", + u.nickname as "userNickName", IFNULL(erl.gender, ue.gender) as "gender", e.id_number,images, attachments, e.major, e.workplace, e.phone, e.workplace_type, e.expert_email, erl.expert_summary, erl.expert_detail, e.professional_title, e.expert_type, @@ -121,7 +121,7 @@ + + From a708082d1e1951816c6d940d13cadb8118880ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Thu, 15 May 2025 16:46:13 +0800 Subject: [PATCH 19/98] =?UTF-8?q?feat=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93?= =?UTF-8?q?=E3=80=91=E7=AB=9E=E8=B5=9B=E5=92=8C=E5=88=9B=E5=AE=A2=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=EF=BC=9A=E7=9B=B8=E5=85=B3=E6=88=90=E6=9E=9C=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E3=80=81=E4=B8=93=E5=AE=B6=EF=BC=9A=E4=B8=93=E5=AE=B6?= =?UTF-8?q?=E5=AE=A1=E6=A0=B8=E6=95=B0=E6=8D=AE=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AchievementsController.java | 30 +++++++++++ .../mapper/AchievementsMapper.java | 10 ++++ .../service/IAchievementsService.java | 10 ++++ .../service/impl/AchievementsServiceImpl.java | 50 +++++++++++++++++++ .../service/TaskResourceLibraryService.java | 2 + .../mapper/dms/AchievementsMapper.xml | 40 +++++++++++++++ 6 files changed, 142 insertions(+) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementsController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementsController.java index 829855efe..e1995e580 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementsController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementsController.java @@ -240,6 +240,36 @@ public class AchievementsController extends BaseController { return success(achievementsService.getRelatedAch(id,sourceId)); } + + @ApiOperation(value = "获取开源竞赛的相关成果") + @GetMapping("/getRelatedAchCompetition") + public AjaxResult getRelatedAchCompetition(Long id,Long sourceId) + { + return success(achievementsService.getRelatedAchCompetition(id,sourceId)); + } + + + @ApiOperation(value = "获取创客任务的相关成果") + @GetMapping("/getRelatedAchTask") + public AjaxResult getRelatedAchTask(Long id,Long sourceId) + { + return success(achievementsService.getRelatedAchTask(id,sourceId)); + } + + @ApiOperation(value = "获取专家-创客任务的相关成果") + @GetMapping("/getRelatedAchTaskOfExpert") + public AjaxResult getRelatedAchTaskOfExpert(Long expertId) + { + return success(achievementsService.getRelatedAchTaskOfExpert(expertId)); + } + + @ApiOperation(value = "获取专家-开源竞赛的相关成果") + @GetMapping("/getRelatedAchCompetitionOfExpert") + public AjaxResult getRelatedAchCompetitionOfExpert(Long expertId) + { + return success(achievementsService.getRelatedAchCompetitionOfExpert(expertId)); + } + @ApiOperation(value = "搜索行为数据记录") @GetMapping("/getSearchResult") public AjaxResult getSearchResult(String achName,Long userId) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java index da95d73c7..5ba9393f9 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java @@ -9,6 +9,8 @@ import com.microservices.common.datasource.annotation.Master; import com.microservices.common.datasource.annotation.Slave; import com.microservices.dms.achievementLibrary.domain.*; import com.microservices.dms.behaviorImage.domain.AchievementBehaviorSumVo; +import com.microservices.dms.resourceLibrary.domain.CompetitionResourceLibrary; +import com.microservices.dms.resourceLibrary.domain.TaskResourceLibrary; import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo; import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Mapper; @@ -140,4 +142,12 @@ public interface AchievementsMapper { List getExpertAreasByName(@Param("areaName") String areaName); List getAllSourceId(@Param("id")Long id, @Param("sourceId")Long sourceId); + + List getAllSourceIdCompetition(@Param("id")Long id, @Param("sourceId")Long sourceId); + + List getAllSourceIdTask(@Param("id")Long id, @Param("sourceId")Long sourceId); + + List getRelatedAchTaskOfExpert(@Param("id")Long id); + + List getRelatedAchCompetitionOfExpert(@Param("id")Long id); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java index 0d6b02e0c..59ecb66ac 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java @@ -5,6 +5,8 @@ import java.util.Map; import com.microservices.dms.achievementLibrary.domain.*; import com.microservices.dms.behaviorImage.domain.AchievementBehaviorSumVo; +import com.microservices.dms.resourceLibrary.domain.CompetitionResourceLibrary; +import com.microservices.dms.resourceLibrary.domain.TaskResourceLibrary; import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo; /** @@ -107,4 +109,12 @@ public interface IAchievementsService { List getProjectAreasByName(String areaName); List getExpertAreasByName(String areaName); + + List getRelatedAchCompetition(Long id, Long sourceId); + + List getRelatedAchTask(Long id, Long sourceId); + + List getRelatedAchTaskOfExpert(Long id); + + List getRelatedAchCompetitionOfExpert(Long id); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java index f660e259a..36b764b5c 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java @@ -13,7 +13,9 @@ import com.microservices.dms.behaviorImage.domain.AchievementBehaviorSumVo; import com.microservices.dms.behaviorImage.domain.AchievementImageVo; import com.microservices.dms.behaviorImage.service.IBehaviorImageService; import com.microservices.dms.resourceLibrary.domain.Clicker; +import com.microservices.dms.resourceLibrary.domain.CompetitionResourceLibrary; import com.microservices.dms.resourceLibrary.domain.Searcher; +import com.microservices.dms.resourceLibrary.domain.TaskResourceLibrary; import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo; import com.microservices.dms.resourceLibrary.mapper.ExpertResourceLibraryMapper; import com.microservices.dms.resourceLibrary.mapper.ProjectResourceLibraryMapper; @@ -454,6 +456,54 @@ public class AchievementsServiceImpl implements IAchievementsService { return relatedResultList; } + @Override + public List getRelatedAchCompetition(Long id, Long sourceId) { + List relatedResultList = new ArrayList<>(); + //想根据开源项目id,获取对应的年度信息 + List allSourceId = achievementsMapper.getAllSourceIdCompetition(id, sourceId); + List allYear = achievementsMapper.getDistinctYear(id, allSourceId); + if (StringUtils.isNotNull(allYear)) { + //遍历年度信息,获取年度成果数据 + for (String paramYear : allYear) { + AchRelatedResult relatedResult = new AchRelatedResult(); + relatedResult.setYear(paramYear); + List tmpList = achievementsMapper.getRelatedAch(id, allSourceId, paramYear); + relatedResult.setAchRelatedVoList(tmpList); + relatedResultList.add(relatedResult); + } + } + return relatedResultList; + } + + @Override + public List getRelatedAchTask(Long id, Long sourceId) { + List relatedResultList = new ArrayList<>(); + //想根据开源项目id,获取对应的年度信息 + List allSourceId = achievementsMapper.getAllSourceIdTask(id, sourceId); + List allYear = achievementsMapper.getDistinctYear(id, allSourceId); + if (StringUtils.isNotNull(allYear)) { + //遍历年度信息,获取年度成果数据 + for (String paramYear : allYear) { + AchRelatedResult relatedResult = new AchRelatedResult(); + relatedResult.setYear(paramYear); + List tmpList = achievementsMapper.getRelatedAch(id, allSourceId, paramYear); + relatedResult.setAchRelatedVoList(tmpList); + relatedResultList.add(relatedResult); + } + } + return relatedResultList; + } + + @Override + public List getRelatedAchTaskOfExpert(Long id) { + return achievementsMapper.getRelatedAchTaskOfExpert(id); + } + + @Override + public List getRelatedAchCompetitionOfExpert(Long id) { + return achievementsMapper.getRelatedAchCompetitionOfExpert(id); + } + /** * 根据查询内容,调用搜索行为接口 * diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/TaskResourceLibraryService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/TaskResourceLibraryService.java index ef16e8fe3..3b505ee7e 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/TaskResourceLibraryService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/service/TaskResourceLibraryService.java @@ -122,6 +122,8 @@ public class TaskResourceLibraryService { public int updateTaskResourceLibrary(TaskResourceLibrary taskResourceLibrary) { + taskResourceLibrary.setUpdateTime(DateUtils.getNowDate()); + taskResourceLibrary.setUpdateBy(SecurityUtils.getUsername()); return taskResourceLibraryMapper.updateTaskResourceLibrary(taskResourceLibrary); } diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index a35f2bed6..be34d134a 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -568,6 +568,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where project_id = (select project_id from project_resource_library where id = #{sourceId}) + + + + + + + + From f1da2939c68302d18c2da1c072c5b12c545ee1fb Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Sat, 17 May 2025 09:32:59 +0800 Subject: [PATCH 23/98] =?UTF-8?q?=E9=A2=86=E5=9F=9F=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/mapper/dms/ExpertResourceLibraryMapper.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml index 687cf9249..24607e9df 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml @@ -418,6 +418,7 @@ and review_area_three is not null and review_area_three != '') a group by a.domain_value + order by count(a.domain_value) desc limit 0,9 @@ -437,7 +438,7 @@ left join expert_resource_library erl on e.id = erl.user_id where e.is_delete = '0' and e.status = 1) tmp - order by (tmp.taskAuditCount + tmp.competitionAuditCount) desc +-- order by (tmp.taskAuditCount + tmp.competitionAuditCount) desc limit 0,12 From 10e80dbf4950f2f92a36a00529a64b412695017e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Sat, 17 May 2025 09:46:35 +0800 Subject: [PATCH 24/98] =?UTF-8?q?feat=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93?= =?UTF-8?q?=E3=80=91=E9=A6=96=E9=A1=B5=E7=BB=9F=E8=AE=A1=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=9E=B6=E7=9A=84=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/BigScreenStatisticService.java | 13 ++++++-- .../service/impl/AchievementsServiceImpl.java | 2 +- .../mapper/TaskResourceLibraryMapper.java | 2 ++ .../mapper/dms/AchievementsMapper.xml | 33 ++++++++++--------- .../mapper/dms/TaskResourceLibraryMapper.xml | 10 ++++++ 5 files changed, 40 insertions(+), 20 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java index fddf8c5a8..d0135b4dd 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java @@ -23,7 +23,7 @@ public class BigScreenStatisticService { Date[] days = DateUtil.getDays(0, 6); Map m = achievementsMapper.getAchievement(days[0], days[1], source) .stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV)); - List dateStr = DateUtil.getDateStrYYYYMMDD(days[0], days[1]); + List dateStr = DateUtil.getDateStrMMDD(days[0], days[1]); Date[] lastDays = DateUtil.getDays(7, 13); long lastSum = Optional.ofNullable(achievementsMapper.countAchievementBySource(lastDays[0], lastDays[1], source)).orElse(0L); long sum = Optional.ofNullable(achievementsMapper.countAchievementBySource(null, null, source)).orElse(0L); @@ -58,10 +58,17 @@ public class BigScreenStatisticService { return achievementsMapper.getAchievementType(); } - public Map> getAchievementActData() { + public List> getAchievementActData() { List list = achievementsMapper.getAchievementActData(); Map> res = list.stream().collect(Collectors.groupingBy(KeyValueVo::getKey)); - return res; + List> r = new ArrayList<>(); + res.forEach( (k, v) -> { + Map map = new HashMap<>(); + map.put("key", k); + map.put("value", v); + r.add(map); + }); + return r; } public List> getAchievementDomain() { diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java index 36b764b5c..7411fc03d 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java @@ -337,7 +337,7 @@ public class AchievementsServiceImpl implements IAchievementsService { @Override public Map indexTaskStatistic() { Map res = achievementsMapper.indexTaskStatistic(); - double convertedTaskAmount = taskResourceLibraryMapper.getConvertedTaskAmount(); + double convertedTaskAmount = taskResourceLibraryMapper.getConvertedTaskAmount2(); res.put("convertedTaskAmount", convertedTaskAmount); return res; } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/mapper/TaskResourceLibraryMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/mapper/TaskResourceLibraryMapper.java index 4737100f4..0156d62ae 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/mapper/TaskResourceLibraryMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/mapper/TaskResourceLibraryMapper.java @@ -108,4 +108,6 @@ public interface TaskResourceLibraryMapper { int delFavorite(Favorite favorite); int delWatcher(Watcher watcher); + + double getConvertedTaskAmount2(); } diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index efdfb61a4..4be566ada 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -373,33 +373,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select achievement_type as 'k', count(*) as 'v' - from achievements + from achievements where achievement_type is not null group by achievement_type @@ -517,7 +518,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" group by field_3) a group by a.domain_value order by sum(a.countResult) desc) f - right join categories c on c.id = f.name + right join categories c on c.id = f.name where f.value is not null diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TaskResourceLibraryMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TaskResourceLibraryMapper.xml index 978f2d6d5..23f270b72 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TaskResourceLibraryMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TaskResourceLibraryMapper.xml @@ -530,6 +530,16 @@ where is_transferred_to_results_library = 1) tmp + + select IFNULL(SUM(competitionAuditCount), 0) - from (select (select COUNT(distinct container_id) - from task_expert - where expert_id = e.id and container_type = 2 and `status` in (1,2)) as competitionAuditCount - from experts e) tmp + from (select COUNT(distinct container_id) as competitionAuditCount + from task_expert te + join experts e on e.id = te.expert_id and te.container_type = 2 and te.`status` in (1, 2)) tmp + + From 900122d258322d35205cc14eadaba4461e038e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Tue, 20 May 2025 08:31:45 +0800 Subject: [PATCH 27/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E6=8E=A8=E8=8D=90=E7=AE=A1=E7=90=86=E3=80=91=E6=8E=A8=E8=8D=90?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TalentReferralController.java | 4 +- .../referral/mapper/TalentReferralMapper.java | 3 ++ .../service/TalentReferralService.java | 43 +++++++++++++------ .../mapper/dms/TalentReferralMapper.xml | 4 ++ 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java index c80fd73a3..fea83de60 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java @@ -21,13 +21,13 @@ public class TalentReferralController { @GetMapping("/issueTalentReferral") @ApiOperation(value = "疑修人才推荐") public AjaxResult issueTalentReferral(@RequestParam("issueId") Long issueId, @RequestParam("projectId") Long projectId) { - return AjaxResult.success(talentReferralService.issueTalentReferral(issueId, projectId)); + return AjaxResult.success(talentReferralService.doIssueTalentReferral(issueId, projectId)); } @GetMapping("/pullRequestTalentReferral") @ApiOperation(value = "PR人才推荐") public AjaxResult pullRequestTalentReferral(@RequestParam("prId") Long prId, @RequestParam("projectId") Long projectId) { - return AjaxResult.success(talentReferralService.PRTalentReferral(prId, projectId)); + return AjaxResult.success(talentReferralService.doPRTalentReferral(prId, projectId)); } @GetMapping("/taskTalentReferral") diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java index f1778bf85..86348807f 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java @@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; @Mapper @Slave @@ -30,4 +31,6 @@ public interface TalentReferralMapper { Long selectIdByLogin(@Param("login") String login); List selectTaskByStatus(); + + Map selectUsersById(@Param("id") Long id); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java index 8810e5d3d..e464a03ea 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java @@ -4,12 +4,10 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.utils.StringUtils; -import com.microservices.common.httpClient.util.GitLinkRequestHelper; import com.microservices.dms.constant.ReferralConstant; import com.microservices.dms.referral.mapper.TalentReferralMapper; import com.microservices.dms.referral.vo.IssueDto; import com.microservices.dms.referral.vo.IssuesVo; -import com.microservices.dms.referral.vo.PullRequestVo; import com.microservices.dms.referral.vo.TaskVo; import com.microservices.dms.resourceLibrary.domain.TaskResourceLibrary; import com.microservices.dms.resourceLibrary.mapper.TaskResourceLibraryMapper; @@ -37,14 +35,14 @@ public class TalentReferralService { private DmsRequestHelper dmsRequestHelper; @Autowired - private TaskResourceLibraryMapper resourceLibraryMapper; + private TaskResourceLibraryMapper taskResourceLibraryMapper; private static final Logger logger = LoggerFactory.getLogger(TalentReferralService.class); public Set getContributors(String projectFullName) { try { // 获取项目贡献者数量 - JSONArray contributorsArray = dmsRequestHelper.getAllDataByPage(DmsGitLinkRequestUrl.CONTRIBUTORS(projectFullName), "list","total_count"); + JSONArray contributorsArray = dmsRequestHelper.getAllDataByPage(DmsGitLinkRequestUrl.CONTRIBUTORS(projectFullName), "list", "total_count"); return contributorsArray.stream().map(o -> (JSONObject) o).map(s -> s.getString("contributions")).filter(StringUtils::isNotBlank) .mapToLong(Long::parseLong).boxed().collect(Collectors.toSet()); @@ -58,7 +56,7 @@ public class TalentReferralService { public Set getCollaborators(String projectFullName) { try { // 获取项目成员者数量 - JSONArray contributorsArray = dmsRequestHelper.getAllDataByPage(DmsGitLinkRequestUrl.QUERY_USER_FROM_PROJECT(projectFullName), "members","total_count"); + JSONArray contributorsArray = dmsRequestHelper.getAllDataByPage(DmsGitLinkRequestUrl.QUERY_USER_FROM_PROJECT(projectFullName), "members", "total_count"); return contributorsArray.stream().map(o -> (JSONObject) o).map(s -> s.getString("id")) .filter(StringUtils::isNotBlank).mapToLong(Long::parseLong).boxed().collect(Collectors.toSet()); @@ -93,6 +91,14 @@ public class TalentReferralService { return collaborators; } + public List> doIssueTalentReferral(Long projectId, Long issueId) { + List> entries = issueTalentReferral(projectId, issueId); + return entries.stream().map(s->{ + Map mm = talentReferralMapper.selectUsersById(s.getKey()); + return mm; + }).collect(Collectors.toList()); + } + public List> issueTalentReferral(Long projectId, Long issueId) { IssuesVo curIssue = talentReferralMapper.selectIssuesById(issueId); @@ -224,6 +230,13 @@ public class TalentReferralService { return new HashSet<>(); } + public List> doPRTalentReferral(Long projectId, Long prId) { + List> entries = PRTalentReferral(projectId, prId); + return entries.stream().map(s->{ + Map mm = talentReferralMapper.selectUsersById(s.getKey()); + return mm; + }).collect(Collectors.toList()); + } public List> PRTalentReferral(Long projectId, Long prId) { List openPullRequests = getPullRequests(projectId, "1"); @@ -241,7 +254,7 @@ public class TalentReferralService { } //定时统计 - public void projectsStatistic(){ + public void projectsStatistic() { } @@ -253,11 +266,17 @@ public class TalentReferralService { */ public List taskTalentReferral(Long taskId) { List taskVos = talentReferralMapper.selectTaskByStatus(); - List taskResourceLibraries = resourceLibraryMapper.selectTaskResourceLibraryList(new TaskResourceLibrary()); - taskResourceLibraries.forEach(t -> { - List trTaskIds = doTaskTalentReferral(t,taskVos); - }); - return null; + TaskResourceLibrary tCond = new TaskResourceLibrary(); + tCond.setTaskId(taskId); + List taskResourceLibraries = taskResourceLibraryMapper.selectTaskResourceLibraryList(tCond); + List result = new ArrayList<>(); + for (TaskResourceLibrary t : taskResourceLibraries) { + List trTaskIds = doTaskTalentReferral(t, taskVos); + result = trTaskIds.stream().map(s -> taskVos.stream().filter(e -> e.getTaskId().equals(s)).findFirst().orElse(null)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + return result; } private List doTaskTalentReferral(TaskResourceLibrary task, List taskVos) { @@ -274,7 +293,7 @@ public class TalentReferralService { } step1Map.forEach((k, v) -> step2Map.merge(k, v, Double::sum)); - step2Map.keySet().removeIf(step -> Double.compare(step2Map.get(step) , 0.0D) > 0); + step2Map.keySet().removeIf(step -> Double.compare(step2Map.get(step), 0.0D) > 0); List> entryList = new ArrayList<>(step2Map.entrySet()); entryList.sort((entry1, entry2) -> Double.compare(entry2.getValue(), entry1.getValue())); diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml index d40718f8d..70e0bb961 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml @@ -73,5 +73,9 @@ where status in (3, 4) + + From 99952b884fdb6a7058b21f0416dbbad010bb8efb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Tue, 20 May 2025 11:15:09 +0800 Subject: [PATCH 28/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E6=8E=A8=E8=8D=90=E7=AE=A1=E7=90=86=E3=80=91=E5=88=9B=E5=AE=A2?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=88=90=E6=9E=9C=E6=8E=A8=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dms/constant/TaskConstant.java | 15 ++++++- .../referral/mapper/TalentReferralMapper.java | 2 + .../service/TalentReferralService.java | 42 ++++++++++--------- .../mapper/dms/TalentReferralMapper.xml | 7 ++++ 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/TaskConstant.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/TaskConstant.java index b70c6bdaa..1b65ce24f 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/TaskConstant.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/TaskConstant.java @@ -2,7 +2,8 @@ package com.microservices.dms.constant; public class TaskConstant { - private TaskConstant() {} + private TaskConstant() { + } public static final String TASK_TYPE_WATCHERS = "MakerTask"; public static final String TASK_TYPE_JOURNALS = "makerSpaceTask"; @@ -22,4 +23,16 @@ public class TaskConstant { public static final String EXPERTS = "Experts"; public static final String ACHIEVEMENTS = "Achievements"; + // task status dict + public static final int DRAFT_STATUS = 0; //草稿状态 + public static final int TO_BE_REVIEWED_STATUS = 1; //待审核状态 + public static final int REFUSED_STATUS = 2; //已拒绝状态 + public static final int TASK_PAPER_COLLECTING_STATUS = 3; //成果征集中状态 + public static final int TASK_PAPER_CHOOSING_STATUS = 4; //成果评选中状态 + public static final int TASK_RESULT_PROOF_STATUS = 5; //公示中状态 + public static final int TASK_SIGNING_STATUS = 6; //协议签定中状态 + public static final int TASK_PAYING_STATUS = 7; //支付中状态 + public static final int TASK_COMPLETE_STATUS = 8; //任务完成状态 + public static final int TASK_TO_BE_REPAIRED_STATUS = 9; //待修缮状态 + } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java index 86348807f..399d5432b 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java @@ -33,4 +33,6 @@ public interface TalentReferralMapper { List selectTaskByStatus(); Map selectUsersById(@Param("id") Long id); + + TaskVo selectTaskById(@Param("id") Long id); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java index e464a03ea..8ab5d7164 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java @@ -4,6 +4,8 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.utils.StringUtils; +import com.microservices.dms.achievementLibrary.domain.Achievements; +import com.microservices.dms.achievementLibrary.mapper.AchievementsMapper; import com.microservices.dms.constant.ReferralConstant; import com.microservices.dms.referral.mapper.TalentReferralMapper; import com.microservices.dms.referral.vo.IssueDto; @@ -35,7 +37,7 @@ public class TalentReferralService { private DmsRequestHelper dmsRequestHelper; @Autowired - private TaskResourceLibraryMapper taskResourceLibraryMapper; + private AchievementsMapper achievementsMapper; private static final Logger logger = LoggerFactory.getLogger(TalentReferralService.class); @@ -264,31 +266,33 @@ public class TalentReferralService { * 3、根据1中任务标题和任务正文 与数据仓库中名称和简介、详情比较 ;取前10获取对比计算分值大于0的结果 * 4、将2和3的结果相加,取前5个成果进行推荐 */ - public List taskTalentReferral(Long taskId) { - List taskVos = talentReferralMapper.selectTaskByStatus(); - TaskResourceLibrary tCond = new TaskResourceLibrary(); - tCond.setTaskId(taskId); - List taskResourceLibraries = taskResourceLibraryMapper.selectTaskResourceLibraryList(tCond); - List result = new ArrayList<>(); - for (TaskResourceLibrary t : taskResourceLibraries) { - List trTaskIds = doTaskTalentReferral(t, taskVos); - result = trTaskIds.stream().map(s -> taskVos.stream().filter(e -> e.getTaskId().equals(s)).findFirst().orElse(null)) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - } + public List taskTalentReferral(Long taskId) { + TaskVo task = talentReferralMapper.selectTaskById(taskId); + Achievements tCond = new Achievements(); + tCond.setSourceId(taskId); + tCond.setSource("2"); + tCond.setStatus("1"); + List taskAchievements = achievementsMapper.selectAchievementsList(tCond); + List result; + + List trTaskIds = doTaskTalentReferral(task, taskAchievements); + result = trTaskIds.stream().map(s -> taskAchievements.stream().filter(e -> e.getId().equals(s)).findFirst().orElse(null)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + return result; } - private List doTaskTalentReferral(TaskResourceLibrary task, List taskVos) { - String taskDomain = task.getTaskDomain(); + private List doTaskTalentReferral(TaskVo task, List taskVos) { + Long taskDomain = task.getCategoryId(); Map step1Map = new TreeMap<>(); Map step2Map = new TreeMap<>(); - for (TaskVo t1 : taskVos) { - if (Objects.equals(String.valueOf(t1.getCategoryId()), taskDomain)) { + for (Achievements t1 : taskVos) { + if (Objects.equals(String.valueOf(taskDomain), t1.getField1())) { step1Map.put(t1.getId(), 50.0D); } - double subjectFraction = SimilarityService.sentence(task.getTaskName(), t1.getName()); - double descFraction = SimilarityService.text(t1.getDescription(), task.getReleaseDetails()); + double subjectFraction = SimilarityService.sentence(task.getName(), t1.getAchievementName()); + double descFraction = SimilarityService.text(t1.getSummary(), task.getDescription()); step2Map.put(t1.getId(), (subjectFraction + descFraction) * 50.0D); } diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml index 70e0bb961..c8c4a7736 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml @@ -77,5 +77,12 @@ select id,login,nickname from users where id = #{id} + + From 79e05c109c4d6f3c8061c9a96efc4a67fd9817bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Tue, 20 May 2025 14:56:27 +0800 Subject: [PATCH 29/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E6=8E=A8=E8=8D=90=E7=AE=A1=E7=90=86=E3=80=91=E5=88=9B=E5=AE=A2?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=AF=84=E5=AE=A1=E4=B8=93=E5=AE=B6=E6=8E=A8?= =?UTF-8?q?=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TalentReferralController.java | 16 +++- .../referral/mapper/TalentReferralMapper.java | 9 +- .../service/TalentReferralService.java | 89 ++++++++++++++----- .../dms/referral/vo/ExpertVo.java | 15 ++++ .../mapper/dms/TalentReferralMapper.xml | 21 ++++- 5 files changed, 124 insertions(+), 26 deletions(-) create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/ExpertVo.java diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java index fea83de60..ea7c3c4e4 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java @@ -30,9 +30,17 @@ public class TalentReferralController { return AjaxResult.success(talentReferralService.doPRTalentReferral(prId, projectId)); } - @GetMapping("/taskTalentReferral") - @ApiOperation(value = "任务推荐") - public AjaxResult taskTalentReferral(@RequestParam("taskId") Long taskId) { - return AjaxResult.success(talentReferralService.taskTalentReferral(taskId)); + @GetMapping("/taskAchievementTalentReferral") + @ApiOperation(value = "任务成果推荐") + public AjaxResult taskAchievementTalentReferral(@RequestParam("taskId") Long taskId) { + return AjaxResult.success(talentReferralService.taskAchievementTalentReferral(taskId)); } + + @GetMapping("/taskExpertTalentReferral") + @ApiOperation(value = "任务专家推荐") + public AjaxResult taskExpertTalentReferral(@RequestParam("taskId") Long taskId) { + return AjaxResult.success(talentReferralService.taskExpertTalentReferral(taskId)); + } + + } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java index 399d5432b..052224a63 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java @@ -1,9 +1,12 @@ package com.microservices.dms.referral.mapper; import com.microservices.common.datasource.annotation.Slave; +import com.microservices.dms.achievementLibrary.domain.KeyValueVo; +import com.microservices.dms.referral.vo.ExpertVo; import com.microservices.dms.referral.vo.IssuesVo; import com.microservices.dms.referral.vo.PullRequestVo; import com.microservices.dms.referral.vo.TaskVo; +import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -30,9 +33,13 @@ public interface TalentReferralMapper { Long selectIdByLogin(@Param("login") String login); - List selectTaskByStatus(); + List selectTaskByStatus(@Param("statusIds") List statusIds); Map selectUsersById(@Param("id") Long id); TaskVo selectTaskById(@Param("id") Long id); + + List selectExpertsBy(ExpertVo expertVo); + + List> allTaskWithExpertIds(@Param("type") String type); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java index 8ab5d7164..74c0b5b10 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java @@ -2,17 +2,20 @@ package com.microservices.dms.referral.service; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; +import com.google.common.collect.Lists; import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.utils.StringUtils; import com.microservices.dms.achievementLibrary.domain.Achievements; +import com.microservices.dms.achievementLibrary.domain.KeyValueVo; import com.microservices.dms.achievementLibrary.mapper.AchievementsMapper; import com.microservices.dms.constant.ReferralConstant; +import com.microservices.dms.constant.TaskConstant; import com.microservices.dms.referral.mapper.TalentReferralMapper; +import com.microservices.dms.referral.vo.ExpertVo; import com.microservices.dms.referral.vo.IssueDto; import com.microservices.dms.referral.vo.IssuesVo; import com.microservices.dms.referral.vo.TaskVo; -import com.microservices.dms.resourceLibrary.domain.TaskResourceLibrary; -import com.microservices.dms.resourceLibrary.mapper.TaskResourceLibraryMapper; +import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo; import com.microservices.dms.utils.DmsGitLinkRequestUrl; import com.microservices.dms.utils.DmsRequestHelper; import com.microservices.dms.utils.SimilarityService; @@ -46,8 +49,7 @@ public class TalentReferralService { // 获取项目贡献者数量 JSONArray contributorsArray = dmsRequestHelper.getAllDataByPage(DmsGitLinkRequestUrl.CONTRIBUTORS(projectFullName), "list", "total_count"); - return contributorsArray.stream().map(o -> (JSONObject) o).map(s -> s.getString("contributions")).filter(StringUtils::isNotBlank) - .mapToLong(Long::parseLong).boxed().collect(Collectors.toSet()); + return contributorsArray.stream().map(o -> (JSONObject) o).map(s -> s.getString("contributions")).filter(StringUtils::isNotBlank).mapToLong(Long::parseLong).boxed().collect(Collectors.toSet()); } catch (ServiceException e) { logger.error("【{}】获取项目贡献者数量失败:{}", projectFullName, e.getMessage()); @@ -60,8 +62,7 @@ public class TalentReferralService { // 获取项目成员者数量 JSONArray contributorsArray = dmsRequestHelper.getAllDataByPage(DmsGitLinkRequestUrl.QUERY_USER_FROM_PROJECT(projectFullName), "members", "total_count"); - return contributorsArray.stream().map(o -> (JSONObject) o).map(s -> s.getString("id")) - .filter(StringUtils::isNotBlank).mapToLong(Long::parseLong).boxed().collect(Collectors.toSet()); + return contributorsArray.stream().map(o -> (JSONObject) o).map(s -> s.getString("id")).filter(StringUtils::isNotBlank).mapToLong(Long::parseLong).boxed().collect(Collectors.toSet()); } catch (ServiceException e) { logger.error("【{}】获取项目成员者数量失败:{}", projectFullName, e.getMessage()); @@ -95,7 +96,7 @@ public class TalentReferralService { public List> doIssueTalentReferral(Long projectId, Long issueId) { List> entries = issueTalentReferral(projectId, issueId); - return entries.stream().map(s->{ + return entries.stream().map(s -> { Map mm = talentReferralMapper.selectUsersById(s.getKey()); return mm; }).collect(Collectors.toList()); @@ -179,8 +180,7 @@ public class TalentReferralService { } // 计算每个负责人关闭的 PR数量 - closedPullRequests.stream().map(IssueDto::getReviewers).flatMap(List::stream) - .forEach(s -> userNameFractionMap.merge(s, 40.0D, Double::sum)); + closedPullRequests.stream().map(IssueDto::getReviewers).flatMap(List::stream).forEach(s -> userNameFractionMap.merge(s, 40.0D, Double::sum)); } @@ -234,7 +234,7 @@ public class TalentReferralService { public List> doPRTalentReferral(Long projectId, Long prId) { List> entries = PRTalentReferral(projectId, prId); - return entries.stream().map(s->{ + return entries.stream().map(s -> { Map mm = talentReferralMapper.selectUsersById(s.getKey()); return mm; }).collect(Collectors.toList()); @@ -242,13 +242,10 @@ public class TalentReferralService { public List> PRTalentReferral(Long projectId, Long prId) { List openPullRequests = getPullRequests(projectId, "1"); - openPullRequests = openPullRequests.stream().filter(e -> e.getReviewers().isEmpty()) - .collect(Collectors.toList()); + openPullRequests = openPullRequests.stream().filter(e -> e.getReviewers().isEmpty()).collect(Collectors.toList()); if (prId != null) { - openPullRequests = openPullRequests.stream().filter(e -> Objects.equals((long) (e.getId()), prId)) - .filter(e -> e.getReviewers().isEmpty()) - .collect(Collectors.toList()); + openPullRequests = openPullRequests.stream().filter(e -> Objects.equals((long) (e.getId()), prId)).filter(e -> e.getReviewers().isEmpty()).collect(Collectors.toList()); return PRTalentReferral(projectId, prId, openPullRequests); } @@ -266,7 +263,7 @@ public class TalentReferralService { * 3、根据1中任务标题和任务正文 与数据仓库中名称和简介、详情比较 ;取前10获取对比计算分值大于0的结果 * 4、将2和3的结果相加,取前5个成果进行推荐 */ - public List taskTalentReferral(Long taskId) { + public List taskAchievementTalentReferral(Long taskId) { TaskVo task = talentReferralMapper.selectTaskById(taskId); Achievements tCond = new Achievements(); tCond.setSourceId(taskId); @@ -276,9 +273,7 @@ public class TalentReferralService { List result; List trTaskIds = doTaskTalentReferral(task, taskAchievements); - result = trTaskIds.stream().map(s -> taskAchievements.stream().filter(e -> e.getId().equals(s)).findFirst().orElse(null)) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + result = trTaskIds.stream().map(s -> taskAchievements.stream().filter(e -> e.getId().equals(s)).findFirst().orElse(null)).filter(Objects::nonNull).limit(5).collect(Collectors.toList()); return result; } @@ -302,6 +297,60 @@ public class TalentReferralService { List> entryList = new ArrayList<>(step2Map.entrySet()); entryList.sort((entry1, entry2) -> Double.compare(entry2.getValue(), entry1.getValue())); - return entryList.stream().map(Map.Entry::getKey).limit(5).collect(Collectors.toList()); + return entryList.stream().map(Map.Entry::getKey).collect(Collectors.toList()); + } + + + /** + * 创客任务评审专家推荐 + * 1、先查找创客任务状态未结束,并且已加入评审的数据,新增存储到数据表中 + * 2、技术匹配度:系统中专家领域 与 任务是一样的领域 20% + * 3、根据1中任务标题和任务描述 与专家简介进行比较 ,匹配结果分数,取前10;30% + * 4、根据1中任务标题和任务描述 与已完成的任务标题与任务描述比较,匹配结果分数,取前3 ,前3个竞赛中对应的专家 分数*50% + */ + public Object taskExpertTalentReferral(Long taskId) { + TaskVo task = talentReferralMapper.selectTaskById(taskId); + List categories = achievementsMapper.getAreasByName(null); + List completedTasks = talentReferralMapper.selectTaskByStatus(Lists.newArrayList(TaskConstant.TASK_COMPLETE_STATUS)); + List allExperts = talentReferralMapper.selectExpertsBy(new ExpertVo()); + + List expertIds = doTaskExpertTalentReferral(task, categories, completedTasks, allExperts); + return expertIds.stream().map(s -> allExperts.stream().filter(e -> e.getId().equals(s)).findFirst().orElse(null)).filter(Objects::nonNull).limit(3).collect(Collectors.toList()); + } + + private List doTaskExpertTalentReferral(TaskVo task, List categories, List completedTasks, List allExperts) { + + Map v2k = categories.stream().collect(Collectors.toMap(KeyValueVo::getValue, KeyValueVo::getKey, (o, n) -> n)); + + String taskDomain = v2k.get(task.getCategoryId()); + Map step1Map = new TreeMap<>(); + Map step2Map = new TreeMap<>(); + for (ExpertVo t1 : allExperts) { + if (Objects.equals(taskDomain, t1.getReviewAreaOne()) || Objects.equals(taskDomain, t1.getReviewAreaTwo()) || Objects.equals(taskDomain, t1.getReviewAreaThree())) { + step1Map.put(t1.getId(), 50.0D); + } + } + + List> allTaskWithExpertIds = talentReferralMapper.allTaskWithExpertIds("1"); + Map t2e = allTaskWithExpertIds.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV, (o, n) -> n)); + for (TaskVo t2 : completedTasks) { + double subjectFraction = SimilarityService.sentence(task.getName(), t2.getName()); + double descFraction = SimilarityService.text(t2.getDescription(), task.getDescription()); + + String[] split = t2e.getOrDefault(t2.getId(), "").split(","); + for (String s : split) { + if (StringUtils.isNotBlank(s)) { + step2Map.put(Long.parseLong(s), (subjectFraction + descFraction) * 50.0D); + } + } + } + + step1Map.forEach((k, v) -> step2Map.merge(k, v, Double::sum)); + + List> entryList = new ArrayList<>(step2Map.entrySet()); + entryList.sort((entry1, entry2) -> Double.compare(entry2.getValue(), entry1.getValue())); + + return entryList.stream().map(Map.Entry::getKey).collect(Collectors.toList()); + } } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/ExpertVo.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/ExpertVo.java new file mode 100644 index 000000000..bdc97e061 --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/ExpertVo.java @@ -0,0 +1,15 @@ +package com.microservices.dms.referral.vo; + +import lombok.Data; + +@Data +public class ExpertVo { + Long id; + Long userId; + String expertName; + String nickname; + String reviewAreaOne; + String reviewAreaTwo; + String reviewAreaThree; + Integer status; +} diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml index c8c4a7736..e73cb7597 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml @@ -70,7 +70,10 @@ select t.id,td.task_id, name, status, category_id, description from tasks t join task_details td on t.id = td.task_id - where status in (3, 4) + where status in + + #{item} + + + + + From 7f54998e61c3b606adf54a71f808802bef257bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Tue, 20 May 2025 17:08:38 +0800 Subject: [PATCH 30/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E6=8E=A8=E8=8D=90=E7=AE=A1=E7=90=86=E3=80=91=E5=BC=80=E6=BA=90?= =?UTF-8?q?=E7=AB=9E=E8=B5=9B=E8=AF=84=E5=AE=A1=E4=B8=93=E5=AE=B6=E6=8E=A8?= =?UTF-8?q?=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TalentReferralController.java | 11 +++++ .../referral/mapper/TalentReferralMapper.java | 4 ++ .../service/TalentReferralService.java | 47 +++++++++++++++++++ .../microservices/dms/referral/vo/TaskVo.java | 2 +- .../mapper/dms/TalentReferralMapper.xml | 14 +++++- 5 files changed, 76 insertions(+), 2 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java index ea7c3c4e4..332283fa4 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/controller/TalentReferralController.java @@ -4,12 +4,16 @@ import com.microservices.common.core.web.domain.AjaxResult; import com.microservices.dms.referral.service.TalentReferralService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; +import lombok.ToString; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +@Data @Api(tags = "数据管理体系-推荐接口") @RestController @RequestMapping("/talentReferral") @@ -43,4 +47,11 @@ public class TalentReferralController { } + @GetMapping("/competitionExpertTalentReferral") + @ApiOperation(value = "竞赛专家推荐") + public AjaxResult competitionExpertTalentReferral(@RequestParam("competitionId") Long competitionId) { + return AjaxResult.success(talentReferralService.competitionExpertTalentReferral(competitionId)); + } + + } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java index 052224a63..758b22bde 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java @@ -42,4 +42,8 @@ public interface TalentReferralMapper { List selectExpertsBy(ExpertVo expertVo); List> allTaskWithExpertIds(@Param("type") String type); + + TaskVo selectCompetitionById(Long competitionId); + + List selectCompetitionIdByStatus(); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java index 74c0b5b10..0bd2d9ab0 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java @@ -353,4 +353,51 @@ public class TalentReferralService { return entryList.stream().map(Map.Entry::getKey).collect(Collectors.toList()); } + + /** + * 开源竞赛评审专家推荐 + * 1、先查找开放竞赛状态未结束,并且已提交评审的数据,新增存储到数据表中 + * 2、技术匹配度:系统中专家领域 与 竞赛是一样的领域 ; 20% + * 3、根据1中竞赛标题和竞赛描述 与专家简介进行比较 ,匹配结果分数,取前10;30% + * 4、根据1中竞赛标题和竞赛描述 与已完成的竞赛标题与竞赛描述比较,匹配结果分数,取前3 ,前3个竞赛中对应的专家;*50% + */ + public Object competitionExpertTalentReferral(Long competitionId) { + TaskVo task = talentReferralMapper.selectCompetitionById(competitionId); + List categories = new ArrayList<>(); + List completedTasks = talentReferralMapper.selectCompetitionIdByStatus(); + List allExperts = talentReferralMapper.selectExpertsBy(new ExpertVo()); + + List expertIds = doCompetitionExpertTalentReferral(task, categories, completedTasks, allExperts); + return expertIds.stream().map(s -> allExperts.stream().filter(e -> e.getId().equals(s)).findFirst().orElse(null)).filter(Objects::nonNull).limit(3).collect(Collectors.toList()); + } + + + private List doCompetitionExpertTalentReferral(TaskVo task, List categories, List completedTasks, List allExperts) { + + Map step1Map = new TreeMap<>(); + Map step2Map = new TreeMap<>(); + + + List> allTaskWithExpertIds = talentReferralMapper.allTaskWithExpertIds("2"); + Map t2e = allTaskWithExpertIds.stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV, (o, n) -> n)); + for (TaskVo t2 : completedTasks) { + double subjectFraction = SimilarityService.sentence(task.getName(), t2.getName()); + double descFraction = SimilarityService.text(t2.getDescription(), task.getDescription()); + + String[] split = t2e.getOrDefault(t2.getId(), "").split(","); + for (String s : split) { + if (StringUtils.isNotBlank(s)) { + step2Map.put(Long.parseLong(s), (subjectFraction + descFraction) * 100.0D); + } + } + } + + step1Map.forEach((k, v) -> step2Map.merge(k, v, Double::sum)); + + List> entryList = new ArrayList<>(step2Map.entrySet()); + entryList.sort((entry1, entry2) -> Double.compare(entry2.getValue(), entry1.getValue())); + + return entryList.stream().map(Map.Entry::getKey).collect(Collectors.toList()); + + } } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/TaskVo.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/TaskVo.java index f465c2cb2..03562874b 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/TaskVo.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/TaskVo.java @@ -9,5 +9,5 @@ public class TaskVo { private String name; private String description; private Long categoryId; - private Integer status; + private String identifier; } diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml index e73cb7597..d5aca4823 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml @@ -84,7 +84,7 @@ select t.id,td.task_id, name, status, category_id, description from tasks t join task_details td on t.id = td.task_id - where t.id =#{id} and status in (3, 4) + where t.id =#{id} + + + + From 070a4046858c45b69fdf86f1bb46649b18778573 Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Wed, 21 May 2025 14:51:29 +0800 Subject: [PATCH 31/98] =?UTF-8?q?=E6=88=90=E6=9E=9C=E8=81=9A=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AchievementsController.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementsController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementsController.java index e1995e580..c4a034636 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementsController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementsController.java @@ -220,10 +220,8 @@ public class AchievementsController extends BaseController { public AjaxResult getActDataStatisticById(Long id) { return success(achievementsService.getActDataStatisticById(id)); } - /** - * 根据领域,将成果数据进行分类 - * - */ + + @ApiOperation("根据领域,将成果数据进行分类") @GetMapping("/getAreaStatistic") public AjaxResult getAreaStatistic(String areaKey) { From 618e3a77318fb6d469bf9be72121a8c8ba19b2b6 Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Wed, 21 May 2025 15:00:10 +0800 Subject: [PATCH 32/98] =?UTF-8?q?=E4=B8=93=E5=AE=B6=E9=A2=86=E5=9F=9F?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E4=B8=BA=E7=A9=BA=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/dms/AchievementsMapper.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index 4be566ada..64dc7a93b 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -434,6 +434,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" union all select review_area_one as "domainName" from experts )a + where a.domainName is not null and a.domainName !="" + + \ No newline at end of file From d6141fe73d548aaeb7f47b3ad69cbfa5b8749fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Wed, 21 May 2025 16:48:32 +0800 Subject: [PATCH 34/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E5=B1=95=E7=A4=BA=E3=80=91=E6=88=90=E6=9E=9C?= =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E7=9A=84=E9=9C=80=E6=B1=82=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/AchievementsMapper.java | 16 ++- .../service/BigScreenStatisticService.java | 106 +++++++++++++++--- .../com/microservices/dms/utils/DateUtil.java | 27 +++++ .../mapper/dms/AchievementsMapper.xml | 37 +++++- .../dms/CompetitionResourceLibraryMapper.xml | 12 +- 5 files changed, 167 insertions(+), 31 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java index 5ba9393f9..d2e4052a7 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java @@ -1,9 +1,6 @@ package com.microservices.dms.achievementLibrary.mapper; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import com.microservices.common.datasource.annotation.Master; import com.microservices.common.datasource.annotation.Slave; @@ -117,7 +114,7 @@ public interface AchievementsMapper { List> getAchievementType(); - List getAchievementActData(); + List getAchievementActData(@Param("s") Date s, @Param("e") Date e); List> getAchievementDomain(); @@ -150,4 +147,13 @@ public interface AchievementsMapper { List getRelatedAchTaskOfExpert(@Param("id")Long id); List getRelatedAchCompetitionOfExpert(@Param("id")Long id); + + List> getAchievementAddYearlyData(@Param("s") Date s, @Param("e") Date e); + + List getAchievementActDataW(@Param("s") Date s, @Param("e") Date e); + + List getAchievementActDataC(@Param("s") Date s, @Param("e") Date e); + + List getAchievementActDataD(@Param("s") Date s, @Param("e") Date e); + List getAchievementActDataF(@Param("s") Date s, @Param("e") Date e); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java index d0135b4dd..f8870f8f8 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java @@ -1,5 +1,6 @@ package com.microservices.dms.achievementLibrary.service; +import com.alibaba.nacos.shaded.com.google.common.collect.Maps; import com.microservices.dms.achievementLibrary.domain.KeyValueVo; import com.microservices.dms.achievementLibrary.mapper.AchievementsMapper; import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo; @@ -59,15 +60,75 @@ public class BigScreenStatisticService { } public List> getAchievementActData() { - List list = achievementsMapper.getAchievementActData(); - Map> res = list.stream().collect(Collectors.groupingBy(KeyValueVo::getKey)); + Date[] days = DateUtil.getDays(0, 6); + Map wlist = achievementsMapper.getAchievementActDataW(days[0], days[1]).stream().collect(Collectors.toMap(KeyValueVo::getName, KeyValueVo::getValue)); + Map clist = achievementsMapper.getAchievementActDataC(days[0], days[1]).stream().collect(Collectors.toMap(KeyValueVo::getName, KeyValueVo::getValue)); + Map dlist = achievementsMapper.getAchievementActDataD(days[0], days[1]).stream().collect(Collectors.toMap(KeyValueVo::getName, KeyValueVo::getValue)); + Map flist = achievementsMapper.getAchievementActDataF(days[0], days[1]).stream().collect(Collectors.toMap(KeyValueVo::getName, KeyValueVo::getValue)); + + List dateStr = DateUtil.getDateStrMMDD(days[0], days[1]); + List wres = new ArrayList<>(); + List cres = new ArrayList<>(); + List dres = new ArrayList<>(); + List fres = new ArrayList<>(); + + for (String s : dateStr) { + Long a = wlist.getOrDefault(s, 0L); + KeyValueVo k1 = new KeyValueVo(); + k1.setKey(s); + k1.setValue(a); + k1.setName("关注"); + wres.add(k1); + } + + for (String s : dateStr) { + Long a = clist.getOrDefault(s, 0L); + KeyValueVo k1 = new KeyValueVo(); + k1.setKey(s); + k1.setValue(a); + k1.setName("浏览"); + cres.add(k1); + } + + + for (String s : dateStr) { + Long a = dlist.getOrDefault(s, 0L); + KeyValueVo k1 = new KeyValueVo(); + k1.setKey(s); + k1.setValue(a); + k1.setName("下载"); + dres.add(k1); + } + + for (String s : dateStr) { + Long a = flist.getOrDefault(s, 0L); + KeyValueVo k1 = new KeyValueVo(); + k1.setKey(s); + k1.setValue(a); + k1.setName("收藏"); + fres.add(k1); + } + List> r = new ArrayList<>(); - res.forEach( (k, v) -> { - Map map = new HashMap<>(); - map.put("key", k); - map.put("value", v); - r.add(map); - }); + Map w = new HashMap<>(); + w.put("key", "关注"); + w.put("value", wres); + Map c = new HashMap<>(); + c.put("key","浏览"); + c.put("value", cres); + Map d = new HashMap<>(); + c.put("key","下载"); + d.put("value", dres); + Map f = new HashMap<>(); + f.put("key", "收藏"); + f.put("value", fres); + + + r.add(w); + r.add(c); + r.add(d); + r.add(f); + return r; } @@ -75,8 +136,22 @@ public class BigScreenStatisticService { return achievementsMapper.getAchievementDomain(); } - public List> getAchievementAddYearly() { - return achievementsMapper.getAchievementAddYearly(); + public Object getAchievementAddYearly() { + + Date[] currentYear = DateUtil.getLast12Months(); + + Map m = achievementsMapper.getAchievementAddYearlyData(currentYear[0],currentYear[1]) + .stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV)); + List dateStr = DateUtil.getDateStrYYYYMM(currentYear[0], currentYear[1]); + List> res = new ArrayList<>(); + for (String s : dateStr) { + Long a = m.getOrDefault(s, 0L); + KeyValVo k1 = new KeyValVo<>(); + k1.setK(s); + k1.setV(a); + res.add(k1); + } + return res; } public List> getAchievementHotRank() { @@ -109,11 +184,11 @@ public class BigScreenStatisticService { } public List> getCompetitionYearlyPaperAdd() { - Date[] currentYear = DateUtil.getCurrentYear(); + Date[] currentYear = DateUtil.getLast12Months(); Map m = competitionResourceLibraryMapper.getCompetitionYearlyPaperAdd(currentYear[0],currentYear[1]) .stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV)); - List dateStr = DateUtil.getDateStrMMDD(currentYear[0], currentYear[1]); + List dateStr = DateUtil.getDateStrYYYYMM(currentYear[0], currentYear[1]); List> res = new ArrayList<>(); for (String s : dateStr) { Long a = m.getOrDefault(s, 0L); @@ -126,12 +201,11 @@ public class BigScreenStatisticService { } public List> getCompetitionYearlyFinish() { - Date[] currentYear = DateUtil.getCurrentYear(); - Date[] YearEndOfCur = DateUtil.getCurrentYearEndOf(LocalDate.now()); + Date[] currentYear = DateUtil.getLast12Months(); - Map m = competitionResourceLibraryMapper.getCompetitionYearlyFinish(YearEndOfCur[0],YearEndOfCur[1]) + Map m = competitionResourceLibraryMapper.getCompetitionYearlyFinish(currentYear[0],currentYear[1]) .stream().collect(Collectors.toMap(KeyValVo::getK, KeyValVo::getV)); - List dateStr = DateUtil.getDateStrMMDD(currentYear[0], currentYear[1]); + List dateStr = DateUtil.getDateStrYYYYMM(currentYear[0], currentYear[1]); List> res = new ArrayList<>(); for (String s : dateStr) { Long a = m.getOrDefault(s, 0L); diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DateUtil.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DateUtil.java index 5843e5095..18fb86961 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DateUtil.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DateUtil.java @@ -42,6 +42,20 @@ public class DateUtil { }; } + public static Date[] getLast12Months() { + LocalDate endDate = LocalDate.now(); + + LocalDate startDate = endDate.minusMonths(11); + + LocalDateTime startDateTime = LocalDateTime.of(startDate.getYear(),startDate.getMonth(),1,0,0,0); + LocalDateTime endDateTime = endDate.atTime(23, 59, 59); + + return new Date[]{ + Date.from(startDateTime.atZone(ZoneId.systemDefault()).toInstant()), + Date.from(endDateTime.atZone(ZoneId.systemDefault()).toInstant()) + }; + } + public static Date[] getCurrentYearEndOf(LocalDate endDate) { Year year = Year.now(); @@ -68,6 +82,19 @@ public class DateUtil { .collect(Collectors.toList()); } + + public static List getDateStrYYYYMM(Date start, Date end) { + LocalDate s = start.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().toLocalDate(); + LocalDate e = end.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().toLocalDate(); + String pattern = "yyyy-MM"; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + + return LongStream.range(0, s.until(e).getMonths() + 1) + .mapToObj(s::plusMonths) + .map(formatter::format) + .collect(Collectors.toList()); + } + public static List getDateStrYYYYMMDD(Date start, Date end) { LocalDate s = start.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().toLocalDate(); LocalDate e = end.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().toLocalDate(); diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index 64dc7a93b..e03c1ca4e 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -493,13 +493,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -670,4 +670,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where a.id=#{id} + + + + + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/CompetitionResourceLibraryMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/CompetitionResourceLibraryMapper.xml index e1457d782..dba346015 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/CompetitionResourceLibraryMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/CompetitionResourceLibraryMapper.xml @@ -284,21 +284,21 @@ Date: Wed, 21 May 2025 17:03:33 +0800 Subject: [PATCH 35/98] =?UTF-8?q?=E4=B8=93=E5=AE=B6=E8=AF=84=E5=AE=A1?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/dms/ExpertResourceLibraryMapper.xml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml index ae078cde6..17a099b26 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml @@ -429,16 +429,12 @@ (tmp.taskAuditCount + tmp.competitionAuditCount) as "total" from (select e.expert_name, (select COUNT(distinct container_id) from task_expert where expert_id = e.id and container_type = 1 and `status` in (1,2)) as taskAuditCount, - (select COUNT(distinct container_id) - from task_expert - where expert_id = e.id - and container_type = 2 and `status` in (1,2)) as competitionAuditCount + (select COUNT(distinct container_id) from task_expert where expert_id = e.id and container_type = 2 and `status` in (1,2)) as competitionAuditCount from experts e - inner join users u on e.user_id = u.id - left join expert_resource_library erl on e.id = erl.user_id + left join users u on e.user_id = u.id where e.is_delete = '0' and e.status = 1) tmp --- order by (tmp.taskAuditCount + tmp.competitionAuditCount) desc + order by (tmp.taskAuditCount + tmp.competitionAuditCount) desc limit 0,12 From d49f0621c8c458079c783631807727ea7eb78e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Wed, 21 May 2025 19:28:40 +0800 Subject: [PATCH 36/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E5=B1=95=E7=A4=BA=E3=80=91=E6=88=90=E6=9E=9C?= =?UTF-8?q?=E5=A4=A7=E5=B1=8F=E7=9A=84=E9=9C=80=E6=B1=82=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../achievementLibrary/service/BigScreenStatisticService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java index f8870f8f8..5b62f6a4d 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/BigScreenStatisticService.java @@ -117,7 +117,7 @@ public class BigScreenStatisticService { c.put("key","浏览"); c.put("value", cres); Map d = new HashMap<>(); - c.put("key","下载"); + d.put("key","下载"); d.put("value", dres); Map f = new HashMap<>(); f.put("key", "收藏"); From 71e5c84a1aa9f19f19b58ec11291d030584666a6 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Thu, 22 May 2025 09:57:23 +0800 Subject: [PATCH 37/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E5=91=A8=E6=8A=A5=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E3=80=81=E9=A1=B9=E7=9B=AE=E7=BB=84=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PmsProjectWeeklyReportController.java | 22 ++++++++ .../pms/project/mapper/PmsProjectMapper.java | 2 + .../mapper/PmsProjectSprintMapper.java | 4 ++ .../mapper/PmsProjectTestsheetMapper.java | 4 ++ .../project/service/IPmsProjectService.java | 3 +- .../service/PmsProjectIssuesService.java | 56 +++++++++++++++++++ .../service/impl/PmsProjectServiceImpl.java | 5 ++ .../pms/utils/PmsGitLinkRequestUrl.java | 10 ++++ .../resources/mapper/pms/PmsProjectMapper.xml | 7 +++ .../mapper/pms/PmsProjectSprintMapper.xml | 15 +++++ .../mapper/pms/PmsProjectTestsheetMapper.xml | 15 +++++ 11 files changed, 142 insertions(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java index 5e1338d3d..55a18b7e4 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java @@ -41,6 +41,28 @@ public class PmsProjectWeeklyReportController { return success(result); } + /** + * 查询周报-个人工作项统计 + */ + @GetMapping("/personal") + @ApiOperation(value = "周报-个人工作项统计") + public AjaxResult getPersonalWeeklyReport(@PathVariable String enterpriseIdentifier) + { + JSONObject result = pmsProjectIssuesService.getPersonalIssuesStatistics(enterpriseIdentifier); + return success(result); + } + + /** + * 查询周报-项目组工作项统计 + */ + @GetMapping("/projectTeam") + @ApiOperation(value = "周报-项目组工作项统计") + public AjaxResult getProjectTeamWeeklyReport(@PathVariable String enterpriseIdentifier) + { + JSONObject result = pmsProjectIssuesService.getProjectTeamIssuesStatistics(enterpriseIdentifier); + return success(result); + } + /** * 新增项目项目周报 */ diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectMapper.java index 068b1c6df..2437ae097 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectMapper.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectMapper.java @@ -89,4 +89,6 @@ public interface PmsProjectMapper void updatePmsProjectNoProduct(@Param("projectIdList") List projectIdList); PmsProject selectPmsProjectById(Long id); + + List selectProjectIdsByAssigneeUserId(@Param("enterpriseIdentifier") String enterpriseIdentifier, @Param("gitlinkUserId") Long gitlinkUserId); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectSprintMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectSprintMapper.java index c4ffc5623..6ca659b20 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectSprintMapper.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectSprintMapper.java @@ -80,4 +80,8 @@ public interface PmsProjectSprintMapper Integer selectOpeningSprintLastWeekIterationCount(@Param("pmProjectId") Long pmProjectId); PmsProjectSprintStatisticsVo selectPmsProjectSprintStatisticsByProjectId(@Param("pmProjectId") Long pmProjectId); + + int selectNewSprintCurrentNaturalWeekCount(@Param("projectId") Long projectId); + + int selectCompleteSprintCurrentNaturalWeekCount(@Param("projectId") Long projectId); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestsheetMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestsheetMapper.java index 6144ef7ca..9917771fb 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestsheetMapper.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectTestsheetMapper.java @@ -68,4 +68,8 @@ public interface PmsProjectTestsheetMapper int deletePmsProjectTestsheetByProjectId(@Param("projectId") Long projectId); Integer selectCountBySprintId(@Param("sprintId") Long sprintId); + + int selectNewTestSheetCurrentNaturalWeekCount(@Param("projectId") Long projectId); + + int selectCompleteTestSheetCurrentNaturalWeekCount(@Param("projectId") Long projectId); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectService.java index 369d784eb..8f5895980 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsProjectService.java @@ -5,7 +5,6 @@ import com.microservices.common.core.web.page.GenericsTableDataInfo; import com.microservices.pms.project.domain.PmsProject; import com.microservices.pms.project.domain.vo.*; import com.microservices.system.api.domain.SimpleSysUser; -import com.microservices.system.api.domain.SysNotice; import java.util.List; @@ -100,4 +99,6 @@ public interface IPmsProjectService JSONObject getMyRepositoriesStatistics(Long repositoryId); PmsProject selectPmsProjectByIdNoCheckRole(Long pmsProjectId); + + List selectProjectIdsByAssigneeUserId(String enterpriseIdentifier, Long gitlinkUserId); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index 0b779aca9..dcb55164d 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.utils.DateUtils; +import com.microservices.common.core.utils.StringUtils; import com.microservices.common.httpClient.util.GitLinkRequestHelper; import com.microservices.common.security.utils.SecurityUtils; import com.microservices.pms.common.service.IPmsCommonService; @@ -17,6 +18,8 @@ import com.microservices.pms.product.service.IPmsProductRequirementService; import com.microservices.pms.project.domain.PmsProject; import com.microservices.pms.project.domain.SimpleRepository; import com.microservices.pms.project.domain.vo.*; +import com.microservices.pms.project.mapper.PmsProjectSprintMapper; +import com.microservices.pms.project.mapper.PmsProjectTestsheetMapper; import com.microservices.pms.utils.PmsConstants; import com.microservices.pms.utils.PmsGitLinkRequestUrl; import com.microservices.pms.utils.PmsUtils; @@ -31,6 +34,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.net.URISyntaxException; import java.util.*; @@ -72,6 +76,10 @@ public class PmsProjectIssuesService { @Autowired private IPmsCommonService pmsCommonService; + @Resource + private PmsProjectSprintMapper pmsProjectSprintMapper; + @Resource + private PmsProjectTestsheetMapper pmsProjectTestsheetMapper; public JSONObject selectPmsProjectIssuesList(PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) { @@ -574,4 +582,52 @@ public class PmsProjectIssuesService { throw new RuntimeException(e); } } + + public JSONObject getPersonalIssuesStatistics(String enterpriseIdentifier) { + Long gitlinkUserId = SecurityUtils.getGitlinkUserId(); + return gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_WEEKLY_ISSUES_PERSONAL(enterpriseIdentifier, gitlinkUserId)); + + } + + public JSONObject getProjectTeamIssuesStatistics(String enterpriseIdentifier) { + List pmProjectIds = pmsProjectService.selectProjectIdsByAssigneeUserId(enterpriseIdentifier, SecurityUtils.getGitlinkUserId()); + String pmProjectIdsStr = StringUtils.join(pmProjectIds, ","); + JSONObject result = gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_WEEKLY_ISSUES_GROUP(enterpriseIdentifier, pmProjectIdsStr)); + enrichProjectInfo(result); + return result; + + } + + public void enrichProjectInfo(JSONObject inputJson) { + // 遍历最外层 key + for (String projectIdStr : inputJson.keySet()) { + Long projectId = Long.valueOf(projectIdStr); // 转换为 Long + + // 查询项目信息 + PmsProjectDetailVo project = pmsProjectService.selectPmsProjectById(projectId); + + if (project != null) { + // 将项目信息转换为 JSONObject + JSONObject projectInfo = new JSONObject(); + projectInfo.put("projectId", project.getId()); + projectInfo.put("projectName", project.getProjectName()); + projectInfo.put("enterpriseId", project.getPmsEnterpriseId()); + projectInfo.put("createdTime", project.getCreateTime()); + // 将 projectInfo 插入到原 JSON 的对应层级中 + JSONObject innerData = inputJson.getJSONObject(projectIdStr); + innerData.put("project_info", projectInfo); + } + + // 统计新建迭代数 + inputJson.put("this_week_new_sprint_count", pmsProjectSprintMapper.selectNewSprintCurrentNaturalWeekCount(projectId)); + // 统计完成迭代数 + inputJson.put("this_week_complete_sprint_count", pmsProjectSprintMapper.selectCompleteSprintCurrentNaturalWeekCount(projectId)); + // 统计新建测试单数 + inputJson.put("this_week_new_test_sheet_count", pmsProjectTestsheetMapper.selectNewTestSheetCurrentNaturalWeekCount(projectId)); + // 统计完成测试单数 + inputJson.put("this_week_complete_test_sheet_count", pmsProjectTestsheetMapper.selectCompleteTestSheetCurrentNaturalWeekCount(projectId)); + } + } + + } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectServiceImpl.java index ab4c215b4..25e0a9278 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsProjectServiceImpl.java @@ -396,6 +396,11 @@ public class PmsProjectServiceImpl implements IPmsProjectService { return pmsProject; } + @Override + public List selectProjectIdsByAssigneeUserId(String enterpriseIdentifier, Long gitlinkUserId) { + return pmsProjectMapper.selectProjectIdsByAssigneeUserId(enterpriseIdentifier, gitlinkUserId); + } + @Override public PmsProject selectAndCheckPmsProjectById(String idStr) { if (StringUtils.isEmpty(idStr)) { diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java index 0fb7f7861..8b071af8d 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java @@ -439,4 +439,14 @@ public class PmsGitLinkRequestUrl extends GitLinkRequestUrl { public static GitLinkRequestUrl GET_ACTION_RUN_DATA(String owner, String workflows) { return getGitLinkRequestUrl(String.format("/api/pm/action_runs?owner_id=%s&workflows=%s", owner, workflows), "data"); } + + public static GitLinkRequestUrl GET_WEEKLY_ISSUES_PERSONAL(String enterpriseIdentifier, Long gitlinkUserId){ + return getGitLinkRequestUrl( + String.format("/api/pm/weekly_issues/personal.json?enterprise_identifier=%s&user_id=%s", enterpriseIdentifier, gitlinkUserId)); + } + + public static GitLinkRequestUrl GET_WEEKLY_ISSUES_GROUP(String enterpriseIdentifier, String pmProjectIds){ + return getGitLinkRequestUrl( + String.format("/api/pm/weekly_issues/group.json?enterprise_identifier=%s&pm_project_ids=%s", enterpriseIdentifier, pmProjectIds)); + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectMapper.xml index 853b22e3c..6f92f0ed1 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectMapper.xml @@ -173,6 +173,13 @@ from pms_project + insert into pms_project diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectSprintMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectSprintMapper.xml index cc528b3bd..4fb8a0fb6 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectSprintMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectSprintMapper.xml @@ -221,4 +221,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE pms_project_id = #{pmProjectId} AND status = 2 ) AS `closed_sprint_count` + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestsheetMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestsheetMapper.xml index ec6dd180c..35881dc70 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestsheetMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectTestsheetMapper.xml @@ -53,6 +53,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + insert into pms_project_testsheet From 3c2b28806899646c08844e7cf410b95e2101fec2 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Thu, 22 May 2025 11:03:00 +0800 Subject: [PATCH 38/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E5=91=A8=E6=8A=A5=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=85=A5=E5=8F=82=E5=8A=A0=E4=BC=81=E4=B8=9A=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PmsProjectWeeklyReportController.java | 6 ++++-- .../pms/project/domain/vo/PmsProjectIssuesSearchVo.java | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java index 55a18b7e4..6eb9e8b87 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java @@ -35,8 +35,9 @@ public class PmsProjectWeeklyReportController { */ @GetMapping("/list") @ApiOperation(value = "项目周报列表") - public AjaxResult list(PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) + public AjaxResult list(@PathVariable String enterpriseIdentifier, PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) { + pmsProjectIssuesSearchVo.setEnterpriseIdentifier(enterpriseIdentifier); JSONObject result = pmsProjectIssuesService.selectPmsProjectIssuesList(pmsProjectIssuesSearchVo); return success(result); } @@ -68,8 +69,9 @@ public class PmsProjectWeeklyReportController { */ @PostMapping("/add") @ApiOperation(value = "新增项目周报") - public AjaxResult add(@RequestBody PmsProjectIssuesInputVo pmsProjectIssuesInputVo) + public AjaxResult add(@PathVariable String enterpriseIdentifier, @RequestBody PmsProjectIssuesInputVo pmsProjectIssuesInputVo) { + pmsProjectIssuesInputVo.setEnterpriseIdentifier(enterpriseIdentifier); JSONObject result = pmsProjectIssuesService.insertPmsProjectIssues(pmsProjectIssuesInputVo); return success(result); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesSearchVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesSearchVo.java index 0245314bb..b91ef8c91 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesSearchVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesSearchVo.java @@ -9,7 +9,10 @@ import lombok.Data; @ApiModel("项目工作项搜索对象") public class PmsProjectIssuesSearchVo { - @ApiModelProperty(value = "项目id", required = true) + @ApiModelProperty(value = "企业标识", hidden = true) + private String enterpriseIdentifier; + + @ApiModelProperty(value = "项目id") private String pmProjectId; @ApiModelProperty(value = "项目迭代id") From fe7c642a084d0747e92f85e6c05806fdb877f8a9 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Thu, 22 May 2025 14:17:28 +0800 Subject: [PATCH 39/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E5=91=A8=E6=8A=A5=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E5=8E=BB=E9=99=A4=E9=A1=B9=E7=9B=AE=E7=BC=96=E5=8F=B7=E7=BB=91?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PmsProjectWeeklyReportController.java | 14 ++--- .../service/PmsProjectIssuesService.java | 52 +++++++++++++++++-- .../microservices/pms/utils/PmsConstants.java | 9 +++- .../pms/utils/PmsGitLinkRequestUrl.java | 10 +++- 4 files changed, 72 insertions(+), 13 deletions(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java index 6eb9e8b87..f87d110f9 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java @@ -72,7 +72,7 @@ public class PmsProjectWeeklyReportController { public AjaxResult add(@PathVariable String enterpriseIdentifier, @RequestBody PmsProjectIssuesInputVo pmsProjectIssuesInputVo) { pmsProjectIssuesInputVo.setEnterpriseIdentifier(enterpriseIdentifier); - JSONObject result = pmsProjectIssuesService.insertPmsProjectIssues(pmsProjectIssuesInputVo); + JSONObject result = pmsProjectIssuesService.insertPmsProjectWeeklyReportIssues(pmsProjectIssuesInputVo); return success(result); } @@ -83,18 +83,18 @@ public class PmsProjectWeeklyReportController { @ApiOperation(value = "编辑项目周报") public AjaxResult edit(@PathVariable("id") Long id, @RequestBody PmsProjectIssuesInputVo pmsProjectIssuesInputVo) { - JSONObject result = pmsProjectIssuesService.updatePmsProjectIssues(id, pmsProjectIssuesInputVo); + JSONObject result = pmsProjectIssuesService.updatePmsProjectWeeklyReportIssues(id, pmsProjectIssuesInputVo); return success(result); } /** * 删除项目周报 */ - @DeleteMapping("/{ids}") - public AjaxResult remove(@ApiParam( "周报id数组,为-1时删除全部")@PathVariable Long[] ids, @ApiParam( "项目Id")@RequestParam(name = "pmProjectId") Long pmProjectId) + @DeleteMapping("/{id}") + public AjaxResult remove(@ApiParam( "周报id")@PathVariable Long id) { - JSONObject result = pmsProjectIssuesService.deletePmsProjectIssueByIds(ids, pmProjectId); + JSONObject result = pmsProjectIssuesService.deletePmsProjectWeeklyReportIssueByIds(id); return success(result); } @@ -102,10 +102,10 @@ public class PmsProjectWeeklyReportController { * 查看项目周报 */ @GetMapping("/{id}") - public AjaxResult query(@PathVariable("id") Long id, @ApiParam( "项目Id")@RequestParam(name = "pmProjectId") Long pmProjectId) + public AjaxResult query(@PathVariable String enterpriseIdentifier, @PathVariable("id") Long id) { - JSONObject result = pmsProjectIssuesService.selectPmsProjectIssueById(id, pmProjectId); + JSONObject result = pmsProjectIssuesService.selectPmsProjectIssueByIdAndEnterPrise(id, enterpriseIdentifier); return success(result); } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index dcb55164d..a900feb8a 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -123,6 +123,11 @@ public class PmsProjectIssuesService { return gitLinkRequestHelper.doPost(PmsGitLinkRequestUrl.CREATE_ISSUE(), issueInput); } + public JSONObject insertPmsProjectWeeklyReportIssues(PmsProjectIssuesInputVo pmsProjectIssuesInputVo) { + JSONObject issueInput = convertPmsProjectIssuesInputVoToIssueInputJSON(pmsProjectIssuesInputVo); + return gitLinkRequestHelper.doPost(PmsGitLinkRequestUrl.CREATE_ISSUE(), issueInput); + } + @Transactional(rollbackFor = Exception.class) public JSONObject updatePmsProjectIssues(Long id, PmsProjectIssuesInputVo pmsProjectIssuesInputVo) { PmsProject pmsProject = pmsProjectService.selectAndCheckPmsProjectById(pmsProjectIssuesInputVo.getPmProjectId()); @@ -160,7 +165,7 @@ public class PmsProjectIssuesService { } } } - if (PmsConstants.PROJECT_ISSUE_TYPE_WEEKLY_REPORT.equals(updatedIssue.getString("pm_issue_type")) + if (PmsConstants.PROJECT_ISSUE_TYPE_PERSONAL_WEEKLY_REPORT.equals(updatedIssue.getString("pm_issue_type")) && updatedIssue.getString("root_id") != null && !updatedIssue.getJSONObject("author").getLong("id").equals(SecurityUtils.getGitlinkUserId())) { throw new ServiceException("非本人周报,不可编辑"); @@ -169,6 +174,27 @@ public class PmsProjectIssuesService { return gitLinkRequestHelper.doPut(PmsGitLinkRequestUrl.UPDATE_ISSUE(id), issueInput); } + public JSONObject updatePmsProjectWeeklyReportIssues(Long id, PmsProjectIssuesInputVo pmsProjectIssuesInputVo) { + JSONObject updatedIssue; + try { + updatedIssue = gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_ISSUE(id, null)); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + isIssueCreatedByCurrentUser(updatedIssue); + JSONObject issueInput = convertPmsProjectIssuesInputVoToIssueInputJSON(pmsProjectIssuesInputVo); + return gitLinkRequestHelper.doPut(PmsGitLinkRequestUrl.UPDATE_ISSUE(id), issueInput); + } + + private static void isIssueCreatedByCurrentUser(JSONObject updatedIssue) { + if ((PmsConstants.PROJECT_ISSUE_TYPE_PERSONAL_WEEKLY_REPORT.equals(updatedIssue.getString("pm_issue_type")) + || PmsConstants.PROJECT_ISSUE_TYPE_GROUP_WEEKLY_REPORT.equals(updatedIssue.getString("pm_issue_type"))) + && updatedIssue.getString("root_id") != null + && !updatedIssue.getJSONObject("author").getLong("id").equals(SecurityUtils.getGitlinkUserId())) { + throw new ServiceException("非本人周报,不可编辑"); + } + } + public JSONObject batchUpdatePmsProjectIssues(Long pmProjectId, PmsProjectIssuesBatchUpdateVo pmsProjectIssuesUpdateVo) { pmsProjectService.selectAndCheckPmsProjectById(pmProjectId); //转换为issue入参 @@ -188,6 +214,17 @@ public class PmsProjectIssuesService { } } + public JSONObject selectPmsProjectIssueByIdAndEnterPrise(Long id, String enterpriseIdentifier) { + PmsEnterprise pmsEnterprise = pmsEnterpriseService.selectPmsEnterpriseByIdentifier(enterpriseIdentifier); + try { + JSONObject result = setProjectIssueUserState(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_ISSUE(id, null))); + result.put("pm_enterprise_name", pmsEnterprise.getEnterpriseName()); + return result; + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + public JSONObject selectPmsProjectIssueByIdNoCheckRole(Long id, Long pmProjectId) { PmsProject pmsProject = pmsProjectService.selectPmsProjectByIdNoCheckRole(pmProjectId); try { @@ -317,6 +354,17 @@ public class PmsProjectIssuesService { return gitLinkRequestHelper.doDelete(PmsGitLinkRequestUrl.DELETE_ISSUES_BATCH(pmProjectId), jsonObject); } + public JSONObject deletePmsProjectWeeklyReportIssueByIds(Long id) { + JSONObject updatedIssue; + try { + updatedIssue = gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_ISSUE(id, null)); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + isIssueCreatedByCurrentUser(updatedIssue); + return gitLinkRequestHelper.doDelete(PmsGitLinkRequestUrl.DELETE_WEEKLY_REPORT_ISSUE(id)); + } + public JSONObject selectPmsProjectIssueStatus() { return gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_REPO_ISSUE_DEFAULT_STATUS()); } @@ -628,6 +676,4 @@ public class PmsProjectIssuesService { inputJson.put("this_week_complete_test_sheet_count", pmsProjectTestsheetMapper.selectCompleteTestSheetCurrentNaturalWeekCount(projectId)); } } - - } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsConstants.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsConstants.java index b3821bf22..c5a812381 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsConstants.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsConstants.java @@ -122,9 +122,14 @@ public class PmsConstants { public final static String PROJECT_ISSUE_TYPE_BUG = "3"; /** - * 项目工作项——周报类型 + * 项目工作项——个人周报类型 */ - public final static String PROJECT_ISSUE_TYPE_WEEKLY_REPORT = "4"; + public final static String PROJECT_ISSUE_TYPE_PERSONAL_WEEKLY_REPORT = "4"; + + /** + * 项目工作项——项目组周报类型 + */ + public final static String PROJECT_ISSUE_TYPE_GROUP_WEEKLY_REPORT = "5"; /** * 疑修筛选类型-全部 diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java index 8b071af8d..c70686898 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java @@ -146,7 +146,9 @@ public class PmsGitLinkRequestUrl extends GitLinkRequestUrl { public static GitLinkRequestUrl GET_ISSUE(Long id, Long pmProjectId) throws URISyntaxException { Map params = new HashMap<>(); - params.put("pm_project_id", String.valueOf(pmProjectId)); + if (pmProjectId != null) { + params.put("pm_project_id", String.valueOf(pmProjectId)); + } return getGitLinkRequestUrl(buildUri(String.format( "/api/pm/issues/%s", id), params )); @@ -164,6 +166,12 @@ public class PmsGitLinkRequestUrl extends GitLinkRequestUrl { )); } + public static GitLinkRequestUrl DELETE_WEEKLY_REPORT_ISSUE(Long id) { + return getGitLinkRequestUrl(String.format( + "/api/pm/issues/%s", id + )); + } + public static GitLinkRequestUrl DELETE_ISSUES_BATCH(Long pmProjectId) { String path = String.format("/api/pm/issues/batch_destroy?pm_project_id=%s", pmProjectId); return getGitLinkRequestUrl(path); From e6413d1efed78fc26c3b31407ec7ad33976e4c1c Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Thu, 22 May 2025 16:26:29 +0800 Subject: [PATCH 40/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E7=94=9F=E4=BA=A7=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E5=91=A8=E6=8A=A5=E6=97=B6=E8=BF=94=E5=9B=9E=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/PmsProjectIssuesService.java | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index a900feb8a..c9c940c47 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -18,6 +18,7 @@ import com.microservices.pms.product.service.IPmsProductRequirementService; import com.microservices.pms.project.domain.PmsProject; import com.microservices.pms.project.domain.SimpleRepository; import com.microservices.pms.project.domain.vo.*; +import com.microservices.pms.project.mapper.PmsProjectMapper; import com.microservices.pms.project.mapper.PmsProjectSprintMapper; import com.microservices.pms.project.mapper.PmsProjectTestsheetMapper; import com.microservices.pms.utils.PmsConstants; @@ -80,6 +81,8 @@ public class PmsProjectIssuesService { private PmsProjectSprintMapper pmsProjectSprintMapper; @Resource private PmsProjectTestsheetMapper pmsProjectTestsheetMapper; + @Resource + private PmsProjectMapper pmsProjectMapper; public JSONObject selectPmsProjectIssuesList(PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) { @@ -107,6 +110,49 @@ public class PmsProjectIssuesService { return issueListResult; } + public JSONObject enrichProjectIssueList(JSONObject issueListResult) { + HashMap gitlinkUserNickNameMap = new HashMap<>(); + if (issueListResult.containsKey("this_week_all_issues")) { + JSONArray issues = issueListResult.getJSONArray("this_week_all_issues"); + for (int i = 0; i < issues.size(); i++) { + JSONObject issue = issues.getJSONObject(i); + setIssueAssignersState(issue, gitlinkUserNickNameMap); + setIssuePmsProjectName(issue); + issues.set(i, issue); + } + issueListResult.put("this_week_all_issues", issues); + } + if (issueListResult.containsKey("next_week_all_issues")) { + JSONArray issues = issueListResult.getJSONArray("next_week_all_issues"); + for (int i = 0; i < issues.size(); i++) { + JSONObject issue = issues.getJSONObject(i); + setIssueAssignersState(issue, gitlinkUserNickNameMap); + setIssuePmsProjectName(issue); + issues.set(i, issue); + } + issueListResult.put("next_week_all_issues", issues); + } + if (issueListResult.containsKey("close_task_issues")) { + JSONArray issues = issueListResult.getJSONArray("close_task_issues"); + for (int i = 0; i < issues.size(); i++) { + JSONObject issue = issues.getJSONObject(i); + setIssueAssignersState(issue, gitlinkUserNickNameMap); + setIssuePmsProjectName(issue); + issues.set(i, issue); + } + issueListResult.put("close_task_issues", issues); + } + return issueListResult; + } + + private void setIssuePmsProjectName(JSONObject issue) { + if (issue.containsKey("pm_project_id")) { + Long pmProjectId = issue.getLong("pm_project_id"); + PmsProject pmsProject = pmsProjectMapper.selectPmsProjectById(pmProjectId); + issue.put("pm_project_name", pmsProject.getProjectName()); + } + } + public JSONObject insertPmsProjectIssuesRestricted(PmsProjectIssuesInputVo pmsProjectIssuesInputVo) { PmsProject pmsProject = pmsProjectService.selectAndCheckPmsProjectById(pmsProjectIssuesInputVo.getPmProjectId()); if (pmsProject.getPmsProductId() != null @@ -633,8 +679,7 @@ public class PmsProjectIssuesService { public JSONObject getPersonalIssuesStatistics(String enterpriseIdentifier) { Long gitlinkUserId = SecurityUtils.getGitlinkUserId(); - return gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_WEEKLY_ISSUES_PERSONAL(enterpriseIdentifier, gitlinkUserId)); - + return enrichProjectIssueList(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_WEEKLY_ISSUES_PERSONAL(enterpriseIdentifier, gitlinkUserId))); } public JSONObject getProjectTeamIssuesStatistics(String enterpriseIdentifier) { From 1354a2b7a0d9c4fe45e689e851db2d42a75ace3c Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Thu, 22 May 2025 17:18:55 +0800 Subject: [PATCH 41/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E7=A9=BA=E5=80=BC=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/PmsProjectIssuesService.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index c9c940c47..8a58ddc35 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -692,13 +692,22 @@ public class PmsProjectIssuesService { } public void enrichProjectInfo(JSONObject inputJson) { + if (inputJson == null) { + return; + } // 遍历最外层 key for (String projectIdStr : inputJson.keySet()) { - Long projectId = Long.valueOf(projectIdStr); // 转换为 Long - + Long projectId; + try { + projectId = Long.valueOf(projectIdStr); // 转换为 Long + } catch (NumberFormatException e) { + // 非数字字符串跳过处理 + continue; + } // 查询项目信息 PmsProjectDetailVo project = pmsProjectService.selectPmsProjectById(projectId); + JSONObject innerData = inputJson.getJSONObject(projectIdStr); if (project != null) { // 将项目信息转换为 JSONObject JSONObject projectInfo = new JSONObject(); @@ -707,18 +716,18 @@ public class PmsProjectIssuesService { projectInfo.put("enterpriseId", project.getPmsEnterpriseId()); projectInfo.put("createdTime", project.getCreateTime()); // 将 projectInfo 插入到原 JSON 的对应层级中 - JSONObject innerData = inputJson.getJSONObject(projectIdStr); + innerData.put("project_info", projectInfo); } // 统计新建迭代数 - inputJson.put("this_week_new_sprint_count", pmsProjectSprintMapper.selectNewSprintCurrentNaturalWeekCount(projectId)); + innerData.put("this_week_new_sprint_count", pmsProjectSprintMapper.selectNewSprintCurrentNaturalWeekCount(projectId)); // 统计完成迭代数 - inputJson.put("this_week_complete_sprint_count", pmsProjectSprintMapper.selectCompleteSprintCurrentNaturalWeekCount(projectId)); + innerData.put("this_week_complete_sprint_count", pmsProjectSprintMapper.selectCompleteSprintCurrentNaturalWeekCount(projectId)); // 统计新建测试单数 - inputJson.put("this_week_new_test_sheet_count", pmsProjectTestsheetMapper.selectNewTestSheetCurrentNaturalWeekCount(projectId)); + innerData.put("this_week_new_test_sheet_count", pmsProjectTestsheetMapper.selectNewTestSheetCurrentNaturalWeekCount(projectId)); // 统计完成测试单数 - inputJson.put("this_week_complete_test_sheet_count", pmsProjectTestsheetMapper.selectCompleteTestSheetCurrentNaturalWeekCount(projectId)); + innerData.put("this_week_complete_test_sheet_count", pmsProjectTestsheetMapper.selectCompleteTestSheetCurrentNaturalWeekCount(projectId)); } } } From 5199a829f545ececd7b82f3e45975db04f461f30 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Fri, 23 May 2025 09:41:15 +0800 Subject: [PATCH 42/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E5=B7=A5=E4=BD=9C=E9=A1=B9=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E4=BC=A0=E4=BC=81=E4=B8=9A=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pms/project/controller/PmsProjectIssuesController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectIssuesController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectIssuesController.java index 9ad0f4084..ea9f07c09 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectIssuesController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectIssuesController.java @@ -44,7 +44,8 @@ public class PmsProjectIssuesController extends BaseController { @RequiresPermissions(value = {"pms:pmsProject:show", "pms:pmsProject:showMe", "pms:pmsProjectTestsheet:edit"}, logical = Logical.OR) @GetMapping("/list") @ApiOperation(value = "项目工作项列表") - public AjaxResult list(PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) { + public AjaxResult list(@PathVariable String enterpriseIdentifier, PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) { + pmsProjectIssuesSearchVo.setEnterpriseIdentifier(enterpriseIdentifier); JSONObject result = pmsProjectIssuesService.selectPmsProjectIssuesList(pmsProjectIssuesSearchVo); return success(result); } From dcea028be37a8d3b0ce076ab5fe13bab5a8c8798 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Fri, 23 May 2025 10:19:00 +0800 Subject: [PATCH 43/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E4=BB=8A=E6=97=A5=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=98=AF=E5=90=A6=E4=B8=BA=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E8=B4=9F=E8=B4=A3=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pms/dashboard/controller/PmsDashboardController.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/dashboard/controller/PmsDashboardController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/dashboard/controller/PmsDashboardController.java index e2e55ca37..cab1bd5d0 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/dashboard/controller/PmsDashboardController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/dashboard/controller/PmsDashboardController.java @@ -32,6 +32,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -172,6 +173,12 @@ public class PmsDashboardController extends BaseController { } todoProjectIssuesSearchVo.setPmProjectIds(StringUtils.join(projectList.stream().map(PmsProject::getId).toArray(), ",")); JSONObject result = pmsProjectIssuesService.selectMyTodoPmsProjectIssuesList(todoProjectIssuesSearchVo); + + // 判断projectList中是否存在projectAssigneeId和当前用户id相等 + Long currentUserId = SecurityUtils.getGitlinkUserId(); + boolean isProjectAssigner = projectList.stream() + .anyMatch(project -> currentUserId != null && currentUserId.equals(project.getProjectAssigneeId())); + result.put("isProjectAssigner", isProjectAssigner); return success(result); } From ee3d983c4958e62f5089b36a8037097af58a44c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Fri, 23 May 2025 11:17:14 +0800 Subject: [PATCH 44/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E6=8E=A8=E8=8D=90=E3=80=91issue\pr=E6=8E=A8=E8=8D=90=E8=81=94?= =?UTF-8?q?=E8=B0=83=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/TokenListVo.java | 18 ++++ .../service/IAchievementsService.java | 3 + .../service/impl/AchievementsServiceImpl.java | 82 ++++++++++++++----- .../referral/mapper/TalentReferralMapper.java | 8 +- .../service/TalentReferralService.java | 60 +++++++------- .../dms/referral/vo/PrInfoVo.java | 10 +++ .../domain/CompetitionResourceLibrary.java | 2 +- .../mapper/ProjectResourceLibraryMapper.java | 5 ++ .../dms/utils/DmsRequestHelper.java | 4 +- .../mapper/dms/AchievementsMapper.xml | 1 + .../dms/ProjectResourceLibraryMapper.xml | 12 +++ .../mapper/dms/TalentReferralMapper.xml | 8 +- 12 files changed, 156 insertions(+), 57 deletions(-) create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/TokenListVo.java create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/PrInfoVo.java diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/TokenListVo.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/TokenListVo.java new file mode 100644 index 000000000..f76cb9f9e --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/TokenListVo.java @@ -0,0 +1,18 @@ +package com.microservices.dms.achievementLibrary.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +@Data +public class TokenListVo { + + private Long id; // 项目ID + private String name; // 项目名称 + private Long totalToken; // 项目总Token + private String createBy; // 创建人 + private Long currentToken; // 当前Token + private String repositoryName; // 仓库名称 + private Long repositoryId; // 仓库名称 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Data createdOn; // 项目创建时间(以毫秒为单位) +} diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java index 59ecb66ac..6c361f43a 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java @@ -117,4 +117,7 @@ public interface IAchievementsService { List getRelatedAchTaskOfExpert(Long id); List getRelatedAchCompetitionOfExpert(Long id); + + List projectTokenList(); + } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java index 7411fc03d..a22505481 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java @@ -5,8 +5,10 @@ import java.util.stream.Collectors; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; +import com.alibaba.fastjson2.JSONObject; import com.microservices.common.core.utils.DateUtils; import com.microservices.common.core.utils.StringUtils; +import com.microservices.common.httpClient.service.HttpAPIService; import com.microservices.common.security.utils.SecurityUtils; import com.microservices.dms.achievementLibrary.domain.*; import com.microservices.dms.behaviorImage.domain.AchievementBehaviorSumVo; @@ -21,6 +23,7 @@ import com.microservices.dms.resourceLibrary.mapper.ExpertResourceLibraryMapper; import com.microservices.dms.resourceLibrary.mapper.ProjectResourceLibraryMapper; import com.microservices.dms.resourceLibrary.mapper.TaskResourceLibraryMapper; import com.microservices.dms.utils.DateUtil; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; @@ -37,6 +40,7 @@ import static com.microservices.dms.utils.UrlUtil.getUrlPath; * @date 2025-04-02 */ @Service +@Slf4j public class AchievementsServiceImpl implements IAchievementsService { @Autowired private AchievementsMapper achievementsMapper; @@ -62,6 +66,11 @@ public class AchievementsServiceImpl implements IAchievementsService { @Value("${http.gatewayUrl}") public String gatewayUrl; + @Value("${gitlink.fiscobcosUrl}") + public String fiscobcosUrl; + + @Autowired + private HttpAPIService httpAPIService; /** * 查询成果 @@ -72,16 +81,16 @@ public class AchievementsServiceImpl implements IAchievementsService { @Override public Achievements selectAchievementsById(Long id) { Achievements a = achievementsMapper.selectAchievementsById(id); - if(StringUtils.isNotNull(a)){ + if (StringUtils.isNotNull(a)) { String gender = a.getGender(); String img = ""; - if(StringUtils.isNotEmpty(gender) && gender.equals("1")){ + if (StringUtils.isNotEmpty(gender) && gender.equals("1")) { img = "images/avatars/User/girl.jpg"; } else if (StringUtils.isNotEmpty(gender) && gender.equals("0")) { img = "images/avatars/User/boy.jpg"; } a.setUserImg(img); - if(StringUtils.isNotEmpty(a.getField1())) { + if (StringUtils.isNotEmpty(a.getField1())) { String field1Name = achievementsMapper.getField1NameByParam(a.getSource(), a.getId()); if (StringUtils.isNotNull(field1Name)) { a.setField1Name(field1Name); @@ -107,14 +116,14 @@ public class AchievementsServiceImpl implements IAchievementsService { for (Achievements a : list) { String gender = a.getGender(); String img = ""; - if(StringUtils.isNotEmpty(gender) && gender.equals("1")){ + if (StringUtils.isNotEmpty(gender) && gender.equals("1")) { img = "images/avatars/User/girl.jpg"; - }else if (StringUtils.isNotEmpty(gender) && gender.equals("0")) { + } else if (StringUtils.isNotEmpty(gender) && gender.equals("0")) { img = "images/avatars/User/boy.jpg"; } a.setUserImg(img); //根据id获取领域名称 - if(StringUtils.isNotEmpty(a.getField1())) { + if (StringUtils.isNotEmpty(a.getField1())) { String field1Name = achievementsMapper.getField1NameByParam(a.getSource(), a.getId()); if (StringUtils.isNotNull(field1Name)) { a.setField1Name(field1Name); @@ -192,25 +201,26 @@ public class AchievementsServiceImpl implements IAchievementsService { return aStr; } - List> list = JSON.parseObject(aStr,new TypeReference>>() {}); + List> list = JSON.parseObject(aStr, new TypeReference>>() { + }); if (Objects.equals(source, "1") || Objects.equals(source, "3")) { - concatUrl(list,gitLinkUrl); + concatUrl(list, gitLinkUrl); } if (Objects.equals(source, "2")) { - concatUrl(list,markerSpaceUrl); + concatUrl(list, markerSpaceUrl); } if (Objects.equals(source, "4")) { - concatUrl(list,gatewayUrl); + concatUrl(list, gatewayUrl); } return JSON.toJSONString(list); } private void concatUrl(List> list, String url) { - for (Map map : list) { + for (Map map : list) { String v = map.getOrDefault("v", ""); String urlPath = getUrlPath(v); map.put("v", url + urlPath); @@ -241,14 +251,14 @@ public class AchievementsServiceImpl implements IAchievementsService { for (Achievements a : list) { String gender = a.getGender(); String img = ""; - if(StringUtils.isNotEmpty(gender) && gender.equals("1")){ + if (StringUtils.isNotEmpty(gender) && gender.equals("1")) { img = "images/avatars/User/girl.jpg"; - }else if(StringUtils.isNotEmpty(gender) && gender.equals("0")){ + } else if (StringUtils.isNotEmpty(gender) && gender.equals("0")) { img = "images/avatars/User/boy.jpg"; } a.setUserImg(img); //根据id获取领域名称 - if(StringUtils.isEmpty(achQueryVo.getSource()) && StringUtils.isNotEmpty(a.getField1())) { + if (StringUtils.isEmpty(achQueryVo.getSource()) && StringUtils.isNotEmpty(a.getField1())) { String field1Name = achievementsMapper.getField1NameByParam(a.getSource(), a.getId()); if (StringUtils.isNotNull(field1Name)) { a.setField1Name(field1Name); @@ -294,14 +304,14 @@ public class AchievementsServiceImpl implements IAchievementsService { @Override public List getHotAchievement() { //根据查询条件获取所有的成果数据 - List resultList = achievementsMapper.getHotAchievement(); + List resultList = achievementsMapper.getHotAchievement(); //遍历成果数据,获取对应成果的点击数 for (HotAchVo a : resultList) { String gender = a.getGender(); String img = ""; - if(StringUtils.isNotEmpty(gender) && gender.equals("1")){ + if (StringUtils.isNotEmpty(gender) && gender.equals("1")) { img = "images/avatars/User/girl.jpg"; - }else if (StringUtils.isNotEmpty(gender) && gender.equals("0")){ + } else if (StringUtils.isNotEmpty(gender) && gender.equals("0")) { img = "images/avatars/User/boy.jpg"; } a.setUserImg(img); @@ -391,7 +401,7 @@ public class AchievementsServiceImpl implements IAchievementsService { } @Override - public List> get7AddClickById(String id,String clickType) { + public List> get7AddClickById(String id, String clickType) { if (StringUtils.isEmpty(clickType)) { clickType = "Achievements"; @@ -496,7 +506,7 @@ public class AchievementsServiceImpl implements IAchievementsService { @Override public List getRelatedAchTaskOfExpert(Long id) { - return achievementsMapper.getRelatedAchTaskOfExpert(id); + return achievementsMapper.getRelatedAchTaskOfExpert(id); } @Override @@ -504,6 +514,7 @@ public class AchievementsServiceImpl implements IAchievementsService { return achievementsMapper.getRelatedAchCompetitionOfExpert(id); } + /** * 根据查询内容,调用搜索行为接口 * @@ -541,4 +552,37 @@ public class AchievementsServiceImpl implements IAchievementsService { public List getExpertAreasByName(String areaName) { return achievementsMapper.getExpertAreasByName(areaName); } + + + @Override + public List projectTokenList() { + List list = projectResourceLibraryMapper.selectProjectInfos(); + for (TokenListVo v : list) { + Long totalToken = queryTotalToken(v); + Long issueTokenSum = projectResourceLibraryMapper.sumProjectIssueToken(v.getId()); + v.setCurrentToken(totalToken - issueTokenSum); + v.setTotalToken(totalToken); + } + return list; + } + + private Long queryTotalToken(TokenListVo v) { + JSONObject param = new JSONObject(); + param.put("request-type","query repo basic info"); + param.put("token_name",v.getId()); + + try { + JSONObject reps = httpAPIService.doPost(fiscobcosUrl,param); + if (reps.containsKey("status") && reps.getString("status").equals("0")) { + Long totalSupply = reps.getLong("total_supply"); +// Long curSupply = reps.getLong("cur_supply"); + return totalSupply; + } + } catch (Exception e) { + log.error("区块链信息查询失败", e); + return -1L; + } + + return -1L; + } } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java index 758b22bde..3d83d85b8 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/mapper/TalentReferralMapper.java @@ -2,10 +2,7 @@ package com.microservices.dms.referral.mapper; import com.microservices.common.datasource.annotation.Slave; import com.microservices.dms.achievementLibrary.domain.KeyValueVo; -import com.microservices.dms.referral.vo.ExpertVo; -import com.microservices.dms.referral.vo.IssuesVo; -import com.microservices.dms.referral.vo.PullRequestVo; -import com.microservices.dms.referral.vo.TaskVo; +import com.microservices.dms.referral.vo.*; import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -46,4 +43,7 @@ public interface TalentReferralMapper { TaskVo selectCompetitionById(Long competitionId); List selectCompetitionIdByStatus(); + + PrInfoVo selectPRInfoById(@Param("id") Integer id); + } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java index 0bd2d9ab0..8f0eb3f62 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/service/TalentReferralService.java @@ -11,10 +11,7 @@ import com.microservices.dms.achievementLibrary.mapper.AchievementsMapper; import com.microservices.dms.constant.ReferralConstant; import com.microservices.dms.constant.TaskConstant; import com.microservices.dms.referral.mapper.TalentReferralMapper; -import com.microservices.dms.referral.vo.ExpertVo; -import com.microservices.dms.referral.vo.IssueDto; -import com.microservices.dms.referral.vo.IssuesVo; -import com.microservices.dms.referral.vo.TaskVo; +import com.microservices.dms.referral.vo.*; import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo; import com.microservices.dms.utils.DmsGitLinkRequestUrl; import com.microservices.dms.utils.DmsRequestHelper; @@ -94,9 +91,9 @@ public class TalentReferralService { return collaborators; } - public List> doIssueTalentReferral(Long projectId, Long issueId) { + public List> doIssueTalentReferral(Long issueId , Long projectId) { List> entries = issueTalentReferral(projectId, issueId); - return entries.stream().map(s -> { + return entries.stream().limit(3).map(s -> { Map mm = talentReferralMapper.selectUsersById(s.getKey()); return mm; }).collect(Collectors.toList()); @@ -111,12 +108,12 @@ public class TalentReferralService { List curIssueAssigners = talentReferralMapper.selectIssuesAssigners(curIssue.getId()); if (!curIssueAssigners.isEmpty()) { - return new ArrayList<>(); + // return new ArrayList<>(); } IssuesVo vo = new IssuesVo(); vo.setProjectId(projectId); - vo.setStatusIds(Collections.singletonList(ReferralConstant.ISSUE_CLOSED)); + vo.setStatusIds(Lists.newArrayList(ReferralConstant.ISSUE_CLOSED,ReferralConstant.ISSUE_RESOLVED)); List issuesVos = talentReferralMapper.selectIssuesCondition(vo); Map userFractionMap = new HashMap<>(); // 计算与解决issue的相似度, 标题+描述 @@ -153,36 +150,41 @@ public class TalentReferralService { Map userFractionMap = new HashMap<>(); Map userNameFractionMap = new HashMap<>(); Map> PRFilesMap = new HashMap<>(); - List closedPullRequests = getPullRequests(projectId, "11"); + List closedPullRequests = getPullRequests(projectId, "11").stream() + .filter(e->StringUtils.isNotBlank(e.getAssignUserLogin())).collect(Collectors.toList()); for (IssueDto pr : prs) { + PrInfoVo curPrInfoVo = talentReferralMapper.selectPRInfoById(pr.getPullRequestId()); //关闭PR的对比 for (IssueDto dto : closedPullRequests) { - List reviewers = dto.getReviewers(); - for (String reviewer : reviewers) { - Set prFiles = getPRFiles(projectId, dto.getPullRequestNumber()); - PRFilesMap.merge(reviewer, prFiles, (a, b) -> { - HashSet set = new HashSet<>(); - set.addAll(a); - set.addAll(b); - return set; - }); - } + String reviewer = dto.getAssignUserLogin(); + Set prFiles = getPRFiles(projectId, dto.getPullRequestNumber()); + PRFilesMap.merge(reviewer, prFiles, (a, b) -> { + HashSet set = new HashSet<>(); + set.addAll(a); + set.addAll(b); + return set; + }); + + //标题、content匹配 + PrInfoVo prInfoVo = talentReferralMapper.selectPRInfoById(dto.getPullRequestId()); + double subjectFraction = SimilarityService.sentence(curPrInfoVo.getTitle(), prInfoVo.getTitle()); + double descFraction = SimilarityService.text(curPrInfoVo.getContent(), prInfoVo.getContent()); + //这个数据可以缓存下来 + userNameFractionMap.merge(dto.getAssignUserLogin(), (subjectFraction + descFraction) * 40.0D, Double::sum); } Set curPrFiles = getPRFiles(projectId, pr.getPullRequestNumber()); for (String curPrFile : curPrFiles) { PRFilesMap.forEach((k, v) -> { if (v.contains(curPrFile)) { - userNameFractionMap.merge(k, 60.0D, Double::sum); + userNameFractionMap.merge(k, 30.0D, Double::sum); } }); } // 计算每个负责人关闭的 PR数量 - closedPullRequests.stream().map(IssueDto::getReviewers).flatMap(List::stream).forEach(s -> userNameFractionMap.merge(s, 40.0D, Double::sum)); - - + closedPullRequests.stream().map(IssueDto::getAssignUserLogin).forEach(s -> userNameFractionMap.merge(s, 30.0D, Double::sum)); } userNameFractionMap.forEach((k, v) -> { @@ -224,7 +226,7 @@ public class TalentReferralService { } try { - JSONArray allDataByPage = dmsRequestHelper.getAllDataByPage(DmsGitLinkRequestUrl.GET_PR_FILES(projectFullName, PRNum), "issues", "files"); + JSONArray allDataByPage = dmsRequestHelper.getAllDataByPage(DmsGitLinkRequestUrl.GET_PR_FILES(projectFullName, PRNum), "files", "file_nums"); return allDataByPage.stream().map(o -> (JSONObject) o).map(o -> (String) o.get("filename")).collect(Collectors.toSet()); } catch (ServiceException e) { logger.error("【{}】获取PR文件失败:{}", projectFullName, e.getMessage()); @@ -232,9 +234,9 @@ public class TalentReferralService { return new HashSet<>(); } - public List> doPRTalentReferral(Long projectId, Long prId) { + public List> doPRTalentReferral(Long prId, Long projectId) { List> entries = PRTalentReferral(projectId, prId); - return entries.stream().map(s -> { + return entries.stream().limit(3).map(s -> { Map mm = talentReferralMapper.selectUsersById(s.getKey()); return mm; }).collect(Collectors.toList()); @@ -242,14 +244,14 @@ public class TalentReferralService { public List> PRTalentReferral(Long projectId, Long prId) { List openPullRequests = getPullRequests(projectId, "1"); - openPullRequests = openPullRequests.stream().filter(e -> e.getReviewers().isEmpty()).collect(Collectors.toList()); + openPullRequests = openPullRequests.stream().filter(e -> StringUtils.isEmpty(e.getAssignUserLogin())).collect(Collectors.toList()); if (prId != null) { - openPullRequests = openPullRequests.stream().filter(e -> Objects.equals((long) (e.getId()), prId)).filter(e -> e.getReviewers().isEmpty()).collect(Collectors.toList()); + openPullRequests = openPullRequests.stream().filter(e -> Objects.equals((long) (e.getPullRequestId()), prId)).collect(Collectors.toList()); return PRTalentReferral(projectId, prId, openPullRequests); } - return PRTalentReferral(projectId, prId, openPullRequests); + return PRTalentReferral(projectId, null, openPullRequests); } //定时统计 diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/PrInfoVo.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/PrInfoVo.java new file mode 100644 index 000000000..c3e153d25 --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/referral/vo/PrInfoVo.java @@ -0,0 +1,10 @@ +package com.microservices.dms.referral.vo; + +import lombok.Data; + +@Data +public class PrInfoVo { + private Long id; + private String title; + private String content; +} diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/domain/CompetitionResourceLibrary.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/domain/CompetitionResourceLibrary.java index 8a853fa36..a88896b7e 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/domain/CompetitionResourceLibrary.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/domain/CompetitionResourceLibrary.java @@ -33,7 +33,7 @@ public class CompetitionResourceLibrary extends BaseEntity { */ private String competitionField; /** - * 竞赛状态 0进行中 1已结束 + * 竞赛状态 status: 0 未上架 1上架 */ private String competitionStatus; /** diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/mapper/ProjectResourceLibraryMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/mapper/ProjectResourceLibraryMapper.java index 0d076ebb6..a90c3a960 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/mapper/ProjectResourceLibraryMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/mapper/ProjectResourceLibraryMapper.java @@ -1,6 +1,7 @@ package com.microservices.dms.resourceLibrary.mapper; import com.microservices.common.datasource.annotation.Slave; +import com.microservices.dms.achievementLibrary.domain.TokenListVo; import com.microservices.dms.resourceLibrary.domain.ProjectResourceLibrary; import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo; import com.microservices.dms.resourceLibrary.domain.vo.ProjectListVo; @@ -51,4 +52,8 @@ public interface ProjectResourceLibraryMapper { List> getAttachments(@Param("containerId") Long containerId); String getProjectDomainNameByKey(@Param("projectDomain") String projectDomain ); + + List selectProjectInfos(); + + Long sumProjectIssueToken(@Param("id") Long id); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DmsRequestHelper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DmsRequestHelper.java index d2e7e4ee2..078814d2b 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DmsRequestHelper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/utils/DmsRequestHelper.java @@ -46,7 +46,7 @@ public class DmsRequestHelper extends GitLinkRequestHelper { int pageNum = 1; // 循环分页获取gitlink组织下所有成员 while (!isAllData) { - JSONObject result = doGet(GitLinkRequestUrl.GET_LIST_BY_PAGES(url, pageNum, 50) + JSONObject result = doGet(GET_LIST_BY_PAGES(url, pageNum, 50) ); allList.addAll(result.getList(listKey, tClass)); long total = result.getLong("search_count"); @@ -84,7 +84,7 @@ public class DmsRequestHelper extends GitLinkRequestHelper { public static GitLinkRequestUrl GET_LIST_BY_PAGES(String url, Integer page, Integer limit) { - String p = url.contains("?")? "&page=%d&limit=%d": "%s?page=%d&limit=%d"; + String p = url.contains("?")? "%s&page=%s&limit=%s": "%s?page=%s&limit=%s"; return getAdminGitLinkRequestUrl(String.format(p, url, page, limit)); } diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index e03c1ca4e..ee6eab0c6 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -355,6 +355,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from achievements a left join users u on a.owner_name = u.login left join user_extensions ue on u.id = ue.user_id + where a.status = '1' ) as t order by (f+w) desc limit 0,3 diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ProjectResourceLibraryMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ProjectResourceLibraryMapper.xml index cf9729b5d..d339ac807 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ProjectResourceLibraryMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ProjectResourceLibraryMapper.xml @@ -369,4 +369,16 @@ select name from project_categories where id=#{projectDomain} + + + + diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml index d5aca4823..d5a952adf 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml @@ -4,7 +4,7 @@ - + From 0b69e3bafa8ab89fbf4727966c2c5be62914c48a Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Fri, 23 May 2025 13:58:55 +0800 Subject: [PATCH 45/98] =?UTF-8?q?feat(Wiki=E5=8E=86=E5=8F=B2=E7=89=88?= =?UTF-8?q?=E6=9C=AC):=E9=A1=B9=E7=9B=AE=E5=B1=82=E7=BA=A7=E5=90=8D?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wiki/{contoller => controller}/sys/UserController.java | 2 +- .../wiki/{contoller => controller}/wiki/WikiController.java | 2 +- .../{contoller => controller}/wiki/WikiExportController.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/{contoller => controller}/sys/UserController.java (95%) rename microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/{contoller => controller}/wiki/WikiController.java (99%) rename microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/{contoller => controller}/wiki/WikiExportController.java (98%) diff --git a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/sys/UserController.java b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/controller/sys/UserController.java similarity index 95% rename from microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/sys/UserController.java rename to microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/controller/sys/UserController.java index 572d55eae..7f894aa0c 100644 --- a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/sys/UserController.java +++ b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/controller/sys/UserController.java @@ -1,4 +1,4 @@ -package com.microservices.wiki.contoller.sys; +package com.microservices.wiki.controller.sys; import com.microservices.common.core.web.domain.AjaxResult; diff --git a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/wiki/WikiController.java b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/controller/wiki/WikiController.java similarity index 99% rename from microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/wiki/WikiController.java rename to microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/controller/wiki/WikiController.java index 199667fc2..881579bbc 100644 --- a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/wiki/WikiController.java +++ b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/controller/wiki/WikiController.java @@ -1,4 +1,4 @@ -package com.microservices.wiki.contoller.wiki; +package com.microservices.wiki.controller.wiki; import com.microservices.common.core.constant.HttpStatus; import com.microservices.common.core.exception.ServiceException; diff --git a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/wiki/WikiExportController.java b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/controller/wiki/WikiExportController.java similarity index 98% rename from microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/wiki/WikiExportController.java rename to microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/controller/wiki/WikiExportController.java index bf93a2b1a..b858c595a 100644 --- a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/contoller/wiki/WikiExportController.java +++ b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/controller/wiki/WikiExportController.java @@ -1,4 +1,4 @@ -package com.microservices.wiki.contoller.wiki; +package com.microservices.wiki.controller.wiki; import com.microservices.common.core.exception.ServiceException; From b7b21b1f3537099e44799ad9562c8157e0b5d142 Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Fri, 23 May 2025 14:28:13 +0800 Subject: [PATCH 46/98] =?UTF-8?q?=20=E5=8C=BA=E5=9D=97=E9=93=BE=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BehaviorImageController.java | 5 ++-- .../dms/constant/BlockChainFunConstants.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/BlockChainFunConstants.java diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/controller/BehaviorImageController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/controller/BehaviorImageController.java index abbacb045..79e935f5c 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/controller/BehaviorImageController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/controller/BehaviorImageController.java @@ -116,9 +116,8 @@ public class BehaviorImageController extends BaseController { List list = behaviorImageService.selectActivityUserLibraryList(activityUserLibrary); return getDataTable(list); } - /** - * 根据用户ID,获取用户对应的成果汇总 - */ + + @ApiOperation("/根据用户ID,获取用户对应的成果汇总") @GetMapping(value = "/getUserTypeStatistic") public AjaxResult getUserTypeStatistic(@PathVariable("userId") Long userId) { diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/BlockChainFunConstants.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/BlockChainFunConstants.java new file mode 100644 index 000000000..c0d190986 --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/constant/BlockChainFunConstants.java @@ -0,0 +1,27 @@ +package com.microservices.dms.constant; + +/** + * 区块链方法常量 + */ +public class BlockChainFunConstants { + public static final String CREATE_REPO = "create repo"; //项目入链 + public static final String QUERY_REPO = "query repo basic info"; //项目入链信息查询 + public static final String USER_SINGLE_REPO = "query user balance of single repo"; //单个项目某个用户token + public static final String USER_ALL_REPOS = "query user balance of all repos"; //某个用户所有项目token + + public static final String CREATE_COMMIT = "upload commit info"; //Commit新增入链 + public static final String QUERY_COMMIT = "query commit info"; //Commit入链信息查询 + + public static final String CREATE_PR = "upload pull request info"; //Pr新增入链 + public static final String QUERY_PR_LATEST = "query pull request latest info"; //单个pr入链所有信息 + public static final String QUERY_PR_ALL = "query pull request all info"; //单个pr最后一次入链信息 + + public static final String CREATE_upDATE_issue = "upload issue info"; //Issue新增、修改入链 + public static final String QUERY_ISSUE_LATEST = "query issue latest info"; //单个Issue最后一次入链信息 + public static final String QUERY_ISSUE_ALL = "query issue all info"; //单个Issue入链所有信息 + + public static final String ADD_USER_BALANCE = "add user balance"; //项目分配token——用户token新增 + public static final String MINUS_USER_BALANCE = "minus user balance"; //项目分配token-用户token减少 + public static final String LOCK_USER_BALANCE = "lock user balance"; //用户转账token-将自己token分配给本项目中的其他用户 + +} 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 47/98] =?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 e9137d30ba853c3fe4adcce4d1b65e652111f6b9 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Fri, 23 May 2025 16:39:59 +0800 Subject: [PATCH 48/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E5=91=A8=E6=8A=A5=E4=B8=AD=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=BB=84=E5=B7=A5=E4=BD=9C=E9=A1=B9=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PmsProjectWeeklyReportController.java | 9 +++++++++ .../service/PmsProjectIssuesService.java | 19 +++++++++++++++++++ .../pms/utils/PmsGitLinkRequestUrl.java | 6 ++++++ 3 files changed, 34 insertions(+) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java index f87d110f9..640973641 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java @@ -64,6 +64,15 @@ public class PmsProjectWeeklyReportController { return success(result); } + @GetMapping("/projectIssueList") + @ApiOperation(value = "周报-项目组工作项列表") + public AjaxResult getProjectIssueList(@PathVariable String enterpriseIdentifier, PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) + { + pmsProjectIssuesSearchVo.setEnterpriseIdentifier(enterpriseIdentifier); + JSONObject result = pmsProjectIssuesService.getProjectIssueList(pmsProjectIssuesSearchVo); + return success(result); + } + /** * 新增项目项目周报 */ diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index 8a58ddc35..4ef321b9a 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -103,6 +103,7 @@ public class PmsProjectIssuesService { for (int i = 0; i < issues.size(); i++) { JSONObject issue = issues.getJSONObject(i); setIssueAssignersState(issue, gitlinkUserNickNameMap); + setIssuePmsProjectName(issue); issues.set(i, issue); } issueListResult.put("issues", issues); @@ -148,6 +149,9 @@ public class PmsProjectIssuesService { private void setIssuePmsProjectName(JSONObject issue) { if (issue.containsKey("pm_project_id")) { Long pmProjectId = issue.getLong("pm_project_id"); + if (pmProjectId == null) { + return; + } PmsProject pmsProject = pmsProjectMapper.selectPmsProjectById(pmProjectId); issue.put("pm_project_name", pmsProject.getProjectName()); } @@ -730,4 +734,19 @@ public class PmsProjectIssuesService { innerData.put("this_week_complete_test_sheet_count", pmsProjectTestsheetMapper.selectCompleteTestSheetCurrentNaturalWeekCount(projectId)); } } + + public JSONObject getProjectIssueList(PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) { + List pmProjectIds = pmsProjectService.selectProjectIdsByAssigneeUserId( + pmsProjectIssuesSearchVo.getEnterpriseIdentifier(), + SecurityUtils.getGitlinkUserId()); + String pmProjectIdsStr = StringUtils.join(pmProjectIds, ","); + pmsProjectIssuesSearchVo.setPmProjectIds(pmProjectIdsStr); + JSONObject issueSearch = new JSONObject(); + convertObjectToJSONObject(pmsProjectIssuesSearchVo, issueSearch, null); + try { + return setProjectIssueListUserState(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_GROUP_ISSUE_LIST(issueSearch))); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java index c70686898..6c304707b 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java @@ -457,4 +457,10 @@ public class PmsGitLinkRequestUrl extends GitLinkRequestUrl { return getGitLinkRequestUrl( String.format("/api/pm/weekly_issues/group.json?enterprise_identifier=%s&pm_project_ids=%s", enterpriseIdentifier, pmProjectIds)); } + + public static GitLinkRequestUrl GET_GROUP_ISSUE_LIST(JSONObject params) throws URISyntaxException { + + return getGitLinkRequestUrl( + buildUri("/api/pm/weekly_issues/group_issues.json", params)); + } } From e77576f08524f6220161634e8e699441ba1f0bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Fri, 23 May 2025 16:42:22 +0800 Subject: [PATCH 49/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E6=88=90=E6=9E=9C=E5=BA=93=E3=80=91=E4=B8=80=E4=BA=9B=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlockChainController.java | 31 +++++++++++++ .../domain/Achievements.java | 44 +++++-------------- .../mapper/AchievementsMapper.java | 2 + .../service/impl/AchievementsServiceImpl.java | 14 +++--- .../domain/AchievementBehaviorSumVo.java | 10 +++++ .../CollectUserActDataController.java | 2 +- .../mapper/dms/AchievementsMapper.xml | 7 +++ .../dms/ExpertResourceLibraryMapper.xml | 5 ++- .../mapper/dms/TalentReferralMapper.xml | 2 +- 9 files changed, 74 insertions(+), 43 deletions(-) create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/BlockChainController.java diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/BlockChainController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/BlockChainController.java new file mode 100644 index 000000000..112a7ad71 --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/BlockChainController.java @@ -0,0 +1,31 @@ +package com.microservices.dms.achievementLibrary.controller; + +import com.microservices.common.core.web.controller.BaseController; +import com.microservices.common.core.web.page.TableDataInfo; +import com.microservices.dms.achievementLibrary.domain.TokenListVo; +import com.microservices.dms.achievementLibrary.service.IAchievementsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/blockChain") +@Api(tags = "数据产权子系统") +public class BlockChainController extends BaseController { + + @Autowired + private IAchievementsService achievementsService; + + @GetMapping("/projectTokenList") + @ApiOperation(value = "项目token列表") + public TableDataInfo projectTokenList() { + startPage(); + List list = achievementsService.projectTokenList(); + return getDataTable(list); + } +} \ No newline at end of file diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/Achievements.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/Achievements.java index 15f0607e8..0fc46847d 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/Achievements.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/Achievements.java @@ -2,6 +2,7 @@ package com.microservices.dms.achievementLibrary.domain; import java.util.Date; import java.util.List; +import java.util.Map; import com.fasterxml.jackson.annotation.JsonFormat; import com.microservices.dms.resourceLibrary.domain.vo.KeyValVo; @@ -185,6 +186,15 @@ public class Achievements extends BaseEntity { private String userNickName; public String gender; private String userLogin; + private List> dockingUserInfo; + + public List> getDockingUserInfo() { + return dockingUserInfo; + } + + public void setDockingUserInfo(List> dockingUserInfo) { + this.dockingUserInfo = dockingUserInfo; + } public String getShowAchievementName() { return showAchievementName; @@ -492,38 +502,4 @@ public class Achievements extends BaseEntity { return attachments; } - @Override - public String toString() { - return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) - .append("id", getId()) - .append("achievementName", getAchievementName()) - .append("field1", getField1()) - .append("field2", getField2()) - .append("field3", getField3()) - .append("achievementType", getAchievementType()) - .append("source", getSource()) - .append("sourceId", getSourceId()) - .append("sourceLink", getSourceLink()) - .append("tags", getTags()) - .append("summary", getSummary()) - .append("publishingUnit", getPublishingUnit()) - .append("address", getAddress()) - .append("isFeatured", getIsFeatured()) - .append("contactPerson", getContactPerson()) - .append("contactNumber", getContactNumber()) - .append("ownerId", getOwnerId()) - .append("ownerName", getOwnerName()) - .append("status", getStatus()) - .append("details", getDetails()) - .append("reviewer", getReviewer()) - .append("reviewDate", getReviewDate()) - .append("reviewComments", getReviewComments()) - .append("images", getImages()) - .append("attachments", getAttachments()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) - .toString(); - } } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java index d2e4052a7..c898e5c57 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementsMapper.java @@ -156,4 +156,6 @@ public interface AchievementsMapper { List getAchievementActDataD(@Param("s") Date s, @Param("e") Date e); List getAchievementActDataF(@Param("s") Date s, @Param("e") Date e); + + List> getDockingUserInfo(@Param("id") Long id); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java index a22505481..b7e50ea8f 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java @@ -31,6 +31,7 @@ import org.springframework.stereotype.Service; import com.microservices.dms.achievementLibrary.mapper.AchievementsMapper; import com.microservices.dms.achievementLibrary.service.IAchievementsService; +import static com.microservices.dms.constant.BlockChainFunConstants.QUERY_REPO; import static com.microservices.dms.utils.UrlUtil.getUrlPath; /** @@ -66,7 +67,7 @@ public class AchievementsServiceImpl implements IAchievementsService { @Value("${http.gatewayUrl}") public String gatewayUrl; - @Value("${gitlink.fiscobcosUrl}") +// @Value("${gitlink.fiscobcosUrl}") public String fiscobcosUrl; @Autowired @@ -131,6 +132,10 @@ public class AchievementsServiceImpl implements IAchievementsService { } a.setImages(buildFileInfoByIdents(a.getImages(), a.getSource())); a.setAttachments(buildFileInfoByIdents(a.getAttachments(), a.getSource())); + + //拼接对接的用户信息 + List> dockingUserInfo = achievementsMapper.getDockingUserInfo(achievements.getId()); + achievements.setDockingUserInfo(dockingUserInfo); } return list; } @@ -568,15 +573,14 @@ public class AchievementsServiceImpl implements IAchievementsService { private Long queryTotalToken(TokenListVo v) { JSONObject param = new JSONObject(); - param.put("request-type","query repo basic info"); + param.put("request-type",QUERY_REPO); param.put("token_name",v.getId()); try { JSONObject reps = httpAPIService.doPost(fiscobcosUrl,param); if (reps.containsKey("status") && reps.getString("status").equals("0")) { - Long totalSupply = reps.getLong("total_supply"); -// Long curSupply = reps.getLong("cur_supply"); - return totalSupply; + // Long curSupply = reps.getLong("cur_supply"); + return reps.getLong("total_supply"); } } catch (Exception e) { log.error("区块链信息查询失败", e); diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/domain/AchievementBehaviorSumVo.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/domain/AchievementBehaviorSumVo.java index 9072958f6..af6c09815 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/domain/AchievementBehaviorSumVo.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/domain/AchievementBehaviorSumVo.java @@ -11,6 +11,16 @@ public class AchievementBehaviorSumVo { private Long favoriteSum; //下载量 private Long downloadSum; + //成果用户对接 + private Long userDockingSum; + + public Long getUserDockingSum() { + return userDockingSum; + } + + public void setUserDockingSum(Long userDockingSum) { + this.userDockingSum = userDockingSum; + } public Long getClickSum() { return clickSum; diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/controller/CollectUserActDataController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/controller/CollectUserActDataController.java index 2bdc19773..1c5c32b16 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/controller/CollectUserActDataController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/resourceLibrary/controller/CollectUserActDataController.java @@ -21,7 +21,7 @@ public class CollectUserActDataController { @PostMapping("/addClicker") @ApiImplicitParams({ - @ApiImplicitParam(name = "clickType", value = "点击类型(任务:makerSpaceTask、竞赛:CompetitionInfo、项目:Project、成果:Achievements、专家:Experts,校企:schoolEnterprise)", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "clickType", value = "点击类型(任务:makerSpaceTask、竞赛:CompetitionInfo、项目:Project、成果:Achievements、专家:Experts,校企:schoolEnterprise,成果用户对接:userDocking)", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "clickId", value = "点击对象ID", paramType = "query", dataTypeClass = Integer.class), @ApiImplicitParam(name = "userId", value = "用户ID", paramType = "query", dataTypeClass = Integer.class), @ApiImplicitParam(name = "extInfo", value = "补充信息", paramType = "query", dataTypeClass = String.class) diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index ee6eab0c6..23664a478 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -700,4 +700,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" resultType="com.microservices.dms.achievementLibrary.domain.KeyValueVo"> select '收藏' as `key`, DATE_FORMAT(created_at, '%m-%d') as name,COUNT(*) as value from favorites where favorite_type = 'Achievements' and created_at >= #{s} and created_at <= #{e} group by DATE_FORMAT(created_at, '%m-%d') + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml index 17a099b26..3221f90b8 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/ExpertResourceLibraryMapper.xml @@ -452,10 +452,11 @@ diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml index d5a952adf..f3894a7ad 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/TalentReferralMapper.xml @@ -71,7 +71,7 @@ from tasks t join task_details td on t.id = td.task_id where status in - + #{item} From b266bb82d62f7e169c3908b80a32519992a35923 Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Mon, 26 May 2025 09:03:37 +0800 Subject: [PATCH 50/98] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=88=90=E6=9E=9C?= =?UTF-8?q?=E5=AD=97=E5=85=B8=E7=AE=A1=E7=90=86=EF=BC=9B=E6=A0=A1=E4=BC=81?= =?UTF-8?q?=E6=88=90=E6=9E=9C=E6=96=B0=E5=A2=9E=E7=9B=B8=E5=85=B3=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AchievementDictDataController.java | 117 ++++++++++++++++++ .../domain/AchievementDictData.java | 112 +++++++++++++++++ .../domain/SchoolEnterpriseAchievements.java | 30 +++++ .../mapper/AchievementDictDataMapper.java | 67 ++++++++++ .../service/IAchievementDictDataService.java | 65 ++++++++++ .../impl/AchievementDictDataServiceImpl.java | 104 ++++++++++++++++ .../mapper/dms/AchievementDictDataMapper.xml | 100 +++++++++++++++ .../SchoolEnterpriseAchievementsMapper.xml | 24 +++- 8 files changed, 618 insertions(+), 1 deletion(-) create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementDictDataController.java create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/AchievementDictData.java create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementDictDataService.java create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java create mode 100644 microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementDictDataController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementDictDataController.java new file mode 100644 index 000000000..c863d73d7 --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementDictDataController.java @@ -0,0 +1,117 @@ +package com.microservices.dms.achievementLibrary.controller; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.microservices.common.core.utils.StringUtils; +import com.microservices.dms.achievementLibrary.domain.KeyValueVo; +import com.microservices.system.api.domain.SysDictData; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.microservices.common.log.annotation.Log; +import com.microservices.common.log.enums.BusinessType; +import com.microservices.common.security.annotation.RequiresPermissions; +import com.microservices.dms.achievementLibrary.domain.AchievementDictData; +import com.microservices.dms.achievementLibrary.service.IAchievementDictDataService; +import com.microservices.common.core.web.controller.BaseController; +import com.microservices.common.core.web.domain.AjaxResult; +import com.microservices.common.core.utils.poi.ExcelUtil; +import com.microservices.common.core.web.page.TableDataInfo; + +/** + * 成果相关字典Controller + * + * @author microservices + * @date 2025-05-23 + */ +@Api(tags = "数据管理体系-成果字典管理") +@RestController +@RequestMapping("/achDict") +public class AchievementDictDataController extends BaseController +{ + @Autowired + private IAchievementDictDataService achievementDictDataService; + + /** + * 查询成果相关字典列表 + */ + @GetMapping("/list") + public TableDataInfo list(AchievementDictData achievementDictData) + { + startPage(); + List list = achievementDictDataService.selectAchievementDictDataList(achievementDictData); + return getDataTable(list); + } + + /** + * 导出成果相关字典列表 + */ + @Log(title = "成果相关字典", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, AchievementDictData achievementDictData) + { + List list = achievementDictDataService.selectAchievementDictDataList(achievementDictData); + ExcelUtil util = new ExcelUtil(AchievementDictData.class); + util.exportExcel(response, list, "成果相关字典数据"); + } + + /** + * 获取成果相关字典详细信息 + */ + @GetMapping(value = "/{dictCode}") + public AjaxResult getInfo(@PathVariable("dictCode") Long dictCode) + { + return success(achievementDictDataService.selectAchievementDictDataByDictCode(dictCode)); + } + + /** + * 新增成果相关字典 + */ + @Log(title = "成果相关字典", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody AchievementDictData achievementDictData) + { + return toAjax(achievementDictDataService.insertAchievementDictData(achievementDictData)); + } + + /** + * 修改成果相关字典 + */ + @Log(title = "成果相关字典", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody AchievementDictData achievementDictData) + { + return toAjax(achievementDictDataService.updateAchievementDictData(achievementDictData)); + } + + /** + * 删除成果相关字典 + */ + @Log(title = "成果相关字典", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public AjaxResult remove(@PathVariable Long[] dictCodes) + { + return toAjax(achievementDictDataService.deleteAchievementDictDataByDictCodes(dictCodes)); + } + + /** + * 根据字典类型查询字典数据信息 + */ + @ApiOperation("根据成果字典分类查询成果值") + @GetMapping(value = "/getDictDateByType") + public AjaxResult dictType(@PathVariable String dictType) + { + List data = achievementDictDataService.selectDictDataByType(dictType); + return success(data); + } +} diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/AchievementDictData.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/AchievementDictData.java new file mode 100644 index 000000000..86ff46f36 --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/AchievementDictData.java @@ -0,0 +1,112 @@ +package com.microservices.dms.achievementLibrary.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.microservices.common.core.annotation.Excel; +import com.microservices.common.core.web.domain.BaseEntity; + +/** + * 成果相关字典对象 achievement_dict_data + * + * @author microservices + * @date 2025-05-23 + */ +public class AchievementDictData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 字典编码 */ + private Long dictCode; + + /** 字典排序 */ + @Excel(name = "字典排序") + private Integer dictSort; + + /** 字典标签 */ + @Excel(name = "字典标签") + private String dictLabel; + + /** 字典键值 */ + @Excel(name = "字典键值") + private String dictValue; + + /** 字典类型 */ + @Excel(name = "字典类型") + private String dictType; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + public void setDictCode(Long dictCode) + { + this.dictCode = dictCode; + } + + public Long getDictCode() + { + return dictCode; + } + public void setDictSort(Integer dictSort) + { + this.dictSort = dictSort; + } + + public Integer getDictSort() + { + return dictSort; + } + public void setDictLabel(String dictLabel) + { + this.dictLabel = dictLabel; + } + + public String getDictLabel() + { + return dictLabel; + } + public void setDictValue(String dictValue) + { + this.dictValue = dictValue; + } + + public String getDictValue() + { + return dictValue; + } + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getDictType() + { + return dictType; + } + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictCode", getDictCode()) + .append("dictSort", getDictSort()) + .append("dictLabel", getDictLabel()) + .append("dictValue", getDictValue()) + .append("dictType", getDictType()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/SchoolEnterpriseAchievements.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/SchoolEnterpriseAchievements.java index 026fb8a67..20cba6918 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/SchoolEnterpriseAchievements.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/SchoolEnterpriseAchievements.java @@ -167,6 +167,36 @@ public class SchoolEnterpriseAchievements extends BaseEntity { @Excel(name = "成果附件") private String attachments; private Integer achievementStatus; + //成果小类型 + private String achievementLittleType; + //成果状态 + private String achievementCurStatus; + //团队名称 + private String teamName; + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public String getAchievementLittleType() { + return achievementLittleType; + } + + public void setAchievementLittleType(String achievementLittleType) { + this.achievementLittleType = achievementLittleType; + } + + public String getAchievementCurStatus() { + return achievementCurStatus; + } + + public void setAchievementCurStatus(String achievementCurStatus) { + this.achievementCurStatus = achievementCurStatus; + } public Integer getAchievementStatus() { return achievementStatus; diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java new file mode 100644 index 000000000..10be11b89 --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java @@ -0,0 +1,67 @@ +package com.microservices.dms.achievementLibrary.mapper; + +import java.util.List; +import com.microservices.dms.achievementLibrary.domain.AchievementDictData; +import com.microservices.dms.achievementLibrary.domain.KeyValueVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 成果相关字典Mapper接口 + * + * @author microservices + * @date 2025-05-23 + */ +@Mapper +public interface AchievementDictDataMapper +{ + /** + * 查询成果相关字典 + * + * @param dictCode 成果相关字典主键 + * @return 成果相关字典 + */ + public AchievementDictData selectAchievementDictDataByDictCode(Long dictCode); + + /** + * 查询成果相关字典列表 + * + * @param achievementDictData 成果相关字典 + * @return 成果相关字典集合 + */ + public List selectAchievementDictDataList(AchievementDictData achievementDictData); + + /** + * 新增成果相关字典 + * + * @param achievementDictData 成果相关字典 + * @return 结果 + */ + public int insertAchievementDictData(AchievementDictData achievementDictData); + + /** + * 修改成果相关字典 + * + * @param achievementDictData 成果相关字典 + * @return 结果 + */ + public int updateAchievementDictData(AchievementDictData achievementDictData); + + /** + * 删除成果相关字典 + * + * @param dictCode 成果相关字典主键 + * @return 结果 + */ + public int deleteAchievementDictDataByDictCode(Long dictCode); + + /** + * 批量删除成果相关字典 + * + * @param dictCodes 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteAchievementDictDataByDictCodes(Long[] dictCodes); + + List selectDictDataByType(@Param("dictType") String dictType); +} diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementDictDataService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementDictDataService.java new file mode 100644 index 000000000..7855fe1d9 --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementDictDataService.java @@ -0,0 +1,65 @@ +package com.microservices.dms.achievementLibrary.service; + +import java.util.List; +import com.microservices.dms.achievementLibrary.domain.AchievementDictData; +import com.microservices.dms.achievementLibrary.domain.KeyValueVo; +import org.apache.ibatis.annotations.Param; + +/** + * 成果相关字典Service接口 + * + * @author microservices + * @date 2025-05-23 + */ +public interface IAchievementDictDataService +{ + /** + * 查询成果相关字典 + * + * @param dictCode 成果相关字典主键 + * @return 成果相关字典 + */ + public AchievementDictData selectAchievementDictDataByDictCode(Long dictCode); + + /** + * 查询成果相关字典列表 + * + * @param achievementDictData 成果相关字典 + * @return 成果相关字典集合 + */ + public List selectAchievementDictDataList(AchievementDictData achievementDictData); + + /** + * 新增成果相关字典 + * + * @param achievementDictData 成果相关字典 + * @return 结果 + */ + public int insertAchievementDictData(AchievementDictData achievementDictData); + + /** + * 修改成果相关字典 + * + * @param achievementDictData 成果相关字典 + * @return 结果 + */ + public int updateAchievementDictData(AchievementDictData achievementDictData); + + /** + * 批量删除成果相关字典 + * + * @param dictCodes 需要删除的成果相关字典主键集合 + * @return 结果 + */ + public int deleteAchievementDictDataByDictCodes(Long[] dictCodes); + + /** + * 删除成果相关字典信息 + * + * @param dictCode 成果相关字典主键 + * @return 结果 + */ + public int deleteAchievementDictDataByDictCode(Long dictCode); + + List selectDictDataByType(String dictType); +} diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java new file mode 100644 index 000000000..c2c62c6ae --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java @@ -0,0 +1,104 @@ +package com.microservices.dms.achievementLibrary.service.impl; + +import java.util.Collections; +import java.util.List; +import com.microservices.common.core.utils.DateUtils; +import com.microservices.dms.achievementLibrary.domain.KeyValueVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.microservices.dms.achievementLibrary.mapper.AchievementDictDataMapper; +import com.microservices.dms.achievementLibrary.domain.AchievementDictData; +import com.microservices.dms.achievementLibrary.service.IAchievementDictDataService; + +/** + * 成果相关字典Service业务层处理 + * + * @author microservices + * @date 2025-05-23 + */ +@Service +public class AchievementDictDataServiceImpl implements IAchievementDictDataService +{ + @Autowired + private AchievementDictDataMapper achievementDictDataMapper; + + /** + * 查询成果相关字典 + * + * @param dictCode 成果相关字典主键 + * @return 成果相关字典 + */ + @Override + public AchievementDictData selectAchievementDictDataByDictCode(Long dictCode) + { + return achievementDictDataMapper.selectAchievementDictDataByDictCode(dictCode); + } + + /** + * 查询成果相关字典列表 + * + * @param achievementDictData 成果相关字典 + * @return 成果相关字典 + */ + @Override + public List selectAchievementDictDataList(AchievementDictData achievementDictData) + { + return achievementDictDataMapper.selectAchievementDictDataList(achievementDictData); + } + + /** + * 新增成果相关字典 + * + * @param achievementDictData 成果相关字典 + * @return 结果 + */ + @Override + public int insertAchievementDictData(AchievementDictData achievementDictData) + { + //判断字典是否存在,存在则不管,不存在则新增 + achievementDictData.setCreateTime(DateUtils.getNowDate()); + return achievementDictDataMapper.insertAchievementDictData(achievementDictData); + } + + /** + * 修改成果相关字典 + * + * @param achievementDictData 成果相关字典 + * @return 结果 + */ + @Override + public int updateAchievementDictData(AchievementDictData achievementDictData) + { + achievementDictData.setUpdateTime(DateUtils.getNowDate()); + return achievementDictDataMapper.updateAchievementDictData(achievementDictData); + } + + /** + * 批量删除成果相关字典 + * + * @param dictCodes 需要删除的成果相关字典主键 + * @return 结果 + */ + @Override + public int deleteAchievementDictDataByDictCodes(Long[] dictCodes) + { + return achievementDictDataMapper.deleteAchievementDictDataByDictCodes(dictCodes); + } + + /** + * 删除成果相关字典信息 + * + * @param dictCode 成果相关字典主键 + * @return 结果 + */ + @Override + public int deleteAchievementDictDataByDictCode(Long dictCode) + { + return achievementDictDataMapper.deleteAchievementDictDataByDictCode(dictCode); + } + + @Override + public List selectDictDataByType(String dictType) { + return achievementDictDataMapper.selectDictDataByType(dictType); + } +} diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml new file mode 100644 index 000000000..83ba8a438 --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + select dict_code, dict_sort, dict_label, dict_value, dict_type, status, create_by, create_time, update_by, update_time, remark from achievement_dict_data + + + + + + + + insert into achievement_dict_data + + dict_sort, + dict_label, + dict_value, + dict_type, + status, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{dictSort}, + #{dictLabel}, + #{dictValue}, + #{dictType}, + #{status}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update achievement_dict_data + + dict_sort = #{dictSort}, + dict_label = #{dictLabel}, + dict_value = #{dictValue}, + dict_type = #{dictType}, + status = #{status}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where dict_code = #{dictCode} + + + + delete from achievement_dict_data where dict_code = #{dictCode} + + + + delete from achievement_dict_data where dict_code in + + #{dictCode} + + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/SchoolEnterpriseAchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/SchoolEnterpriseAchievementsMapper.xml index b83b2b6ce..8e472f3b4 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/SchoolEnterpriseAchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/SchoolEnterpriseAchievementsMapper.xml @@ -35,10 +35,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + - select id, achievement_name, achievement_status,field_1, field_2, field_3, achievement_type, source, source_id, source_link, tags, summary, publishing_unit, address, is_featured, contact_person, contact_number, owner_id, owner_name, status, details, reviewer, review_date, review_comments, images, attachments, create_by, create_time, update_by, update_time from school_enterprise_achievements + select id, achievement_name, achievement_status,field_1, field_2, field_3, + achievement_type, source, source_id, source_link, tags, summary, publishing_unit, + address, is_featured, contact_person, contact_number, owner_id, owner_name, status, achievement_little_type, + details, reviewer, review_date, review_comments, images, attachments, create_by, create_time, achievement_cur_status,team_name, + update_by, update_time from school_enterprise_achievements @@ -105,6 +115,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and review_comments = #{reviewComments} and images = #{images} and attachments = #{attachments} + and achievement_cur_status = #{achievementCurStatus} + and achievement_little_type = #{achievementLittleType} + and team_name = #{teamName} @@ -140,6 +153,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_by, update_time, achievement_status, + achievement_cur_status, + achievement_little_type, + team_name, #{achievementName}, @@ -171,6 +187,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{updateBy}, #{updateTime}, #{achievementStatus}, + #{achievementCurStatus}, + #{achievementLittleType}, + #{teamName}, @@ -206,6 +225,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_by = #{updateBy}, update_time = #{updateTime}, achievement_status = #{achievementStatus}, + achievement_cur_status = #{achievementCurStatus}, + achievement_little_type = #{achievementLittleType}, + team_name = #{teamName}, where id = #{id} From 7c6617626a71a4fa0483f8ab96c8786cbc53bf7c Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Mon, 26 May 2025 09:34:34 +0800 Subject: [PATCH 51/98] =?UTF-8?q?=E6=B2=A1=E6=9C=89=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E5=80=BC=E6=96=B0=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/AchievementDictDataMapper.java | 2 ++ .../service/impl/AchievementDictDataServiceImpl.java | 11 +++++++++-- .../mapper/dms/AchievementDictDataMapper.xml | 6 +++++- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java index 10be11b89..43b488213 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java @@ -64,4 +64,6 @@ public interface AchievementDictDataMapper public int deleteAchievementDictDataByDictCodes(Long[] dictCodes); List selectDictDataByType(@Param("dictType") String dictType); + + int selectDictDataByLabel(@Param("label") String label,@Param("type") String type); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java index c2c62c6ae..542201c5c 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java @@ -56,8 +56,15 @@ public class AchievementDictDataServiceImpl implements IAchievementDictDataServi public int insertAchievementDictData(AchievementDictData achievementDictData) { //判断字典是否存在,存在则不管,不存在则新增 - achievementDictData.setCreateTime(DateUtils.getNowDate()); - return achievementDictDataMapper.insertAchievementDictData(achievementDictData); + String label = achievementDictData.getDictLabel(); + String type = achievementDictData.getDictType(); + int num = achievementDictDataMapper.selectDictDataByLabel(label,type); + if (num > 0){ + return 0; + }else{ + achievementDictData.setCreateTime(DateUtils.getNowDate()); + return achievementDictDataMapper.insertAchievementDictData(achievementDictData); + } } /** diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml index 83ba8a438..00f289099 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml @@ -95,6 +95,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + \ No newline at end of file From 5dd17b1142f8e57e51d1584a16c4b9b82754c51c Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Mon, 26 May 2025 11:08:23 +0800 Subject: [PATCH 52/98] =?UTF-8?q?=E6=88=90=E6=9E=9C=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=9F=A5=E6=94=B9=EF=BC=8C=E6=88=90=E6=9E=9C?= =?UTF-8?q?=E8=81=9A=E7=B1=BB=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AchievementDictDataController.java | 10 +++- .../domain/SchoolEnterpriseAchievements.java | 11 +++++ .../mapper/AchievementDictDataMapper.java | 2 + .../mapper/AchievementTeamMapper.java | 2 + .../service/IAchievementDictDataService.java | 2 + .../impl/AchievementDictDataServiceImpl.java | 5 ++ ...hoolEnterpriseAchievementsServiceImpl.java | 12 ++++- .../mapper/dms/AchievementDictDataMapper.xml | 4 ++ .../mapper/dms/AchievementTeamMapper.xml | 5 ++ .../mapper/dms/AchievementsMapper.xml | 49 ++++++++++++------- 10 files changed, 82 insertions(+), 20 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementDictDataController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementDictDataController.java index c863d73d7..e33b66ab3 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementDictDataController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/AchievementDictDataController.java @@ -109,9 +109,17 @@ public class AchievementDictDataController extends BaseController */ @ApiOperation("根据成果字典分类查询成果值") @GetMapping(value = "/getDictDateByType") - public AjaxResult dictType(@PathVariable String dictType) + public AjaxResult getDictDateByType(@PathVariable String dictType) { List data = achievementDictDataService.selectDictDataByType(dictType); return success(data); } + + @ApiOperation("根据成果字典分类") + @GetMapping(value = "/getDictTypes") + public AjaxResult getDictTypes() + { + List data = achievementDictDataService.getDictTypes(); + return success(data); + } } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/SchoolEnterpriseAchievements.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/SchoolEnterpriseAchievements.java index 20cba6918..589071613 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/SchoolEnterpriseAchievements.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/domain/SchoolEnterpriseAchievements.java @@ -1,6 +1,7 @@ package com.microservices.dms.achievementLibrary.domain; import java.util.Date; +import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -174,6 +175,16 @@ public class SchoolEnterpriseAchievements extends BaseEntity { //团队名称 private String teamName; + private List teamList; + + public List getTeamList() { + return teamList; + } + + public void setTeamList(List teamList) { + this.teamList = teamList; + } + public String getTeamName() { return teamName; } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java index 43b488213..65301831c 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java @@ -66,4 +66,6 @@ public interface AchievementDictDataMapper List selectDictDataByType(@Param("dictType") String dictType); int selectDictDataByLabel(@Param("label") String label,@Param("type") String type); + + List getDictTypes(); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementTeamMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementTeamMapper.java index 20e5502aa..93c9fa09a 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementTeamMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementTeamMapper.java @@ -66,4 +66,6 @@ public interface AchievementTeamMapper public int deleteAchievementTeamByIds(Long[] ids); void deleteAchievementTeamByAId(@Param("aid") Long aid); + + List selectAchievementTeamByAchId(@Param("achId") Long achId); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementDictDataService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementDictDataService.java index 7855fe1d9..2274e632c 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementDictDataService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementDictDataService.java @@ -62,4 +62,6 @@ public interface IAchievementDictDataService public int deleteAchievementDictDataByDictCode(Long dictCode); List selectDictDataByType(String dictType); + + List getDictTypes(); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java index 542201c5c..a9a46c397 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementDictDataServiceImpl.java @@ -108,4 +108,9 @@ public class AchievementDictDataServiceImpl implements IAchievementDictDataServi public List selectDictDataByType(String dictType) { return achievementDictDataMapper.selectDictDataByType(dictType); } + + @Override + public List getDictTypes() { + return achievementDictDataMapper.getDictTypes(); + } } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/SchoolEnterpriseAchievementsServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/SchoolEnterpriseAchievementsServiceImpl.java index de5bcd549..c9483f020 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/SchoolEnterpriseAchievementsServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/SchoolEnterpriseAchievementsServiceImpl.java @@ -5,7 +5,9 @@ import java.util.stream.Collectors; import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.utils.DateUtils; +import com.microservices.common.core.utils.StringUtils; import com.microservices.common.security.utils.SecurityUtils; +import com.microservices.dms.achievementLibrary.domain.AchievementTeam; import com.microservices.dms.achievementLibrary.domain.Achievements; import com.microservices.dms.achievementLibrary.mapper.AchievementTeamMapper; import com.microservices.dms.achievementLibrary.mapper.AchievementsMapper; @@ -46,7 +48,15 @@ public class SchoolEnterpriseAchievementsServiceImpl implements ISchoolEnterpris @Override public SchoolEnterpriseAchievements selectSchoolEnterpriseAchievementsById(Long id) { - return schoolEnterpriseAchievementsMapper.selectSchoolEnterpriseAchievementsById(id); + SchoolEnterpriseAchievements sAchievements = schoolEnterpriseAchievementsMapper.selectSchoolEnterpriseAchievementsById(id); + if(StringUtils.isNotNull(sAchievements)){ + Long achId = sAchievements.getId(); + List teamList = achievementTeamMapper.selectAchievementTeamByAchId(achId); + if(StringUtils.isNotNull(teamList) && teamList.size() > 0){ + sAchievements.setTeamList(teamList); + } + } + return sAchievements; } /** diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml index 00f289099..f2b9a97b0 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementDictDataMapper.xml @@ -101,4 +101,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementTeamMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementTeamMapper.xml index 502333c48..5c1772297 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementTeamMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementTeamMapper.xml @@ -125,4 +125,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from achievement_team where achievement_id = #{aid} + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index 23664a478..6a0af05fd 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -540,24 +540,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select dict_code as "key",dict_label as "value" from achievement_dict_data where dict_type = #{dictType} + select dict_code as "key",dict_label as "name" from achievement_dict_data where dict_type = #{dictType} select a.ancestry as "key", fs.title as "name", a.tmp as "value" - from (select f.ancestry, count(1) as "tmp" - from memos m - left join forum_sections f on m.forum_section_id = f.id - where m.destroy_status is null - and m.hidden = 0 - and m.published_at is not null - group by f.ancestry) a - left join forum_sections fs on fs.id = a.ancestry + from ( + select IFNULL(f.ancestry, m.forum_section_id) as"ancestry",count(1) as "tmp" from memos m + inner join forum_sections f on m.forum_section_id = f.id + where m.destroy_status is null + and m.hidden = 0 + and m.published_at is not null + group by IFNULL(f.ancestry, m.forum_section_id) + ) a + left join forum_sections fs on fs.id = a.ancestry ORDER BY a.ancestry DESC @@ -526,13 +527,13 @@ From 143fa631ce7e962e4ecbe3fe200f365c70f8e4dd Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Mon, 26 May 2025 16:00:50 +0800 Subject: [PATCH 62/98] =?UTF-8?q?feat(Wiki=E5=8E=86=E5=8F=B2=E7=89=88?= =?UTF-8?q?=E6=9C=AC):=E5=8E=86=E5=8F=B2=E7=89=88=E6=9C=AC=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E7=94=A8=E6=88=B7=E5=90=8D=E6=98=BE=E7=A4=BA=E6=98=B5?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/microservices/wiki/service/wiki/WikiService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/service/wiki/WikiService.java b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/service/wiki/WikiService.java index 049172e80..7d5d7e2b9 100644 --- a/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/service/wiki/WikiService.java +++ b/microservices-modules/microservices-modules-wiki/src/main/java/com/microservices/wiki/service/wiki/WikiService.java @@ -165,16 +165,17 @@ public class WikiService { } WikiRevisionsVo wikiRevisionsVo = JSON.parseObject(httpClientResult.getContent(), WikiRevisionsVo.class); wikiRevisionsVo.getCommits().forEach(commit -> { + commit.getCommiter().setImage_url(userService.getRemoteUserLogoByUserLogin(commit.getCommiter().getName())); User commitUser = userService.getUserByLogin(commit.getCommiter().getName()); if(commitUser != null){ commit.getCommiter().setName(StringUtils.isEmpty(commitUser.getNickname()) ? commitUser.getLogin() : commitUser.getNickname()); } - commit.getCommiter().setImage_url(userService.getRemoteUserLogoByUserLogin(commit.getCommiter().getName())); + + commit.getAuthor().setImage_url(userService.getRemoteUserLogoByUserLogin(commit.getAuthor().getName())); User authorUser = userService.getUserByLogin(commit.getAuthor().getName()); if(authorUser != null){ commit.getAuthor().setName(StringUtils.isEmpty(authorUser.getNickname()) ? authorUser.getLogin() : authorUser.getNickname()); } - commit.getAuthor().setImage_url(userService.getRemoteUserLogoByUserLogin(commit.getAuthor().getName())); }); return wikiRevisionsVo; From 8acecc5f13a608ad24bd36882e6c2a83cc163661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Mon, 26 May 2025 17:26:02 +0800 Subject: [PATCH 63/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E6=88=90=E6=9E=9C=E5=BA=93=E3=80=91=20=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7=E7=9B=B8=E5=85=B3=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AchievementsServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java index b482116df..79fe7f277 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java @@ -135,7 +135,7 @@ public class AchievementsServiceImpl implements IAchievementsService { //拼接对接的用户信息 List> dockingUserInfo = achievementsMapper.getDockingUserInfo(a.getId()); - achievements.setDockingUserInfo(dockingUserInfo); + a.setDockingUserInfo(dockingUserInfo); } return list; } From ea2d703a5e63c0057a473e62e685dbc8664735d0 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Mon, 26 May 2025 19:17:29 +0800 Subject: [PATCH 64/98] =?UTF-8?q?feat(Wiki=E5=8E=86=E5=8F=B2=E7=89=88?= =?UTF-8?q?=E6=9C=AC):=E5=91=A8=E6=8A=A5-=E4=B8=AA=E4=BA=BA=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E9=A1=B9=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PmsProjectWeeklyReportController.java | 10 ++++ .../vo/PmsPersonalWeeklyIssuesSearchVo.java | 46 +++++++++++++++++++ .../vo/PmsPersonalWeeklyReportSearchVo.java | 32 +------------ .../service/PmsProjectIssuesService.java | 13 +++++- .../pms/utils/PmsGitLinkRequestUrl.java | 5 ++ 5 files changed, 75 insertions(+), 31 deletions(-) create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java index e5c0cd0d6..c829271cb 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java @@ -2,6 +2,7 @@ package com.microservices.pms.project.controller; import com.alibaba.fastjson2.JSONObject; import com.microservices.common.core.web.domain.AjaxResult; +import com.microservices.pms.project.domain.vo.PmsPersonalWeeklyIssuesSearchVo; import com.microservices.pms.project.domain.vo.PmsPersonalWeeklyReportSearchVo; import com.microservices.pms.project.domain.vo.PmsProjectIssuesInputVo; import com.microservices.pms.project.domain.vo.PmsProjectIssuesSearchVo; @@ -54,6 +55,15 @@ public class PmsProjectWeeklyReportController { return success(result); } + @GetMapping("/personalIssueList") + @ApiOperation(value = "周报-个人工作项列表") + public AjaxResult getPersonalIssueList(@PathVariable String enterpriseIdentifier, PmsPersonalWeeklyIssuesSearchVo pmsPersonalWeeklyIssuesSearchVo) + { + pmsPersonalWeeklyIssuesSearchVo.setEnterpriseIdentifier(enterpriseIdentifier); + JSONObject result = pmsProjectIssuesService.getPersonalIssueList(pmsPersonalWeeklyIssuesSearchVo); + return success(result); + } + /** * 查询周报-项目组工作项统计 */ diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java new file mode 100644 index 000000000..5b541159d --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java @@ -0,0 +1,46 @@ +package com.microservices.pms.project.domain.vo; + +import com.microservices.common.core.utils.ServletUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@ApiModel("个人周报工作项搜索对象") +public class PmsPersonalWeeklyIssuesSearchVo { + + @ApiModelProperty(value = "用户gitlink用户id") + private Long userId; + + @ApiModelProperty(value = "企业标识", hidden = true) + private String enterpriseIdentifier; + + @ApiModelProperty(value = "工作项名称搜索关键词") + private String keyword; + + @ApiModelProperty(value = "状态值,可多个状态逗号隔开") + private String statusIds; + + @ApiModelProperty(value = "排序方式: issues.updated_on 更新时间 issues.created_on 创建时间 issue_priorities.position 优先级") + private String sortBy; + + @ApiModelProperty(value = "排序方向:asc 正序 desc 倒序") + private String sortDirection; + + @ApiModelProperty(value = "本周工作项页码") + private String thisWeekPage; + + @ApiModelProperty(value = "分页数") + private String thisWeekLimit; + + @ApiModelProperty(value = "本周工作项页码") + private String nextWeekPage; + + @ApiModelProperty(value = "分页数") + private String nextWeekLimit; + + public void setKeyword(String keyword) { + this.keyword = ServletUtils.urlDecode(keyword); + } +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyReportSearchVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyReportSearchVo.java index 71ca73450..340791d8f 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyReportSearchVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyReportSearchVo.java @@ -6,40 +6,12 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data -@ApiModel("个人周报工作项搜索对象") +@ApiModel("个人周报工作项统计对象") public class PmsPersonalWeeklyReportSearchVo { - @ApiModelProperty(value = "工作项名称搜索关键词") - private String keyword; - - @ApiModelProperty(value = "状态值,可多个状态逗号隔开") - private String statusIds; - - @ApiModelProperty(value = "排序方式: issues.updated_on 更新时间 issues.created_on 创建时间 issue_priorities.position 优先级") - private String sortBy; - - @ApiModelProperty(value = "排序方向:asc 正序 desc 倒序") - private String sortDirection; - - @ApiModelProperty(value = "本周工作项页码") - private String thisWeekPage; - - @ApiModelProperty(value = "分页数") - private String thisWeekLimit; - - @ApiModelProperty(value = "本周工作项页码") - private String nextWeekPage; - - @ApiModelProperty(value = "分页数") - private String nextWeekLimit; - - @ApiModelProperty(value = "当前用户gitlink用户id", hidden = true) + @ApiModelProperty(value = "用户gitlink用户id", hidden = true) private Long userId; @ApiModelProperty(value = "企业标识", hidden = true) private String enterpriseIdentifier; - - public void setKeyword(String keyword) { - this.keyword = ServletUtils.urlDecode(keyword); - } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index 049c62b07..d784c646c 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -754,7 +754,7 @@ public class PmsProjectIssuesService { public JSONObject getProjectIssueList(PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) { List pmProjectIds = pmsProjectService.selectProjectIdsByAssigneeUserId( pmsProjectIssuesSearchVo.getEnterpriseIdentifier(), - SecurityUtils.getGitlinkUserId()); + StringUtils.isEmpty(pmsProjectIssuesSearchVo.getAssignerId()) ? SecurityUtils.getGitlinkUserId() : Long.valueOf(pmsProjectIssuesSearchVo.getAssignerId())); String pmProjectIdsStr = StringUtils.join(pmProjectIds, ","); pmsProjectIssuesSearchVo.setPmProjectIds(pmProjectIdsStr); JSONObject issueSearch = new JSONObject(); @@ -765,4 +765,15 @@ public class PmsProjectIssuesService { throw new RuntimeException(e); } } + + public JSONObject getPersonalIssueList(PmsPersonalWeeklyIssuesSearchVo pmsPersonalWeeklyIssuesSearchVo) { + pmsPersonalWeeklyIssuesSearchVo.setUserId(pmsPersonalWeeklyIssuesSearchVo.getUserId() == null ? SecurityUtils.getGitlinkUserId() : pmsPersonalWeeklyIssuesSearchVo.getUserId()); + JSONObject issueSearch = new JSONObject(); + convertObjectToJSONObject(pmsPersonalWeeklyIssuesSearchVo, issueSearch, null); + try { + return setProjectIssueListUserState(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_PERSONAL_ISSUE_LIST(issueSearch))); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java index efc1ac025..34655256e 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java @@ -463,4 +463,9 @@ public class PmsGitLinkRequestUrl extends GitLinkRequestUrl { return getGitLinkRequestUrl( buildUri("/api/pm/weekly_issues/group_issues.json", params)); } + + public static GitLinkRequestUrl GET_PERSONAL_ISSUE_LIST(JSONObject issueSearch) throws URISyntaxException { + return getGitLinkRequestUrl( + buildUri("/api/pm/weekly_issues/personal_issues.json", issueSearch)); + } } From d5d4fa4805d1ae7eaf4697659173ebf5e5098696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Mon, 26 May 2025 19:39:17 +0800 Subject: [PATCH 65/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E6=88=90=E6=9E=9C=E5=BA=93=E3=80=91=E8=AF=A6=E6=83=85=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=94=A8=E6=88=B7=E5=AF=B9=E6=8E=A5=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlockChainController.java | 14 +++---- .../mapper/AchievementDictDataMapper.java | 3 ++ .../service/IAchievementsService.java | 3 -- .../service/impl/AchievementsServiceImpl.java | 41 ------------------- .../mapper/dms/AchievementsMapper.xml | 5 ++- 5 files changed, 13 insertions(+), 53 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/BlockChainController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/BlockChainController.java index 112a7ad71..729222209 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/BlockChainController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/controller/BlockChainController.java @@ -21,11 +21,11 @@ public class BlockChainController extends BaseController { @Autowired private IAchievementsService achievementsService; - @GetMapping("/projectTokenList") - @ApiOperation(value = "项目token列表") - public TableDataInfo projectTokenList() { - startPage(); - List list = achievementsService.projectTokenList(); - return getDataTable(list); - } +// @GetMapping("/projectTokenList") +// @ApiOperation(value = "项目token列表") +// public TableDataInfo projectTokenList() { +// startPage(); +// List list = achievementsService.projectTokenList(); +// return getDataTable(list); +// } } \ No newline at end of file diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java index 65301831c..39747062f 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/mapper/AchievementDictDataMapper.java @@ -1,6 +1,8 @@ package com.microservices.dms.achievementLibrary.mapper; import java.util.List; + +import com.microservices.common.datasource.annotation.Slave; import com.microservices.dms.achievementLibrary.domain.AchievementDictData; import com.microservices.dms.achievementLibrary.domain.KeyValueVo; import org.apache.ibatis.annotations.Mapper; @@ -13,6 +15,7 @@ import org.apache.ibatis.annotations.Param; * @date 2025-05-23 */ @Mapper +@Slave public interface AchievementDictDataMapper { /** diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java index 6c361f43a..59ecb66ac 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/IAchievementsService.java @@ -117,7 +117,4 @@ public interface IAchievementsService { List getRelatedAchTaskOfExpert(Long id); List getRelatedAchCompetitionOfExpert(Long id); - - List projectTokenList(); - } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java index 79fe7f277..d275a16ea 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/achievementLibrary/service/impl/AchievementsServiceImpl.java @@ -52,9 +52,6 @@ public class AchievementsServiceImpl implements IAchievementsService { @Autowired private ExpertResourceLibraryMapper expertResourceLibraryMapper; - @Autowired - private ProjectResourceLibraryMapper projectResourceLibraryMapper; - @Autowired private IBehaviorImageService behaviorImageService; @@ -67,12 +64,6 @@ public class AchievementsServiceImpl implements IAchievementsService { @Value("${http.gatewayUrl}") public String gatewayUrl; -// @Value("${gitlink.fiscobcosUrl}") - public String fiscobcosUrl; - - @Autowired - private HttpAPIService httpAPIService; - /** * 查询成果 * @@ -557,36 +548,4 @@ public class AchievementsServiceImpl implements IAchievementsService { public List getExpertAreasByName(String areaName) { return achievementsMapper.getExpertAreasByName(areaName); } - - - @Override - public List projectTokenList() { - List list = projectResourceLibraryMapper.selectProjectInfos(); - for (TokenListVo v : list) { - Long totalToken = queryTotalToken(v); - Long issueTokenSum = projectResourceLibraryMapper.sumProjectIssueToken(v.getId()); - v.setCurrentToken(totalToken - issueTokenSum); - v.setTotalToken(totalToken); - } - return list; - } - - private Long queryTotalToken(TokenListVo v) { - JSONObject param = new JSONObject(); - param.put("request-type",QUERY_REPO); - param.put("token_name",v.getId()); - - try { - JSONObject reps = httpAPIService.doPost(fiscobcosUrl,param); - if (reps.containsKey("status") && reps.getString("status").equals("0")) { - // Long curSupply = reps.getLong("cur_supply"); - return reps.getLong("total_supply"); - } - } catch (Exception e) { - log.error("区块链信息查询失败", e); - return -1L; - } - - return -1L; - } } diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index 6a0af05fd..b1698ce15 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -462,10 +462,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" From 879133b8c751b51d984e3817ac4614a73a430a38 Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Tue, 27 May 2025 08:41:06 +0800 Subject: [PATCH 66/98] =?UTF-8?q?=E6=B4=BB=E8=B7=83=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E4=BF=AE=E6=94=B9=EF=BC=9B=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E5=BA=93=E9=A6=96=E9=A1=B5=E6=9D=A5=E6=BA=90=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=EF=BC=88=E7=BB=9F=E8=AE=A1=E4=B8=8A=E6=9E=B6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/ActivityUserTotal.java | 36 +++++++++++++++++++ .../mapper/BehaviorImageMapper.java | 7 ++-- .../service/IBehaviorImageService.java | 2 +- .../impl/BehaviorImageServiceImpl.java | 2 +- .../mapper/dms/AchievementsMapper.xml | 1 + .../mapper/dms/BehaviorImageMapper.xml | 28 ++++++++++----- 6 files changed, 60 insertions(+), 16 deletions(-) create mode 100644 microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/domain/ActivityUserTotal.java diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/domain/ActivityUserTotal.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/domain/ActivityUserTotal.java new file mode 100644 index 000000000..663bac382 --- /dev/null +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/domain/ActivityUserTotal.java @@ -0,0 +1,36 @@ +package com.microservices.dms.behaviorImage.domain; + +import lombok.Data; + +public class ActivityUserTotal { + //活跃用户 + private Long totalUser; + //活跃用户专家数 + private Long totalExpert; + //活跃用户实名认证 + private Long authTotal; + + public Long getTotalUser() { + return totalUser; + } + + public void setTotalUser(Long totalUser) { + this.totalUser = totalUser; + } + + public Long getTotalExpert() { + return totalExpert; + } + + public void setTotalExpert(Long totalExpert) { + this.totalExpert = totalExpert; + } + + public Long getAuthTotal() { + return authTotal; + } + + public void setAuthTotal(Long authTotal) { + this.authTotal = authTotal; + } +} diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/mapper/BehaviorImageMapper.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/mapper/BehaviorImageMapper.java index 44ca28b0f..60b0200a2 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/mapper/BehaviorImageMapper.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/mapper/BehaviorImageMapper.java @@ -2,10 +2,7 @@ package com.microservices.dms.behaviorImage.mapper; import com.microservices.common.datasource.annotation.Slave; import com.microservices.dms.achievementLibrary.domain.KeyValueVo; -import com.microservices.dms.behaviorImage.domain.AchievementBehaviorSumVo; -import com.microservices.dms.behaviorImage.domain.ActivityUserLibrary; -import com.microservices.dms.behaviorImage.domain.BehaviorImageWeight; -import com.microservices.dms.behaviorImage.domain.UserTypeTotalVo; +import com.microservices.dms.behaviorImage.domain.*; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -98,7 +95,7 @@ public interface BehaviorImageMapper { List getUserTypeStatistic(@Param("userId")Long userId); - List getActivityStatistic(); + ActivityUserTotal getActivityStatistic(); List selectActivityUserLibraryListAll(ActivityUserLibrary activityUserLibrary); diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/service/IBehaviorImageService.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/service/IBehaviorImageService.java index bc326d9bd..526211e71 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/service/IBehaviorImageService.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/service/IBehaviorImageService.java @@ -75,7 +75,7 @@ public interface IBehaviorImageService { UserExpertTotalVo getUserExpertStatistic(Long userId); - List getActivityStatistic(); + ActivityUserTotal getActivityStatistic(); UserTypeTotalVo getUserBehaviorSum(Long userId); } diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/service/impl/BehaviorImageServiceImpl.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/service/impl/BehaviorImageServiceImpl.java index f38a6c5a5..2b8bad3eb 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/service/impl/BehaviorImageServiceImpl.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/behaviorImage/service/impl/BehaviorImageServiceImpl.java @@ -309,7 +309,7 @@ public class BehaviorImageServiceImpl implements IBehaviorImageService { } @Override - public List getActivityStatistic() { + public ActivityUserTotal getActivityStatistic() { return behaviorImageMapper.getActivityStatistic(); } diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index b1698ce15..c300bc944 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -230,6 +230,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/BehaviorImageMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/BehaviorImageMapper.xml index 7ce558091..865eacf60 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/BehaviorImageMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/BehaviorImageMapper.xml @@ -140,7 +140,7 @@ - + select count(1) as "totalUser",sum(r.isExpert) as "totalExpert",sum(r.enterprise_certification+r.authentication) as "authTotal" from ( + select res.userId,res.loginName,res.userName,res.isExpert,res.authentication,res.enterprise_certification,res.relatedCompetition,res.relatedTask,res.p1+res.p2+res.p3 as "relatedProject" from ( + select u.id as "userId",u.login as "loginName",u.nickname as "userName",u.is_expert as "isExpert",u.authentication,u.enterprise_certification, + (select count(1) as "value" from tasks where is_delete='0' and status between 3 and 8 and user_id =u.id) as "relatedTask", + (select count(1) from competition_infos ci inner join competition_users cu on ci.id = cu.competition_info_id where cu.user_id =u.id) as "relatedCompetition", + (SELECT count(1) as "pCount" FROM `projects` WHERE id != 0 AND user_id =u.id) as p1, + ( SELECT count(1) as "pCount" + FROM `projects` INNER JOIN `members` ON `members`.`project_id` = `projects`.`id` + WHERE `projects`.`id` != 0 AND `projects`.`user_id` !=u.id AND `members`.`user_id` =u.id) as p2, + (SELECT count(1) as "pCount" + FROM `projects` + INNER JOIN `team_projects` ON `team_projects`.`project_id` = `projects`.`id` + INNER JOIN `teams` ON `teams`.`id` = `team_projects`.`team_id` + INNER JOIN `team_users` ON `team_users`.`team_id` = `teams`.`id` + WHERE `projects`.`id` != 0 AND `team_users`.`user_id` =u.id) as p3 + from users u) res + where res.relatedCompetition >0 or res.relatedTask >0 or res.p1+res.p2+res.p3>0 )r \ No newline at end of file From bd0b24eb1ab2421f178cefbd9117db8a7867cc06 Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Tue, 27 May 2025 11:21:03 +0800 Subject: [PATCH 69/98] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=A1=AB=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/dms/AchievementsMapper.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index d55a0dab0..c20059330 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -722,11 +722,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" inner join entities e on u.id = e.user_id inner join personalities p on e.id = p.entity_id inner join (select distinct user_id from clickers where click_id = #{id} and click_type ='userDocking') c on u.id = c.user_id + where u.authentication='1' union all select u.id,u.login,u.nickname,u.lastname,u.phone,en.name as "company_name",u.mail,en.credit_code as "idNumber",e.entity_type from users u inner join entities e on u.id = e.user_id inner join enterprises en on e.id = en.entity_id inner join (select distinct user_id from clickers where click_id = #{id} and click_type ='userDocking') c on u.id = c.user_id + where u.enterprise_certification='1' \ No newline at end of file From 65e66013cfa37069e4b96c6a19c24c4b398d1493 Mon Sep 17 00:00:00 2001 From: 13036795865 Date: Tue, 27 May 2025 11:44:06 +0800 Subject: [PATCH 70/98] =?UTF-8?q?=E6=88=90=E6=9E=9C=E5=BE=81=E9=9B=86?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dms/common/controller/OpenController.java | 61 ++++++++++++++++++ ...开源优秀科研成果信息征集.zip | Bin 0 -> 42860 bytes 2 files changed, 61 insertions(+) create mode 100644 microservices-modules/microservices-modules-dms/src/main/resources/红山开源优秀科研成果信息征集.zip diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java index 664e9eafb..96efbe239 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java @@ -11,10 +11,23 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.List; /** @@ -157,4 +170,52 @@ public class OpenController extends BaseController { return getDataTable(list); } + @GetMapping("/downloadByIdentifier") + @ApiOperation("根据文件标识下载文件") + public void downloadByIdentifier(HttpServletResponse response, HttpServletRequest request) { + // 设置响应内容类型为 zip + response.setContentType("application/zip"); + // 设置下载文件名 + String fileName = "红山开源优秀科研成果信息征集.zip"; + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); + + // 获取资源文件的输入流 + try ( + InputStream in = getClass().getClassLoader().getResourceAsStream(fileName); + OutputStream out = response.getOutputStream()) { + + if (in == null) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, "文件不存在"); + return; + } + + // 将文件内容写入响应输出流 + byte[] buffer = new byte[4096]; + int length; + while ((length = in.read(buffer)) > 0) { + out.write(buffer, 0, length); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @GetMapping("/downloadAch") + @ApiOperation("成果征集信息下载") + public ResponseEntity downloadAch() throws IOException { + String fileName = "红山开源优秀科研成果信息征集.zip"; + Resource resource = new ClassPathResource(fileName); + if (!resource.exists()) { + throw new RuntimeException("文件不存在: " + fileName); + } + String encodedFileName = URLEncoder.encode(fileName, String.valueOf(StandardCharsets.UTF_8)) + .replace("+", "%20"); + + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, + "attachment; filename*=UTF-8''" + encodedFileName) + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(resource); + } + } diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/红山开源优秀科研成果信息征集.zip b/microservices-modules/microservices-modules-dms/src/main/resources/红山开源优秀科研成果信息征集.zip new file mode 100644 index 0000000000000000000000000000000000000000..fcac1f367805f519c0a6a6a7c5f326b03e1b41bc GIT binary patch literal 42860 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 R0SgVjX(1sX7>oar`VUW8p= Date: Tue, 27 May 2025 11:50:49 +0800 Subject: [PATCH 71/98] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dms/common/controller/OpenController.java | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java index 96efbe239..23a40f45d 100644 --- a/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java +++ b/microservices-modules/microservices-modules-dms/src/main/java/com/microservices/dms/common/controller/OpenController.java @@ -170,36 +170,6 @@ public class OpenController extends BaseController { return getDataTable(list); } - @GetMapping("/downloadByIdentifier") - @ApiOperation("根据文件标识下载文件") - public void downloadByIdentifier(HttpServletResponse response, HttpServletRequest request) { - // 设置响应内容类型为 zip - response.setContentType("application/zip"); - // 设置下载文件名 - String fileName = "红山开源优秀科研成果信息征集.zip"; - response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); - - // 获取资源文件的输入流 - try ( - InputStream in = getClass().getClassLoader().getResourceAsStream(fileName); - OutputStream out = response.getOutputStream()) { - - if (in == null) { - response.sendError(HttpServletResponse.SC_NOT_FOUND, "文件不存在"); - return; - } - - // 将文件内容写入响应输出流 - byte[] buffer = new byte[4096]; - int length; - while ((length = in.read(buffer)) > 0) { - out.write(buffer, 0, length); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - @GetMapping("/downloadAch") @ApiOperation("成果征集信息下载") public ResponseEntity downloadAch() throws IOException { From 523223616720c075e3555e1641292047eb5dcd59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Tue, 27 May 2025 14:23:58 +0800 Subject: [PATCH 72/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E6=88=90=E6=9E=9C=E5=BA=93=E3=80=91=E6=88=90=E6=9E=9C=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/mapper/dms/AchievementsMapper.xml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index c20059330..c28c8e539 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -717,18 +717,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" \ No newline at end of file From 0e83fa62ce844527ee1dbfaade0228fd76cc98e0 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Mon, 26 May 2025 19:17:29 +0800 Subject: [PATCH 73/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E5=91=A8=E6=8A=A5-=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E9=A1=B9=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PmsProjectWeeklyReportController.java | 10 ++++ .../vo/PmsPersonalWeeklyIssuesSearchVo.java | 46 +++++++++++++++++++ .../vo/PmsPersonalWeeklyReportSearchVo.java | 32 +------------ .../service/PmsProjectIssuesService.java | 13 +++++- .../pms/utils/PmsGitLinkRequestUrl.java | 5 ++ 5 files changed, 75 insertions(+), 31 deletions(-) create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java index e5c0cd0d6..c829271cb 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java @@ -2,6 +2,7 @@ package com.microservices.pms.project.controller; import com.alibaba.fastjson2.JSONObject; import com.microservices.common.core.web.domain.AjaxResult; +import com.microservices.pms.project.domain.vo.PmsPersonalWeeklyIssuesSearchVo; import com.microservices.pms.project.domain.vo.PmsPersonalWeeklyReportSearchVo; import com.microservices.pms.project.domain.vo.PmsProjectIssuesInputVo; import com.microservices.pms.project.domain.vo.PmsProjectIssuesSearchVo; @@ -54,6 +55,15 @@ public class PmsProjectWeeklyReportController { return success(result); } + @GetMapping("/personalIssueList") + @ApiOperation(value = "周报-个人工作项列表") + public AjaxResult getPersonalIssueList(@PathVariable String enterpriseIdentifier, PmsPersonalWeeklyIssuesSearchVo pmsPersonalWeeklyIssuesSearchVo) + { + pmsPersonalWeeklyIssuesSearchVo.setEnterpriseIdentifier(enterpriseIdentifier); + JSONObject result = pmsProjectIssuesService.getPersonalIssueList(pmsPersonalWeeklyIssuesSearchVo); + return success(result); + } + /** * 查询周报-项目组工作项统计 */ diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java new file mode 100644 index 000000000..5b541159d --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java @@ -0,0 +1,46 @@ +package com.microservices.pms.project.domain.vo; + +import com.microservices.common.core.utils.ServletUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@ApiModel("个人周报工作项搜索对象") +public class PmsPersonalWeeklyIssuesSearchVo { + + @ApiModelProperty(value = "用户gitlink用户id") + private Long userId; + + @ApiModelProperty(value = "企业标识", hidden = true) + private String enterpriseIdentifier; + + @ApiModelProperty(value = "工作项名称搜索关键词") + private String keyword; + + @ApiModelProperty(value = "状态值,可多个状态逗号隔开") + private String statusIds; + + @ApiModelProperty(value = "排序方式: issues.updated_on 更新时间 issues.created_on 创建时间 issue_priorities.position 优先级") + private String sortBy; + + @ApiModelProperty(value = "排序方向:asc 正序 desc 倒序") + private String sortDirection; + + @ApiModelProperty(value = "本周工作项页码") + private String thisWeekPage; + + @ApiModelProperty(value = "分页数") + private String thisWeekLimit; + + @ApiModelProperty(value = "本周工作项页码") + private String nextWeekPage; + + @ApiModelProperty(value = "分页数") + private String nextWeekLimit; + + public void setKeyword(String keyword) { + this.keyword = ServletUtils.urlDecode(keyword); + } +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyReportSearchVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyReportSearchVo.java index 71ca73450..340791d8f 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyReportSearchVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyReportSearchVo.java @@ -6,40 +6,12 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data -@ApiModel("个人周报工作项搜索对象") +@ApiModel("个人周报工作项统计对象") public class PmsPersonalWeeklyReportSearchVo { - @ApiModelProperty(value = "工作项名称搜索关键词") - private String keyword; - - @ApiModelProperty(value = "状态值,可多个状态逗号隔开") - private String statusIds; - - @ApiModelProperty(value = "排序方式: issues.updated_on 更新时间 issues.created_on 创建时间 issue_priorities.position 优先级") - private String sortBy; - - @ApiModelProperty(value = "排序方向:asc 正序 desc 倒序") - private String sortDirection; - - @ApiModelProperty(value = "本周工作项页码") - private String thisWeekPage; - - @ApiModelProperty(value = "分页数") - private String thisWeekLimit; - - @ApiModelProperty(value = "本周工作项页码") - private String nextWeekPage; - - @ApiModelProperty(value = "分页数") - private String nextWeekLimit; - - @ApiModelProperty(value = "当前用户gitlink用户id", hidden = true) + @ApiModelProperty(value = "用户gitlink用户id", hidden = true) private Long userId; @ApiModelProperty(value = "企业标识", hidden = true) private String enterpriseIdentifier; - - public void setKeyword(String keyword) { - this.keyword = ServletUtils.urlDecode(keyword); - } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index 049c62b07..d784c646c 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -754,7 +754,7 @@ public class PmsProjectIssuesService { public JSONObject getProjectIssueList(PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) { List pmProjectIds = pmsProjectService.selectProjectIdsByAssigneeUserId( pmsProjectIssuesSearchVo.getEnterpriseIdentifier(), - SecurityUtils.getGitlinkUserId()); + StringUtils.isEmpty(pmsProjectIssuesSearchVo.getAssignerId()) ? SecurityUtils.getGitlinkUserId() : Long.valueOf(pmsProjectIssuesSearchVo.getAssignerId())); String pmProjectIdsStr = StringUtils.join(pmProjectIds, ","); pmsProjectIssuesSearchVo.setPmProjectIds(pmProjectIdsStr); JSONObject issueSearch = new JSONObject(); @@ -765,4 +765,15 @@ public class PmsProjectIssuesService { throw new RuntimeException(e); } } + + public JSONObject getPersonalIssueList(PmsPersonalWeeklyIssuesSearchVo pmsPersonalWeeklyIssuesSearchVo) { + pmsPersonalWeeklyIssuesSearchVo.setUserId(pmsPersonalWeeklyIssuesSearchVo.getUserId() == null ? SecurityUtils.getGitlinkUserId() : pmsPersonalWeeklyIssuesSearchVo.getUserId()); + JSONObject issueSearch = new JSONObject(); + convertObjectToJSONObject(pmsPersonalWeeklyIssuesSearchVo, issueSearch, null); + try { + return setProjectIssueListUserState(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_PERSONAL_ISSUE_LIST(issueSearch))); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java index efc1ac025..34655256e 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/utils/PmsGitLinkRequestUrl.java @@ -463,4 +463,9 @@ public class PmsGitLinkRequestUrl extends GitLinkRequestUrl { return getGitLinkRequestUrl( buildUri("/api/pm/weekly_issues/group_issues.json", params)); } + + public static GitLinkRequestUrl GET_PERSONAL_ISSUE_LIST(JSONObject issueSearch) throws URISyntaxException { + return getGitLinkRequestUrl( + buildUri("/api/pm/weekly_issues/personal_issues.json", issueSearch)); + } } From e6322835db9cf56894ebac9ce06ead8befd7495e Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Mon, 26 May 2025 19:43:57 +0800 Subject: [PATCH 74/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E5=91=A8=E6=8A=A5-=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E9=A1=B9=E5=88=97=E8=A1=A8=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pms/project/service/PmsProjectIssuesService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index d784c646c..72a19d474 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -771,7 +771,7 @@ public class PmsProjectIssuesService { JSONObject issueSearch = new JSONObject(); convertObjectToJSONObject(pmsPersonalWeeklyIssuesSearchVo, issueSearch, null); try { - return setProjectIssueListUserState(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_PERSONAL_ISSUE_LIST(issueSearch))); + return enrichProjectIssueList(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_PERSONAL_ISSUE_LIST(issueSearch))); } catch (URISyntaxException e) { throw new RuntimeException(e); } From 6f63a0de72bc7f040336350e3b49b8ccb21a3d72 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Tue, 27 May 2025 14:56:22 +0800 Subject: [PATCH 75/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E9=87=8D=E6=9E=84):=E6=9F=A5=E7=9C=8B=E4=BB=96=E4=BA=BA?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=BB=84=E5=91=A8=E6=8A=A5=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=8E=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pms/project/service/PmsProjectIssuesService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index 72a19d474..a20d01a3a 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -725,7 +725,7 @@ public class PmsProjectIssuesService { continue; } // 查询项目信息 - PmsProjectDetailVo project = pmsProjectService.selectPmsProjectById(projectId); + PmsProject project = pmsProjectMapper.selectPmsProjectById(projectId); JSONObject innerData = inputJson.getJSONObject(projectIdStr); if (project != null) { From fa414545341951183065928a27a95df49ee67fb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E4=B8=AD?= Date: Tue, 27 May 2025 15:07:26 +0800 Subject: [PATCH 76/98] =?UTF-8?q?=E3=80=90=E8=B5=84=E6=BA=90=E5=BA=93-?= =?UTF-8?q?=E6=88=90=E6=9E=9C=E5=BA=93=E3=80=91=E6=88=90=E6=9E=9C=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/dms/AchievementsMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml index c28c8e539..bde774dfa 100644 --- a/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml +++ b/microservices-modules/microservices-modules-dms/src/main/resources/mapper/dms/AchievementsMapper.xml @@ -718,14 +718,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" SELECT * FROM pms_project_testcase WHERE pms_project_id = #{project_id} From 4ca5dd0c51b4117a9a395f2faf7b917650e080c4 Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Fri, 30 May 2025 10:45:54 +0800 Subject: [PATCH 87/98] =?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 --- .../main/resources/mapper/pms/PmsProjectTestcaseMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 d70ac0497..552547c75 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 @@ -132,7 +132,7 @@ description, test_method, termination_conditions, - identifier, + test_tracking, product_req_specs_id, is_import, @@ -157,7 +157,7 @@ #{testMethod}, #{terminationConditions}, #{identifier}, - #{testTracking}, + #{productReqSpecsId}, #{isImport}, From b079d42fcd6b73ba5eeaef499625503d160595dd Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Fri, 30 May 2025 11:00:17 +0800 Subject: [PATCH 88/98] =?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 --- .../main/resources/mapper/pms/PmsProjectTestcaseMapper.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 552547c75..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 @@ -132,7 +132,7 @@ description, test_method, termination_conditions, - + identifier, test_tracking, product_req_specs_id, is_import, @@ -157,7 +157,7 @@ #{testMethod}, #{terminationConditions}, #{identifier}, - + #{testTracking}, #{productReqSpecsId}, #{isImport}, From 77381ea1730bc2cd014756c8146815236f85f154 Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Mon, 2 Jun 2025 22:39:02 +0800 Subject: [PATCH 89/98] =?UTF-8?q?=E4=BF=AE=E5=A4=8D1=E3=80=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=E5=AF=BC=E5=87=BA=E6=97=B6=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E7=AB=A0=E8=8A=82=E5=8F=B7=E4=B8=8D=E5=AF=B9=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=9B2=E3=80=81=E9=83=A8=E5=88=86=E7=AB=A0?= =?UTF-8?q?=E8=8A=82=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/domain/vo/PmsProjectTestcaseVo.java | 1 + .../impl/PmsProjectTestcaseServiceImpl.java | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) 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 c1f06033d..a220d37d9 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 @@ -37,4 +37,5 @@ public class PmsProjectTestcaseVo { private String identifier; 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 40b2e37cd..465e79dc9 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 @@ -564,7 +564,9 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService List testcases = getTestcase(item); for (PmsProjectTestcaseVo testcase : testcases) { - if (testcase.getPmsModuleId() == moduleId) { + Long pmsModuleId = testcase.getPmsModuleId(); + boolean isEqual = Objects.equals(pmsModuleId, moduleId); + if (isEqual) { List steps = getTestcaseStep(testcase.getId()); PendingOutputDataVo pendingOutputData = new PendingOutputDataVo(); pendingOutputData.setId(testcase.getId()); @@ -1110,25 +1112,29 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService } } - int chapter = 1; + int chapter = 0; while (!stack.isEmpty()) { TreeSelect current = stack.pop(); // 处理当前节点,这里简单打印节点信息,你可以根据需求修改 - //System.out.println("ID: " + current.getId() + ", 名称: " + current.getLabel() + ", 层级:" + current.getLevel() + ", 父ID: " + current.getParentId() + ", 是否叶子节点: " + current.getIsLeaf() ); +// System.out.println("ID: " + current.getId() + ", 名称: " + current.getLabel() + ", 层级:" + current.getLevel() + ", 父ID: " + current.getParentId() + ", 是否叶子节点: " + current.getIsLeaf() ); if (current.getIsLeaf()) { + if (current.getLevel() == 1){ + chapter = chapter + 1; + } 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.getLevel() == 1){ + chapter = chapter + 1; + } if(current.getId() > 0){ addNumberedHeading(document, current.getLabel(), current.getLevel()); } From d216d3d0b84233b6a7cc9673d77a3a885582f3a0 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Wed, 4 Jun 2025 08:58:29 +0800 Subject: [PATCH 90/98] =?UTF-8?q?fix(=E6=95=B0=E6=8D=AE=E5=90=8C=E6=AD=A5)?= =?UTF-8?q?:=E5=90=8C=E6=AD=A5=E6=9B=B4=E6=96=B0issue=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PmsProjectIssuesController.java | 11 +++ .../pms/project/domain/ForgeIssues.java | 88 +++++++++++++++++++ .../pms/project/mapper/ForgeIssuesMapper.java | 21 +++++ .../pms/project/mapper/PmsProjectMapper.java | 2 + .../service/PmsProjectIssuesService.java | 20 +++++ .../mapper/pms/ForgeIssuesMapper.xml | 61 +++++++++++++ .../resources/mapper/pms/PmsProjectMapper.xml | 6 ++ 7 files changed, 209 insertions(+) create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/ForgeIssues.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/ForgeIssuesMapper.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/ForgeIssuesMapper.xml diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectIssuesController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectIssuesController.java index ea9f07c09..b1e0f4129 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectIssuesController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectIssuesController.java @@ -385,4 +385,15 @@ public class PmsProjectIssuesController extends BaseController { public void exportIssues(HttpServletResponse response, @ApiParam("项目Id") @RequestParam(name = "pmProjectId") Long pmProjectId) { pmsProjectIssuesService.exportIssues(response, pmProjectId); } + + /** + * 同步更新issue企业标识 + * 说明:旧issues数据直接通过pmProjectId与pms建立关联,新需求要与企业建立关联,故需要同步更新issue企业标识 + */ + @PutMapping("/updateIssueEnterpriseIdentifier") + @ApiOperation(value = "同步更新issue企业标识") + public AjaxResult updateIssueEnterpriseIdentifier() { + boolean result = pmsProjectIssuesService.updateIssueEnterpriseIdentifier(); + return success(result); + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/ForgeIssues.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/ForgeIssues.java new file mode 100644 index 000000000..64577fef2 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/ForgeIssues.java @@ -0,0 +1,88 @@ +package com.microservices.pms.project.domain; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class ForgeIssues { + private Integer id; + + private Integer trackerId; + + private Integer projectId; + + private String subject; + + private Date dueDate; + + private Integer categoryId; + + private Integer statusId; + + private Integer assignedToId; + + private Integer priorityId; + + private Integer fixedVersionId; + + private Integer authorId; + + private Date createdOn; + + private Date updatedOn; + + private Date startDate; + + private Integer doneRatio; + + private Float estimatedHours; + + private Integer parentId; + + private Integer rootId; + + private Integer lft; + + private Integer rgt; + + private Boolean isPrivate; + + private Date closedOn; + + private Integer projectIssuesIndex; + + private String issueType; + + private Integer token; + + private String issueTagsValue; + + private Boolean isLock; + + private String issueClassify; + + private String refName; + + private String branchName; + + private String description; + + private Integer blockchainTokenNum; + + private Long pmProjectId; + + private Long pmSprintId; + + private Integer pmIssueType; + + private BigDecimal timeScale; + + private Integer childCount; + private Long changerId; + + private Integer fakeId; + + private String enterpriseIdentifier; +} \ No newline at end of file diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/ForgeIssuesMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/ForgeIssuesMapper.java new file mode 100644 index 000000000..863aa9e99 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/ForgeIssuesMapper.java @@ -0,0 +1,21 @@ +package com.microservices.pms.project.mapper; + +import com.microservices.common.datasource.annotation.Slave; +import com.microservices.pms.project.domain.ForgeIssues; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 用户表 数据层 + * + * @author microservices + */ +@Slave +@Mapper +public interface ForgeIssuesMapper { + + List getBriefIssues(); + + int updateForIssues(ForgeIssues forgeIssues); +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectMapper.java index 2437ae097..04c9144af 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectMapper.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsProjectMapper.java @@ -91,4 +91,6 @@ public interface PmsProjectMapper PmsProject selectPmsProjectById(Long id); List selectProjectIdsByAssigneeUserId(@Param("enterpriseIdentifier") String enterpriseIdentifier, @Param("gitlinkUserId") Long gitlinkUserId); + + String selectEnterpriseIdentifierByProjectId(@Param("pmProjectId") Long pmProjectId); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index a20d01a3a..14fea5b0b 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -15,9 +15,11 @@ import com.microservices.pms.enterprise.service.IPmsEnterpriseService; import com.microservices.pms.enums.ProjectIssueStatus; import com.microservices.pms.product.domain.enums.ProductReqStatus; import com.microservices.pms.product.service.IPmsProductRequirementService; +import com.microservices.pms.project.domain.ForgeIssues; import com.microservices.pms.project.domain.PmsProject; import com.microservices.pms.project.domain.SimpleRepository; import com.microservices.pms.project.domain.vo.*; +import com.microservices.pms.project.mapper.ForgeIssuesMapper; import com.microservices.pms.project.mapper.PmsProjectMapper; import com.microservices.pms.project.mapper.PmsProjectSprintMapper; import com.microservices.pms.project.mapper.PmsProjectTestsheetMapper; @@ -83,6 +85,8 @@ public class PmsProjectIssuesService { private PmsProjectTestsheetMapper pmsProjectTestsheetMapper; @Resource private PmsProjectMapper pmsProjectMapper; + @Resource + private ForgeIssuesMapper forgeIssuesMapper; public JSONObject selectPmsProjectIssuesList(PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) { @@ -776,4 +780,20 @@ public class PmsProjectIssuesService { throw new RuntimeException(e); } } + + public boolean updateIssueEnterpriseIdentifier() { + Long currentUserId = SecurityUtils.getGitlinkUserId(); + if (currentUserId == null || currentUserId != 831) { + return false; + } + List forgeIssuesList = forgeIssuesMapper.getBriefIssues(); + for (ForgeIssues forgeIssues : forgeIssuesList) { + String enterpriseIdentifier = pmsProjectMapper.selectEnterpriseIdentifierByProjectId(forgeIssues.getPmProjectId()); + if (enterpriseIdentifier != null) { + forgeIssues.setEnterpriseIdentifier(enterpriseIdentifier); + forgeIssuesMapper.updateForIssues(forgeIssues); + } + } + return true; + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/ForgeIssuesMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/ForgeIssuesMapper.xml new file mode 100644 index 000000000..862db6c27 --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/ForgeIssuesMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE issues + set enterprise_identifier = #{enterpriseIdentifier} + where id = #{id} + + + + \ No newline at end of file diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectMapper.xml index 6f92f0ed1..a747dabdd 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsProjectMapper.xml @@ -180,6 +180,12 @@ where pp.project_assignee_id = #{gitlinkUserId} and pe.enterprise_identifier = #{enterpriseIdentifier} + insert into pms_project From 60eeb05560d15f6203d1a17e1136b0f17aaee588 Mon Sep 17 00:00:00 2001 From: zwz <83956804@qq.com> Date: Fri, 6 Jun 2025 15:44:52 +0800 Subject: [PATCH 91/98] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E7=AB=A0=E8=8A=82=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PmsProjectTestcaseServiceImpl.java | 211 ++++++++++++++---- 1 file changed, 171 insertions(+), 40 deletions(-) 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 465e79dc9..770cf5b05 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 @@ -5,6 +5,7 @@ import com.microservices.common.core.exception.ServiceException; import com.microservices.common.core.utils.DateUtils; import com.microservices.common.core.utils.JSONUtils; import com.microservices.common.core.utils.PageUtils; +import com.microservices.common.core.utils.PinYinStringUtils; import com.microservices.common.core.utils.bean.BeanUtils; import com.microservices.common.core.web.page.GenericsTableDataInfo; import com.microservices.common.security.utils.SecurityUtils; @@ -49,6 +50,7 @@ import java.time.LocalDate; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static com.microservices.common.core.utils.PageUtils.startPage; @@ -894,17 +896,19 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService // 添加表格标题(应该是<章节号>-<表格序号>) - private static void addNumberedTableTitle(XWPFDocument doc, String titleText, int chapter, int tableCount) { + private static void addNumberedTableTitle(XWPFDocument doc, String titleText, int tableCount) { + int chapter = 4; 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); + CTRPr rPr0 = run.getCTR().isSetRPr() ? run.getCTR().getRPr() : run.getCTR().addNewRPr(); + rPr0.addNewSz().setVal(BigInteger.valueOf(21)); + rPr0.addNewSzCs().setVal(BigInteger.valueOf(21)); // 创建域开始字符 XWPFRun startRun = titleParagraph.createRun(); @@ -915,19 +919,29 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService XWPFRun codeRun = titleParagraph.createRun(); String domainCode = " SEQ Table \\* ARABIC \\s " + chapter; codeRun.setText(domainCode); - codeRun.setFontSize(12); // 设置字体大小,可根据需要调整 + // 设置字体大小,可根据需要调整 + CTRPr rPr1 = codeRun.getCTR().isSetRPr() ? codeRun.getCTR().getRPr() : codeRun.getCTR().addNewRPr(); + rPr1.addNewSz().setVal(BigInteger.valueOf(21)); + rPr1.addNewSzCs().setVal(BigInteger.valueOf(21)); codeRun.setFontFamily("Times New Roman"); codeRun.setFontFamily("宋体", XWPFRun.FontCharRange.eastAsia); // 创建域分隔字符 XWPFRun sepRun = titleParagraph.createRun(); CTFldChar sepFldChar = sepRun.getCTR().addNewFldChar(); + // 设置字体大小,可根据需要调整 + CTRPr rPr2 = sepRun.getCTR().isSetRPr() ? sepRun.getCTR().getRPr() : sepRun.getCTR().addNewRPr(); + rPr2.addNewSz().setVal(BigInteger.valueOf(21)); + rPr2.addNewSzCs().setVal(BigInteger.valueOf(21)); sepFldChar.setFldCharType(STFldCharType.SEPARATE); // 创建域结果 XWPFRun resultRun = titleParagraph.createRun(); resultRun.setText(chapter + " - " + tableCount); - resultRun.setFontSize(12); // 设置字体大小,可根据需要调整 + // 设置字体大小,可根据需要调整 + CTRPr rPr3 = resultRun.getCTR().isSetRPr() ? resultRun.getCTR().getRPr() : resultRun.getCTR().addNewRPr(); + rPr3.addNewSz().setVal(BigInteger.valueOf(21)); + rPr3.addNewSzCs().setVal(BigInteger.valueOf(21)); resultRun.setFontFamily("Times New Roman"); resultRun.setFontFamily("宋体", XWPFRun.FontCharRange.eastAsia); @@ -938,7 +952,10 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService XWPFRun titlerun = titleParagraph.createRun(); titlerun.setText(titleText); - titlerun.setFontSize(12); // 设置字体大小,可根据需要调整 + // 设置字体大小,可根据需要调整 + CTRPr rPr4 = titlerun.getCTR().isSetRPr() ? titlerun.getCTR().getRPr() : titlerun.getCTR().addNewRPr(); + rPr4.addNewSz().setVal(BigInteger.valueOf(21)); + rPr4.addNewSzCs().setVal(BigInteger.valueOf(21)); titlerun.setFontFamily("Times New Roman"); titlerun.setFontFamily("宋体", XWPFRun.FontCharRange.eastAsia); } @@ -994,14 +1011,11 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService // 设置字体样式 CTRPr rpr = ctStyle.addNewRPr(); CTFonts fonts = rpr.addNewRFonts(); - fonts.setEastAsia("宋体"); + 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)); - } + rpr.addNewSz().setVal(BigInteger.valueOf(21)); + rpr.addNewSzCs().setVal(BigInteger.valueOf(21)); // 将样式添加到样式管理器中 styles.addStyle(new XWPFStyle(ctStyle)); @@ -1077,32 +1091,155 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService return BigInteger.ONE; } - private static void addNumberedHeading(XWPFDocument doc, String text, int level) { + private static String getFirstPinyin(String text){ + String regEx = "\\pP|\\pS|\\s+"; + String reqTitleIdentifier = Pattern.compile(regEx).matcher(text).replaceAll("").trim(); + reqTitleIdentifier = PinYinStringUtils.toFirstChar(reqTitleIdentifier).toUpperCase(); + text = text + reqTitleIdentifier; + return text; + } + + private static void addNumberedHeading(XWPFDocument doc, String text, int level , boolean isGetPinYin) { XWPFParagraph para = doc.createParagraph(); para.setStyle("Heading" + level); XWPFRun run = para.createRun(); + if (isGetPinYin) { + text = getFirstPinyin(text); + } run.setText(text); } - // 插入分页符(另起一页),生成最后一个表格后不用插入 - private void insertTable(XWPFDocument doc,List pendingOutputDatas, int chapter) { + // 插入分页符(另起一页) + private int insertTable(XWPFDocument doc,List pendingOutputDatas, int counts) { for (int i = 0; i < pendingOutputDatas.size(); i++) { + counts = counts + 1; PendingOutputDataVo pendingOutputData = pendingOutputDatas.get(i); //addNumberedTableTitle(doc, pendingOutputData.getTitle()); - addNumberedTableTitle(doc, pendingOutputData.getTitle(), chapter,i + 1); + addNumberedTableTitle(doc, pendingOutputData.getTitle(), counts); creatTableTemplate(doc,pendingOutputData); - if (i < pendingOutputDatas.size() - 1){ - XWPFParagraph pageBreak = doc.createParagraph(); - XWPFRun pageBreakRun = pageBreak.createRun(); - pageBreakRun.addBreak(BreakType.PAGE); - } + XWPFParagraph pageBreak = doc.createParagraph(); + XWPFRun pageBreakRun = pageBreak.createRun(); + pageBreakRun.addBreak(BreakType.PAGE); + } + return counts; } + private void fillMainContent(XWPFDocument document, String text) { + XWPFParagraph paragraph = document.createParagraph(); + paragraph.setAlignment(ParagraphAlignment.LEFT); // 居中 + // 400 = 2 * 200(一个中文字符大约200单位) + paragraph.setIndentationFirstLine(400); + // 设置自动换行 + paragraph.setWordWrapped(true); + XWPFRun titleRun = paragraph.createRun(); + titleRun.setText(text); + // 字体大小 + //设置字体为五号 10.5*2 + CTRPr rPr = titleRun.getCTR().isSetRPr() ? titleRun.getCTR().getRPr() : titleRun.getCTR().addNewRPr(); + rPr.addNewSz().setVal(BigInteger.valueOf(21)); + rPr.addNewSzCs().setVal(BigInteger.valueOf(21)); + // 字体样式 + titleRun.setFontFamily("Times New Roman"); + titleRun.setFontFamily("宋体", XWPFRun.FontCharRange.eastAsia); + } + + private void fillFixedContent(XWPFDocument document, Long projectId, List treeSelects){ + String mainText = "格式说明: 正文(宋体、五号、段落间距固定值20磅),各级标题(黑体、五号、段落间距固定值20磅)"; + fillMainContent(document,mainText); + // 写入第一章内容 + addNumberedHeading(document,"范围",1, false); + // 1.1 + addNumberedHeading(document,"标识",2, false); + mainText = "本条应描述本文档所适用系统和软件的完整标识,(若适用)包括其标识号、名称、缩略名、版本号和发布号。"; + fillMainContent(document,mainText); + //1.2 + addNumberedHeading(document,"系统概述",2, false); + mainText = "本条应概述本文档适用的系统和软件的用途;描述系统和软件的一般特性(如规模、安全性、可靠性、实时性、技术风险等特性);"+ + "概述系统开发、运行和维护的历史;标识项目的需方、用户、开发方和保障机构等;标识当前和计划的运行现场;列出其他有关文档。"; + fillMainContent(document,mainText); + //1.3 + addNumberedHeading(document,"文档概述",2, false); + mainText = "本条应概述本文档的用途和内容,并描述与它的使用有关的安全保密方面的要求。"; + fillMainContent(document,mainText); + + // 写入第二章内容 + addNumberedHeading(document,"引用文档",1, false); + mainText = "本章应列出引用文档的编号、标题、编写单位、修订版及日期,还应给出不能通过正常渠道得到的文档的来源。"; + fillMainContent(document,mainText); + + // 写入第三章内容 + addNumberedHeading(document,"测试准备",1, false); + mainText = "本章应分为以下子条。(若适用)应包括用“警告”或“注意”所标志的安全提示,以及保密性考虑。"; + fillMainContent(document,mainText); + // 3.1 + addNumberedHeading(document,"(测试唯一标识符)",2, false); + mainText = "本条应使用项目的唯一标识符来标识一个测试,并对测试进行简要说明,同时应分为以下子条描述。" + + "若与另一个测试所要求的信息存在重复时,可直接引用。"; + fillMainContent(document,mainText); + // 3.1.1 + addNumberedHeading(document,"硬件准备",3, false); + mainText = "本条应描述测试工作所需的硬件准备规程。有关这些规程,可以引用已发布的操作手册。(若适用)应提供以下内容:"; + fillMainContent(document,mainText); + mainText = "a) 用名称和(若适用)编号标识要使用的特定硬件;"; + fillMainContent(document,mainText); + mainText = "b) 所有连接硬件所需的开关装置和电缆;"; + fillMainContent(document,mainText); + mainText = "c) 说明硬件、互联控制和数据路径的一个或多个图示;"; + fillMainContent(document,mainText); + mainText = "d) 使硬件处于就绪状态的逐步的操作说明;"; + fillMainContent(document,mainText); + //3.1.2 + addNumberedHeading(document,"软件准备",3, false); + mainText = "本条应描述准备被测项、相关软件以及数据的必要规程。有关这些规程,可以引用已发布的软件手册。(若适用)应提供下述信息:"; + fillMainContent(document,mainText); + mainText = "a) 测试中要使用的特定软件;"; + fillMainContent(document,mainText); + mainText = "b) 被测项的存储介质(如光盘、磁盘);"; + fillMainContent(document,mainText); + mainText = "c) 所有相关软件(如模拟器、测试驱动程序、数据库)的存储介质;"; + fillMainContent(document,mainText); + mainText = "d) 加载软件的说明,包括所需的顺序;"; + fillMainContent(document,mainText); + mainText = "e) 多个测试用例共用的软件初始化说明;"; + fillMainContent(document,mainText); + //3.1.3 + addNumberedHeading(document,"其它测试前准备",3, false); + mainText = "本条应描述其他测试前所需的人员活动、准备工作或规程。"; + fillMainContent(document,mainText); + + // 写入第四章内容 + addNumberedHeading(document,"测试说明",1, false); + mainText = "本章应分为以下子条。(若适用)应包括用“警告”或“注意”所标志的安全提示,以及保密性考虑。"; + fillMainContent(document,mainText); + // 添加带自动编号的内容 + iterateTraversl(projectId, treeSelects, document); + + //写入第五章内容 + addNumberedHeading(document,"需求的可追踪性",1, false); + mainText = "本条应描述:"; + fillMainContent(document,mainText); + mainText = "a) 从软件测试说明中的测试用例到它所涉及的系统或CSCI需求的可追踪性。" + + "若一个测试用例涉及多个需求,应包含从每一组测试规程步骤到所涉及的需求的可追踪性(亦可在4.X.Y.1中提供)。"; + fillMainContent(document,mainText); + mainText = "b) 从本软件测试说明所提及的每项系统或CSCI需求到涉及它们的测试用例的可追踪性。" + + "对于CSCI测试,是从CSCI的软件需求规格说明(SRS)和有关接口需求规格说明(IRS)中的每项CSCI需求到涉及它们的测试用例的可追踪性。" + + "对于系统测试,是从系统的系统/子系统规格说明(SSS)及有关IRS中的每项系统需求到涉及它们的测试用例的可追踪性。" + + "如果一个测试用例涉及多项需求,则可追踪性应指明涉及每项需求的特定测试规程步骤。"; + fillMainContent(document,mainText); + mainText = "注:软件测试说明可通过软件测试计划建立与系统或CSCI需求双向可追踪性"; + fillMainContent(document,mainText); + + //写入第六章内容 + addNumberedHeading(document,"注释",1, false); + mainText = "本章应包括有助于了解文档的所有信息(例如:背景、术语、缩略语或公式)。"; + fillMainContent(document,mainText); + + } + + private void iterateTraversl(Long projectId, List treeSelects, XWPFDocument document){ - // 获取文档的样式管理器 - //XWPFStyles styles = document.createStyles(); // 使用栈进行迭代遍历 Stack stack = new Stack<>(); // 先将所有根节点压入栈 @@ -1112,31 +1249,25 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService } } - int chapter = 0; + int tableCounts = 0; while (!stack.isEmpty()) { TreeSelect current = stack.pop(); // 处理当前节点,这里简单打印节点信息,你可以根据需求修改 -// System.out.println("ID: " + current.getId() + ", 名称: " + current.getLabel() + ", 层级:" + current.getLevel() + ", 父ID: " + current.getParentId() + ", 是否叶子节点: " + current.getIsLeaf() ); + //System.out.println("ID: " + current.getId() + ", 名称: " + current.getLabel() + ", 层级:" + current.getLevel() + ", 父ID: " + current.getParentId() + ", 是否叶子节点: " + current.getIsLeaf() ); if (current.getIsLeaf()) { - if (current.getLevel() == 1){ - chapter = chapter + 1; - } if(current.getId() > 0){ - addNumberedHeading(document, current.getLabel(), current.getLevel()); + addNumberedHeading(document, current.getLabel(), current.getLevel() + 1, true); List pendingOutputDatas = GetPendingOutputData(projectId, current.getId()); - insertTable(document, pendingOutputDatas, chapter); + tableCounts = insertTable(document, pendingOutputDatas, tableCounts); } else { - addNumberedHeading(document, current.getLabel(), current.getLevel()); + addNumberedHeading(document, current.getLabel(), current.getLevel() + 1, true); List pendingOutputDatas = GetPendingOutputData(projectId, null); - insertTable(document, pendingOutputDatas, chapter); + tableCounts = insertTable(document, pendingOutputDatas, tableCounts); } } else{ - if (current.getLevel() == 1){ - chapter = chapter + 1; - } - if(current.getId() > 0){ - addNumberedHeading(document, current.getLabel(), current.getLevel()); + if (current.getId() > 0){ + addNumberedHeading(document, current.getLabel(), current.getLevel() + 1, true); } } //处理当前节点结束 @@ -1170,8 +1301,8 @@ public class PmsProjectTestcaseServiceImpl implements IPmsProjectTestcaseService titleRun.setText("测试用例"); titleRun.setFontSize(22); // 字体大小 titleRun.setFontFamily("宋体"); // 字体样式 - // 添加带自动编号的内容 - iterateTraversl(projectId, treeSelects, document); + // 增加固定格式内容 + fillFixedContent(document,projectId, treeSelects); // 设置响应头 response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); From cf4c55877c044a471dfa9a86c7dddd698b246937 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Sat, 7 Jun 2025 09:11:08 +0800 Subject: [PATCH 92/98] updare README --- README.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/README.md b/README.md index e69de29bb..9697411cd 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,36 @@ +## 系统模块 + +~~~ +com.microservices +├── microservices-ui // 前端框架 +├── microservices-gateway // 网关模块 +├── microservices-auth // 认证中心 +├── microservices-api // 接口模块 +│ └── microservices-api-system // 系统接口 +├── microservices-common // 通用模块 +│ └── microservices-common-async // 异步线程池配置 +│ └── microservices-common-core // 核心模块 +│ └── microservices-common-datascope // 权限范围 +│ └── microservices-common-datasource // 多数据源 +│ └── microservices-common-httpClient // http调用 +│ └── microservices-common-log // 日志记录 +│ └── microservices-common-redis // 缓存服务 +│ └── microservices-common-seata // seata分布式事务 +│ └── microservices-common-security // 安全模块 +│ └── microservices-common-swagger // 系统接口 +├── microservices-modules // 业务模块 +│ └── microservices-cms // 内容管理模块 +│ └── microservices-dms // 数据管理体系模块 +│ └── microservices-dss // 数据统计系统模块 +│ └── microservices-file // 文件服务 +│ └── microservices-gen // 代码生成 +│ └── microservices-job // 定时任务 +│ └── microservices-pms // 项目管理系统模块 +│ └── microservices-system // 系统模块 +│ └── microservices-wiki // Wiki模块 +│ └── microservices-zone // 特色专区系统模块 +├── microservices-visual // 图形化管理模块 +│ └── microservices-visual-monitor // 监控中心 +├──pom.xml // 公共依赖 +~~~ + From 357b4be19d135c85ee51afb51f446db946900431 Mon Sep 17 00:00:00 2001 From: OTTO <731554297@example.com> Date: Sat, 7 Jun 2025 14:40:44 +0800 Subject: [PATCH 93/98] =?UTF-8?q?feat(=E8=88=AA=E5=A4=A9=E9=99=A2=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E4=BC=B8=E7=BC=A9=E5=8A=9F=E8=83=BD):=20=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E6=8E=A5=E5=8F=A3=E8=AF=B7=E6=B1=82=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/microservices/pms/common/controller/OpenController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/common/controller/OpenController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/common/controller/OpenController.java index 4a8e72eff..46e96187b 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/common/controller/OpenController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/common/controller/OpenController.java @@ -39,6 +39,7 @@ public class OpenController extends BaseController { @GetMapping("/loginUrl") @ApiOperation(value = "获取登录地址") public AjaxResult loginUrl() { + logger.info("调用接口:获取登录地址"); return success( (Object) EscapeUtil.removeExtraSlashOfUrl(gitLinkUrl + "/login") ); From c41974784be49f53ee5dfbe22982f8344964ae17 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Mon, 9 Jun 2025 14:26:59 +0800 Subject: [PATCH 94/98] =?UTF-8?q?fix(=E5=91=A8=E6=8A=A5):=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E5=91=A8=E6=8A=A5=E4=B8=AD=E4=B8=AA=E4=BA=BA/?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=BB=84=E5=B7=A5=E4=BD=9C=E9=A1=B9=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=8A=A0=E6=97=B6=E9=97=B4=E5=8C=BA=E9=97=B4=E5=85=A5?= =?UTF-8?q?=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java | 6 ++++++ .../pms/project/domain/vo/PmsProjectIssuesSearchVo.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java index 5b541159d..b8745e19d 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsPersonalWeeklyIssuesSearchVo.java @@ -40,6 +40,12 @@ public class PmsPersonalWeeklyIssuesSearchVo { @ApiModelProperty(value = "分页数") private String nextWeekLimit; + @ApiModelProperty(value = "周工作项统计开始时间") + private String weeklyBeginDate; + + @ApiModelProperty(value = "周工作项统计结束时间") + private String weeklyEndDate; + public void setKeyword(String keyword) { this.keyword = ServletUtils.urlDecode(keyword); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesSearchVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesSearchVo.java index b91ef8c91..f8e058ae6 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesSearchVo.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesSearchVo.java @@ -93,6 +93,12 @@ public class PmsProjectIssuesSearchVo { @ApiModelProperty(value = "与用户ID相关(gitlinkUserId)") private String participatorId; + @ApiModelProperty(value = "周工作项统计开始时间") + private String weeklyBeginDate; + + @ApiModelProperty(value = "周工作项统计结束时间") + private String weeklyEndDate; + public void setKeyword(String keyword) { this.keyword = ServletUtils.urlDecode(keyword); } From 506c54ef5f6a22e1ee2e183a8c08c18e04c5c429 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Thu, 12 Jun 2025 19:36:15 +0800 Subject: [PATCH 95/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5):#128092=20?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E5=91=A8=E6=8A=A5=E4=B8=AD=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E9=A1=B9=E5=AE=8C=E6=88=90=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PmsProjectWeeklyReportController.java | 21 +++-- .../project/domain/PmsIssueCompletion.java | 27 +++++++ .../vo/PmsProjectIssuesCompletionInputVo.java | 23 ++++++ .../mapper/PmsIssueCompletionMapper.java | 15 ++++ .../service/IPmsIssueCompletionService.java | 8 ++ .../service/PmsProjectIssuesService.java | 77 +++++++++---------- .../impl/PmsIssueCompletionServiceImpl.java | 39 ++++++++++ .../mapper/pms/PmsIssueCompletionMapper.xml | 76 ++++++++++++++++++ 8 files changed, 241 insertions(+), 45 deletions(-) create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsIssueCompletion.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesCompletionInputVo.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsIssueCompletionMapper.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsIssueCompletionService.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsIssueCompletionServiceImpl.java create mode 100644 microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsIssueCompletionMapper.xml diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java index c829271cb..4ca33b6e3 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/controller/PmsProjectWeeklyReportController.java @@ -2,10 +2,8 @@ package com.microservices.pms.project.controller; import com.alibaba.fastjson2.JSONObject; import com.microservices.common.core.web.domain.AjaxResult; -import com.microservices.pms.project.domain.vo.PmsPersonalWeeklyIssuesSearchVo; -import com.microservices.pms.project.domain.vo.PmsPersonalWeeklyReportSearchVo; -import com.microservices.pms.project.domain.vo.PmsProjectIssuesInputVo; -import com.microservices.pms.project.domain.vo.PmsProjectIssuesSearchVo; +import com.microservices.pms.project.domain.vo.*; +import com.microservices.pms.project.service.IPmsIssueCompletionService; import com.microservices.pms.project.service.PmsProjectIssuesService; import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; @@ -30,7 +28,8 @@ public class PmsProjectWeeklyReportController { @Autowired private PmsProjectIssuesService pmsProjectIssuesService; - + @Autowired + private IPmsIssueCompletionService pmsIssueCompletionService; /** * 查询项目周报列表 @@ -111,6 +110,7 @@ public class PmsProjectWeeklyReportController { * 删除项目周报 */ @DeleteMapping("/{id}") + @ApiOperation(value = "删除项目周报") public AjaxResult remove(@ApiParam( "周报id")@PathVariable Long id) { @@ -122,10 +122,21 @@ public class PmsProjectWeeklyReportController { * 查看项目周报 */ @GetMapping("/{id}") + @ApiOperation(value = "查看项目周报") public AjaxResult query(@PathVariable String enterpriseIdentifier, @PathVariable("id") Long id) { JSONObject result = pmsProjectIssuesService.selectPmsProjectIssueByIdAndEnterPrise(id, enterpriseIdentifier); return success(result); } + + /** + * 更新工作项完成情况 + */ + @PutMapping("/issueCompletion") + @ApiOperation(value = "更新工作项完成情况") + public AjaxResult issueCompletion(@RequestBody PmsProjectIssuesCompletionInputVo pmsProjectIssuesCompletionInputVo) + { + return success(pmsIssueCompletionService.saveOrUpdateCompletion(pmsProjectIssuesCompletionInputVo)); + } } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsIssueCompletion.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsIssueCompletion.java new file mode 100644 index 000000000..100ae257c --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/PmsIssueCompletion.java @@ -0,0 +1,27 @@ +package com.microservices.pms.project.domain; + +import lombok.Data; + +import java.util.Date; + +@Data +public class PmsIssueCompletion { + + private Integer id; + + private String gitlinkIssueId; + + private String gitlinkUserId; + + private String description; + + /** + * 类型 1个人 2项目组 + */ + private String type; + + private Date createTime; + + private Date updateTime; +} + diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesCompletionInputVo.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesCompletionInputVo.java new file mode 100644 index 000000000..55afd4c5c --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/domain/vo/PmsProjectIssuesCompletionInputVo.java @@ -0,0 +1,23 @@ +package com.microservices.pms.project.domain.vo; + +import com.alibaba.fastjson2.JSONObject; +import com.microservices.common.core.utils.StringUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +@Data +@ApiModel("项目工作项完成情况输入对象") +public class PmsProjectIssuesCompletionInputVo { + + @ApiModelProperty(value = "工作项Id") + private String gitlinkIssueId; + + @ApiModelProperty(value = "完成情况") + private String description; +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsIssueCompletionMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsIssueCompletionMapper.java new file mode 100644 index 000000000..cd132ef5e --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsIssueCompletionMapper.java @@ -0,0 +1,15 @@ +package com.microservices.pms.project.mapper; + +import com.microservices.pms.project.domain.PmsIssueCompletion; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface PmsIssueCompletionMapper { + + PmsIssueCompletion selectByGitlinkIssueIdAndUserId(@Param("gitlinkIssueId") String gitlinkIssueId, @Param("gitlinkUserId") String gitlinkUserId); + + int insert(PmsIssueCompletion completion); + + int updateDescription(PmsIssueCompletion completion); +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsIssueCompletionService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsIssueCompletionService.java new file mode 100644 index 000000000..b6227eeec --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/IPmsIssueCompletionService.java @@ -0,0 +1,8 @@ +package com.microservices.pms.project.service; + +import com.microservices.pms.project.domain.vo.PmsProjectIssuesCompletionInputVo; + +public interface IPmsIssueCompletionService { + + boolean saveOrUpdateCompletion(PmsProjectIssuesCompletionInputVo completionInputVo); +} diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index 14fea5b0b..ae6a51c19 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -16,13 +16,11 @@ import com.microservices.pms.enums.ProjectIssueStatus; import com.microservices.pms.product.domain.enums.ProductReqStatus; import com.microservices.pms.product.service.IPmsProductRequirementService; import com.microservices.pms.project.domain.ForgeIssues; +import com.microservices.pms.project.domain.PmsIssueCompletion; import com.microservices.pms.project.domain.PmsProject; import com.microservices.pms.project.domain.SimpleRepository; import com.microservices.pms.project.domain.vo.*; -import com.microservices.pms.project.mapper.ForgeIssuesMapper; -import com.microservices.pms.project.mapper.PmsProjectMapper; -import com.microservices.pms.project.mapper.PmsProjectSprintMapper; -import com.microservices.pms.project.mapper.PmsProjectTestsheetMapper; +import com.microservices.pms.project.mapper.*; import com.microservices.pms.utils.PmsConstants; import com.microservices.pms.utils.PmsGitLinkRequestUrl; import com.microservices.pms.utils.PmsUtils; @@ -87,6 +85,8 @@ public class PmsProjectIssuesService { private PmsProjectMapper pmsProjectMapper; @Resource private ForgeIssuesMapper forgeIssuesMapper; + @Autowired + private PmsIssueCompletionMapper pmsIssueCompletionMapper; public JSONObject selectPmsProjectIssuesList(PmsProjectIssuesSearchVo pmsProjectIssuesSearchVo) { @@ -117,45 +117,29 @@ public class PmsProjectIssuesService { public JSONObject enrichProjectIssueList(JSONObject issueListResult) { HashMap gitlinkUserNickNameMap = new HashMap<>(); - if (issueListResult.containsKey("this_week_all_issues")) { - JSONArray issues = issueListResult.getJSONArray("this_week_all_issues"); - if (issues != null) { - for (int i = 0; i < issues.size(); i++) { - JSONObject issue = issues.getJSONObject(i); - setIssueAssignersState(issue, gitlinkUserNickNameMap); - setIssuePmsProjectName(issue); - issues.set(i, issue); - } - issueListResult.put("this_week_all_issues", issues); - } - } - if (issueListResult.containsKey("next_week_all_issues")) { - JSONArray issues = issueListResult.getJSONArray("next_week_all_issues"); - if (issues != null) { - for (int i = 0; i < issues.size(); i++) { - JSONObject issue = issues.getJSONObject(i); - setIssueAssignersState(issue, gitlinkUserNickNameMap); - setIssuePmsProjectName(issue); - issues.set(i, issue); - } - issueListResult.put("next_week_all_issues", issues); - } - } - if (issueListResult.containsKey("close_task_issues")) { - JSONArray issues = issueListResult.getJSONArray("close_task_issues"); - if (issues != null) { - for (int i = 0; i < issues.size(); i++) { - JSONObject issue = issues.getJSONObject(i); - setIssueAssignersState(issue, gitlinkUserNickNameMap); - setIssuePmsProjectName(issue); - issues.set(i, issue); - } - issueListResult.put("close_task_issues", issues); - } - } + Long gitlinkUserId = SecurityUtils.getGitlinkUserId(); + processIssues(issueListResult, "this_week_all_issues", gitlinkUserNickNameMap, gitlinkUserId); + processIssues(issueListResult, "next_week_all_issues", gitlinkUserNickNameMap, gitlinkUserId); + processIssues(issueListResult, "close_task_issues", gitlinkUserNickNameMap, gitlinkUserId); return issueListResult; } + private void processIssues(JSONObject issueListResult, String key, HashMap gitlinkUserNickNameMap, Long gitlinkUserId) { + if (issueListResult.containsKey(key)) { + JSONArray issues = issueListResult.getJSONArray(key); + if (issues != null) { + for (int i = 0; i < issues.size(); i++) { + JSONObject issue = issues.getJSONObject(i); + setIssueAssignersState(issue, gitlinkUserNickNameMap); + setIssuePmsProjectName(issue); + setIssueCompletionDescription(issue, String.valueOf(gitlinkUserId)); + issues.set(i, issue); + } + issueListResult.put(key, issues); + } + } + } + private void setIssuePmsProjectName(JSONObject issue) { if (issue.containsKey("pm_project_id")) { Long pmProjectId = issue.getLong("pm_project_id"); @@ -169,6 +153,19 @@ public class PmsProjectIssuesService { } } + private void setIssueCompletionDescription(JSONObject issue, String gitlinkUserId) { + if (issue.containsKey("id")) { + String issueId = issue.getString("id"); + if (issueId == null) { + return; + } + PmsIssueCompletion pmsIssueCompletion = pmsIssueCompletionMapper.selectByGitlinkIssueIdAndUserId(issueId, gitlinkUserId); + if (pmsIssueCompletion != null) { + issue.put("completion_description", pmsIssueCompletion.getDescription()); + } + } + } + public JSONObject insertPmsProjectIssuesRestricted(PmsProjectIssuesInputVo pmsProjectIssuesInputVo) { PmsProject pmsProject = pmsProjectService.selectAndCheckPmsProjectById(pmsProjectIssuesInputVo.getPmProjectId()); if (pmsProject.getPmsProductId() != null diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsIssueCompletionServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsIssueCompletionServiceImpl.java new file mode 100644 index 000000000..e046931eb --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsIssueCompletionServiceImpl.java @@ -0,0 +1,39 @@ +package com.microservices.pms.project.service.impl; + +import com.microservices.common.security.utils.SecurityUtils; +import com.microservices.pms.project.domain.PmsIssueCompletion; +import com.microservices.pms.project.domain.vo.PmsProjectIssuesCompletionInputVo; +import com.microservices.pms.project.mapper.PmsIssueCompletionMapper; +import com.microservices.pms.project.service.IPmsIssueCompletionService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; + +@Service +public class PmsIssueCompletionServiceImpl implements IPmsIssueCompletionService { + + @Resource + private PmsIssueCompletionMapper issueCompletionMapper; + + /** + * 添加或更新 issue 完成情况 + */ + @Override + public boolean saveOrUpdateCompletion(PmsProjectIssuesCompletionInputVo completionInputVo) { + PmsIssueCompletion completion = new PmsIssueCompletion(); + completion.setGitlinkIssueId(completionInputVo.getGitlinkIssueId()); + completion.setDescription(completionInputVo.getDescription()); + completion.setGitlinkUserId(String.valueOf(SecurityUtils.getGitlinkUserId())); + // 判断是否已存在该 gitlink_issue_id 记录 + PmsIssueCompletion existing = issueCompletionMapper.selectByGitlinkIssueIdAndUserId(completion.getGitlinkIssueId(), completion.getGitlinkUserId()); + if (existing == null) { + issueCompletionMapper.insert(completion); + } else { + completion.setId(existing.getId()); + completion.setUpdateTime(new Date()); + issueCompletionMapper.updateDescription(completion); + } + return true; + } +} diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsIssueCompletionMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsIssueCompletionMapper.xml new file mode 100644 index 000000000..7886c62bc --- /dev/null +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsIssueCompletionMapper.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + insert into pms_issue_completion + + + gitlink_issue_id, + + + description, + + + type, + + + create_time, + + + update_time, + + + gitlink_user_id, + + + + + #{gitlinkIssueId}, + + + #{description}, + + + #{type}, + + + #{createTime}, + + + #{updateTime}, + + + #{gitlinkUserId}, + + + + + update pms_issue_completion + set + + description = #{description}, + + + update_time = #{updateTime} + + where gitlink_issue_id = #{gitlinkIssueId} and gitlink_user_id = #{gitlinkUserId} + + + + \ No newline at end of file From bb9a5ec58b53eddebc5c06c933cad0ac03b59918 Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Fri, 13 Jun 2025 09:10:51 +0800 Subject: [PATCH 96/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5):#128092=20?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E5=91=A8=E6=8A=A5=E5=AE=8C=E6=88=90=E6=83=85?= =?UTF-8?q?=E5=86=B5=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pms/project/service/PmsProjectIssuesService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java index ae6a51c19..62c985364 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/PmsProjectIssuesService.java @@ -115,9 +115,8 @@ public class PmsProjectIssuesService { return issueListResult; } - public JSONObject enrichProjectIssueList(JSONObject issueListResult) { + public JSONObject enrichProjectIssueList(JSONObject issueListResult, Long gitlinkUserId) { HashMap gitlinkUserNickNameMap = new HashMap<>(); - Long gitlinkUserId = SecurityUtils.getGitlinkUserId(); processIssues(issueListResult, "this_week_all_issues", gitlinkUserNickNameMap, gitlinkUserId); processIssues(issueListResult, "next_week_all_issues", gitlinkUserNickNameMap, gitlinkUserId); processIssues(issueListResult, "close_task_issues", gitlinkUserNickNameMap, gitlinkUserId); @@ -697,7 +696,7 @@ public class PmsProjectIssuesService { JSONObject issueSearch = new JSONObject(); convertObjectToJSONObject(pmsPersonalWeeklyReportSearchVo, issueSearch, null); try { - return enrichProjectIssueList(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_WEEKLY_ISSUES_PERSONAL(issueSearch))); + return enrichProjectIssueList(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_WEEKLY_ISSUES_PERSONAL(issueSearch)), gitlinkUserId); } catch (URISyntaxException e) { throw new RuntimeException(e); } @@ -768,11 +767,12 @@ public class PmsProjectIssuesService { } public JSONObject getPersonalIssueList(PmsPersonalWeeklyIssuesSearchVo pmsPersonalWeeklyIssuesSearchVo) { + Long gitlinkUserId = pmsPersonalWeeklyIssuesSearchVo.getUserId() == null ? SecurityUtils.getGitlinkUserId() : pmsPersonalWeeklyIssuesSearchVo.getUserId(); pmsPersonalWeeklyIssuesSearchVo.setUserId(pmsPersonalWeeklyIssuesSearchVo.getUserId() == null ? SecurityUtils.getGitlinkUserId() : pmsPersonalWeeklyIssuesSearchVo.getUserId()); JSONObject issueSearch = new JSONObject(); convertObjectToJSONObject(pmsPersonalWeeklyIssuesSearchVo, issueSearch, null); try { - return enrichProjectIssueList(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_PERSONAL_ISSUE_LIST(issueSearch))); + return enrichProjectIssueList(gitLinkRequestHelper.doGet(PmsGitLinkRequestUrl.GET_PERSONAL_ISSUE_LIST(issueSearch)), gitlinkUserId); } catch (URISyntaxException e) { throw new RuntimeException(e); } From e3037b03a049c6b6bede74ad0c46527f02a4e92d Mon Sep 17 00:00:00 2001 From: wanjia <553039491@qq.com> Date: Mon, 16 Jun 2025 16:58:39 +0800 Subject: [PATCH 97/98] =?UTF-8?q?feat(=E5=91=A8=E6=8A=A5):=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E5=91=A8=E6=8A=A5=E5=AE=8C=E6=88=90=E6=83=85=E5=86=B5?= =?UTF-8?q?=E7=BD=AE=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pms/project/mapper/PmsIssueCompletionMapper.java | 2 ++ .../project/service/impl/PmsIssueCompletionServiceImpl.java | 5 +++++ .../main/resources/mapper/pms/PmsIssueCompletionMapper.xml | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsIssueCompletionMapper.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsIssueCompletionMapper.java index cd132ef5e..abe07bf5a 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsIssueCompletionMapper.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/mapper/PmsIssueCompletionMapper.java @@ -12,4 +12,6 @@ public interface PmsIssueCompletionMapper { int insert(PmsIssueCompletion completion); int updateDescription(PmsIssueCompletion completion); + + int deleteByGitlinkIssueIdAndUserId(@Param("gitlinkIssueId") String gitlinkIssueId, @Param("gitlinkUserId") String gitlinkUserId); } diff --git a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsIssueCompletionServiceImpl.java b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsIssueCompletionServiceImpl.java index e046931eb..377038703 100644 --- a/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsIssueCompletionServiceImpl.java +++ b/microservices-modules/microservices-modules-pms/src/main/java/com/microservices/pms/project/service/impl/PmsIssueCompletionServiceImpl.java @@ -1,5 +1,6 @@ package com.microservices.pms.project.service.impl; +import com.microservices.common.core.utils.StringUtils; import com.microservices.common.security.utils.SecurityUtils; import com.microservices.pms.project.domain.PmsIssueCompletion; import com.microservices.pms.project.domain.vo.PmsProjectIssuesCompletionInputVo; @@ -25,6 +26,10 @@ public class PmsIssueCompletionServiceImpl implements IPmsIssueCompletionService completion.setGitlinkIssueId(completionInputVo.getGitlinkIssueId()); completion.setDescription(completionInputVo.getDescription()); completion.setGitlinkUserId(String.valueOf(SecurityUtils.getGitlinkUserId())); + if (StringUtils.isBlank(completionInputVo.getDescription())) { + issueCompletionMapper.deleteByGitlinkIssueIdAndUserId(completion.getGitlinkIssueId(), completion.getGitlinkUserId()); + return true; + } // 判断是否已存在该 gitlink_issue_id 记录 PmsIssueCompletion existing = issueCompletionMapper.selectByGitlinkIssueIdAndUserId(completion.getGitlinkIssueId(), completion.getGitlinkUserId()); if (existing == null) { diff --git a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsIssueCompletionMapper.xml b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsIssueCompletionMapper.xml index 7886c62bc..8faab00ba 100644 --- a/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsIssueCompletionMapper.xml +++ b/microservices-modules/microservices-modules-pms/src/main/resources/mapper/pms/PmsIssueCompletionMapper.xml @@ -66,6 +66,10 @@ where gitlink_issue_id = #{gitlinkIssueId} and gitlink_user_id = #{gitlinkUserId} + + delete from pms_issue_completion + where gitlink_issue_id = #{gitlinkIssueId} and gitlink_user_id = #{gitlinkUserId} + select description from pms_issue_completion