修改权限逻辑

This commit is contained in:
lcj
2025-09-15 10:57:19 +08:00
parent 1bc2743dc7
commit 70537f34c4
137 changed files with 5988 additions and 426 deletions

View File

@ -11,7 +11,7 @@ RUN mkdir -p /ruoyi/system/logs \
WORKDIR /ruoyi/system
ENV SERVER_PORT=9201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
ENV SERVER_PORT=19201 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
EXPOSE ${SERVER_PORT}

View File

@ -0,0 +1,31 @@
package org.dromara.system.controller.constant;
/**
* 项目常量
*
* @author lilemy
* @date 2025/5/13 10:33
*/
public interface BusProjectConstant {
/**
* 项目天气封装信息缓存的 Redis Key 前缀
*/
String PROJECT_WEATHER_LIST_VO_REDIS_KEY_PREFIX = "project:weather:list";
/**
* 项目安全生产天数缓存的 Redis Key 前缀
*/
String PROJECT_SAFETY_DAYS_REDIS_KEY_PREFIX = "project:safetyDays";
/**
* 项目缓存的 Redis Key 前缀
*/
String PROJECT_CACHE_REDIS_KEY_PREFIX = "project";
/**
* 父级id
*/
Long PARENT_ID = 0L;
}

View File

@ -0,0 +1,169 @@
package org.dromara.system.controller.project;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.dto.project.*;
import org.dromara.system.domain.vo.project.BusProjectSafetyDayVo;
import org.dromara.system.domain.vo.project.BusProjectVo;
import org.dromara.system.domain.vo.project.BusSubProjectVo;
import org.dromara.system.service.IBusProjectService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 项目
*
* @author lilemy
* @date 2025-03-04
*/
@Validated
@RestController
@RequestMapping("/project/project")
public class BusProjectController extends BaseController {
@Resource
private IBusProjectService projectService;
/**
* 切换项目
*
* @param id 项目id
*/
@GetMapping("/changeProject/{id}")
public R<Void> changeUserProject(@NotNull(message = "项目id不能为空")
@PathVariable Long id) {
return toAjax(projectService.changeUserProject(id));
}
/**
* 查询项目列表
*/
@SaCheckPermission("project:project:list")
@GetMapping("/list")
public TableDataInfo<BusProjectVo> list(BusProjectQueryReq req, PageQuery pageQuery) {
return projectService.queryPageList(req, pageQuery);
}
/**
* 查询项目下的子项目列表
*/
@SaCheckPermission("project:project:listSub")
@GetMapping("/list/sub/{id}")
public R<List<BusSubProjectVo>> listSubProject(@NotNull(message = "项目id不能为空")
@PathVariable Long id) {
return R.ok(projectService.querySubList(id));
}
/**
* 导出项目列表
*/
@SaCheckPermission("project:project:export")
@Log(title = "项目", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BusProjectQueryReq req, HttpServletResponse response) {
List<BusProjectVo> list = projectService.queryList(req);
ExcelUtil.exportExcel(list, "项目", BusProjectVo.class, response);
}
/**
* 获取项目详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:project:query")
@GetMapping("/{id}")
public R<BusProjectVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(projectService.queryById(id));
}
/**
* 新增项目
*/
@SaCheckPermission("project:project:add")
@Log(title = "项目", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Long> add(@Validated(AddGroup.class) @RequestBody BusProjectCreateReq req) {
if (req == null) {
throw new ServiceException("参数不能为空", HttpStatus.BAD_REQUEST);
}
return R.ok(projectService.insertByBo(req));
}
/**
* 新增子项目
*/
@SaCheckPermission("project:project:sub")
@Log(title = "项目", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/sub")
public R<Long> addSub(@Validated(AddGroup.class) @RequestBody BusProjectCreateSubReq req) {
if (req == null) {
throw new ServiceException("参数不能为空", HttpStatus.BAD_REQUEST);
}
return R.ok(projectService.insertSubByProject(req));
}
/**
* 修改项目
*/
@SaCheckPermission("project:project:edit")
@Log(title = "项目", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BusProjectUpdateReq req) {
return toAjax(projectService.updateByBo(req));
}
/**
* 保存项目招标文件
*/
@SaCheckPermission("project:project:saveTenderFile")
@Log(title = "项目", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/save/tender/file")
public R<Void> uploadTenderFile(@RequestBody BusProjectSaveTenderFileReq req) {
return toAjax(projectService.saveTenderFile(req));
}
/**
* 删除项目
*
* @param ids 主键串
*/
@SaCheckPermission("project:project:remove")
@Log(title = "项目", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(projectService.deleteWithValidByIds(List.of(ids), true));
}
/**
* 查询项目安全天数
*/
@GetMapping("/safetyDay/{id}")
public R<BusProjectSafetyDayVo> getSafetyDay(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(projectService.getSafetyDay(id));
}
}

View File

@ -0,0 +1,82 @@
package org.dromara.system.controller.project;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.dto.projectfile.BusProjectFileQueryReq;
import org.dromara.system.domain.dto.projectfile.BusProjectFileUpdateReq;
import org.dromara.system.domain.vo.projectfile.BusProjectFileVo;
import org.dromara.system.service.IBusProjectFileService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 项目文件存储
*
* @author lilemy
* @date 2025-04-23
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/project/projectFile")
public class BusProjectFileController extends BaseController {
private final IBusProjectFileService busProjectFileService;
/**
* 查询项目文件存储列表
*/
@SaCheckPermission("project:projectFile:list")
@GetMapping("/list")
public TableDataInfo<BusProjectFileVo> list(BusProjectFileQueryReq req, PageQuery pageQuery) {
return busProjectFileService.queryPageList(req, pageQuery);
}
/**
* 获取项目文件存储详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:projectFile:query")
@GetMapping("/{id}")
public R<BusProjectFileVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(busProjectFileService.queryById(id));
}
/**
* 修改项目文件存储
*/
@SaCheckPermission("project:projectFile:edit")
@Log(title = "项目文件存储", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BusProjectFileUpdateReq req) {
return toAjax(busProjectFileService.updateByBo(req));
}
/**
* 删除项目文件存储
*
* @param ids 主键串
*/
@SaCheckPermission("project:projectFile:remove")
@Log(title = "项目文件存储", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busProjectFileService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,116 @@
package org.dromara.system.controller.project;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsCreateReq;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsGisReq;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsQueryReq;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsUpdateReq;
import org.dromara.system.domain.vo.projectnews.BusProjectNewsGisVo;
import org.dromara.system.domain.vo.projectnews.BusProjectNewsVo;
import org.dromara.system.service.IBusProjectNewsService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 项目新闻
*
* @author lilemy
* @date 2025-04-28
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/project/projectNews")
public class BusProjectNewsController extends BaseController {
private final IBusProjectNewsService busProjectNewsService;
/**
* 查询项目新闻列表
*/
@SaCheckPermission("project:projectNews:list")
@GetMapping("/list")
public TableDataInfo<BusProjectNewsVo> list(BusProjectNewsQueryReq req, PageQuery pageQuery) {
return busProjectNewsService.queryPageList(req, pageQuery);
}
/**
* 导出项目新闻列表
*/
@SaCheckPermission("project:projectNews:export")
@Log(title = "项目新闻", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BusProjectNewsQueryReq req, HttpServletResponse response) {
List<BusProjectNewsVo> list = busProjectNewsService.queryList(req);
ExcelUtil.exportExcel(list, "项目新闻", BusProjectNewsVo.class, response);
}
/**
* 查询大屏项目新闻列表
*/
@GetMapping("/list/gis")
public R<List<BusProjectNewsGisVo>> listGis(BusProjectNewsGisReq req) {
return R.ok(busProjectNewsService.queryGisList(req));
}
/**
* 获取项目新闻详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:projectNews:query")
@GetMapping("/{id}")
public R<BusProjectNewsVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(busProjectNewsService.queryById(id));
}
/**
* 新增项目新闻
*/
@SaCheckPermission("project:projectNews:add")
@Log(title = "项目新闻", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Long> add(@Validated @RequestBody BusProjectNewsCreateReq req) {
return R.ok(busProjectNewsService.insertByBo(req));
}
/**
* 修改项目新闻
*/
@SaCheckPermission("project:projectNews:edit")
@Log(title = "项目新闻", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated @RequestBody BusProjectNewsUpdateReq req) {
return toAjax(busProjectNewsService.updateByBo(req));
}
/**
* 删除项目新闻
*
* @param ids 主键串
*/
@SaCheckPermission("project:projectNews:remove")
@Log(title = "项目新闻", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busProjectNewsService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,106 @@
package org.dromara.system.controller.project;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.bo.BusProjectPunchrangeBo;
import org.dromara.system.domain.vo.projectpunchrange.BusProjectPunchrangeVo;
import org.dromara.system.service.IBusProjectPunchrangeService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 项目打卡范围
*
* @author Lion Li
* @date 2025-07-28
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/project/projectPunchrange")
public class BusProjectPunchrangeController extends BaseController {
private final IBusProjectPunchrangeService busProjectPunchrangeService;
/**
* 查询项目打卡范围列表
*/
@SaCheckPermission("project:projectPunchrange:list")
@GetMapping("/list")
public TableDataInfo<BusProjectPunchrangeVo> list(BusProjectPunchrangeBo bo, PageQuery pageQuery) {
return busProjectPunchrangeService.queryPageList(bo, pageQuery);
}
/**
* 导出项目打卡范围列表
*/
@SaCheckPermission("project:projectPunchrange:export")
@Log(title = "项目打卡范围", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BusProjectPunchrangeBo bo, HttpServletResponse response) {
List<BusProjectPunchrangeVo> list = busProjectPunchrangeService.queryList(bo);
ExcelUtil.exportExcel(list, "项目打卡范围", BusProjectPunchrangeVo.class, response);
}
/**
* 获取项目打卡范围详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:projectPunchrange:query")
@GetMapping("/{id}")
public R<BusProjectPunchrangeVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(busProjectPunchrangeService.queryById(id));
}
/**
* 新增项目打卡范围
*/
@SaCheckPermission("project:projectPunchrange:add")
@Log(title = "项目打卡范围", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BusProjectPunchrangeBo bo) {
return toAjax(busProjectPunchrangeService.insertByBo(bo));
}
/**
* 修改项目打卡范围
*/
@SaCheckPermission("project:projectPunchrange:edit")
@Log(title = "项目打卡范围", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BusProjectPunchrangeBo bo) {
return toAjax(busProjectPunchrangeService.updateByBo(bo));
}
/**
* 删除项目打卡范围
*
* @param ids 主键串
*/
@SaCheckPermission("project:projectPunchrange:remove")
@Log(title = "项目打卡范围", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busProjectPunchrangeService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,165 @@
package org.dromara.system.controller.project;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
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.common.web.core.BaseController;
import org.dromara.system.domain.BusUserProjectRelevancy;
import org.dromara.system.domain.dto.project.BusProjectBatchByProjectListReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyCreateReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyQueryReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyUpdateReq;
import org.dromara.system.domain.vo.userprojectrelevancy.BusLoginUserProjectRelevancyVo;
import org.dromara.system.domain.vo.userprojectrelevancy.BusUserProjectRelevancyVo;
import org.dromara.system.service.IBusUserProjectRelevancyService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 系统用户与项目关联
*
* @author lilemy
* @date 2025-03-04
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/project/projectRelevancy")
public class BusUserProjectRelevancyController extends BaseController {
private final IBusUserProjectRelevancyService userProjectRelevancyService;
/**
* 查询用户与项目关联列表
*/
@SaCheckPermission("project:projectRelevancy:list")
@GetMapping("/list")
public TableDataInfo<BusUserProjectRelevancyVo> list(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery) {
return userProjectRelevancyService.queryPageList(req, pageQuery);
}
/**
* 查询登录用户与项目关联列表
*/
@GetMapping("/login/list")
public R<List<BusLoginUserProjectRelevancyVo>> listByLoginUser() {
Long userId = LoginHelper.getUserId();
return R.ok(userProjectRelevancyService.queryListByUserId(userId));
}
/**
* 查询登录用户与项目关联分页
*/
@GetMapping("/login/page")
public TableDataInfo<BusUserProjectRelevancyVo> pageByLoginUser(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery) {
Long userId = LoginHelper.getUserId();
return userProjectRelevancyService.queryPageByUserId(userId, req, pageQuery);
}
/**
* 导出用户与项目关联列表
*/
@SaCheckPermission("project:projectRelevancy:export")
@Log(title = "系统用户与项目关联", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BusUserProjectRelevancyQueryReq req, HttpServletResponse response) {
List<BusUserProjectRelevancyVo> list = userProjectRelevancyService.queryList(req);
ExcelUtil.exportExcel(list, "系统用户与项目关联", BusUserProjectRelevancyVo.class, response);
}
/**
* 获取用户与项目关联详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:projectRelevancy:query")
@GetMapping("/{id}")
public R<BusUserProjectRelevancyVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(userProjectRelevancyService.queryById(id));
}
/**
* 新增用户与项目关联
*/
@SaCheckPermission("project:projectRelevancy:add")
@Log(title = "系统用户与项目关联", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Long> add(@Validated @RequestBody BusUserProjectRelevancyCreateReq req) {
return R.ok(userProjectRelevancyService.insertByBo(req));
}
/**
* 新增用户与项目列表关联
*/
@SaCheckPermission("project:projectRelevancy:addProjectList")
@Log(title = "系统用户与项目关联", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/add/project/list")
public R<Boolean> addBatchByProjectList(@RequestBody BusProjectBatchByProjectListReq req) {
Boolean result = userProjectRelevancyService.insertBatchByProjectList(req);
return R.ok(result);
}
/**
* 移除用户与项目列表关联
*/
@SaCheckPermission("project:projectRelevancy:removeProjectList")
@Log(title = "系统用户与项目关联", businessType = BusinessType.INSERT)
@RepeatSubmit()
@DeleteMapping("/remove/project/list")
public R<Boolean> removeBatchByProjectList(@RequestBody BusProjectBatchByProjectListReq req) {
Long userId = req.getUserId();
List<Long> projectIdList = req.getProjectIdList();
QueryWrapper<BusUserProjectRelevancy> wrapper = new QueryWrapper<>();
wrapper.eq("user_id", userId).in("project_id", projectIdList);
boolean result = userProjectRelevancyService.remove(wrapper);
/* List<UserProjectRelevancy> userProjectRelevancyList = Arrays.stream(projectIdList).map(projectId -> {
UserProjectRelevancy userProjectRelevancy = new UserProjectRelevancy();
userProjectRelevancy.setUserId(userId);
userProjectRelevancy.setProjectId(projectId);
return userProjectRelevancy;
}).toList();
boolean result = userProjectRelevancyService.removeBatchByIds(userProjectRelevancyList);*/
return R.ok(result);
}
/**
* 修改用户与项目关联
*/
@SaCheckPermission("project:projectRelevancy:edit")
@Log(title = "系统用户与项目关联", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated @RequestBody BusUserProjectRelevancyUpdateReq req) {
return toAjax(userProjectRelevancyService.updateByBo(req));
}
/**
* 删除用户与项目关联
*
* @param ids 主键串
*/
@SaCheckPermission("project:projectRelevancy:remove")
@Log(title = "系统用户与项目关联", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(userProjectRelevancyService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -2,6 +2,7 @@ package org.dromara.system.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.tree.Tree;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.R;
@ -56,6 +57,15 @@ public class SysDeptController extends BaseController {
return R.ok(depts);
}
/**
* 根据项目id获取部门树以及岗位列表
*/
@GetMapping("/list/tree")
public R<List<Tree<Long>>> listTreeByProjectId() {
List<Tree<Long>> tree = deptService.buildDeptTree();
return R.ok(tree);
}
/**
* 根据部门编号获取详细信息
*

View File

@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.lang.tree.Tree;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.constant.TenantConstants;
@ -23,6 +24,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 菜单信息
@ -42,9 +44,15 @@ public class SysMenuController extends BaseController {
*
* @return 路由信息
*/
@GetMapping("/getRouters")
public R<List<RouterVo>> getRouters() {
List<SysMenu> menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId());
@GetMapping("/getRouters/{projectId}")
public R<List<RouterVo>> getRouters(@NotNull(message = "项目主键不能为空")
@PathVariable Long projectId, String menuSource) {
List<SysMenu> menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId(), projectId);
if ("2".equals(menuSource)) {
menus = menus.stream().filter(menu -> "2".equals(menu.getMenuSource())).collect(Collectors.toList());
} else {
menus = menus.stream().filter(menu -> "1".equals(menu.getMenuSource())).collect(Collectors.toList());
}
return R.ok(menuService.buildMenus(menus));
}
@ -94,7 +102,9 @@ public class SysMenuController extends BaseController {
*/
@SaCheckPermission("system:menu:query")
@GetMapping(value = "/roleMenuTreeselect/{roleId}")
public R<MenuTreeSelectVo> roleMenuTreeselect(@PathVariable("roleId") Long roleId) {
public R<MenuTreeSelectVo> roleMenuTreeselect(@PathVariable("roleId") Long roleId, String menuSource) {
SysMenuBo sysMenuBo = new SysMenuBo();
sysMenuBo.setMenuSource(menuSource);
List<SysMenuVo> menus = menuService.selectMenuList(LoginHelper.getUserId());
MenuTreeSelectVo selectVo = new MenuTreeSelectVo(
menuService.selectMenuListByRoleId(roleId),

View File

@ -15,6 +15,7 @@ import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.domain.vo.SysRoleVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysDeptService;
@ -49,6 +50,15 @@ public class SysRoleController extends BaseController {
return roleService.selectPageRoleList(role, pageQuery);
}
/**
* 获取角色信息列表(不分页)
*/
@SaCheckPermission("system:role:list")
@GetMapping("/listNoPage")
public R<List<SysRoleVo>> listNoPage(SysRoleBo role) {
return R.ok(roleService.selectRoleList(role));
}
/**
* 导出角色信息列表
*/
@ -85,6 +95,17 @@ public class SysRoleController extends BaseController {
} else if (!roleService.checkRoleKeyUnique(role)) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
}
Long deptId = role.getDeptId();
if (deptId == null) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,请选择关联的部门");
}
SysDeptVo deptVo = deptService.selectDeptById(deptId);
if (deptVo == null) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,关联的部门不存在");
}
if (deptVo.getParentId() == 0) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,关联的部门不能为顶级部门");
}
return toAjax(roleService.insertRole(role));
}
@ -103,7 +124,17 @@ public class SysRoleController extends BaseController {
} else if (!roleService.checkRoleKeyUnique(role)) {
return R.fail("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
}
Long deptId = role.getDeptId();
if (deptId == null) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,请选择关联的部门");
}
SysDeptVo deptVo = deptService.selectDeptById(deptId);
if (deptVo == null) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,关联的部门不存在");
}
if (deptVo.getParentId() == 0) {
return R.fail("新增角色'" + role.getRoleName() + "'失败,关联的部门不能为顶级部门");
}
if (roleService.updateRole(role) > 0) {
roleService.cleanOnlineUserByRole(role.getRoleId());
return R.ok();

View File

@ -1,14 +1,13 @@
package org.dromara.system.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.crypto.digest.BCrypt;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.BCrypt;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
@ -25,8 +24,8 @@ import org.dromara.common.web.core.BaseController;
import org.dromara.system.api.model.LoginUser;
import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.bo.SysPostBo;
import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.dto.role.SysRoleProjectDto;
import org.dromara.system.domain.vo.*;
import org.dromara.system.listener.SysUserImportListener;
import org.dromara.system.service.*;
@ -134,7 +133,7 @@ public class SysUserController extends BaseController {
userService.checkUserDataScope(userId);
SysUserVo sysUser = userService.selectUserById(userId);
userInfoVo.setUser(sysUser);
userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId));
// userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId));
Long deptId = sysUser.getDeptId();
if (ObjectUtil.isNotNull(deptId)) {
SysPostBo postBo = new SysPostBo();
@ -142,11 +141,12 @@ public class SysUserController extends BaseController {
userInfoVo.setPosts(postService.selectPostList(postBo));
userInfoVo.setPostIds(postService.selectPostListByUserId(userId));
}
userInfoVo.setProjectRoles(roleService.selectRoleProjectList(userId));
}
SysRoleBo roleBo = new SysRoleBo();
/* SysRoleBo roleBo = new SysRoleBo();
roleBo.setStatus(SystemConstants.NORMAL);
List<SysRoleVo> roles = roleService.selectRoleList(roleBo);
userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin()));
userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin()));*/
return R.ok(userInfoVo);
}
@ -158,8 +158,17 @@ public class SysUserController extends BaseController {
@PostMapping
public R<Void> add(@Validated @RequestBody SysUserBo user) {
deptService.checkDeptDataScope(user.getDeptId());
// 去重后的所有 roleId
List<Long> roleList = user.getProjectRoles().stream()
.filter(dto -> dto.getRoleIds() != null)
.flatMap(dto -> dto.getRoleIds().stream())
.distinct()
.toList();
deptService.checkDeptMatchRole(user.getUserId(), roleList);
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)) {
@ -184,8 +193,17 @@ public class SysUserController extends BaseController {
userService.checkUserAllowed(user.getUserId());
userService.checkUserDataScope(user.getUserId());
deptService.checkDeptDataScope(user.getDeptId());
// 去重后的所有 roleId
List<Long> roleList = user.getProjectRoles().stream()
.filter(dto -> dto.getRoleIds() != null)
.flatMap(dto -> dto.getRoleIds().stream())
.distinct()
.toList();
deptService.checkDeptMatchRole(user.getUserId(), roleList);
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)) {
@ -268,15 +286,15 @@ public class SysUserController extends BaseController {
/**
* 用户授权角色
*
* @param userId 用户Id
* @param roleIds 角色ID串
* @param userId 用户Id
* @param projectRoles 项目、角色关联列表
*/
@SaCheckPermission("system:user:edit")
@Log(title = "用户管理", businessType = BusinessType.GRANT)
@PutMapping("/authRole")
public R<Void> insertAuthRole(Long userId, Long[] roleIds) {
public R<Void> insertAuthRole(Long userId, List<SysRoleProjectDto> projectRoles) {
userService.checkUserDataScope(userId);
userService.insertUserAuth(userId, roleIds);
userService.insertUserAuth(userId, projectRoles);
return R.ok();
}

View File

@ -0,0 +1,159 @@
package org.dromara.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.util.Date;
/**
* 项目对象 project
*
* @author lilemy
* @date 2025-03-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("bus_project")
public class BusProject extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id")
private Long id;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 父项目ID
*/
private Long parentId;
/**
* 状态0正常 1停用
*/
private String status;
/**
* 项目图片
*/
private String picUrl;
/**
* 经度
*/
private String lng;
/**
* 纬度
*/
private String lat;
/**
* 备注
*/
private String remark;
/**
* 项目类型
*/
private String projectType;
/**
* 项目阶段
*/
private String projectStage;
/**
* 删除时间
*/
private Date deletedAt;
/**
* 项目地址
*/
private String projectSite;
/**
* 负责人
*/
private String principal;
/**
* 负责人电话
*/
private String principalPhone;
/**
* 实际容量
*/
private String actual;
/**
* 计划容量
*/
private String plan;
/**
* 开工时间
*/
private String onStreamTime;
/**
* 打卡范围09:00,18:00
*/
private String punchRange;
/**
* 设计总量
*/
private Long designTotal;
/**
* 安全协议书
*/
private String securityAgreement;
/**
* 招标文件
*/
private String tenderFiles;
/**
* 项目概括
*/
private String projectGeneralize;
/**
* 排序字段
*/
private Long sort;
/**
* 显示隐藏0显示 1隐藏
*/
private String showHidden;
/**
* 是否删除0正常 1删除
*/
@TableLogic
private Long isDelete;
}

View File

@ -0,0 +1,65 @@
package org.dromara.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 项目文件存储对象 bus_project_file
*
* @author lilemy
* @date 2025-04-23
*/
@Data
@TableName("bus_project_file")
public class BusProjectFile implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id")
private Long id;
/**
* 项目id
*/
private Long projectId;
/**
* 文件类型
*/
private String fileType;
/**
* 文件名称
*/
private String fileName;
/**
* 文件路径
*/
private String filePath;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}

View File

@ -0,0 +1,51 @@
package org.dromara.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
/**
* 项目新闻对象 bus_project_news
*
* @author lilemy
* @date 2025-04-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("bus_project_news")
public class BusProjectNews extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id")
private Long id;
/**
* 项目id
*/
private Long projectId;
/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
/**
* 附件
*/
private String file;
}

View File

@ -0,0 +1,50 @@
package org.dromara.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 项目打卡范围对象 bus_project_punchrange
*
* @author Lion Li
* @date 2025-07-28
*/
@Data
@TableName("bus_project_punchrange")
public class BusProjectPunchrange implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "id")
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 范围名称
*/
private String punchName;
/**
* 打卡范围
*/
private String punchRange;
/**
* 颜色
*/
private String punchColor;
}

View File

@ -0,0 +1,44 @@
package org.dromara.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 系统用户与项目关联对象 user_project_relevancy
*
* @author lilemy
* @date 2025-03-04
*/
@Data
@TableName("bus_user_project_relevancy")
public class BusUserProjectRelevancy implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 项目ID
*/
private Long projectId;
/**
* 用户类型(0系统管理员 1普通人员 2项目管理员)
*/
private String userType;
}

View File

@ -106,6 +106,11 @@ public class SysMenu extends BaseEntity {
@TableField(exist = false)
private String parentName;
/**
* 菜单类型(menu_source) 1-web2-app
*/
private String menuSource;
/**
* 子菜单
*/

View File

@ -26,6 +26,11 @@ public class SysRole extends TenantEntity {
@TableId(value = "role_id")
private Long roleId;
/**
* 部门ID
*/
private Long deptId;
/**
* 角色名称
*/

View File

@ -26,4 +26,9 @@ public class SysUserRole {
*/
private Long roleId;
/**
* 项目ID
*/
private Long projectId;
}

View File

@ -0,0 +1,51 @@
package org.dromara.system.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.system.domain.BusProjectPunchrange;
/**
* 项目打卡范围业务对象 bus_project_punchrange
*
* @author Lion Li
* @date 2025-07-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BusProjectPunchrange.class, reverseConvertGenerate = false)
public class BusProjectPunchrangeBo extends BaseEntity {
/**
*
*/
@NotNull(message = "不能为空", groups = {EditGroup.class})
private Long id;
/**
* 项目ID
*/
@NotNull(message = "项目ID不能为空", groups = {AddGroup.class, EditGroup.class})
private Long projectId;
/**
* 范围名称
*/
private String punchName;
/**
* 打卡范围
*/
private String punchRange;
/**
* 颜色
*/
private String punchColor;
}

View File

@ -0,0 +1,39 @@
package org.dromara.system.domain.bo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
/**
* @Author 铁憨憨
* @Date 2025/7/28 19:15
* @Version 1.0
*/
@Data
public class Punchrange implements Serializable {
/**
* 项目ID
*/
@NotNull(message = "项目ID不能为空")
private Long projectId;
/**
* 范围名称
*/
@NotNull(message = "范围名称不能为空")
private String punchName;
/**
* 打卡范围
*/
@NotNull(message = "打卡范围不能为空")
private String punchRange;
/**
* 颜色
*/
@NotNull(message = "颜色不能为空")
private String punchColor;
}

View File

@ -7,6 +7,8 @@ import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.system.domain.SysDept;
import java.util.List;
/**
* 部门业务对象 sys_dept
*
@ -33,16 +35,6 @@ public class SysDeptBo extends BaseEntity {
*/
private Long projectId;
/**
* 项目部门项目id
*/
private Long rowProjectId;
/**
* 分包公司ID
*/
private Long contractorId;
/**
* 部门名称
*/
@ -96,9 +88,8 @@ public class SysDeptBo extends BaseEntity {
*/
@NotBlank(message = "部门类型不能为空")
private String deptType;
// /**
// * 归属部门id部门树
// */
// private Long belongDeptId;
private List<String> deptTypes;
}

View File

@ -107,5 +107,10 @@ public class SysMenuBo extends BaseEntity {
*/
private String remark;
/**
* 菜单类型(menu_source) 1-web2-app
*/
private String menuSource;
}

View File

@ -28,6 +28,16 @@ public class SysRoleBo extends BaseEntity {
*/
private Long roleId;
/**
* 部门ID
*/
private Long deptId;
/**
* 角色类型 1-web 2-app
*/
private String roleSource;
/**
* 角色名称
*/

View File

@ -11,6 +11,9 @@ import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.xss.Xss;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.dto.role.SysRoleProjectDto;
import java.util.List;
/**
* 用户信息业务对象 sys_user
@ -98,6 +101,11 @@ public class SysUserBo extends BaseEntity {
*/
private Long[] postIds;
/**
* 项目角色关联
*/
private List<SysRoleProjectDto> projectRoles;
/**
* 数据权限 当前角色ID
*/

View File

@ -0,0 +1,29 @@
package org.dromara.system.domain.dto.project;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author lilemy
* @date 2025/3/5 17:16
*/
@Data
public class BusProjectBatchByProjectListReq implements Serializable {
@Serial
private static final long serialVersionUID = -3366498681076059844L;
/**
* 用户ID
*/
private Long userId;
/**
* 项目ID列表
*/
private List<Long> projectIdList;
}

View File

@ -0,0 +1,127 @@
package org.dromara.system.domain.dto.project;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 14:05
*/
@Data
public class BusProjectCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = -7603153089205421154L;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 项目图片
*/
private String picUrl;
/**
* 经度
*/
private String lng;
/**
* 纬度
*/
private String lat;
/**
* 备注
*/
private String remark;
/**
* 项目类型
*/
private String projectType;
/**
* 项目阶段
*/
private String projectStage;
/**
* 项目地址
*/
private String projectSite;
/**
* 负责人
*/
private String principal;
/**
* 负责人电话
*/
private String principalPhone;
/**
* 实际容量
*/
private String actual;
/**
* 计划容量
*/
private String plan;
/**
* 开工时间
*/
private String onStreamTime;
/**
* 打卡时间开始
*/
private String playCardStart;
/**
* 打卡时间结束
*/
private String playCardEnd;
/**
* 设计总量
*/
private Long designTotal;
/**
* 安全协议书
*/
private String securityAgreement;
/**
* 招标文件
*/
private String tenderFiles;
/**
* 项目概括
*/
private String projectGeneralize;
/**
* 排序字段
*/
private Long sort;
/**
* 显示隐藏0显示 1隐藏
*/
private String showHidden;
}

View File

@ -0,0 +1,28 @@
package org.dromara.system.domain.dto.project;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/6/6 11:57
*/
@Data
public class BusProjectCreateSubReq implements Serializable {
@Serial
private static final long serialVersionUID = 6380055877986391291L;
/**
* 项目名称
*/
private String projectName;
/**
* 父项目ID
*/
private Long parentId;
}

View File

@ -0,0 +1,67 @@
package org.dromara.system.domain.dto.project;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 14:31
*/
@Data
public class BusProjectQueryReq implements Serializable {
@Serial
private static final long serialVersionUID = 5563677643070664671L;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 父项目id
*/
private Long parentId;
/**
* 状态0正常 1停用
*/
private String status;
/**
* 项目类型
*/
private String projectType;
/**
* 项目阶段
*/
private String projectStage;
/**
* 项目地址
*/
private String projectSite;
/**
* 负责人
*/
private String principal;
/**
* 负责人电话
*/
private String principalPhone;
/**
* 显示隐藏0显示 1隐藏
*/
private String showHidden;
}

View File

@ -0,0 +1,31 @@
package org.dromara.system.domain.dto.project;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-08-19 17:34
*/
@Data
public class BusProjectSaveTenderFileReq implements Serializable {
@Serial
private static final long serialVersionUID = -8690332210810915922L;
/**
* id
*/
@NotNull(message = "项目id不能为空")
private Long id;
/**
* 招标文件
*/
@NotBlank(message = "招标文件不能为空")
private String tenderFiles;
}

View File

@ -0,0 +1,150 @@
package org.dromara.system.domain.dto.project;
import lombok.Data;
import org.dromara.system.domain.bo.Punchrange;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author lilemy
* @date 2025/3/5 15:04
*/
@Data
public class BusProjectUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = 3431952359907567659L;
/**
* id
*/
private Long id;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 父项目id
*/
private Long parentId;
/**
* 状态0正常 1停用
*/
private String status;
/**
* 项目图片
*/
private String picUrl;
/**
* 经度
*/
private String lng;
/**
* 纬度
*/
private String lat;
/**
* 备注
*/
private String remark;
/**
* 项目类型
*/
private String projectType;
/**
* 项目阶段
*/
private String projectStage;
/**
* 项目地址
*/
private String projectSite;
/**
* 负责人
*/
private String principal;
/**
* 负责人电话
*/
private String principalPhone;
/**
* 实际容量
*/
private String actual;
/**
* 计划容量
*/
private String plan;
/**
* 开工时间
*/
private String onStreamTime;
/**
* 打卡时间开始
*/
private String playCardStart;
/**
* 打卡时间结束
*/
private String playCardEnd;
/**
* 设计总量
*/
private Long designTotal;
/**
* 安全协议书
*/
private String securityAgreement;
/**
* 招标文件
*/
private String tenderFiles;
/**
* 项目概括
*/
private String projectGeneralize;
/**
* 显示隐藏0显示 1隐藏
*/
private String showHidden;
/**
* 排序字段
*/
private Long sort;
/**
* 打卡范围
*/
private List<Punchrange> punchrangeList;
}

View File

@ -0,0 +1,13 @@
package org.dromara.system.domain.dto.project;
import lombok.Data;
/**
* @author lilemy
* @date 2025-08-27 18:26
*/
@Data
public class ProjectPermsItem {
private Long projectId;
private String perms;
}

View File

@ -0,0 +1,20 @@
package org.dromara.system.domain.dto.project;
import lombok.Data;
/**
* @author lilemy
* @date 2025-08-27 19:05
*/
@Data
public class ProjectRolesItem {
private Long projectId;
private Long roleId;
private String roleName;
private String roleKey;
private Long deptId;
private Integer roleSort;
private String dataScope;
private String status;
private String isSpecial;
}

View File

@ -0,0 +1,33 @@
package org.dromara.system.domain.dto.projectfile;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/4/23 14:16
*/
@Data
public class BusProjectFileQueryReq implements Serializable {
@Serial
private static final long serialVersionUID = 399401709402729491L;
/**
* 项目id
*/
private Long projectId;
/**
* 文件类型
*/
private String fileType;
/**
* 文件名称
*/
private String fileName;
}

View File

@ -0,0 +1,38 @@
package org.dromara.system.domain.dto.projectfile;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/4/23 14:18
*/
@Data
public class BusProjectFileUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = -5620479296452749930L;
/**
* 主键
*/
private Long id;
/**
* 项目id
*/
private Long projectId;
/**
* 文件名称
*/
private String fileName;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,23 @@
package org.dromara.system.domain.dto.projectfile;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/4/23 11:43
*/
@Data
public class BusProjectFileUploadDxfReq implements Serializable {
@Serial
private static final long serialVersionUID = -7096688035548954702L;
/**
* 项目id
*/
private Long projectId;
}

View File

@ -0,0 +1,43 @@
package org.dromara.system.domain.dto.projectnews;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/4/28 11:52
*/
@Data
public class BusProjectNewsCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = 7116830397516873096L;
/**
* 项目id
*/
@NotNull(message = "项目id不能为空")
private Long projectId;
/**
* 标题
*/
@NotBlank(message = "标题不能为空")
private String title;
/**
* 内容
*/
@NotBlank(message = "内容不能为空")
private String content;
/**
* 附件
*/
private String file;
}

View File

@ -0,0 +1,25 @@
package org.dromara.system.domain.dto.projectnews;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/4/28 14:07
*/
@Data
public class BusProjectNewsGisReq implements Serializable {
@Serial
private static final long serialVersionUID = -291705026028532102L;
/**
* 项目id
*/
@NotNull(message = "项目id不能为空")
private Long projectId;
}

View File

@ -0,0 +1,23 @@
package org.dromara.system.domain.dto.projectnews;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/4/28 11:52
*/
@Data
public class BusProjectNewsQueryReq implements Serializable {
@Serial
private static final long serialVersionUID = 1453496535743326174L;
/**
* 项目id
*/
private Long projectId;
}

View File

@ -0,0 +1,40 @@
package org.dromara.system.domain.dto.projectnews;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/4/28 11:53
*/
@Data
public class BusProjectNewsUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = -5988430319051945969L;
/**
* 主键id
*/
@NotNull(message = "主键id不能为空")
private Long id;
/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
/**
* 附件
*/
private String file;
}

View File

@ -0,0 +1,37 @@
package org.dromara.system.domain.dto.role;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author lilemy
* @date 2025-08-27 15:22
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SysRoleProjectDto {
/**
* 项目id
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 角色id列表
*/
private List<Long> roleIds;
}

View File

@ -0,0 +1,38 @@
package org.dromara.system.domain.dto.userprojectrelevancy;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 14:05
*/
@Data
public class BusUserProjectRelevancyCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = -7603153089205421154L;
/**
* 用户ID
*/
@NotNull(message = "用户ID不能为空")
private Long userId;
/**
* 项目ID
*/
@NotNull(message = "项目ID不能为空")
private Long projectId;
/**
* 用户类型(0系统管理员 1普通人员 2项目管理员)
*/
@NotBlank(message = "用户类型不能为空")
private String userType;
}

View File

@ -0,0 +1,32 @@
package org.dromara.system.domain.dto.userprojectrelevancy;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 14:31
*/
@Data
public class BusUserProjectRelevancyQueryReq implements Serializable {
@Serial
private static final long serialVersionUID = 3252651952758479341L;
/**
* 用户ID
*/
private Long userId;
/**
* 项目ID
*/
private Long projectId;
/**
* 用户类型(0系统管理员 1普通人员 2项目管理员)
*/
private String userType;
}

View File

@ -0,0 +1,42 @@
package org.dromara.system.domain.dto.userprojectrelevancy;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 15:04
*/
@Data
public class BusUserProjectRelevancyUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = -8022860866890925958L;
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空")
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 项目ID
*/
private Long projectId;
/**
* 用户类型(0系统管理员 1普通人员 2项目管理员)
*/
@NotBlank(message = "用户类型不能为空")
private String userType;
}

View File

@ -0,0 +1,27 @@
package org.dromara.system.domain.enums;
import lombok.Getter;
/**
* @author lilemy
* @date 2025/7/18 9:41
*/
@Getter
public enum SysDeptTypeEnum {
COMPANY("1", "总公司"),
SUB_COMPANY("2", "子公司"),
SPECIAL("3", "特殊"),
PROJECT("4", "项目"),
CONTRACT("5", "分包");
private final String code;
private final String message;
SysDeptTypeEnum(String code, String message) {
this.code = code;
this.message = message;
}
}

View File

@ -6,8 +6,6 @@ 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.SubContractorVo;
//import org.dromara.project.domain.vo.project.BusProjectVo;
import org.dromara.system.domain.SysDept;
import java.io.Serial;
@ -50,26 +48,6 @@ public class SysDeptVo implements Serializable {
*/
private SysDeptVo parent;
/**
* 项目id
*/
private Long projectId;
/**
* 分包公司ID
*/
private Long contractorId;
/**
* 未绑定项目信息
*/
// private List<BusProjectVo> projectList;
//
// /**
// * 未绑定分包信息
// */
// private List<SubContractorVo> contractorList;
/**
* 祖级列表
*/
@ -135,9 +113,9 @@ public class SysDeptVo implements Serializable {
@ExcelProperty(value = "创建时间")
private Date createTime;
// /**
// * 子菜单
// */
// private List<SysDept> children = new ArrayList<>();
/**
* 子菜单
*/
private List<SysDept> children = new ArrayList<>();
}

View File

@ -108,6 +108,11 @@ public class SysMenuVo implements Serializable {
*/
private Date createTime;
/**
* 菜单类型(menu_source) 1-web2-app
*/
private String menuSource;
/**
* 子菜单
*/

View File

@ -38,18 +38,34 @@ public class SysRoleVo implements Serializable {
@ExcelProperty(value = "角色名称")
private String roleName;
/**
* 项目ID
*/
private Long projectId;
/**
* 角色权限字符串
*/
@ExcelProperty(value = "角色权限")
private String roleKey;
/**
* 部门ID
*/
@ExcelProperty(value = "部门")
private Long deptId;
/**
* 显示顺序
*/
@ExcelProperty(value = "角色排序")
private Integer roleSort;
/**
* 角色类型 1-web 2-app
*/
private String roleSource;
/**
* 数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限 5仅本人数据权限 6部门及以下或本人数据权限
*/

View File

@ -1,6 +1,7 @@
package org.dromara.system.domain.vo;
import lombok.Data;
import org.dromara.system.domain.dto.role.SysRoleProjectDto;
import java.io.Serial;
import java.io.Serializable;
@ -42,4 +43,9 @@ public class SysUserInfoVo implements Serializable {
*/
private List<SysPostVo> posts;
/**
* 项目角色列表
*/
private List<SysRoleProjectDto> projectRoles;
}

View File

@ -139,4 +139,9 @@ public class SysUserVo implements Serializable {
*/
private Long roleId;
/**
* 项目组
*/
private List<Long> projectIds;
}

View File

@ -1,10 +1,12 @@
package org.dromara.system.domain.vo;
import lombok.Data;
import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo;
import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo;
import java.io.Serial;
import java.io.Serializable;
import java.util.Set;
import java.util.List;
/**
* 登录用户信息
@ -25,11 +27,11 @@ public class UserInfoVo implements Serializable {
/**
* 菜单权限
*/
private Set<String> permissions;
private List<SysProjectRoleMenuVo> permissions;
/**
* 角色权限
*/
private Set<String> roles;
private List<SysProjectRolePermissionVo> roles;
}

View File

@ -0,0 +1,47 @@
package org.dromara.system.domain.vo.project;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-08-21 19:14
*/
@Data
public class BusProjectGisVo implements Serializable {
@Serial
private static final long serialVersionUID = 7607042758858059082L;
/**
* id
*/
private Long id;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 经度
*/
private String lng;
/**
* 纬度
*/
private String lat;
/**
* 项目地址
*/
private String projectSite;
}

View File

@ -0,0 +1,23 @@
package org.dromara.system.domain.vo.project;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/5/14 9:34
*/
@Data
public class BusProjectSafetyDayVo implements Serializable {
@Serial
private static final long serialVersionUID = -1479490255029878315L;
/**
* 安全生产天数
*/
private Long safetyDay;
}

View File

@ -0,0 +1,204 @@
package org.dromara.system.domain.vo.project;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
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.system.domain.BusProject;
import org.dromara.system.domain.bo.Punchrange;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 项目视图对象 project
*
* @author lilemy
* @date 2025-03-04
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BusProject.class)
public class BusProjectVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@ExcelProperty(value = "id")
private Long id;
/**
* 项目名称
*/
@ExcelProperty(value = "项目名称")
private String projectName;
/**
* 项目简称
*/
@ExcelProperty(value = "项目简称")
private String shortName;
/**
* 父项目id
*/
@ExcelProperty(value = "父项目id")
private Long parentId;
/**
* 状态0正常 1停用
*/
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=正常,1=停用")
private String status;
/**
* 项目图片
*/
@ExcelProperty(value = "项目图片")
private String picUrl;
/**
* 经度
*/
@ExcelProperty(value = "经度")
private String lng;
/**
* 纬度
*/
@ExcelProperty(value = "纬度")
private String lat;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 项目类型
*/
@ExcelProperty(value = "项目类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "project_type")
private String projectType;
/**
* 项目阶段
*/
@ExcelProperty(value = "项目阶段", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "project_stage")
private String projectStage;
/**
* 项目地址
*/
@ExcelProperty(value = "项目地址")
private String projectSite;
/**
* 负责人
*/
@ExcelProperty(value = "负责人")
private String principal;
/**
* 负责人电话
*/
@ExcelProperty(value = "负责人电话")
private String principalPhone;
/**
* 实际容量
*/
@ExcelProperty(value = "实际容量")
private String actual;
/**
* 计划容量
*/
@ExcelProperty(value = "计划容量")
private String plan;
/**
* 开工时间
*/
@ExcelProperty(value = "开工时间")
private String onStreamTime;
/**
* 打卡范围09:00,18:00
*/
@ExcelProperty(value = "打卡范围")
private String punchRange;
/**
* 打卡时间开始
*/
private String playCardStart;
/**
* 打卡时间结束
*/
private String playCardEnd;
/**
* 设计总量
*/
@ExcelProperty(value = "设计总量")
private Long designTotal;
/**
* 安全协议书
*/
@ExcelProperty(value = "安全协议书")
private String securityAgreement;
/**
* 招标文件
*/
@ExcelProperty(value = "招标文件")
private String tenderFiles;
/**
* 显示隐藏0显示 1隐藏
*/
@ExcelProperty(value = "显示隐藏", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "1=显示,2=隐藏")
private String showHidden;
/**
* 排序字段
*/
private Long sort;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
/**
* 子项目
*/
private List<BusSubProjectVo> children;
/**
* 打卡范围
*/
private List<Punchrange> punchrangeList;
/**
* go项目id
*/
private Long goId;
}

View File

@ -0,0 +1,39 @@
package org.dromara.system.domain.vo.project;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @author lilemy
* @date 2025/6/4 9:53
*/
@Data
public class BusSubProjectVo implements Serializable {
@Serial
private static final long serialVersionUID = -5283786195929619472L;
/**
* id
*/
private Long id;
/**
* 项目名称
*/
private String projectName;
/**
* 设计文件id
*/
private Long designId;
/**
* 创建时间
*/
private Date createTime;
}

View File

@ -0,0 +1,40 @@
package org.dromara.system.domain.vo.projectfile;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.system.domain.BusProjectFile;
import java.io.Serial;
import java.io.Serializable;
/**
* 项目文件存储视图对象 bus_project_file
*
* @author lilemy
* @date 2025-04-23
*/
@Data
@AutoMapper(target = BusProjectFile.class)
public class BusProjectFileVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 文件类型
*/
private String fileType;
/**
* 文件名称
*/
private String fileName;
/**
* 文件路径
*/
private String filePath;
}

View File

@ -0,0 +1,33 @@
package org.dromara.system.domain.vo.projectnews;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/4/28 14:11
*/
@Data
public class BusProjectNewsGisVo implements Serializable {
@Serial
private static final long serialVersionUID = -751096185387401970L;
/**
* 主键
*/
private Long id;
/**
* 标题
*/
private String title;
/**
* 显示
*/
private Boolean show;
}

View File

@ -0,0 +1,50 @@
package org.dromara.system.domain.vo.projectnews;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.system.domain.BusProjectNews;
import java.io.Serial;
import java.io.Serializable;
/**
* 项目新闻视图对象 bus_project_news
*
* @author lilemy
* @date 2025-04-28
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BusProjectNews.class)
public class BusProjectNewsVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private Long id;
/**
* 标题
*/
@ExcelProperty(value = "标题")
private String title;
/**
* 内容
*/
@ExcelProperty(value = "内容")
private String content;
/**
* 附件
*/
@ExcelProperty(value = "附件")
private String file;
}

View File

@ -0,0 +1,58 @@
package org.dromara.system.domain.vo.projectpunchrange;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.system.domain.BusProjectPunchrange;
import java.io.Serial;
import java.io.Serializable;
/**
* 项目打卡范围视图对象 bus_project_punchrange
*
* @author Lion Li
* @date 2025-07-28
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BusProjectPunchrange.class)
public class BusProjectPunchrangeVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long id;
/**
* 项目ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
* 范围名称
*/
@ExcelProperty(value = "范围名称")
private String punchName;
/**
* 打卡范围
*/
@ExcelProperty(value = "打卡范围")
private String punchRange;
/**
* 颜色
*/
@ExcelProperty(value = "颜色")
private String punchColor;
}

View File

@ -0,0 +1,47 @@
package org.dromara.system.domain.vo.userprojectrelevancy;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 15:30
*/
@Data
public class BusLoginUserProjectRelevancyVo implements Serializable {
@Serial
private static final long serialVersionUID = -2056438621566236671L;
/**
* 主键ID
*/
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 项目ID
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 用户类型(0系统管理员 1普通人员 2项目管理员)
*/
private String userType;
}

View File

@ -0,0 +1,65 @@
package org.dromara.system.domain.vo.userprojectrelevancy;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.system.domain.BusUserProjectRelevancy;
import org.dromara.system.domain.vo.project.BusProjectVo;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 系统用户与项目关联视图对象 user_project_relevancy
*
* @author lilemy
* @date 2025-03-04
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BusUserProjectRelevancy.class)
public class BusUserProjectRelevancyVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 用户ID
*/
@ExcelProperty(value = "用户ID")
private Long userId;
/**
* 项目ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
* 用户类型(0系统管理员 1普通人员 2项目管理员)
*/
@ExcelProperty(value = "用户类型(0系统管理员 1普通人员 2项目管理员)")
private String userType;
/**
* 项目详情
*/
@ExcelProperty(value = "项目详情")
private BusProjectVo project;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
}

