完善项目、分包单位、项目班组、施工人员逻辑;添加施工人员出入场查询接口,人员迁移相关接口

This commit is contained in:
lcj
2025-03-31 17:59:15 +08:00
parent 744457179b
commit f1ca0b6040
26 changed files with 846 additions and 52 deletions

View File

@ -15,6 +15,7 @@ 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.project.domain.req.constructionuser.ConstructionUserChangeProjectReq;
import org.dromara.project.domain.req.constructionuser.ConstructionUserCreateReq;
import org.dromara.project.domain.req.constructionuser.ConstructionUserQueryReq;
import org.dromara.project.domain.req.constructionuser.ConstructionUserUpdateReq;
@ -93,6 +94,17 @@ public class BusConstructionUserController extends BaseController {
return toAjax(busConstructionUserService.updateByBo(req));
}
/**
* 人员迁移
*/
@SaCheckPermission("project:constructionUser:edit")
@Log(title = "施工人员", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/change/project")
public R<Void> changeUserProject(@Validated(EditGroup.class) @RequestBody ConstructionUserChangeProjectReq req) {
return toAjax(busConstructionUserService.changeUserProject(req));
}
/**
* 删除施工人员
*

View File

@ -0,0 +1,67 @@
package org.dromara.project.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.servlet.http.HttpServletResponse;
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.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.project.domain.req.constructionuserexit.ConstructionUserExitQueryReq;
import org.dromara.project.domain.vo.BusConstructionUserExitVo;
import org.dromara.project.service.IBusConstructionUserExitService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 施工人员入场退场记录信息
*
* @author lcj
* @date 2025-03-31
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/project/constructionUserExit")
public class BusConstructionUserExitController extends BaseController {
private final IBusConstructionUserExitService busConstructionUserExitService;
/**
* 查询施工人员入场退场记录信息列表
*/
@SaCheckPermission("project:constructionUserExit:list")
@GetMapping("/list")
public TableDataInfo<BusConstructionUserExitVo> list(ConstructionUserExitQueryReq req, PageQuery pageQuery) {
return busConstructionUserExitService.queryPageList(req, pageQuery);
}
/**
* 导出施工人员入场退场记录信息列表
*/
@SaCheckPermission("project:constructionUserExit:export")
@Log(title = "施工人员入场退场记录信息", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ConstructionUserExitQueryReq req, HttpServletResponse response) {
List<BusConstructionUserExitVo> list = busConstructionUserExitService.queryList(req);
ExcelUtil.exportExcel(list, "施工人员入场退场记录信息", BusConstructionUserExitVo.class, response);
}
/**
* 获取施工人员入场退场记录信息详细信息
*
* @param id 主键
*/
@SaCheckPermission("project:constructionUserExit:query")
@GetMapping("/{id}")
public R<BusConstructionUserExitVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(busConstructionUserExitService.queryById(id));
}
}

View File

@ -20,6 +20,7 @@ import org.dromara.common.web.core.BaseController;
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.resp.project.ProjectContractorListResp;
import org.dromara.project.domain.vo.BusProjectVo;
import org.dromara.project.service.IBusProjectService;
import org.springframework.validation.annotation.Validated;
@ -73,6 +74,15 @@ public class BusProjectController extends BaseController {
return R.ok(projectService.queryById(id));
}
/**
* 查询项目以及项目下的分包公司列表
*/
@SaCheckPermission("project:project:query")
@GetMapping("/list/project/contractorList")
public R<List<ProjectContractorListResp>> listProjectContractorList() {
return R.ok(projectService.queryProjectContractorList());
}
/**
* 新增项目
*/

View File

@ -2,7 +2,6 @@ package org.dromara.project.controller;
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;
@ -16,6 +15,7 @@ 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.project.domain.req.projectteammember.ProjectTeamMemberCreateReq;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberExitReq;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberQueryReq;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberUpdateReq;
import org.dromara.project.domain.vo.BusProjectTeamMemberVo;
@ -94,15 +94,12 @@ public class BusProjectTeamMemberController extends BaseController {
}
/**
* 删除项目班组下的成员
*
* @param ids 主键串
* 施工人员退场
*/
@SaCheckPermission("project:projectTeamMember:remove")
@Log(title = "项目班组下的成员", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(busProjectTeamMemberService.deleteWithValidByIds(List.of(ids), true));
@DeleteMapping("/")
public R<Void> remove(@RequestBody ProjectTeamMemberExitReq req) {
return toAjax(busProjectTeamMemberService.deleteById(req));
}
}

