设计优化

This commit is contained in:
zt
2025-10-13 19:59:52 +08:00
parent 38d6832f2c
commit bd0fe7228b
24 changed files with 890 additions and 53 deletions

View File

@ -183,7 +183,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
List<BusProjectTeamAppVo> byUserId = projectTeamService.getByUserId(userId, req.getProjectId());
if (CollectionUtil.isEmpty(byUserId)) {
return new TableDataInfo<>();
return TableDataInfo.build(new ArrayList<>());
}
list1 = byUserId.stream().map(BusProjectTeamAppVo::getId).toList();
}
@ -1394,6 +1394,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
SysUserBo sysUserBo = new SysUserBo();
sysUserBo.setUserId(userId);
sysUserBo.setNickName(user.getUserName());
sysUserBo.setSex(user.getSex());
userService.updateUser(sysUserBo);
return user.getId();
}

View File

@ -295,7 +295,7 @@ public class SubUserSalaryDetailServiceImpl extends ServiceImpl<SubUserSalaryDet
List<BusProjectTeamAppVo> byUserId = projectTeamService.getByUserId(userId, dto.getProjectId());
if(CollectionUtil.isEmpty(byUserId)){
return new TableDataInfo<>();
return TableDataInfo.build(new ArrayList<>());
}
list1 = byUserId.stream().map(BusProjectTeamAppVo::getId).toList();
}

View File

@ -0,0 +1,105 @@
package org.dromara.design.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
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.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.design.domain.vo.DesSmsRecordVo;
import org.dromara.design.domain.bo.DesSmsRecordBo;
import org.dromara.design.service.IDesSmsRecordService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 设计图纸短信记录
*
* @author Lion Li
* @date 2025-10-13
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/design/smsRecord")
public class DesSmsRecordController extends BaseController {
private final IDesSmsRecordService desSmsRecordService;
/**
* 查询设计图纸短信记录列表
*/
@SaCheckPermission("design:smsRecord:list")
@GetMapping("/list")
public TableDataInfo<DesSmsRecordVo> list(DesSmsRecordBo bo, PageQuery pageQuery) {
return desSmsRecordService.queryPageList(bo, pageQuery);
}
/**
* 导出设计图纸短信记录列表
*/
@SaCheckPermission("design:smsRecord:export")
@Log(title = "设计图纸短信记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(DesSmsRecordBo bo, HttpServletResponse response) {
List<DesSmsRecordVo> list = desSmsRecordService.queryList(bo);
ExcelUtil.exportExcel(list, "设计图纸短信记录", DesSmsRecordVo.class, response);
}
/**
* 获取设计图纸短信记录详细信息
*
* @param id 主键
*/
@SaCheckPermission("design:smsRecord:query")
@GetMapping("/{id}")
public R<DesSmsRecordVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(desSmsRecordService.queryById(id));
}
/**
* 新增设计图纸短信记录
*/
@SaCheckPermission("design:smsRecord:add")
@Log(title = "设计图纸短信记录", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DesSmsRecordBo bo) {
return toAjax(desSmsRecordService.insertByBo(bo));
}
/**
* 修改设计图纸短信记录
*/
@SaCheckPermission("design:smsRecord:edit")
@Log(title = "设计图纸短信记录", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody DesSmsRecordBo bo) {
return toAjax(desSmsRecordService.updateByBo(bo));
}
/**
* 删除设计图纸短信记录
*
* @param ids 主键串
*/
@SaCheckPermission("design:smsRecord:remove")
@Log(title = "设计图纸短信记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(desSmsRecordService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -40,12 +40,9 @@ public class DesVolumeFileAppController extends BaseController {
private IDesVolumeFileService desVolumeFileService;
/**
* app图纸管理分页查询
*/
@GetMapping("/list")
public TableDataInfo<DesVolumeFileAppVo> list(DesVolumeFileAppPageDto dto, PageQuery pageQuery) {
return desVolumeFileService.queryAppPageList(dto, pageQuery);
@GetMapping("/joinList")
public TableDataInfo<DesVolumeFileJoinVo> joinList(DesVolumeFileBo bo, PageQuery pageQuery) {
return desVolumeFileService.queryJoinPageList(bo, pageQuery);
}
}

View File

@ -0,0 +1,52 @@
package org.dromara.design.controller.app;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.design.domain.bo.DesVolumeFileViewerBo;
import org.dromara.design.domain.vo.volumefileviewer.DesVolumeFileViewerVo;
import org.dromara.design.service.IDesVolumeFileViewerService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 卷册文件查阅人
*
* @author lilemy
* @date 2025-08-14
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/app/design/volumeFileViewer")
public class DesVolumeFileViewerAppController extends BaseController {
private final IDesVolumeFileViewerService desVolumeFileViewerService;
/**
* 新增卷册文件查阅人
*/
@Log(title = "卷册文件查阅人", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody DesVolumeFileViewerBo bo) {
return toAjax(desVolumeFileViewerService.insertByBo(bo));
}
}

View File

@ -0,0 +1,46 @@
package org.dromara.design.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 设计图纸短信记录对象 des_sms_record
*
* @author Lion Li
* @date 2025-10-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("des_sms_record")
public class DesSmsRecord extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 图纸id
*/
private Long volumeFileId;
/**
* 0-不需要再次发送 1-需要再次发送
*/
private String again;
/**
* 用户类型(1-项目经理2-设计部主任)
*/
private String type;
}

