diff --git a/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectController.java b/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectController.java index b54d10d..c059b3a 100644 --- a/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectController.java +++ b/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectController.java @@ -103,6 +103,13 @@ public class ProjectController extends BaseController { return success(teamService.personnelChanges(team)); } + + + @GetMapping("/team/list") + public AjaxResult teamList(ProjectTeam team) { + return success(teamService.list(team)); + } + /** * 删除项目 */ diff --git a/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectFileController.java b/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectFileController.java new file mode 100644 index 0000000..48701b4 --- /dev/null +++ b/pms-admin/src/main/java/tech/unissense/pms/web/controller/business/project/ProjectFileController.java @@ -0,0 +1,42 @@ +package tech.unissense.pms.web.controller.business.project; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import tech.unissense.pms.business.project.domain.Project; +import tech.unissense.pms.business.project.dto.ProjectQueryDto; +import tech.unissense.pms.business.project.service.IProjectService; +import tech.unissense.pms.business.projectFile.service.IProjectFileService; +import tech.unissense.pms.business.projectteam.domain.ProjectTeam; +import tech.unissense.pms.business.projectteam.service.IProjectTeamService; +import tech.unissense.pms.common.annotation.Log; +import tech.unissense.pms.common.core.controller.BaseController; +import tech.unissense.pms.common.core.domain.AjaxResult; +import tech.unissense.pms.common.core.page.TableDataInfo; +import tech.unissense.pms.common.enums.BusinessType; +import tech.unissense.pms.common.utils.uuid.IdUtils; + +import java.util.List; + +/** + * 部门信息 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/business/project/file") +public class ProjectFileController extends BaseController { + @Autowired + private IProjectFileService service; + + /** + * 删除文件 + */ + // @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @Log(title = "删除文件", businessType = BusinessType.DELETE) + @DeleteMapping("/{id}") + public AjaxResult remove(@PathVariable Integer id) { + return toAjax(service.deleteById(id)); + } + + +} diff --git a/pms-business/src/main/java/tech/unissense/pms/business/demand/domain/ProjectDemand.java b/pms-business/src/main/java/tech/unissense/pms/business/demand/domain/ProjectDemand.java index 827bb38..286dcda 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/demand/domain/ProjectDemand.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/demand/domain/ProjectDemand.java @@ -1,6 +1,7 @@ package tech.unissense.pms.business.demand.domain; import lombok.Data; +import tech.unissense.pms.business.projectFile.domain.ProjectFile; import java.io.Serializable; import java.util.Date; @@ -60,6 +61,9 @@ public class ProjectDemand implements Serializable { private String responsiblePersonName; private List demandStatusList; private Date queryDate; + + + private List fileList; /** * 需求状态 */ diff --git a/pms-business/src/main/java/tech/unissense/pms/business/demand/service/impl/ProjectDemandServiceImpl.java b/pms-business/src/main/java/tech/unissense/pms/business/demand/service/impl/ProjectDemandServiceImpl.java index 83aaaa8..d6aec52 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/demand/service/impl/ProjectDemandServiceImpl.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/demand/service/impl/ProjectDemandServiceImpl.java @@ -1,13 +1,17 @@ package tech.unissense.pms.business.demand.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; +import org.springframework.beans.factory.annotation.Autowired; import tech.unissense.pms.business.demand.domain.ProjectDemand; import tech.unissense.pms.business.demand.mapper.ProjectDemandMapper; import tech.unissense.pms.business.demand.service.IProjectDemandService; import org.springframework.stereotype.Service; import tech.unissense.pms.business.project.domain.Project; import tech.unissense.pms.business.project.mapper.ProjectMapper; +import tech.unissense.pms.business.projectFile.domain.ProjectFile; +import tech.unissense.pms.business.projectFile.service.IProjectFileService; import tech.unissense.pms.common.exception.ServiceException; import tech.unissense.pms.common.utils.DateUtils; @@ -16,6 +20,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.ZoneId; +import java.util.Collections; import java.util.List; /** @@ -32,6 +37,8 @@ public class ProjectDemandServiceImpl implements IProjectDemandService { @Resource private ProjectMapper projectMapper; + @Autowired + private IProjectFileService projectFileService; /** * 查询列表数据 * @@ -46,7 +53,10 @@ public class ProjectDemandServiceImpl implements IProjectDemandService { @Override public ProjectDemand queryById(Integer id) { - return projectDemandMapper.queryById(id); + ProjectDemand projectDemand = projectDemandMapper.queryById(id); + List projectFiles = projectFileService.listByIdAndType(Collections.singletonList(id), ProjectFile.FileTypeEnum.DEMAND.getValue()); + projectDemand.setFileList(projectFiles); + return projectDemand; } @@ -66,6 +76,17 @@ public class ProjectDemandServiceImpl implements IProjectDemandService { } } int insert = projectDemandMapper.insert(projectDemand); + List fileList = projectDemand.getFileList(); + if (CollUtil.isNotEmpty(fileList)){ + for (ProjectFile projectFile : fileList) { + projectFile.setFileType(ProjectFile.FileTypeEnum.DEMAND.getValue()); + projectFile.setDemandId(projectDemand.getId()); + projectFile.setProjectId(projectFile.getProjectId()); + } + projectFileService.saveBatch(fileList); + } + + return projectDemand; } @@ -101,6 +122,15 @@ public class ProjectDemandServiceImpl implements IProjectDemandService { throw new ServiceException("结束时间不能早于当前时间"); } + List fileList = projectDemand.getFileList(); + if (CollUtil.isNotEmpty(fileList)){ + for (ProjectFile projectFile : fileList) { + projectFile.setFileType(ProjectFile.FileTypeEnum.DEMAND.getValue()); + projectFile.setDemandId(projectDemand.getId()); + projectFile.setProjectId(projectFile.getProjectId()); + } + projectFileService.saveBatch(fileList); + } return projectDemandMapper.update(projectDemand); } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/project/domain/Project.java b/pms-business/src/main/java/tech/unissense/pms/business/project/domain/Project.java index 6624aa0..2323bc3 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/project/domain/Project.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/project/domain/Project.java @@ -2,9 +2,11 @@ package tech.unissense.pms.business.project.domain; import lombok.Data; import tech.unissense.pms.business.demand.domain.ProjectDemand; +import tech.unissense.pms.business.projectFile.domain.ProjectFile; import tech.unissense.pms.common.core.domain.BaseEntity; import java.util.Date; +import java.util.List; /** * (Project)实体类 @@ -80,6 +82,9 @@ public class Project extends BaseEntity { private Integer teamNum; private Long queryUserId; + + + private List fileList; /** * 需求状态 */ diff --git a/pms-business/src/main/java/tech/unissense/pms/business/project/service/impl/ProjectServiceImpl.java b/pms-business/src/main/java/tech/unissense/pms/business/project/service/impl/ProjectServiceImpl.java index 67b8012..1f902fc 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/project/service/impl/ProjectServiceImpl.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/project/service/impl/ProjectServiceImpl.java @@ -11,6 +11,8 @@ import tech.unissense.pms.business.project.mapper.ProjectMapper; import tech.unissense.pms.business.project.service.IProjectService; import tech.unissense.pms.business.project.vo.ProjectExecutionVo; import tech.unissense.pms.business.project.vo.ProjectWorkInfoVo; +import tech.unissense.pms.business.projectFile.domain.ProjectFile; +import tech.unissense.pms.business.projectFile.service.IProjectFileService; import tech.unissense.pms.business.projectteam.domain.ProjectTeam; import tech.unissense.pms.business.projectteam.service.IProjectTeamService; import tech.unissense.pms.business.projectteam.vo.TeamStaticsVo; @@ -56,6 +58,8 @@ public class ProjectServiceImpl implements IProjectService { private static final ConcurrentHashMap DAILY_SEQUENCE_MAP = new ConcurrentHashMap<>(); @Autowired private RedisCache redisCache; + @Autowired + private IProjectFileService projectFileService; /** * 通过ID查询单条数据 @@ -65,7 +69,10 @@ public class ProjectServiceImpl implements IProjectService { */ @Override public Project queryById(Integer projectId) { - return this.projectMapper.queryById(projectId); + Project project = this.projectMapper.queryById(projectId); + List projectFiles = projectFileService.listByIdAndType(Collections.singletonList(projectId), ProjectFile.FileTypeEnum.PROJECT.getValue()); + project.setFileList(projectFiles); + return project; } /** @@ -178,10 +185,13 @@ public class ProjectServiceImpl implements IProjectService { } // 新增项目 this.projectMapper.insert(project); - // project.getProjectTeamList().forEach(item -> - // item.setProjectId(project.getProjectId())); - // // 新增项目人员 - // teamService.insertBatch(project.getProjectTeamList()); + for (ProjectFile projectFile : project.getFileList()) { + projectFile.setProjectId(project.getProjectId()); + projectFile.setFileType(ProjectFile.FileTypeEnum.PROJECT.getValue()); + } + // 新增不需要修改 + projectFileService.saveBatch(project.getFileList()); + return project; } @@ -198,6 +208,12 @@ public class ProjectServiceImpl implements IProjectService { throw new ServiceException(errorMsg); } this.projectMapper.update(project); + // 项目文件不允许修改 + for (ProjectFile projectFile : project.getFileList()) { + projectFile.setProjectId(project.getProjectId()); + projectFile.setFileType(ProjectFile.FileTypeEnum.PROJECT.getValue()); + } + projectFileService.saveBatch(project.getFileList()); return this.queryById(project.getProjectId()); } @@ -267,19 +283,19 @@ public class ProjectServiceImpl implements IProjectService { WorkLogger workLogger = new WorkLogger(); workLogger.setProjectIdList(projectIdList); List allWorkLoggerList = workLoggerService.list(workLogger); - Map workTimeAllMap = allWorkLoggerList.stream().filter(item-> StrUtil.isNotEmpty(item.getWorkTime())).collect(Collectors.groupingBy(WorkLogger::getProjectId, Collectors.reducing(BigDecimal.ZERO + Map workTimeAllMap = allWorkLoggerList.stream().filter(item -> StrUtil.isNotEmpty(item.getWorkTime())).collect(Collectors.groupingBy(WorkLogger::getProjectId, Collectors.reducing(BigDecimal.ZERO , item -> new BigDecimal(item.getWorkTime()), BigDecimal::add))); // BeanUtils.copyBeanProp(workLogger,queryDto); - List workLoggerList = allWorkLoggerList.stream() + List workLoggerList = allWorkLoggerList.stream() .filter(item -> { Date date = item.getLoggerDate(); Integer userId = item.getUserId(); - boolean flag=(date != null && !date.before(queryDto.getStartDate()) && !date.after(queryDto.getEndDate())); - if (queryDto.getUserId() != null){ - flag=flag&&queryDto.getUserId().equals(userId); + boolean flag = (date != null && !date.before(queryDto.getStartDate()) && !date.after(queryDto.getEndDate())); + if (queryDto.getUserId() != null) { + flag = flag && queryDto.getUserId().equals(userId); } - return flag; + return flag; }) .collect(Collectors.toList()); @@ -340,8 +356,8 @@ public class ProjectServiceImpl implements IProjectService { WorkLogger::getUserId, logger -> logger, (existing, - replacement) -> existing.getCreateTime() - .after(replacement.getCreateTime()) ? existing : replacement), + replacement) -> existing.getCreateTime() + .after(replacement.getCreateTime()) ? existing : replacement), map -> new ArrayList<>(map.values())))); LocalDate startDate = projectQueryDto.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); diff --git a/pms-business/src/main/java/tech/unissense/pms/business/projectFile/domain/ProjectFile.java b/pms-business/src/main/java/tech/unissense/pms/business/projectFile/domain/ProjectFile.java new file mode 100644 index 0000000..13d2f39 --- /dev/null +++ b/pms-business/src/main/java/tech/unissense/pms/business/projectFile/domain/ProjectFile.java @@ -0,0 +1,103 @@ +package tech.unissense.pms.business.projectFile.domain; + +import java.util.Date; + + +import lombok.Data; +import lombok.Getter; + + +/** + * (ProjectFile)实体类 + * + * @author ch + * @since 2025-04-21 17:40:56 + */ +@Data + +public class ProjectFile { + + + private Integer id; + /** + * 项目id + */ + + private Integer projectId; + /** + * 需求id + */ + + private Integer demandId; + /** + * 日志id + */ + + private Integer loggerId; + /** + * 附件类型 ( 0:项目附件 1:需求附件 2:日志附件) + */ + + private String fileType; + /** + * 文件路径 + */ + + private String fileUrl; + /** + * 文件名 + */ + + private String fileNewName; + /** + * 上传文件名 + */ + + private String fileName; + /** + * 创建者 + */ + + private Integer createBy; + /** + * 更新者 + */ + + private Integer updateBy; + /** + * 更新时间 + */ + + private Date updateTime; + /** + * 创建时间 + */ + + private Date createTime; + + @Getter + public enum FileTypeEnum { + PROJECT("0", "项目附件"), + DEMAND("1", "需求附件"), + LOGGER("2", "日志附件"); + private final String value; + private final String remark; + + FileTypeEnum(String value, String remark) { + this.value = value; + this.remark = remark; + } + + public static String getRemark(String value) { + for (FileTypeEnum fileTypeEnum : FileTypeEnum.values()) { + if (fileTypeEnum.value.equals(value)) { + return fileTypeEnum.remark; + } + } + return null; + } + } +} + + + diff --git a/pms-business/src/main/java/tech/unissense/pms/business/projectFile/mapper/ProjectFileMapper.java b/pms-business/src/main/java/tech/unissense/pms/business/projectFile/mapper/ProjectFileMapper.java new file mode 100644 index 0000000..6a6fd51 --- /dev/null +++ b/pms-business/src/main/java/tech/unissense/pms/business/projectFile/mapper/ProjectFileMapper.java @@ -0,0 +1,55 @@ +package tech.unissense.pms.business.projectFile.mapper; + +import org.apache.ibatis.annotations.Param; +import tech.unissense.pms.business.projectFile.domain.ProjectFile; + +import java.util.List; + +/** + * @Author ch + * @Desc (ProjectFile)表数据库访问层 + * @Date 2025-04-21 17:40:56 + */ +public interface ProjectFileMapper { + + /** + * 通过实体作为筛选条件查询 + * + * @param projectFile 实例对象 + * @return 对象列表 + */ + List queryAll(ProjectFile projectFile); + + /** + * 根据ID查详情 + */ + ProjectFile queryById(Integer id); + + + /** + * 新增数据 + */ + int insert(ProjectFile projectFile); + + + /** + * 修改数据 + */ + int update(ProjectFile projectFile); + + /** + * 通过主键删除数据 + */ + int deleteById(Integer id); + + /** + * 通过id批量删除 + */ + int batchRemove(Integer[] ids); + + void insertBatch(List addFileList); + + void updateBatch(List updateFileList); + + List listByIdAndType(@Param("relationIdList") List id, @Param("type") String type); +} diff --git a/pms-business/src/main/java/tech/unissense/pms/business/projectFile/service/IProjectFileService.java b/pms-business/src/main/java/tech/unissense/pms/business/projectFile/service/IProjectFileService.java new file mode 100644 index 0000000..a6c5654 --- /dev/null +++ b/pms-business/src/main/java/tech/unissense/pms/business/projectFile/service/IProjectFileService.java @@ -0,0 +1,53 @@ +package tech.unissense.pms.business.projectFile.service; + +import tech.unissense.pms.business.projectFile.domain.ProjectFile; + +import java.util.List; + +/** + * @Author ch + * @Desc (ProjectFile)表服务接口 + * @Date 2025-04-21 17:40:56 + */ +public interface IProjectFileService { + + /** + * 通过实体作为筛选条件查询 + */ + List queryAll(ProjectFile projectFile); + + + /** + * 根据ID查详情 + */ + ProjectFile queryById(Integer id); + + /** + * 新增数据 + */ + int insert(ProjectFile projectFile); + + /** + * 修改数据 + */ + int update(ProjectFile projectFile); + + /** + * 通过主键删除数据 + */ + int deleteById(Integer id); + + /** + * 通过id批量删除 + */ + int batchRemove(Integer[] ids); + + void insertBatch(List addFileList); + + void saveBatch(List updateFileList); + + List listByIdAndType(List projectId, String value); +} + + + diff --git a/pms-business/src/main/java/tech/unissense/pms/business/projectFile/service/impl/ProjectFileServiceImpl.java b/pms-business/src/main/java/tech/unissense/pms/business/projectFile/service/impl/ProjectFileServiceImpl.java new file mode 100644 index 0000000..43f6633 --- /dev/null +++ b/pms-business/src/main/java/tech/unissense/pms/business/projectFile/service/impl/ProjectFileServiceImpl.java @@ -0,0 +1,116 @@ +package tech.unissense.pms.business.projectFile.service.impl; + +import cn.hutool.core.collection.CollUtil; +import lombok.extern.slf4j.Slf4j; +import tech.unissense.pms.business.projectFile.domain.ProjectFile; +import tech.unissense.pms.business.projectFile.mapper.ProjectFileMapper; +import tech.unissense.pms.business.projectFile.service.IProjectFileService; +import org.springframework.stereotype.Service; +import tech.unissense.pms.common.utils.file.FileUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @Author ch + * @Desc (ProjectFile)表服务实现类 + * @Date 2025-04-21 17:40:56 + */ + +@Slf4j +@Service +public class ProjectFileServiceImpl implements IProjectFileService { + + @Resource + private ProjectFileMapper projectFileMapper; + + + /** + * 查询列表数据 + * + * @param projectFile 实例对象 + * @return 对象列表 + */ + @Override + public List queryAll(ProjectFile projectFile) { + List dataList = projectFileMapper.queryAll(projectFile); + return dataList; + } + + @Override + public ProjectFile queryById(Integer id) { + return projectFileMapper.queryById(id); + } + + + @Override + public int insert(ProjectFile projectFile) { + return projectFileMapper.insert(projectFile); + } + + + @Override + public int update(ProjectFile projectFile) { + return projectFileMapper.update(projectFile); + } + + + @Override + public int deleteById(Integer id) { + ProjectFile projectFile = projectFileMapper.queryById(id); + try { + FileUtils.deleteFile(projectFile.getFileUrl()); + } catch (Exception e) { + log.error("删除文件失败,失败详情:{}", e.getStackTrace()); + } + return projectFileMapper.deleteById(id); + } + + /** + * 通过id批量删除 + */ + @Override + public int batchRemove(Integer[] ids) { + return projectFileMapper.batchRemove(ids); + } + + @Override + public void insertBatch(List addFileList) { + projectFileMapper.insertBatch(addFileList); + } + + /** + * 附件目前只有删除和新增 没有修改 + * + * @param fileList + */ + @Override + public void saveBatch(List fileList) { + List addFileList = new ArrayList<>(); + + for (ProjectFile projectFile : fileList) { + //新增 + if (projectFile.getId() == null) { + addFileList.add(projectFile); + } + } + if (CollUtil.isNotEmpty(addFileList)) { + projectFileMapper.insertBatch(addFileList); + } + + + } + + @Override + public List listByIdAndType(List id, String type) { + if (CollUtil.isEmpty(id)) { + return Collections.emptyList(); + } + return projectFileMapper.listByIdAndType(id, type); + } +} + + + diff --git a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/domain/WorkLogger.java b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/domain/WorkLogger.java index 20164fa..d621e19 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/domain/WorkLogger.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/domain/WorkLogger.java @@ -6,6 +6,7 @@ import java.util.List; import lombok.Data; +import tech.unissense.pms.business.projectFile.domain.ProjectFile; import tech.unissense.pms.common.core.domain.BaseEntity; /** @@ -61,5 +62,7 @@ public class WorkLogger extends BaseEntity { private String title; private String versionNumber; + private List fileList; + } diff --git a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/impl/WorkLoggerServiceImpl.java b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/impl/WorkLoggerServiceImpl.java index 2a74b83..1fd87eb 100644 --- a/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/impl/WorkLoggerServiceImpl.java +++ b/pms-business/src/main/java/tech/unissense/pms/business/work/logger/service/impl/WorkLoggerServiceImpl.java @@ -6,6 +6,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import tech.unissense.pms.business.project.domain.Project; import tech.unissense.pms.business.project.service.IProjectService; +import tech.unissense.pms.business.projectFile.domain.ProjectFile; +import tech.unissense.pms.business.projectFile.service.IProjectFileService; import tech.unissense.pms.business.work.logger.domain.WorkLogger; import tech.unissense.pms.business.work.logger.mapper.WorkLoggerMapper; import tech.unissense.pms.business.work.logger.service.IWorkLoggerService; @@ -40,6 +42,9 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { @Autowired private ISysConfigService configService; + @Autowired + private IProjectFileService fileService; + /** * 通过ID查询单条数据 * @@ -48,13 +53,16 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { */ @Override public WorkLogger queryById(Integer id) { - return this.workLoggerMapper.queryById(id); + WorkLogger workLogger = this.workLoggerMapper.queryById(id); + List projectFiles = fileService.listByIdAndType(Collections.singletonList(id), ProjectFile.FileTypeEnum.LOGGER.getValue()); + workLogger.setFileList(projectFiles); + return workLogger; } /** * 分页查询 * - * @param workLogger 筛选条件 + * @param workLogger 筛选条件 * @param pageRequest 分页对象 * @return 查询结果 */ @@ -74,6 +82,16 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { public WorkLogger insert(WorkLogger workLogger) { verifyMaxWorkTime(workLogger); this.workLoggerMapper.insert(workLogger); + List fileList = workLogger.getFileList(); + if (CollUtil.isNotEmpty(fileList)) { + for (ProjectFile projectFile : fileList) { + projectFile.setFileType(ProjectFile.FileTypeEnum.LOGGER.getValue()); + projectFile.setLoggerId(workLogger.getLoggerId()); + projectFile.setProjectId(workLogger.getProjectId()); + projectFile.setDemandId(workLogger.getDemandId()); + } + fileService.saveBatch(fileList); + } return workLogger; } @@ -82,7 +100,7 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { WorkLogger queryParam = new WorkLogger(); queryParam.setLoggerDate(workLogger.getLoggerDate()); String remaining = this.getRemaining(queryParam); - if (new BigDecimal(remaining).compareTo(new BigDecimal(workLogger.getWorkTime()))<0){ + if (new BigDecimal(remaining).compareTo(new BigDecimal(workLogger.getWorkTime())) < 0) { throw new RuntimeException("超出最大可填写工时"); } } @@ -96,6 +114,16 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { @Override public WorkLogger update(WorkLogger workLogger) { this.workLoggerMapper.update(workLogger); + List fileList = workLogger.getFileList(); + if (CollUtil.isNotEmpty(fileList)) { + for (ProjectFile projectFile : fileList) { + projectFile.setFileType(ProjectFile.FileTypeEnum.LOGGER.getValue()); + projectFile.setLoggerId(workLogger.getLoggerId()); + projectFile.setProjectId(workLogger.getProjectId()); + projectFile.setDemandId(workLogger.getDemandId()); + } + fileService.saveBatch(fileList); + } return this.queryById(workLogger.getLoggerId()); } @@ -113,6 +141,14 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { @Override public List getInfo(WorkLogger workLogger) { List list = this.workLoggerMapper.list(workLogger); + List idList = list.stream().map(WorkLogger::getLoggerId).collect(Collectors.toList()); + List projectFiles = fileService.listByIdAndType(idList, ProjectFile.FileTypeEnum.LOGGER.getValue()); + Map> listMap = projectFiles.stream().collect(Collectors.groupingBy(ProjectFile::getLoggerId, Collectors.toList())); + if (CollUtil.isNotEmpty(listMap)) { + for (WorkLogger logger : list) { + logger.setFileList(listMap.getOrDefault(logger.getLoggerId(), Collections.emptyList())); + } + } return list; } @@ -121,10 +157,10 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { List calendar = workLoggerMapper.calendar(workLogger); Map calendarMap = calendar.stream().collect(Collectors.toMap( item -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, item.getLoggerDate()), Function.identity(), (v1, v2) -> v1)); - + LocalDate startDate = workLogger.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); LocalDate endDate = workLogger.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); - + List result = new ArrayList<>(); for (LocalDate localDate = startDate; !localDate.isAfter(endDate); localDate = localDate.plusDays(1)) { CalendarVo calendarVo = new CalendarVo(); @@ -135,7 +171,7 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { calendarVo.setWorkTime(temp != null ? temp.getWorkTime() : "0"); result.add(calendarVo); } - + return result; } @@ -202,7 +238,7 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { Map personWorkHourMap = workLoggers.stream() .collect(Collectors.toMap( WorkLogger::getCreateBy, - item->new BigDecimal(item.getWorkTime()), + item -> new BigDecimal(item.getWorkTime()), BigDecimal::add )); @@ -221,7 +257,7 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { Long userId = SecurityUtils.getLoginUser().getUserId(); // 设置用户ID和当天的零点时间 workLogger.setUserId(userId.intValue()); - if (workLogger.getLoggerDate()==null) { + if (workLogger.getLoggerDate() == null) { workLogger.setLoggerDate(DateUtils.getNowDate()); } workLogger.setLoggerDate(DateUtils.toDate(workLogger.getLoggerDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate())); @@ -231,7 +267,7 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { // 计算workTime之和 BigDecimal totalWorkTime = list.stream() - .map(item->new BigDecimal(item.getWorkTime())) // 假设WorkLogger有getWorkTime方法返回BigDecimal + .map(item -> new BigDecimal(item.getWorkTime())) // 假设WorkLogger有getWorkTime方法返回BigDecimal .reduce(BigDecimal.ZERO, BigDecimal::add); String configByKey = configService.selectConfigByKey("pms.work.dayTime"); // String dictLabel = DictUtils.getDictLabel("work_logger", "day_work_time"); @@ -251,7 +287,7 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { return items.stream() // 对每个项目项创建一个StaticsHourVo对象 .map(item -> createStaticsHourVo(nameExtractor.apply(item), workDayMap.getOrDefault(idExtractor.apply(item), BigDecimal.ZERO) - ,idExtractor.apply(item))) + , idExtractor.apply(item))) .collect(Collectors.toList()); } @@ -259,12 +295,12 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService { private List generateStaticsHourVoList(Map workDayMap) { return workDayMap.entrySet().stream() // 对每个用户创建一个StaticsHourVo对象 - .map(entry -> createStaticsHourVo(entry.getKey(), entry.getValue(),null)) + .map(entry -> createStaticsHourVo(entry.getKey(), entry.getValue(), null)) .collect(Collectors.toList()); } // 创建StaticsHourVo对象,计算工时并格式化为字符串 - private StaticsHourVo createStaticsHourVo(String name, BigDecimal workTime,Integer projectId) { + private StaticsHourVo createStaticsHourVo(String name, BigDecimal workTime, Integer projectId) { StaticsHourVo vo = new StaticsHourVo(); vo.setProjectId(projectId); vo.setName(name); diff --git a/pms-business/src/main/resources/mapper/business/ProjectFile/ProjectFileMapper.xml b/pms-business/src/main/resources/mapper/business/ProjectFile/ProjectFileMapper.xml new file mode 100644 index 0000000..dc3118f --- /dev/null +++ b/pms-business/src/main/resources/mapper/business/ProjectFile/ProjectFileMapper.xml @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + id, project_id, demand_id, logger_id, file_type, file_url, file_new_name, file_name, create_by, update_by, update_time, create_time + + + + + + + + + + + + + + INSERT INTO pms_project_file + + + project_id, + + + demand_id, + + + logger_id, + + + file_type, + + + file_url, + + + file_new_name, + + + file_name, + + + create_by, + + + update_by, + + + update_time, + + + create_time, + + + + + #{projectId}, + + + #{demandId}, + + + #{loggerId}, + + + #{fileType}, + + + #{fileUrl}, + + + #{fileNewName}, + + + #{fileName}, + + + #{createBy}, + + + #{updateBy}, + + + #{updateTime}, + + + #{createTime}, + + + + + INSERT INTO pms_project_file( project_id, demand_id, logger_id, file_type, file_url, file_new_name, file_name, create_by, create_time) + values + + (#{item.projectId},#{item.demandId},#{item.loggerId},#{item.fileType},#{item.fileUrl},#{item.fileNewName},#{item.fileName},#{item.createBy},#{item.createTime}) + + + + + + UPDATE pms_project_file + + + project_id = #{projectId}, + + + demand_id = #{demandId}, + + + logger_id = #{loggerId}, + + + file_type = #{fileType}, + + + file_url = #{fileUrl}, + + + file_new_name = #{fileNewName}, + + + file_name = #{fileName}, + + + create_by = #{createBy}, + + + update_by = #{updateBy}, + + + update_time = #{updateTime}, + + + create_time = #{createTime}, + + + WHERE id = #{id} + + + + UPDATE pms_project_file + + + project_id = #{item.projectId}, + + + demand_id = #{item.demandId}, + + + logger_id = #{item.loggerId}, + + + file_type = #{item.fileType}, + + + file_url = #{item.fileUrl}, + + + file_new_name = #{item.fileNewName}, + + + file_name = #{item.fileName}, + + + + update_by = #{item.updateBy}, + + + update_time = #{item.updateTime}, + + + + WHERE id = #{item.id} + + + + + + DELETE + FROM pms_project_file + WHERE id = #{id} + + + + + delete from pms_project_file where id in + + #{id} + + + + + + + diff --git a/pms-business/src/main/resources/mapper/business/WorkLogger/WorkLoggerMapper.xml b/pms-business/src/main/resources/mapper/business/WorkLogger/WorkLoggerMapper.xml index 1988d9c..ee589cf 100644 --- a/pms-business/src/main/resources/mapper/business/WorkLogger/WorkLoggerMapper.xml +++ b/pms-business/src/main/resources/mapper/business/WorkLogger/WorkLoggerMapper.xml @@ -312,6 +312,9 @@ create_time = #{createTime}, + + demand_id = #{demandId}, + where logger_id = #{loggerId} diff --git a/pms-common/src/main/java/tech/unissense/pms/common/core/domain/entity/SysUser.java b/pms-common/src/main/java/tech/unissense/pms/common/core/domain/entity/SysUser.java index d4398bb..d8f41c9 100644 --- a/pms-common/src/main/java/tech/unissense/pms/common/core/domain/entity/SysUser.java +++ b/pms-common/src/main/java/tech/unissense/pms/common/core/domain/entity/SysUser.java @@ -14,7 +14,7 @@ import tech.unissense.pms.common.xss.Xss; /** * 用户对象 sys_user - * + * * @author ruoyi */ public class SysUser extends BaseEntity @@ -89,6 +89,15 @@ public class SysUser extends BaseEntity /** 角色ID */ private Long roleId; + private List userIdList; + + public List getUserIdList() { + return userIdList; + } + + public void setUserIdList(List userIdList) { + this.userIdList = userIdList; + } public SysUser() { diff --git a/pms-system/src/main/resources/mapper/system/SysUserMapper.xml b/pms-system/src/main/resources/mapper/system/SysUserMapper.xml index 9685fb0..af4924e 100644 --- a/pms-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/pms-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -58,33 +58,45 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, + u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user + u + left join sys_dept d on u.dept_id = d.dept_id + where u.del_flag = '0' + + AND u.user_id = #{userId} + + + AND u.user_id in + + #{userId} + + + + AND u.user_name like concat('%', #{userName}, '%') + + + AND u.nick_name like concat('%', #{nickName}, '%') + + + AND u.status = #{status} + + + AND u.phonenumber like concat('%', #{phonenumber}, '%') + + + AND date_format(u.create_time,'%Y%m%d') >= date_format(#{params.beginTime},'%Y%m%d') + + + AND date_format(u.create_time,'%Y%m%d') <= date_format(#{params.endTime},'%Y%m%d') + + + AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, + ancestors) )) + + + ${params.dataScope} +