View File

@ -2,11 +2,13 @@ package org.dromara.system.dubbo;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo;
import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo;
import org.dromara.system.api.RemotePermissionService;
import org.dromara.system.service.ISysPermissionService;
import org.springframework.stereotype.Service;
import java.util.Set;
import java.util.List;
/**
* 权限服务
@ -21,12 +23,12 @@ public class RemotePermissionServiceImpl implements RemotePermissionService {
private final ISysPermissionService permissionService;
@Override
public Set<String> getRolePermission(Long userId) {
public List<SysProjectRolePermissionVo> getRolePermission(Long userId) {
return permissionService.getRolePermission(userId);
}
@Override
public Set<String> getMenuPermission(Long userId) {
public List<SysProjectRoleMenuVo> getMenuPermission(Long userId) {
return permissionService.getMenuPermission(userId);
}
}

View File

@ -0,0 +1,30 @@
package org.dromara.system.dubbo;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.system.api.RemoteProjectService;
import org.dromara.system.service.IBusProjectService;
import org.springframework.stereotype.Service;
/**
* @author lilemy
* @date 2025-09-11 18:33
*/
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteProjectServiceImpl implements RemoteProjectService {
private final IBusProjectService projectService;
/**
* 通过项目ID查询项目名称
*
* @param projectId 项目ID
* @return 项目名称
*/
@Override
public String selectProjectNameById(Long projectId) {
return projectService.getProjectNameById(projectId);
}
}