View File

@ -0,0 +1,46 @@
package org.dromara.design.domain.bo;
import org.dromara.design.domain.DesSmsRecord;
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.*;
/**
* 设计图纸短信记录业务对象 des_sms_record
*
* @author Lion Li
* @date 2025-10-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = DesSmsRecord.class, reverseConvertGenerate = false)
public class DesSmsRecordBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 图纸id
*/
@NotNull(message = "图纸id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long volumeFileId;
/**
* 0-不需要再次发送 1-需要再次发送
*/
private String again;
/**
* 用户类型(1-项目经理2-设计部主任)
*/
private String type;
}

View File

@ -62,7 +62,7 @@ public class DesVolumeFileBo extends BaseEntity {
/**
* 备注
* 项目id
*/
private Long projectId;
@ -78,6 +78,9 @@ public class DesVolumeFileBo extends BaseEntity {
private String documentName;
/**
* 审核状态
*/
private String auditStatus;
}

View File

@ -0,0 +1,56 @@
package org.dromara.design.domain.vo;
import org.dromara.design.domain.DesSmsRecord;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 设计图纸短信记录视图对象 des_sms_record
*
* @author Lion Li
* @date 2025-10-13
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = DesSmsRecord.class)
public class DesSmsRecordVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 图纸id
*/
@ExcelProperty(value = "图纸id")
private Long volumeFileId;
/**
* 0-不需要再次发送 1-需要再次发送
*/
@ExcelProperty(value = "0-不需要再次发送 1-需要再次发送")
private String again;
/**
* 用户类型(1-项目经理2-设计部主任)
*/
@ExcelProperty(value = "用户类型(1-项目经理2-设计部主任)")
private String type;
}

View File

@ -0,0 +1,15 @@
package org.dromara.design.mapper;
import org.dromara.design.domain.DesSmsRecord;
import org.dromara.design.domain.vo.DesSmsRecordVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 设计图纸短信记录Mapper接口
*
* @author Lion Li
* @date 2025-10-13
*/
public interface DesSmsRecordMapper extends BaseMapperPlus<DesSmsRecord, DesSmsRecordVo> {
}

View File

@ -0,0 +1,81 @@
package org.dromara.design.service;
import org.dromara.design.domain.vo.DesSmsRecordVo;
import org.dromara.design.domain.bo.DesSmsRecordBo;
import org.dromara.design.domain.DesSmsRecord;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Collection;
import java.util.List;
/**
* 设计图纸短信记录Service接口
*
* @author Lion Li
* @date 2025-10-13
*/
public interface IDesSmsRecordService extends IService<DesSmsRecord>{
/**
* 查询设计图纸短信记录
*
* @param id 主键
* @return 设计图纸短信记录
*/
DesSmsRecordVo queryById(Long id);
/**
* 分页查询设计图纸短信记录列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 设计图纸短信记录分页列表
*/
TableDataInfo<DesSmsRecordVo> queryPageList(DesSmsRecordBo bo, PageQuery pageQuery);
/**
* 查询符合条件的设计图纸短信记录列表
*
* @param bo 查询条件
* @return 设计图纸短信记录列表
*/
List<DesSmsRecordVo> queryList(DesSmsRecordBo bo);
/**
* 新增设计图纸短信记录
*
* @param bo 设计图纸短信记录
* @return 是否新增成功
*/
Boolean insertByBo(DesSmsRecordBo bo);
/**
* 修改设计图纸短信记录
*
* @param bo 设计图纸短信记录
* @return 是否修改成功
*/
Boolean updateByBo(DesSmsRecordBo bo);
/**
* 校验并批量删除设计图纸短信记录信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 创建短信记录
*
* @param volumeFileId 卷册文件id
*/
void createSmsRecord(Long volumeFileId);
void updateSmsRecord(Long volumeFileId);
}

