添加项目增删改查接口,以及用户和项目关联增删改查接口

This commit is contained in:
lcj
2025-03-05 16:23:44 +08:00
parent 8a926e0047
commit 93e8ee265f
31 changed files with 2266 additions and 7 deletions

View File

@ -261,7 +261,7 @@ management:
--- # 默认/推荐使用sse推送
sse:
enabled: false
enabled: true
path: /resource/sse
--- # websocket

View File

@ -0,0 +1,31 @@
package org.dromara.common.core.common;
import lombok.Data;
import org.dromara.common.core.constant.CommonConstant;
/**
* 分页请求
*/
@Data
public class PageRequest {
/**
* 当前页号
*/
private int current = 1;
/**
* 页面大小
*/
private int pageSize = 10;
/**
* 排序字段
*/
private String sortField;
/**
* 排序顺序(默认升序)
*/
private String sortOrder = CommonConstant.SORT_ORDER_ASC;
}

View File

@ -0,0 +1,18 @@
package org.dromara.common.core.constant;
/**
* 通用常量
*/
public interface CommonConstant {
/**
* 升序
*/
String SORT_ORDER_ASC = "ascend";
/**
* 降序
*/
String SORT_ORDER_DESC = " descend";
}

View File

@ -53,4 +53,17 @@ public class SqlUtil {
}
}
}
/**
* 校验排序字段是否合法(防止 SQL 注入)
*
* @param sortField 排序字段
* @return 是否存在 SQL 注入
*/
public static boolean validSortField(String sortField) {
if (StringUtils.isBlank(sortField)) {
return false;
}
return !StringUtils.containsAny(sortField, "=", "(", ")", " ");
}
}

View File

@ -33,8 +33,8 @@ public class BaseEntity implements Serializable {
/**
* 创建部门
*/
@TableField(fill = FieldFill.INSERT)
private Long createDept;
/* @TableField(fill = FieldFill.INSERT)
private Long createDept;*/
/**
* 创建者

View File

@ -44,7 +44,7 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler {
// 填充创建人、更新人和创建部门信息
baseEntity.setCreateBy(userId);
baseEntity.setUpdateBy(userId);
baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), loginUser.getDeptId()));
// baseEntity.setCreateDept(ObjectUtils.notNull(baseEntity.getCreateDept(), loginUser.getDeptId()));
}
}
} else {

View File

@ -0,0 +1,113 @@
package org.dromara.project.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
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.web.core.BaseController;
import org.dromara.project.domain.bo.ProjectBo;
import org.dromara.project.domain.req.project.ProjectCreateReq;
import org.dromara.project.domain.req.project.ProjectQueryReq;
import org.dromara.project.domain.req.project.ProjectUpdateReq;
import org.dromara.project.domain.vo.ProjectVo;
import org.dromara.project.service.IProjectService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 项目
*
* @author lcj
* @date 2025-03-04
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/project/project")
public class ProjectController extends BaseController {
private final IProjectService projectService;
/**
* 查询项目列表
*/
@SaCheckPermission("project:project:list")
@GetMapping("/list")
public Page<ProjectVo> list(ProjectQueryReq req) {
return projectService.queryPageList(req);
}
/**
* 导出项目列表
*/
@SaCheckPermission("project:project:export")
@Log(title = "项目", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ProjectBo bo, HttpServletResponse response) {
List<ProjectVo> list = projectService.queryList(bo);
ExcelUtil.exportExcel(list, "项目", ProjectVo.class, response);
}
/**
* 获取项目详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:project:query")
@GetMapping("/{id}")
public R<ProjectVo> 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 ProjectCreateReq req) {
if (req == null) {
throw new ServiceException("参数不能为空", HttpStatus.BAD_REQUEST);
}
return R.ok(projectService.insertByBo(req));
}
/**
* 修改项目
*/
@SaCheckPermission("project:project:edit")
@Log(title = "项目", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProjectUpdateReq req) {
return toAjax(projectService.updateByBo(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));
}
}

View File

