瀏覽代碼

pms 线上运营会议 石油技术查询各公司汇总的项目信息。

zhangcl 19 小時之前
父節點
當前提交
1b971fe327

+ 44 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/IotOperationMeetingController.java

@@ -33,6 +33,7 @@ import javax.validation.Valid;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -147,6 +148,49 @@ public class IotOperationMeetingController {
         return success(new PageResult<>(buildMeetingDetails(pageResult.getList()), pageResult.getTotal()));
     }
 
+    @GetMapping("/integratedMeeting")
+    @Operation(summary = "石油技术查询所有公司整合的生产会议项目信息 按照期次维度整合")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting:query')")
+    public CommonResult<List<IotOperationMeetingRespVO>> integratedMeeting(@Valid IotOperationMeetingPageReqVO pageReqVO) {
+        List<IotOperationMeetingRespVO> combineMeetings = new ArrayList<>();
+        Map<String, List<IotOperationMeetingDO>> companyMeetingPair = iotOperationMeetingService.integratedMeeting(pageReqVO);
+        // key格式2026-第8期   value当期公司会议集合
+        if (CollUtil.isNotEmpty(companyMeetingPair)) {
+            Map<String, List<IotOperationMeetingDO>> sortedMeetings = companyMeetingPair.entrySet().stream()
+                    .sorted(Comparator.<Map.Entry<String, List<IotOperationMeetingDO>>>comparingInt(
+                                    e -> Integer.parseInt(e.getKey().substring(0, 4)))   // 提取年份
+                            .thenComparingInt(e -> Integer.parseInt(e.getKey().split("第|期")[1])) // 提取期次数字
+                            .reversed())  // 年份倒序,相同时期次倒序
+                    .collect(Collectors.toMap(
+                            Map.Entry::getKey,
+                            Map.Entry::getValue,
+                            (oldVal, newVal) -> oldVal,
+                            LinkedHashMap::new));
+
+            sortedMeetings.forEach((key, meetings) -> {
+                IotOperationMeetingRespVO tempMeeting = new IotOperationMeetingRespVO();
+                String[] keyArr = key.split("-");
+                String series = keyArr[1];
+                tempMeeting.setMeetingSeries(series);
+                tempMeeting.setCompanyName("科瑞石油技术");
+                meetings.stream()
+                        .findAny() // 随机取任意一个(等价于随机)
+                        .map(IotOperationMeetingDO::getMeetingDate)
+                        .ifPresent(tempMeeting::setMeetingDate);
+                combineMeetings.add(tempMeeting);
+            });
+        }
+        return success(combineMeetings);
+    }
+
+    @GetMapping("/summarizedProjectDetails")
+    @Operation(summary = "查询汇总的石油技术下的公司所有项目明细")
+    @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting:query')")
+    public CommonResult<Map<String, List<IotOperationMeetingDetailDO>>> summarizedProjectDetails(@Valid IotOperationMeetingPageReqVO pageReqVO) {
+        Map<String, List<IotOperationMeetingDetailDO>> iotOperationMeeting = iotOperationMeetingService.summarizedProjectDetails(pageReqVO);
+        return success(iotOperationMeeting);
+    }
+
     @GetMapping("/cachedProjects")
     @Operation(summary = "查询当前公司填写过的项目名称 缓存项目名称")
     @PreAuthorize("@ss.hasPermission('pms:iot-operation-meeting:query')")

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeeting/vo/IotOperationMeetingPageReqVO.java

@@ -83,4 +83,9 @@ public class IotOperationMeetingPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    /**
+     * 扩展字段
+     */
+    @Schema(description = "会议日期 yyyy")
+    private Integer year;
 }

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeetingdetail/vo/IotOperationMeetingDetailPageReqVO.java

@@ -98,4 +98,7 @@ public class IotOperationMeetingDetailPageReqVO extends PageParam {
      */
     @Schema(description = "运营会id集合", example = "[123,456]")
     private Collection<Long> meetingIds;
+
+    @Schema(description = "年份", example = "2026")
+    private Integer year;
 }

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationmeetingdetail/vo/IotOperationMeetingDetailRespVO.java