View File

@ -59,6 +59,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
private final SysPostMapper postMapper;
private final SysUserRoleMapper userRoleMapper;
private final SysUserPostMapper userPostMapper;
private final IBusUserProjectRelevancyService userProjectRelevancyService;
/**
* 通过用户名查询用户信息
@ -79,6 +80,14 @@ public class RemoteUserServiceImpl implements RemoteUserService {
}
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
if (!SystemConstants.SUPER_ADMIN_ID.equals(sysUser.getUserId())) {
List<BusUserProjectRelevancy> list = userProjectRelevancyService.lambdaQuery()
.eq(BusUserProjectRelevancy::getUserId, sysUser.getUserId())
.list();
if (CollUtil.isNotEmpty(list)) {
sysUser.setProjectIds(list.stream().map(BusUserProjectRelevancy::getProjectId).toList());
}
}
return buildLoginUser(sysUser);
});
}
@ -266,6 +275,12 @@ public class RemoteUserServiceImpl implements RemoteUserService {
loginUser.setTenantId(userVo.getTenantId());
loginUser.setUserId(userId);
loginUser.setDeptId(userVo.getDeptId());
List<Long> projectIds = userVo.getProjectIds();
Long projectId = null;
if (CollUtil.isNotEmpty(projectIds)) {
projectId = projectIds.getFirst();
}
loginUser.setProjectId(projectId);
loginUser.setUsername(userVo.getUserName());
loginUser.setNickname(userVo.getNickName());
loginUser.setPassword(userVo.getPassword());

View File

@ -0,0 +1,15 @@
package org.dromara.system.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.BusProjectFile;
import org.dromara.system.domain.vo.projectfile.BusProjectFileVo;
/**
* 项目文件存储Mapper接口
*
* @author lilemy
* @date 2025-04-23
*/
public interface BusProjectFileMapper extends BaseMapperPlus<BusProjectFile, BusProjectFileVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.system.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.BusProject;
import org.dromara.system.domain.vo.project.BusProjectVo;
/**
* 项目Mapper接口
*
* @author lilemy
* @date 2025-03-04
*/
public interface BusProjectMapper extends BaseMapperPlus<BusProject, BusProjectVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.system.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.BusProjectNews;
import org.dromara.system.domain.vo.projectnews.BusProjectNewsVo;
/**
* 项目新闻Mapper接口
*
* @author lilemy
* @date 2025-04-28
*/
public interface BusProjectNewsMapper extends BaseMapperPlus<BusProjectNews, BusProjectNewsVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.system.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.BusProjectPunchrange;
import org.dromara.system.domain.vo.projectpunchrange.BusProjectPunchrangeVo;
/**
* 项目打卡范围Mapper接口
*
* @author Lion Li
* @date 2025-07-28
*/
public interface BusProjectPunchrangeMapper extends BaseMapperPlus<BusProjectPunchrange, BusProjectPunchrangeVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.system.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.BusUserProjectRelevancy;
import org.dromara.system.domain.vo.userprojectrelevancy.BusUserProjectRelevancyVo;
/**
* 系统用户与项目关联Mapper接口
*
* @author lilemy
* @date 2025-03-04
*/
public interface BusUserProjectRelevancyMapper extends BaseMapperPlus<BusUserProjectRelevancy, BusUserProjectRelevancyVo> {
}

View File

@ -3,11 +3,12 @@ package org.dromara.system.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.system.domain.SysMenu;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.vo.SysMenuVo;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysMenu;
import org.dromara.system.domain.dto.project.ProjectPermsItem;
import org.dromara.system.domain.vo.SysMenuVo;
import java.util.List;
@ -32,7 +33,7 @@ public interface SysMenuMapper extends BaseMapperPlus<SysMenu, SysMenuVo> {
* @param userId 用户ID
* @return 权限列表
*/
List<String> selectMenuPermsByUserId(Long userId);
List<ProjectPermsItem> selectMenuPermsByUserId(Long userId);
/**
* 根据角色ID查询权限
@ -62,7 +63,7 @@ public interface SysMenuMapper extends BaseMapperPlus<SysMenu, SysMenuVo> {
* @param userId 用户ID
* @return 菜单列表
*/
List<SysMenu> selectMenuTreeByUserId(Long userId);
List<SysMenu> selectMenuTreeByUserId(Long userId, Long projectId);
/**
* 根据角色ID查询菜单树信息

View File

@ -8,6 +8,7 @@ import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.dto.project.ProjectRolesItem;
import org.dromara.system.domain.vo.SysRoleVo;
import java.util.List;
@ -59,4 +60,12 @@ public interface SysRoleMapper extends BaseMapperPlus<SysRole, SysRoleVo> {
*/
List<SysRoleVo> selectRolesByUserId(Long userId);
/**
* 根据用户ID查询角色
*
* @param userId 用户ID
* @return 角色列表
*/
List<ProjectRolesItem> selectProjectRolesByUserId(Long userId);
}

View File

@ -0,0 +1,90 @@
package org.dromara.system.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.BusProjectFile;
import org.dromara.system.domain.dto.projectfile.BusProjectFileQueryReq;
import org.dromara.system.domain.dto.projectfile.BusProjectFileUpdateReq;
import org.dromara.system.domain.vo.projectfile.BusProjectFileVo;
import java.util.Collection;
import java.util.List;
/**
* 项目文件存储Service接口
*
* @author lilemy
* @date 2025-04-23
*/
public interface IBusProjectFileService extends IService<BusProjectFile> {
/**
* 查询项目文件存储
*
* @param id 主键
* @return 项目文件存储
*/
BusProjectFileVo queryById(Long id);
/**
* 分页查询项目文件存储列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 项目文件存储分页列表
*/
TableDataInfo<BusProjectFileVo> queryPageList(BusProjectFileQueryReq req, PageQuery pageQuery);
/**
* 查询符合条件的项目文件存储列表
*
* @param req 查询条件
* @return 项目文件存储列表
*/
List<BusProjectFileVo> queryList(BusProjectFileQueryReq req);
/**
* 修改项目文件存储
*
* @param req 项目文件存储
* @return 是否修改成功
*/
Boolean updateByBo(BusProjectFileUpdateReq req);
/**
* 校验并批量删除项目文件存储信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 获取项目文件存储视图对象
*
* @param projectFile 项目文件存储对象
* @return 项目文件存储视图对象
*/
BusProjectFileVo getVo(BusProjectFile projectFile);
/**
* 获取项目文件存储查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<BusProjectFile> buildQueryWrapper(BusProjectFileQueryReq req);
/**
* 获取项目文件存储分页对象视图
*
* @param projectFilePage 项目文件存储分页对象
* @return 项目文件存储分页对象视图
*/
Page<BusProjectFileVo> getVoPage(Page<BusProjectFile> projectFilePage);
}

