[add] 工单回复添加分包方,施工进度计划 [update] 修改app识别、实名,进度

This commit is contained in:
lcj
2025-08-01 19:50:56 +08:00
parent f030b825aa
commit 177fcd5f05
59 changed files with 1466 additions and 379 deletions

View File

@ -0,0 +1,24 @@
package org.dromara.common.enums;
import lombok.Getter;
/**
* @author lilemy
* @date 2025-08-01 10:47
*/
@Getter
public enum InspectionRectificationUnitType {
CONTRACTOR("分包方", "1"),
TEAM("班组", "2");
private final String text;
private final String value;
InspectionRectificationUnitType(String text, String value) {
this.text = text;
this.value = value;
}
}

View File

@ -2,7 +2,6 @@ package org.dromara.common.utils.baiduUtil.entity.ocr;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import org.dromara.system.domain.vo.SysOssVo;
/**
* @Author 铁憨憨
@ -38,8 +37,4 @@ public class BankData {
@JSONField(name = "holder_name", label = "持卡人姓名,不能识别时为空")
private String holderName;
/**
* 银行卡图片信息
*/
private SysOssVo image;
}

View File

@ -2,7 +2,6 @@ package org.dromara.common.utils.baiduUtil.entity.ocr;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import org.dromara.system.domain.vo.SysOssVo;
/**
* @Author 铁憨憨
@ -31,8 +30,12 @@ public class WordsResult {
@JSONField(name = "性别")
private Field gender;
/**
* 身份证图片信息
*/
private SysOssVo image;
@JSONField(name = "失效日期")
private Field expiryDate;
@JSONField(name = "签发机关")
private Field issuingAuthority;
@JSONField(name = "签发日期")
private Field issuingDate;
}

View File

@ -18,6 +18,7 @@ import org.dromara.common.web.core.BaseController;
import org.dromara.contractor.domain.dto.contractor.SubContractorCreateReq;
import org.dromara.contractor.domain.dto.contractor.SubContractorQueryReq;
import org.dromara.contractor.domain.dto.contractor.SubContractorUpdateReq;
import org.dromara.contractor.domain.vo.contractor.SubContractorManagerVo;
import org.dromara.contractor.domain.vo.contractor.SubContractorVo;
import org.dromara.contractor.service.ISubContractorService;
import org.springframework.validation.annotation.Validated;
@ -58,6 +59,16 @@ public class SubContractorController extends BaseController {
return contractorService.queryListNoDept(projectId);
}
/**
* 根据项目id查询分包方管理人员信息列表
*/
@SaCheckPermission("contractor:contractor:listManager")
@GetMapping("/listManager/{projectId}")
public R<List<SubContractorManagerVo>> listManager(@NotNull(message = "项目id不能为空")
@PathVariable Long projectId) {
return R.ok(contractorService.queryManagerList(projectId));
}
/**
* 导出分包单位列表
*/

View File

