|
|
@@ -1,12 +1,17 @@
|
|
|
package cn.iocoder.yudao.module.pms.service.iotoperationmeeting;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.util.ObjUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingPageReqVO;
|
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingSaveBatchVO;
|
|
|
import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingSaveReqVO;
|
|
|
+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.controller.admin.iotoperationmeetingdetail.vo.IotOperationMeetingDetailSaveReqVO;
|
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeeting.IotOperationMeetingDO;
|
|
|
import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeetingdetail.IotOperationMeetingDetailDO;
|
|
|
@@ -20,10 +25,11 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.*;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_OPERATION_MEETING_EXISTS;
|
|
|
import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_OPERATION_MEETING_NOT_EXISTS;
|
|
|
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.DEPT_NOT_FOUND;
|
|
|
|
|
|
@@ -123,10 +129,31 @@ public class IotOperationMeetingServiceImpl implements IotOperationMeetingServic
|
|
|
}
|
|
|
List<Long> meetingIds = new ArrayList<>();
|
|
|
long resultId = 0l;
|
|
|
+ // 根据 期次 '第8期' 赋值 sort = 8
|
|
|
+ Optional.ofNullable(meeting.getMeetingSeries())
|
|
|
+ .map(s -> s.replaceAll("\\D", "")) // 提取所有数字
|
|
|
+ .filter(StrUtil::isNumeric) // 确保是数字
|
|
|
+ .map(Integer::valueOf)
|
|
|
+ .ifPresent(meeting::setSort);
|
|
|
+ // 校验当前公司 当前日期所属年 当前期次是否有重复的记录
|
|
|
+ IotOperationMeetingPageReqVO reqVO = new IotOperationMeetingPageReqVO();
|
|
|
+ reqVO.setSort(meeting.getSort());
|
|
|
+ LocalDateTime [] times = {LocalDateTime.now(), LocalDateTime.now()};
|
|
|
+ reqVO.setCreateTime(times);
|
|
|
+ List<IotOperationMeetingDO> meetings = iotOperationMeetingMapper.selectExistMeetingByYearAndSort(reqVO);
|
|
|
+
|
|
|
if (ObjUtil.isNotEmpty(meeting.getId())) {
|
|
|
// 更新
|
|
|
// 校验存在
|
|
|
validateIotOperationMeetingExists(meeting.getId());
|
|
|
+ // 校验当期运营会议是否有重复
|
|
|
+ if (CollUtil.isNotEmpty(meetings)) {
|
|
|
+ meetings.forEach(mtg -> {
|
|
|
+ if (!mtg.getId().equals(meeting.getId())) {
|
|
|
+ throw exception(IOT_OPERATION_MEETING_EXISTS);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
IotOperationMeetingDO updateObj = BeanUtils.toBean(meeting, IotOperationMeetingDO.class);
|
|
|
int id = iotOperationMeetingMapper.updateById(updateObj);
|
|
|
resultId = id;
|
|
|
@@ -137,6 +164,9 @@ public class IotOperationMeetingServiceImpl implements IotOperationMeetingServic
|
|
|
meetingIds.add(updateObj.getId());
|
|
|
} else {
|
|
|
// 新增
|
|
|
+ if (CollUtil.isNotEmpty(meetings)) {
|
|
|
+ throw exception(IOT_OPERATION_MEETING_EXISTS);
|
|
|
+ }
|
|
|
IotOperationMeetingDO iotOperationMeeting = BeanUtils.toBean(meeting, IotOperationMeetingDO.class);
|
|
|
int id = iotOperationMeetingMapper.insert(iotOperationMeeting);
|
|
|
resultId = id;
|
|
|
@@ -151,6 +181,7 @@ public class IotOperationMeetingServiceImpl implements IotOperationMeetingServic
|
|
|
detailDO.setId(null);
|
|
|
detailDO.setMeetingId(meetingIds.get(0));
|
|
|
detailDO.setDeptId(meeting.getDeptId());
|
|
|
+ detailDO.setSort(meeting.getSort()); // 期次索引
|
|
|
meetingDetails.add(detailDO);
|
|
|
});
|
|
|
iotOperationMeetingDetailMapper.insertBatch(meetingDetails);
|
|
|
@@ -158,4 +189,68 @@ public class IotOperationMeetingServiceImpl implements IotOperationMeetingServic
|
|
|
return resultId;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Set<String> cachedProjects() {
|
|
|
+ Set<String> projectNames = new HashSet<>();
|
|
|
+ // 查询当前登录人所属公司下 填写过的 项目名称
|
|
|
+ IotOperationMeetingDetailPageReqVO reqVO = new IotOperationMeetingDetailPageReqVO();
|
|
|
+ reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
|
|
+ PageResult<IotOperationMeetingDetailDO> meetingPage = iotOperationMeetingDetailMapper.selectPage(reqVO);
|
|
|
+ if (ObjUtil.isNotEmpty(meetingPage)) {
|
|
|
+ List<IotOperationMeetingDetailDO> meetingDetails = meetingPage.getList();
|
|
|
+ if (CollUtil.isNotEmpty(meetingDetails)) {
|
|
|
+ meetingDetails.forEach(detail -> {
|
|
|
+ projectNames.add(detail.getProjectName());
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return projectNames;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IotOperationMeetingDetailRespVO previousWorkPlan(IotOperationMeetingDetailPageReqVO pageReqVO) {
|
|
|
+ // 填报运营会议明细时查询上期填写的工作计划
|
|
|
+ String projectName = pageReqVO.getProjectName();
|
|
|
+ Long meetingId = pageReqVO.getMeetingId(); // 会议id
|
|
|
+ Long meetingDetailId = pageReqVO.getId(); // 会议明细id
|
|
|
+ // 如果传了 明细Id 说明是编辑状态 此时 不需要查询上一期次的工作计划
|
|
|
+ // 如果没传 明细Id 说明是新增项目状态 此时需要查询当前公司上一期次相同项目名称的会议明细 下期工作计划
|
|
|
+ // 会议期次 根据 项目名称 期次 查询 当前公司 上一期次(sort-1) 相同项目名称的 ‘下期工作计划-计划工作量’ ‘下期工作计划-重点工作事项’
|
|
|
+ // 没传 明细Id 有2种情况:新建会议 or 编辑会议新增项目
|
|
|
+ // 新建会议(会议id为null) sort 最大的记录即为上一期次的会议
|
|
|
+ // 编辑会议新增项目(会议id不为null) sort 倒序排列 取第2位次的会议即为上一期次的会议
|
|
|
+ if (ObjUtil.isNotEmpty(meetingDetailId) || StrUtil.isBlank(projectName)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ IotOperationMeetingDetailPageReqVO reqVO = new IotOperationMeetingDetailPageReqVO();
|
|
|
+ reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
|
|
+ reqVO.setProjectName(projectName);
|
|
|
+ LocalDateTime [] times = {LocalDateTime.now(), LocalDateTime.now()};
|
|
|
+ reqVO.setCreateTime(times);
|
|
|
+ List<IotOperationMeetingDetailDO> meetingDetails = iotOperationMeetingDetailMapper.selectMaxSortByYearAndProject(reqVO);
|
|
|
+ if (CollUtil.isEmpty(meetingDetails)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ if (ObjUtil.isEmpty(meetingId)) {
|
|
|
+ // 新建会议
|
|
|
+ // 查询当前用户所属公司最新的会议明细 当前日期所属年
|
|
|
+ // 只取第1条记录
|
|
|
+ return BeanUtils.toBean(meetingDetails.get(0), IotOperationMeetingDetailRespVO.class);
|
|
|
+ }
|
|
|
+ // 编辑会议新增项目
|
|
|
+ // 查询当前的会议的 sort-1 即为上一期会议
|
|
|
+ IotOperationMeetingDO meeting = iotOperationMeetingMapper.selectById(meetingId);
|
|
|
+ if (ObjUtil.isEmpty(meeting)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer lastMeetingSort = meeting.getSort() - 1;
|
|
|
+ return meetingDetails.stream()
|
|
|
+ .filter(detail -> Objects.equals(detail.getSort(), lastMeetingSort))
|
|
|
+ .findFirst()
|
|
|
+ .map(detail -> BeanUtils.toBean(detail, IotOperationMeetingDetailRespVO.class))
|
|
|
+ .orElse(null);
|
|
|
+ }
|
|
|
+
|
|
|
}
|