View File

@ -0,0 +1,228 @@
package org.dromara.design.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.design.domain.DesVolumeCatalog;
import org.dromara.design.domain.DesVolumeFile;
import org.dromara.design.domain.DesVolumeFileViewer;
import org.dromara.design.service.IDesVolumeCatalogService;
import org.dromara.design.service.IDesVolumeFileService;
import org.dromara.design.service.IDesVolumeFileViewerService;
import org.dromara.system.domain.SysUser;
import org.dromara.system.service.ISysRoleService;
import org.dromara.system.service.ISysUserService;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.dromara.design.domain.bo.DesSmsRecordBo;
import org.dromara.design.domain.vo.DesSmsRecordVo;
import org.dromara.design.domain.DesSmsRecord;
import org.dromara.design.mapper.DesSmsRecordMapper;
import org.dromara.design.service.IDesSmsRecordService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 设计图纸短信记录Service业务层处理
*
* @author Lion Li
* @date 2025-10-13
*/
@RequiredArgsConstructor
@Service
public class DesSmsRecordServiceImpl extends ServiceImpl<DesSmsRecordMapper, DesSmsRecord> implements IDesSmsRecordService {
private final DesSmsRecordMapper baseMapper;
@Resource
@Lazy
private IDesVolumeFileViewerService volumeFileViewerService;
@Resource
@Lazy
private ISysRoleService roleService;
@Resource
@Lazy
private ISysUserService userService;
@Resource
@Lazy
private IDesVolumeFileService designFileService;
@Resource
@Lazy
private IDesVolumeCatalogService volumeCatalogService;
/**
* 查询设计图纸短信记录
*
* @param id 主键
* @return 设计图纸短信记录
*/
@Override
public DesSmsRecordVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 分页查询设计图纸短信记录列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 设计图纸短信记录分页列表
*/
@Override
public TableDataInfo<DesSmsRecordVo> queryPageList(DesSmsRecordBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<DesSmsRecord> lqw = buildQueryWrapper(bo);
Page<DesSmsRecordVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的设计图纸短信记录列表
*
* @param bo 查询条件
* @return 设计图纸短信记录列表
*/
@Override
public List<DesSmsRecordVo> queryList(DesSmsRecordBo bo) {
LambdaQueryWrapper<DesSmsRecord> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<DesSmsRecord> buildQueryWrapper(DesSmsRecordBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<DesSmsRecord> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(DesSmsRecord::getId);
lqw.eq(bo.getVolumeFileId() != null, DesSmsRecord::getVolumeFileId, bo.getVolumeFileId());
lqw.eq(StringUtils.isNotBlank(bo.getAgain()), DesSmsRecord::getAgain, bo.getAgain());
lqw.eq(StringUtils.isNotBlank(bo.getType()), DesSmsRecord::getType, bo.getType());
return lqw;
}
/**
* 新增设计图纸短信记录
*
* @param bo 设计图纸短信记录
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(DesSmsRecordBo bo) {
DesSmsRecord add = MapstructUtils.convert(bo, DesSmsRecord.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改设计图纸短信记录
*
* @param bo 设计图纸短信记录
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(DesSmsRecordBo bo) {
DesSmsRecord update = MapstructUtils.convert(bo, DesSmsRecord.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(DesSmsRecord entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除设计图纸短信记录信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
@Override
@Async
public void createSmsRecord(Long volumeFileId) {
List<DesSmsRecord> desSmsRecords = new ArrayList<>();
DesSmsRecord desSmsRecord = new DesSmsRecord();
desSmsRecord.setVolumeFileId(volumeFileId);
desSmsRecord.setAgain("1");
desSmsRecord.setType("1");
desSmsRecords.add(desSmsRecord);
DesSmsRecord desSmsRecord1 = new DesSmsRecord();
desSmsRecord1.setVolumeFileId(volumeFileId);
desSmsRecord1.setAgain("1");
desSmsRecord1.setType("2");
desSmsRecords.add(desSmsRecord1);
baseMapper.insertBatch(desSmsRecords);
}
@Override
@Async
public void updateSmsRecord(Long volumeFileId) {
List<DesSmsRecord> desSmsRecords = baseMapper.selectList(Wrappers.<DesSmsRecord>lambdaQuery()
.eq(DesSmsRecord::getVolumeFileId, volumeFileId)
.eq(DesSmsRecord::getAgain, "1")
);
for (DesSmsRecord record : desSmsRecords) {
DesVolumeFile desVolumeFile = designFileService.getById(record.getVolumeFileId());
DesVolumeCatalog desVolumeCatalog = volumeCatalogService.getById(desVolumeFile.getVolumeCatalogId());
List<Long> longs = new ArrayList<>();
if (record.getType().equals("1")) {
longs = roleService.selectRoleIdsByName("项目经理");
} else {
longs.add(1961028169115197442L);
}
if (CollectionUtil.isEmpty(longs)) {
continue;
}
List<SysUser> sysUsers = userService.selectUserByRoleIdsAndProjectId(longs, desVolumeCatalog.getProjectId());
List<Long> userIds = sysUsers.stream().map(SysUser::getUserId).toList();
if (CollectionUtil.isEmpty(userIds)) {
continue;
}
List<DesVolumeFileViewer> list = volumeFileViewerService.list(Wrappers.lambdaQuery(DesVolumeFileViewer.class)
.eq(DesVolumeFileViewer::getVolumeFileId, record.getVolumeFileId())
.in(DesVolumeFileViewer::getUserId, userIds)
);
List<Long> list1 = list.stream().map(DesVolumeFileViewer::getUserId).toList();
List<SysUser> list2 = sysUsers.stream().filter(vo -> !list1.contains(vo.getUserId())).toList();
if (list2.isEmpty()) {
record.setAgain("0");
baseMapper.updateById(record);
}
}
}
}

View File

@ -34,10 +34,7 @@ import org.dromara.design.domain.dto.volumefile.DesVolumeFileCreateReq;
import org.dromara.design.domain.vo.BusDrawingreviewReceiptsVo;
import org.dromara.design.domain.vo.volumefile.*;
import org.dromara.design.mapper.DesVolumeFileMapper;
import org.dromara.design.service.IBusDrawingreviewReceiptsService;
import org.dromara.design.service.IDesDrawingService;
import org.dromara.design.service.IDesVolumeCatalogService;
import org.dromara.design.service.IDesVolumeFileService;
import org.dromara.design.service.*;
import org.dromara.project.domain.BusProject;
import org.dromara.project.service.IBusProjectService;
import org.dromara.system.domain.SysUser;
@ -95,6 +92,9 @@ public class DesVolumeFileServiceImpl extends ServiceImpl<DesVolumeFileMapper, D
@Resource
private ISysRoleService roleService;
@Resource
private IDesSmsRecordService desSmsRecordService;
/**
* 分页查询卷册文件列表
@ -626,7 +626,8 @@ public class DesVolumeFileServiceImpl extends ServiceImpl<DesVolumeFileMapper, D
List<SysUser> sysUsers = userService.selectUserByRoleIdsAndProjectId(longs, byId.getProjectId());
asyncUtil.sendSms(sysUsers.stream().map(SysUser::getPhonenumber).toList(), "config5");
asyncUtil.sendSse(sysUsers.stream().map(SysUser::getUserId).toList(), "有新的蓝图审批完成");
asyncUtil.sendSse(sysUsers.stream().map(SysUser::getUserId).toList(), "有新的过程图纸审批完成");
desSmsRecordService.createSmsRecord(desVolumeFile.getId());
}
}
@ -698,6 +699,7 @@ public class DesVolumeFileServiceImpl extends ServiceImpl<DesVolumeFileMapper, D
List<SysUser> sysUsers = userService.selectUserByRoleIdsAndProjectId(longs, byId.getProjectId());
asyncUtil.sendSms(sysUsers.stream().map(SysUser::getPhonenumber).toList(), "config5");
asyncUtil.sendSse(sysUsers.stream().map(SysUser::getUserId).toList(), "有新的蓝图审批完成");
desSmsRecordService.createSmsRecord(desVolumeFile.getId());
}
}

View File

@ -3,6 +3,7 @@ package org.dromara.design.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -13,6 +14,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.design.domain.vo.volumefileviewer.DesVolumeFileViewerVo;
import org.dromara.design.service.IDesSmsRecordService;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.dromara.design.domain.bo.DesVolumeFileViewerBo;
@ -36,6 +39,8 @@ public class DesVolumeFileViewerServiceImpl extends ServiceImpl<DesVolumeFileVie
private final DesVolumeFileViewerMapper baseMapper;
private final IDesSmsRecordService desSmsRecordService;
/**
* 查询卷册文件查阅人
*
@ -98,6 +103,7 @@ public class DesVolumeFileViewerServiceImpl extends ServiceImpl<DesVolumeFileVie
if (flag) {
bo.setId(add.getId());
}
desSmsRecordService.updateSmsRecord(bo.getVolumeFileId());
return flag;
}

View File

@ -0,0 +1,99 @@
package org.dromara.job.design;
import cn.hutool.core.collection.CollectionUtil;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.utils.AsyncUtil;
import org.dromara.design.domain.DesSmsRecord;
import org.dromara.design.domain.DesVolumeCatalog;
import org.dromara.design.domain.DesVolumeFile;
import org.dromara.design.domain.DesVolumeFileViewer;
import org.dromara.design.service.IDesSmsRecordService;
import org.dromara.design.service.IDesVolumeCatalogService;
import org.dromara.design.service.IDesVolumeFileService;
import org.dromara.design.service.IDesVolumeFileViewerService;
import org.dromara.system.domain.SysUser;
import org.dromara.system.service.ISysRoleService;
import org.dromara.system.service.ISysUserService;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j
@Component
public class DesignFileJob {
@Resource
private IDesSmsRecordService desSmsRecordService;
@Resource
private IDesVolumeFileService designFileService;
@Resource
private IDesVolumeFileViewerService volumeFileViewerService;
@Resource
private IDesVolumeCatalogService volumeCatalogService;
@Resource
private ISysRoleService roleService;
@Resource
private ISysUserService userService;
@Resource
private AsyncUtil asyncUtil;
@JobExecutor(name = "designFileSms")
public void designFileSms() {
log.info("执行定时任务:设计图纸查看短信提醒");
//查询到时间的记录
// 计算3天前的时间当前时间 - 3天的毫秒数
long threeDaysMillis = 3L * 24 * 60 * 60 * 1000; // 3天的毫秒数
Date threeDaysAgo = new Date(System.currentTimeMillis() - threeDaysMillis);
// 查询条件again为"1",且创建时间 <= 3天前
List<DesSmsRecord> records = desSmsRecordService.list(Wrappers.lambdaQuery(DesSmsRecord.class)
.eq(DesSmsRecord::getAgain, "1")
.le(DesSmsRecord::getCreateTime, threeDaysAgo) // Date类型直接比较
);
for (DesSmsRecord record : records) {
DesVolumeFile desVolumeFile = designFileService.getById(record.getVolumeFileId());
DesVolumeCatalog desVolumeCatalog = volumeCatalogService.getById(desVolumeFile.getVolumeCatalogId());
List<Long> longs = new ArrayList<>();
if(record.getType().equals("1")){
longs = roleService.selectRoleIdsByName("项目经理");
}else {
longs.add(1961028169115197442L);
}
if(CollectionUtil.isEmpty(longs)){
continue;
}
List<SysUser> sysUsers = userService.selectUserByRoleIdsAndProjectId(longs, desVolumeCatalog.getProjectId());
List<Long> userIds = sysUsers.stream().map(SysUser::getUserId).toList();
if(CollectionUtil.isEmpty(userIds)){
continue;
}
List<DesVolumeFileViewer> list = volumeFileViewerService.list(Wrappers.lambdaQuery(DesVolumeFileViewer.class)
.eq(DesVolumeFileViewer::getVolumeFileId, record.getVolumeFileId())
.in(DesVolumeFileViewer::getUserId, userIds)
);
List<Long> list1 = list.stream().map(DesVolumeFileViewer::getUserId).toList();
//找出没有查看的人 发送短信
List<SysUser> list2 = sysUsers.stream().filter(vo -> !list1.contains(vo.getUserId())).toList();
asyncUtil.sendSms(list2.stream().map(SysUser::getPhonenumber).toList(), "config5");
}
List<Long> list1 = records.stream().map(DesSmsRecord::getId).toList();
desSmsRecordService.lambdaUpdate().in(DesSmsRecord::getId, list1)
.set(DesSmsRecord::getAgain, "0").update();
log.info("定时任务:设计图纸查看短信提醒 完成");
}
}

View File

@ -63,6 +63,13 @@ public class BusLeaveAppController extends BaseController {
return leaveService.listByAuditRole(req, pageQuery);
}
/**
* 获取请假信息
*/
@GetMapping("/{id}")
public R<BusLeaveVo> queryById(@PathVariable Long id) {
return R.ok(leaveService.queryById(id));
}
/**
* 提交请假

View File

@ -12,4 +12,7 @@ public class BusLeaveAuditDto {
* 意见1未读 2同意 3拒绝
*/
private String gangerOpinion;
private String gangerExplain;
}

View File

@ -77,5 +77,5 @@ public class BusReissueCardUpdateReq implements Serializable {
*/
private LocalDate date;
private String gangerExplain;
}

View File

@ -7,11 +7,13 @@ import lombok.Data;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import org.dromara.project.domain.BusLeave;
import org.dromara.project.domain.vo.reissuecard.AuditUserVo;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
@ -155,11 +157,20 @@ public class BusLeaveVo implements Serializable {
@ExcelProperty(value = "备注")
private String remark;
/**
* 审核状态
*/
/**
* 请假申请状态
*/
private String auditStatus;
private List<AuditUserVo> auditors;
/**
* 申请人类型0-施工人员 1-管理人员 2-分包人员)
*/
private String userType;
/**
* 头像
*/
private String avatar;
}

View File

@ -10,6 +10,7 @@ import org.dromara.project.domain.dto.leave.*;
import org.dromara.project.domain.dto.reissuecard.BusReissueCardQueryReq;
import org.dromara.project.domain.vo.leave.BusLeaveVo;
import org.dromara.project.domain.vo.reissuecard.BusReissueCardVo;
import org.springframework.web.bind.annotation.PathVariable;
import java.time.LocalDate;
import java.time.LocalDateTime;
@ -127,4 +128,5 @@ public interface IBusLeaveService extends IService<BusLeave> {
Boolean audit(BusLeaveAuditDto dto);
}

View File

@ -526,24 +526,13 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
List<BusAttendance> attendanceList = this.lambdaQuery()
.eq(BusAttendance::getProjectId, projectId)
.eq(BusAttendance::getClockDate, LocalDate.now())
.in(BusAttendance::getClockStatus, ATTENDANCE_STATUS)
.apply(" user_id not in (select sys_user_id from sub_construction_user where project_id = {0} and user_role != '0' )", projectId)
.list();
if (CollUtil.isEmpty(attendanceList)) {
return List.of();
}
Map<Long, List<BusAttendance>> attendanceMap = attendanceList.stream()
.collect(Collectors.groupingBy(BusAttendance::getUserId));
List<Long> attendedUserIds = new ArrayList<>();
for (Map.Entry<Long, List<BusAttendance>> entry : attendanceMap.entrySet()) {
Long userId = entry.getKey();
List<BusAttendance> records = entry.getValue();
boolean allValid = records.stream()
.anyMatch(record -> ATTENDANCE_STATUS.contains(record.getClockStatus()));
if (allValid) {
attendedUserIds.add(userId);
}
}
return attendedUserIds;
return attendanceList.stream().map(BusAttendance::getUserId).distinct().toList();
}
@ -973,7 +962,7 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
List<BusProjectTeamAppVo> byUserId = projectTeamService.getByUserId(userId, dto.getProjectId());
if(CollectionUtil.isEmpty(byUserId)){
return new TableDataInfo<>();
return TableDataInfo.build(new ArrayList<>());
}
list1 = byUserId.stream().map(BusProjectTeamAppVo::getId).toList();
}

