|
|
@@ -0,0 +1,255 @@
|
|
|
+package org.dromara.customer.service.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
+import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.dromara.customer.domain.BusinessTask;
|
|
|
+import org.dromara.customer.domain.bo.BusinessTaskBo;
|
|
|
+import org.dromara.customer.domain.vo.BusinessTaskVo;
|
|
|
+import org.dromara.customer.mapper.BusinessTaskMapper;
|
|
|
+import org.dromara.customer.service.IBusinessTaskService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 综合任务服务实现类
|
|
|
+ *
|
|
|
+ * @author Antigravity
|
|
|
+ */
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class BusinessTaskServiceImpl implements IBusinessTaskService {
|
|
|
+
|
|
|
+ private final BusinessTaskMapper baseMapper;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<BusinessTaskVo> queryPageList(BusinessTaskBo bo, PageQuery pageQuery) {
|
|
|
+ LambdaQueryWrapper<BusinessTask> lqw = buildQueryWrapper(bo);
|
|
|
+ Page<BusinessTaskVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+
|
|
|
+ // 如果查询的是季度任务,则需要填充年度聚合与月度明细
|
|
|
+ if (Integer.valueOf(1).equals(bo.getTaskType())) {
|
|
|
+ fillQuarterlyExtraData(result.getRecords());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 汇总子任务的核心客户和重点项目
|
|
|
+ aggregateChildData(result.getRecords());
|
|
|
+
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 为季度任务填充年度目标及月度明细
|
|
|
+ */
|
|
|
+ private void fillQuarterlyExtraData(List<BusinessTaskVo> list) {
|
|
|
+ if (list == null || list.isEmpty()) return;
|
|
|
+
|
|
|
+ for (BusinessTaskVo vo : list) {
|
|
|
+ // 1. 填充年度数据 (Parent)
|
|
|
+ if (vo.getParentId() != null) {
|
|
|
+ BusinessTask annual = baseMapper.selectById(vo.getParentId());
|
|
|
+ if (annual != null) {
|
|
|
+ vo.setAnnualTargetTask(annual.getTargetTask());
|
|
|
+ vo.setAnnualSprintTask(annual.getSprintTask());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 填充月度数据 (Children)
|
|
|
+ List<BusinessTask> months = baseMapper.selectList(Wrappers.lambdaQuery(BusinessTask.class)
|
|
|
+ .eq(BusinessTask::getTaskType, 2)
|
|
|
+ .eq(BusinessTask::getParentId, vo.getId())
|
|
|
+ .orderByAsc(BusinessTask::getMonth));
|
|
|
+
|
|
|
+ for (BusinessTask monthTask : months) {
|
|
|
+ BigDecimal actual = monthTask.getActualAchievement();
|
|
|
+ Integer m = monthTask.getMonth();
|
|
|
+ if (m == null) continue;
|
|
|
+
|
|
|
+ // 判断属于该季度的第几个月
|
|
|
+ int monthInQuarter = (m - 1) % 3 + 1;
|
|
|
+ if (monthInQuarter == 1) vo.setMonth1Actual(actual);
|
|
|
+ else if (monthInQuarter == 2) vo.setMonth2Actual(actual);
|
|
|
+ else if (monthInQuarter == 3) vo.setMonth3Actual(actual);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 汇总子任务(分解项)的数据到主任务显示
|
|
|
+ */
|
|
|
+ private void aggregateChildData(List<BusinessTaskVo> list) {
|
|
|
+ if (list == null || list.isEmpty()) return;
|
|
|
+
|
|
|
+ for (BusinessTaskVo vo : list) {
|
|
|
+ // 查询该任务下的所有子记录
|
|
|
+ List<BusinessTask> children = baseMapper.selectList(Wrappers.lambdaQuery(BusinessTask.class)
|
|
|
+ .eq(BusinessTask::getParentId, vo.getId()));
|
|
|
+
|
|
|
+ if (children != null && !children.isEmpty()) {
|
|
|
+ // 拼接核心客户
|
|
|
+ String customers = children.stream()
|
|
|
+ .map(BusinessTask::getCoreCustomer)
|
|
|
+ .filter(StrUtil::isNotBlank)
|
|
|
+ .distinct()
|
|
|
+ .collect(java.util.stream.Collectors.joining(", "));
|
|
|
+ vo.setCoreCustomer(customers);
|
|
|
+
|
|
|
+ // 拼接重点项目
|
|
|
+ String projects = children.stream()
|
|
|
+ .map(BusinessTask::getKeyProject)
|
|
|
+ .filter(StrUtil::isNotBlank)
|
|
|
+ .distinct()
|
|
|
+ .collect(java.util.stream.Collectors.joining(", "));
|
|
|
+ vo.setKeyProject(projects);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<BusinessTaskVo> queryList(BusinessTaskBo bo) {
|
|
|
+ LambdaQueryWrapper<BusinessTask> lqw = buildQueryWrapper(bo);
|
|
|
+ List<BusinessTaskVo> list = baseMapper.selectVoList(lqw);
|
|
|
+
|
|
|
+ // 季度数据填充
|
|
|
+ if (Integer.valueOf(1).equals(bo.getTaskType())) {
|
|
|
+ fillQuarterlyExtraData(list);
|
|
|
+ }
|
|
|
+ // 子任务汇总填充
|
|
|
+ aggregateChildData(list);
|
|
|
+
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public BusinessTaskVo queryById(Long id) {
|
|
|
+ BusinessTaskVo vo = baseMapper.selectVoById(id);
|
|
|
+ if (vo != null) {
|
|
|
+ List<BusinessTaskVo> details = baseMapper.selectVoList(Wrappers.lambdaQuery(BusinessTask.class)
|
|
|
+ .eq(BusinessTask::getParentId, id));
|
|
|
+ vo.setDetails(details);
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean insertByBo(BusinessTaskBo bo) {
|
|
|
+ findAndSetParentId(bo);
|
|
|
+ BusinessTask add = BeanUtil.toBean(bo, BusinessTask.class);
|
|
|
+ boolean flag = baseMapper.insert(add) > 0;
|
|
|
+ if (flag && bo.getDetails() != null && !bo.getDetails().isEmpty()) {
|
|
|
+ for (BusinessTaskBo detail : bo.getDetails()) {
|
|
|
+ BusinessTask child = BeanUtil.toBean(detail, BusinessTask.class);
|
|
|
+ child.setParentId(add.getId());
|
|
|
+ child.setTaskType(bo.getTaskType());
|
|
|
+ child.setYear(bo.getYear());
|
|
|
+ child.setQuarter(bo.getQuarter());
|
|
|
+ child.setMonth(bo.getMonth());
|
|
|
+ child.setDeptId(bo.getDeptId());
|
|
|
+ baseMapper.insert(child);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean updateByBo(BusinessTaskBo bo) {
|
|
|
+ findAndSetParentId(bo);
|
|
|
+ BusinessTask update = BeanUtil.toBean(bo, BusinessTask.class);
|
|
|
+ boolean flag = baseMapper.updateById(update) > 0;
|
|
|
+ if (flag) {
|
|
|
+ // 先删除旧的明细
|
|
|
+ baseMapper.delete(Wrappers.lambdaQuery(BusinessTask.class)
|
|
|
+ .eq(BusinessTask::getParentId, bo.getId()));
|
|
|
+ // 保存新的明细
|
|
|
+ if (bo.getDetails() != null && !bo.getDetails().isEmpty()) {
|
|
|
+ for (BusinessTaskBo detail : bo.getDetails()) {
|
|
|
+ BusinessTask child = BeanUtil.toBean(detail, BusinessTask.class);
|
|
|
+ child.setParentId(bo.getId());
|
|
|
+ child.setTaskType(bo.getTaskType());
|
|
|
+ child.setYear(bo.getYear());
|
|
|
+ child.setQuarter(bo.getQuarter());
|
|
|
+ child.setMonth(bo.getMonth());
|
|
|
+ child.setDeptId(bo.getDeptId());
|
|
|
+ baseMapper.insert(child);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 自动寻找并设置父级ID
|
|
|
+ */
|
|
|
+ private void findAndSetParentId(BusinessTaskBo bo) {
|
|
|
+ if (bo.getParentId() != null) return;
|
|
|
+
|
|
|
+ // 季度任务 (1) 找 年度任务 (0)
|
|
|
+ if (Integer.valueOf(1).equals(bo.getTaskType())) {
|
|
|
+ BusinessTask parent = baseMapper.selectOne(Wrappers.lambdaQuery(BusinessTask.class)
|
|
|
+ .eq(BusinessTask::getTaskType, 0)
|
|
|
+ .eq(BusinessTask::getYear, bo.getYear())
|
|
|
+ .eq(BusinessTask::getDeptId, bo.getDeptId())
|
|
|
+ .isNull(BusinessTask::getParentId) // 找主任务,非分解项
|
|
|
+ .last("limit 1"));
|
|
|
+ if (parent != null) bo.setParentId(parent.getId());
|
|
|
+ }
|
|
|
+ // 月度任务 (2) 找 季度任务 (1)
|
|
|
+ else if (Integer.valueOf(2).equals(bo.getTaskType())) {
|
|
|
+ // 计算季度
|
|
|
+ Integer quarter = (bo.getMonth() - 1) / 3 + 1;
|
|
|
+ BusinessTask parent = baseMapper.selectOne(Wrappers.lambdaQuery(BusinessTask.class)
|
|
|
+ .eq(BusinessTask::getTaskType, 1)
|
|
|
+ .eq(BusinessTask::getYear, bo.getYear())
|
|
|
+ .eq(BusinessTask::getQuarter, quarter)
|
|
|
+ .eq(BusinessTask::getDeptId, bo.getDeptId())
|
|
|
+ .isNull(BusinessTask::getParentId)
|
|
|
+ .last("limit 1"));
|
|
|
+ if (parent != null) bo.setParentId(parent.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
+ if (ids == null || ids.isEmpty()) return false;
|
|
|
+
|
|
|
+ // 1. 删除所有关联的子任务
|
|
|
+ baseMapper.delete(Wrappers.lambdaQuery(BusinessTask.class)
|
|
|
+ .in(BusinessTask::getParentId, ids));
|
|
|
+
|
|
|
+ // 2. 删除主任务
|
|
|
+ return baseMapper.deleteByIds(ids) > 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ private LambdaQueryWrapper<BusinessTask> buildQueryWrapper(BusinessTaskBo bo) {
|
|
|
+ LambdaQueryWrapper<BusinessTask> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.eq(bo.getTaskType() != null, BusinessTask::getTaskType, bo.getTaskType());
|
|
|
+ lqw.eq(bo.getYear() != null, BusinessTask::getYear, bo.getYear());
|
|
|
+ lqw.eq(bo.getQuarter() != null, BusinessTask::getQuarter, bo.getQuarter());
|
|
|
+ lqw.eq(bo.getMonth() != null, BusinessTask::getMonth, bo.getMonth());
|
|
|
+ lqw.eq(bo.getDeptId() != null, BusinessTask::getDeptId, bo.getDeptId());
|
|
|
+ lqw.eq(bo.getSalesUserId() != null, BusinessTask::getSalesUserId, bo.getSalesUserId());
|
|
|
+ lqw.eq(StrUtil.isNotBlank(bo.getIndustryLine()), BusinessTask::getIndustryLine, bo.getIndustryLine());
|
|
|
+
|
|
|
+ // 关键修复:默认只查询主记录,不查询任务分解产生的子记录
|
|
|
+ if (bo.getParentId() != null) {
|
|
|
+ lqw.eq(BusinessTask::getParentId, bo.getParentId());
|
|
|
+ } else {
|
|
|
+ lqw.isNull(BusinessTask::getParentId);
|
|
|
+ }
|
|
|
+
|
|
|
+ lqw.orderByDesc(BusinessTask::getId);
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+}
|