修改权限逻辑
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
|
||||
FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds
|
||||
#FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds
|
||||
#FROM bellsoft/liberica-openjdk-rocky:17.0.15-cds
|
||||
FROM bellsoft/liberica-openjdk-rocky:21.0.7-cds
|
||||
#FROM findepi/graalvm:java17-native
|
||||
|
||||
LABEL maintainer="Lion Li"
|
||||
@ -9,7 +9,7 @@ RUN mkdir -p /ruoyi/gen/logs
|
||||
|
||||
WORKDIR /ruoyi/gen
|
||||
|
||||
ENV SERVER_PORT=9202 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
|
||||
ENV SERVER_PORT=19202 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
|
||||
|
||||
EXPOSE ${SERVER_PORT}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# Tomcat
|
||||
server:
|
||||
port: 9202
|
||||
port: 19202
|
||||
|
||||
# Spring
|
||||
spring:
|
||||
|
||||
@ -11,7 +11,7 @@ RUN mkdir -p /ruoyi/resource/logs \
|
||||
|
||||
WORKDIR /ruoyi/resource
|
||||
|
||||
ENV SERVER_PORT=9204 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
|
||||
ENV SERVER_PORT=19204 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""
|
||||
|
||||
EXPOSE ${SERVER_PORT}
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# Tomcat
|
||||
server:
|
||||
port: 9204
|
||||
port: 19204
|
||||
|
||||
# Spring
|
||||
spring:
|
||||
|
||||
@ -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}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据部门编号获取详细信息
|
||||
*
|
||||
|
||||
@ -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),
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -106,6 +106,11 @@ public class SysMenu extends BaseEntity {
|
||||
@TableField(exist = false)
|
||||
private String parentName;
|
||||
|
||||
/**
|
||||
* 菜单类型(menu_source) 1-web2-app
|
||||
*/
|
||||
private String menuSource;
|
||||
|
||||
/**
|
||||
* 子菜单
|
||||
*/
|
||||
|
||||
@ -26,6 +26,11 @@ public class SysRole extends TenantEntity {
|
||||
@TableId(value = "role_id")
|
||||
private Long roleId;
|
||||
|
||||
/**
|
||||
* 部门ID
|
||||
*/
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 角色名称
|
||||
*/
|
||||
|
||||
@ -26,4 +26,9 @@ public class SysUserRole {
|
||||
*/
|
||||
private Long roleId;
|
||||
|
||||
/**
|
||||
* 项目ID
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -107,5 +107,10 @@ public class SysMenuBo extends BaseEntity {
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 菜单类型(menu_source) 1-web2-app
|
||||
*/
|
||||
private String menuSource;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -28,6 +28,16 @@ public class SysRoleBo extends BaseEntity {
|
||||
*/
|
||||
private Long roleId;
|
||||
|
||||
/**
|
||||
* 部门ID
|
||||
*/
|
||||
private Long deptId;
|
||||
|
||||
/**
|
||||
* 角色类型 1-web 2-app
|
||||
*/
|
||||
private String roleSource;
|
||||
|
||||
/**
|
||||
* 角色名称
|
||||
*/
|
||||
|
||||
@ -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
|
||||
*/
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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<>();
|
||||
|
||||
}
|
||||
|
||||
@ -108,6 +108,11 @@ public class SysMenuVo implements Serializable {
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
* 菜单类型(menu_source) 1-web2-app
|
||||
*/
|
||||
private String menuSource;
|
||||
|
||||
/**
|
||||
* 子菜单
|
||||
*/
|
||||
|
||||
@ -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:部门及以下或本人数据权限)
|
||||
*/
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -139,4 +139,9 @@ public class SysUserVo implements Serializable {
|
||||
*/
|
||||
private Long roleId;
|
||||
|
||||
/**
|
||||
* 项目组
|
||||
*/
|
||||
private List<Long> projectIds;
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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());
|
||||
|
||||
@ -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> {
|
||||
|
||||
}
|
||||
@ -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> {
|
||||
|
||||
}
|
||||
@ -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> {
|
||||
|
||||
}
|
||||
@ -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> {
|
||||
|
||||
}
|
||||
@ -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> {
|
||||
|
||||
}
|
||||
@ -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查询菜单树信息
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
@ -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);
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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查询菜单树信息
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
/**
|
||||
* 校验角色名称是否唯一
|
||||
*
|
||||
|
||||
@ -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);
|
||||
|
||||
/**
|
||||
* 修改用户状态
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验角色名称是否唯一
|
||||
*
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# Tomcat
|
||||
server:
|
||||
port: 9201
|
||||
port: 19201
|
||||
|
||||
# Spring
|
||||
spring:
|
||||
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user