@@ -23,6 +23,10 @@ public class IotOperationMeetingDetailRespVO {
     @ExcelProperty("公司id")
     private Long companyId;
 
+    @Schema(description = "公司名称", example = "瑞都")
+    @ExcelProperty("公司id")
+    private String companyName;
+
     @Schema(description = "项目部id", example = "8560")
     @ExcelProperty("项目部id")
     private Long deptId;

+ 15 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotoperationmeetingdetail/IotOperationMeetingDetailMapper.java

@@ -69,4 +69,19 @@ public interface IotOperationMeetingDetailMapper extends BaseMapperX<IotOperatio
         );
     }
 
+    /**
+     * 查询:createTime 所在年份 + projectName 模糊匹配 + sort 最大的记录
+     */
+    default List<IotOperationMeetingDetailDO> summarizedProjectDetails(IotOperationMeetingDetailPageReqVO reqVO) {
+
+        return selectList(new LambdaQueryWrapperX<IotOperationMeetingDetailDO>()
+                // 1. 匹配 createTime 所在年份
+                .apply("YEAR(create_time) = {0}", reqVO.getYear())
+                // 2. sort 期次 精确查询
+                .eq(IotOperationMeetingDetailDO::getSort, reqVO.getSort())
+                // 3. 按 sort 倒序 → 取第一条就是最大值
+                .orderByDesc(IotOperationMeetingDetailDO::getId)
+        );
+    }
+
 }

+ 17 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationmeeting/IotOperationMeetingService.java

@@ -8,8 +8,11 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOp
 import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.IotOperationMeetingDetailPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.IotOperationMeetingDetailRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeeting.IotOperationMeetingDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeetingdetail.IotOperationMeetingDetailDO;
 
 import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -80,4 +83,18 @@ public interface IotOperationMeetingService {
      * @return
      */
     IotOperationMeetingRespVO mandatoryOrNot();
+
+    /**
+     * 石油技术查询所有公司整合的生产会议项目信息 按照期次维度整合
+     * @param pageReqVO
+     * @return
+     */
+    Map<String, List<IotOperationMeetingDO>> integratedMeeting(IotOperationMeetingPageReqVO pageReqVO);
+
+    /**
+     * 石油技术 查询汇总各专业公司的项目明细
+     * @param pageReqVO
+     * @return
+     */
+    Map<String, List<IotOperationMeetingDetailDO>> summarizedProjectDetails(IotOperationMeetingPageReqVO pageReqVO);
 }

+ 107 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationmeeting/IotOperationMeetingServiceImpl.java

@@ -28,6 +28,7 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_OPERATION_MEETING_EXISTS;
@@ -271,4 +272,110 @@ public class IotOperationMeetingServiceImpl implements IotOperationMeetingServic
         return resp;
     }
 