View File

@ -0,0 +1,71 @@
package org.dromara.project.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_construction_user_exit
*
* @author lcj
* @date 2025-03-31
*/
@Data
@TableName("bus_construction_user_exit")
public class BusConstructionUserExit implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id")
private Long id;
/**
* 身份证号码
*/
private String sfzNumber;
/**
* 用户id
*/
private Long userId;
/**
* 项目id
*/
private Long projectId;
/**
* 班组id
*/
private Long teamId;
/**
* 入场时间
*/
private Date entryDate;
/**
* 退场时间
*/
private Date leaveDate;
/**
* 退场文件
*/
private String path;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,35 @@
package org.dromara.project.domain.req.constructionuser;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lcj
* @date 2025/3/31 14:50
*/
@Data
public class ConstructionUserChangeProjectReq implements Serializable {
@Serial
private static final long serialVersionUID = -2638471692809830501L;
/**
* 主键
*/
@NotNull(message = "主键id不能为空")
private Long id;
/**
* 项目id
*/
@NotNull(message = "项目id不能为空")
private Long projectId;
/**
* 分包公司id
*/
@NotNull(message = "分包公司id不能为空")
private Long contractorId;
}

View File

@ -30,11 +30,6 @@ public class ConstructionUserUpdateReq implements Serializable {
*/
private String userName;
/**
* 项目id
*/
private Long projectId;
/**
* 分包公司id
*/

View File

@ -0,0 +1,57 @@
package org.dromara.project.domain.req.constructionuserexit;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lcj
* @date 2025/3/31 15:13
*/
@Data
public class ConstructionUserExitQueryReq implements Serializable {
@Serial
private static final long serialVersionUID = 1108809723013529990L;
/**
* 主键id
*/
private Long id;
/**
* 身份证号码
*/
private String sfzNumber;
/**
* 用户id
*/
private Long userId;
/**
* 项目id
*/
private Long projectId;
/**
* 班组id
*/
private Long teamId;
/**
* 入场时间
*/
private String entryDate;
/**
* 退场时间
*/
private String leaveDate;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,32 @@
package org.dromara.project.domain.req.projectteammember;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lcj
* @date 2025/3/31 10:54
*/
@Data
public class ProjectTeamMemberExitReq implements Serializable {
@Serial
private static final long serialVersionUID = 6911310088122710744L;
/**
* 主键id
*/
private Long id;
/**
* 文件路径
*/
private String filePath;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,35 @@
package org.dromara.project.domain.resp.project;
import lombok.Data;
import org.dromara.common.core.domain.vo.IdAndNameVO;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author lcj
* @date 2025/3/31 16:16
*/
@Data
public class ProjectContractorListResp implements Serializable {
@Serial
private static final long serialVersionUID = 3089953733712392942L;
/**
* id
*/
private Long id;
/**
* 项目名称
*/
private String projectName;
/**
* 项目下的分包公司列表
*/
private List<IdAndNameVO> contractorList;
}

View File

@ -0,0 +1,82 @@
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.BusConstructionUserExit;
import java.io.Serial;
import java.io.Serializable;
/**
* 施工人员入场退场记录信息视图对象 bus_construction_user_exit
*
* @author lcj
* @date 2025-03-31
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BusConstructionUserExit.class)
public class BusConstructionUserExitVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@ExcelProperty(value = "主键id")
private Long id;
/**
* 身份证号码
*/
@ExcelProperty(value = "身份证号码")
private String sfzNumber;
/**
* 用户id
*/
@ExcelProperty(value = "用户id")
private Long userId;
/**
* 项目id
*/
@ExcelProperty(value = "项目id")
private Long projectId;
/**
* 班组id
*/
@ExcelProperty(value = "班组id")
private Long teamId;
/**
* 入场时间
*/
@ExcelProperty(value = "入场时间")
private String entryDate;
/**
* 退场时间
*/
@ExcelProperty(value = "退场时间")
private String leaveDate;
/**
* 退场文件
*/
@ExcelProperty(value = "退场文件")
private String path;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@ -138,6 +138,16 @@ public class BusProjectVo implements Serializable {
@ExcelProperty(value = "打卡范围")
private String punchRange;
/**
* 打卡时间开始
*/
private String playCardStart;
/**
* 打卡时间结束
*/
private String playCardEnd;
/**
* 设计总量
*/

View File

@ -0,0 +1,15 @@
package org.dromara.project.mapper;
import org.dromara.project.domain.BusConstructionUserExit;
import org.dromara.project.domain.vo.BusConstructionUserExitVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 施工人员入场退场记录信息Mapper接口
*
* @author lcj
* @date 2025-03-31
*/
public interface BusConstructionUserExitMapper extends BaseMapperPlus<BusConstructionUserExit, BusConstructionUserExitVo> {
}

View File

@ -0,0 +1,54 @@
package org.dromara.project.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.BusConstructionUserExit;
import org.dromara.project.domain.req.constructionuserexit.ConstructionUserExitQueryReq;
import org.dromara.project.domain.vo.BusConstructionUserExitVo;
import java.util.List;
/**
* 施工人员入场退场记录信息Service接口
*
* @author lcj
* @date 2025-03-31
*/
public interface IBusConstructionUserExitService extends IService<BusConstructionUserExit> {
/**
* 查询施工人员入场退场记录信息
*
* @param id 主键
* @return 施工人员入场退场记录信息
*/
BusConstructionUserExitVo queryById(Long id);
/**
* 分页查询施工人员入场退场记录信息列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 施工人员入场退场记录信息分页列表
*/
TableDataInfo<BusConstructionUserExitVo> queryPageList(ConstructionUserExitQueryReq req, PageQuery pageQuery);
/**
* 查询符合条件的施工人员入场退场记录信息列表
*
* @param req 查询条件
* @return 施工人员入场退场记录信息列表
*/
List<BusConstructionUserExitVo> queryList(ConstructionUserExitQueryReq req);
/**
* 获取施工人员入场退场记录信息查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<BusConstructionUserExit> buildQueryWrapper(ConstructionUserExitQueryReq req);
}

View File

@ -6,6 +6,7 @@ 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.BusConstructionUser;
import org.dromara.project.domain.req.constructionuser.ConstructionUserChangeProjectReq;
import org.dromara.project.domain.req.constructionuser.ConstructionUserCreateReq;
import org.dromara.project.domain.req.constructionuser.ConstructionUserQueryReq;
import org.dromara.project.domain.req.constructionuser.ConstructionUserUpdateReq;
@ -63,6 +64,14 @@ public interface IBusConstructionUserService extends IService<BusConstructionUse
*/
Boolean updateByBo(ConstructionUserUpdateReq req);
/**
* 修改施工人员项目(人员迁移)
*
* @param req 修改施工人员项目对象
* @return 是否修改成功
*/
Boolean changeUserProject(ConstructionUserChangeProjectReq req);
/**
* 校验并批量删除施工人员信息
*

View File

@ -9,6 +9,7 @@ import org.dromara.project.domain.BusProject;
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.resp.project.ProjectContractorListResp;
import org.dromara.project.domain.vo.BusProjectVo;
import java.util.Collection;
@ -47,6 +48,13 @@ public interface IBusProjectService extends IService<BusProject> {
*/
List<BusProjectVo> queryList(ProjectQueryReq req);
/**
* 查询当前登录用户项目列表以及项目列表下的分包公司列表
*
* @return 项目列表以及项目列表下的分包公司列表
*/
List<ProjectContractorListResp> queryProjectContractorList();
/**
* 新增项目
*

View File

@ -7,11 +7,11 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.project.domain.BusProjectTeamMember;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberCreateReq;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberExitReq;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberQueryReq;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberUpdateReq;
import org.dromara.project.domain.vo.BusProjectTeamMemberVo;
import java.util.Collection;
import java.util.List;
/**
@ -64,13 +64,12 @@ public interface IBusProjectTeamMemberService extends IService<BusProjectTeamMem
Boolean updateByBo(ProjectTeamMemberUpdateReq req);
/**
* 校验并批量删除项目班组下的成员信息
* 根据主键删除项目班组与人员关联(人员退场)
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @param req 班组人员退场对象
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
Boolean deleteById(ProjectTeamMemberExitReq req);
/**
* 获取项目班组成员视图对象

View File

@ -0,0 +1,102 @@
package org.dromara.project.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 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.project.domain.BusConstructionUserExit;
import org.dromara.project.domain.req.constructionuserexit.ConstructionUserExitQueryReq;
import org.dromara.project.domain.vo.BusConstructionUserExitVo;
import org.dromara.project.mapper.BusConstructionUserExitMapper;
import org.dromara.project.service.IBusConstructionUserExitService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 施工人员入场退场记录信息Service业务层处理
*
* @author lcj
* @date 2025-03-31
*/
@Service
public class BusConstructionUserExitServiceImpl extends ServiceImpl<BusConstructionUserExitMapper, BusConstructionUserExit>
implements IBusConstructionUserExitService {
/**
* 查询施工人员入场退场记录信息
*
* @param id 主键
* @return 施工人员入场退场记录信息
*/
@Override
public BusConstructionUserExitVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 分页查询施工人员入场退场记录信息列表
*
* @param req 查询条件
* @param pageQuery 分页参数
* @return 施工人员入场退场记录信息分页列表
*/
@Override
public TableDataInfo<BusConstructionUserExitVo> queryPageList(ConstructionUserExitQueryReq req, PageQuery pageQuery) {
LambdaQueryWrapper<BusConstructionUserExit> lqw = buildQueryWrapper(req);
Page<BusConstructionUserExitVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的施工人员入场退场记录信息列表
*
* @param req 查询条件
* @return 施工人员入场退场记录信息列表
*/
@Override
public List<BusConstructionUserExitVo> queryList(ConstructionUserExitQueryReq req) {
LambdaQueryWrapper<BusConstructionUserExit> lqw = buildQueryWrapper(req);
return baseMapper.selectVoList(lqw);
}
/**
* 获取施工人员入场退场记录信息查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
@Override
public LambdaQueryWrapper<BusConstructionUserExit> buildQueryWrapper(ConstructionUserExitQueryReq req) {
LambdaQueryWrapper<BusConstructionUserExit> lqw = Wrappers.lambdaQuery();
if (req == null) {
return lqw;
}
Long id = req.getId();
String sfzNumber = req.getSfzNumber();
Long userId = req.getUserId();
Long projectId = req.getProjectId();
Long teamId = req.getTeamId();
String entryDate = req.getEntryDate();
String leaveDate = req.getLeaveDate();
String remark = req.getRemark();
// 模糊查询
lqw.like(StringUtils.isNotBlank(sfzNumber), BusConstructionUserExit::getSfzNumber, sfzNumber);
lqw.like(StringUtils.isNotBlank(remark), BusConstructionUserExit::getRemark, remark);
// 精确查询
lqw.eq(ObjectUtils.isNotEmpty(id), BusConstructionUserExit::getId, id);
lqw.eq(ObjectUtils.isNotEmpty(userId), BusConstructionUserExit::getUserId, userId);
lqw.eq(ObjectUtils.isNotEmpty(projectId), BusConstructionUserExit::getProjectId, projectId);
lqw.eq(ObjectUtils.isNotEmpty(teamId), BusConstructionUserExit::getTeamId, teamId);
lqw.eq(StringUtils.isNotBlank(entryDate), BusConstructionUserExit::getEntryDate, entryDate);
lqw.eq(StringUtils.isNotBlank(leaveDate), BusConstructionUserExit::getLeaveDate, leaveDate);
// 排序
lqw.orderByAsc(BusConstructionUserExit::getId);
return lqw;
}
}

View File

@ -3,6 +3,7 @@ package org.dromara.project.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.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -15,6 +16,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.project.domain.*;
import org.dromara.project.domain.req.constructionuser.ConstructionUserChangeProjectReq;
import org.dromara.project.domain.req.constructionuser.ConstructionUserCreateReq;
import org.dromara.project.domain.req.constructionuser.ConstructionUserQueryReq;
import org.dromara.project.domain.req.constructionuser.ConstructionUserUpdateReq;
@ -151,6 +153,46 @@ public class BusConstructionUserServiceImpl extends ServiceImpl<BusConstructionU
return this.updateById(constructionUser);
}
/**
* 修改施工人员项目(人员迁移)
*
* @param req 修改施工人员项目对象
* @return 是否修改成功
*/
@Override
public Boolean changeUserProject(ConstructionUserChangeProjectReq req) {
Long id = req.getId();
// 判断对应施工人员是否存在
BusConstructionUser constructionUser = this.getById(id);
if (constructionUser == null) {
throw new ServiceException("施工人员信息不存在", HttpStatus.NOT_FOUND);
}
// 判断当前操作用户是否有权限
Long userId = LoginHelper.getUserId();
projectService.validAuth(List.of(constructionUser.getProjectId(), req.getProjectId()), userId);
// 判断用户是否还存在于班组
Long count = projectTeamMemberService.lambdaQuery().eq(BusProjectTeamMember::getMemberId, id).count();
if (count > 0) {
throw new ServiceException("施工人员还未退场,不能修改", HttpStatus.BAD_REQUEST);
}
// 数据校验
if (req.getProjectId().equals(constructionUser.getProjectId())) {
throw new ServiceException("已在当前项目下,请勿重复修改", HttpStatus.BAD_REQUEST);
}
if (req.getContractorId().equals(constructionUser.getContractorId())) {
throw new ServiceException("已在当前分包公司下,请勿重复修改", HttpStatus.BAD_REQUEST);
}
BusConstructionUser validUser = new BusConstructionUser();
BeanUtils.copyProperties(req, validUser);
this.validEntityBeforeSave(validUser, false);
// 操作数据库,更新数据
LambdaUpdateWrapper<BusConstructionUser> lambdaUpdate = Wrappers.lambdaUpdate(BusConstructionUser.class)
.eq(BusConstructionUser::getId, id)
.set(BusConstructionUser::getProjectId, req.getProjectId())
.set(BusConstructionUser::getContractorId, req.getContractorId());
return this.update(lambdaUpdate);
}
/**
* 保存前的数据校验
*/
@ -168,10 +210,10 @@ public class BusConstructionUserServiceImpl extends ServiceImpl<BusConstructionU
throw new ServiceException("分包公司 id 不能为空", HttpStatus.BAD_REQUEST);
}
}
if (projectService.getById(projectId) == null) {
if (projectId != null && projectService.getById(projectId) == null) {
throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND);
}
if (contractorService.getById(contractorId) == null) {
if (contractorId != null && contractorService.getById(contractorId) == null) {
throw new ServiceException("对应分包公司不存在", HttpStatus.NOT_FOUND);
}
}

View File

@ -3,24 +3,29 @@ package org.dromara.project.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.constant.SystemConstants;
import org.dromara.common.core.domain.vo.IdAndNameVO;
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.project.domain.BusContractor;
import org.dromara.project.domain.BusProject;
import org.dromara.project.domain.BusUserProjectRelevancy;
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.resp.project.ProjectContractorListResp;
import org.dromara.project.domain.vo.BusProjectVo;
import org.dromara.project.mapper.BusProjectMapper;
import org.dromara.project.service.IBusContractorService;
import org.dromara.project.service.IBusProjectService;
import org.dromara.project.service.IBusUserProjectRelevancyService;
import org.springframework.beans.BeanUtils;
@ -28,9 +33,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -47,6 +50,10 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
@Resource
private IBusUserProjectRelevancyService userProjectRelevancyService;
@Lazy
@Resource
private IBusContractorService contractorService;
/**
* 查询项目
*
@ -88,6 +95,43 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
return this.list(lqw).stream().map(this::getVo).toList();
}
/**
* 查询当前登录用户项目列表以及项目列表下的分包公司列表
*
* @return 项目列表以及项目列表下的分包公司列表
*/
@Override
public List<ProjectContractorListResp> queryProjectContractorList() {
Long userId = LoginHelper.getUserId();
// 获取当前登录用户的项目列表
LambdaQueryWrapper<BusUserProjectRelevancy> userProjectRelevancyLqw = Wrappers.lambdaQuery(BusUserProjectRelevancy.class)
.select(BusUserProjectRelevancy::getProjectId)
.eq(BusUserProjectRelevancy::getUserId, userId);
List<Long> projectIdList = userProjectRelevancyService.listObjs(userProjectRelevancyLqw, obj -> (Long) obj);
List<BusProject> projectList = this.listByIds(projectIdList);
// 获取项目列表下的分包公司列表
LambdaQueryWrapper<BusContractor> lqw = new LambdaQueryWrapper<>();
lqw.in(BusContractor::getProjectId, projectIdList);
Map<Long, List<BusContractor>> projectIdContractorList = contractorService.list(lqw).stream()
.collect(Collectors.groupingBy(BusContractor::getProjectId));
// 获取封装
return projectList.stream().map(project -> {
ProjectContractorListResp projectContractorListResp = new ProjectContractorListResp();
// 添加项目信息
projectContractorListResp.setId(project.getId());
projectContractorListResp.setProjectName(project.getProjectName());
// 获取分包公司列表
List<BusContractor> contractorList = projectIdContractorList.get(project.getId());
if (CollUtil.isEmpty(contractorList)) {
throw new ServiceException("项目:" + project.getProjectName() + "下无分包单位,请创建后再进行操作", HttpStatus.BAD_REQUEST);
}
List<IdAndNameVO> idAndNameVOS = contractorList.stream()
.map(contractor -> IdAndNameVO.build(contractor.getId(), contractor.getName())).toList();
projectContractorListResp.setContractorList(idAndNameVOS);
return projectContractorListResp;
}).toList();
}
/**
* 新增项目
*
@ -114,7 +158,7 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
Long projectId = project.getId();
Long userId = LoginHelper.getUserId();
// 同步保存用户与项目关联
List<Long> userIdList = List.of(userId, SystemConstants.SUPER_ADMIN_ID);
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);
@ -142,7 +186,7 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
BeanUtils.copyProperties(req, project);
String playCardStart = req.getPlayCardStart();
String playCardEnd = req.getPlayCardEnd();
if (StringUtils.isNotBlank(playCardStart) && StringUtils.isNotBlank(playCardEnd)){
if (StringUtils.isNotBlank(playCardStart) && StringUtils.isNotBlank(playCardEnd)) {
String punchRange = playCardStart + "," + playCardEnd;
project.setPunchRange(punchRange);
}
@ -218,6 +262,12 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
// 对象转封装类
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]);
}
return projectVo;
}
@ -325,7 +375,7 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
.filter(id -> !collect.contains(id))
.toList();
if (!invalidIds.isEmpty()) {
throw new ServiceException("删除失败,项目编号为:" + invalidIds + ",没有操作权限", HttpStatus.FORBIDDEN);
throw new ServiceException("操作失败,项目编号为:" + invalidIds + ",没有操作权限", HttpStatus.FORBIDDEN);
}
}

View File

@ -16,9 +16,11 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.project.domain.BusConstructionUser;
import org.dromara.project.domain.BusConstructionUserExit;
import org.dromara.project.domain.BusProjectTeamMember;
import org.dromara.project.domain.enums.ProjectTeamMemberPostEnum;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberCreateReq;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberExitReq;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberQueryReq;
import org.dromara.project.domain.req.projectteammember.ProjectTeamMemberUpdateReq;
import org.dromara.project.domain.vo.BusProjectTeamMemberVo;
@ -28,7 +30,10 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
@ -53,6 +58,9 @@ public class BusProjectTeamMemberServiceImpl extends ServiceImpl<BusProjectTeamM
@Resource
private IBusConstructionBlacklistService constructionBlacklistService;
@Resource
private IBusConstructionUserExitService constructionUserExitService;
/**
* 查询项目班组下的成员
*
@ -197,34 +205,49 @@ public class BusProjectTeamMemberServiceImpl extends ServiceImpl<BusProjectTeamM
}
/**
* 校验并批量删除项目班组下的成员信息
* 根据主键删除项目班组与人员关联(人员退场)
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @param req 班组人员退场对象
* @return 是否删除成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
public Boolean deleteById(ProjectTeamMemberExitReq req) {
// 判断是否有权限操作对应项目下的内容
Long userId = LoginHelper.getUserId();
List<BusProjectTeamMember> projectTeamMemberList = this.listByIds(ids);
if (isValid) {
// 做一些业务上的校验,判断是否需要校验
// 获取项目id列表
List<Long> projectIdList = projectTeamMemberList.stream().map(BusProjectTeamMember::getProjectId).toList();
// 判断是否有权限操作对应项目下的内容
projectService.validAuth(projectIdList, userId);
Long id = req.getId();
String filePath = req.getFilePath();
if (StringUtils.isBlank(filePath)) {
throw new ServiceException("请上传退场文件", HttpStatus.BAD_REQUEST);
}
// 判断对应数据是否都存在
if (projectTeamMemberList.size() != ids.size()) {
throw new ServiceException("删除项目班组下的成员失败,数据缺失", HttpStatus.BAD_REQUEST);
BusProjectTeamMember projectTeamMember = this.getById(id);
if (projectTeamMember == null) {
throw new ServiceException("对应项目班组下的成员不存在", HttpStatus.NOT_FOUND);
}
List<Long> memberIds = projectTeamMemberList.stream().map(BusProjectTeamMember::getMemberId).toList();
LambdaUpdateWrapper<BusConstructionUser> queryWrapper = new LambdaUpdateWrapper<>();
queryWrapper.in(BusConstructionUser::getId, memberIds);
queryWrapper.set(BusConstructionUser::getTeamId, null);
constructionUserService.update(null, queryWrapper);
return this.removeBatchByIds(ids);
projectService.validAuth(projectTeamMember.getProjectId(), userId);
boolean result = this.removeById(id);
if (!result) {
throw new ServiceException("删除项目班组下的成员失败,数据库异常", HttpStatus.ERROR);
}
// 将文件信息保存到数据库
BusConstructionUser constructionUser = constructionUserService.getById(projectTeamMember.getMemberId());
BusConstructionUserExit constructionUserExit = new BusConstructionUserExit();
constructionUserExit.setProjectId(constructionUser.getProjectId());
constructionUserExit.setUserId(constructionUser.getId());
constructionUserExit.setPath(filePath);
constructionUserExit.setTeamId(constructionUser.getTeamId());
constructionUserExit.setSfzNumber(constructionUser.getSfzNumber());
constructionUserExit.setEntryDate(constructionUser.getEntryDate());
constructionUserExit.setLeaveDate(new Date());
constructionUserExit.setRemark(req.getRemark());
constructionUserExitService.save(constructionUserExit);
// 同步修改用户表的team_id字段
LambdaUpdateWrapper<BusConstructionUser> constructionUserLuw = Wrappers.lambdaUpdate(BusConstructionUser.class)
.eq(BusConstructionUser::getId, projectTeamMember.getMemberId())
.set(BusConstructionUser::getTeamId, null)
.set(BusConstructionUser::getLeaveDate, new Date());
constructionUserService.update(constructionUserLuw);
return true;
}
/**

View File

@ -3,20 +3,20 @@ package org.dromara.system.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.QueryGroup;
import org.dromara.common.web.core.BaseController;
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.SysOssBo;
import org.dromara.system.domain.vo.SysOssUploadVo;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.service.ISysOssService;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -81,6 +81,22 @@ public class SysOssController extends BaseController {
return R.ok(uploadVo);
}
/**
* 上传OSS对象存储不自动保存数据
*
* @param file 文件
*/
@SaCheckPermission("system:oss:upload")
@Log(title = "OSS对象存储", businessType = BusinessType.INSERT)
@PostMapping(value = "/upload/vo", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<SysOssUploadVo> uploadWithNoSave(@RequestPart("file") MultipartFile file) {
if (ObjectUtil.isNull(file)) {
return R.fail("上传文件不能为空");
}
SysOssUploadVo uploadVo = ossService.uploadWithNoSave(file);
return R.ok(uploadVo);
}
/**
* 下载OSS对象
*

View File

@ -1,10 +1,11 @@
package org.dromara.system.service;
import jakarta.servlet.http.HttpServletResponse;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.system.domain.bo.SysOssBo;
import org.dromara.system.domain.vo.SysOssUploadVo;
import org.dromara.system.domain.vo.SysOssVo;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
@ -52,6 +53,14 @@ public interface ISysOssService {
*/
SysOssVo upload(MultipartFile file);
/**
* 上传 MultipartFile 到对象存储服务,不保存文件信息到数据库
*
* @param file 要上传的 MultipartFile 对象
* @return 上传成功后的 SysOssVo 对象,包含文件信息
*/
SysOssUploadVo uploadWithNoSave(MultipartFile file);
/**
* 上传文件到对象存储服务,并保存文件信息到数据库
*

View File

@ -25,6 +25,7 @@ import org.dromara.common.oss.enumd.AccessPolicyType;
import org.dromara.common.oss.factory.OssFactory;
import org.dromara.system.domain.SysOss;
import org.dromara.system.domain.bo.SysOssBo;
import org.dromara.system.domain.vo.SysOssUploadVo;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.mapper.SysOssMapper;
import org.dromara.system.service.ISysOssService;
@ -203,6 +204,29 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult);
}
/**
* 上传 MultipartFile 到对象存储服务,不保存文件信息到数据库
*
* @param file 要上传的 MultipartFile 对象
* @return 上传成功后的 SysOssVo 对象,包含文件信息
*/
@Override
public SysOssUploadVo uploadWithNoSave(MultipartFile file) {
String originalFilename = file.getOriginalFilename();
String suffix = StringUtils.substring(originalFilename, originalFilename.lastIndexOf("."), originalFilename.length());
OssClient storage = OssFactory.instance();
UploadResult uploadResult;
try {
uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType());
} catch (IOException e) {
throw new ServiceException(e.getMessage());
}
SysOssUploadVo uploadVo = new SysOssUploadVo();
uploadVo.setUrl(uploadResult.getUrl());
uploadVo.setFileName(originalFilename);
return uploadVo;
}
/**
* 上传文件到对象存储服务,并保存文件信息到数据库
*

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.BusConstructionUserExitMapper">
</mapper>

View File

@ -503,3 +503,36 @@ CREATE TABLE `bus_construction_blacklist`
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_user_id` (`user_id` ASC) USING BTREE comment '用户id'
) comment = '黑名单' collate = utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `bus_construction_user_file`;
CREATE TABLE `bus_construction_user_file`
(
`id` bigint not null auto_increment comment '主键id',
`user_id` bigint not null comment '用户id',
`file_type` char(2) null comment '图片类型',
`file_name` varchar(255) null comment '文件名称',
`path` varchar(1024) null comment '图片路径',
`create_time` datetime default CURRENT_TIMESTAMP null comment '创建时间',
`update_time` datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
`remark` varchar(512) null comment '备注',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_user_id` (`user_id` ASC) USING BTREE comment '用户id'
) comment = '施工人员文件存储' collate = utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `bus_construction_user_exit`;
CREATE TABLE `bus_construction_user_exit`
(
`id` bigint not null auto_increment comment '主键id',
`sfz_number` varchar(32) null comment '身份证号码',
`user_id` bigint not null comment '用户id',
`project_id` bigint not null comment '项目id',
`team_id` bigint not null comment '班组id',
`entry_date` varchar(64) null comment '入场时间',
`leave_date` varchar(64) null comment '退场时间',
`path` varchar(1024) null comment '退场文件',
`remark` varchar(512) null comment '备注',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_user_id` (`user_id` ASC) USING BTREE comment '用户id',
INDEX `idx_project_id` (`project_id` ASC) USING BTREE comment '项目id',
INDEX `idx_team_id` (`team_id` ASC) USING BTREE comment '班组id'
) comment = '施工人员入场退场记录信息' COLLATE = utf8mb4_unicode_ci;