@ -0,0 +1,132 @@
package org.dromara.project.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BaseController;
import org.dromara.project.domain.bo.UserProjectRelevancyBo;
import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyCreateReq;
import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyQueryReq;
import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyUpdateReq;
import org.dromara.project.domain.resp.userprojectrelevancy.LoginUserProjectRelevancyResp;
import org.dromara.project.domain.vo.UserProjectRelevancyVo;
import org.dromara.project.service.IUserProjectRelevancyService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 系统用户与项目关联
*
* @author lcj
* @date 2025-03-04
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/project/projectRelevancy")
public class UserProjectRelevancyController extends BaseController {
private final IUserProjectRelevancyService userProjectRelevancyService;
/**
* 查询系统用户与项目关联列表
*/
@SaCheckPermission("project:projectRelevancy:list")
@GetMapping("/list")
public TableDataInfo<UserProjectRelevancyVo> list(UserProjectRelevancyBo bo, PageQuery pageQuery) {
return userProjectRelevancyService.queryPageList(bo, pageQuery);
}
/**
* 查询登录用户与项目关联列表
*/
@SaCheckPermission("project:projectRelevancy:list")
@GetMapping("/login/list")
public R<List<LoginUserProjectRelevancyResp>> listByLoginUser() {
Long userId = LoginHelper.getUserId();
return R.ok(userProjectRelevancyService.queryListByUserId(userId));
}
/**
* 查询登录用户与项目关联分页
*/
@SaCheckPermission("project:projectRelevancy:list")
@GetMapping("/login/page")
public R<Page<UserProjectRelevancyVo>> pageByLoginUser(UserProjectRelevancyQueryReq req) {
Long userId = LoginHelper.getUserId();
return R.ok(userProjectRelevancyService.queryPageByUserId(userId, req));
}
/**
* 导出系统用户与项目关联列表
*/
@SaCheckPermission("project:projectRelevancy:export")
@Log(title = "系统用户与项目关联", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(UserProjectRelevancyBo bo, HttpServletResponse response) {
List<UserProjectRelevancyVo> list = userProjectRelevancyService.queryList(bo);
ExcelUtil.exportExcel(list, "系统用户与项目关联", UserProjectRelevancyVo.class, response);
}
/**
* 获取系统用户与项目关联详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:projectRelevancy:query")
@GetMapping("/{id}")
public R<UserProjectRelevancyVo> 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(AddGroup.class) @RequestBody UserProjectRelevancyCreateReq req) {
return R.ok(userProjectRelevancyService.insertByBo(req));
}
/**
* 修改系统用户与项目关联
*/
@SaCheckPermission("project:projectRelevancy:edit")
@Log(title = "系统用户与项目关联", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody UserProjectRelevancyUpdateReq req) {
return toAjax(userProjectRelevancyService.updateByBo(req));
}
/**
* 删除系统用户与项目关联
*
* @param ids 主键串
*/
@SaCheckPermission("project:projectRelevancy:remove")
@Log(title = "系统用户与项目关联", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(userProjectRelevancyService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,140 @@
package org.dromara.project.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 lcj
* @date 2025-03-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("project")
public class Project 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 pId;
/**
* 状态0正常 1停用
*/
private Long status;
/**
* 项目图片
*/
private String picUrl;
/**
* 备注
*/
private String remark;
/**
* 项目类型
*/
private String type;
/**
* 项目类型1光伏 2风电
*/
private Long isType;
/**
* 删除时间
*/
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 Long sort;
/**
* 显示隐藏0显示 1隐藏
*/
private Long showHidden;
/**
* 是否删除0正常 1删除
*/
@TableLogic
private Long isDelete;
}

View File

@ -0,0 +1,42 @@
package org.dromara.project.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 系统用户与项目关联对象 user_project_relevancy
*
* @author lcj
* @date 2025-03-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("user_project_relevancy")
public class UserProjectRelevancy extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 项目ID
*/
private Long projectId;
}

View File

@ -0,0 +1,141 @@
package org.dromara.project.domain.bo;
import org.dromara.project.domain.Project;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 项目业务对象 project
*
* @author lcj
* @date 2025-03-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = Project.class, reverseConvertGenerate = false)
public class ProjectBo extends BaseEntity {
/**
* 项目id
*/
@NotNull(message = "不能为空", groups = { EditGroup.class })
private Long id;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 父项目id
*/
private Long pId;
/**
* 状态0正常 1停用
*/
private Long status;
/**
* 项目图片
*/
private String picUrl;
/**
* 备注
*/
private String remark;
/**
* 项目类型
*/
private String type;
/**
* 项目类型1光伏 2风电
*/
private Long isType;
/**
* 删除时间
*/
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
*/
@NotBlank(message = "打卡范围09:00,18:00不能为空", groups = { AddGroup.class, EditGroup.class })
private String punchRange;
/**
* 设计总量
*/
@NotNull(message = "设计总量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long designTotal;
/**
* 安全协议书
*/
private String securityAgreement;
/**
* 排序字段
*/
@NotNull(message = "排序字段不能为空", groups = { AddGroup.class, EditGroup.class })
private Long sort;
/**
* 显示隐藏0显示 1隐藏
*/
private Long showHidden;
/**
* 是否删除0正常 1删除
*/
@NotNull(message = "是否删除0正常 1删除不能为空", groups = { EditGroup.class })
private Long isDelete;
}

View File

@ -0,0 +1,49 @@
package org.dromara.project.domain.bo;
import org.dromara.project.domain.UserProjectRelevancy;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 系统用户与项目关联业务对象 user_project_relevancy
*
* @author lcj
* @date 2025-03-04
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = UserProjectRelevancy.class, reverseConvertGenerate = false)
public class UserProjectRelevancyBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 用户ID
*/
@NotNull(message = "用户ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long userId;
/**
* 项目ID
*/
@NotNull(message = "项目ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long projectId;
/**
* 删除时间
*/
private Date deletedAt;
}

View File

@ -0,0 +1,107 @@
package org.dromara.project.domain.req.project;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 14:05
*/
@Data
public class ProjectCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = -7603153089205421154L;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 父项目id
*/
private Long pId;
/**
* 项目图片
*/
private String picUrl;
/**
* 备注
*/
private String remark;
/**
* 项目类型
*/
private String type;
/**
* 项目类型1光伏 2风电
*/
private Long isType;
/**
* 项目地址
*/
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 Long sort;
/**
* 显示隐藏0显示 1隐藏
*/
private Long showHidden;
}

View File

@ -0,0 +1,105 @@
package org.dromara.project.domain.req.project;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.common.PageRequest;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 14:31
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class ProjectQueryReq extends PageRequest implements Serializable {
@Serial
private static final long serialVersionUID = 5563677643070664671L;
/**
* 项目 id
*/
private Long id;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 父项目id
*/
private Long pId;
/**
* 状态0正常 1停用
*/
private Long status;
/**
* 备注
*/
private String remark;
/**
* 项目类型
*/
private String type;
/**
* 项目类型1光伏 2风电
*/
private Long isType;
/**
* 项目地址
*/
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;
/**
* 显示隐藏0显示 1隐藏
*/
private Long showHidden;
}

View File

@ -0,0 +1,112 @@
package org.dromara.project.domain.req.project;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 15:04
*/
@Data
public class ProjectUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = 3431952359907567659L;
/**
*
*/
private Long id;
/**
* 项目名称
*/
private String projectName;
/**
* 项目简称
*/
private String shortName;
/**
* 父项目id
*/
private Long pId;
/**
* 状态0正常 1停用
*/
private Long status;
/**
* 项目图片
*/
private String picUrl;
/**
* 备注
*/
private String remark;
/**
* 项目类型
*/
private String type;
/**
* 项目类型1光伏 2风电
*/
private Long isType;
/**
* 项目地址
*/
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;
/**
* 显示隐藏0显示 1隐藏
*/
private Long showHidden;
}