+    @Override
+    public Map<String, List<IotOperationMeetingDO>> integratedMeeting(IotOperationMeetingPageReqVO pageReqVO) {
+        // 石油技术查询整合后 各公司的 项目明细
+        if (StrUtil.isNotBlank(pageReqVO.getMeetingSeries())) {
+
+            // 提取 meetingSeries 中的数字
+            Optional.ofNullable(pageReqVO.getMeetingSeries())
+                    .map(s -> s.replaceAll("\\D", "")) // 提取所有数字
+                    .filter(StrUtil::isNumeric)    // 确保是数字
+                    .map(Integer::valueOf)
+                    .ifPresent(pageReqVO::setSort);
+        }
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        PageResult<IotOperationMeetingDO> pageMeetings = iotOperationMeetingMapper.selectPage(pageReqVO);
+        // key格式2026-第8期   value当期公司会议集合
+        Map<String, List<IotOperationMeetingDO>> companyMeetingPair = new HashMap<>();
+        if (ObjUtil.isNotEmpty(pageMeetings)) {
+            List<IotOperationMeetingDO> meetings = pageMeetings.getList();
+            if (CollUtil.isNotEmpty(meetings)) {
+                meetings.forEach(meeting -> {
+                    LocalDateTime meetingDate = meeting.getMeetingDate();
+                    // 获取日期中的年 yyyy
+                    Integer year = meetingDate.getYear();
+                    String uniqueKey = StrUtil.join("-", year, meeting.getMeetingSeries());
+                    if (companyMeetingPair.containsKey(uniqueKey)) {
+                        List<IotOperationMeetingDO> tempMeetings = companyMeetingPair.get(uniqueKey);
+                        tempMeetings.add(meeting);
+                        companyMeetingPair.put(uniqueKey, tempMeetings);
+                    } else {
+                        List<IotOperationMeetingDO> tempMeetings = new ArrayList<>();
+                        tempMeetings.add(meeting);
+                        companyMeetingPair.put(uniqueKey, tempMeetings);
+                    }
+                });
+            }
+        }
+        return companyMeetingPair;
+    }
+
+    @Override
+    public Map<String, List<IotOperationMeetingDetailDO>> summarizedProjectDetails(IotOperationMeetingPageReqVO pageReqVO) {
+        Map<String, List<IotOperationMeetingDetailDO>> resultMeetingDetails = new HashMap<>();
+        // 石油技术 查询 下属各专业公司 指定期次的 项目明细
+        String meetingSeries = pageReqVO.getMeetingSeries();        // 期次
+        Integer year = pageReqVO.getYear();     // 会议日期
+        if (StrUtil.isBlank(meetingSeries) || ObjUtil.isEmpty(year)) {
+            return resultMeetingDetails;
+        }
+        // 根据 期次 日期yyyy 查询石油技术下所有专业公司的项目明细
+
+        IotOperationMeetingDetailPageReqVO reqVO = new IotOperationMeetingDetailPageReqVO();
+        reqVO.setYear(year);
+        // 提取 meetingSeries 中的数字
+        Optional.ofNullable(meetingSeries)
+                .map(s -> s.replaceAll("\\D", "")) // 提取所有数字
+                .filter(StrUtil::isNumeric)    // 确保是数字
+                .map(Integer::valueOf)
+                .ifPresent(reqVO::setSort);
+        List<IotOperationMeetingDetailDO> summarizedDetails = iotOperationMeetingDetailMapper.summarizedProjectDetails(reqVO);
+        if (CollUtil.isEmpty(summarizedDetails)) {
+            return resultMeetingDetails;
+        }
+        Set<Long> companyIds = new HashSet<>();
+        // 需要把 明细按照公司分组
+        Map<String, List<IotOperationMeetingDetailDO>> companyMeetingDetailPair = new HashMap<>();
+        summarizedDetails.forEach(detail -> {
+            companyIds.add(detail.getDeptId());
+        });
+        // 查询 companyIds 各公司id对应的公司名称
+        List<DeptDO> companyNames = deptservice.getDeptList(companyIds);
+        Map<Long, String> companyPair = new HashMap<>();
+        if (CollUtil.isEmpty(companyNames)) {
+            return resultMeetingDetails;
+        }
+        companyNames.forEach(name -> {
+            companyPair.put(name.getId(), name.getName());
+        });
+        summarizedDetails.forEach(detail -> {
+            if (companyPair.containsKey(detail.getDeptId())) {
+                String companyName = companyPair.get(detail.getDeptId());
+                if (companyMeetingDetailPair.containsKey(companyName)) {
+                    List<IotOperationMeetingDetailDO> tempDetails = companyMeetingDetailPair.get(companyName);
+                    tempDetails.add(detail);
+                    companyMeetingDetailPair.put(companyName, tempDetails);
+                } else {
+                    List<IotOperationMeetingDetailDO> tempDetails = new ArrayList<>();
+                    tempDetails.add(detail);
+                    companyMeetingDetailPair.put(companyName, tempDetails);
+                }
+            }
+        });
+        // 排序 按照 部门 sort 值正序排列
+        // 构建 公司名称 -> sort 的映射(DeptDO 中有 sort 字段)
+        Map<String, Integer> nameSortMap = companyNames.stream()
+                .collect(Collectors.toMap(DeptDO::getName, DeptDO::getSort));
+
+        // 按公司 sort 升序排列,返回有序 Map
+        return companyMeetingDetailPair.entrySet().stream()
+                .sorted(Comparator.comparingInt(e -> nameSortMap.getOrDefault(e.getKey(), Integer.MAX_VALUE)))
+                .collect(Collectors.toMap(
+                        Map.Entry::getKey,
+                        Map.Entry::getValue,
+                        (v1, v2) -> v1,
+                        LinkedHashMap::new));
+    }
+
 }