@ -5,10 +5,10 @@ import org.dromara.common.core.domain.R;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.utils.baiduUtil.entity.ocr.BankData;
import org.dromara.common.utils.baiduUtil.entity.ocr.WordsResult;
import org.dromara.contractor.domain.SubConstructionUser;
import org.dromara.contractor.domain.dto.constructionuser.SubConstructionUserAuthenticationReq;
import org.dromara.contractor.domain.vo.constructionuser.SubConstructionUserOrcBankVo;
import org.dromara.contractor.domain.vo.constructionuser.SubConstructionUserOrcIdCardVo;
import org.dromara.contractor.domain.vo.constructionuser.SubConstructionUserVo;
import org.dromara.contractor.service.ISubConstructionUserService;
import org.springframework.validation.annotation.Validated;
@ -43,7 +43,7 @@ public class SubConstructionUserAppController {
*/
@Log(title = "施工人员", businessType = BusinessType.OTHER)
@PostMapping("/idCard")
public R<WordsResult> getIdCardMessage(@RequestParam("file") MultipartFile file, String idCardSide) {
public R<SubConstructionUserOrcIdCardVo> getIdCardMessage(@RequestParam("file") MultipartFile file, String idCardSide) {
return R.ok(constructionUserService.getIdCardMessageByPic(file, idCardSide));
}
@ -52,7 +52,7 @@ public class SubConstructionUserAppController {
*/
@Log(title = "施工人员", businessType = BusinessType.OTHER)
@PostMapping("/bankCard")
public R<BankData> getBankCardMessage(@RequestParam("file") MultipartFile file) {
public R<SubConstructionUserOrcBankVo> getBankCardMessage(@RequestParam("file") MultipartFile file) {
return R.ok(constructionUserService.getBankCardMessageByPic(file));
}
@ -61,8 +61,8 @@ public class SubConstructionUserAppController {
*/
@Log(title = "施工人员", businessType = BusinessType.INSERT)
@PostMapping("/authentication")
public R<Long> insertByAuthentication(@RequestParam("file") MultipartFile file, @Validated SubConstructionUserAuthenticationReq req) {
return R.ok(constructionUserService.insertByAuthentication(file, req));
public R<Long> insertByAuthentication(@Validated @RequestBody SubConstructionUserAuthenticationReq req) {
return R.ok(constructionUserService.insertByAuthentication(req));
}
/**

View File

@ -1,7 +1,6 @@
package org.dromara.contractor.domain.dto.constructionuser;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import org.dromara.common.core.constant.RegexConstants;
@ -25,23 +24,9 @@ public class SubConstructionUserAuthenticationReq implements Serializable {
@NotBlank(message = "人员姓名不能为空")
private String userName;
/**
* 项目id
*/
@NotNull(message = "项目id不能为空")
private Long projectId;
/**
* 分包公司id
*/
@NotNull(message = "分包公司id不能为空")
private Long contractorId;
/**
* 联系电话
*/
@NotBlank(message = "联系电话不能为空")
@Pattern(regexp = RegexConstants.MOBILE, message = "手机号格式不正确")
private String phone;
/**

View File

@ -0,0 +1,50 @@
package org.dromara.contractor.domain.vo.constructionuser;
import lombok.Data;
import org.dromara.system.domain.vo.SysOssVo;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-08-01 18:42
*/
@Data
public class SubConstructionUserOrcBankVo implements Serializable {
@Serial
private static final long serialVersionUID = 6307930658427321172L;
/**
* 银行卡号
*/
private String bankCardNumber;
/**
* 银行卡有效期
*/
private String validDate;
/**
* 银行卡类型
* 0不能识别; 1借记卡; 2贷记卡原信用卡大部分为贷记卡; 3准贷记卡; 4预付费卡
*/
private int bankCardType;
/**
* 银行名称
*/
private String bankName;
/**
* 银行卡的持卡人姓名
*/
private String holderName;
/**
* 银行卡图片信息
*/
private SysOssVo image;
}

View File

@ -0,0 +1,68 @@
package org.dromara.contractor.domain.vo.constructionuser;
import lombok.Data;
import org.dromara.system.domain.vo.SysOssVo;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-08-01 18:35
*/
@Data
public class SubConstructionUserOrcIdCardVo implements Serializable {
@Serial
private static final long serialVersionUID = -569979905442550651L;
/**
* 姓名
*/
private String name;
/**
* 民族
*/
private String nation;
/**
* 地址
*/
private String address;
/**
* 身份证号码
*/
private String citizenIdentification;
/**
* 出生日期
*/
private String birth;
/**
* 性别
*/
private String gender;
/**
* 失效日期
*/
private String expiryDate;
/**
* 签发机关
*/
private String issuingAuthority;
/**
* 签发日期
*/
private String issuingDate;
/**
* 身份证图片信息
*/
private SysOssVo image;
}

View File

@ -0,0 +1,39 @@
package org.dromara.contractor.domain.vo.contractor;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* @author lilemy
* @date 2025-08-01 14:55
*/
@Data
public class SubContractorManagerVo implements Serializable {
@Serial
private static final long serialVersionUID = -7901062489097101251L;
/**
* 主键id
*/
private Long id;
/**
* 项目id
*/
private Long projectId;
/**
* 公司名称
*/
private String name;
/**
* 管理人员列表
*/
private List<SubManagerVo> managerList;
}

View File

@ -0,0 +1,27 @@
package org.dromara.contractor.domain.vo.contractor;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-08-01 14:56
*/
@Data
public class SubManagerVo implements Serializable {
@Serial
private static final long serialVersionUID = -7929841464664698275L;
/**
* 管理员id
*/
private Long managerId;
/**
* 管理员名称
*/
private String managerName;
}

View File

@ -5,15 +5,10 @@ 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.common.utils.baiduUtil.entity.ocr.BankData;
import org.dromara.common.utils.baiduUtil.entity.ocr.WordsResult;
import org.dromara.contractor.domain.SubConstructionUser;
import org.dromara.contractor.domain.dto.constructionuser.*;
import org.dromara.contractor.domain.vo.constructionuser.SubConstructionUserVo;
import org.dromara.contractor.domain.exportvo.BusConstructionUserExportVo;
import org.dromara.contractor.domain.vo.constructionuser.SubConstructionUserAttendanceMonthVo;
import org.dromara.contractor.domain.vo.constructionuser.SubConstructionUserAttendanceTotalVo;
import org.dromara.contractor.domain.vo.constructionuser.SubConstructionUserGisVo;
import org.dromara.contractor.domain.vo.constructionuser.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.Collection;
@ -182,7 +177,7 @@ public interface ISubConstructionUserService extends IService<SubConstructionUse
* @param idCardSide 身份证正反面front/back
* @return 身份证信息
*/
WordsResult getIdCardMessageByPic(MultipartFile file, String idCardSide);
SubConstructionUserOrcIdCardVo getIdCardMessageByPic(MultipartFile file, String idCardSide);
/**
@ -191,16 +186,15 @@ public interface ISubConstructionUserService extends IService<SubConstructionUse
* @param file 图片文件
* @return 银行卡信息
*/
BankData getBankCardMessageByPic(MultipartFile file);
SubConstructionUserOrcBankVo getBankCardMessageByPic(MultipartFile file);
/**
* 实名认证
*
* @param file 人脸图片
* @param req 身份信息认证对象
* @param req 身份信息认证对象
* @return 是否认证成功
*/
Long insertByAuthentication(MultipartFile file, SubConstructionUserAuthenticationReq req);
Long insertByAuthentication(SubConstructionUserAuthenticationReq req);
/**
* 人脸识别

View File

@ -9,6 +9,7 @@ import org.dromara.contractor.domain.SubContractor;
import org.dromara.contractor.domain.dto.contractor.SubContractorCreateReq;
import org.dromara.contractor.domain.dto.contractor.SubContractorQueryReq;
import org.dromara.contractor.domain.dto.contractor.SubContractorUpdateReq;
import org.dromara.contractor.domain.vo.contractor.SubContractorManagerVo;
import org.dromara.contractor.domain.vo.contractor.SubContractorVo;
import java.util.Collection;
@ -104,4 +105,11 @@ public interface ISubContractorService extends IService<SubContractor> {
*/
Page<SubContractorVo> getVoPage(Page<SubContractor> contractorPage);
/**
* 获取分包公司管理员列表
*
* @param projectId 项目id
* @return 分包公司经理列表
*/
List<SubContractorManagerVo> queryManagerList(Long projectId);
}

View File

@ -54,6 +54,7 @@ import org.dromara.project.service.*;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.service.ISysDictTypeService;
import org.dromara.system.service.ISysOssService;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@ -985,7 +986,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
* @return 身份证信息
*/
@Override
public WordsResult getIdCardMessageByPic(MultipartFile file, String idCardSide) {
public SubConstructionUserOrcIdCardVo getIdCardMessageByPic(MultipartFile file, String idCardSide) {
if (file == null) {
throw new ServiceException("请上传图片", HttpStatus.BAD_REQUEST);
}
@ -1013,8 +1014,27 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
}
// 获取数据成功,保存图片信息
SysOssVo upload = ossService.upload(file);
wordsResult.setImage(upload);
return wordsResult;
return getSubConstructionUserOrcIdCardVo(idCardSide, wordsResult, upload);
}
@NotNull
private static SubConstructionUserOrcIdCardVo getSubConstructionUserOrcIdCardVo(String idCardSide, WordsResult wordsResult, SysOssVo upload) {
SubConstructionUserOrcIdCardVo vo = new SubConstructionUserOrcIdCardVo();
if (idCardSide.equals("front")) {
vo.setName(wordsResult.getName() != null ? wordsResult.getName().getWords() : "");
vo.setNation(wordsResult.getNation() != null ? wordsResult.getNation().getWords() : "");
vo.setAddress(wordsResult.getAddress() != null ? wordsResult.getAddress().getWords() : "");
vo.setCitizenIdentification(wordsResult.getCitizenIdentification() != null ? wordsResult.getCitizenIdentification().getWords() : "");
vo.setBirth(wordsResult.getBirth() != null ? wordsResult.getBirth().getWords() : "");
vo.setGender(wordsResult.getGender() != null ? wordsResult.getGender().getWords() : "");
vo.setImage(upload);
} else {
vo.setExpiryDate(wordsResult.getExpiryDate() != null ? wordsResult.getExpiryDate().getWords() : "");
vo.setIssuingAuthority(wordsResult.getIssuingAuthority() != null ? wordsResult.getIssuingAuthority().getWords() : "");
vo.setIssuingDate(wordsResult.getIssuingDate() != null ? wordsResult.getIssuingDate().getWords() : "");
vo.setImage(upload);
}
return vo;
}
/**
@ -1024,7 +1044,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
* @return 银行卡信息
*/
@Override
public BankData getBankCardMessageByPic(MultipartFile file) {
public SubConstructionUserOrcBankVo getBankCardMessageByPic(MultipartFile file) {
if (file == null) {
throw new ServiceException("请上传图片", HttpStatus.BAD_REQUEST);
}
@ -1046,20 +1066,25 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
}
// 获取数据成功,保存图片信息
SysOssVo upload = ossService.upload(file);
res.setImage(upload);
return res;
SubConstructionUserOrcBankVo vo = new SubConstructionUserOrcBankVo();
vo.setBankCardNumber(res.getBankCardNumber());
vo.setValidDate(res.getValidDate());
vo.setBankCardType(res.getBankCardType());
vo.setBankName(res.getBankName());
vo.setHolderName(res.getHolderName());
vo.setImage(upload);
return vo;
}
/**
* 实名认证
*
* @param file 人脸图片
* @param req 身份信息认证对象
* @param req 身份信息认证对象
* @return 是否认证成功
*/
@Override
public Long insertByAuthentication(MultipartFile file, SubConstructionUserAuthenticationReq req) {
// 先进行人脸识别
public Long insertByAuthentication(SubConstructionUserAuthenticationReq req) {
/* // 先进行人脸识别
if (file == null) {
throw new ServiceException("请上传图片", HttpStatus.BAD_REQUEST);
}
@ -1074,12 +1099,13 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
}
HumanFaceReq request = new HumanFaceReq();
request.setImage(base64);
baiDuFace.humanFace(request);
baiDuFace.humanFace(request);*/
// 人脸识别成功,保存人脸数据
SubConstructionUser user = new SubConstructionUser();
BeanUtils.copyProperties(req, user);
SysOssVo upload = ossService.upload(file);
user.setFacePic(upload.getOssId().toString());
// 对身份证号码进行加密
String encrypt = idCardEncryptorUtil.encrypt(req.getSfzNumber());
user.setSfzNumber(encrypt);
// 关联系统用户
Long userId = LoginHelper.getUserId();
// 判断当前系统用户是否已关联

View File

@ -20,6 +20,7 @@ import org.dromara.contractor.domain.SubContractor;
import org.dromara.contractor.domain.dto.contractor.SubContractorCreateReq;
import org.dromara.contractor.domain.dto.contractor.SubContractorQueryReq;
import org.dromara.contractor.domain.dto.contractor.SubContractorUpdateReq;
import org.dromara.contractor.domain.vo.contractor.SubContractorManagerVo;
import org.dromara.contractor.domain.vo.contractor.SubContractorVo;
import org.dromara.contractor.mapper.SubContractorMapper;
import org.dromara.contractor.service.ISubConstructionUserService;
@ -363,4 +364,22 @@ public class SubContractorServiceImpl extends ServiceImpl<SubContractorMapper, S
contractorVoPage.setRecords(contractorVoList);
return contractorVoPage;
}
/**
* 获取分包公司管理员列表
*
* @param projectId 项目id
* @return 分包公司经理列表
*/
@Override
public List<SubContractorManagerVo> queryManagerList(Long projectId) {
List<SubContractor> contractorList = this.lambdaQuery()
.eq(SubContractor::getProjectId, projectId)
.list();
if (CollUtil.isEmpty(contractorList)) {
return List.of();
}
Set<Long> contractorIds = contractorList.stream().map(SubContractor::getId).collect(Collectors.toSet());
return List.of();
}
}

View File

@ -1,7 +1,11 @@
package org.dromara.out.service.impl;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.event.ProcessDeleteEvent;
import org.dromara.common.core.domain.event.ProcessEvent;
@ -9,14 +13,15 @@ import org.dromara.common.core.domain.event.ProcessTaskEvent;
import org.dromara.common.core.enums.BusinessStatusEnum;
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.common.mybatis.core.page.TableDataInfo;
import org.dromara.facility.domain.vo.matrix.FacMatrixVo;
import org.dromara.facility.service.IFacMatrixService;
import org.dromara.out.domain.OutConstructionValue;
import org.dromara.out.domain.bo.OutConstructionValueBo;
import org.dromara.out.domain.vo.OutConstructionValueVo;
import org.dromara.out.mapper.OutConstructionValueMapper;
import org.dromara.out.service.IOutConstructionValueService;
import org.dromara.progress.domain.PgsProgressCategory;
import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryVo;
import org.dromara.progress.service.IPgsProgressCategoryService;
@ -24,16 +29,11 @@ import org.dromara.project.domain.vo.project.BusProjectVo;
import org.dromara.project.service.IBusProjectService;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import org.dromara.out.domain.bo.OutConstructionValueBo;
import org.dromara.out.domain.vo.OutConstructionValueVo;
import org.dromara.out.domain.OutConstructionValue;
import org.dromara.out.mapper.OutConstructionValueMapper;
import org.dromara.out.service.IOutConstructionValueService;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 施工产值Service业务层处理
@ -61,7 +61,7 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
* @return 施工产值
*/
@Override
public OutConstructionValueVo queryById(Long id){
public OutConstructionValueVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@ -91,7 +91,7 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
LambdaQueryWrapper<OutConstructionValue> lqw = buildQueryWrapper(bo);
List<OutConstructionValueVo> outConstructionValueVos = baseMapper.selectVoList(lqw);
supplementaryData(outConstructionValueVos);
return outConstructionValueVos;
return outConstructionValueVos;
}
private LambdaQueryWrapper<OutConstructionValue> buildQueryWrapper(OutConstructionValueBo bo) {
@ -123,10 +123,10 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
validEntityBeforeSave(add);
//计算产值
PgsProgressCategory progressCategory = pgsProgressCategoryService.getById(bo.getProgressCategoryId());
if(progressCategory != null ){
if("1".equals(progressCategory.getUnitType())){
if (progressCategory != null) {
if ("1".equals(progressCategory.getUnitType())) {
add.setOutValue(progressCategory.getUnitPrice().multiply(BigDecimal.valueOf(bo.getArtificialNum())));
}else if("2".equals(progressCategory.getUnitType())){
} else if ("2".equals(progressCategory.getUnitType())) {
add.setOutValue(progressCategory.getUnitPrice().multiply(BigDecimal.valueOf(bo.getUavNum()).divide(new BigDecimal("100"))));
}
}
@ -154,7 +154,7 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(OutConstructionValue entity){
private void validEntityBeforeSave(OutConstructionValue entity) {
//TODO 做一些数据校验,如唯一约束
}
@ -167,7 +167,7 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
@ -176,8 +176,8 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
/**
* 补充数据
*/
public void supplementaryData(List<OutConstructionValueVo> list){
for (OutConstructionValueVo vo : list){
public void supplementaryData(List<OutConstructionValueVo> list) {
for (OutConstructionValueVo vo : list) {
//查询项目
BusProjectVo busProjectVo = busProjectService.queryById(vo.getProjectId());
vo.setProjectName(busProjectVo.getProjectName());
@ -194,7 +194,7 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
PgsProgressCategoryVo pgsProgressCategoryVo = pgsProgressCategoryService.queryById(vo.getProgressCategoryId());
vo.setProgressCategoryName(pgsProgressCategoryVo.getName());
PgsProgressCategoryVo pgsProgressCategoryVo1 = pgsProgressCategoryService.queryById(pgsProgressCategoryVo.getPid());
PgsProgressCategoryVo pgsProgressCategoryVo1 = pgsProgressCategoryService.queryById(pgsProgressCategoryVo.getParentId());
vo.setCategoryId(pgsProgressCategoryVo1.getId());
vo.setCategoryName(pgsProgressCategoryVo1.getName());
}

View File

@ -0,0 +1,107 @@
package org.dromara.progress.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import org.dromara.common.core.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.web.core.BaseController;
import org.dromara.progress.domain.dto.constructionscheduleplan.PgsConstructionSchedulePlanCreateReq;
import org.dromara.progress.domain.dto.constructionscheduleplan.PgsConstructionSchedulePlanQueryReq;
import org.dromara.progress.domain.dto.constructionscheduleplan.PgsConstructionSchedulePlanUpdateReq;
import org.dromara.progress.domain.vo.constructionscheduleplan.PgsConstructionSchedulePlanVo;
import org.dromara.progress.service.IPgsConstructionSchedulePlanService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 施工进度计划
*
* @author lilemy
* @date 2025-08-01
*/
@Validated
@RestController
@RequestMapping("/progress/constructionSchedulePlan")
public class PgsConstructionSchedulePlanController extends BaseController {
@Resource
private IPgsConstructionSchedulePlanService pgsConstructionSchedulePlanService;
/**
* 查询施工进度计划列表
*/
@SaCheckPermission("progress:constructionSchedulePlan:list")
@GetMapping("/list")
public R<List<PgsConstructionSchedulePlanVo>> list(PgsConstructionSchedulePlanQueryReq req) {
List<PgsConstructionSchedulePlanVo> list = pgsConstructionSchedulePlanService.queryList(req);
return R.ok(list);
}
/**
* 导出施工进度计划列表
*/
@SaCheckPermission("progress:constructionSchedulePlan:export")
@Log(title = "施工进度计划", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(PgsConstructionSchedulePlanQueryReq req, HttpServletResponse response) {
List<PgsConstructionSchedulePlanVo> list = pgsConstructionSchedulePlanService.queryList(req);
ExcelUtil.exportExcel(list, "施工进度计划", PgsConstructionSchedulePlanVo.class, response);
}
/**
* 获取施工进度计划详细信息
*
* @param id 主键
*/
@SaCheckPermission("progress:constructionSchedulePlan:query")
@GetMapping("/{id}")
public R<PgsConstructionSchedulePlanVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(pgsConstructionSchedulePlanService.queryById(id));
}
/**
* 新增施工进度计划
*/
@SaCheckPermission("progress:constructionSchedulePlan:add")
@Log(title = "施工进度计划", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<PgsConstructionSchedulePlanVo> add(@Validated(AddGroup.class) @RequestBody PgsConstructionSchedulePlanCreateReq req) {
return R.ok(pgsConstructionSchedulePlanService.insertByBo(req));
}
/**
* 修改施工进度计划
*/
@SaCheckPermission("progress:constructionSchedulePlan:edit")
@Log(title = "施工进度计划", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody PgsConstructionSchedulePlanUpdateReq req) {
return toAjax(pgsConstructionSchedulePlanService.updateByBo(req));
}
/**
* 删除施工进度计划
*
* @param ids 主键串
*/
@SaCheckPermission("progress:constructionSchedulePlan:remove")
@Log(title = "施工进度计划", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(pgsConstructionSchedulePlanService.deleteByIds(List.of(ids)));
}
}

View File

@ -6,7 +6,6 @@ import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import org.dromara.common.core.domain.R;
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;
@ -111,7 +110,7 @@ public class PgsProgressCategoryController extends BaseController {
/**
* 新增分项工程单价
*/
@SaCheckPermission("progress:progressCategory:add")
@SaCheckPermission("progress:progressCategory:price")
@Log(title = "进度类别", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/price")
@ -126,7 +125,7 @@ public class PgsProgressCategoryController extends BaseController {
@Log(title = "进度类别", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody PgsProgressCategoryUpdateReq req) {
public R<Void> edit(@Validated @RequestBody PgsProgressCategoryUpdateReq req) {
return toAjax(pgsProgressCategoryService.updateByBo(req));
}

View File

@ -0,0 +1,82 @@
package org.dromara.progress.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.util.Date;
/**
* 施工进度计划对象 pgs_construction_schedule_plan
*
* @author lilemy
* @date 2025-08-01
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("pgs_construction_schedule_plan")
public class PgsConstructionSchedulePlan extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 父ID
*/
private Long parentId;
/**
* 节点名称
*/
private String nodeName;
/**
* 对应项目结构
*/
private Long projectStructure;
/**
* 预计开始时间
*/
private Date planStartDate;
/**
* 预计结束时间
*/
private Date planEndDate;
/**
* 实际开始时间
*/
private Date practicalStartDate;
/**
* 实际结束时间
*/
private Date practicalEndDate;
/**
* 状态
*/
private String status;
/**
* 备注
*/
private String remark;
}

View File

@ -32,7 +32,7 @@ public class PgsProgressCategory extends BaseEntity {
/**
* 父类别id
*/
private Long pid;
private Long parentId;
/**
* 项目id
@ -75,17 +75,17 @@ public class PgsProgressCategory extends BaseEntity {
private BigDecimal outputValue;
/**
* 总数量/百分比
* 总数量
*/
private BigDecimal total;
/**
* 已完成数量/百分比
* 已完成数量
*/
private BigDecimal completed;
/**
* 计划总数量/百分比
* 计划总数量
*/
private BigDecimal planTotal;

View File

@ -30,7 +30,7 @@ public class PgsProgressCategoryTemplate implements Serializable {
/**
* 父类别id
*/
private Long pid;
private Long parentId;
/**
* 类别名称

View File

@ -0,0 +1,77 @@
package org.dromara.progress.domain.dto.constructionscheduleplan;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @author lilemy
* @date 2025-08-01 14:05
*/
@Data
public class PgsConstructionSchedulePlanCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = 4060838737379600701L;
/**
* 项目ID
*/
@NotNull(message = "项目ID不能为空")
private Long projectId;
/**
* 父ID
*/
private Long parentId;
/**
* 节点名称
*/
@NotBlank(message = "节点名称不能为空")
private String nodeName;
/**
* 对应项目结构
*/
private Long projectStructure;
/**
* 预计开始时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Date planStartDate;
/**
* 预计结束时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Date planEndDate;
/**
* 实际开始时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Date practicalStartDate;
/**
* 实际结束时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Date practicalEndDate;
/**
* 状态
*/
private String status;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,32 @@
package org.dromara.progress.domain.dto.constructionscheduleplan;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-08-01 14:05
*/
@Data
public class PgsConstructionSchedulePlanQueryReq implements Serializable {
@Serial
private static final long serialVersionUID = 9021370369055688811L;
/**
* 项目ID
*/
private Long projectId;
/**
* 节点名称
*/
private String nodeName;
/**
* 状态
*/
private String status;
}

View File

@ -0,0 +1,58 @@
package org.dromara.progress.domain.dto.constructionscheduleplan;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @author lilemy
* @date 2025-08-01 14:06
*/
@Data
public class PgsConstructionSchedulePlanUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = 6955873817030428268L;
/**
* 主键ID
*/
private Long id;
/**
* 节点名称
*/
private String nodeName;
/**
* 对应项目结构
*/
private Long projectStructure;
/**
* 实际开始时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Date practicalStartDate;
/**
* 实际结束时间
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private Date practicalEndDate;
/**
* 状态
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private String status;
/**
* 备注
*/
private String remark;
}

View File

@ -27,13 +27,8 @@ public class PgsProgressCategoryCreatePriceReq {
private BigDecimal unitPrice;
/**
* 产值金额
* 总数量
*/
private BigDecimal outputValue;
/**
* 备注
*/
private String remark;
private BigDecimal total;
}

View File

@ -19,7 +19,7 @@ public class PgsProgressCategoryUpdateReq {
/**
* 父类别id
*/
private Long pid;
private Long parentId;
/**
* 项目id

View File

@ -18,7 +18,7 @@ public class PgsProgressCategoryTemplateCreateReq implements Serializable {
/**
* 父类别id
*/
private Long pid;
private Long parentId;
/**
* 类别名称

View File

@ -17,7 +17,7 @@ public class PgsProgressCategoryTemplateQueryReq implements Serializable {
/**
* 父类别id
*/
private Long pid;
private Long parentId;
/**
* 类别名称

View File

@ -23,7 +23,7 @@ public class PgsProgressCategoryTemplateUpdateReq implements Serializable {
/**
* 父类别id
*/
private Long pid;
private Long parentId;
/**
* 类别名称

View File

@ -0,0 +1,103 @@
package org.dromara.progress.domain.vo.constructionscheduleplan;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
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.progress.domain.PgsConstructionSchedulePlan;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 施工进度计划视图对象 pgs_construction_schedule_plan
*
* @author lilemy
* @date 2025-08-01
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = PgsConstructionSchedulePlan.class)
public class PgsConstructionSchedulePlanVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 项目ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
* 父ID
*/
@ExcelProperty(value = "父ID")
private Long parentId;
/**
* 节点名称
*/
@ExcelProperty(value = "节点名称")
private String nodeName;
/**
* 对应项目结构
*/
@ExcelProperty(value = "对应项目结构")
private Long projectStructure;
/**
* 预计开始时间
*/
@ExcelProperty(value = "预计开始时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date planStartDate;
/**
* 预计结束时间
*/
@ExcelProperty(value = "预计结束时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date planEndDate;
/**
* 实际开始时间
*/
@ExcelProperty(value = "实际开始时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date practicalStartDate;
/**
* 实际结束时间
*/
@ExcelProperty(value = "实际结束时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date practicalEndDate;
/**
* 状态
*/
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "project_construction_status")
private String status;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@ -39,7 +39,7 @@ public class PgsProgressCategoryVo implements Serializable {
* 父类别id
*/
@ExcelProperty(value = "父类别id")
private Long pid;
private Long parentId;
/**
* 项目id

View File

@ -36,7 +36,7 @@ public class PgsProgressCategoryTemplateVo implements Serializable {
* 父类别id
*/
@ExcelProperty(value = "父类别id")
private Long pid;
private Long parentId;
/**
* 类别名称

View File

@ -0,0 +1,15 @@
package org.dromara.progress.mapper;
import org.dromara.progress.domain.PgsConstructionSchedulePlan;
import org.dromara.progress.domain.vo.constructionscheduleplan.PgsConstructionSchedulePlanVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 施工进度计划Mapper接口
*
* @author lilemy
* @date 2025-08-01
*/
public interface PgsConstructionSchedulePlanMapper extends BaseMapperPlus<PgsConstructionSchedulePlan, PgsConstructionSchedulePlanVo> {
}

View File

@ -0,0 +1,85 @@
package org.dromara.progress.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.progress.domain.PgsConstructionSchedulePlan;
import org.dromara.progress.domain.dto.constructionscheduleplan.PgsConstructionSchedulePlanCreateReq;
import org.dromara.progress.domain.dto.constructionscheduleplan.PgsConstructionSchedulePlanQueryReq;
import org.dromara.progress.domain.dto.constructionscheduleplan.PgsConstructionSchedulePlanUpdateReq;
import org.dromara.progress.domain.vo.constructionscheduleplan.PgsConstructionSchedulePlanVo;
import java.util.Collection;
import java.util.List;
/**
* 施工进度计划Service接口
*
* @author lilemy
* @date 2025-08-01
*/
public interface IPgsConstructionSchedulePlanService extends IService<PgsConstructionSchedulePlan> {
/**
* 查询施工进度计划
*
* @param id 主键
* @return 施工进度计划
*/
PgsConstructionSchedulePlanVo queryById(Long id);
/**
* 查询符合条件的施工进度计划列表
*
* @param req 查询条件
* @return 施工进度计划列表
*/
List<PgsConstructionSchedulePlanVo> queryList(PgsConstructionSchedulePlanQueryReq req);
/**
* 新增施工进度计划
*
* @param req 施工进度计划
* @return 新增施工进度计划封装
*/
PgsConstructionSchedulePlanVo insertByBo(PgsConstructionSchedulePlanCreateReq req);
/**
* 修改施工进度计划
*
* @param req 施工进度计划
* @return 是否修改成功
*/
Boolean updateByBo(PgsConstructionSchedulePlanUpdateReq req);
/**
* 批量删除施工进度计划信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
Boolean deleteByIds(Collection<Long> ids);
/**
* 获取施工进度计划视图对象
*
* @param constructionSchedulePlan 施工进度计划对象
* @return 施工进度计划视图对象
*/
PgsConstructionSchedulePlanVo getVo(PgsConstructionSchedulePlan constructionSchedulePlan);
/**
* 获取施工进度计划查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<PgsConstructionSchedulePlan> buildQueryWrapper(PgsConstructionSchedulePlanQueryReq req);
/**
* 获取施工进度计划分页对象视图
*
* @param constructionSchedulePlanList 施工进度计划分页对象
* @return 施工进度计划分页对象视图
*/
List<PgsConstructionSchedulePlanVo> getVoList(List<PgsConstructionSchedulePlan> constructionSchedulePlanList);
}

View File

@ -0,0 +1,149 @@
package org.dromara.progress.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.progress.domain.PgsConstructionSchedulePlan;
import org.dromara.progress.domain.dto.constructionscheduleplan.PgsConstructionSchedulePlanCreateReq;
import org.dromara.progress.domain.dto.constructionscheduleplan.PgsConstructionSchedulePlanQueryReq;
import org.dromara.progress.domain.dto.constructionscheduleplan.PgsConstructionSchedulePlanUpdateReq;
import org.dromara.progress.domain.vo.constructionscheduleplan.PgsConstructionSchedulePlanVo;
import org.dromara.progress.mapper.PgsConstructionSchedulePlanMapper;
import org.dromara.progress.service.IPgsConstructionSchedulePlanService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
/**
* 施工进度计划Service业务层处理
*
* @author lilemy
* @date 2025-08-01
*/
@Service
public class PgsConstructionSchedulePlanServiceImpl extends ServiceImpl<PgsConstructionSchedulePlanMapper, PgsConstructionSchedulePlan> implements IPgsConstructionSchedulePlanService {
/**
* 查询施工进度计划
*
* @param id 主键
* @return 施工进度计划
*/
@Override
public PgsConstructionSchedulePlanVo queryById(Long id) {
PgsConstructionSchedulePlan constructionSchedulePlan = this.getById(id);
if (constructionSchedulePlan == null) {
throw new ServiceException("施工进度计划信息不存在", HttpStatus.NOT_FOUND);
}
return this.getVo(constructionSchedulePlan);
}
/**
* 查询符合条件的施工进度计划列表
*
* @param req 查询条件
* @return 施工进度计划列表
*/
@Override
public List<PgsConstructionSchedulePlanVo> queryList(PgsConstructionSchedulePlanQueryReq req) {
List<PgsConstructionSchedulePlan> result = this.list(this.buildQueryWrapper(req));
return this.getVoList(result);
}
/**
* 新增施工进度计划
*
* @param req 施工进度计划
* @return 新增施工进度计划封装
*/
@Override
public PgsConstructionSchedulePlanVo insertByBo(PgsConstructionSchedulePlanCreateReq req) {
PgsConstructionSchedulePlan constructionSchedulePlan = new PgsConstructionSchedulePlan();
BeanUtils.copyProperties(req, constructionSchedulePlan);
boolean save = this.save(constructionSchedulePlan);
if (!save) {
throw new ServiceException("新增施工进度计划信息异常", HttpStatus.ERROR);
}
PgsConstructionSchedulePlan newConstructionSchedulePlan = this.getById(constructionSchedulePlan.getId());
return this.getVo(newConstructionSchedulePlan);
}
/**
* 修改施工进度计划
*
* @param req 施工进度计划
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(PgsConstructionSchedulePlanUpdateReq req) {
PgsConstructionSchedulePlan constructionSchedulePlan = new PgsConstructionSchedulePlan();
BeanUtils.copyProperties(req, constructionSchedulePlan);
return this.updateById(constructionSchedulePlan);
}
/**
* 批量删除施工进度计划信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteByIds(Collection<Long> ids) {
return this.removeBatchByIds(ids);
}
/**
* 获取施工进度计划视图对象
*
* @param constructionSchedulePlan 施工进度计划对象
* @return 施工进度计划视图对象
*/
@Override
public PgsConstructionSchedulePlanVo getVo(PgsConstructionSchedulePlan constructionSchedulePlan) {
PgsConstructionSchedulePlanVo vo = new PgsConstructionSchedulePlanVo();
if (constructionSchedulePlan == null) {
return vo;
}
BeanUtils.copyProperties(constructionSchedulePlan, vo);
return vo;
}
/**
* 获取施工进度计划查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
@Override
public LambdaQueryWrapper<PgsConstructionSchedulePlan> buildQueryWrapper(PgsConstructionSchedulePlanQueryReq req) {
LambdaQueryWrapper<PgsConstructionSchedulePlan> lqw = new LambdaQueryWrapper<>();
if (req == null) {
return lqw;
}
Long projectId = req.getProjectId();
String nodeName = req.getNodeName();
String status = req.getStatus();
lqw.eq(ObjectUtils.isNotEmpty(projectId), PgsConstructionSchedulePlan::getProjectId, projectId);
lqw.like(StringUtils.isNotBlank(nodeName), PgsConstructionSchedulePlan::getNodeName, nodeName);
lqw.eq(StringUtils.isNotBlank(status), PgsConstructionSchedulePlan::getStatus, status);
return lqw;
}
/**
* 获取施工进度计划分页对象视图
*
* @param constructionSchedulePlanList 施工进度计划分页对象
* @return 施工进度计划分页对象视图
*/
@Override
public List<PgsConstructionSchedulePlanVo> getVoList(List<PgsConstructionSchedulePlan> constructionSchedulePlanList) {
return constructionSchedulePlanList.stream().map(this::getVo).toList();
}
}

View File

@ -168,11 +168,19 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
if (progressCategory == null) {
throw new ServiceException("该分项工程不存在", HttpStatus.BAD_REQUEST);
}
// 计算产值
BigDecimal unitPrice = req.getUnitPrice();
BigDecimal outputValue = BigDecimal.ZERO;
if (progressCategory.getUnitType().equals(PgsProgressUnitTypeEnum.PERCENTAGE.getValue())) {
progressCategory.setTotal(req.getTotal());
outputValue = req.getTotal().multiply(unitPrice);
} else if (progressCategory.getUnitType().equals(PgsProgressUnitTypeEnum.NUMBER.getValue())) {
outputValue = progressCategory.getTotal().multiply(unitPrice);
}
// 填入数据
progressCategory.setUnit(req.getUnit());
progressCategory.setUnitPrice(req.getUnitPrice());
progressCategory.setOutputValue(req.getOutputValue());
progressCategory.setRemark(req.getRemark());
progressCategory.setUnitPrice(unitPrice);
progressCategory.setOutputValue(outputValue);
// 写入数据库
return this.updateById(progressCategory);
}
@ -208,14 +216,14 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
private void validEntityBeforeSave(PgsProgressCategory entity) {
// TODO 做一些数据校验,如唯一约束
Long projectId = entity.getProjectId();
Long pid = entity.getPid();
Long parentId = entity.getParentId();
if (projectId != null && projectId != 0) {
if (this.getById(projectId) == null) {
if (projectService.getById(projectId) == null) {
throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND);
}
}
if (pid != null && pid != 0) {
if (this.getById(pid) == null) {
if (parentId != null && parentId != 0) {
if (this.getById(parentId) == null) {
throw new ServiceException("对应进度类别不存在", HttpStatus.NOT_FOUND);
}
}
@ -225,8 +233,8 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
if (projectId != null && projectId != 0) {
lqw.eq(PgsProgressCategory::getProjectId, entity.getProjectId());
}
if (pid != null && pid != 0) {
lqw.eq(PgsProgressCategory::getPid, entity.getPid());
if (parentId != null && parentId != 0) {
lqw.eq(PgsProgressCategory::getParentId, entity.getParentId());
}
if (entity.getId() != null) {
// 排除自身
@ -300,14 +308,14 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
}
// 1. 构建 pid -> 子节点列表的映射
Map<Long, List<PgsProgressCategory>> parentIdToChildrenMap = progressCategoryList.stream()
.filter(item -> item.getPid() != 0)
.collect(Collectors.groupingBy(PgsProgressCategory::getPid));
.filter(item -> item.getParentId() != 0)
.collect(Collectors.groupingBy(PgsProgressCategory::getParentId));
// 对象列表 => 封装对象列表
return progressCategoryList.stream().map(progressCategory -> {
PgsProgressCategoryVo vo = new PgsProgressCategoryVo();
BeanUtils.copyProperties(progressCategory, vo);
// 如果是父节点,计算其子节点的总和
if (progressCategory.getPid() == 0) {
if (progressCategory.getParentId() == 0) {
List<PgsProgressCategory> children = parentIdToChildrenMap.getOrDefault(progressCategory.getId(), Collections.emptyList());
// 获取父节点状态
String pidStatus = getPidStatus(children);
@ -356,7 +364,7 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
oldMatrixIdList = oldMatrixList.stream().map(FacMatrix::getId).toList();
List<PgsProgressCategory> oldPercentageCategoryList = this.lambdaQuery()
.in(PgsProgressCategory::getMatrixId, oldMatrixIdList)
.ne(PgsProgressCategory::getPid, PgsProgressCategoryConstant.TOP_PARENT_ID)
.ne(PgsProgressCategory::getParentId, PgsProgressCategoryConstant.TOP_PARENT_ID)
.eq(PgsProgressCategory::getUnitType, PgsProgressUnitTypeEnum.PERCENTAGE.getValue())
.list();
oldPercentageCategoryMap = oldPercentageCategoryList.stream()
@ -404,10 +412,10 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
newCategory.setMatrixName(matrix.getMatrixName());
newCategory.setRemark(template.getRemark());
// 先临时设置旧 pid
newCategory.setPid(template.getPid());
newCategory.setParentId(template.getParentId());
localList.add(newCategory);
// 创建百分比设施
if (template.getPid() != 0 && template.getUnitType().equals(PgsProgressUnitTypeEnum.PERCENTAGE.getValue())) {
if (template.getParentId() != 0 && template.getUnitType().equals(PgsProgressUnitTypeEnum.PERCENTAGE.getValue())) {
String mapKey = matrix.getMatrixName() + "_" + template.getWorkType();
// 填充数据
if (CollUtil.isNotEmpty(oldPercentageCategoryMap) && oldPercentageCategoryMap.containsKey(mapKey)) {
@ -451,9 +459,9 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
}
// 修正本 matrix 的 pid
for (PgsProgressCategory category : localList) {
Long oldPid = category.getPid();
Long oldPid = category.getParentId();
if (oldPid != 0) {
category.setPid(localIdMap.getOrDefault(oldPid, 0L));
category.setParentId(localIdMap.getOrDefault(oldPid, 0L));
}
}
newList.addAll(localList);

View File

@ -128,7 +128,7 @@ public class PgsProgressCategoryTemplateServiceImpl extends ServiceImpl<PgsProgr
private void validEntityBeforeSave(PgsProgressCategoryTemplate entity) {
// TODO 做一些数据校验,如唯一约束
Long projectId = entity.getProjectId();
Long pid = entity.getPid();
Long pid = entity.getParentId();
if (projectId != null && projectId != 0) {
if (this.getById(projectId) == null) {
throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND);
@ -146,7 +146,7 @@ public class PgsProgressCategoryTemplateServiceImpl extends ServiceImpl<PgsProgr
lqw.eq(PgsProgressCategoryTemplate::getProjectId, entity.getProjectId());
}
if (pid != null && pid != 0) {
lqw.eq(PgsProgressCategoryTemplate::getPid, entity.getPid());
lqw.eq(PgsProgressCategoryTemplate::getParentId, entity.getParentId());
}
if (entity.getId() != null) {
// 排除自身
@ -169,7 +169,7 @@ public class PgsProgressCategoryTemplateServiceImpl extends ServiceImpl<PgsProgr
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
List<PgsProgressCategoryTemplate> categoryTemplateList = this.listByIds(ids);
if (isValid) {
categoryTemplateList.forEach(template->{
categoryTemplateList.forEach(template -> {
Long projectId = template.getProjectId();
if (projectId != null && projectId == 0) {
throw new ServiceException("通用模版,无法删除", HttpStatus.CONFLICT);
@ -208,7 +208,7 @@ public class PgsProgressCategoryTemplateServiceImpl extends ServiceImpl<PgsProgr
if (req == null) {
return lqw;
}
Long pid = req.getPid();
Long parentId = req.getParentId();
String name = req.getName();
String unitType = req.getUnitType();
Long projectId = req.getProjectId();
@ -217,7 +217,7 @@ public class PgsProgressCategoryTemplateServiceImpl extends ServiceImpl<PgsProgr
// 精确查询
lqw.in(ObjectUtils.isNotEmpty(projectId), PgsProgressCategoryTemplate::getProjectId, projectId, PgsProgressCategoryConstant.PUBLIC_PROJECT_ID);
lqw.eq(StringUtils.isNotBlank(unitType), PgsProgressCategoryTemplate::getUnitType, unitType);
lqw.eq(ObjectUtils.isNotEmpty(pid), PgsProgressCategoryTemplate::getPid, pid);
lqw.eq(ObjectUtils.isNotEmpty(parentId), PgsProgressCategoryTemplate::getParentId, parentId);
return lqw;
}

View File

@ -15,29 +15,28 @@ 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.contractor.domain.SubConstructionUser;
import org.dromara.contractor.service.ISubConstructionUserService;
import org.dromara.project.domain.BusProjectTeam;
import org.dromara.project.domain.BusProjectTeamMember;
import org.dromara.project.domain.enums.BusProjectTeamMemberPostEnum;
import org.dromara.project.domain.dto.projectteam.BusProjectTeamCreateReq;
import org.dromara.project.domain.dto.projectteam.BusProjectTeamQueryReq;
import org.dromara.project.domain.dto.projectteam.BusProjectTeamUpdateReq;
import org.dromara.project.domain.enums.BusProjectTeamMemberPostEnum;
import org.dromara.project.domain.vo.projectteam.BusForemanVo;
import org.dromara.project.domain.vo.projectteam.BusProjectTeamForemanVo;
import org.dromara.project.domain.vo.projectteam.BusProjectTeamVo;
import org.dromara.project.mapper.BusProjectTeamMapper;
import org.dromara.contractor.service.ISubConstructionUserService;
import org.dromara.project.service.IBusProjectService;
import org.dromara.project.service.IBusProjectTeamMemberService;
import org.dromara.project.service.IBusProjectTeamService;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysUserService;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -50,6 +49,9 @@ import java.util.stream.Collectors;
public class BusProjectTeamServiceImpl extends ServiceImpl<BusProjectTeamMapper, BusProjectTeam>
implements IBusProjectTeamService {
@Resource
private ISysUserService userService;
@Resource
private IBusProjectService projectService;
@ -226,8 +228,14 @@ public class BusProjectTeamServiceImpl extends ServiceImpl<BusProjectTeamMapper,
return List.of();
}
// 获取项目班组长信息
Map<Long, List<SubConstructionUser>> foremanMap = constructionUserService.listByIds(foremanIdList).stream()
List<SubConstructionUser> foremanList = constructionUserService.listByIds(foremanIdList);
Map<Long, List<SubConstructionUser>> foremanMap = foremanList.stream()
.collect(Collectors.groupingBy(SubConstructionUser::getTeamId));
// 获取系统用户信息
List<Long> sysUserIds = foremanList.stream().map(SubConstructionUser::getSysUserId).filter(Objects::nonNull).distinct().toList();
List<SysUserVo> sysUserList = userService.selectUserByIds(sysUserIds, null);
Map<Long, String> sysUserMap = sysUserList.stream()
.collect(Collectors.toMap(SysUserVo::getUserId, SysUserVo::getNickName));
// 封装数据
return projectTeamList.stream().map(projectTeam -> {
BusProjectTeamForemanVo projectTeamForemanResp = new BusProjectTeamForemanVo();
@ -237,7 +245,16 @@ public class BusProjectTeamServiceImpl extends ServiceImpl<BusProjectTeamMapper,
if (foremanMap.containsKey(projectTeam.getId())) {
List<SubConstructionUser> constructionUserList = foremanMap.get(projectTeam.getId());
List<BusForemanVo> foremanVoList = constructionUserList.stream()
.map(constructionUser -> new BusForemanVo(constructionUser.getId(), constructionUser.getUserName()))
.map(constructionUser -> {
BusForemanVo foremanVo = new BusForemanVo();
Long sysUserId = constructionUser.getSysUserId();
if (sysUserId != null) {
String userName = sysUserMap.get(sysUserId);
foremanVo.setForemanId(sysUserId);
foremanVo.setForemanName(userName);
}
return foremanVo;
})
.toList();
projectTeamForemanResp.setForemanList(foremanVoList);
}

View File

@ -6,8 +6,6 @@ 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;
@ -19,8 +17,8 @@ import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionCrea
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionGisReq;
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionQueryReq;
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionUpdateReq;
import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionVo;
import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionListGisVo;
import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionVo;
import org.dromara.quality.service.IQltQualityInspectionService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -99,7 +97,7 @@ public class QltQualityInspectionController extends BaseController {
@Log(title = "质量-检查工单", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Long> add(@Validated(AddGroup.class) @RequestBody QltQualityInspectionCreateReq req) {
public R<Long> add(@Validated @RequestBody QltQualityInspectionCreateReq req) {
return R.ok(qualityInspectionService.insertByBo(req));
}
@ -110,7 +108,7 @@ public class QltQualityInspectionController extends BaseController {
@Log(title = "质量-检查工单", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody QltQualityInspectionUpdateReq req) {
public R<Void> edit(@Validated @RequestBody QltQualityInspectionUpdateReq req) {
return toAjax(qualityInspectionService.updateByBo(req));
}

View File

@ -60,14 +60,19 @@ public class QltQualityInspection extends BaseEntity {
private String inspectionFile;
/**
* 班组id
* 整改单位(1分包 2班组)
*/
private Long teamId;
private String rectificationUnit;
/**
* 整改人(班组长)
* 整改单位id
*/
private Long corrector;
private Long rectificationId;
/**
* 整改人
*/
private Long correctorId;
/**
* 是否回复1回复 2不回复

View File

@ -1,5 +1,7 @@
package org.dromara.quality.domain.dto.qualityinspection;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
@ -19,8 +21,15 @@ public class QltQualityInspectionCreateReq implements Serializable {
/**
* 项目id
*/
@NotNull(message = "项目id不能为空")
private Long projectId;
/**
* 是否回复1回复 2不回复
*/
@NotBlank(message = "是否回复不能为空")
private String isReply;
/**
* 巡检类型
*/
@ -29,6 +38,7 @@ public class QltQualityInspectionCreateReq implements Serializable {
/**
* 巡检标题
*/
@NotBlank(message = "巡检标题不能为空")
private String inspectionHeadline;
/**
@ -42,14 +52,19 @@ public class QltQualityInspectionCreateReq implements Serializable {
private String inspectionFile;
/**
* 班组id
* 整改单位(1分包 2班组)
*/
private Long teamId;
private String rectificationUnit;
/**
* 整改人(班组长)
* 整改单位id
*/
private Long corrector;
private Long rectificationId;
/**
* 整改人
*/
private Long corrector_id;
/**
* 回复期限日期

View File

@ -31,8 +31,13 @@ public class QltQualityInspectionQueryReq implements Serializable {
private String inspectionStatus;
/**
* 班组id
* 整改单位(1分包 2班组)
*/
private Long teamId;
private String rectificationUnit;
/**
* 整改单位id
*/
private Long rectificationId;
}

View File

@ -76,14 +76,19 @@ public class QltQualityInspectionVo implements Serializable {
private List<SysOssVo> inspectionFileList;
/**
* 班组id
* 整改单位(1分包 2班组)
*/
private Long teamId;
private String rectificationUnit;
/**
* 整改人(班组长)
* 整改单位id
*/
private Long corrector;
private Long rectificationId;
/**
* 整改人
*/
private Long correctorId;
/**
* 整改人姓名
@ -145,7 +150,12 @@ public class QltQualityInspectionVo implements Serializable {
* 创建者
*/
@ExcelProperty(value = "创建者")
private String createBy;
private Long createBy;
/**
* 创建者名称
*/
private String createByName;
/**
* 创建时间

View File

@ -111,7 +111,6 @@ public interface IQltQualityInspectionService extends IService<QltQualityInspect
* 导出质量-检查工单
*
* @param id 质量-检查工单id
* @param response HttpServletResponse
*/
void exportWordById(Long id, HttpServletResponse response);

View File

@ -21,18 +21,16 @@ import org.dromara.common.oss.core.OssClient;
import org.dromara.common.oss.exception.OssException;
import org.dromara.common.oss.factory.OssFactory;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.contractor.domain.SubConstructionUser;
import org.dromara.project.domain.BusProject;
import org.dromara.contractor.service.ISubConstructionUserService;
import org.dromara.common.utils.DocumentUtil;
import org.dromara.project.service.IBusProjectService;
import org.dromara.quality.constant.QltQualityConstant;
import org.dromara.quality.domain.QltQualityInspection;
import org.dromara.quality.domain.enums.QltQualityInspectionStatusEnum;
import org.dromara.quality.domain.enums.QltQualityInspectionVerificationTypeEnum;
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionCreateReq;
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionGisReq;
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionQueryReq;
import org.dromara.quality.domain.dto.qualityinspection.QltQualityInspectionUpdateReq;
import org.dromara.quality.domain.enums.QltQualityInspectionStatusEnum;
import org.dromara.quality.domain.enums.QltQualityInspectionVerificationTypeEnum;
import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionGis;
import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionListGisVo;
import org.dromara.quality.domain.vo.qualityinspection.QltQualityInspectionVo;
@ -45,7 +43,6 @@ import org.dromara.system.service.ISysDictDataService;
import org.dromara.system.service.ISysDictTypeService;
import org.dromara.system.service.ISysOssService;
import org.dromara.system.service.ISysUserService;
import org.dromara.common.utils.DocumentUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
@ -59,6 +56,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipOutputStream;
/**
@ -81,9 +79,6 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
@Resource
private ISysOssService ossService;
@Resource
private ISubConstructionUserService constructionUserService;
@Resource
private ISysDictDataService dictDataService;
@ -193,7 +188,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
QltQualityInspection qualityInspection = new QltQualityInspection();
BeanUtils.copyProperties(req, qualityInspection);
// 数据校验
validEntityBeforeSave(qualityInspection, true);
validEntityBeforeSave(qualityInspection);
// 填充默认值
qualityInspection.setInspectionStatus(QltQualityInspectionStatusEnum.INFORM.getValue());
// 写入数据库
@ -217,7 +212,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
QltQualityInspection qualityInspection = new QltQualityInspection();
BeanUtils.copyProperties(req, qualityInspection);
// 数据校验
validEntityBeforeSave(qualityInspection, false);
validEntityBeforeSave(qualityInspection);
// 判断是否存在
QltQualityInspection oldQualityInspection = this.getById(qualityInspection.getId());
if (oldQualityInspection == null) {
@ -230,14 +225,9 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(QltQualityInspection entity, Boolean create) {
private void validEntityBeforeSave(QltQualityInspection entity) {
// TODO 做一些数据校验,如唯一约束
Long projectId = entity.getProjectId();
if (create) {
if (projectId == null) {
throw new ServiceException("项目id不能为空", HttpStatus.BAD_REQUEST);
}
}
if (projectId != null && projectService.getById(projectId) == null) {
throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND);
}
@ -286,13 +276,13 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
Long createBy = qualityInspection.getCreateBy();
if (createBy != null) {
SysUserVo sysUserVo = userService.selectUserById(createBy);
qualityInspectionVo.setCreateBy(sysUserVo.getNickName());
qualityInspectionVo.setCreateByName(sysUserVo.getNickName());
}
// 关联整改人信息
Long corrector = qualityInspection.getCorrector();
if (corrector != null) {
String userName = constructionUserService.getById(corrector).getUserName();
qualityInspectionVo.setCorrectorName(userName);
Long correctorId = qualityInspection.getCorrectorId();
if (correctorId != null) {
SysUserVo user = userService.selectUserById(correctorId);
qualityInspectionVo.setCorrectorName(user.getNickName());
}
// 关联附件信息
String inspectionFile = qualityInspection.getInspectionFile();
@ -325,12 +315,14 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
Long projectId = req.getProjectId();
String inspectionType = req.getInspectionType();
String inspectionStatus = req.getInspectionStatus();
Long teamId = req.getTeamId();
String rectificationUnit = req.getRectificationUnit();
Long rectificationId = req.getRectificationId();
// 精确查询
lqw.eq(StringUtils.isNotBlank(inspectionType), QltQualityInspection::getInspectionType, inspectionType);
lqw.eq(StringUtils.isNotBlank(inspectionStatus), QltQualityInspection::getInspectionStatus, inspectionStatus);
lqw.eq(StringUtils.isNotBlank(rectificationUnit), QltQualityInspection::getRectificationUnit, rectificationUnit);
lqw.eq(ObjectUtils.isNotEmpty(projectId), QltQualityInspection::getProjectId, projectId);
lqw.eq(ObjectUtils.isNotEmpty(inspectionType), QltQualityInspection::getInspectionType, inspectionType);
lqw.eq(ObjectUtils.isNotEmpty(inspectionStatus), QltQualityInspection::getInspectionStatus, inspectionStatus);
lqw.eq(ObjectUtils.isNotEmpty(teamId), QltQualityInspection::getTeamId, teamId);
lqw.eq(ObjectUtils.isNotEmpty(rectificationId), QltQualityInspection::getRectificationId, rectificationId);
return lqw;
}
@ -352,22 +344,12 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
if (CollUtil.isEmpty(qualityInspectionList)) {
return qualityInspectionVoPage;
}
// 获取项目名称
List<Long> projectIdList = qualityInspectionList.stream().map(QltQualityInspection::getProjectId).distinct().toList();
if (projectIdList.size() != 1) {
throw new ServiceException("仅能查询单个项目下的施工日志", HttpStatus.BAD_REQUEST);
}
BusProject project = projectService.getById(projectIdList.get(0));
if (project == null) {
throw new ServiceException("项目不存在", HttpStatus.NOT_FOUND);
}
// 获取整改人信息
List<Long> correctorList = qualityInspectionList.stream().map(QltQualityInspection::getCorrector).distinct().toList();
Map<Long, String> correctorMap = constructionUserService.listByIds(correctorList)
.stream().collect(Collectors.toMap(SubConstructionUser::getId, SubConstructionUser::getUserName));
// 获取创建用户信息
List<Long> createByList = qualityInspectionList.stream().map(QltQualityInspection::getCreateBy).distinct().toList();
List<SysUserVo> userVoList = userService.selectUserByIds(createByList, null);
// 获取整改人、创建用户信息
List<Long> userIdList = Stream.concat(
qualityInspectionList.stream().map(QltQualityInspection::getCorrectorId),
qualityInspectionList.stream().map(QltQualityInspection::getCreateBy)
).distinct().toList();
List<SysUserVo> userVoList = userService.selectUserByIds(userIdList, null);
Map<Long, String> userMap = userVoList.stream().collect(Collectors.toMap(SysUserVo::getUserId, SysUserVo::getNickName));
// 获取附件信息
List<Long> ossInspectionFileIdList = qualityInspectionList.stream().map(QltQualityInspection::getInspectionFile).filter(StringUtils::isNotBlank)
@ -382,12 +364,11 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
List<QltQualityInspectionVo> qualityInspectionVoList = qualityInspectionList.stream().map(qualityInspection -> {
QltQualityInspectionVo qualityInspectionVo = new QltQualityInspectionVo();
BeanUtils.copyProperties(qualityInspection, qualityInspectionVo);
qualityInspectionVo.setProjectName(project.getProjectName());
// 关联整改人信息
Long corrector = qualityInspection.getCorrector();
Long correctorId = qualityInspection.getCorrectorId();
String correctorName = null;
if (correctorMap.containsKey(corrector)) {
correctorName = correctorMap.get(corrector);
if (userMap.containsKey(correctorId)) {
correctorName = userMap.get(correctorId);
}
qualityInspectionVo.setCorrectorName(correctorName);
// 关联创建用户信息
@ -396,7 +377,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
if (userMap.containsKey(createBy)) {
createByName = userMap.get(createBy);
}
qualityInspectionVo.setCreateBy(createByName);
qualityInspectionVo.setCreateByName(createByName);
// 关联附件信息
String inspectionFile = qualityInspection.getInspectionFile();
List<SysOssVo> inspectionFileList = new ArrayList<>();
@ -404,7 +385,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
List<Long> inspectionFileIdList = Arrays.stream(inspectionFile.split(",")).map(Long::parseLong).toList();
for (Long id : inspectionFileIdList) {
if (ossMap.containsKey(id)) {
inspectionFileList.add(ossMap.get(id).get(0));
inspectionFileList.add(ossMap.get(id).getFirst());
}
}
}
@ -415,7 +396,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
List<Long> rectificationFileIdList = Arrays.stream(rectificationFile.split(",")).map(Long::parseLong).toList();
for (Long id : rectificationFileIdList) {
if (ossMap.containsKey(id)) {
rectificationFileList.add(ossMap.get(id).get(0));
rectificationFileList.add(ossMap.get(id).getFirst());
}
}
}
@ -429,8 +410,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
/**
* 导出质量-检查工单
*
* @param id 质量-检查工单id
* @param response HttpServletResponse
* @param id 质量-检查工单id
*/
@Override
public void exportWordById(Long id, HttpServletResponse response) {
@ -512,7 +492,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
String projectName = projectService.getById(qualityInspection.getProjectId()).getProjectName();
replacementMap.put("${projectName}", projectName);
replacementMap.put("${inspectionHeadline}", qualityInspection.getInspectionHeadline());
String correctorName = constructionUserService.getById(qualityInspection.getCorrector()).getUserName();
String correctorName = userService.selectUserById(qualityInspection.getCorrectorId()).getNickName();
replacementMap.put("${correctorName}", correctorName);
Date rectificationTime = qualityInspection.getRectificationTime();
replacementMap.put("${rectificationTime}", rectificationTime != null ? DateUtils.formatDateTime(rectificationTime) : "");

View File

@ -6,8 +6,6 @@ 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;
@ -19,8 +17,8 @@ import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionCreateR
import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionGisReq;
import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionQueryReq;
import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionUpdateReq;
import org.dromara.safety.domain.vo.safetyinspection.HseSafetyInspectionVo;
import org.dromara.safety.domain.vo.safetyinspection.HseSafetyInspectionListGisVo;
import org.dromara.safety.domain.vo.safetyinspection.HseSafetyInspectionVo;
import org.dromara.safety.service.IHseSafetyInspectionService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -99,7 +97,7 @@ public class HseSafetyInspectionController extends BaseController {
@Log(title = "安全巡检工单", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Long> add(@Validated(AddGroup.class) @RequestBody HseSafetyInspectionCreateReq req) {
public R<Long> add(@Validated @RequestBody HseSafetyInspectionCreateReq req) {
return R.ok(safetyInspectionService.insertByBo(req));
}
@ -110,7 +108,7 @@ public class HseSafetyInspectionController extends BaseController {
@Log(title = "安全巡检工单", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody HseSafetyInspectionUpdateReq req) {
public R<Void> edit(@Validated @RequestBody HseSafetyInspectionUpdateReq req) {
return toAjax(safetyInspectionService.updateByBo(req));
}
@ -124,6 +122,6 @@ public class HseSafetyInspectionController extends BaseController {
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(safetyInspectionService.deleteWithValidByIds(List.of(ids), true));
return toAjax(safetyInspectionService.deleteByIds(List.of(ids)));
}
}

View File

@ -29,11 +29,6 @@ public class HseSafetyInspection extends BaseEntity {
@TableId(value = "id")
private Long id;
/**
* 父id默认为0
*/
private Long pid;
/**
* 项目ID
*/
@ -55,12 +50,22 @@ public class HseSafetyInspection extends BaseEntity {
private String inspectionResult;
/**
* 整改班组id
* 是否回复1回复 2不回复
*/
private Long teamId;
private String isReply;
/**
* 整改班组长id
* 整改单位(1分包 2班组)
*/
private String rectificationUnit;
/**
* 整改单位id
*/
private Long rectificationId;
/**
* 整改人
*/
private Long correctorId;
@ -69,11 +74,6 @@ public class HseSafetyInspection extends BaseEntity {
*/
private Date rectificationDeadline;
/**
* 是否回复1回复 2不回复
*/
private String isReply;
/**
* 回复日期
*/

View File

@ -55,9 +55,19 @@ public class HseViolationRecord extends BaseEntity {
private Date violationTime;
/**
* 违章处理人id
* 整改单位(1分包 2班组)
*/
private Long handlerId;
private String rectificationUnit;
/**
* 整改单位id
*/
private Long rectificationId;
/**
* 整改人id
*/
private Long correctorId;
/**
* 处理期限

View File

@ -1,6 +1,8 @@
package org.dromara.safety.domain.dto.safetyinspection;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
@ -17,14 +19,10 @@ public class HseSafetyInspectionCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = 5355703238184894846L;
/**
* 父id默认为0
*/
private Long pid;
/**
* 项目ID
*/
@NotNull(message = "项目id不能为空")
private Long projectId;
/**
@ -43,12 +41,17 @@ public class HseSafetyInspectionCreateReq implements Serializable {
private String inspectionResult;
/**
* 整改班组id
* 整改单位(1分包 2班组)
*/
private Long teamId;
private String rectificationUnit;
/**
* 整改人(班组长)id
* 整改单位id
*/
private Long rectificationId;
/**
* 整改人
*/
private Long correctorId;
@ -61,6 +64,7 @@ public class HseSafetyInspectionCreateReq implements Serializable {
/**
* 是否回复1回复 2不回复
*/
@NotBlank(message = "是否回复不能为空")
private String isReply;
/**
@ -78,21 +82,6 @@ public class HseSafetyInspectionCreateReq implements Serializable {
*/
private String hiddenDanger;
/**
* 整改措施
*/
private String measure;
/**
* 复查情况
*/
private String review;
/**
* 复查状态1通过 2未通过
*/
private String reviewType;
/**
* 检查时间
*/
@ -103,21 +92,11 @@ public class HseSafetyInspectionCreateReq implements Serializable {
*/
private Date rectificationTime;
/**
* 复查时间
*/
private Date reviewTime;
/**
* 检查附件
*/
private String checkFile;
/**
* 整改附件
*/
private String rectificationFile;
/**
* 备注
*/

View File

@ -15,11 +15,6 @@ public class HseSafetyInspectionQueryReq implements Serializable {
@Serial
private static final long serialVersionUID = 8880866939746311233L;
/**
* 父id默认为0
*/
private Long pid;
/**
* 项目ID
*/
@ -36,14 +31,14 @@ public class HseSafetyInspectionQueryReq implements Serializable {
private String violationType;
/**
* 整改班组id
* 整改单位(1分包 2班组)
*/
private Long teamId;
private String rectificationUnit;
/**
* 整改人(班组长)id
* 整改单位id
*/
private Long correctorId;
private Long rectificationId;
/**
* 工单状态1通知 2整改 3复查

View File

@ -2,6 +2,7 @@ package org.dromara.safety.domain.dto.violationrecord;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.Future;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
@ -27,10 +28,21 @@ public class HseViolationRecordCreateHandlerReq implements Serializable {
private Long id;
/**
* 违章处理人id
* 整改单位(1分包 2班组)
*/
@NotNull(message = "处理人不能为空")
private Long handlerId;
@NotBlank(message = "整改单位为空")
private String rectificationUnit;
/**
* 整改单位id
*/
@NotNull(message = "整改单位id不能为空")
private Long rectificationId;
/**
* 整改人id
*/
private Long correctorId;
/**
* 处理期限

View File

@ -38,4 +38,14 @@ public class HseViolationRecordQueryReq implements Serializable {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date violationTime;
/**
* 整改单位(1分包 2班组)
*/
private String rectificationUnit;
/**
* 整改单位id
*/
private Long rectificationId;
}

View File

@ -1,11 +1,7 @@
package org.dromara.safety.domain.vo.safetyinspection;
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.safety.domain.HseSafetyInspection;
import java.io.Serial;
@ -20,7 +16,6 @@ import java.util.Date;
* @date 2025-03-20
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = HseSafetyInspection.class)
public class HseSafetyInspectionVo implements Serializable {
@ -30,154 +25,126 @@ public class HseSafetyInspectionVo implements Serializable {
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 父id默认为0
*/
@ExcelProperty(value = "父id")
private Long pid;
/**
* 项目ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
* 检查类型
*/
@ExcelProperty(value = "检查类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "safety_inspection_check_type")
private String checkType;
/**
* 违章类型
*/
@ExcelProperty(value = "违章类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "safety_inspection_violation_type")
private String violationType;
/**
* 巡检结果
*/
@ExcelProperty(value = "巡检结果")
private String inspectionResult;
/**
* 整改班组id
* 整改单位(1分包 2班组)
*/
@ExcelProperty(value = "整改班组id")
private Long teamId;
private String rectificationUnit;
/**
* 整改班组名字
* 整改单位id
*/
private String teamName;
private Long rectificationId;
/**
* 整改班组长id
* 整改单位名称
*/
private String rectificationName;
/**
* 整改人
*/
@ExcelProperty(value = "整改人")
private Long correctorId;
/**
* 整改人(班组长)名字
* 整改人名字
*/
private String correctorName;
/**
* 整改期限
*/
@ExcelProperty(value = "整改期限")
private Date rectificationDeadline;
/**
* 是否回复1回复 2不回复
*/
@ExcelProperty(value = "是否回复", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "reply_type")
private String isReply;
/**
* 回复日期
*/
@ExcelProperty(value = "回复日期")
private String replyDate;
/**
* 工单状态1通知 2整改 3复查
*/
@ExcelProperty(value = "工单状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "safety_inspection_type")
private String status;
/**
* 问题隐患
*/
@ExcelProperty(value = "问题隐患")
private String hiddenDanger;
/**
* 整改措施
*/
@ExcelProperty(value = "整改措施")
private String measure;
/**
* 复查情况
*/
@ExcelProperty(value = "复查情况")
private String review;
/**
* 复查状态1通过 2未通过
*/
@ExcelProperty(value = "复查状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "review_type")
private String reviewType;
/**
* 检查时间
*/
@ExcelProperty(value = "检查时间")
private Date checkTime;
/**
* 整改时间
*/
@ExcelProperty(value = "整改时间")
private Date rectificationTime;
/**
* 复查时间
*/
@ExcelProperty(value = "复查时间")
private Date reviewTime;
/**
* 检查附件
*/
@ExcelProperty(value = "检查附件")
private String checkFile;
/**
* 整改附件
*/
@ExcelProperty(value = "整改附件")
private String rectificationFile;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
/**

View File

@ -67,14 +67,24 @@ public class HseViolationRecordVo implements Serializable {
private Date violationTime;
/**
* 违章处理人id
* 整改单位(1分包 2班组)
*/
private Long handlerId;
private String rectificationUnit;
/**
* 违章处理人名称
* 整改单位id
*/
private String handlerName;
private Long rectificationId;
/**
* 整改人id
*/
private Long correctorId;
/**
* 整改人名称
*/
private String correctorName;
/**
* 处理期限

View File

@ -11,8 +11,8 @@ import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionCreateR
import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionGisReq;
import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionQueryReq;
import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionUpdateReq;
import org.dromara.safety.domain.vo.safetyinspection.HseSafetyInspectionVo;
import org.dromara.safety.domain.vo.safetyinspection.HseSafetyInspectionListGisVo;
import org.dromara.safety.domain.vo.safetyinspection.HseSafetyInspectionVo;
import java.util.Collection;
import java.util.List;
@ -75,13 +75,12 @@ public interface IHseSafetyInspectionService extends IService<HseSafetyInspectio
Boolean updateByBo(HseSafetyInspectionUpdateReq req);
/**
* 校验并批量删除安全巡检工单信息
* 批量删除安全巡检工单信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
Boolean deleteByIds(Collection<Long> ids);
/**
* 获取安全巡检工单视图对象

View File

@ -16,25 +16,27 @@ import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.file.FileUtils;
import org.dromara.common.enums.InspectionRectificationUnitType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.oss.core.OssClient;
import org.dromara.common.oss.exception.OssException;
import org.dromara.common.oss.factory.OssFactory;
import org.dromara.contractor.domain.SubConstructionUser;
import org.dromara.common.utils.DocumentUtil;
import org.dromara.contractor.domain.SubContractor;
import org.dromara.contractor.service.ISubContractorService;
import org.dromara.project.domain.BusProjectTeam;
import org.dromara.contractor.service.ISubConstructionUserService;
import org.dromara.project.service.IBusProjectService;
import org.dromara.project.service.IBusProjectTeamService;
import org.dromara.safety.constant.HseSafetyConstant;
import org.dromara.safety.domain.HseSafetyInspection;
import org.dromara.safety.domain.HseTeamMeeting;
import org.dromara.safety.domain.enums.HseSafetyInspectionReviewTypeEnum;
import org.dromara.safety.domain.enums.HseSafetyInspectionStatusEnum;
import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionCreateReq;
import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionGisReq;
import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionQueryReq;
import org.dromara.safety.domain.dto.safetyinspection.HseSafetyInspectionUpdateReq;
import org.dromara.safety.domain.enums.HseSafetyInspectionReviewTypeEnum;
import org.dromara.safety.domain.enums.HseSafetyInspectionStatusEnum;
import org.dromara.safety.domain.vo.safetyinspection.HseSafetyInspectionListGisVo;
import org.dromara.safety.domain.vo.safetyinspection.HseSafetyInspectionVo;
import org.dromara.safety.domain.vo.teammeeting.HseTeamMeetingGis;
@ -46,7 +48,6 @@ import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysDictDataService;
import org.dromara.system.service.ISysOssService;
import org.dromara.system.service.ISysUserService;
import org.dromara.common.utils.DocumentUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
@ -60,6 +61,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipOutputStream;
/**
@ -74,10 +76,10 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl<HseSafetyInspect
implements IHseSafetyInspectionService {
@Resource
private ISubConstructionUserService constructionUserService;
private IBusProjectTeamService projectTeamService;
@Resource
private IBusProjectTeamService projectTeamService;
private ISubContractorService contractorService;
@Resource
private IBusProjectService projectService;
@ -150,7 +152,7 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl<HseSafetyInspect
List<HseTeamMeeting> teamMeetings = teamMeetingService.lambdaQuery()
.eq(HseTeamMeeting::getProjectId, projectId)
.list();
if (CollUtil.isEmpty(teamMeetings)){
if (CollUtil.isEmpty(teamMeetings)) {
return gisVo;
}
// 获取最新的班组列表
@ -167,7 +169,7 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl<HseSafetyInspect
BeanUtils.copyProperties(teamMeeting, gis);
gis.setName("站班会");
if (teamMap.containsKey(teamMeeting.getTeamId())) {
gis.setTeamName(teamMap.get(teamMeeting.getTeamId()).get(0).getTeamName());
gis.setTeamName(teamMap.get(teamMeeting.getTeamId()).getFirst().getTeamName());
}
return gis;
}).toList();
@ -260,28 +262,20 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl<HseSafetyInspect
if (projectId != null && projectService.getById(projectId) == null) {
throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND);
}
if (correctorId != null && constructionUserService.getById(correctorId) == null) {
if (correctorId != null && userService.selectUserById(correctorId) == null) {
throw new ServiceException("对应整改人不存在", HttpStatus.NOT_FOUND);
}
}
/**
* 校验并批量删除安全巡检工单信息
* 批量删除安全巡检工单信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
Long count = this.lambdaQuery().in(HseSafetyInspection::getPid, ids).count();
if (count > 0) {
throw new ServiceException("所选安全巡检工单包含子数据,不允许删除", HttpStatus.BAD_REQUEST);
}
}
public Boolean deleteByIds(Collection<Long> ids) {
return this.removeBatchByIds(ids);
}
@ -299,24 +293,22 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl<HseSafetyInspect
return safetyInspectionVo;
}
BeanUtils.copyProperties(safetyInspection, safetyInspectionVo);
// 关联班组信息
Long teamId = safetyInspection.getTeamId();
if (teamId != null) {
LambdaQueryWrapper<BusProjectTeam> teamLambdaQueryWrapper = Wrappers.lambdaQuery(BusProjectTeam.class)
.select(BusProjectTeam::getId, BusProjectTeam::getTeamName)
.eq(BusProjectTeam::getId, teamId);
BusProjectTeam projectTeam = projectTeamService.getOne(teamLambdaQueryWrapper);
safetyInspectionVo.setTeamId(projectTeam.getId());
safetyInspectionVo.setTeamName(projectTeam.getTeamName());
// 关联整改单位信息
Long rectificationId = safetyInspection.getRectificationId();
String rectificationUnit = safetyInspection.getRectificationUnit();
if (rectificationId != null && rectificationUnit != null) {
if (rectificationUnit.equals(InspectionRectificationUnitType.CONTRACTOR.getValue())) {
SubContractor contractor = contractorService.getById(rectificationId);
safetyInspectionVo.setRectificationName(contractor.getName());
} else if (rectificationUnit.equals(InspectionRectificationUnitType.TEAM.getValue())) {
BusProjectTeam team = projectTeamService.getById(rectificationId);
safetyInspectionVo.setRectificationName(team.getTeamName());
}
}
// 关联整改人信息
Long correctorId = safetyInspection.getCorrectorId();
if (correctorId != null) {
LambdaQueryWrapper<SubConstructionUser> constructionUserLambdaQueryWrapper = Wrappers.lambdaQuery(SubConstructionUser.class)
.select(SubConstructionUser::getId, SubConstructionUser::getUserName)
.eq(SubConstructionUser::getId, correctorId);
SubConstructionUser constructionUser = constructionUserService.getOne(constructionUserLambdaQueryWrapper);
safetyInspectionVo.setCorrectorId(constructionUser.getId());
SysUserVo constructionUser = userService.selectUserById(correctorId);
safetyInspectionVo.setCorrectorName(constructionUser.getUserName());
}
// 关联创建用户信息
@ -341,23 +333,21 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl<HseSafetyInspect
if (req == null) {
return lqw;
}
Long pid = req.getPid();
Long projectId = req.getProjectId();
String checkType = req.getCheckType();
String violationType = req.getViolationType();
Long teamId = req.getTeamId();
Long correctorId = req.getCorrectorId();
String rectificationUnit = req.getRectificationUnit();
Long rectificationId = req.getRectificationId();
String status = req.getStatus();
String reviewType = req.getReviewType();
// 精准查询
lqw.eq(ObjectUtils.isNotEmpty(pid), HseSafetyInspection::getPid, pid);
lqw.eq(ObjectUtils.isNotEmpty(projectId), HseSafetyInspection::getProjectId, projectId);
lqw.eq(ObjectUtils.isNotEmpty(checkType), HseSafetyInspection::getCheckType, checkType);
lqw.eq(ObjectUtils.isNotEmpty(violationType), HseSafetyInspection::getViolationType, violationType);
lqw.eq(ObjectUtils.isNotEmpty(teamId), HseSafetyInspection::getTeamId, teamId);
lqw.eq(ObjectUtils.isNotEmpty(correctorId), HseSafetyInspection::getCorrectorId, correctorId);
lqw.eq(ObjectUtils.isNotEmpty(status), HseSafetyInspection::getStatus, status);
lqw.eq(ObjectUtils.isNotEmpty(reviewType), HseSafetyInspection::getReviewType, reviewType);
lqw.eq(ObjectUtils.isNotEmpty(rectificationId), HseSafetyInspection::getRectificationId, rectificationId);
lqw.eq(StringUtils.isNotBlank(checkType), HseSafetyInspection::getCheckType, checkType);
lqw.eq(StringUtils.isNotBlank(violationType), HseSafetyInspection::getViolationType, violationType);
lqw.eq(StringUtils.isNotBlank(rectificationUnit), HseSafetyInspection::getRectificationUnit, rectificationUnit);
lqw.eq(StringUtils.isNotBlank(status), HseSafetyInspection::getStatus, status);
lqw.eq(StringUtils.isNotBlank(reviewType), HseSafetyInspection::getReviewType, reviewType);
return lqw;
}
@ -379,8 +369,33 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl<HseSafetyInspect
if (CollUtil.isEmpty(safetyInspectionList)) {
return safetyInspectionVoPage;
}
// 获取整改人、创建用户信息
List<Long> userIdList = Stream.concat(
safetyInspectionList.stream().map(HseSafetyInspection::getCorrectorId),
safetyInspectionList.stream().map(HseSafetyInspection::getCreateBy)
).distinct().toList();
List<SysUserVo> userVoList = userService.selectUserByIds(userIdList, null);
Map<Long, String> userMap = userVoList.stream().collect(Collectors.toMap(SysUserVo::getUserId, SysUserVo::getNickName));
// 对象列表 => 封装对象列表
List<HseSafetyInspectionVo> safetyInspectionVoList = safetyInspectionList.stream().map(this::getVo).toList();
List<HseSafetyInspectionVo> safetyInspectionVoList = safetyInspectionList.stream().map(inspection -> {
HseSafetyInspectionVo qualityInspectionVo = new HseSafetyInspectionVo();
BeanUtils.copyProperties(inspection, qualityInspectionVo);
// 关联整改人信息
Long correctorId = inspection.getCorrectorId();
String correctorName = null;
if (userMap.containsKey(correctorId)) {
correctorName = userMap.get(correctorId);
}
qualityInspectionVo.setCorrectorName(correctorName);
// 关联创建用户信息
Long createBy = inspection.getCreateBy();
String createByName = null;
if (userMap.containsKey(createBy)) {
createByName = userMap.get(createBy);
}
qualityInspectionVo.setCreatorName(createByName);
return qualityInspectionVo;
}).toList();
safetyInspectionVoPage.setRecords(safetyInspectionVoList);
return safetyInspectionVoPage;
}
@ -476,15 +491,29 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl<HseSafetyInspect
replacementMap.put("${violationType}", violationType);
Date checkTime = safetyInspection.getCheckTime();
replacementMap.put("${checkTime}", checkTime != null ? DateUtils.formatDateTime(checkTime) : "");
String correctorName = constructionUserService.getById(safetyInspection.getCorrectorId()).getUserName();
String correctorName = "";
if (safetyInspection.getCorrectorId() != null) {
correctorName = userService.selectUserById(safetyInspection.getCorrectorId()).getNickName();
}
replacementMap.put("${correctorName}", correctorName);
replacementMap.put("${replyDate}", safetyInspection.getReplyDate());
replacementMap.put("${hiddenDanger}", safetyInspection.getHiddenDanger());
replacementMap.put("${checkFile}", safetyInspection.getCheckFile());
String status = dictDataService.selectDictLabel(HseSafetyConstant.SAFETY_INSPECTION_TYPE, safetyInspection.getStatus());
replacementMap.put("${status}", status);
String teamName = projectTeamService.getById(safetyInspection.getTeamId()).getTeamName();
replacementMap.put("${teamName}", teamName);
String rectificationName = "";
String rectificationUnit = safetyInspection.getRectificationUnit();
Long rectificationId = safetyInspection.getRectificationId();
if (rectificationUnit != null && rectificationId != null) {
if (rectificationUnit.equals(InspectionRectificationUnitType.CONTRACTOR.getValue())) {
SubContractor contractor = contractorService.getById(rectificationId);
rectificationName = contractor.getName();
} else if (rectificationUnit.equals(InspectionRectificationUnitType.TEAM.getValue())) {
BusProjectTeam team = projectTeamService.getById(rectificationId);
rectificationName = team.getTeamName();
}
}
replacementMap.put("${teamName}", rectificationName);
Date rectificationTime = safetyInspection.getRectificationTime();
replacementMap.put("${rectificationTime}", rectificationTime != null ? DateUtils.formatDateTime(rectificationTime) : "");
replacementMap.put("${measure}", safetyInspection.getMeasure());

View File

@ -213,14 +213,14 @@ public class HseViolationRecordServiceImpl extends ServiceImpl<HseViolationRecor
if (oldViolationRecord == null) {
throw new ServiceException("违规记录信息不存在", HttpStatus.NOT_FOUND);
}
Long handlerId = req.getHandlerId();
SysUserVo user = userService.selectUserById(handlerId);
Long correctorId = req.getCorrectorId();
SysUserVo user = userService.selectUserById(correctorId);
if (user == null) {
throw new ServiceException("处理人信息不存在", HttpStatus.NOT_FOUND);
}
HseViolationRecord violationRecord = new HseViolationRecord();
violationRecord.setId(id);
violationRecord.setHandlerId(handlerId);
violationRecord.setCorrectorId(correctorId);
violationRecord.setDisposeDeadline(req.getDisposeDeadline());
violationRecord.setRemark(req.getRemark());
boolean result = this.updateById(violationRecord);
@ -268,10 +268,10 @@ public class HseViolationRecordServiceImpl extends ServiceImpl<HseViolationRecor
violationRecordVo.setRecognizeVo(recognizeRecordService.getVo(recognizeRecord));
}
// 关联违章人信息
Long handlerId = violationRecord.getHandlerId();
if (ObjectUtils.isNotEmpty(handlerId)) {
SysUserVo handler = userService.selectUserById(handlerId);
violationRecordVo.setHandlerName(handler.getNickName());
Long correctorId = violationRecord.getCorrectorId();
if (ObjectUtils.isNotEmpty(correctorId)) {
SysUserVo userVo = userService.selectUserById(correctorId);
violationRecordVo.setCorrectorName(userVo.getNickName());
}
return violationRecordVo;
}
@ -335,8 +335,8 @@ public class HseViolationRecordServiceImpl extends ServiceImpl<HseViolationRecor
Map<Long, HseRecognizeRecord> recognizeIdRecognizeMap = recognizeRecordService.listByIds(recognizeIds).stream()
.collect(Collectors.toMap(HseRecognizeRecord::getId, recognize -> recognize));
// 关联违章人信息
List<Long> handlerIds = violationRecordList.stream().map(HseViolationRecord::getHandlerId).distinct().toList();
Map<Long, SysUserVo> handlerIdUserMap = userService.selectUserByIds(handlerIds, null).stream()
List<Long> correctorIds = violationRecordList.stream().map(HseViolationRecord::getCorrectorId).distinct().toList();
Map<Long, SysUserVo> correctorMap = userService.selectUserByIds(correctorIds, null).stream()
.collect(Collectors.toMap(SysUserVo::getUserId, user -> user));
List<HseViolationRecordVo> violationRecordVoList = violationRecordList.stream().map(violationLevel -> {
HseViolationRecordVo vo = new HseViolationRecordVo();
@ -350,8 +350,8 @@ public class HseViolationRecordServiceImpl extends ServiceImpl<HseViolationRecor
vo.setRecognizeVo(recognizeRecordService.getVo(recognizeIdRecognizeMap.get(violationLevel.getRecognizeId())));
}
// 违章人信息
if (CollUtil.isNotEmpty(handlerIdUserMap) && handlerIdUserMap.containsKey(violationLevel.getHandlerId())) {
vo.setHandlerName(handlerIdUserMap.get(violationLevel.getHandlerId()).getNickName());
if (CollUtil.isNotEmpty(correctorMap) && correctorMap.containsKey(violationLevel.getCorrectorId())) {
vo.setCorrectorName(correctorMap.get(violationLevel.getCorrectorId()).getNickName());
}
return vo;
}).toList();

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

View File

@ -1854,3 +1854,63 @@ values(1950489109817548805, '卷册文件查阅人删除', 1950489109817548801,
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(1950489109817548806, '卷册文件查阅人导出', 1950489109817548801, '5', '#', '', 1, 0, 'F', '0', '0', 'design:volumeFileViewer: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(1951130197151113217, '施工进度计划', '1913133014288699393', '1', 'constructionSchedulePlan', 'progress/constructionSchedulePlan/index', 1, 0, 'C', '0', '0', 'progress:constructionSchedulePlan: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(1951130197151113218, '施工进度计划查询', 1951130197151113217, '1', '#', '', 1, 0, 'F', '0', '0', 'progress:constructionSchedulePlan: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(1951130197151113219, '施工进度计划新增', 1951130197151113217, '2', '#', '', 1, 0, 'F', '0', '0', 'progress:constructionSchedulePlan: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(1951130197151113220, '施工进度计划修改', 1951130197151113217, '3', '#', '', 1, 0, 'F', '0', '0', 'progress:constructionSchedulePlan: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(1951130197151113221, '施工进度计划删除', 1951130197151113217, '4', '#', '', 1, 0, 'F', '0', '0', 'progress:constructionSchedulePlan: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(1951130197151113222, '施工进度计划导出', 1951130197151113217, '5', '#', '', 1, 0, 'F', '0', '0', 'progress:constructionSchedulePlan: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(1951204439405707265, '分项工程单价', '1913133014288699393', '1', 'progressCategory', 'progress/progressCategory/index', 1, 0, 'C', '0', '0', 'progress:progressCategory: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(1951204439405707266, '分项工程单价查询', 1951204439405707265, '1', '#', '', 1, 0, 'F', '0', '0', 'progress:progressCategory: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(1951204439405707267, '分项工程单价新增', 1951204439405707265, '2', '#', '', 1, 0, 'F', '0', '0', 'progress:progressCategory: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(1951204439405707268, '分项工程单价修改', 1951204439405707265, '3', '#', '', 1, 0, 'F', '0', '0', 'progress:progressCategory: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(1951204439405707269, '分项工程单价删除', 1951204439405707265, '4', '#', '', 1, 0, 'F', '0', '0', 'progress:progressCategory: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(1951204439405707270, '分项工程单价导出', 1951204439405707265, '5', '#', '', 1, 0, 'F', '0', '0', 'progress:progressCategory: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(1951230902137835522, '物资-材料设备', '3', '1', 'cailiaoshebei', 'cailiaoshebei/cailiaoshebei/index', 1, 0, 'C', '0', '0', 'cailiaoshebei:cailiaoshebei: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(1951230902137835523, '物资-材料设备查询', 1951230902137835522, '1', '#', '', 1, 0, 'F', '0', '0', 'cailiaoshebei:cailiaoshebei: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(1951230902137835524, '物资-材料设备新增', 1951230902137835522, '2', '#', '', 1, 0, 'F', '0', '0', 'cailiaoshebei:cailiaoshebei: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(1951230902137835525, '物资-材料设备修改', 1951230902137835522, '3', '#', '', 1, 0, 'F', '0', '0', 'cailiaoshebei:cailiaoshebei: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(1951230902137835526, '物资-材料设备删除', 1951230902137835522, '4', '#', '', 1, 0, 'F', '0', '0', 'cailiaoshebei:cailiaoshebei: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(1951230902137835527, '物资-材料设备导出', 1951230902137835522, '5', '#', '', 1, 0, 'F', '0', '0', 'cailiaoshebei:cailiaoshebei:export', '#', 103, 1, sysdate(), null, null, '');

View File

@ -1695,3 +1695,26 @@ create table des_volume_file_Viewer
primary key (`id`) using btree,
unique index `uk_volume_user` (`volume_catalog_id`, `user_id`)
) comment '卷册查阅人' collate = utf8mb4_unicode_ci;
drop table if exists pgs_construction_schedule_plan;
create table pgs_construction_schedule_plan
(
`id` bigint not null auto_increment comment '主键ID',
`project_id` bigint not null comment '项目ID',
`p_id` bigint default 0 not null comment '父ID',
`node_name` varchar(255) not null comment '节点名称',
`project_structure` bigint null comment '对应项目结构',
`plan_start_date` date not null comment '预计开始时间',
`plan_end_date` date not null comment '预计结束时间',
`practical_start_date` date null comment '实际开始时间',
`practical_end_date` date null comment '实际结束时间',
`status` varchar(64) null comment '状态',
`remark` varchar(255) null comment '备注',
`create_by` bigint null comment '创建者',
`update_by` bigint null comment '更新者',
`create_dept` bigint 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 `idx_project_id` (`project_id` asc) using btree comment '项目ID'
) comment '施工进度计划' collate = utf8mb4_unicode_ci;