From ccfe6b8f3ea81387389e7a4dfeb54befb06e47f5 Mon Sep 17 00:00:00 2001 From: lcj <2331845269@qq.com> Date: Fri, 18 Jul 2025 19:32:34 +0800 Subject: [PATCH] =?UTF-8?q?[add]=20=E6=B7=BB=E5=8A=A0=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E5=92=8C=E5=88=86=E5=8C=85=E5=85=B3=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SubConstructionUserController.java | 4 +- .../SubConstructionUserFileController.java | 15 +- .../controller/SubContractorController.java | 12 +- .../SubContractorToolController.java | 2 +- .../controller/SubSubcontractController.java | 2 +- .../service/ISubContractorService.java | 8 + .../impl/SubContractorServiceImpl.java | 92 +++-- .../dromara/job/cycle/DeleteProjectCache.java | 6 + .../cycle/DeleteYs7DeviceCapturePicData.java | 2 + .../IncSyncValidProgressPlanIsDelay.java | 2 + .../job/cycle/IncSyncYs7DeviceData.java | 3 +- .../job/once/FullSyncYs7DeviceData.java | 2 + .../domain/vo/project/BusProjectVo.java | 5 - .../domain/vo/project/BusSubProjectVo.java | 5 + .../service/impl/BusProjectServiceImpl.java | 94 +++--- .../BusUserProjectRelevancyServiceImpl.java | 3 + .../controller/system/SysUserController.java | 4 + .../org/dromara/system/domain/SysDept.java | 10 +- .../dromara/system/domain/bo/SysDeptBo.java | 21 +- ...IsSubsetEnum.java => SysDeptTypeEnum.java} | 14 +- .../domain/enums/SysRoleIsSpecialEnum.java | 23 -- .../dromara/system/domain/vo/SysDeptVo.java | 21 +- .../dromara/system/mapper/SysDeptMapper.java | 6 +- .../service/impl/SysDeptServiceImpl.java | 317 ++++++++++-------- .../service/impl/SysUserServiceImpl.java | 51 ++- 25 files changed, 435 insertions(+), 289 deletions(-) rename xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/{SysDeptIsSubsetEnum.java => SysDeptTypeEnum.java} (51%) delete mode 100644 xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysRoleIsSpecialEnum.java diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserController.java index 930555a9..0e06ba67 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserController.java @@ -36,7 +36,7 @@ import java.util.List; @Validated @RequiredArgsConstructor @RestController -@RequestMapping("/project/constructionUser") +@RequestMapping("/contractor/constructionUser") public class SubConstructionUserController extends BaseController { private final ISubConstructionUserService constructionUserService; @@ -53,7 +53,7 @@ public class SubConstructionUserController extends BaseController { /** * 查询每个施工人员总的考勤列表 */ - @SaCheckPermission("contractor:attendance:list") + @SaCheckPermission(value = {"contractor:constructionUser:list", "project:attendance:list"}) @GetMapping("/list/attendance/total") public TableDataInfo listAttendanceTotal(SubConstructionUserAttendanceQueryReq req, PageQuery pageQuery) { diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserFileController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserFileController.java index 1d1c8d7f..3c2ecf8b 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserFileController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubConstructionUserFileController.java @@ -1,6 +1,7 @@ package org.dromara.contractor.controller; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; @@ -30,7 +31,7 @@ import java.util.List; @Validated @RequiredArgsConstructor @RestController -@RequestMapping("/project/constructionUserFile") +@RequestMapping("/contractor/constructionUserFile") public class SubConstructionUserFileController extends BaseController { private final ISubConstructionUserFileService constructionUserFileService; @@ -38,7 +39,7 @@ public class SubConstructionUserFileController extends BaseController { /** * 查询施工人员文件存储列表 */ - @SaCheckPermission("contractor:constructionUserFile:list") + @SaCheckPermission(value = {"project:constructionUserFile:list", "contractor:constructionUserFile:list"}, mode = SaMode.OR) @GetMapping("/list") public R> list(SubConstructionUserFileQueryReq req) { return R.ok(constructionUserFileService.queryList(req)); @@ -47,7 +48,7 @@ public class SubConstructionUserFileController extends BaseController { /** * 导出施工人员文件存储列表 */ - @SaCheckPermission("contractor:constructionUserFile:export") + @SaCheckPermission(value = {"project:constructionUserFile:export", "contractor:constructionUserFile:export"}, mode = SaMode.OR) @Log(title = "施工人员文件存储", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(SubConstructionUserFileQueryReq req, HttpServletResponse response) { @@ -58,7 +59,7 @@ public class SubConstructionUserFileController extends BaseController { /** * 下载施工人员文件存储模板 */ - @SaCheckPermission("contractor:constructionUserFile:export") + @SaCheckPermission(value = {"project:constructionUserFile:download", "contractor:constructionUserFile:download"}, mode = SaMode.OR) @Log(title = "施工人员文件存储", businessType = BusinessType.EXPORT) @RepeatSubmit() @PostMapping("/exportFileTemplate") @@ -69,7 +70,7 @@ public class SubConstructionUserFileController extends BaseController { /** * 上传施工人员文件压缩包,批量导入存储施工人员文件 */ - @SaCheckPermission("contractor:constructionUserFile:edit") + @SaCheckPermission(value = {"project:constructionUserFile:upload", "contractor:constructionUserFile:upload"}, mode = SaMode.OR) @Log(title = "施工人员文件存储", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping("/upload/zip") @@ -83,7 +84,7 @@ public class SubConstructionUserFileController extends BaseController { * * @param id 主键 */ - @SaCheckPermission("contractor:constructionUserFile:query") + @SaCheckPermission(value = {"project:constructionUserFile:query", "contractor:constructionUserFile:query"}, mode = SaMode.OR) @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) { @@ -93,7 +94,7 @@ public class SubConstructionUserFileController extends BaseController { /** * 保存施工人员文件存储详情信息 */ - @SaCheckPermission("contractor:constructionUserFile:edit") + @SaCheckPermission(value = {"project:constructionUserFile:save", "contractor:constructionUserFile:save"}, mode = SaMode.OR) @Log(title = "施工人员文件存储", businessType = BusinessType.INSERT) @PostMapping("/save") public R save(@RequestBody SubConstructionUserFileSaveReq req) { diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubContractorController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubContractorController.java index 5f3f2fe5..2d591680 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubContractorController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubContractorController.java @@ -34,7 +34,7 @@ import java.util.List; @Validated @RequiredArgsConstructor @RestController -@RequestMapping("/project/contractor") +@RequestMapping("/contractor/contractor") public class SubContractorController extends BaseController { private final ISubContractorService contractorService; @@ -48,6 +48,16 @@ public class SubContractorController extends BaseController { return contractorService.queryPageList(req, pageQuery); } + /** + * 查询没有绑定部门的分包单位列表 + */ + @SaCheckPermission("contractor:contractor:listNoDept") + @GetMapping("/listNoDept/{projectId}") + public List listNoDept(@NotNull(message = "项目主键不能为空") + @PathVariable Long projectId) { + return contractorService.queryListNoDept(projectId); + } + /** * 导出分包单位列表 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubContractorToolController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubContractorToolController.java index 61a9dc91..597ea618 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubContractorToolController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubContractorToolController.java @@ -33,7 +33,7 @@ import java.util.List; */ @Validated @RestController -@RequestMapping("/project/contractorTool") +@RequestMapping("/contractor/contractorTool") public class SubContractorToolController extends BaseController { @Resource diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubSubcontractController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubSubcontractController.java index 74ccca6e..dbaffff2 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubSubcontractController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/controller/SubSubcontractController.java @@ -31,7 +31,7 @@ import java.util.List; */ @Validated @RestController -@RequestMapping("/project/subcontract") +@RequestMapping("/contractor/subcontract") public class SubSubcontractController extends BaseController { @Resource diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubContractorService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubContractorService.java index c2a2d876..b94c6501 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubContractorService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubContractorService.java @@ -47,6 +47,14 @@ public interface ISubContractorService extends IService { */ List queryList(SubContractorQueryReq req); + /** + * 查询未绑定部门的分包单位列表 + * + * @param projectId 项目id + * @return 分包单位列表 + */ + List queryListNoDept(Long projectId); + /** * 新增分包单位 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubContractorServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubContractorServiceImpl.java index 3eb25641..e1b03ddb 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubContractorServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubContractorServiceImpl.java @@ -5,7 +5,6 @@ import cn.hutool.core.util.PhoneUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import jakarta.annotation.Resource; @@ -23,21 +22,21 @@ import org.dromara.contractor.domain.dto.contractor.SubContractorQueryReq; import org.dromara.contractor.domain.dto.contractor.SubContractorUpdateReq; import org.dromara.contractor.domain.vo.contractor.SubContractorVo; import org.dromara.contractor.mapper.SubContractorMapper; +import org.dromara.contractor.service.ISubConstructionUserService; import org.dromara.contractor.service.ISubContractorService; import org.dromara.project.domain.BusProject; -import org.dromara.contractor.service.ISubConstructionUserService; import org.dromara.project.service.IBusProjectService; -import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.system.service.ISysDeptService; -import org.dromara.system.service.ISysPostService; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.enums.SysDeptTypeEnum; +import org.dromara.system.mapper.SysDeptMapper; import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 分包单位Service业务层处理 @@ -55,11 +54,9 @@ public class SubContractorServiceImpl extends ServiceImpl queryListNoDept(Long projectId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SysDept::getDeptType, SysDeptTypeEnum.CONTRACT.getCode()); + lqw.isNotNull(SysDept::getContractorId); + List depts = deptMapper.selectList(lqw); + List idList = depts.stream().map(SysDept::getContractorId).toList(); + List contractorList = this.lambdaQuery() + .eq(SubContractor::getProjectId, projectId) + .notIn(CollUtil.isNotEmpty(idList), SubContractor::getId, idList) + .list(); + return contractorList.stream().map(contractor -> { + // 对象转封装类 + SubContractorVo contractorVo = new SubContractorVo(); + BeanUtils.copyProperties(contractor, contractorVo); + return contractorVo; + }).toList(); + } + /** * 新增分包单位 * @@ -131,26 +153,6 @@ public class SubContractorServiceImpl extends ServiceImpl projectIdList = contractorList.stream().map(SubContractor::getProjectId).toList(); projectService.validAuth(projectIdList, userId); // 判断当前分包公司下是否还包含施工人员 - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.in("contractor_id", ids); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SubConstructionUser::getContractorId, ids); if (constructionUserService.count(queryWrapper) > 0) { throw new ServiceException("删除分包单位失败,删除分包单位下存在施工人员", HttpStatus.BAD_REQUEST); } + // 判断当前分包公司是否绑定了部门 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(SysDept::getContractorId, ids); + List deptList = deptMapper.selectList(lqw); + if (CollUtil.isNotEmpty(deptList)) { + Map contractorMap = contractorList.stream() + .collect(Collectors.toMap(SubContractor::getId, Function.identity())); + Set contractorNames = new HashSet<>(); + for (SysDept dept : deptList) { + Long contractorId = dept.getContractorId(); + SubContractor contractor = contractorMap.get(contractorId); + if (contractor != null) { + contractorNames.add(contractor.getName()); + } + } + if (CollUtil.isNotEmpty(contractorNames)) { + String joinedNames = String.join(",", contractorNames); + throw new ServiceException("删除分包单位失败,以下单位已绑定部门:" + joinedNames, HttpStatus.BAD_REQUEST); + } + } } // 判断对应数据是否都存在 if (contractorList.size() != ids.size()) { diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/DeleteProjectCache.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/DeleteProjectCache.java index 171be542..70428614 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/DeleteProjectCache.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/DeleteProjectCache.java @@ -12,6 +12,12 @@ import org.springframework.stereotype.Component; import java.util.HashSet; import java.util.Set; +/** + * 清理项目缓存 + * + * @author lcj + * @date 2025/5/14 10:23 + */ @Slf4j @Component public class DeleteProjectCache { diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/DeleteYs7DeviceCapturePicData.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/DeleteYs7DeviceCapturePicData.java index 438418e8..19eb0f8a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/DeleteYs7DeviceCapturePicData.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/DeleteYs7DeviceCapturePicData.java @@ -11,6 +11,8 @@ import java.time.LocalDateTime; import java.util.Date; /** + * 清理萤石设备抓拍图片数据 + * * @author lcj * @date 2025/6/19 10:23 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncValidProgressPlanIsDelay.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncValidProgressPlanIsDelay.java index ff8eb222..9ec42e51 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncValidProgressPlanIsDelay.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncValidProgressPlanIsDelay.java @@ -7,6 +7,8 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** + * 判断施工进度是否延期 + * * @author lcj * @date 2025/5/29 9:38 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceData.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceData.java index 258e7900..b2607693 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceData.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/cycle/IncSyncYs7DeviceData.java @@ -6,11 +6,12 @@ import org.dromara.manager.ys7manager.Ys7Manager; import org.dromara.manager.ys7manager.vo.Ys7QueryDeviceResponseVo; import org.dromara.other.service.IOthYs7DeviceService; import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; import java.util.List; /** + * 定时同步摄像头设备数据 + * * @author lcj * @date 2025/6/17 9:33 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/once/FullSyncYs7DeviceData.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/once/FullSyncYs7DeviceData.java index c4a0de42..867f8d43 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/once/FullSyncYs7DeviceData.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/job/once/FullSyncYs7DeviceData.java @@ -11,6 +11,8 @@ import org.springframework.stereotype.Component; import java.util.List; /** + * 同步摄像头设备数据 + * * @author lcj * @date 2025/6/13 11:08 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java index 8db8bcc8..95f22abc 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusProjectVo.java @@ -161,11 +161,6 @@ public class BusProjectVo implements Serializable { @ExcelProperty(value = "安全协议书") private String securityAgreement; - /** - * 设计文件id - */ - private Long designId; - /** * 显示隐藏(0显示 1隐藏) */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectVo.java index c3403ff2..69f7aeef 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/project/BusSubProjectVo.java @@ -26,6 +26,11 @@ public class BusSubProjectVo implements Serializable { */ private String projectName; + /** + * 设计文件id + */ + private Long designId; + /** * 创建时间 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java index 9e9e13ba..5d2672b9 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusProjectServiceImpl.java @@ -9,7 +9,6 @@ import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -51,7 +50,7 @@ import org.dromara.project.service.IBusUserProjectRelevancyService; import org.dromara.quality.service.IQltKnowledgeDocumentService; import org.dromara.safety.service.IHseKnowledgeDocumentService; import org.dromara.system.domain.SysDept; -import org.dromara.system.domain.enums.SysDeptIsSubsetEnum; +import org.dromara.system.domain.enums.SysDeptTypeEnum; import org.dromara.system.mapper.SysDeptMapper; import org.dromara.workflow.service.IFlwDefinitionService; import org.springframework.beans.BeanUtils; @@ -154,19 +153,7 @@ public class BusProjectServiceImpl extends ServiceImpl queryPageList(BusProjectQueryReq req, PageQuery pageQuery) { - // 获取当前登录用户项目列表 - Long userId = LoginHelper.getUserId(); - List projectIdList = userProjectRelevancyService.lambdaQuery() - .select(BusUserProjectRelevancy::getProjectId) - .eq(BusUserProjectRelevancy::getUserId, userId) - .list() - .stream().map(BusUserProjectRelevancy::getProjectId).toList(); LambdaQueryWrapper lqw = this.buildQueryWrapper(req); - if (CollUtil.isEmpty(projectIdList)) { - return TableDataInfo.build(new Page<>()); - } else { - lqw.in(BusProject::getId, projectIdList); - } // 查询数据库 Page result = this.page(pageQuery.build(), lqw); return TableDataInfo.build(this.getVoPage(result)); @@ -192,16 +179,14 @@ public class BusProjectServiceImpl extends ServiceImpl queryListNoDept() { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(SysDept::getIsSubset, SysDeptIsSubsetEnum.NO.getCode()); + lqw.eq(SysDept::getDeptType, SysDeptTypeEnum.PROJECT.getCode()); lqw.isNotNull(SysDept::getProjectId); List depts = deptMapper.selectList(lqw); List idList = depts.stream().map(SysDept::getProjectId).toList(); - List allProjectList = this.lambdaQuery() + List projectList = this.lambdaQuery() + .notIn(CollUtil.isNotEmpty(idList), BusProject::getId, idList) .eq(BusProject::getPId, BusProjectConstant.PARENT_ID) .list(); - List projectList = allProjectList.stream() - .filter(project -> !idList.contains(project.getId())) - .toList(); return projectList.stream().map(this::getVo).toList(); } @@ -351,16 +336,11 @@ public class BusProjectServiceImpl extends ServiceImpl userIdList = new HashSet<>(List.of(userId, SystemConstants.SUPER_ADMIN_ID)); - List userProjectRelevancyList = userIdList.stream().map(id -> { - BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy(); - userProjectRelevancy.setUserId(id); - userProjectRelevancy.setProjectId(projectId); - return userProjectRelevancy; - }).toList(); - boolean saveRelevancy = userProjectRelevancyService.saveBatch(userProjectRelevancyList); + // 保存管理员与项目关联 + BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy(); + userProjectRelevancy.setUserId(SystemConstants.SUPER_ADMIN_ID); + userProjectRelevancy.setProjectId(projectId); + boolean saveRelevancy = userProjectRelevancyService.save(userProjectRelevancy); if (!saveRelevancy) { throw new ServiceException("新增用户与项目关联失败,数据库异常", HttpStatus.ERROR); } @@ -446,6 +426,7 @@ public class BusProjectServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); - queryWrapper.in("project_id", ids); - boolean removeRelevancyList = userProjectRelevancyService.remove(queryWrapper); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(BusUserProjectRelevancy::getProjectId, ids); + boolean removeRelevancyList = userProjectRelevancyService.remove(lqw); if (!removeRelevancyList) { throw new ServiceException("删除项目与用户关联失败,数据库异常", HttpStatus.ERROR); } @@ -566,24 +547,29 @@ public class BusProjectServiceImpl extends ServiceImpl subProjectList = this.lambdaQuery() .select(BusProject::getId, BusProject::getProjectName, BusProject::getCreateTime) .eq(BusProject::getPId, project.getId()) .list(); - List subProjectVoList = subProjectList.stream().map(subProject -> { - BusSubProjectVo subProjectVo = new BusSubProjectVo(); - BeanUtils.copyProperties(subProject, subProjectVo); - return subProjectVo; - }).toList(); - projectVo.setChildren(subProjectVoList); + if (CollUtil.isNotEmpty(subProjectList)) { + List subIdList = subProjectList.stream().map(BusProject::getId).toList(); + // 关联设计id + List projectFileList = projectFileService.lambdaQuery() + .in(BusProjectFile::getProjectId, subIdList) + .list(); + Map> map = projectFileList.stream().collect(Collectors.groupingBy(BusProjectFile::getProjectId)); + List subProjectVoList = subProjectList.stream().map(subProject -> { + BusSubProjectVo subProjectVo = new BusSubProjectVo(); + BeanUtils.copyProperties(subProject, subProjectVo); + Long id = subProject.getId(); + if (map.containsKey(id)) { + subProjectVo.setDesignId(map.get(id).getFirst().getId()); + } + return subProjectVo; + }).toList(); + projectVo.setChildren(subProjectVoList); + } return projectVo; } @@ -654,15 +640,17 @@ public class BusProjectServiceImpl extends ServiceImpl projectIdList = projectList.stream().map(BusProject::getId).collect(Collectors.toSet()); - Map> projectFileMap = projectFileService.lambdaQuery() - .in(BusProjectFile::getProjectId, projectIdList).list() - .stream().collect(Collectors.groupingBy(BusProjectFile::getProjectId)); // 获取子项目列表 List subProjectList = this.lambdaQuery() .select(BusProject::getId, BusProject::getPId, BusProject::getProjectName, BusProject::getCreateTime) .in(BusProject::getPId, projectIdList) .list(); + Set subIdList = subProjectList.stream().map(BusProject::getId).collect(Collectors.toSet()); Map> subProjectMap = subProjectList.stream().collect(Collectors.groupingBy(BusProject::getPId)); + Map> projectFileMap = projectFileService.lambdaQuery() + .in(CollUtil.isNotEmpty(subIdList), BusProjectFile::getProjectId, subIdList).list() + .stream().collect(Collectors.groupingBy(BusProjectFile::getProjectId)); + // 对象列表 => 封装对象列表 List projectVoList = projectList.stream().map(project -> { // 对象转封装类 @@ -674,17 +662,17 @@ public class BusProjectServiceImpl extends ServiceImpl projectFileList = projectFileMap.get(project.getId()); - if (CollUtil.isNotEmpty(projectFileList)) { - projectVo.setDesignId(projectFileList.getFirst().getId()); - } // 关联子项目 List subProjectVoList = new ArrayList<>(); if (subProjectMap.containsKey(project.getId())) { subProjectVoList = subProjectMap.get(project.getId()).stream().map(subProject -> { BusSubProjectVo subProjectVo = new BusSubProjectVo(); BeanUtils.copyProperties(subProject, subProjectVo); + Long id = subProject.getId(); + // 关联设计id + if (projectFileMap.containsKey(id)) { + subProjectVo.setDesignId(projectFileMap.get(id).getFirst().getId()); + } return subProjectVo; }).toList(); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java index 0b14e671..b8b64d77 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusUserProjectRelevancyServiceImpl.java @@ -299,6 +299,9 @@ public class BusUserProjectRelevancyServiceImpl extends ServiceImpl list = this.list(queryWrapper); List projectIdList = list.stream().map(BusUserProjectRelevancy::getProjectId).toList(); + if (CollUtil.isEmpty(projectIdList)) { + return new ArrayList<>(); + } Map> projectMap = projectService.lambdaQuery() .select(BusProject::getId, BusProject::getPId, BusProject::getProjectName, BusProject::getShortName) .in(BusProject::getId, projectIdList) diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index 91ecd0ba..7a6b8ef9 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -169,6 +169,8 @@ public class SysUserController extends BaseController { deptService.checkDeptMatchRole(user.getUserId(), List.of(user.getRoleIds())); if (!userService.checkUserNameUnique(user)) { return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isEmpty(user.getPhonenumber())) { + return R.fail("新增用户'" + user.getUserName() + "'失败,手机号不能为空"); } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { @@ -196,6 +198,8 @@ public class SysUserController extends BaseController { deptService.checkDeptMatchRole(user.getUserId(), List.of(user.getRoleIds())); if (!userService.checkUserNameUnique(user)) { return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isEmpty(user.getPhonenumber())) { + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号不能为空"); } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java index 551111f3..c3729ab4 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java @@ -14,7 +14,6 @@ import java.io.Serial; * * @author Lion Li */ - @Data @EqualsAndHashCode(callSuper = true) @TableName("sys_dept") @@ -39,6 +38,11 @@ public class SysDept extends TenantEntity { */ private Long projectId; + /** + * 分包公司ID + */ + private Long contractorId; + /** * 部门名称 */ @@ -91,8 +95,8 @@ public class SysDept extends TenantEntity { private String isShow; /** - * 是否子集(0否 1是) + * 部门类型 */ - private String isSubset; + private String deptType; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java index 440abeb3..4ff5babb 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java @@ -7,6 +7,8 @@ import lombok.EqualsAndHashCode; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.system.domain.SysDept; +import java.io.Serial; + /** * 部门业务对象 sys_dept * @@ -18,6 +20,9 @@ import org.dromara.system.domain.SysDept; @AutoMapper(target = SysDept.class, reverseConvertGenerate = false) public class SysDeptBo extends BaseEntity { + @Serial + private static final long serialVersionUID = -7462841004330805895L; + /** * 部门id */ @@ -33,6 +38,16 @@ public class SysDeptBo extends BaseEntity { */ private Long projectId; + /** + * 项目部门项目id + */ + private Long rowProjectId; + + /** + * 分包公司ID + */ + private Long contractorId; + /** * 部门名称 */ @@ -82,10 +97,10 @@ public class SysDeptBo extends BaseEntity { private String isShow; /** - * 是否子集(0否 1是) + * 部门类型 */ - @Pattern(regexp = "^[01]$", message = "isSubset字段值必须是0或1") - private String isSubset; + @NotBlank(message = "部门类型不能为空") + private String deptType; // /** diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysDeptIsSubsetEnum.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysDeptTypeEnum.java similarity index 51% rename from xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysDeptIsSubsetEnum.java rename to xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysDeptTypeEnum.java index 76722700..a4d76420 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysDeptIsSubsetEnum.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysDeptTypeEnum.java @@ -4,21 +4,23 @@ import lombok.Getter; /** * @author lcj - * @date 2025/7/10 9:25 + * @date 2025/7/18 9:41 */ @Getter -public enum SysDeptIsSubsetEnum { +public enum SysDeptTypeEnum { - YES("1", "是"), - - NO("0", "否"); + NORMAL("1", "正常"), + SPECIAL("2", "特殊"), + PROJECT("3", "项目"), + CONTRACT("4", "分包"); private final String code; private final String message; - SysDeptIsSubsetEnum(String code, String message) { + SysDeptTypeEnum(String code, String message) { this.code = code; this.message = message; } + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysRoleIsSpecialEnum.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysRoleIsSpecialEnum.java deleted file mode 100644 index 7a534d0d..00000000 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/enums/SysRoleIsSpecialEnum.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.dromara.system.domain.enums; - -import lombok.Getter; - -/** - * @author lcj - * @date 2025/7/10 9:26 - */ -@Getter -public enum SysRoleIsSpecialEnum { - - YES("1", "是"), - NO("0", "否"); - - private final String code; - - private final String message; - - SysRoleIsSpecialEnum(String code, String message) { - this.code = code; - this.message = message; - } -} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java index cb19f7f7..c8a72834 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java @@ -6,6 +6,7 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.contractor.domain.vo.contractor.SubContractorVo; import org.dromara.project.domain.vo.project.BusProjectVo; import org.dromara.system.domain.SysDept; @@ -43,17 +44,31 @@ public class SysDeptVo implements Serializable { */ private String parentName; + /** + * 父部门信息 + */ + private SysDeptVo parent; /** * 项目id */ private Long projectId; + /** + * 分包公司ID + */ + private Long contractorId; + /** * 未绑定项目信息 */ private List projectList; + /** + * 未绑定分包信息 + */ + private List contractorList; + /** * 祖级列表 */ @@ -107,9 +122,11 @@ public class SysDeptVo implements Serializable { private String status; /** - * 是否子集(0否 1是) + * 部门类型 */ - private String isSubset; + @ExcelProperty(value = "部门类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_dept_type") + private String deptType; /** * 创建时间 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index ff89df77..aa7bd504 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -78,19 +78,19 @@ public interface SysDeptMapper extends BaseMapperPlus { @Select(""" WITH RECURSIVE dept_tree AS ( - SELECT dept_id, parent_id, project_id, is_subset + SELECT dept_id, parent_id, project_id, dept_type FROM sys_dept WHERE dept_id = #{deptId} UNION ALL - SELECT d.dept_id, d.parent_id, d.project_id, d.is_subset + SELECT d.dept_id, d.parent_id, d.project_id, d.dept_type FROM sys_dept d INNER JOIN dept_tree dt ON d.parent_id = dt.dept_id ) SELECT DISTINCT project_id FROM dept_tree - WHERE is_subset = '0' AND project_id IS NOT NULL + WHERE dept_type = '3' AND project_id IS NOT NULL """) List getProjectIdsByDept(@Param("deptId") Long deptId); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index b50d4f2c..1cd17fb8 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -20,6 +20,9 @@ import org.dromara.common.core.utils.*; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.redis.utils.CacheUtils; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.contractor.domain.SubContractor; +import org.dromara.contractor.domain.vo.contractor.SubContractorVo; +import org.dromara.contractor.service.ISubContractorService; import org.dromara.project.domain.BusProject; import org.dromara.project.domain.vo.project.BusProjectVo; import org.dromara.project.service.IBusProjectService; @@ -28,7 +31,7 @@ import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.system.domain.enums.SysDeptIsSubsetEnum; +import org.dromara.system.domain.enums.SysDeptTypeEnum; import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysRoleMapper; @@ -40,10 +43,7 @@ import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; /** * 部门管理 服务实现 @@ -59,6 +59,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { private final SysRoleMapper roleMapper; private final SysUserMapper userMapper; private final IBusProjectService projectService; + private final ISubContractorService contractorService; private final IBusUserProjectRelevancyService userProjectRelevancyService; /** @@ -96,7 +97,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); lqw.eq(StringUtils.isNotBlank(bo.getIsShow()), SysDept::getIsShow, bo.getIsShow()); - lqw.eq(StringUtils.isNotBlank(bo.getIsSubset()), SysDept::getIsSubset, bo.getIsSubset()); + lqw.eq(StringUtils.isNotBlank(bo.getDeptType()), SysDept::getDeptType, bo.getDeptType()); lqw.orderByAsc(SysDept::getAncestors); lqw.orderByAsc(SysDept::getParentId); lqw.orderByAsc(SysDept::getOrderNum); @@ -127,7 +128,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { .setName(dept.getDeptName()) .setWeight(dept.getOrderNum()) .putExtra("disabled", SystemConstants.DISABLE.equals(dept.getStatus())); - tree.putExtra("isSubset", dept.getIsSubset()); + tree.putExtra("deptType", dept.getDeptType()); } ); Tree tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId()); @@ -165,12 +166,23 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { SysDeptVo parentDept = baseMapper.selectVoOne(new LambdaQueryWrapper() .select(SysDept::getDeptName).eq(SysDept::getDeptId, dept.getParentId())); dept.setParentName(ObjectUtils.notNullGetter(parentDept, SysDeptVo::getDeptName)); + dept.setParent(parentDept); + String deptType = dept.getDeptType(); + // 获取未绑定项目信息 List projectVos = new ArrayList<>(projectService.queryListNoDept()); - if (dept.getIsSubset().equals(SysDeptIsSubsetEnum.NO.getCode()) && dept.getProjectId() != null) { + // 获取项目部门绑定的项目信息 + if (deptType.equals(SysDeptTypeEnum.PROJECT.getCode()) && dept.getProjectId() != null) { BusProjectVo vo = projectService.getVo(projectService.getById(dept.getProjectId())); projectVos.add(vo); } dept.setProjectList(projectVos); + // 如果为分包部门,获取分包部门信息 + if (deptType.equals(SysDeptTypeEnum.CONTRACT.getCode())) { + List contractorVos = new ArrayList<>(contractorService.queryListNoDept(dept.getProjectId())); + SubContractorVo vo = contractorService.getVo(contractorService.getById(dept.getContractorId())); + contractorVos.add(vo); + dept.setContractorList(contractorVos); + } return dept; } @@ -386,78 +398,84 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { if (!SystemConstants.NORMAL.equals(info.getStatus())) { throw new ServiceException("部门停用,不允许新增"); } - if (SysDeptIsSubsetEnum.NO.getCode().equals(info.getIsSubset())) { + String pDeptType = info.getDeptType(); + String deptType = bo.getDeptType(); + if (SysDeptTypeEnum.SPECIAL.getCode().equals(pDeptType) || SysDeptTypeEnum.CONTRACT.getCode().equals(pDeptType)) { + // 父部门为特殊部门或者项目部门,不允许新增子部门 throw new ServiceException("当前部门不允许有子部门"); + } else if (SysDeptTypeEnum.PROJECT.getCode().equals(pDeptType) && !SysDeptTypeEnum.CONTRACT.getCode().equals(deptType)) { + // 父部门为项目部门,只能新增分包部门 + throw new ServiceException("项目部门只能新增分包部门"); } SysDept dept = MapstructUtils.convert(bo, SysDept.class); if (dept == null) { throw new ServiceException("新增部门参数异常", HttpStatus.BAD_REQUEST); } dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId()); - String isSubset = bo.getIsSubset(); - if (SysDeptIsSubsetEnum.NO.getCode().equals(isSubset)) { + if (SysDeptTypeEnum.PROJECT.getCode().equals(deptType)) { + // 项目部门 Long projectId = bo.getProjectId(); - if (projectId != null) { - BusProject project = projectService.getById(projectId); - if (project == null) { - throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND); - } - // 判断该项目是否被绑定 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysDept::getProjectId, projectId); - Long l = baseMapper.selectCount(queryWrapper); - if (l > 0) { - throw new ServiceException("该项目已被其他部门绑定", HttpStatus.CONFLICT); - } - dept.setProjectId(projectId); - // 判断是否有需要新增项目关联的用户 - List deptIds = this.getParentDeptIds(dept); - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.select(SysUser::getUserId); - lqw.in(SysUser::getDeptId, deptIds); - List userIds = userMapper.selectList(lqw).stream().map(SysUser::getUserId).toList(); - if (CollUtil.isNotEmpty(userIds)) { - userProjectRelevancyService.saveBatchByUserList(projectId, userIds); - } + BusProject project = projectService.getById(projectId); + if (project == null) { + throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND); } + // 判断该项目是否被绑定 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysDept::getProjectId, projectId); + Long l = baseMapper.selectCount(queryWrapper); + if (l > 0) { + throw new ServiceException("该项目已被其他部门绑定", HttpStatus.CONFLICT); + } + dept.setProjectId(projectId); + // 判断是否有需要新增项目关联的用户 + List deptIds = this.getParentAndSiblingDeptIds(dept); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(SysUser::getUserId); + lqw.in(SysUser::getDeptId, deptIds); + List userIds = userMapper.selectList(lqw).stream() + .map(SysUser::getUserId) + .filter(userId -> !LoginHelper.isSuperAdmin(userId)) + .toList(); + if (CollUtil.isNotEmpty(userIds)) { + userProjectRelevancyService.saveBatchByUserList(projectId, userIds); + } + } else if (SysDeptTypeEnum.CONTRACT.getCode().equals(deptType)) { + // 分包部门 + Long projectId = bo.getRowProjectId(); + BusProject project = projectService.getById(projectId); + if (project == null) { + throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND); + } + Long contractorId = bo.getContractorId(); + SubContractor contractor = contractorService.getById(contractorId); + if (contractor == null) { + throw new ServiceException("分包方不存在", HttpStatus.NOT_FOUND); + } + if (!contractor.getProjectId().equals(projectId)) { + throw new ServiceException("分包方不属于当前项目,请重新选择", HttpStatus.BAD_REQUEST); + } + // 判断该项目是否被绑定 + Long projectCount = baseMapper.selectCount( + new LambdaQueryWrapper() + .eq(SysDept::getProjectId, projectId) + ); + if (projectCount <= 0) { + throw new ServiceException("所选项目未绑定部门,请先将项目绑定部门", HttpStatus.BAD_REQUEST); + } + // 判断该分包方是否被绑定 + Long contractorCount = baseMapper.selectCount( + new LambdaQueryWrapper() + .eq(SysDept::getContractorId, contractorId) + ); + if (contractorCount > 0) { + throw new ServiceException("该分包方已被其他部门绑定", HttpStatus.CONFLICT); + } + dept.setProjectId(projectId); + dept.setContractorId(contractorId); } return baseMapper.insert(dept); -// // cory 判断是否需要直接新增角色 -// SysRoleBo role = getSysRoleBo(bo); -// roleService.checkRoleAllowed(role); -// if (!roleService.checkRoleNameUnique(role)) { -// throw new ServiceException("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); -// } else if (!roleService.checkRoleKeyUnique(role)) { -// throw new ServiceException("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); -// } -// roleService.insertRole(role); -// SysDept sysDept = new SysDept(); -// sysDept.setDeptId(dept.getDeptId()); -// sysDept.setRoleId(role.getRoleId()); -// baseMapper.updateById(sysDept); -// return insert; } -// @NotNull -// private static SysRoleBo getSysRoleBo(SysDeptBo bo) { -// SysRoleBo role = new SysRoleBo(); -// role.setRoleName(bo.getDeptName()); -// role.setRoleKey(bo.getRoleKey()); -// role.setRoleSort(bo.getRoleSort()); -// role.setDataScope(bo.getDataScope()); -// role.setMenuCheckStrictly(bo.getMenuCheckStrictly()); -// role.setDeptCheckStrictly(bo.getDeptCheckStrictly()); -// role.setStatus(bo.getRoleStatus()); -// role.setRemark(bo.getRemark()); -// role.setMenuIds(bo.getMenuIds()); -// role.setDeptIds(bo.getDeptIds()); -// role.setIsSpecial("1"); //特殊角色(部门无子集标识特殊角色) -// if (bo.getRoleId() != null) { -// role.setRoleId(bo.getRoleId()); -// } -// return role; -// } - /** * 修改保存部门信息 * @@ -489,42 +507,71 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { } else { dept.setAncestors(oldDept.getAncestors()); } - // 新增逻辑:判断是否需要更新用户与项目的关联 - String isSubset = dept.getIsSubset(); - Long oldProjectId = oldDept.getProjectId(); - Long newProjectId = dept.getProjectId(); - if (SysDeptIsSubsetEnum.NO.getCode().equals(isSubset) && newProjectId != null) { - // 检查新项目是否存在 - BusProject project = projectService.getById(newProjectId); - if (project == null) { - throw new ServiceException("关联项目不存在", HttpStatus.NOT_FOUND); - } - // 判断新项目是否被绑定 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysDept::getProjectId, newProjectId); - Long l = baseMapper.selectCount(queryWrapper); - if (l > 0) { - throw new ServiceException("该项目已被其他部门绑定", HttpStatus.CONFLICT); - } - // 获取当前部门及其上级部门 ID 列表 - List deptIds = this.getParentDeptIds(dept); - // 获取部门用户 ID - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.select(SysUser::getUserId); - lqw.in(SysUser::getDeptId, deptIds); - List userIds = userMapper.selectList(lqw).stream() - .map(SysUser::getUserId) - .toList(); - if (CollUtil.isNotEmpty(userIds)) { - // 情况 1:原本有项目,且项目 ID 改变 → 删除旧的,添加新的 - if (oldProjectId != null && !Objects.equals(oldProjectId, newProjectId)) { - userProjectRelevancyService.deleteByProjectAndUserIds(oldProjectId, userIds); - userProjectRelevancyService.saveBatchByUserList(newProjectId, userIds); + String deptType = dept.getDeptType(); + if (SysDeptTypeEnum.PROJECT.getCode().equals(deptType)) { + // 判断是否需要更新用户与项目的关联 + Long oldProjectId = oldDept.getProjectId(); + Long newProjectId = dept.getProjectId(); + if (newProjectId != null && !Objects.equals(oldProjectId, newProjectId)) { + // 检查新项目是否存在 + BusProject project = projectService.getById(newProjectId); + if (project == null) { + throw new ServiceException("关联项目不存在", HttpStatus.NOT_FOUND); } - // 情况 2:原本没有项目,现在新增了 → 直接添加 - if (oldProjectId == null) { - userProjectRelevancyService.saveBatchByUserList(newProjectId, userIds); + // 判断新项目是否被绑定 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysDept::getProjectId, newProjectId); + Long l = baseMapper.selectCount(queryWrapper); + if (l > 0) { + throw new ServiceException("该项目已被其他部门绑定", HttpStatus.CONFLICT); } + // 获取当前部门及其上级部门 ID 列表 + List deptIds = this.getParentAndSiblingDeptIds(dept); + // 获取部门用户 ID + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(SysUser::getUserId); + lqw.in(SysUser::getDeptId, deptIds); + List userIds = userMapper.selectList(lqw).stream() + .map(SysUser::getUserId) + .filter(userId -> !LoginHelper.isSuperAdmin(userId)) + .toList(); + if (CollUtil.isNotEmpty(userIds)) { + // 情况 1:原本有项目,且项目 ID 改变 → 删除旧的,添加新的 + if (oldProjectId != null) { + userProjectRelevancyService.deleteByProjectAndUserIds(oldProjectId, userIds); + userProjectRelevancyService.saveBatchByUserList(newProjectId, userIds); + } else { + // 情况 2:原本没有项目,现在新增了 → 直接添加 + userProjectRelevancyService.saveBatchByUserList(newProjectId, userIds); + } + } + dept.setProjectId(newProjectId); + } + } else if (SysDeptTypeEnum.CONTRACT.getCode().equals(deptType)) { + Long oldContractorId = oldDept.getContractorId(); + Long newContractorId = dept.getContractorId(); + if (!oldDept.getProjectId().equals(dept.getProjectId())) { + throw new ServiceException("分包方不属于当前项目,请重新选择", HttpStatus.BAD_REQUEST); + } + if (newContractorId != null && !Objects.equals(oldContractorId, newContractorId)) { + SubContractor contractor = contractorService.getById(newContractorId); + // 检查分包方是否存在 + if (contractor == null) { + throw new ServiceException("关联分包方不存在", HttpStatus.NOT_FOUND); + } + // 检查分包方所属项目是否与当前部门所属项目一致 + if (!contractor.getProjectId().equals(dept.getProjectId())) { + throw new ServiceException("分包方不属于当前项目,请重新选择", HttpStatus.BAD_REQUEST); + } + // 判断新选择分包方是否被绑定 + Long contractorCount = baseMapper.selectCount( + new LambdaQueryWrapper() + .eq(SysDept::getContractorId, newContractorId) + ); + if (contractorCount > 0) { + throw new ServiceException("该分包方已被其他部门绑定", HttpStatus.CONFLICT); + } + dept.setContractorId(newContractorId); } } int result = baseMapper.updateById(dept); @@ -534,23 +581,6 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { updateParentDeptStatusNormal(dept); } return result; -// if (bo.getIsSubset().equals("1")) { -// return result; -// } -// // cory 角色修改 -// SysRoleBo role = getSysRoleBo(bo); -// roleService.checkRoleAllowed(role); -// roleService.checkRoleDataScope(role.getRoleId()); -// if (!roleService.checkRoleNameUnique(role)) { -// throw new ServiceException("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); -// } else if (!roleService.checkRoleKeyUnique(role)) { -// throw new ServiceException("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); -// } -// if (roleService.updateRole(role) > 0) { -// roleService.cleanOnlineUserByRole(role.getRoleId()); -// return result; -// } -// throw new ServiceException("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); } /** @@ -606,26 +636,51 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { } /** - * 获取部门以及父部门ID列表 + * 获取当前部门的祖先ID、自己ID、以及所有祖先的“同级部门ID” * - * @param dept 部门 - * @return 部门ID列表 + * @param dept 当前部门 + * @return 部门ID列表(祖先、自身、父级的同级) */ - public List getParentDeptIds(SysDept dept) { - List deptIds = new ArrayList<>(); - - if (StringUtils.isNotBlank(dept.getAncestors())) { - String[] ids = dept.getAncestors().split(","); - for (String id : ids) { - if (!"0".equals(id)) { - deptIds.add(Long.parseLong(id)); + public List getParentAndSiblingDeptIds(SysDept dept) { + Set deptIds = new LinkedHashSet<>(); + // 同级是否有特殊部门 + Long parentId = dept.getParentId(); + if (parentId != null) { + // 获取父级部门同级特殊部门(不包括它自己) + List siblingDepts = baseMapper.selectList( + new LambdaQueryWrapper() + .eq(SysDept::getParentId, parentId) + .eq(SysDept::getDeptType, SysDeptTypeEnum.SPECIAL.getCode()) + .ne(SysDept::getDeptId, dept.getDeptId()) + ); + if (CollUtil.isNotEmpty(siblingDepts)) { + for (SysDept sibling : siblingDepts) { + deptIds.add(sibling.getDeptId()); + } + } + } + // 祖先ID列表 + if (StringUtils.isNotBlank(dept.getAncestors())) { + String[] ancestorIds = dept.getAncestors().split(","); + for (String ancestorIdStr : ancestorIds) { + if (!"0".equals(ancestorIdStr)) { + Long ancestorId = Long.parseLong(ancestorIdStr); + deptIds.add(ancestorId); + // 获取该父级的同级部门(不包括它自己) + List siblingDepts = baseMapper.selectList( + new LambdaQueryWrapper() + .eq(SysDept::getParentId, baseMapper.selectById(ancestorId).getParentId()) + .ne(SysDept::getDeptId, ancestorId) + ); + for (SysDept sibling : siblingDepts) { + deptIds.add(sibling.getDeptId()); + } } } } - // 加上自己 deptIds.add(dept.getDeptId()); - return deptIds; + return new ArrayList<>(deptIds); } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 2ef5bd94..4333ef5a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -23,13 +23,12 @@ import org.dromara.common.core.utils.*; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.project.domain.dto.userprojectrelevancy.BusUserProjectRelevancyCreateReq; import org.dromara.project.service.IBusUserProjectRelevancyService; import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.vo.SysPostVo; -import org.dromara.system.domain.vo.SysRoleVo; -import org.dromara.system.domain.vo.SysUserExportVo; -import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.domain.enums.SysDeptTypeEnum; +import org.dromara.system.domain.vo.*; import org.dromara.system.mapper.*; import org.dromara.system.service.ISysDeptService; import org.dromara.system.service.ISysUserFileService; @@ -334,9 +333,19 @@ public class SysUserServiceImpl implements ISysUserService, UserService { insertUserPost(user, false); // 新增用户与角色管理 insertUserRole(user, false); - // 关联部门所属项目 - List projectIds = deptService.selectProjectIdById(user.getDeptId()); - userProjectRelevancyService.saveBatchByProjectList(projectIds, user.getUserId()); + Long deptId = user.getDeptId(); + SysDeptVo deptVo = deptService.selectDeptById(deptId); + if (deptVo.getDeptType().equals(SysDeptTypeEnum.CONTRACT.getCode())) { + // 关联分包部门所属项目 + BusUserProjectRelevancyCreateReq req = new BusUserProjectRelevancyCreateReq(); + req.setUserId(user.getUserId()); + req.setProjectId(deptVo.getProjectId()); + userProjectRelevancyService.insertByBo(req); + } else { + // 关联部门所属项目 + List projectIds = deptService.selectProjectIdById(deptId); + userProjectRelevancyService.saveBatchByProjectList(projectIds, user.getUserId()); + } return rows; } @@ -369,17 +378,35 @@ public class SysUserServiceImpl implements ISysUserService, UserService { insertUserRole(user, true); // 新增用户与岗位管理 insertUserPost(user, true); + // 获取旧的系统用户 + SysUser oldUser = baseMapper.selectById(user.getUserId()); SysUser sysUser = MapstructUtils.convert(user, SysUser.class); // 防止错误更新后导致的数据误删除 int flag = baseMapper.updateById(sysUser); if (flag < 1) { throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); } - // 先删除旧关联 - userProjectRelevancyService.deleteByUserId(user.getUserId()); - // 添加新关联 - List projectIds = deptService.selectProjectIdById(user.getDeptId()); - userProjectRelevancyService.saveBatchByProjectList(projectIds, user.getUserId()); + // 没有修改部门则不需要修改用户与项目的关联 + if (oldUser.getDeptId().equals(user.getDeptId())) { + return flag; + } + Long deptId = user.getDeptId(); + SysDeptVo deptVo = deptService.selectDeptById(deptId); + if (deptVo.getDeptType().equals(SysDeptTypeEnum.CONTRACT.getCode())) { + // 先删除旧关联 + userProjectRelevancyService.deleteByUserId(user.getUserId()); + // 添加新关联 + BusUserProjectRelevancyCreateReq req = new BusUserProjectRelevancyCreateReq(); + req.setUserId(user.getUserId()); + req.setProjectId(deptVo.getProjectId()); + userProjectRelevancyService.insertByBo(req); + } else { + // 先删除旧关联 + userProjectRelevancyService.deleteByUserId(user.getUserId()); + // 添加新关联 + List projectIds = deptService.selectProjectIdById(user.getDeptId()); + userProjectRelevancyService.saveBatchByProjectList(projectIds, user.getUserId()); + } return flag; }