View File

@ -0,0 +1,28 @@
package org.dromara.project.domain.req.userprojectrelevancy;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 14:05
*/
@Data
public class UserProjectRelevancyCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = -7603153089205421154L;
/**
* 用户ID
*/
private Long userId;
/**
* 项目ID
*/
private Long projectId;
}

View File

@ -0,0 +1,35 @@
package org.dromara.project.domain.req.userprojectrelevancy;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.common.PageRequest;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 14:31
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class UserProjectRelevancyQueryReq extends PageRequest implements Serializable {
@Serial
private static final long serialVersionUID = 3252651952758479341L;
/**
* 主键ID
*/
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 项目ID
*/
private Long projectId;
}

View File

@ -0,0 +1,33 @@
package org.dromara.project.domain.req.userprojectrelevancy;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 15:04
*/
@Data
public class UserProjectRelevancyUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = -8022860866890925958L;
/**
* 主键ID
*/
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 项目ID
*/
private Long projectId;
}

View File

@ -0,0 +1,42 @@
package org.dromara.project.domain.resp.userprojectrelevancy;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025/3/5 15:30
*/
@Data
public class LoginUserProjectRelevancyResp 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;
}

View File

@ -0,0 +1,148 @@
package org.dromara.project.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.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.project.domain.Project;
import java.io.Serial;
import java.io.Serializable;
/**
* 项目视图对象 project
*
* @author lcj
* @date 2025-03-04
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = Project.class)
public class ProjectVo 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 pId;
/**
* 状态0正常 1停用
*/
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=正常,1=停用")
private Long status;
/**
* 项目图片
*/
@ExcelProperty(value = "项目图片")
private String picUrl;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 项目类型
*/
@ExcelProperty(value = "项目类型")
private String type;
/**
* 项目类型1光伏 2风电
*/
@ExcelProperty(value = "项目类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "1=光伏,2=风电")
private Long isType;
/**
* 项目地址
*/
@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 = "打卡范围", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=9:00,18:00")
private String punchRange;
/**
* 设计总量
*/
@ExcelProperty(value = "设计总量")
private Long designTotal;
/**
* 安全协议书
*/
@ExcelProperty(value = "安全协议书")
private String securityAgreement;
/**
* 显示隐藏0显示 1隐藏
*/
@ExcelProperty(value = "显示隐藏", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "1=显示,2=隐藏")
private Long showHidden;
}

View File

@ -0,0 +1,51 @@
package org.dromara.project.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.project.domain.UserProjectRelevancy;
import java.io.Serial;
import java.io.Serializable;
/**
* 系统用户与项目关联视图对象 user_project_relevancy
*
* @author lcj
* @date 2025-03-04
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = UserProjectRelevancy.class)
public class UserProjectRelevancyVo 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;
/**
* 项目详情
*/
@ExcelProperty(value = "项目详情")
private ProjectVo project;
}

View File

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

View File

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

View File