View File

@ -2,6 +2,7 @@ package org.dromara.project.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
@ -17,6 +18,7 @@ import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.DateUtils;
@ -33,10 +35,16 @@ import org.dromara.project.domain.dto.leave.*;
import org.dromara.project.domain.dto.reissuecard.BusReissueCardQueryReq;
import org.dromara.project.domain.enums.*;
import org.dromara.project.domain.vo.leave.BusLeaveVo;
import org.dromara.project.domain.vo.reissuecard.AuditUserVo;
import org.dromara.project.domain.vo.reissuecard.BusReissueCardVo;
import org.dromara.project.mapper.BusLeaveMapper;
import org.dromara.project.service.*;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysOssService;
import org.dromara.system.service.ISysRoleService;
import org.dromara.system.service.ISysUserService;
import org.dromara.workflow.domain.TestLeave;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
@ -81,6 +89,12 @@ public class BusLeaveServiceImpl extends ServiceImpl<BusLeaveMapper, BusLeave>
@Resource
private ISysRoleService roleService;
@Resource
private ISysUserService userService;
@Resource
private ISysOssService ossService;
/**
* 查询施工人员请假申请
*
@ -89,7 +103,46 @@ public class BusLeaveServiceImpl extends ServiceImpl<BusLeaveMapper, BusLeave>
*/
@Override
public BusLeaveVo queryById(Long id) {
return baseMapper.selectVoById(id);
BusLeaveVo busLeaveVo = baseMapper.selectVoById(id);
String userType = busLeaveVo.getUserType();
//两个角色 一个审核分包的=6一个审核管理的=7
List<SysUser> sysUsers = new ArrayList<>();
if(busLeaveVo.getGangerId()==null){
if("1".equals(userType)){
sysUsers = userService.selectUserByRoleIdAndProjectId(6L, busLeaveVo.getProjectId());
} else if ("2".equals(userType)) {
sysUsers = userService.selectUserByRoleIdAndProjectId(7L, busLeaveVo.getProjectId());
}
}else {
SysUserVo sysUserVo = userService.selectUserById(busLeaveVo.getGangerId());
if(sysUserVo != null){
busLeaveVo.setGangerName(sysUserVo.getNickName());
if(sysUserVo.getAvatar() != null){
SysOssVo byId1 = ossService.getById(sysUserVo.getAvatar());
if(byId1 != null){
busLeaveVo.setAvatar(byId1.getUrl());
}
}
}
}
if(CollectionUtil.isNotEmpty(sysUsers)){
busLeaveVo.setAuditors(sysUsers.stream().map(sysUser -> {
AuditUserVo userVo = new AuditUserVo();
userVo.setUserId(sysUser.getUserId());
userVo.setNickName(sysUser.getNickName());
if(sysUser.getAvatar() != null){
SysOssVo byId1 = ossService.getById(sysUser.getAvatar());
if(byId1 != null){
userVo.setAvatar(byId1.getUrl());
}
}
return userVo;
}).collect(Collectors.toList()));
}
return busLeaveVo;
}
/**
@ -377,7 +430,7 @@ public class BusLeaveServiceImpl extends ServiceImpl<BusLeaveMapper, BusLeave>
LambdaQueryWrapper<BusLeave> wrappers = new LambdaQueryWrapper<>();
wrappers.eq(BusLeave::getUserId, userId)
.eq(BusLeave::getAuditStatus, BusinessStatusEnum.FINISH.getStatus())
.eq(BusLeave::getGangerOpinion, "2")
.le(BusLeave::getStartTime, clockTime) // 请假开始时间 <= 当天打卡时间
.ge(BusLeave::getEndTime, clockTime); // 请假结束时间 >= 当天打卡时间
@ -397,8 +450,8 @@ public class BusLeaveServiceImpl extends ServiceImpl<BusLeaveMapper, BusLeave>
// 3. 构造查询条件
LambdaQueryWrapper<BusLeave> wrapper = new LambdaQueryWrapper<>();
wrapper
.eq(BusLeave::getUserId, userId)
wrapper.eq(BusLeave::getUserId, userId)
.ne(BusLeave::getGangerOpinion, "3")
.le(BusLeave::getStartTime, newEnd) // 已有记录的开始时间 < 新记录的结束时间
.ge(BusLeave::getEndTime, newStart); // 已有记录的结束时间 > 新记录的开始时间
@ -419,14 +472,14 @@ public class BusLeaveServiceImpl extends ServiceImpl<BusLeaveMapper, BusLeave>
lqw.eq(ObjectUtils.isNotEmpty(req.getUserId()), BusLeave::getUserId, req.getUserId());
List<BusUserProjectRelevancy> relevancyList = userProjectRelevancyService.list(
Wrappers.lambdaQuery(BusUserProjectRelevancy.class)
.eq(BusUserProjectRelevancy::getProjectId, req.getProjectId())
.eq(BusUserProjectRelevancy::getUserId, req.getUserId()));
// List<BusUserProjectRelevancy> relevancyList = userProjectRelevancyService.list(
// Wrappers.lambdaQuery(BusUserProjectRelevancy.class)
// .eq(BusUserProjectRelevancy::getProjectId, req.getProjectId())
// .eq(BusUserProjectRelevancy::getUserId, req.getUserId()));
boolean b = relevancyList.stream().anyMatch(relevancy -> "2".equals(relevancy.getUserType()));
// boolean b = relevancyList.stream().anyMatch(relevancy -> "2".equals(relevancy.getUserType()));
lqw.eq(!b, BusLeave::getProjectId, req.getProjectId());
lqw.eq(BusLeave::getProjectId, req.getProjectId());
// 新增日期范围筛选条件
if (req.getDate() != null) {
LocalDateTime dateStart = LocalDateTime.of(req.getDate(), LocalTime.MIN);
@ -438,7 +491,6 @@ public class BusLeaveServiceImpl extends ServiceImpl<BusLeaveMapper, BusLeave>
);
}
Page<BusLeave> result = this.page(pageQuery.build(), lqw);
return TableDataInfo.build(this.getVoPage(result));
}
@ -462,10 +514,10 @@ public class BusLeaveServiceImpl extends ServiceImpl<BusLeaveMapper, BusLeave>
List<String> type = new ArrayList<>();
if(roleIds.contains(7L)){
type.add("7");
type.add("1");
}
if(roleIds.contains(6L)){
type.add("6");
type.add("2");
}
if(CollUtil.isEmpty(type)){
return TableDataInfo.build();
@ -489,6 +541,15 @@ public class BusLeaveServiceImpl extends ServiceImpl<BusLeaveMapper, BusLeave>
}
String gangerOpinion = dto.getGangerOpinion();
busLeave.setGangerOpinion(gangerOpinion);
busLeave.setGangerExplain(dto.getGangerExplain());
if(busLeave.getGangerId() == null){
LoginUser loginUser = LoginHelper.getLoginUser();
busLeave.setGangerId(loginUser.getUserId());
busLeave.setGangerName(loginUser.getNickname());
}
busLeave.setGangerTime(LocalDateTime.now());
int i = baseMapper.updateById(busLeave);
if(gangerOpinion.equals("2")){

View File

@ -15,6 +15,7 @@ import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.DateUtils;
@ -117,11 +118,13 @@ public class BusReissueCardServiceImpl extends ServiceImpl<BusReissueCardMapper,
String userType = busReissueCardVo.getUserType();
//两个角色 一个审核分包的=6一个审核管理的=7
List<SysUser> sysUsers = new ArrayList<>();
if(busReissueCardVo.getGangerId()==null){
if("1".equals(userType)){
sysUsers = userService.selectUserByRoleIdAndProjectId(6L, busReissueCardVo.getProjectId());
} else if ("2".equals(userType)) {
sysUsers = userService.selectUserByRoleIdAndProjectId(7L, busReissueCardVo.getProjectId());
}else{
}
}else {
SysUserVo sysUserVo = userService.selectUserById(busReissueCardVo.getGangerId());
if(sysUserVo != null){
busReissueCardVo.setGangerName(sysUserVo.getNickName());
@ -134,6 +137,7 @@ public class BusReissueCardServiceImpl extends ServiceImpl<BusReissueCardMapper,
}
}
}
if(CollectionUtil.isNotEmpty(sysUsers)){
busReissueCardVo.setAuditors(sysUsers.stream().map(sysUser -> {
AuditUserVo userVo = new AuditUserVo();
@ -193,6 +197,15 @@ public class BusReissueCardServiceImpl extends ServiceImpl<BusReissueCardMapper,
throw new ServiceException("未找到该申请");
}
Long attendanceId = bean.getAttendanceId();
bean.setGangerTime(LocalDateTime.now());
if(bean.getGangerId()==null){
LoginUser loginUser = LoginHelper.getLoginUser();
bean.setGangerId(loginUser.getUserId());
bean.setGangerName(loginUser.getNickname());
}
BeanUtil.copyProperties(req, bean);
boolean b = updateById(bean);
if("2".equals(bean.getGangerOpinion())){
@ -399,10 +412,10 @@ public class BusReissueCardServiceImpl extends ServiceImpl<BusReissueCardMapper,
//两个角色 一个审核分包的=6一个审核管理的=7
List<String> type = new ArrayList<>();
if(roleIds.contains(7L)){
type.add("7");
type.add("1");
}
if(roleIds.contains(6L)){
type.add("6");
type.add("2");
}
if(CollUtil.isEmpty(type)){
return TableDataInfo.build();
@ -459,6 +472,15 @@ public class BusReissueCardServiceImpl extends ServiceImpl<BusReissueCardMapper,
throw new ServiceException("未找到该申请");
}
Long attendanceId = bean.getAttendanceId();
bean.setGangerTime(LocalDateTime.now());
if(bean.getGangerId()==null){
LoginUser loginUser = LoginHelper.getLoginUser();
bean.setGangerId(loginUser.getUserId());
bean.setGangerName(loginUser.getNickname());
}
BeanUtil.copyProperties(req, bean);
boolean b = updateById(bean);
if("2".equals(bean.getGangerOpinion())){

View File

@ -92,4 +92,9 @@ public class HseSafetyInspectionCreateReq implements Serializable {
*/
private String remark;
/**
* 问题隐患
*/
private String hiddenDanger;
}