View File

@ -0,0 +1,125 @@
package org.dromara.system.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.BusProjectNews;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsCreateReq;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsGisReq;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsQueryReq;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsUpdateReq;
import org.dromara.system.domain.vo.projectnews.BusProjectNewsGisVo;
import org.dromara.system.domain.vo.projectnews.BusProjectNewsVo;
import java.util.Collection;
import java.util.List;
/**
* 项目新闻Service接口
*
* @author lilemy
* @date 2025-04-28
*/
public interface IBusProjectNewsService extends IService<BusProjectNews> {
/**
* 查询项目新闻
*
* @param id 主键
* @return 项目新闻
*/
BusProjectNewsVo queryById(Long id);
/**
* 分页查询项目新闻列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 项目新闻分页列表
*/
TableDataInfo<BusProjectNewsVo> queryPageList(BusProjectNewsQueryReq req, PageQuery pageQuery);
/**
* 查询符合条件的项目新闻列表
*
* @param req 查询条件
* @return 项目新闻列表
*/
List<BusProjectNewsVo> queryList(BusProjectNewsQueryReq req);
/**
* 查询大屏项目新闻列表
*
* @param req 列表查询条件
* @return 大屏项目新闻列表
*/
List<BusProjectNewsGisVo> queryGisList(BusProjectNewsGisReq req);
/**
* 根据项目id查询项目新闻列表
*
* @param projectId 项目id
* @return 项目新闻列表
*/
List<BusProjectNewsVo> queryListByProject(Long projectId);
/**
* 新增项目新闻
*
* @param req 项目新闻
* @return 新增项目新闻id
*/
Long insertByBo(BusProjectNewsCreateReq req);
/**
* 修改项目新闻
*
* @param req 项目新闻
* @return 是否修改成功
*/
Boolean updateByBo(BusProjectNewsUpdateReq req);
/**
* 校验并批量删除项目新闻信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 获取项目新闻存储视图对象
*
* @param projectNews 项目新闻存储对象
* @return 项目新闻存储视图对象
*/
BusProjectNewsVo getVo(BusProjectNews projectNews);
/**
* 获取项目新闻存储查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<BusProjectNews> buildQueryWrapper(BusProjectNewsQueryReq req);
/**
* 获取项目新闻存储分页对象视图
*
* @param projectNewsPage 项目新闻存储分页对象
* @return 项目新闻存储分页对象视图
*/
Page<BusProjectNewsVo> getVoPage(Page<BusProjectNews> projectNewsPage);
/**
* 获取项目新闻存储列表视图对象
*
* @param projectNewsList 项目新闻存储列表对象
* @return 项目新闻存储列表视图对象
*/
List<BusProjectNewsVo> getVoList(List<BusProjectNews> projectNewsList);
}

View File

@ -0,0 +1,70 @@
package org.dromara.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.BusProjectPunchrange;
import org.dromara.system.domain.bo.BusProjectPunchrangeBo;
import org.dromara.system.domain.vo.projectpunchrange.BusProjectPunchrangeVo;
import java.util.Collection;
import java.util.List;
/**
* 项目打卡范围Service接口
*
* @author Lion Li
* @date 2025-07-28
*/
public interface IBusProjectPunchrangeService extends IService<BusProjectPunchrange> {
/**
* 查询项目打卡范围
*
* @param id 主键
* @return 项目打卡范围
*/
BusProjectPunchrangeVo queryById(Long id);
/**
* 分页查询项目打卡范围列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 项目打卡范围分页列表
*/
TableDataInfo<BusProjectPunchrangeVo> queryPageList(BusProjectPunchrangeBo bo, PageQuery pageQuery);
/**
* 查询符合条件的项目打卡范围列表
*
* @param bo 查询条件
* @return 项目打卡范围列表
*/
List<BusProjectPunchrangeVo> queryList(BusProjectPunchrangeBo bo);
/**
* 新增项目打卡范围
*
* @param bo 项目打卡范围
* @return 是否新增成功
*/
Boolean insertByBo(BusProjectPunchrangeBo bo);
/**
* 修改项目打卡范围
*
* @param bo 项目打卡范围
* @return 是否修改成功
*/
Boolean updateByBo(BusProjectPunchrangeBo bo);
/**
* 校验并批量删除项目打卡范围信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,174 @@
package org.dromara.system.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.BusProject;
import org.dromara.system.domain.dto.project.*;
import org.dromara.system.domain.vo.project.BusProjectGisVo;
import org.dromara.system.domain.vo.project.BusProjectSafetyDayVo;
import org.dromara.system.domain.vo.project.BusProjectVo;
import org.dromara.system.domain.vo.project.BusSubProjectVo;
import java.util.Collection;
import java.util.List;
/**
* 项目Service接口
*
* @author lilemy
* @date 2025-03-04
*/
public interface IBusProjectService extends IService<BusProject> {
/**
* 查询项目
*
* @param id 主键
* @return 项目
*/
BusProjectVo queryById(Long id);
/**
* 分页查询项目列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 项目分页列表
*/
TableDataInfo<BusProjectVo> queryPageList(BusProjectQueryReq req, PageQuery pageQuery);
/**
* 查询符合条件的项目列表
*
* @param req 查询条件
* @return 项目列表
*/
List<BusProjectVo> queryList(BusProjectQueryReq req);
/**
* 查询项目下的子项目列表
*
* @param id 父项目id
* @return 项目下的子项目列表
*/
List<BusSubProjectVo> querySubList(Long id);
/**
* 新增项目
*
* @param dto 项目
* @return 新项目 id
*/
Long insertByBo(BusProjectCreateReq dto);
/**
* 新增子项目
*
* @param dto 子项目
* @return 子项目 id
*/
Long insertSubByProject(BusProjectCreateSubReq dto);
/**
* 修改项目
*
* @param req 项目
* @return 是否修改成功
*/
Boolean updateByBo(BusProjectUpdateReq req);
/**
* 保存项目招标文件
*
* @param req 项目招标文件
* @return 是否保存成功
*/
Boolean saveTenderFile(BusProjectSaveTenderFileReq req);
/**
* 校验并批量删除项目信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 获取项目视图对象
*
* @param project 项目对象
* @return 项目视图对象
*/
BusProjectVo getVo(BusProject project);
/**
* 获取项目查询条件封装(不查询子项目)
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<BusProject> buildQueryWrapper(BusProjectQueryReq req);
/**
* 获取项目分页对象视图
*
* @param projectPage 项目分页对象
* @return 项目分页对象视图
*/
Page<BusProjectVo> getVoPage(Page<BusProject> projectPage);
/**
* 校验用户是否拥有操作项目的权限
*
* @param projectId 项目id
* @param userId 需要鉴权的用户id
*/
void validAuth(Long projectId, Long userId);
/**
* 校验用户是否拥有操作项目的权限
*
* @param projectIdList 项目id列表
* @param userId 需要鉴权的用户id
*/
void validAuth(Collection<Long> projectIdList, Long userId);
/**
* 获取项目安全天数
*
* @param id 项目id
* @return 安全天数
*/
BusProjectSafetyDayVo getSafetyDay(Long id);
/**
* 获取项目地址信息
*
* @return 项目地址信息列表
*/
List<BusProjectGisVo> getGisList();
/**
* 改变项目所属用户
*
* @param id 项目id
* @return 是否成功
*/
Boolean changeUserProject(Long id);
BusProjectVo selectById(Long projectId);
List<BusProjectVo> selectProjectVoList();
/**
* 通过项目ID查询项目名称
*
* @param projectId 项目ID
* @return 项目名称
*/
String getProjectNameById(Long projectId);
}

View File

@ -0,0 +1,160 @@
package org.dromara.system.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.BusUserProjectRelevancy;
import org.dromara.system.domain.dto.project.BusProjectBatchByProjectListReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyCreateReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyQueryReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyUpdateReq;
import org.dromara.system.domain.vo.userprojectrelevancy.BusLoginUserProjectRelevancyVo;
import org.dromara.system.domain.vo.userprojectrelevancy.BusUserProjectRelevancyVo;
import java.util.Collection;
import java.util.List;
/**
* 系统用户与项目关联Service接口
*
* @author lilemy
* @date 2025-03-04
*/
public interface IBusUserProjectRelevancyService extends IService<BusUserProjectRelevancy> {
/**
* 查询系统用户与项目关联
*
* @param id 主键
* @return 系统用户与项目关联
*/
BusUserProjectRelevancyVo queryById(Long id);
/**
* 分页查询系统用户与项目关联列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 系统用户与项目关联分页列表
*/
TableDataInfo<BusUserProjectRelevancyVo> queryPageList(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery);
/**
* 查询符合条件的系统用户与项目关联列表
*
* @param req 查询条件
* @return 系统用户与项目关联列表
*/
List<BusUserProjectRelevancyVo> queryList(BusUserProjectRelevancyQueryReq req);
/**
* 新增系统用户与项目关联
*
* @param req 系统用户与项目关联
* @return 新增关联id
*/
Long insertByBo(BusUserProjectRelevancyCreateReq req);
/**
* 批量新增用户和项目关联
*
* @param projectId 项目ID
* @param userIdList 用户ID列表
* @param userType 用户类型
*/
void saveBatchByUserList(Long projectId, List<Long> userIdList, String userType);
/**
* 批量新增用户和项目关联
*
* @param projectIdList 项目ID列表
* @param userId 用户ID
* @param userType 用户类型
*/
void saveBatchByProjectList(List<Long> projectIdList, Long userId, String userType);
/**
* 修改系统用户与项目关联
*
* @param req 系统用户与项目关联
* @return 是否修改成功
*/
Boolean updateByBo(BusUserProjectRelevancyUpdateReq req);
/**
* 校验并批量删除系统用户与项目关联信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 根据用户ID删除系统用户与项目关联
*
* @param userId 用户ID
*/
void deleteByUserId(Long userId);
/**
* 根据项目ID和用户ID列表删除系统用户与项目关联
*
* @param oldProjectId 项目ID
* @param userIds 用户ID列表
*/
void deleteByProjectAndUserIds(Long oldProjectId, List<Long> userIds);
/**
* 获取当前登录用户项目列表
*
* @param userId 登录用户ID
* @return 当前登录用户项目列表
*/
List<BusLoginUserProjectRelevancyVo> queryListByUserId(Long userId);
/**
* 获取当前登录用户项目分页
*
* @param userId 登录用户ID
* @param req 分页查询条件
* @param pageQuery 分页参数
* @return 当前登录用户项目分页
*/
TableDataInfo<BusUserProjectRelevancyVo> queryPageByUserId(Long userId, BusUserProjectRelevancyQueryReq req, PageQuery pageQuery);
/**
* 批量新增用户和项目关联
*
* @param req 新增参数
* @return 是否增加成功
*/
Boolean insertBatchByProjectList(BusProjectBatchByProjectListReq req);
/**
* 获取系统用户与项目关联视图
*
* @param userProjectRelevancy 系统用户与项目关联
* @return 系统用户与项目关联视图
*/
BusUserProjectRelevancyVo getVo(BusUserProjectRelevancy userProjectRelevancy);
/**
* 获取用户和项目关联对象查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<BusUserProjectRelevancy> buildQueryWrapper(BusUserProjectRelevancyQueryReq req);
/**
* 获取系统用户与项目关联分页视图
*
* @param userProjectRelevancyPage 系统用户与项目关联分页
* @return 系统用户与项目关联分页视图
*/
Page<BusUserProjectRelevancyVo> getVoPage(Page<BusUserProjectRelevancy> userProjectRelevancyPage);
}

View File

@ -48,6 +48,13 @@ public interface ISysDeptService {
*/
List<Tree<Long>> buildDeptTreeSelect(List<SysDeptVo> depts);
/**
* 构建前端所需要下拉树结构
*
* @return 下拉树结构列表
*/
List<Tree<Long>> buildDeptTree();
/**
* 根据角色ID查询部门树信息
*
@ -150,4 +157,12 @@ public interface ISysDeptService {
* @return 部门列表
*/
List<SysDeptVo> selectDeptsSimple();
/**
* 校验部门和角色是否匹配
*
* @param deptId 部门id
* @param roleIds 角色id列表
*/
void checkDeptMatchRole(Long deptId, List<Long> roleIds);
}

View File

@ -1,6 +1,7 @@
package org.dromara.system.service;
import cn.hutool.core.lang.tree.Tree;
import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo;
import org.dromara.system.domain.SysMenu;
import org.dromara.system.domain.bo.SysMenuBo;
import org.dromara.system.domain.vo.RouterVo;
@ -39,7 +40,7 @@ public interface ISysMenuService {
* @param userId 用户ID
* @return 权限列表
*/
Set<String> selectMenuPermsByUserId(Long userId);
List<SysProjectRoleMenuVo> selectMenuPermsByUserId(Long userId);
/**
* 根据角色ID查询权限
@ -52,10 +53,11 @@ public interface ISysMenuService {
/**
* 根据用户ID查询菜单树信息
*
* @param userId 用户ID
* @param userId 用户ID
* @param projectId 项目ID
* @return 菜单列表
*/
List<SysMenu> selectMenuTreeByUserId(Long userId);
List<SysMenu> selectMenuTreeByUserId(Long userId, Long projectId);
/**
* 根据角色ID查询菜单树信息

View File

@ -1,5 +1,9 @@
package org.dromara.system.service;
import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo;
import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo;
import java.util.List;
import java.util.Set;
/**
@ -12,17 +16,17 @@ public interface ISysPermissionService {
/**
* 获取角色数据权限
*
* @param userId 用户id
* @param userId 用户id
* @return 角色权限信息
*/
Set<String> getRolePermission(Long userId);
List<SysProjectRolePermissionVo> getRolePermission(Long userId);
/**
* 获取菜单数据权限
*
* @param userId 用户id
* @param userId 用户id
* @return 菜单权限信息
*/
Set<String> getMenuPermission(Long userId);
List<SysProjectRoleMenuVo> getMenuPermission(Long userId);
}

View File

@ -1,13 +1,14 @@
package org.dromara.system.service;
import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.dto.role.SysRoleProjectDto;
import org.dromara.system.domain.vo.SysRoleVo;
import java.util.List;
import java.util.Set;
/**
* 角色业务层
@ -49,7 +50,7 @@ public interface ISysRoleService {
* @param userId 用户ID
* @return 权限列表
*/
Set<String> selectRolePermissionByUserId(Long userId);
List<SysProjectRolePermissionVo> selectRolePermissionByUserId(Long userId);
/**
* 查询所有角色
@ -82,6 +83,14 @@ public interface ISysRoleService {
*/
List<SysRoleVo> selectRoleByIds(List<Long> roleIds);
/**
* 获取角色选择框列表
*
* @param userId 用户ID
* @return 角色列表
*/
List<SysRoleProjectDto> selectRoleProjectList(Long userId);
/**
* 校验角色名称是否唯一
*

View File

@ -3,6 +3,7 @@ package org.dromara.system.service;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.dto.role.SysRoleProjectDto;
import org.dromara.system.domain.vo.SysUserExportVo;
import org.dromara.system.domain.vo.SysUserVo;
@ -162,10 +163,10 @@ public interface ISysUserService {
/**
* 用户授权角色
*
* @param userId 用户ID
* @param roleIds 角色
* @param userId 用户ID
* @param projectRoles 项目、角色关联
*/
void insertUserAuth(Long userId, Long[] roleIds);
void insertUserAuth(Long userId, List<SysRoleProjectDto> projectRoles);
/**
* 修改用户状态

View File

@ -0,0 +1,200 @@
package org.dromara.system.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
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.system.domain.BusProjectFile;
import org.dromara.system.domain.dto.projectfile.BusProjectFileQueryReq;
import org.dromara.system.domain.dto.projectfile.BusProjectFileUpdateReq;
import org.dromara.system.domain.vo.projectfile.BusProjectFileVo;
import org.dromara.system.mapper.BusProjectFileMapper;
import org.dromara.system.service.IBusProjectFileService;
import org.dromara.system.service.IBusProjectService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
/**
* 项目文件存储Service业务层处理
*
* @author lilemy
* @date 2025-04-23
*/
@Slf4j
@Service
public class BusProjectFileServiceImpl extends ServiceImpl<BusProjectFileMapper, BusProjectFile>
implements IBusProjectFileService {
@Resource
private IBusProjectService projectService;
/**
* 查询项目文件存储
*
* @param id 主键
* @return 项目文件存储
*/
@Override
public BusProjectFileVo queryById(Long id) {
BusProjectFile projectFile = this.getById(id);
if (projectFile == null) {
throw new ServiceException("对应项目文件存储信息不存在", HttpStatus.NOT_FOUND);
}
return this.getVo(projectFile);
}
/**
* 分页查询项目文件存储列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 项目文件存储分页列表
*/
@Override
public TableDataInfo<BusProjectFileVo> queryPageList(BusProjectFileQueryReq req, PageQuery pageQuery) {
Page<BusProjectFile> projectFilePage = this.page(pageQuery.build(), this.buildQueryWrapper(req));
return TableDataInfo.build(this.getVoPage(projectFilePage));
}
/**
* 查询符合条件的项目文件存储列表
*
* @param req 查询条件
* @return 项目文件存储列表
*/
@Override
public List<BusProjectFileVo> queryList(BusProjectFileQueryReq req) {
LambdaQueryWrapper<BusProjectFile> lqw = this.buildQueryWrapper(req);
return this.list(lqw).stream().map(this::getVo).toList();
}
/**
* 修改项目文件存储
*
* @param req 项目文件存储
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(BusProjectFileUpdateReq req) {
// 将实体类和 DTO 进行转换
BusProjectFile projectFile = new BusProjectFile();
BeanUtils.copyProperties(req, projectFile);
// 数据校验
validEntityBeforeSave(projectFile);
// 判断是否存在
BusProjectFile oldProjectFile = this.getById(projectFile.getId());
if (oldProjectFile == null) {
throw new ServiceException("修改项目文件存储失败,数据不存在", HttpStatus.NOT_FOUND);
}
// 操作数据库
boolean update = this.updateById(projectFile);
if (!update) {
throw new ServiceException("修改项目文件存储失败,数据库异常", HttpStatus.ERROR);
}
return true;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BusProjectFile entity) {
// TODO 做一些数据校验,如唯一约束
Long projectId = entity.getProjectId();
if (projectId == null) {
throw new ServiceException("项目id不能为空", HttpStatus.BAD_REQUEST);
}
if (projectService.getById(projectId) == null) {
throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND);
}
}
/**
* 校验并批量删除项目文件存储信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
Long userId = LoginHelper.getUserId();
List<BusProjectFile> projectFileList = this.listByIds(ids);
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
List<Long> projectId = projectFileList.stream().map(BusProjectFile::getProjectId).toList();
projectService.validAuth(projectId, userId);
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
* 获取项目文件存储视图对象
*
* @param projectFile 项目文件存储对象
* @return 项目文件存储视图对象
*/
@Override
public BusProjectFileVo getVo(BusProjectFile projectFile) {
// 对象转封装类
BusProjectFileVo projectFileVo = new BusProjectFileVo();
if (projectFile == null) {
return projectFileVo;
}
BeanUtils.copyProperties(projectFile, projectFileVo);
return projectFileVo;
}
/**
* 获取项目文件存储查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
@Override
public LambdaQueryWrapper<BusProjectFile> buildQueryWrapper(BusProjectFileQueryReq req) {
LambdaQueryWrapper<BusProjectFile> lqw = new LambdaQueryWrapper<>();
if (req == null) {
return lqw;
}
Long projectId = req.getProjectId();
String fileType = req.getFileType();
String fileName = req.getFileName();
lqw.like(StringUtils.isNotBlank(fileName), BusProjectFile::getFileName, fileName);
lqw.eq(ObjectUtils.isNotEmpty(projectId), BusProjectFile::getProjectId, projectId);
lqw.eq(StringUtils.isNotBlank(fileType), BusProjectFile::getFileType, fileType);
return lqw;
}
/**
* 获取项目文件存储分页对象视图
*
* @param projectFilePage 项目文件存储分页对象
* @return 项目文件存储分页对象视图
*/
@Override
public Page<BusProjectFileVo> getVoPage(Page<BusProjectFile> projectFilePage) {
List<BusProjectFile> projectFileList = projectFilePage.getRecords();
Page<BusProjectFileVo> projectFileVoPage = new Page<>(
projectFilePage.getCurrent(),
projectFilePage.getSize(),
projectFilePage.getTotal());
if (CollUtil.isEmpty(projectFileList)) {
return projectFileVoPage;
}
List<BusProjectFileVo> projectFileVoList = projectFileList.stream().map(this::getVo).toList();
projectFileVoPage.setRecords(projectFileVoList);
return projectFileVoPage;
}
}

View File

@ -0,0 +1,268 @@
package org.dromara.system.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.ObjectUtils;
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.system.domain.BusProjectNews;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsCreateReq;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsGisReq;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsQueryReq;
import org.dromara.system.domain.dto.projectnews.BusProjectNewsUpdateReq;
import org.dromara.system.domain.vo.projectnews.BusProjectNewsGisVo;
import org.dromara.system.domain.vo.projectnews.BusProjectNewsVo;
import org.dromara.system.mapper.BusProjectNewsMapper;
import org.dromara.system.service.IBusProjectNewsService;
import org.dromara.system.service.IBusProjectService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
/**
* 项目新闻Service业务层处理
*
* @author lilemy
* @date 2025-04-28
*/
@Service
public class BusProjectNewsServiceImpl extends ServiceImpl<BusProjectNewsMapper, BusProjectNews>
implements IBusProjectNewsService {
@Resource
private IBusProjectService projectService;
/**
* 查询项目新闻
*
* @param id 主键
* @return 项目新闻
*/
@Override
public BusProjectNewsVo queryById(Long id) {
BusProjectNews projectNews = this.getById(id);
if (projectNews == null) {
throw new ServiceException("对应项目新闻存储信息不存在", HttpStatus.NOT_FOUND);
}
return this.getVo(projectNews);
}
/**
* 分页查询项目新闻列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 项目新闻分页列表
*/
@Override
public TableDataInfo<BusProjectNewsVo> queryPageList(BusProjectNewsQueryReq req, PageQuery pageQuery) {
Page<BusProjectNews> projectNewsPage = this.page(pageQuery.build(), this.buildQueryWrapper(req));
return TableDataInfo.build(this.getVoPage(projectNewsPage));
}
/**
* 查询符合条件的项目新闻列表
*
* @param req 查询条件
* @return 项目新闻列表
*/
@Override
public List<BusProjectNewsVo> queryList(BusProjectNewsQueryReq req) {
LambdaQueryWrapper<BusProjectNews> lqw = this.buildQueryWrapper(req);
return this.list(lqw).stream().map(this::getVo).toList();
}
/**
* 查询大屏项目新闻列表
*
* @param req 列表查询条件
* @return 大屏项目新闻列表
*/
@Override
public List<BusProjectNewsGisVo> queryGisList(BusProjectNewsGisReq req) {
Long projectId = req.getProjectId();
if (projectId == null || projectService.getById(projectId) == null) {
throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND);
}
List<BusProjectNews> projectNewsList = this.lambdaQuery()
.select(BusProjectNews::getId, BusProjectNews::getTitle)
.eq(BusProjectNews::getProjectId, projectId)
.list();
return projectNewsList.stream().map(projectNews -> {
BusProjectNewsGisVo projectNewsGisResp = new BusProjectNewsGisVo();
BeanUtils.copyProperties(projectNews, projectNewsGisResp);
projectNewsGisResp.setShow(false);
return projectNewsGisResp;
}).toList();
}
/**
* 根据项目id查询项目新闻列表
*
* @param projectId 项目id
* @return 项目新闻列表
*/
@Override
public List<BusProjectNewsVo> queryListByProject(Long projectId) {
List<BusProjectNews> list = this.lambdaQuery()
.eq(BusProjectNews::getProjectId, projectId)
.list();
return this.getVoList(list);
}
/**
* 新增项目新闻
*
* @param req 项目新闻
* @return 新增项目新闻id
*/
@Override
public Long insertByBo(BusProjectNewsCreateReq req) {
// 将实体类和 DTO 进行转换
BusProjectNews projectNews = new BusProjectNews();
BeanUtils.copyProperties(req, projectNews);
// 数据校验
validEntityBeforeSave(projectNews, true);
// 操作数据库
boolean save = this.save(projectNews);
if (!save) {
throw new ServiceException("新增项目新闻存储失败,数据库异常", HttpStatus.ERROR);
}
return projectNews.getId();
}
/**
* 修改项目新闻
*
* @param req 项目新闻
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(BusProjectNewsUpdateReq req) {
// 将实体类和 DTO 进行转换
BusProjectNews projectNews = new BusProjectNews();
BeanUtils.copyProperties(req, projectNews);
// 数据校验
validEntityBeforeSave(projectNews, false);
// 判断是否存在
BusProjectNews oldProjectNews = this.getById(projectNews.getId());
if (oldProjectNews == null) {
throw new ServiceException("修改项目新闻存储失败,数据不存在", HttpStatus.NOT_FOUND);
}
// 操作数据库
boolean update = this.updateById(projectNews);
if (!update) {
throw new ServiceException("修改项目新闻存储失败,数据库异常", HttpStatus.ERROR);
}
return true;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BusProjectNews entity, Boolean create) {
// TODO 做一些数据校验,如唯一约束
Long projectId = entity.getProjectId();
if (create) {
if (projectId == null) {
throw new ServiceException("项目id不能为空", HttpStatus.BAD_REQUEST);
}
}
if (projectId != null && projectService.getById(projectId) == null) {
throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND);
}
}
/**
* 校验并批量删除项目新闻信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
Long userId = LoginHelper.getUserId();
List<BusProjectNews> projectNewsList = this.listByIds(ids);
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
List<Long> projectId = projectNewsList.stream().map(BusProjectNews::getProjectId).toList();
projectService.validAuth(projectId, userId);
}
return this.removeBatchByIds(ids);
}
/**
* 获取项目新闻存储视图对象
*
* @param projectNews 项目新闻存储对象
* @return 项目新闻存储视图对象
*/
@Override
public BusProjectNewsVo getVo(BusProjectNews projectNews) {
// 对象转封装类
BusProjectNewsVo projectNewsVo = new BusProjectNewsVo();
if (projectNews == null) {
return projectNewsVo;
}
BeanUtils.copyProperties(projectNews, projectNewsVo);
return projectNewsVo;
}
/**
* 获取项目新闻存储查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
@Override
public LambdaQueryWrapper<BusProjectNews> buildQueryWrapper(BusProjectNewsQueryReq req) {
LambdaQueryWrapper<BusProjectNews> lqw = new LambdaQueryWrapper<>();
Long projectId = req.getProjectId();
lqw.eq(ObjectUtils.isNotEmpty(projectId), BusProjectNews::getProjectId, projectId);
return lqw;
}
/**
* 获取项目新闻存储分页对象视图
*
* @param projectNewsPage 项目新闻存储分页对象
* @return 项目新闻存储分页对象视图
*/
@Override
public Page<BusProjectNewsVo> getVoPage(Page<BusProjectNews> projectNewsPage) {
List<BusProjectNews> projectNewsList = projectNewsPage.getRecords();
Page<BusProjectNewsVo> projectNewsVoPage = new Page<>(
projectNewsPage.getCurrent(),
projectNewsPage.getSize(),
projectNewsPage.getTotal());
if (CollUtil.isEmpty(projectNewsList)) {
return projectNewsVoPage;
}
List<BusProjectNewsVo> projectNewsVoList = projectNewsList.stream().map(this::getVo).toList();
projectNewsVoPage.setRecords(projectNewsVoList);
return projectNewsVoPage;
}
/**
* 获取项目新闻存储列表视图对象
*
* @param projectNewsList 项目新闻存储列表对象
* @return 项目新闻存储列表视图对象
*/
@Override
public List<BusProjectNewsVo> getVoList(List<BusProjectNews> projectNewsList) {
return projectNewsList.stream().map(this::getVo).toList();
}
}

