|
@@ -0,0 +1,149 @@
|
|
|
|
|
+package cn.iocoder.yudao.module.pms.service.iotprojecttaskplan;
|
|
|
|
|
+
|
|
|
|
|
+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.module.pms.controller.admin.iotoperationmeetingattrs.vo.IotOperationMeetingAttrsPageReqVO;
|
|
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskplan.vo.IotProjectTaskPlanPageReqVO;
|
|
|
|
|
+import cn.iocoder.yudao.module.pms.controller.admin.iotprojecttaskplan.vo.IotProjectTaskPlanSaveReqVO;
|
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeetingattrs.IotOperationMeetingAttrsDO;
|
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;
|
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskplan.IotProjectTaskPlanDO;
|
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.mysql.iotoperationmeetingattrs.IotOperationMeetingAttrsMapper;
|
|
|
|
|
+import cn.iocoder.yudao.module.pms.dal.mysql.iotprojecttaskplan.IotProjectTaskPlanMapper;
|
|
|
|
|
+import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
|
|
|
|
|
+import cn.iocoder.yudao.module.system.dal.mysql.dept.DeptMapper;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.validation.annotation.Validated;
|
|
|
|
|
+
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
|
+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_PROJECT_TASK_PLAN_EXISTS;
|
|
|
|
|
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_PROJECT_TASK_PLAN_NOT_EXISTS;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 日报任务计划(工作量) Service 实现类
|
|
|
|
|
+ *
|
|
|
|
|
+ * @author ruqi
|
|
|
|
|
+ */
|
|
|
|
|
+@Service
|
|
|
|
|
+@Validated
|
|
|
|
|
+public class IotProjectTaskPlanServiceImpl implements IotProjectTaskPlanService {
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private IotProjectTaskPlanMapper iotProjectTaskPlanMapper;
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private IotOperationMeetingAttrsMapper iotOperationMeetingAttrsMapper;
|
|
|
|
|
+
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private DeptMapper deptMapper;
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Long createIotProjectTaskPlan(IotProjectTaskPlanSaveReqVO createReqVO) {
|
|
|
|
|
+ // 插入
|
|
|
|
|
+ IotProjectTaskPlanDO iotProjectTaskPlan = BeanUtils.toBean(createReqVO, IotProjectTaskPlanDO.class);
|
|
|
|
|
+ if (ObjUtil.isEmpty(createReqVO.getDeptId()) || ObjUtil.isEmpty(createReqVO.getStartTime())) {
|
|
|
|
|
+ throw exception(IOT_PROJECT_TASK_PLAN_NOT_EXISTS);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 校验当前队伍部门 指定时间所属月份 是否已经存在 工作量计划记录
|
|
|
|
|
+ IotProjectTaskPlanDO existPlan = iotProjectTaskPlanMapper.selectOneByDeptIdAndMonth(createReqVO.getDeptId(), createReqVO.getStartTime(), null);
|
|
|
|
|
+ if (ObjUtil.isNotEmpty(existPlan)) {
|
|
|
|
|
+ throw exception(IOT_PROJECT_TASK_PLAN_EXISTS);
|
|
|
|
|
+ }
|
|
|
|
|
+ iotProjectTaskPlanMapper.insert(iotProjectTaskPlan);
|
|
|
|
|
+ // 返回
|
|
|
|
|
+ return iotProjectTaskPlan.getId();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void updateIotProjectTaskPlan(IotProjectTaskPlanSaveReqVO updateReqVO) {
|
|
|
|
|
+ // 校验存在
|
|
|
|
|
+ validateIotProjectTaskPlanExists(updateReqVO.getId());
|
|
|
|
|
+ // 校验当前队伍部门 指定时间所属月份 是否已经存在 工作量计划记录
|
|
|
|
|
+ IotProjectTaskPlanDO existPlan = iotProjectTaskPlanMapper.selectOneByDeptIdAndMonth(updateReqVO.getDeptId(), updateReqVO.getStartTime(), updateReqVO.getId());
|
|
|
|
|
+ if (ObjUtil.isNotEmpty(existPlan)) {
|
|
|
|
|
+ throw exception(IOT_PROJECT_TASK_PLAN_EXISTS);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 更新
|
|
|
|
|
+ IotProjectTaskPlanDO updateObj = BeanUtils.toBean(updateReqVO, IotProjectTaskPlanDO.class);
|
|
|
|
|
+ iotProjectTaskPlanMapper.updateById(updateObj);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void deleteIotProjectTaskPlan(Long id) {
|
|
|
|
|
+ // 校验存在
|
|
|
|
|
+ validateIotProjectTaskPlanExists(id);
|
|
|
|
|
+ // 删除
|
|
|
|
|
+ iotProjectTaskPlanMapper.deleteById(id);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void validateIotProjectTaskPlanExists(Long id) {
|
|
|
|
|
+ if (iotProjectTaskPlanMapper.selectById(id) == null) {
|
|
|
|
|
+ throw exception(IOT_PROJECT_TASK_PLAN_NOT_EXISTS);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public IotProjectTaskPlanDO getIotProjectTaskPlan(Long id) {
|
|
|
|
|
+ return iotProjectTaskPlanMapper.selectById(id);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public PageResult<IotProjectTaskPlanDO> getIotProjectTaskPlanPage(IotProjectTaskPlanPageReqVO pageReqVO) {
|
|
|
|
|
+ return iotProjectTaskPlanMapper.selectPage(pageReqVO);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<IotTaskAttrModelProperty> planExtProperties(IotProjectTaskPlanPageReqVO pageReqVO) {
|
|
|
|
|
+ // deptId 需要传递公司级的部门id
|
|
|
|
|
+ Long deptId = pageReqVO.getDeptId();
|
|
|
|
|
+ if (ObjUtil.isEmpty(deptId)) {
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ // 如果 deptId 是集团级部门 科瑞石油技术 则查询所有公司的工作量扩展属性列表
|
|
|
|
|
+ DeptDO currentDept = deptMapper.selectById(deptId);
|
|
|
|
|
+ boolean groupFlag = false;
|
|
|
|
|
+ if ("0".equals(currentDept.getType())) {
|
|
|
|
|
+ groupFlag = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 根据任务井所属的 公司id 查询工作量扩展属性
|
|
|
|
|
+ IotOperationMeetingAttrsPageReqVO reqVO = new IotOperationMeetingAttrsPageReqVO();
|
|
|
|
|
+ if (!groupFlag) {
|
|
|
|
|
+ reqVO.setDeptId(deptId);
|
|
|
|
|
+ }
|
|
|
|
|
+ reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
|
|
|
|
+ PageResult<IotOperationMeetingAttrsDO> pageAttrs = iotOperationMeetingAttrsMapper.selectPage(reqVO);
|
|
|
|
|
+ List<IotOperationMeetingAttrsDO> workloadAttrs = pageAttrs.getList();
|
|
|
|
|
+ if (CollUtil.isEmpty(workloadAttrs)) {
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 4. Java8 Stream 一站式处理:过滤符合条件属性 → 按name去重 → 按sort升序排序
|
|
|
|
|
+ Map<String, IotTaskAttrModelProperty> uniqueAttrMap = workloadAttrs.stream()
|
|
|
|
|
+ // 提取扩展属性,过滤空对象
|
|
|
|
|
+ .map(IotOperationMeetingAttrsDO::getExtProperty)
|
|
|
|
|
+ .filter(ObjUtil::isNotEmpty)
|
|
|
|
|
+ // 过滤条件:名称包含“计划”、默认值为空
|
|
|
|
|
+ .filter(property -> property.getName().contains("计划") && StrUtil.isBlank(property.getDefaultValue()))
|
|
|
|
|
+ // 按name分组,同名只保留第一条数据
|
|
|
|
|
+ .collect(Collectors.toMap(
|
|
|
|
|
+ IotTaskAttrModelProperty::getName,
|
|
|
|
|
+ property -> property,
|
|
|
|
|
+ (existing, replacement) -> existing // 冲突时保留先出现的第一条
|
|
|
|
|
+ ));
|
|
|
|
|
+
|
|
|
|
|
+ // map转list,按sort升序排序(保证前端展示顺序统一)
|
|
|
|
|
+ List<IotTaskAttrModelProperty> result = new ArrayList<>(uniqueAttrMap.values());
|
|
|
|
|
+ result.sort(Comparator.comparing(IotTaskAttrModelProperty::getSort));
|
|
|
|
|
+
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|