@ -0,0 +1,98 @@
package org.dromara.project.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.project.domain.Project;
import org.dromara.project.domain.bo.ProjectBo;
import org.dromara.project.domain.req.project.ProjectCreateReq;
import org.dromara.project.domain.req.project.ProjectQueryReq;
import org.dromara.project.domain.req.project.ProjectUpdateReq;
import org.dromara.project.domain.vo.ProjectVo;
import java.util.Collection;
import java.util.List;
/**
* 项目Service接口
*
* @author lcj
* @date 2025-03-04
*/
public interface IProjectService extends IService<Project> {
/**
* 查询项目
*
* @param id 主键
* @return 项目
*/
ProjectVo queryById(Long id);
/**
* 获取项目视图对象
*
* @param project 项目对象
* @return 项目视图对象
*/
ProjectVo getProjectVo(Project project);
/**
* 获取项目查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
QueryWrapper<Project> getQueryWrapper(ProjectQueryReq req);
/**
* 分页查询项目列表
*
* @param req 查询条件
* @return 项目分页列表
*/
Page<ProjectVo> queryPageList(ProjectQueryReq req);
/**
* 查询符合条件的项目列表
*
* @param bo 查询条件
* @return 项目列表
*/
List<ProjectVo> queryList(ProjectBo bo);
/**
* 获取项目分页对象视图
*
* @param projectPage 项目分页对象
* @return 项目分页对象视图
*/
Page<ProjectVo> getProjectVoPage(Page<Project> projectPage);
/**
* 新增项目
*
* @param dto 项目
* @return 新项目 id
*/
Long insertByBo(ProjectCreateReq dto);
/**
* 修改项目
*
* @param req 项目
* @return 是否修改成功
*/
Boolean updateByBo(ProjectUpdateReq req);
/**
* 校验并批量删除项目信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,117 @@
package org.dromara.project.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.project.domain.UserProjectRelevancy;
import org.dromara.project.domain.bo.UserProjectRelevancyBo;
import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyCreateReq;
import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyQueryReq;
import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyUpdateReq;
import org.dromara.project.domain.resp.userprojectrelevancy.LoginUserProjectRelevancyResp;
import org.dromara.project.domain.vo.UserProjectRelevancyVo;
import java.util.Collection;
import java.util.List;
/**
* 系统用户与项目关联Service接口
*
* @author lcj
* @date 2025-03-04
*/
public interface IUserProjectRelevancyService extends IService<UserProjectRelevancy> {
/**
* 获取系统用户与项目关联视图
*
* @param userProjectRelevancy 系统用户与项目关联
* @return 系统用户与项目关联视图
*/
UserProjectRelevancyVo getUserProjectRelevancyVo(UserProjectRelevancy userProjectRelevancy);
/**
* 获取系统用户与项目关联分页视图
*
* @param userProjectRelevancyPage 系统用户与项目关联分页
* @return 系统用户与项目关联分页视图
*/
Page<UserProjectRelevancyVo> getUserProjectRelevancyVoPage(Page<UserProjectRelevancy> userProjectRelevancyPage);
/**
* 查询系统用户与项目关联
*
* @param id 主键
* @return 系统用户与项目关联
*/
UserProjectRelevancyVo queryById(Long id);
/**
* 分页查询系统用户与项目关联列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 系统用户与项目关联分页列表
*/
TableDataInfo<UserProjectRelevancyVo> queryPageList(UserProjectRelevancyBo bo, PageQuery pageQuery);
/**
* 查询符合条件的系统用户与项目关联列表
*
* @param bo 查询条件
* @return 系统用户与项目关联列表
*/
List<UserProjectRelevancyVo> queryList(UserProjectRelevancyBo bo);
/**
* 新增系统用户与项目关联
*
* @param req 系统用户与项目关联
* @return 新增关联信息ID
*/
Long insertByBo(UserProjectRelevancyCreateReq req);
/**
* 修改系统用户与项目关联
*
* @param req 系统用户与项目关联
* @return 是否修改成功
*/
Boolean updateByBo(UserProjectRelevancyUpdateReq req);
/**
* 校验并批量删除系统用户与项目关联信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 获取当前登录用户项目列表
*
* @param userId 登录用户ID
* @return 当前登录用户项目列表
*/
List<LoginUserProjectRelevancyResp> queryListByUserId(Long userId);
/**
* 获取当前登录用户项目分页
*
* @param userId 登录用户ID
* @param req 分页查询条件
* @return 当前登录用户项目分页
*/
Page<UserProjectRelevancyVo> queryPageByUserId(Long userId, UserProjectRelevancyQueryReq req);
/**
* 获取用户和项目关联对象查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
QueryWrapper<UserProjectRelevancy> getQueryWrapper(UserProjectRelevancyQueryReq req);
}

View File

@ -0,0 +1,256 @@
package org.dromara.project.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
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.CommonConstant;
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.core.utils.sql.SqlUtil;
import org.dromara.project.domain.Project;
import org.dromara.project.domain.bo.ProjectBo;
import org.dromara.project.domain.req.project.ProjectCreateReq;
import org.dromara.project.domain.req.project.ProjectQueryReq;
import org.dromara.project.domain.req.project.ProjectUpdateReq;
import org.dromara.project.domain.vo.ProjectVo;
import org.dromara.project.mapper.ProjectMapper;
import org.dromara.project.service.IProjectService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
/**
* 项目Service业务层处理
*
* @author lcj
* @date 2025-03-04
*/
@Service
public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project>
implements IProjectService {
@Resource
private ProjectMapper baseMapper;
/**
* 查询项目
*
* @param id 主键
* @return 项目
*/
@Override
public ProjectVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@Override
public ProjectVo getProjectVo(Project project) {
if (project == null) {
return null;
}
// 对象转封装类
ProjectVo projectVo = new ProjectVo();
BeanUtils.copyProperties(project, projectVo);
return projectVo;
}
/**
* 获取项目查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
@Override
public QueryWrapper<Project> getQueryWrapper(ProjectQueryReq req) {
QueryWrapper<Project> queryWrapper = new QueryWrapper<>();
if (req == null) {
return queryWrapper;
}
// 从对象中取值
Long id = req.getId();
String projectName = req.getProjectName();
String shortName = req.getShortName();
Long pId = req.getPId();
Long status = req.getStatus();
String remark = req.getRemark();
String type = req.getType();
Long isType = req.getIsType();
String projectSite = req.getProjectSite();
String principal = req.getPrincipal();
String principalPhone = req.getPrincipalPhone();
String actual = req.getActual();
String plan = req.getPlan();
String onStreamTime = req.getOnStreamTime();
String punchRange = req.getPunchRange();
Long designTotal = req.getDesignTotal();
Long showHidden = req.getShowHidden();
String sortField = req.getSortField();
String sortOrder = req.getSortOrder();
String underlineSortField = StrUtil.toUnderlineCase(sortField);
// 模糊查询
queryWrapper.like(StringUtils.isNotBlank(projectName), "project_name", projectName);
queryWrapper.like(StringUtils.isNotBlank(shortName), "short_name", shortName);
queryWrapper.like(StringUtils.isNotBlank(remark), "remark", remark);
queryWrapper.like(StringUtils.isNotBlank(type), "type", type);
queryWrapper.like(StringUtils.isNotBlank(projectSite), "project_site", projectSite);
queryWrapper.like(StringUtils.isNotBlank(principal), "principal", principal);
queryWrapper.like(StringUtils.isNotBlank(principalPhone), "principal_phone", principalPhone);
queryWrapper.like(StringUtils.isNotBlank(actual), "actual", actual);
queryWrapper.like(StringUtils.isNotBlank(plan), "plan", plan);
queryWrapper.like(StringUtils.isNotBlank(onStreamTime), "on_stream_time", onStreamTime);
queryWrapper.like(StringUtils.isNotBlank(punchRange), "punch_range", punchRange);
// 精确查询
queryWrapper.eq(ObjectUtils.isNotEmpty(pId), "p_id", pId);
queryWrapper.eq(ObjectUtils.isNotEmpty(status), "status", status);
queryWrapper.eq(ObjectUtils.isNotEmpty(id), "id", id);
queryWrapper.eq(ObjectUtils.isNotEmpty(isType), "is_type", isType);
queryWrapper.eq(ObjectUtils.isNotEmpty(designTotal), "design_total", designTotal);
queryWrapper.eq(ObjectUtils.isNotEmpty(showHidden), "show_hidden", showHidden);
// 排序规则
queryWrapper.orderBy(SqlUtil.validSortField(sortField),
sortOrder.equals(CommonConstant.SORT_ORDER_ASC),
underlineSortField);
return queryWrapper;
}
/**
* 分页查询项目列表
*
* @param req 查询条件
* @return 项目分页列表
*/
@Override
public Page<ProjectVo> queryPageList(ProjectQueryReq req) {
long current = req.getCurrent();
long size = req.getPageSize();
// 查询数据库
Page<Project> result = this.page(new Page<>(current, size), this.getQueryWrapper(req));
return this.getProjectVoPage(result);
}
/**
* 查询符合条件的项目列表
*
* @param bo 查询条件
* @return 项目列表
*/
@Override
public List<ProjectVo> queryList(ProjectBo bo) {
LambdaQueryWrapper<Project> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
@Override
public Page<ProjectVo> getProjectVoPage(Page<Project> projectPage) {
List<Project> projectList = projectPage.getRecords();
Page<ProjectVo> projectVoPage = new Page<>(projectPage.getCurrent(), projectPage.getSize(), projectPage.getTotal());
if (CollUtil.isEmpty(projectList)) {
return projectVoPage;
}
// 对象列表 => 封装对象列表
List<ProjectVo> projectVoList = projectList.stream().map(this::getProjectVo).toList();
projectVoPage.setRecords(projectVoList);
return projectVoPage;
}
private LambdaQueryWrapper<Project> buildQueryWrapper(ProjectBo bo) {
LambdaQueryWrapper<Project> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(Project::getId);
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), Project::getProjectName, bo.getProjectName());
lqw.like(StringUtils.isNotBlank(bo.getShortName()), Project::getShortName, bo.getShortName());
lqw.eq(bo.getPId() != null, Project::getPId, bo.getPId());
lqw.eq(bo.getStatus() != null, Project::getStatus, bo.getStatus());
lqw.eq(StringUtils.isNotBlank(bo.getPicUrl()), Project::getPicUrl, bo.getPicUrl());
lqw.eq(StringUtils.isNotBlank(bo.getType()), Project::getType, bo.getType());
lqw.eq(bo.getIsType() != null, Project::getIsType, bo.getIsType());
lqw.eq(bo.getDeletedAt() != null, Project::getDeletedAt, bo.getDeletedAt());
lqw.eq(StringUtils.isNotBlank(bo.getProjectSite()), Project::getProjectSite, bo.getProjectSite());
lqw.eq(StringUtils.isNotBlank(bo.getPrincipal()), Project::getPrincipal, bo.getPrincipal());
lqw.eq(StringUtils.isNotBlank(bo.getPrincipalPhone()), Project::getPrincipalPhone, bo.getPrincipalPhone());
lqw.eq(StringUtils.isNotBlank(bo.getActual()), Project::getActual, bo.getActual());
lqw.eq(StringUtils.isNotBlank(bo.getPlan()), Project::getPlan, bo.getPlan());
lqw.eq(StringUtils.isNotBlank(bo.getOnStreamTime()), Project::getOnStreamTime, bo.getOnStreamTime());
lqw.eq(StringUtils.isNotBlank(bo.getPunchRange()), Project::getPunchRange, bo.getPunchRange());
lqw.eq(bo.getDesignTotal() != null, Project::getDesignTotal, bo.getDesignTotal());
lqw.eq(StringUtils.isNotBlank(bo.getSecurityAgreement()), Project::getSecurityAgreement, bo.getSecurityAgreement());
lqw.eq(bo.getSort() != null, Project::getSort, bo.getSort());
lqw.eq(bo.getShowHidden() != null, Project::getShowHidden, bo.getShowHidden());
return lqw;
}
/**
* 新增项目
*
* @param dto 项目
* @return 新项目 id
*/
@Override
public Long insertByBo(ProjectCreateReq dto) {
// 将实体类和 DTO 进行转换
Project project = new Project();
BeanUtils.copyProperties(dto, project);
// 数据校验
validEntityBeforeSave(project);
// 写入数据库
boolean save = this.save(project);
if (!save) {
throw new ServiceException("新增项目失败,数据库异常", HttpStatus.ERROR);
}
// 返回新写入的数据 id
return project.getId();
}
/**
* 修改项目
*
* @param req 项目
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(ProjectUpdateReq req) {
// 将实体类和 DTO 进行转换
Project project = new Project();
BeanUtils.copyProperties(req, project);
// 数据校验
validEntityBeforeSave(project);
// 判断是否存在
Project oldProject = this.getById(project.getId());
if (oldProject == null) {
throw new ServiceException("修改项目失败,数据不存在", HttpStatus.NOT_FOUND);
}
// 操作数据库
return this.updateById(project);
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(Project entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除项目信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,287 @@
package org.dromara.project.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
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.CommonConstant;
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.sql.SqlUtil;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.project.domain.Project;
import org.dromara.project.domain.UserProjectRelevancy;
import org.dromara.project.domain.bo.UserProjectRelevancyBo;
import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyCreateReq;
import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyQueryReq;
import org.dromara.project.domain.req.userprojectrelevancy.UserProjectRelevancyUpdateReq;
import org.dromara.project.domain.resp.userprojectrelevancy.LoginUserProjectRelevancyResp;
import org.dromara.project.domain.vo.UserProjectRelevancyVo;
import org.dromara.project.mapper.UserProjectRelevancyMapper;
import org.dromara.project.service.IProjectService;
import org.dromara.project.service.IUserProjectRelevancyService;
import org.dromara.system.service.ISysUserService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
/**
* 系统用户与项目关联Service业务层处理
*
* @author lcj
* @date 2025-03-04
*/
@Service
public class UserProjectRelevancyServiceImpl extends ServiceImpl<UserProjectRelevancyMapper, UserProjectRelevancy>
implements IUserProjectRelevancyService {
@Resource
private UserProjectRelevancyMapper baseMapper;
@Resource
private ISysUserService userService;
@Resource
private IProjectService projectService;
@Override
public UserProjectRelevancyVo getUserProjectRelevancyVo(UserProjectRelevancy userProjectRelevancy) {
// 对象转封装类
UserProjectRelevancyVo userProjectRelevancyVo = new UserProjectRelevancyVo();
if (userProjectRelevancy == null) {
return userProjectRelevancyVo;
}
BeanUtils.copyProperties(userProjectRelevancy, userProjectRelevancyVo);
// 关联查询项目信息
Long projectId = userProjectRelevancy.getProjectId();
if (projectId != null) {
userProjectRelevancyVo.setProject(projectService.queryById(projectId));
}
return userProjectRelevancyVo;
}
@Override
public Page<UserProjectRelevancyVo> getUserProjectRelevancyVoPage(Page<UserProjectRelevancy> userProjectRelevancyPage) {
List<UserProjectRelevancy> userProjectRelevancyList = userProjectRelevancyPage.getRecords();
Page<UserProjectRelevancyVo> userProjectRelevancyVoPage = new Page<>(
userProjectRelevancyPage.getCurrent(),
userProjectRelevancyPage.getSize(),
userProjectRelevancyPage.getTotal());
if (CollUtil.isEmpty(userProjectRelevancyList)) {
return userProjectRelevancyVoPage;
}
// 对象列表 => 封装对象列表
List<UserProjectRelevancyVo> userProjectRelevancyVoList = userProjectRelevancyList.stream().map(this::getUserProjectRelevancyVo).toList();
userProjectRelevancyVoPage.setRecords(userProjectRelevancyVoList);
return userProjectRelevancyVoPage;
}
/**
* 查询系统用户与项目关联
*
* @param id 主键
* @return 系统用户与项目关联
*/
@Override
public UserProjectRelevancyVo queryById(Long id) {
// 查询数据
UserProjectRelevancy userProjectRelevancy = this.getById(id);
// 封装并返回
return this.getUserProjectRelevancyVo(userProjectRelevancy);
}
/**
* 分页查询系统用户与项目关联列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 系统用户与项目关联分页列表
*/
@Override
public TableDataInfo<UserProjectRelevancyVo> queryPageList(UserProjectRelevancyBo bo, PageQuery pageQuery) {
Page<UserProjectRelevancyVo> resultVo = pageQuery.build();
LambdaQueryWrapper<UserProjectRelevancy> lqw = buildQueryWrapper(bo);
Page<UserProjectRelevancy> result = this.page(pageQuery.build(), lqw);
if (CollUtil.isEmpty(result.getRecords())) {
return TableDataInfo.build(resultVo);
}
List<UserProjectRelevancyVo> userProjectRelevancyVos = result.getRecords().stream().map(this::getUserProjectRelevancyVo).toList();
resultVo.setRecords(userProjectRelevancyVos);
return TableDataInfo.build(resultVo);
}
/**
* 查询符合条件的系统用户与项目关联列表
*
* @param bo 查询条件
* @return 系统用户与项目关联列表
*/
@Override
public List<UserProjectRelevancyVo> queryList(UserProjectRelevancyBo bo) {
LambdaQueryWrapper<UserProjectRelevancy> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<UserProjectRelevancy> buildQueryWrapper(UserProjectRelevancyBo bo) {
LambdaQueryWrapper<UserProjectRelevancy> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(UserProjectRelevancy::getId);
lqw.eq(bo.getUserId() != null, UserProjectRelevancy::getUserId, bo.getUserId());
lqw.eq(bo.getProjectId() != null, UserProjectRelevancy::getProjectId, bo.getProjectId());
return lqw;
}
/**
* 新增系统用户与项目关联
*
* @param req 系统用户与项目关联
* @return 是否新增成功
*/
@Override
public Long insertByBo(UserProjectRelevancyCreateReq req) {
// 将实体类和 DTO 进行转换
UserProjectRelevancy userProjectRelevancy = new UserProjectRelevancy();
BeanUtils.copyProperties(req, userProjectRelevancy);
// 数据校验
validEntityBeforeSave(userProjectRelevancy);
// 写入数据库
boolean save = this.save(userProjectRelevancy);
if (!save) {
throw new ServiceException("新增用户和项目关联失败,数据库异常", HttpStatus.ERROR);
}
// 返回新写入的数据 id
return userProjectRelevancy.getId();
}
/**
* 修改系统用户与项目关联
*
* @param req 系统用户与项目关联
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(UserProjectRelevancyUpdateReq req) {
// 将实体类和 DTO 进行转换
UserProjectRelevancy userProjectRelevancy = new UserProjectRelevancy();
BeanUtils.copyProperties(req, userProjectRelevancy);
// 数据校验
validEntityBeforeSave(userProjectRelevancy);
// 判断是否存在
UserProjectRelevancy oldUserProjectRelevancy = this.getById(userProjectRelevancy.getId());
if (oldUserProjectRelevancy == null) {
throw new ServiceException("修改用户和项目关联失败,数据不存在", HttpStatus.NOT_FOUND);
}
// 操作数据库
return this.updateById(oldUserProjectRelevancy);
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(UserProjectRelevancy entity) {
// TODO 做一些数据校验,如唯一约束
Long projectId = entity.getProjectId();
Long userId = entity.getUserId();
if (projectId == null) {
throw new ServiceException("项目 id 不能为空", HttpStatus.BAD_REQUEST);
}
if (userId == null) {
throw new ServiceException("用户 id 不能为空", HttpStatus.BAD_REQUEST);
}
}
/**
* 校验并批量删除系统用户与项目关联信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
/**
* 获取当前登录用户项目列表
*
* @param userId 登录用户ID
* @return 当前登录用户项目列表
*/
@Override
public List<LoginUserProjectRelevancyResp> queryListByUserId(Long userId) {
// 添加查询条件,根据当前用户,获取数据
LambdaQueryWrapper<UserProjectRelevancy> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(UserProjectRelevancy::getUserId, userId);
// 查询数据库,获取数据
List<UserProjectRelevancy> list = this.list(queryWrapper);
// 获取封装
return list.stream()
.map(userProjectRelevancy -> {
Long projectId = userProjectRelevancy.getProjectId();
QueryWrapper<Project> projectQueryWrapper = new QueryWrapper<>();
projectQueryWrapper.eq("id", projectId);
Project project = projectService.getOne(projectQueryWrapper);
if (project != null) {
LoginUserProjectRelevancyResp loginUserProjectRelevancy = new LoginUserProjectRelevancyResp();
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();
}
@Override
public Page<UserProjectRelevancyVo> queryPageByUserId(Long userId, UserProjectRelevancyQueryReq req) {
long current = req.getCurrent();
long size = req.getPageSize();
// 添加查询条件
req.setUserId(userId);
QueryWrapper<UserProjectRelevancy> queryWrapper = this.getQueryWrapper(req);
// 查询数据库
Page<UserProjectRelevancy> result = this.page(new Page<>(current, size), queryWrapper);
return this.getUserProjectRelevancyVoPage(result);
}
@Override
public QueryWrapper<UserProjectRelevancy> getQueryWrapper(UserProjectRelevancyQueryReq req) {
QueryWrapper<UserProjectRelevancy> queryWrapper = new QueryWrapper<>();
if (req == null) {
return queryWrapper;
}
// 从对象中取值
Long id = req.getId();
Long userId = req.getUserId();
Long projectId = req.getProjectId();
String sortField = req.getSortField();
String sortOrder = req.getSortOrder();
String underlineSortField = StrUtil.toUnderlineCase(sortField);
// 精确查询
queryWrapper.eq(ObjectUtils.isNotEmpty(id), "id", id);
queryWrapper.eq(ObjectUtils.isNotEmpty(userId), "user_id", userId);
queryWrapper.eq(ObjectUtils.isNotEmpty(projectId), "project_id", projectId);
// 排序规则
queryWrapper.orderBy(SqlUtil.validSortField(sortField),
sortOrder.equals(CommonConstant.SORT_ORDER_ASC),
underlineSortField);
return queryWrapper;
}
}

View File

@ -1,3 +0,0 @@
java包使用 `.` 分割 resource 目录使用 `/` 分割
<br>
此文件目的 防止文件夹粘连找不到 `xml` 文件

View File

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

View File

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

View File

@ -0,0 +1,120 @@
use energy;
drop table if exists `project`;
create table `project`
(
`id` bigint not null auto_increment,
`project_name` varchar(64) null comment '项目名称',
`short_name` varchar(64) null comment '项目简称',
`p_id` bigint null comment '父项目id',
`status` tinyint(4) default 0 null comment '状态0正常 1停用',
`pic_url` varchar(255) null comment '项目图片',
`remark` varchar(500) null comment '备注',
`type` varchar(20) null comment '项目类型',
`is_type` tinyint(4) null comment '项目类型1光伏 2风电',
`create_by` bigint null comment '创建者',
`update_by` bigint null comment '更新者',
`create_time` datetime default CURRENT_TIMESTAMP null comment '创建时间',
`update_time` datetime default CURRENT_TIMESTAMP null ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
`deleted_at` datetime null comment '删除时间',
`project_site` varchar(255) null comment '项目地址',
`principal` varchar(50) null comment '负责人',
`principal_phone` varchar(50) null comment '负责人电话',
`actual` varchar(64) null comment '实际容量',
`plan` varchar(64) null comment '计划容量',
`on_stream_time` varchar(64) null comment '开工时间',
`punch_range` varchar(30) default '09:00,18:00' not null comment '打卡范围09:00,18:00',
`design_total` int default 0 not null comment '设计总量',
`security_agreement` varchar(255) null comment '安全协议书',
`sort` bigint default 0 not null comment '排序字段',
`show_hidden` tinyint(4) default 0 not null comment '显示隐藏0显示 1隐藏',
`is_delete` tinyint(4) default 0 not null comment '是否删除0正常 1删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 60
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci comment = '项目表'
ROW_FORMAT = DYNAMIC;
DROP TABLE IF EXISTS `user_project_relevancy`;
CREATE TABLE `user_project_relevancy`
(
`id` bigint not null AUTO_INCREMENT COMMENT '主键ID',
`user_id` bigint not null comment '用户ID',
`project_id` bigint not null comment '项目ID',
`create_by` varchar(50) null comment '创建人',
`update_by` varchar(50) null comment '更新人',
`create_time` datetime default CURRENT_TIMESTAMP null comment '创建时间',
`update_time` datetime default CURRENT_TIMESTAMP null ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `user_id` (`user_id` ASC) USING BTREE COMMENT '用户id',
INDEX `project_id` (`project_id` ASC) USING BTREE COMMENT '项目id'
) ENGINE = InnoDB
AUTO_INCREMENT = 1365
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT = '系统用户与项目关联'
ROW_FORMAT = DYNAMIC;
-- 菜单 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896943300447367169, '项目', '1', '1', 'project', 'project/project/index', 1, 0, 'C', '0', '0',
'project:project:list', '#', 103, 1, sysdate(), null, null, '项目菜单');
-- 按钮 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896943300447367170, '项目查询', 1896943300447367169, '1', '#', '', 1, 0, 'F', '0', '0',
'project:project:query', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896943300447367171, '项目新增', 1896943300447367169, '2', '#', '', 1, 0, 'F', '0', '0', 'project:project:add',
'#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896943300447367172, '项目修改', 1896943300447367169, '3', '#', '', 1, 0, 'F', '0', '0', 'project:project:edit',
'#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896943300447367173, '项目删除', 1896943300447367169, '4', '#', '', 1, 0, 'F', '0', '0',
'project:project:remove', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896943300447367174, '项目导出', 1896943300447367169, '5', '#', '', 1, 0, 'F', '0', '0',
'project:project:export', '#', 103, 1, sysdate(), null, null, '');
-- 菜单 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896949180526047233, '系统用户与项目关联', '1', '1', 'projectRelevancy', 'project/projectRelevancy/index', 1, 0,
'C', '0', '0', 'project:projectRelevancy:list', '#', 103, 1, sysdate(), null, null, '系统用户与项目关联菜单');
-- 按钮 SQL
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896949180526047234, '系统用户与项目关联查询', 1896949180526047233, '1', '#', '', 1, 0, 'F', '0', '0',
'project:projectRelevancy:query', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896949180526047235, '系统用户与项目关联新增', 1896949180526047233, '2', '#', '', 1, 0, 'F', '0', '0',
'project:projectRelevancy:add', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896949180526047236, '系统用户与项目关联修改', 1896949180526047233, '3', '#', '', 1, 0, 'F', '0', '0',
'project:projectRelevancy:edit', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896949180526047237, '系统用户与项目关联删除', 1896949180526047233, '4', '#', '', 1, 0, 'F', '0', '0',
'project:projectRelevancy:remove', '#', 103, 1, sysdate(), null, null, '');
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible,
status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
values (1896949180526047238, '系统用户与项目关联导出', 1896949180526047233, '5', '#', '', 1, 0, 'F', '0', '0',
'project:projectRelevancy:export', '#', 103, 1, sysdate(), null, null, '');