View File

@ -0,0 +1,133 @@
package org.dromara.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.BusProjectPunchrange;
import org.dromara.system.domain.bo.BusProjectPunchrangeBo;
import org.dromara.system.domain.vo.projectpunchrange.BusProjectPunchrangeVo;
import org.dromara.system.mapper.BusProjectPunchrangeMapper;
import org.dromara.system.service.IBusProjectPunchrangeService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 项目打卡范围Service业务层处理
*
* @author Lion Li
* @date 2025-07-28
*/
@RequiredArgsConstructor
@Service
public class BusProjectPunchrangeServiceImpl extends ServiceImpl<BusProjectPunchrangeMapper, BusProjectPunchrange>
implements IBusProjectPunchrangeService {
/**
* 查询项目打卡范围
*
* @param id 主键
* @return 项目打卡范围
*/
@Override
public BusProjectPunchrangeVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 分页查询项目打卡范围列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 项目打卡范围分页列表
*/
@Override
public TableDataInfo<BusProjectPunchrangeVo> queryPageList(BusProjectPunchrangeBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BusProjectPunchrange> lqw = buildQueryWrapper(bo);
Page<BusProjectPunchrangeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的项目打卡范围列表
*
* @param bo 查询条件
* @return 项目打卡范围列表
*/
@Override
public List<BusProjectPunchrangeVo> queryList(BusProjectPunchrangeBo bo) {
LambdaQueryWrapper<BusProjectPunchrange> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<BusProjectPunchrange> buildQueryWrapper(BusProjectPunchrangeBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BusProjectPunchrange> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(BusProjectPunchrange::getId);
lqw.eq(bo.getProjectId() != null, BusProjectPunchrange::getProjectId, bo.getProjectId());
lqw.like(StringUtils.isNotBlank(bo.getPunchName()), BusProjectPunchrange::getPunchName, bo.getPunchName());
lqw.eq(StringUtils.isNotBlank(bo.getPunchRange()), BusProjectPunchrange::getPunchRange, bo.getPunchRange());
lqw.eq(StringUtils.isNotBlank(bo.getPunchColor()), BusProjectPunchrange::getPunchColor, bo.getPunchColor());
return lqw;
}
/**
* 新增项目打卡范围
*
* @param bo 项目打卡范围
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(BusProjectPunchrangeBo bo) {
BusProjectPunchrange add = MapstructUtils.convert(bo, BusProjectPunchrange.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改项目打卡范围
*
* @param bo 项目打卡范围
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(BusProjectPunchrangeBo bo) {
BusProjectPunchrange update = MapstructUtils.convert(bo, BusProjectPunchrange.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BusProjectPunchrange entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除项目打卡范围信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,654 @@
package org.dromara.system.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.PhoneUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
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.system.api.model.LoginUser;
import org.dromara.system.controller.constant.BusProjectConstant;
import org.dromara.system.domain.BusProject;
import org.dromara.system.domain.BusProjectFile;
import org.dromara.system.domain.BusProjectPunchrange;
import org.dromara.system.domain.BusUserProjectRelevancy;
import org.dromara.system.domain.bo.Punchrange;
import org.dromara.system.domain.dto.project.*;
import org.dromara.system.domain.vo.project.BusProjectGisVo;
import org.dromara.system.domain.vo.project.BusProjectSafetyDayVo;
import org.dromara.system.domain.vo.project.BusProjectVo;
import org.dromara.system.domain.vo.project.BusSubProjectVo;
import org.dromara.system.mapper.BusProjectMapper;
import org.dromara.system.service.IBusProjectFileService;
import org.dromara.system.service.IBusProjectPunchrangeService;
import org.dromara.system.service.IBusProjectService;
import org.dromara.system.service.IBusUserProjectRelevancyService;
import org.springframework.beans.BeanUtils;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static org.dromara.common.satoken.utils.LoginHelper.LOGIN_USER_KEY;
/**
* 项目Service业务层处理
*
* @author lilemy
* @date 2025-03-04
*/
@Slf4j
@Service
public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProject>
implements IBusProjectService {
@Lazy
@Resource
private IBusUserProjectRelevancyService userProjectRelevancyService;
@Lazy
@Resource
private IBusProjectFileService projectFileService;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private IBusProjectPunchrangeService busProjectPunchrangeService;
/**
* 查询项目
*
* @param id 主键
* @return 项目
*/
@Override
public BusProjectVo queryById(Long id) {
BusProject project = this.getById(id);
if (project == null) {
throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND);
}
BusProjectVo vo = this.getVo(project);
//成功获取项目信息过后,还需要获取打卡范围
List<BusProjectPunchrange> punchrangeList = busProjectPunchrangeService.lambdaQuery()
.eq(BusProjectPunchrange::getProjectId, id)
.list();
if (!punchrangeList.isEmpty()) {
List<Punchrange> punchranges = BeanUtil.copyToList(punchrangeList, Punchrange.class);
vo.setPunchrangeList(punchranges);
}
return vo;
}
/**
* 分页查询项目列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 项目分页列表
*/
@Override
public TableDataInfo<BusProjectVo> queryPageList(BusProjectQueryReq req, PageQuery pageQuery) {
LambdaQueryWrapper<BusProject> lqw = this.buildQueryWrapper(req);
// 查询数据库
Page<BusProject> result = this.page(pageQuery.build(), lqw);
return TableDataInfo.build(this.getVoPage(result));
}
/**
* 查询符合条件的项目列表
*
* @param req 查询条件
* @return 项目列表
*/
@Override
public List<BusProjectVo> queryList(BusProjectQueryReq req) {
LambdaQueryWrapper<BusProject> lqw = this.buildQueryWrapper(req);
return this.list(lqw).stream().map(this::getVo).toList();
}
/**
* 查询项目下的子项目列表
*
* @param id 父项目id
* @return 项目下的子项目列表
*/
@Override
public List<BusSubProjectVo> querySubList(Long id) {
BusProject project = this.getById(id);
if (project == null) {
throw new ServiceException("查询项目不存在", HttpStatus.NOT_FOUND);
}
List<BusProject> subProjectList = this.list(new LambdaQueryWrapper<BusProject>()
.eq(BusProject::getParentId, id));
return subProjectList.stream().map(subProject -> {
BusSubProjectVo subProjectVo = new BusSubProjectVo();
BeanUtils.copyProperties(subProject, subProjectVo);
return subProjectVo;
}).toList();
}
/**
* 新增项目
*
* @param req 项目
* @return 新项目 id
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Long insertByBo(BusProjectCreateReq req) {
// 将实体类和 DTO 进行转换
BusProject project = new BusProject();
BeanUtils.copyProperties(req, project);
String playCardStart = req.getPlayCardStart();
String playCardEnd = req.getPlayCardEnd();
String punchRange = playCardStart + "," + playCardEnd;
project.setPunchRange(punchRange);
// 数据校验
validEntityBeforeSave(project, true);
if (this.lambdaQuery().eq(BusProject::getProjectName, req.getProjectName()).count() > 0) {
throw new ServiceException("项目名称已存在", HttpStatus.BAD_REQUEST);
}
if (this.lambdaQuery().eq(BusProject::getShortName, req.getShortName()).count() > 0) {
throw new ServiceException("项目简称已存在", HttpStatus.BAD_REQUEST);
}
// 写入数据库
boolean save = this.save(project);
if (!save) {
throw new ServiceException("新增项目失败,数据库异常", HttpStatus.ERROR);
}
Long projectId = project.getId();
// 保存管理员与项目关联
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);
}
// 返回新写入的数据 projectId
return projectId;
}
/**
* 新增子项目
*
* @param dto 子项目
* @return 子项目 id
*/
@Override
public Long insertSubByProject(BusProjectCreateSubReq dto) {
String projectName = dto.getProjectName();
Long parentId = dto.getParentId();
if (StringUtils.isBlank(projectName)) {
throw new ServiceException("子项目名称不能为空", HttpStatus.BAD_REQUEST);
}
BusProject project = this.getById(parentId);
if (project == null) {
throw new ServiceException("父项目不存在", HttpStatus.NOT_FOUND);
}
// 权限校验
Long userId = LoginHelper.getUserId();
validAuth(project.getId(), userId);
BusProject subProject = new BusProject();
subProject.setParentId(parentId);
subProject.setProjectName(projectName);
subProject.setProjectType(project.getProjectType());
boolean save = this.save(subProject);
if (!save) {
throw new ServiceException("新增子项目失败,数据库异常", HttpStatus.ERROR);
}
Long subProjectId = subProject.getId();
// 同步保存用户与项目关联
Set<Long> userIdList = new HashSet<>(List.of(userId, SystemConstants.SUPER_ADMIN_ID));
List<BusUserProjectRelevancy> userProjectRelevancyList = userIdList.stream().map(id -> {
BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy();
userProjectRelevancy.setUserId(id);
userProjectRelevancy.setProjectId(subProjectId);
return userProjectRelevancy;
}).toList();
boolean saveRelevancy = userProjectRelevancyService.saveBatch(userProjectRelevancyList);
if (!saveRelevancy) {
throw new ServiceException("新增用户与项目关联失败,数据库异常", HttpStatus.ERROR);
}
return subProjectId;
}
/**
* 修改项目
*
* @param req 项目
* @return 是否修改成功
*/
@Override
@Transactional
public Boolean updateByBo(BusProjectUpdateReq req) {
// 将实体类和 DTO 进行转换
BusProject project = new BusProject();
BeanUtils.copyProperties(req, project);
String playCardStart = req.getPlayCardStart();
String playCardEnd = req.getPlayCardEnd();
if (StringUtils.isNotBlank(playCardStart) && StringUtils.isNotBlank(playCardEnd)) {
String punchRange = playCardStart + "," + playCardEnd;
project.setPunchRange(punchRange);
}
// 数据校验
validEntityBeforeSave(project, false);
// 权限校验
Long userId = LoginHelper.getUserId();
validAuth(project.getId(), userId);
// 判断是否存在
BusProject oldProject = this.getById(project.getId());
if (oldProject == null) {
throw new ServiceException("修改项目失败,数据不存在", HttpStatus.NOT_FOUND);
}
// 判断名称是否重复
if (req.getProjectName() != null && !req.getProjectName().equals(oldProject.getProjectName())) {
Long count = this.lambdaQuery().eq(BusProject::getProjectName, req.getProjectName()).count();
if (count > 0) {
throw new ServiceException("项目名称重复", HttpStatus.BAD_REQUEST);
}
}
// 操作数据库
if (this.updateById(project)) {
if (CollUtil.isNotEmpty(req.getPunchrangeList())) {
//删除所有旧的范围
busProjectPunchrangeService.remove(Wrappers.lambdaQuery(BusProjectPunchrange.class).eq(BusProjectPunchrange::getProjectId, project.getId()));
//新增打卡范围
List<BusProjectPunchrange> busProjectPunchranges = BeanUtil.copyToList(req.getPunchrangeList(), BusProjectPunchrange.class);
if (!busProjectPunchrangeService.saveBatch(busProjectPunchranges)) {
throw new ServiceException("打卡范围增加失败", HttpStatus.ERROR);
}
}
return true;
}
return false;
}
/**
* 保存项目招标文件
*
* @param req 项目招标文件
* @return 是否保存成功
*/
@Override
public Boolean saveTenderFile(BusProjectSaveTenderFileReq req) {
BusProject project = this.getById(req.getId());
if (project == null) {
throw new ServiceException("保存项目招标文件失败,数据不存在", HttpStatus.NOT_FOUND);
}
BusProject newProject = new BusProject();
newProject.setId(project.getId());
newProject.setTenderFiles(req.getTenderFiles());
boolean b = this.updateById(newProject);
if (!b) {
throw new ServiceException("保存项目招标文件失败", HttpStatus.ERROR);
}
// todo 通知给各部⻔主任
return true;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BusProject entity, Boolean create) {
// TODO 做一些数据校验,如唯一约束
String projectName = entity.getProjectName();
String principalPhone = entity.getPrincipalPhone();
// 新增项目参数验证
if (create) {
if (StringUtils.isBlank(projectName)) {
throw new ServiceException("项目名称不能为空", HttpStatus.BAD_REQUEST);
}
if (StringUtils.isBlank(principalPhone)) {
throw new ServiceException("负责人电话不能为空", HttpStatus.BAD_REQUEST);
}
}
if (StringUtils.isNotBlank(principalPhone) && !PhoneUtil.isPhone(principalPhone)) {
throw new ServiceException("负责人手机号格式不正确", HttpStatus.BAD_REQUEST);
}
}
/**
* 校验并批量删除项目信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
Long userId = LoginHelper.getUserId();
if (isValid) {
// 做一些业务上的校验,判断是否需要校验
this.validAuth(ids, userId);
// 查看是否有子项目
Long count = this.lambdaQuery()
.in(BusProject::getParentId, ids)
.count();
if (count > 0) {
throw new ServiceException("删除项目中存在子项目,请先删除子项目", HttpStatus.BAD_REQUEST);
}
}
// 删除项目
boolean removeProjectList = this.removeBatchByIds(ids);
if (!removeProjectList) {
throw new ServiceException("删除项目失败,数据库异常", HttpStatus.ERROR);
}
// 删除用户与项目关联表
LambdaQueryWrapper<BusUserProjectRelevancy> lqw = new LambdaQueryWrapper<>();
lqw.in(BusUserProjectRelevancy::getProjectId, ids);
boolean removeRelevancyList = userProjectRelevancyService.remove(lqw);
if (!removeRelevancyList) {
throw new ServiceException("删除项目与用户关联失败,数据库异常", HttpStatus.ERROR);
}
return true;
}
/**
* 获取项目视图对象
*
* @param project 项目对象
* @return 项目视图对象
*/
@Override
public BusProjectVo getVo(BusProject project) {
if (project == null) {
return null;
}
// 对象转封装类
BusProjectVo projectVo = new BusProjectVo();
BeanUtils.copyProperties(project, projectVo);
String punchRange = project.getPunchRange();
if (StringUtils.isNotBlank(punchRange)) {
String[] split = punchRange.split(",");
projectVo.setPlayCardStart(split[0]);
projectVo.setPlayCardEnd(split[1]);
}
// 关联子项目列表
List<BusProject> subProjectList = this.lambdaQuery()
.select(BusProject::getId, BusProject::getProjectName, BusProject::getCreateTime)
.eq(BusProject::getParentId, project.getId())
.list();
if (CollUtil.isNotEmpty(subProjectList)) {
List<Long> subIdList = subProjectList.stream().map(BusProject::getId).toList();
// 关联设计id
List<BusProjectFile> projectFileList = projectFileService.lambdaQuery()
.in(BusProjectFile::getProjectId, subIdList)
.list();
Map<Long, List<BusProjectFile>> map = projectFileList.stream().collect(Collectors.groupingBy(BusProjectFile::getProjectId));
List<BusSubProjectVo> 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;
}
/**
* 获取项目查询条件封装(不查询子项目)
*
* @param req 查询条件
* @return 查询条件封装
*/
@Override
public LambdaQueryWrapper<BusProject> buildQueryWrapper(BusProjectQueryReq req) {
LambdaQueryWrapper<BusProject> lqw = new LambdaQueryWrapper<>();
if (req == null) {
return lqw;
}
// 从对象中取值
String projectName = req.getProjectName();
String shortName = req.getShortName();
Long parentId = req.getParentId();
String status = req.getStatus();
String projectType = req.getProjectType();
String projectCategory = req.getProjectStage();
String projectSite = req.getProjectSite();
String principal = req.getPrincipal();
String principalPhone = req.getPrincipalPhone();
String showHidden = req.getShowHidden();
// 模糊查询
lqw.like(StringUtils.isNotBlank(projectName), BusProject::getProjectName, projectName);
lqw.like(StringUtils.isNotBlank(shortName), BusProject::getShortName, shortName);
lqw.like(StringUtils.isNotBlank(projectSite), BusProject::getProjectSite, projectSite);
lqw.like(StringUtils.isNotBlank(principal), BusProject::getPrincipal, principal);
lqw.like(StringUtils.isNotBlank(principalPhone), BusProject::getPrincipalPhone, principalPhone);
// 精确查询
lqw.eq(ObjectUtils.isNotEmpty(status), BusProject::getStatus, status);
lqw.eq(ObjectUtils.isNotEmpty(projectType), BusProject::getProjectType, projectType);
lqw.eq(ObjectUtils.isNotEmpty(projectCategory), BusProject::getProjectStage, projectCategory);
lqw.eq(ObjectUtils.isNotEmpty(showHidden), BusProject::getShowHidden, showHidden);
if (ObjectUtils.isNotEmpty(parentId)) {
lqw.eq(BusProject::getParentId, parentId);
} else {
// 不查询子项目
final Long PID = 0L;
lqw.eq(BusProject::getParentId, PID);
}
// 排序
lqw.orderByAsc(BusProject::getSort);
return lqw;
}
@Override
public Page<BusProjectVo> getVoPage(Page<BusProject> projectPage) {
List<BusProject> projectList = projectPage.getRecords();
Page<BusProjectVo> projectVoPage = new Page<>(projectPage.getCurrent(), projectPage.getSize(), projectPage.getTotal());
if (CollUtil.isEmpty(projectList)) {
return projectVoPage;
}
// 获取项目文件id
Set<Long> projectIdList = projectList.stream().map(BusProject::getId).collect(Collectors.toSet());
// 获取子项目列表
List<BusProject> subProjectList = this.lambdaQuery()
.select(BusProject::getId, BusProject::getParentId, BusProject::getProjectName, BusProject::getCreateTime)
.in(BusProject::getParentId, projectIdList)
.list();
Set<Long> subIdList = subProjectList.stream().map(BusProject::getId).collect(Collectors.toSet());
Map<Long, List<BusProject>> subProjectMap = subProjectList.stream().collect(Collectors.groupingBy(BusProject::getParentId));
Map<Long, List<BusProjectFile>> projectFileMap = projectFileService.lambdaQuery()
.in(CollUtil.isNotEmpty(subIdList), BusProjectFile::getProjectId, subIdList).list()
.stream().collect(Collectors.groupingBy(BusProjectFile::getProjectId));
// 对象列表 => 封装对象列表
List<BusProjectVo> projectVoList = projectList.stream().map(project -> {
// 对象转封装类
BusProjectVo projectVo = new BusProjectVo();
BeanUtils.copyProperties(project, projectVo);
String punchRange = project.getPunchRange();
if (StringUtils.isNotBlank(punchRange)) {
String[] split = punchRange.split(",");
projectVo.setPlayCardStart(split[0]);
projectVo.setPlayCardEnd(split[1]);
}
// 关联子项目
List<BusSubProjectVo> 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();
}
projectVo.setChildren(subProjectVoList);
return projectVo;
}).toList();
projectVoPage.setRecords(projectVoList);
return projectVoPage;
}
/**
* 校验用户是否拥有操作项目的权限
*
* @param projectId 项目对象
* @param userId 需要鉴权的用户id
*/
@Override
public void validAuth(Long projectId, Long userId) {
LambdaQueryWrapper<BusUserProjectRelevancy> lqw = new LambdaQueryWrapper<>();
lqw.eq(BusUserProjectRelevancy::getProjectId, projectId);
lqw.eq(BusUserProjectRelevancy::getUserId, userId);
if (userProjectRelevancyService.count(lqw) <= 0) {
throw new ServiceException("当前用户无该项目权限操作", HttpStatus.FORBIDDEN);
}
}
/**
* 校验用户是否拥有操作项目的权限
*
* @param projectIdList 项目id列表
* @param userId 需要鉴权的用户id
*/
@Override
public void validAuth(Collection<Long> projectIdList, Long userId) {
// 查询关联表返回和用户关联的项目ID列表
Set<Long> collect = userProjectRelevancyService.listObjs(
new LambdaQueryWrapper<BusUserProjectRelevancy>()
.select(BusUserProjectRelevancy::getProjectId)
.in(BusUserProjectRelevancy::getProjectId, projectIdList)
.eq(BusUserProjectRelevancy::getUserId, userId)
.groupBy(BusUserProjectRelevancy::getProjectId)
).stream().map(obj -> (Long) obj).collect(Collectors.toSet());
// 找出没有关联数据的项目ID
List<Long> invalidIds = projectIdList.stream()
.filter(id -> !collect.contains(id))
.toList();
if (!invalidIds.isEmpty()) {
throw new ServiceException("操作失败,项目编号为:" + invalidIds + ",没有操作权限", HttpStatus.FORBIDDEN);
}
}
/**
* 获取项目安全天数
*
* @param id 项目id
* @return 安全天数
*/
@Override
public BusProjectSafetyDayVo getSafetyDay(Long id) {
// 构建缓存 key
String cacheKey = String.format("%s:%s", BusProjectConstant.PROJECT_SAFETY_DAYS_REDIS_KEY_PREFIX, id);
// 查询分布式缓存Redis
ValueOperations<String, String> valueOps = stringRedisTemplate.opsForValue();
String cachedValue = valueOps.get(cacheKey);
if (cachedValue != null) {
// 如果命中Redis返回结果
return JSONUtil.toBean(cachedValue, BusProjectSafetyDayVo.class);
}
BusProject project = this.getById(id);
if (project == null) {
throw new ServiceException("项目信息不存在", HttpStatus.NOT_FOUND);
}
long days = DateUtils.difference(project.getCreateTime(), new Date(), TimeUnit.DAYS);
BusProjectSafetyDayVo safetyDayVo = new BusProjectSafetyDayVo();
safetyDayVo.setSafetyDay(days);
// 更新缓存
String cacheValue = JSONUtil.toJsonStr(safetyDayVo);
// 更新 Redis 缓存
int cacheExpireTime = 12;
valueOps.set(cacheKey, cacheValue, cacheExpireTime, TimeUnit.HOURS);
// 返回结果
return safetyDayVo;
}
/**
* 获取项目地址信息
*
* @return 项目地址信息列表
*/
@Override
public List<BusProjectGisVo> getGisList() {
// 查询所有的顶级项目
List<BusProject> projects = this.lambdaQuery()
.eq(BusProject::getParentId, BusProjectConstant.PARENT_ID)
.eq(BusProject::getStatus, "0")
.list();
return projects.stream().map(project -> {
BusProjectGisVo vo = new BusProjectGisVo();
BeanUtils.copyProperties(project, vo);
return vo;
}).toList();
}
/**
* 改变项目所属用户
*
* @param id 项目id
* @return 是否成功
*/
@Override
public Boolean changeUserProject(Long id) {
// 将用户选择项目设置到缓存中
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser != null) {
loginUser.setProjectId(id);
StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
return true;
}
return false;
}
@Override
public BusProjectVo selectById(Long projectId) {
return baseMapper.selectVoById(projectId);
}
@Override
public List<BusProjectVo> selectProjectVoList() {
return baseMapper.selectVoList();
}
/**
* 通过项目ID查询项目名称
*
* @param projectId 项目ID
* @return 项目名称
*/
@Cacheable(cacheNames = CacheNames.PROJECT_NAME, key = "#projectId")
@Override
public String getProjectNameById(Long projectId) {
if (projectId == 0) {
return null;
}
BusProject project = this.lambdaQuery()
.select(BusProject::getProjectName)
.eq(BusProject::getId, projectId)
.one();
return project != null ? project.getProjectName() : null;
}
}

View File

@ -0,0 +1,462 @@
package org.dromara.system.service.impl;
import cn.hutool.core.collection.CollUtil;
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;
import jakarta.annotation.Resource;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
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.system.controller.constant.BusProjectConstant;
import org.dromara.system.domain.BusProject;
import org.dromara.system.domain.BusUserProjectRelevancy;
import org.dromara.system.domain.dto.project.BusProjectBatchByProjectListReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyCreateReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyQueryReq;
import org.dromara.system.domain.dto.userprojectrelevancy.BusUserProjectRelevancyUpdateReq;
import org.dromara.system.domain.vo.userprojectrelevancy.BusLoginUserProjectRelevancyVo;
import org.dromara.system.domain.vo.userprojectrelevancy.BusUserProjectRelevancyVo;
import org.dromara.system.mapper.BusUserProjectRelevancyMapper;
import org.dromara.system.service.IBusProjectService;
import org.dromara.system.service.IBusUserProjectRelevancyService;
import org.dromara.system.service.ISysUserService;
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.*;
import java.util.stream.Collectors;
/**
* 系统用户与项目关联Service业务层处理
*
* @author lilemy
* @date 2025-03-04
*/
@Service
public class BusUserProjectRelevancyServiceImpl extends ServiceImpl<BusUserProjectRelevancyMapper, BusUserProjectRelevancy>
implements IBusUserProjectRelevancyService {
@Resource
private IBusProjectService projectService;
@Lazy
@Resource
private ISysUserService userService;
/**
* 查询系统用户与项目关联
*
* @param id 主键
* @return 系统用户与项目关联
*/
@Override
public BusUserProjectRelevancyVo queryById(Long id) {
// 查询数据
BusUserProjectRelevancy userProjectRelevancy = this.getById(id);
if (userProjectRelevancy == null) {
throw new ServiceException("对应用户与项目关联不存在", HttpStatus.NOT_FOUND);
}
// 封装并返回
return this.getVo(userProjectRelevancy);
}
/**
* 分页查询系统用户与项目关联列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 系统用户与项目关联分页列表
*/
@Override
public TableDataInfo<BusUserProjectRelevancyVo> queryPageList(BusUserProjectRelevancyQueryReq req, PageQuery pageQuery) {
// 查询数据库
Page<BusUserProjectRelevancy> result = this.page(pageQuery.build(), this.buildQueryWrapper(req));
return TableDataInfo.build(this.getVoPage(result));
}
/**
* 查询符合条件的系统用户与项目关联列表
*
* @param req 查询条件
* @return 系统用户与项目关联列表
*/
@Override
public List<BusUserProjectRelevancyVo> queryList(BusUserProjectRelevancyQueryReq req) {
LambdaQueryWrapper<BusUserProjectRelevancy> lqw = this.buildQueryWrapper(req);
return this.list(lqw).stream().map(this::getVo).toList();
}
/**
* 新增系统用户与项目关联
*
* @param req 系统用户与项目关联
* @return 新增关联id
*/
@Override
public Long insertByBo(BusUserProjectRelevancyCreateReq req) {
// 将实体类和 DTO 进行转换
BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy();
BeanUtils.copyProperties(req, userProjectRelevancy);
// 数据校验
validEntityBeforeSave(userProjectRelevancy, true);
// 判断对应的用户与项目关联是否存在
if (this.getOne(new LambdaQueryWrapper<BusUserProjectRelevancy>()
.eq(BusUserProjectRelevancy::getUserId, userProjectRelevancy.getUserId())
.eq(BusUserProjectRelevancy::getProjectId, userProjectRelevancy.getProjectId())) != null) {
throw new ServiceException("用户和项目关联已存在", HttpStatus.CONFLICT);
}
// 写入数据库
boolean save = this.save(userProjectRelevancy);
if (!save) {
throw new ServiceException("新增用户和项目关联失败,数据库异常", HttpStatus.ERROR);
}
// 返回新写入的数据 id
return userProjectRelevancy.getId();
}
/**
* 批量新增用户和项目关联
*
* @param projectId 项目ID
* @param userIdList 用户ID列表
* @param userType 用户类型
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void saveBatchByUserList(Long projectId, List<Long> userIdList, String userType) {
if (ObjectUtils.isEmpty(projectId) || ObjectUtils.isEmpty(userIdList)) {
return;
}
List<BusUserProjectRelevancy> userProjectRelevancyList = userIdList.stream().map(userId -> {
BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy();
userProjectRelevancy.setUserId(userId);
userProjectRelevancy.setProjectId(projectId);
userProjectRelevancy.setUserType(userType);
return userProjectRelevancy;
}).toList();
boolean saveRelevancy = this.saveBatch(userProjectRelevancyList);
if (!saveRelevancy) {
throw new ServiceException("新增用户和项目关联失败,数据库异常", HttpStatus.ERROR);
}
}
/**
* 批量新增用户和项目关联
*
* @param projectIdList 项目ID列表
* @param userId 用户ID
* @param userType 用户类型
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void saveBatchByProjectList(List<Long> projectIdList, Long userId, String userType) {
if (ObjectUtils.isEmpty(projectIdList) || ObjectUtils.isEmpty(userId) || StringUtils.isBlank(userType)) {
return;
}
List<BusUserProjectRelevancy> userProjectRelevancyList = projectIdList.stream().map(projectId -> {
BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy();
userProjectRelevancy.setUserId(userId);
userProjectRelevancy.setProjectId(projectId);
userProjectRelevancy.setUserType(userType);
return userProjectRelevancy;
}).toList();
boolean saveRelevancy = this.saveBatch(userProjectRelevancyList);
if (!saveRelevancy) {
throw new ServiceException("新增用户和项目关联失败,数据库异常", HttpStatus.ERROR);
}
}
/**
* 修改系统用户与项目关联
*
* @param req 系统用户与项目关联
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(BusUserProjectRelevancyUpdateReq req) {
// 将实体类和 DTO 进行转换
BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy();
BeanUtils.copyProperties(req, userProjectRelevancy);
// 数据校验
validEntityBeforeSave(userProjectRelevancy, false);
// 判断是否存在
BusUserProjectRelevancy oldUserProjectRelevancy = this.getById(userProjectRelevancy.getId());
if (oldUserProjectRelevancy == null) {
throw new ServiceException("修改用户和项目关联失败,数据不存在", HttpStatus.NOT_FOUND);
}
// 操作数据库
return this.updateById(oldUserProjectRelevancy);
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BusUserProjectRelevancy entity, Boolean create) {
// TODO 做一些数据校验,如唯一约束
Long projectId = entity.getProjectId();
Long userId = entity.getUserId();
if (create) {
if (projectId == null) {
throw new ServiceException("项目 id 不能为空", HttpStatus.BAD_REQUEST);
}
if (userId == null) {
throw new ServiceException("用户 id 不能为空", HttpStatus.BAD_REQUEST);
}
}
// 判断对应项目是否存在
if (projectService.getById(projectId) == null) {
throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND);
}
// 判断对应用户是否存在
if (userService.selectUserById(userId) == null) {
throw new ServiceException("用户不存在", HttpStatus.NOT_FOUND);
}
}
/**
* 校验并批量删除系统用户与项目关联信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
// 获取当前登录用户
Long userId = LoginHelper.getUserId();
// 获取待删除数据详情
List<BusUserProjectRelevancy> busUserProjectRelevancyList = this.listByIds(ids);
if (isValid) {
// 做一些业务上的校验,判断是否需要校验
// 获取项目id列表
List<Long> projectIdList = busUserProjectRelevancyList.stream().map(BusUserProjectRelevancy::getProjectId).toList();
// 判断是否有权限操作对应项目下的内容
projectService.validAuth(projectIdList, userId);
}
// 判断对应数据是否都存在
if (busUserProjectRelevancyList.size() != ids.size()) {
throw new ServiceException("删除系统用户与项目关联失败,数据缺失", HttpStatus.BAD_REQUEST);
}
return this.removeBatchByIds(ids);
}
/**
* 根据用户ID删除系统用户与项目关联
*
* @param userId 用户ID
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByUserId(Long userId) {
List<BusUserProjectRelevancy> relevancyList = this.lambdaQuery()
.eq(BusUserProjectRelevancy::getUserId, userId)
.list();
if (CollUtil.isNotEmpty(relevancyList)) {
boolean result = this.removeBatchByIds(relevancyList);
if (!result) {
throw new ServiceException("删除用户项目关联失败,数据库异常", HttpStatus.ERROR);
}
}
}
/**
* 根据项目ID和用户ID列表删除系统用户与项目关联
*
* @param oldProjectId 项目ID
* @param userIds 用户ID列表
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByProjectAndUserIds(Long oldProjectId, List<Long> userIds) {
List<BusUserProjectRelevancy> relevancyList = this.lambdaQuery()
.eq(BusUserProjectRelevancy::getProjectId, oldProjectId)
.in(BusUserProjectRelevancy::getUserId, userIds)
.list();
if (CollUtil.isNotEmpty(relevancyList)) {
boolean result = this.removeBatchByIds(relevancyList);
if (!result) {
throw new ServiceException("删除用户项目关联失败,数据库异常", HttpStatus.ERROR);
}
}
}
/**
* 获取当前登录用户项目列表
*
* @param userId 登录用户ID
* @return 当前登录用户项目列表
*/
@Override
public List<BusLoginUserProjectRelevancyVo> queryListByUserId(Long userId) {
// 添加查询条件,根据当前用户,获取数据
LambdaQueryWrapper<BusUserProjectRelevancy> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(BusUserProjectRelevancy::getUserId, userId);
// 查询数据库,获取数据
List<BusUserProjectRelevancy> list = this.list(queryWrapper);
List<Long> projectIdList = list.stream().map(BusUserProjectRelevancy::getProjectId).toList();
if (CollUtil.isEmpty(projectIdList)) {
return new ArrayList<>();
}
Map<Long, List<BusProject>> projectMap = projectService.lambdaQuery()
.select(BusProject::getId, BusProject::getParentId, BusProject::getProjectName, BusProject::getShortName)
.in(BusProject::getId, projectIdList)
.eq(BusProject::getParentId, BusProjectConstant.PARENT_ID)
.list()
.stream().collect(Collectors.groupingBy(BusProject::getId));
// 获取封装
return list.stream()
.map(userProjectRelevancy -> {
Long projectId = userProjectRelevancy.getProjectId();
BusProject project = null;
if (projectMap.containsKey(projectId)) {
project = projectMap.get(projectId).getFirst();
}
if (project != null && project.getParentId().equals(BusProjectConstant.PARENT_ID)) {
BusLoginUserProjectRelevancyVo loginUserProjectRelevancy = new BusLoginUserProjectRelevancyVo();
loginUserProjectRelevancy.setId(userProjectRelevancy.getId());
loginUserProjectRelevancy.setUserId(userProjectRelevancy.getUserId());
loginUserProjectRelevancy.setProjectId(projectId);
loginUserProjectRelevancy.setProjectName(project.getProjectName());
loginUserProjectRelevancy.setShortName(project.getShortName());
return loginUserProjectRelevancy;
}
return null;
})
.filter(Objects::nonNull)
.toList();
}
/**
* 获取当前登录用户项目分页
*
* @param userId 登录用户ID
* @param req 分页查询条件
* @param pageQuery 分页查询条件
* @return 当前登录用户项目分页
*/
@Override
public TableDataInfo<BusUserProjectRelevancyVo> queryPageByUserId(Long userId, BusUserProjectRelevancyQueryReq req,
PageQuery pageQuery) {
// 添加查询条件
req.setUserId(userId);
LambdaQueryWrapper<BusUserProjectRelevancy> queryWrapper = this.buildQueryWrapper(req);
// 查询数据库
Page<BusUserProjectRelevancy> result = this.page(pageQuery.build(), queryWrapper);
return TableDataInfo.build(this.getVoPage(result));
}
/**
* 批量新增用户和项目关联
*
* @param req 新增参数
* @return 是否增加成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertBatchByProjectList(BusProjectBatchByProjectListReq req) {
Long userId = req.getUserId();
List<Long> projectIdList = req.getProjectIdList();
long count = projectService.count(new QueryWrapper<BusProject>().in("id", projectIdList));
if (count < projectIdList.size()) {
throw new ServiceException("项目ID列表错误一个或多个项目不存在", HttpStatus.NOT_FOUND);
}
List<BusUserProjectRelevancy> userProjectRelevancyList = projectIdList.stream().map(projectId -> {
BusUserProjectRelevancy userProjectRelevancy = new BusUserProjectRelevancy();
userProjectRelevancy.setUserId(userId);
userProjectRelevancy.setProjectId(projectId);
// 查询对应用户与项目关联信息是否存在
QueryWrapper<BusUserProjectRelevancy> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", userId);
queryWrapper.eq("project_id", projectId);
// 如果存在则不保存
BusUserProjectRelevancy one = this.getOne(queryWrapper);
if (one != null) {
return null;
}
return userProjectRelevancy;
}).filter(Objects::nonNull).toList();
if (userProjectRelevancyList.isEmpty()) {
throw new ServiceException("对应用户与项目关系均已存在,无需重复添加", HttpStatus.BAD_REQUEST);
}
// 当用户与项目关系存在时修改,不存在则保存
return this.saveOrUpdateBatch(userProjectRelevancyList);
}
/**
* 获取系统用户与项目关联视图
*
* @param userProjectRelevancy 系统用户与项目关联
* @return 系统用户与项目关联视图
*/
@Override
public BusUserProjectRelevancyVo getVo(BusUserProjectRelevancy userProjectRelevancy) {
// 对象转封装类
BusUserProjectRelevancyVo userProjectRelevancyVo = new BusUserProjectRelevancyVo();
if (userProjectRelevancy == null) {
return userProjectRelevancyVo;
}
BeanUtils.copyProperties(userProjectRelevancy, userProjectRelevancyVo);
// 关联查询项目信息
Long projectId = userProjectRelevancy.getProjectId();
if (projectId != null) {
userProjectRelevancyVo.setProject(projectService.queryById(projectId));
}
return userProjectRelevancyVo;
}
/**
* 获取用户和项目关联对象查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
@Override
public LambdaQueryWrapper<BusUserProjectRelevancy> buildQueryWrapper(BusUserProjectRelevancyQueryReq req) {
LambdaQueryWrapper<BusUserProjectRelevancy> queryWrapper = new LambdaQueryWrapper<>();
if (req == null) {
return queryWrapper;
}
// 从对象中取值
Long userId = req.getUserId();
Long projectId = req.getProjectId();
String userType = req.getUserType();
// 精确查询
queryWrapper.eq(ObjectUtils.isNotEmpty(userId), BusUserProjectRelevancy::getUserId, userId);
queryWrapper.eq(ObjectUtils.isNotEmpty(projectId), BusUserProjectRelevancy::getProjectId, projectId);
queryWrapper.eq(StringUtils.isNotBlank(userType), BusUserProjectRelevancy::getUserType, userType);
return queryWrapper;
}
/**
* 获取系统用户与项目关联分页视图
*
* @param userProjectRelevancyPage 系统用户与项目关联分页
* @return 系统用户与项目关联分页视图
*/
@Override
public Page<BusUserProjectRelevancyVo> getVoPage(Page<BusUserProjectRelevancy> userProjectRelevancyPage) {
List<BusUserProjectRelevancy> userProjectRelevancyList = userProjectRelevancyPage.getRecords();
Page<BusUserProjectRelevancyVo> userProjectRelevancyVoPage = new Page<>(
userProjectRelevancyPage.getCurrent(),
userProjectRelevancyPage.getSize(),
userProjectRelevancyPage.getTotal());
if (CollUtil.isEmpty(userProjectRelevancyList)) {
return userProjectRelevancyVoPage;
}
// 对象列表 => 封装对象列表
List<BusUserProjectRelevancyVo> userProjectRelevancyVoList = userProjectRelevancyList.stream().map(this::getVo).toList();
userProjectRelevancyVoPage.setRecords(userProjectRelevancyVoList);
return userProjectRelevancyVoPage;
}
}

View File

@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.*;
@ -26,6 +27,7 @@ import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.domain.vo.SysPostVo;
import org.dromara.system.mapper.SysDeptMapper;
import org.dromara.system.mapper.SysPostMapper;
import org.dromara.system.mapper.SysRoleMapper;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysDeptService;
@ -40,7 +42,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 部门管理 服务实现
@ -54,6 +55,7 @@ public class SysDeptServiceImpl implements ISysDeptService {
private final SysDeptMapper baseMapper;
private final SysRoleMapper roleMapper;
private final SysUserMapper userMapper;
private final SysPostMapper postMapper;
/**
* 分页查询部门管理数据
@ -101,37 +103,12 @@ public class SysDeptServiceImpl implements ISysDeptService {
lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName());
lqw.like(StringUtils.isNotBlank(bo.getDeptCategory()), SysDept::getDeptCategory, bo.getDeptCategory());
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.getDeptType()), SysDept::getDeptType, bo.getDeptType());
lqw.orderByAsc(SysDept::getAncestors);
lqw.orderByAsc(SysDept::getParentId);
lqw.orderByAsc(SysDept::getOrderNum);
lqw.orderByAsc(SysDept::getDeptId);
// Map<String, Object> params = bo.getParams();
// LambdaQueryWrapper<SysDept> lqw = Wrappers.lambdaQuery();
// lqw.eq(SysDept::getDelFlag, SystemConstants.NORMAL);
// lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), SysDept::getDeptId, bo.getDeptId());
// lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId());
// lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName());
// lqw.like(StringUtils.isNotBlank(bo.getDeptCategory()), SysDept::getDeptCategory, bo.getDeptCategory());
// lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus());
// lqw.between(params.get("beginTime") != null && params.get("endTime") != null,
// SysDept::getCreateTime, params.get("beginTime"), params.get("endTime"));
// lqw.orderByAsc(SysDept::getAncestors);
// lqw.orderByAsc(SysDept::getParentId);
// lqw.orderByAsc(SysDept::getOrderNum);
// lqw.orderByAsc(SysDept::getDeptId);
// if (ObjectUtil.isNotNull(bo.getBelongDeptId())) {
// //部门树搜索
// lqw.and(x -> {
// Long parentId = bo.getBelongDeptId();
// List<SysDept> deptList = baseMapper.selectListByParentId(parentId);
// List<Long> deptIds = StreamUtils.toList(deptList, SysDept::getDeptId);
// deptIds.add(parentId);
// x.in(SysDept::getDeptId, deptIds);
// });
// }
return lqw;
}
@ -182,61 +159,46 @@ public class SysDeptServiceImpl implements ISysDeptService {
// );
}
//TODO 同步xinnengyuan的service
// /**
// * 构建前端所需要下拉树结构
// *
// * @param projectId 项目id
// * @return 下拉树结构列表
// */
// @Override
// public List<Tree<Long>> buildDeptTreeByProjectId(Long projectId) {
// SysDept dept = baseMapper.selectOne(
// new LambdaQueryWrapper<>(SysDept.class)
// .eq(SysDept::getProjectId, projectId)
// .eq(SysDept::getDeptType, SysDeptTypeEnum.PROJECT.getCode())
// .eq(SysDept::getStatus, SystemConstants.NORMAL)
// );
// if (dept == null) {
// return List.of();
// }
// List<Long> deptIds = Stream.concat(
// Arrays.stream(dept.getAncestors().split(","))
// .filter(StringUtils::isNotBlank)
// .map(Long::parseLong),
// Stream.of(dept.getDeptId())
// ).toList();
// List<SysDeptVo> deptVoList = baseMapper.selectVoByIds(deptIds);
// List<SysPostVo> postVos = postMapper.selectVoList(
// new LambdaQueryWrapper<>(SysPost.class)
// .in(SysPost::getDeptId, deptIds)
// .eq(SysPost::getStatus, SystemConstants.NORMAL)
// );
// Map<Long, List<SysPostVo>> postVoMap = postVos.stream().collect(Collectors.groupingBy(SysPostVo::getDeptId));
// // 获取当前列表中每一个节点的parentId然后在列表中查找是否有id与其parentId对应若无对应则表明此时节点列表中该节点在当前列表中属于顶级节点
// List<Tree<Long>> treeList = CollUtil.newArrayList();
// for (SysDeptVo d : deptVoList) {
// Long parentId = d.getParentId();
// SysDeptVo sysDeptVo = StreamUtils.findFirst(deptVoList, it -> it.getDeptId().longValue() == parentId);
// if (ObjectUtil.isNull(sysDeptVo)) {
// List<Tree<Long>> trees = TreeBuildUtils.build(deptVoList, parentId, (deptVo, tree) -> {
// Long deptId = deptVo.getDeptId();
// tree.setId(deptId)
// .setParentId(deptVo.getParentId())
// .setName(deptVo.getDeptName())
// .setWeight(deptVo.getOrderNum())
// .putExtra("disabled", SystemConstants.DISABLE.equals(deptVo.getStatus()));
// tree.putExtra("deptType", deptVo.getDeptType());
// tree.putExtra("postVoList", postVoMap.get(deptId));
// }
// );
// Tree<Long> tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId());
// treeList.add(tree);
// }
// }
// return treeList;
// }
/**
* 构建前端所需要下拉树结构
*
* @return 下拉树结构列表
*/
@Override
public List<Tree<Long>> buildDeptTree() {
List<SysDeptVo> deptVoList = baseMapper.selectVoList();
if (CollUtil.isEmpty(deptVoList)) {
return CollUtil.newArrayList();
}
List<SysPostVo> postVos = postMapper.selectVoList(
new LambdaQueryWrapper<>(SysPost.class)
.in(SysPost::getDeptId, deptVoList.stream().map(SysDeptVo::getDeptId).collect(Collectors.toSet()))
.eq(SysPost::getStatus, SystemConstants.NORMAL)
);
Map<Long, List<SysPostVo>> postVoMap = postVos.stream().collect(Collectors.groupingBy(SysPostVo::getDeptId));
// 获取当前列表中每一个节点的parentId然后在列表中查找是否有id与其parentId对应若无对应则表明此时节点列表中该节点在当前列表中属于顶级节点
List<Tree<Long>> treeList = CollUtil.newArrayList();
for (SysDeptVo d : deptVoList) {
Long parentId = d.getParentId();
SysDeptVo sysDeptVo = StreamUtils.findFirst(deptVoList, it -> it.getDeptId().longValue() == parentId);
if (ObjectUtil.isNull(sysDeptVo)) {
List<Tree<Long>> trees = TreeBuildUtils.build(deptVoList, parentId, (deptVo, tree) -> {
Long deptId = deptVo.getDeptId();
tree.setId(deptId)
.setParentId(deptVo.getParentId())
.setName(deptVo.getDeptName())
.setWeight(deptVo.getOrderNum())
.putExtra("disabled", SystemConstants.DISABLE.equals(deptVo.getStatus()));
tree.putExtra("deptType", deptVo.getDeptType());
tree.putExtra("postVoList", postVoMap.get(deptId));
}
);
Tree<Long> tree = StreamUtils.findFirst(trees, it -> it.getId().longValue() == d.getDeptId());
treeList.add(tree);
}
}
return treeList;
}
/**
* 根据角色ID查询部门树信息
@ -493,4 +455,29 @@ public class SysDeptServiceImpl implements ISysDeptService {
.eq(SysDept::getStatus, SystemConstants.NORMAL));
}
/**
* 校验部门和角色是否匹配
*
* @param deptId 部门id
* @param roleIds 角色id列表
*/
@Override
public void checkDeptMatchRole(Long deptId, List<Long> roleIds) {
if (ObjectUtil.isNull(deptId)) {
return;
}
if (LoginHelper.isSuperAdmin()) {
return;
}
List<SysRole> roleList = roleMapper.selectByIds(roleIds);
for (SysRole role : roleList) {
if (!role.getStatus().equals(SystemConstants.NORMAL)) {
throw new ServiceException("角色停用,不允许分配", HttpStatus.BAD_REQUEST);
}
if (!role.getDeptId().equals(deptId)) {
throw new ServiceException("角色部门与部门不匹配", HttpStatus.BAD_REQUEST);
}
}
}
}

View File

@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
@ -20,6 +21,7 @@ import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysRoleMenu;
import org.dromara.system.domain.SysTenantPackage;
import org.dromara.system.domain.bo.SysMenuBo;
import org.dromara.system.domain.dto.project.ProjectPermsItem;
import org.dromara.system.domain.vo.MetaVo;
import org.dromara.system.domain.vo.RouterVo;
import org.dromara.system.domain.vo.SysMenuVo;
@ -32,6 +34,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* 菜单 业务层处理
@ -100,15 +103,23 @@ public class SysMenuServiceImpl implements ISysMenuService {
* @return 权限列表
*/
@Override
public Set<String> selectMenuPermsByUserId(Long userId) {
List<String> perms = baseMapper.selectMenuPermsByUserId(userId);
Set<String> permsSet = new HashSet<>();
for (String perm : perms) {
if (StringUtils.isNotEmpty(perm)) {
permsSet.addAll(StringUtils.splitList(perm.trim()));
}
}
return permsSet;
public List<SysProjectRoleMenuVo> selectMenuPermsByUserId(Long userId) {
List<ProjectPermsItem> items = baseMapper.selectMenuPermsByUserId(userId);
return items.stream()
.filter(item -> item.getPerms() != null && !item.getPerms().isBlank()) // 过滤掉空的 perms
.collect(Collectors.groupingBy(
ProjectPermsItem::getProjectId,
Collectors.mapping(ProjectPermsItem::getPerms, Collectors.toList())
))
.entrySet().stream()
.map(e -> {
SysProjectRoleMenuVo vo = new SysProjectRoleMenuVo();
vo.setProjectId(e.getKey());
Set<String> set = new HashSet<>(e.getValue());
vo.setProjectPermissions(set);
return vo;
})
.toList();
}
/**
@ -130,20 +141,21 @@ public class SysMenuServiceImpl implements ISysMenuService {
}
/**
* 根据用户ID查询菜单
* 根据用户ID查询菜单树信息
*
* @param userId 用户名称
* @param userId 用户ID
* @param projectId 项目ID
* @return 菜单列表
*/
@Override
public List<SysMenu> selectMenuTreeByUserId(Long userId) {
public List<SysMenu> selectMenuTreeByUserId(Long userId, Long projectId) {
List<SysMenu> menus;
if (LoginHelper.isSuperAdmin(userId)) {
menus = baseMapper.selectMenuTreeAll();
} else {
menus = baseMapper.selectMenuTreeByUserId(userId);
menus = baseMapper.selectMenuTreeByUserId(userId, projectId);
}
return getChildPerms(menus, Constants.TOP_PARENT_ID);
return getChildPerms(menus, 0);
}
/**
@ -376,11 +388,11 @@ public class SysMenuServiceImpl implements ISysMenuService {
* @param parentId 传入的父节点ID
* @return String
*/
private List<SysMenu> getChildPerms(List<SysMenu> list, Long parentId) {
private List<SysMenu> getChildPerms(List<SysMenu> list, int parentId) {
List<SysMenu> returnList = new ArrayList<>();
for (SysMenu t : list) {
// 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
if (t.getParentId().equals(parentId)) {
if (t.getParentId() == parentId) {
recursionFn(list, t);
returnList.add(t);
}

View File

@ -2,13 +2,19 @@ package org.dromara.system.service.impl;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.domain.vo.SysProjectRoleMenuVo;
import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.domain.BusProject;
import org.dromara.system.service.IBusProjectService;
import org.dromara.system.service.ISysMenuService;
import org.dromara.system.service.ISysPermissionService;
import org.dromara.system.service.ISysRoleService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
@ -22,40 +28,57 @@ public class SysPermissionServiceImpl implements ISysPermissionService {
private final ISysRoleService roleService;
private final ISysMenuService menuService;
private final IBusProjectService projectService;
/**
* 获取角色数据权限
*
* @param userId 用户id
* @param userId 用户id
* @return 角色权限信息
*/
@Override
public Set<String> getRolePermission(Long userId) {
Set<String> roles = new HashSet<>();
public List<SysProjectRolePermissionVo> getRolePermission(Long userId) {
// 管理员拥有所有权限
if (LoginHelper.isSuperAdmin(userId)) {
roles.add(TenantConstants.SUPER_ADMIN_ROLE_KEY);
List<SysProjectRolePermissionVo> roles = new ArrayList<>();
List<BusProject> projects = projectService.list();
for (BusProject project : projects) {
SysProjectRolePermissionVo vo = new SysProjectRolePermissionVo();
Set<String> role = new HashSet<>();
vo.setProjectId(project.getId());
role.add(TenantConstants.SUPER_ADMIN_ROLE_KEY);
vo.setProjectRoles(role);
roles.add(vo);
}
return roles;
} else {
roles.addAll(roleService.selectRolePermissionByUserId(userId));
return roleService.selectRolePermissionByUserId(userId);
}
return roles;
}
/**
* 获取菜单数据权限
*
* @param userId 用户id
* @param userId 用户id
* @return 菜单权限信息
*/
@Override
public Set<String> getMenuPermission(Long userId) {
Set<String> perms = new HashSet<>();
public List<SysProjectRoleMenuVo> getMenuPermission(Long userId) {
// 管理员拥有所有权限
if (LoginHelper.isSuperAdmin(userId)) {
perms.add("*:*:*");
List<SysProjectRoleMenuVo> roles = new ArrayList<>();
List<BusProject> projects = projectService.list();
for (BusProject project : projects) {
SysProjectRoleMenuVo vo = new SysProjectRoleMenuVo();
Set<String> role = new HashSet<>();
vo.setProjectId(project.getId());
role.add("*:*:*");
vo.setProjectPermissions(role);
roles.add(vo);
}
return roles;
} else {
perms.addAll(menuService.selectMenuPermsByUserId(userId));
return menuService.selectMenuPermsByUserId(userId);
}
return perms;
}
}

View File

@ -13,8 +13,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.constant.TenantConstants;
import org.dromara.common.core.domain.vo.SysProjectRolePermissionVo;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
@ -23,22 +24,23 @@ 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.system.api.model.LoginUser;
import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysRoleDept;
import org.dromara.system.domain.SysRoleMenu;
import org.dromara.system.domain.SysUserRole;
import org.dromara.system.domain.*;
import org.dromara.system.domain.bo.SysRoleBo;
import org.dromara.system.domain.dto.project.ProjectRolesItem;
import org.dromara.system.domain.dto.role.SysRoleProjectDto;
import org.dromara.system.domain.vo.SysRoleVo;
import org.dromara.system.mapper.SysRoleDeptMapper;
import org.dromara.system.mapper.SysRoleMapper;
import org.dromara.system.mapper.SysRoleMenuMapper;
import org.dromara.system.mapper.SysUserRoleMapper;
import org.dromara.system.service.IBusProjectService;
import org.dromara.system.service.ISysRoleService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* 角色 业务层处理
@ -53,6 +55,7 @@ public class SysRoleServiceImpl implements ISysRoleService {
private final SysRoleMenuMapper roleMenuMapper;
private final SysUserRoleMapper userRoleMapper;
private final SysRoleDeptMapper roleDeptMapper;
private final IBusProjectService projectService;
@Override
public TableDataInfo<SysRoleVo> selectPageRoleList(SysRoleBo role, PageQuery pageQuery) {
@ -123,15 +126,29 @@ public class SysRoleServiceImpl implements ISysRoleService {
* @return 权限列表
*/
@Override
public Set<String> selectRolePermissionByUserId(Long userId) {
List<SysRoleVo> perms = baseMapper.selectRolesByUserId(userId);
Set<String> permsSet = new HashSet<>();
for (SysRoleVo perm : perms) {
if (ObjectUtil.isNotNull(perm)) {
permsSet.addAll(StringUtils.splitList(perm.getRoleKey().trim()));
}
public List<SysProjectRolePermissionVo> selectRolePermissionByUserId(Long userId) {
List<ProjectRolesItem> items = baseMapper.selectProjectRolesByUserId(userId);
// 过滤掉项目id为null的数据
items = items.stream().filter(item -> item.getProjectId() != null).toList();
if (CollUtil.isEmpty(items)) {
return new ArrayList<>();
}
return permsSet;
return items.stream()
.filter(Objects::nonNull) // 保证不为空
.peek(item -> {
if (item.getRoleKey() != null) {
item.setRoleKey(item.getRoleKey().trim()); // roleKey 去空格
}
})
.collect(Collectors.groupingBy(ProjectRolesItem::getProjectId))
.entrySet().stream()
.map(e -> {
SysProjectRolePermissionVo vo = new SysProjectRolePermissionVo();
vo.setProjectId(e.getKey());
vo.setProjectRoles(e.getValue().stream().map(ProjectRolesItem::getRoleKey).collect(Collectors.toSet()));
return vo;
})
.toList();
}
/**
@ -180,6 +197,46 @@ public class SysRoleServiceImpl implements ISysRoleService {
.in(CollUtil.isNotEmpty(roleIds), "r.role_id", roleIds));
}
/**
* 获取角色选择框列表
*
* @param userId 用户ID
* @return 角色列表
*/
@Override
public List<SysRoleProjectDto> selectRoleProjectList(Long userId) {
if (userId.equals(SystemConstants.SUPER_ADMIN_ID)) {
return List.of();
} else {
List<SysUserRole> userRoles = userRoleMapper.selectList(new LambdaQueryWrapper<>(SysUserRole.class)
.eq(SysUserRole::getUserId, userId));
if (CollUtil.isEmpty(userRoles)) {
return List.of();
}
List<Long> projectIds = userRoles.stream().map(SysUserRole::getProjectId).distinct().toList();
List<BusProject> projectList = projectService.listByIds(projectIds);
if (CollUtil.isEmpty(projectList)) {
return List.of();
}
Map<Long, List<BusProject>> projectMap = projectList.stream().collect(Collectors.groupingBy(BusProject::getId));
List<SysRoleProjectDto> list = new ArrayList<>();
Map<Long, List<SysUserRole>> map = userRoles.stream().collect(Collectors.groupingBy(SysUserRole::getProjectId));
for (Map.Entry<Long, List<SysUserRole>> entry : map.entrySet()) {
Long key = entry.getKey();
SysRoleProjectDto dto = new SysRoleProjectDto();
dto.setProjectId(key);
dto.setRoleIds(StreamUtils.toList(entry.getValue(), SysUserRole::getRoleId));
if (projectMap.containsKey(key)) {
BusProject project = projectMap.get(key).getFirst();
dto.setProjectName(project.getProjectName());
dto.setShortName(project.getShortName());
}
list.add(dto);
}
return list;
}
}
/**
* 校验角色名称是否唯一
*

View File

@ -21,11 +21,13 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.domain.*;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.dto.role.SysRoleProjectDto;
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.mapper.*;
import org.dromara.system.service.IBusUserProjectRelevancyService;
import org.dromara.system.service.ISysUserService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
@ -52,6 +54,7 @@ public class SysUserServiceImpl implements ISysUserService {
private final SysPostMapper postMapper;
private final SysUserRoleMapper userRoleMapper;
private final SysUserPostMapper userPostMapper;
private final IBusUserProjectRelevancyService userProjectRelevancyService;
@Override
public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
@ -90,6 +93,7 @@ public class SysUserServiceImpl implements ISysUserService {
LambdaQueryWrapper<SysUser> wrapper = Wrappers.lambdaQuery();
wrapper.eq(SysUser::getDelFlag, SystemConstants.NORMAL)
.eq(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())
.like(StringUtils.isNotBlank(user.getNickName()), SysUser::getNickName, user.getNickName())
.in(StringUtils.isNotBlank(user.getUserIds()), SysUser::getUserId, StringUtils.splitTo(user.getUserIds(), Convert::toLong))
.like(StringUtils.isNotBlank(user.getUserName()), SysUser::getUserName, user.getUserName())
.like(StringUtils.isNotBlank(user.getNickName()), SysUser::getNickName, user.getNickName())
@ -196,7 +200,7 @@ public class SysUserServiceImpl implements ISysUserService {
@Override
public List<SysUserVo> selectUserByIds(List<Long> userIds, Long deptId) {
return baseMapper.selectUserList(new LambdaQueryWrapper<SysUser>()
.select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber) .eq(SysUser::getStatus, SystemConstants.NORMAL)
.select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getEmail, SysUser::getPhonenumber).eq(SysUser::getStatus, SystemConstants.NORMAL)
.eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId)
.in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds));
}
@ -362,13 +366,13 @@ public class SysUserServiceImpl implements ISysUserService {
/**
* 用户授权角色
*
* @param userId 用户ID
* @param roleIds 角色
* @param userId 用户ID
* @param projectRoles 项目、角色关联
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void insertUserAuth(Long userId, Long[] roleIds) {
insertUserRole(userId, roleIds, true);
public void insertUserAuth(Long userId, List<SysRoleProjectDto> projectRoles) {
insertUserRole(userId, projectRoles, true);
}
/**
@ -441,7 +445,7 @@ public class SysUserServiceImpl implements ISysUserService {
* @param clear 清除已存在的关联数据
*/
private void insertUserRole(SysUserBo user, boolean clear) {
this.insertUserRole(user.getUserId(), user.getRoleIds(), clear);
this.insertUserRole(user.getUserId(), user.getProjectRoles(), clear);
}
/**
@ -471,13 +475,18 @@ public class SysUserServiceImpl implements ISysUserService {
/**
* 新增用户角色信息
*
* @param userId 用户ID
* @param roleIds 角色组
* @param clear 清除已存在的关联数据
* @param userId 用户ID
* @param projectRoles 角色项目关联
* @param clear 清除已存在的关联数据
*/
private void insertUserRole(Long userId, Long[] roleIds, boolean clear) {
if (ArrayUtil.isNotEmpty(roleIds)) {
List<Long> roleList = new ArrayList<>(List.of(roleIds));
private void insertUserRole(Long userId, List<SysRoleProjectDto> projectRoles, boolean clear) {
if (ArrayUtil.isNotEmpty(projectRoles)) {
// 去重后的所有 roleId
List<Long> roleList = new ArrayList<>(projectRoles.stream()
.filter(dto -> dto.getRoleIds() != null)
.flatMap(dto -> dto.getRoleIds().stream())
.distinct()
.toList());
if (!LoginHelper.isSuperAdmin(userId)) {
roleList.remove(SystemConstants.SUPER_ADMIN_ID);
}
@ -491,13 +500,35 @@ public class SysUserServiceImpl implements ISysUserService {
// 删除用户与角色关联
userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
}
// 新增用户与角色管理
List<SysUserRole> list = StreamUtils.toList(roleList, roleId -> {
SysUserRole ur = new SysUserRole();
ur.setUserId(userId);
ur.setRoleId(roleId);
return ur;
});
// 新增用户与角色、项目关联
List<SysUserRole> list = new ArrayList<>();
List<BusUserProjectRelevancy> listProject = new ArrayList<>();
for (SysRoleProjectDto dto : projectRoles) {
List<Long> roleIds = dto.getRoleIds();
Long projectId = dto.getProjectId();
if (CollUtil.isNotEmpty(roleIds) && projectId != null) {
for (Long roleId : roleIds) {
SysUserRole ur = new SysUserRole();
ur.setUserId(userId);
ur.setRoleId(roleId);
ur.setProjectId(projectId);
list.add(ur);
}
}
if (projectId != null) {
BusUserProjectRelevancy projectRelevancy = new BusUserProjectRelevancy();
projectRelevancy.setUserId(userId);
projectRelevancy.setProjectId(projectId);
listProject.add(projectRelevancy);
}
}
if (clear) {
// 删除用户与项目的关联
userProjectRelevancyService.remove(new LambdaQueryWrapper<>(BusUserProjectRelevancy.class)
.eq(BusUserProjectRelevancy::getUserId, userId));
}
// 新增用户与项目的关联
userProjectRelevancyService.saveBatch(listProject);
userRoleMapper.insertBatch(list);
}
}

View File

@ -1,6 +1,6 @@
# Tomcat
server:
port: 9201
port: 19201
# Spring
spring:

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.BusProjectFileMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.BusProjectMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.BusProjectNewsMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.BusProjectPunchrangeMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.BusUserProjectRelevancyMapper">
</mapper>

View File

@ -1,22 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.SysMenuMapper">
<resultMap type="org.dromara.system.domain.SysMenu" id="SysMenuResult">
</resultMap>
<select id="selectMenuListByUserId" resultMap="SysMenuResult">
select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.query_param, m.visible, m.status,
m.perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id
left join sys_role r on rm.role_id = r.role_id
${ew.getCustomSqlSegment}
</select>
<select id="selectMenuTreeByUserId" parameterType="Long" resultMap="SysMenuResult">
select distinct m.menu_id,
m.parent_id,
m.menu_name,
@ -32,11 +23,41 @@
m.icon,
m.order_num,
m.create_time
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id
left join sys_role r on rm.role_id = r.role_id
${ew.getCustomSqlSegment}
</select>
<select id="selectMenuTreeByUserId" resultMap="SysMenuResult">
select distinct m.menu_id,
m.parent_id,
m.menu_name,
m.path,
m.component,
m.query_param,
m.visible,
m.status,
m.perms,
m.is_frame,
m.is_cache,
m.menu_type,
m.icon,
m.order_num,
m.create_time,
m.menu_source
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id and m.status = '0'
left join sys_role r on rm.role_id = r.role_id and r.status = '0'
where m.menu_type in ('M', 'C')
and r.role_id in (select role_id from sys_user_role where user_id = #{userId})
and r.role_id in (
select role_id
from sys_user_role
where user_id = #{userId}
<if test="projectId != null">
and project_id = #{projectId}
</if>
)
order by m.parent_id, m.order_num
</select>
@ -52,19 +73,23 @@
order by m.parent_id, m.order_num
</select>
<select id="selectMenuPermsByUserId" parameterType="Long" resultType="String">
select distinct m.perms
<select id="selectMenuPermsByUserId" parameterType="Long"
resultType="org.dromara.system.domain.dto.project.ProjectPermsItem">
select distinct ur.project_id,
m.perms
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id and m.status = '0'
left join sys_role r on r.role_id = rm.role_id and r.status = '0'
where r.role_id in (select role_id from sys_user_role where user_id = #{userId})
left join sys_role_menu rm on m.menu_id = rm.menu_id and m.status = '0'
left join sys_role r on r.role_id = rm.role_id and r.status = '0'
left join sys_user_role ur on ur.role_id = r.role_id
where ur.user_id = #{userId}
</select>
<select id="selectMenuPermsByRoleId" parameterType="Long" resultType="String">
select distinct m.perms
from sys_menu m
left join sys_role_menu rm on m.menu_id = rm.menu_id
where m.status = '0' and rm.role_id = #{roleId}
where m.status = '0'
and rm.role_id = #{roleId}
</select>
</mapper>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.system.mapper.SysRoleMapper">
<resultMap type="org.dromara.system.domain.vo.SysRoleVo" id="SysRoleResult">
@ -48,12 +48,29 @@
r.data_scope,
r.status
from sys_role r
WHERE r.del_flag = '0' and r.role_id in (select role_id from sys_user_role where user_id = #{userId})
WHERE r.del_flag = '0'
and r.role_id in (select role_id from sys_user_role where user_id = #{userId})
</select>
<select id="selectRoleById" resultMap="SysRoleResult">
<include refid="selectRoleVo"/>
WHERE r.del_flag = '0' and r.role_id = #{roleId}
</select>
<select id="selectProjectRolesByUserId" parameterType="Long"
resultType="org.dromara.system.domain.dto.project.ProjectRolesItem">
select ur.project_id,
r.role_id,
r.role_name,
r.role_key,
r.dept_id,
r.role_sort,
r.data_scope,
r.status,
r.is_special
from sys_role r
inner join sys_user_role ur on r.role_id = ur.role_id
where r.del_flag = '0'
and ur.user_id = #{userId}
</select>
</mapper>