diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetPreAllocController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetPreAllocController.java index 0e951eed..530136ab 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetPreAllocController.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpTimesheetPreAllocController.java @@ -17,6 +17,7 @@ import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo; import org.dromara.oa.erp.domain.vo.ErpTimesheetPreAllocVo; import org.dromara.oa.erp.domain.bo.ErpTimesheetPreAllocBo; import org.dromara.oa.erp.domain.vo.PreAllocDetailVo; @@ -80,6 +81,15 @@ public class ErpTimesheetPreAllocController extends BaseController { return R.ok(erpTimesheetPreAllocService.getStaffAllocDetails(monthCode, projectId)); } + /** + * 查询当前部门指定月份已填报工时的来源预投项目 + */ + @SaCheckPermission("oa/erp:timesheetPreAlloc:query") + @GetMapping("/listAvailableSourceProjects") + public R> listAvailableSourceProjects(@NotBlank(message = "月份编码不能为空") String monthCode) { + return R.ok(erpTimesheetPreAllocService.listAvailableSourceProjects(monthCode)); + } + /** * 新增预投工时分配 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetPreAllocService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetPreAllocService.java index 2d7265ec..b3e92ea1 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetPreAllocService.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpTimesheetPreAllocService.java @@ -4,6 +4,7 @@ import org.dromara.oa.erp.domain.vo.ErpTimesheetPreAllocVo; import org.dromara.oa.erp.domain.bo.ErpTimesheetPreAllocBo; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo; import org.dromara.oa.erp.domain.vo.PreAllocDetailVo; import java.util.Collection; @@ -59,6 +60,14 @@ public interface IErpTimesheetPreAllocService { */ PreAllocDetailVo getStaffAllocDetails(String monthCode, Long projectId); + /** + * 查询当前部门指定月份已填报工时的来源预投项目 + * + * @param monthCode 月份编码(YYYYMM) + * @return 来源预投项目列表 + */ + List listAvailableSourceProjects(String monthCode); + /** * 新增预投工时分配 * diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetPreAllocServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetPreAllocServiceImpl.java index 61a545b0..512f625c 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetPreAllocServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetPreAllocServiceImpl.java @@ -19,6 +19,7 @@ import org.dromara.oa.erp.domain.ErpTimesheetSummaryDetail; import org.dromara.oa.erp.domain.bo.ErpTimesheetPreAllocBo; import org.dromara.oa.erp.domain.bo.PreAllocStaffAllocBo; import org.dromara.oa.erp.domain.bo.PreAllocTargetBo; +import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo; import org.dromara.oa.erp.domain.vo.ErpTimesheetPreAllocVo; import org.dromara.oa.erp.domain.vo.PreAllocDetailVo; import org.dromara.oa.erp.domain.vo.PreAllocStaffAllocVo; @@ -214,6 +215,45 @@ public class ErpTimesheetPreAllocServiceImpl implements IErpTimesheetPreAllocSer return detailVo; } + /** + * 查询当前部门指定月份已填报工时的来源预投项目 + * + * @param monthCode 月份编码(YYYYMM) + * @return 来源预投项目列表 + */ + @Override + public List listAvailableSourceProjects(String monthCode) { + validateMonthCode(monthCode); + Long deptId = LoginHelper.getDeptId(); + ErpTimesheetSummary summary = getSingleSummaryOrNull(monthCode, deptId); + if (summary == null) { + return Collections.emptyList(); + } + + List detailList = summaryDetailMapper.selectList(Wrappers.lambdaQuery() + .select(ErpTimesheetSummaryDetail::getOriginalProjectId) + .eq(ErpTimesheetSummaryDetail::getSummaryId, summary.getSummaryId()) + .eq(ErpTimesheetSummaryDetail::getIsProject, PROJECT_WORK) + .eq(ErpTimesheetSummaryDetail::getDelFlag, DEL_FLAG_NORMAL) + .isNotNull(ErpTimesheetSummaryDetail::getOriginalProjectId) + .gt(ErpTimesheetSummaryDetail::getOriginalHours, BigDecimal.ZERO)); + List projectIds = detailList.stream() + .map(ErpTimesheetSummaryDetail::getOriginalProjectId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + if (projectIds.isEmpty()) { + return Collections.emptyList(); + } + + return projectInfoMapper.selectVoList(Wrappers.lambdaQuery() + .in(ErpProjectInfo::getProjectId, projectIds) + .eq(ErpProjectInfo::getProjectCategory, PRE_PROJECT_CATEGORY) + .eq(ErpProjectInfo::getDelFlag, DEL_FLAG_NORMAL) + .orderByAsc(ErpProjectInfo::getProjectCode) + .orderByAsc(ErpProjectInfo::getProjectName)); + } + /** * 新增预投工时分配 * @@ -349,6 +389,23 @@ public class ErpTimesheetPreAllocServiceImpl implements IErpTimesheetPreAllocSer return summaries.get(0); } + private ErpTimesheetSummary getSingleSummaryOrNull(String monthCode, Long deptId) { + if (deptId == null) { + throw new ServiceException("当前登录用户未绑定部门,无法进行预投工时分配"); + } + List summaries = summaryMapper.selectList(Wrappers.lambdaQuery() + .eq(ErpTimesheetSummary::getMonthCode, monthCode) + .eq(ErpTimesheetSummary::getDeptId, deptId) + .eq(ErpTimesheetSummary::getDelFlag, DEL_FLAG_NORMAL)); + if (summaries.isEmpty()) { + return null; + } + if (summaries.size() > 1) { + throw new ServiceException("当前部门该月份存在多个月汇总工时,请先修正月汇总数据"); + } + return summaries.get(0); + } + private ErpTimesheetSummary lockSummary(Long summaryId) { ErpTimesheetSummary summary = summaryMapper.selectOne(Wrappers.lambdaQuery() .eq(ErpTimesheetSummary::getSummaryId, summaryId)