[fix] 优化外部合同管理

This commit is contained in:
wyw 2024-08-15 15:28:19 +08:00
parent 38b8336631
commit 4ee64cce49
14 changed files with 100 additions and 210 deletions

View File

@ -1,8 +1,10 @@
package cn.iocoder.yudao.module.cms.controller.admin.extContract;
import cn.iocoder.yudao.framework.common.util.file.FileUtils;
import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractPageReqVO;
import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractRespVO;
import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractSaveReqVO;
import cn.iocoder.yudao.module.cms.dal.dataobject.extcontract.ExtContractDetailDO;
import cn.iocoder.yudao.module.cms.service.extContract.ExtContractService;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
@ -68,8 +70,13 @@ public class ExtContractController {
@Parameter(name = "id", description = "外部合同编号", required = true)
@PreAuthorize("@ss.hasPermission('cms-ext:ext-contract:query')")
public CommonResult<ExtContractRespVO> getExtContract(@RequestParam("id") Long id) {
ExtContractRespVO extContract = extContractService.getExtContract(id);
return success(extContract);
ExtContractDetailDO extContractDetailDO = extContractService.getContractDetail(id);
ExtContractRespVO extContractRespVO = new ExtContractRespVO();
org.springframework.beans.BeanUtils.copyProperties(extContractDetailDO, extContractRespVO, "contractFileUrl", "reviewFileUrl");
extContractRespVO.setReviewFileUrl(FileUtils.covertJSONStringToFile(extContractDetailDO.getReviewFileUrl()));
extContractRespVO.setContractFileUrl(FileUtils.covertJSONStringToFile(extContractDetailDO.getContractFileUrl()));
return success(extContractRespVO);
}
@GetMapping("/page")

View File

@ -20,20 +20,10 @@ public class ExtContractPageReqVO extends PageParam {
@Schema(description = "项目id", example = "30598")
private Long projectId;
@Schema(description = "合同名称", example = "芋艿")
private String name;
@Schema(description = "合同类型", example = "1")
@DictFormat(DictTypeConstants.CONTRACT_TYPE)
private String type;
@Schema(description = "客户公司id", example = "25191")
private Long customerCompanyId;
@Schema(description = "合同进展")
private String progress;
@Schema(description = "状态", example = "2")
@DictFormat(DictTypeConstants.CONTRACT_STATUS)
private String status;

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.cms.controller.admin.extContract.vo;
import cn.iocoder.yudao.framework.common.pojo.FileDTO;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.module.cms.enums.DictTypeConstants;
@ -7,6 +8,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 外部合同 Response VO")
@ -35,7 +38,7 @@ public class ExtContractRespVO {
@Schema(description = "客户名称")
@ExcelProperty("客户名称")
private String customerCompanyName;
private String constructionSide;
@Schema(description = "主控部门", requiredMode = Schema.RequiredMode.REQUIRED, example = "生产一部")
@ExcelProperty("主控部门")
@ -116,9 +119,9 @@ public class ExtContractRespVO {
@ExcelProperty("备注")
private String remark;
@Schema(description = "合同附件url", example = "https://www.iocoder.cn")
@Schema(description = "合同附件url")
@ExcelProperty("合同附件url")
private String contractFileUrl;
private List<FileDTO> contractFileUrl;
@Schema(description = "建安费")
@ExcelProperty("建安费")
@ -154,9 +157,9 @@ public class ExtContractRespVO {
@ExcelProperty("审定金额")
private BigDecimal approvedAmount;
@Schema(description = "审核文件url", example = "https://www.iocoder.cn")
@Schema(description = "审核文件url")
@ExcelProperty("审核文件url")
private String reviewFileUrl;
private List<FileDTO> reviewFileUrl;
@Schema(description = "最后编辑人")
@ExcelProperty("最后编辑人")

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.cms.controller.admin.extContract.vo;
import cn.iocoder.yudao.framework.common.pojo.FileDTO;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.module.cms.enums.DictTypeConstants;
@ -9,6 +10,7 @@ import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 外部合同新增/修改 Request VO")
@Data
@ -29,29 +31,6 @@ public class ExtContractSaveReqVO {
@Schema(description = "项目编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SJ24001")
@ExcelProperty("项目编号")
private String code;
@Schema(description = "客户名称")
@ExcelProperty("客户名称")
private String customerCompanyName;
@Schema(description = "主控部门", requiredMode = Schema.RequiredMode.REQUIRED, example = "生产一部")
@ExcelProperty("主控部门")
private String trackingDep;
@Schema(description = "项目负责人", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("项目负责人")
private String projectManager;
@Schema(description = "外部合同商议提示时间")
@ExcelProperty("外部合同商议提示时间")
private LocalDateTime exReminderTime;
@Schema(description = "合同名称", example = "赵六")
@ExcelProperty("合同名称")
@ -116,9 +95,9 @@ public class ExtContractSaveReqVO {
@ExcelProperty("备注")
private String remark;
@Schema(description = "合同附件url", example = "https://www.iocoder.cn")
@Schema(description = "合同附件url")
@ExcelProperty("合同附件url")
private String contractFileUrl;
private List<FileDTO> contractFileUrl;
@Schema(description = "建安费")
@ExcelProperty("建安费")
@ -154,9 +133,9 @@ public class ExtContractSaveReqVO {
@ExcelProperty("审定金额")
private BigDecimal approvedAmount;
@Schema(description = "审核文件url", example = "https://www.iocoder.cn")
@Schema(description = "审核文件url")
@ExcelProperty("审核文件url")
private String reviewFileUrl;
private List<FileDTO> reviewFileUrl;
@Schema(description = "最后编辑人")
@ExcelProperty("最后编辑人")

View File

@ -1,9 +1,7 @@
package cn.iocoder.yudao.module.cms.dal.dataobject.extcontract;
import cn.iocoder.yudao.module.cms.dal.dataobject.contract.ContractDO;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
@ -12,13 +10,30 @@ import java.time.LocalDateTime;
* @date 2024/8/14
*/
@Data
public class ExtContractDetailDO extends ContractDO {
public class ExtContractDetailDO extends ExtContractDO {
/**
* 项目编号
*/
private String code;
/**
* 建设方
*/
private String constructionSide;
/**
* 主控部门
*/
private String trackingDep;
/**
* 项目负责人
*/
private String projectManager;
/**
* 外部合同商议提示
*/
private LocalDateTime exReminderTime;
}

View File

@ -19,9 +19,8 @@ public interface ExtContractMapper extends BaseMapperX<ExtContractDO> {
default PageResult<ExtContractDO> selectPage(ExtContractPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ExtContractDO>()
.likeIfPresent(ExtContractDO::getName, reqVO.getName())
.eqIfPresent(ExtContractDO::getProjectId, reqVO.getProjectId())
.eqIfPresent(ExtContractDO::getType, reqVO.getType())
.eqIfPresent(ExtContractDO::getProgress, reqVO.getProgress())
.eqIfPresent(ExtContractDO::getStatus, reqVO.getStatus())
.eqIfPresent(ExtContractDO::getContractId, reqVO.getContractId()));
}

View File

@ -4,6 +4,7 @@ package cn.iocoder.yudao.module.cms.service.extContract;
import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractPageReqVO;
import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractRespVO;
import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractSaveReqVO;
import cn.iocoder.yudao.module.cms.dal.dataobject.extcontract.ExtContractDetailDO;
import jakarta.validation.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -45,7 +46,7 @@ public interface ExtContractService {
* @param id 编号
* @return 外部合同
*/
ExtContractRespVO getExtContract(Long id);
ExtContractDetailDO getContractDetail(Long id);
/**
* 获得外部合同分页

View File

@ -1,16 +1,15 @@
package cn.iocoder.yudao.module.cms.service.extContract;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.hutool.core.bean.BeanUtil;
import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractPageReqVO;
import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractRespVO;
import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractSaveReqVO;
import cn.iocoder.yudao.module.cms.dal.dataobject.contract.ContractDO;
import cn.iocoder.yudao.module.cms.dal.dataobject.extcontract.ExtContractDO;
import cn.iocoder.yudao.module.cms.dal.dataobject.extcontract.ExtContractDetailDO;
import cn.iocoder.yudao.module.cms.dal.mysql.extContract.ExtContractMapper;
import cn.iocoder.yudao.module.cms.dal.mysql.extcontracthistory.ExtContractHistoryMapper;
import cn.iocoder.yudao.module.cms.enums.ChargingStandardEnum;
import cn.iocoder.yudao.module.cms.enums.ContractStatusEnum;
import cn.iocoder.yudao.module.cms.enums.ContractTypeEnum;
import cn.iocoder.yudao.module.pms.api.projectschedule.ProjectScheduleApi;
import cn.iocoder.yudao.module.pms.api.projectschedule.dto.ProjectScheduleDetailDTO;
import cn.iocoder.yudao.module.pms.api.projecttracking.ProjectTrackingApi;
import cn.iocoder.yudao.module.pms.api.projecttracking.dto.ProjectTrackingDetailDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
@ -24,7 +23,6 @@ import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.cms.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.USER_NOT_EXISTS;
/**
* 外部合同 Service 实现类
@ -41,6 +39,12 @@ public class ExtContractServiceImpl implements ExtContractService {
@Resource
private AdminUserApi adminUserApi;
@Resource
private ProjectTrackingApi projectTrackingApi;
@Resource
private ProjectScheduleApi projectScheduleApi;
@ -86,63 +90,39 @@ public class ExtContractServiceImpl implements ExtContractService {
}
@Override
public ExtContractRespVO getExtContract(Long id) {
//校验
if (id == null) {
throw exception(EXT_CONTRACT_NOT_EXISTS);
}
public ExtContractDetailDO getContractDetail(Long id) {
ExtContractDetailDO extContractDetailDO = new ExtContractDetailDO();
ExtContractDO extContractDO = extContractMapper.selectById(id);
//校验
if (extContractDO == null) {
throw exception(EXT_CONTRACT_NOT_EXISTS);
}
Long projectId = extContractDO.getProjectId();
projectTrackingApi.validateProjectExists(projectId);
ProjectScheduleDetailDTO projectScheduleDetail = projectScheduleApi.getProjectScheduleDetail(projectId);
ProjectTrackingDetailDTO projectTracking = projectTrackingApi.getProjectTracking(projectId);
BeanUtil.copyProperties(extContractDO, extContractDetailDO);
BeanUtil.copyProperties(projectTracking,extContractDetailDO);
BeanUtil.copyProperties(projectScheduleDetail,extContractDetailDO);
//Long customerCompanyId = extContractDO.getCustomerCompanyId();
ExtContractRespVO extContractRespVO = BeanUtils.toBean(extContractDO, ExtContractRespVO.class);
//用客户公司id查询
//CustomerCompanyDO customerCompanyDO = customerCompanyMapper.selectById(customerCompanyId);
//String name = customerCompanyDO.getName();
//extContractRespVO.setCustomerCompanyName(name);
//合同总金额
//合同商议提示 // TODO 待优化
extContractRespVO.setExReminderTime(null);
extContractRespVO.setType(ContractTypeEnum.getNoByCode(extContractRespVO.getType()));
extContractRespVO.setStatus(ContractStatusEnum.getNoByCode(extContractRespVO.getStatus()));
extContractRespVO.setCountType(ContractStatusEnum.getNoByCode(extContractRespVO.getCountType()));
extContractRespVO.setSource(ContractStatusEnum.getNoByCode(extContractRespVO.getSource()));
extContractRespVO.setChargingStandard(ChargingStandardEnum.getNoByCode(extContractRespVO.getChargingStandard()));
return extContractRespVO;
return extContractDetailDO;
}
@Override
public PageResult<ExtContractRespVO> getExtContractPage(ExtContractPageReqVO pageReqVO) {
if (pageReqVO == null) {
throw exception(PARAM_NOT_EXISTS);
}
PageResult<ExtContractDO> extContractPage = extContractMapper.selectPage(pageReqVO);
List<ExtContractDO> list = extContractPage.getList();
List<ExtContractDetailDO> extContractDetailDOList = new ArrayList<>();
PageResult<ExtContractDO> extContractDOPageResult = extContractMapper.selectPage(pageReqVO);
List<ExtContractDO> excontractDOList = extContractDOPageResult.getList();
List<ExtContractRespVO> extContractRespVOList = new ArrayList<>();
for (ExtContractDO extContractDO : excontractDOList) {
for (ExtContractDO extContractDO : list) {
Long id = extContractDO.getId();
ExtContractRespVO extContractRespVO = getExtContract(id);
extContractRespVOList.add(extContractRespVO);
ExtContractDetailDO extContractDetailDO = getContractDetail(id);
extContractDetailDOList.add(extContractDetailDO);
}
List<ExtContractRespVO> respVOS = BeanUtils.toBean(extContractDetailDOList, ExtContractRespVO.class);
PageResult<ExtContractRespVO> pageResult = new PageResult<>();
pageResult.setList(extContractRespVOList);
pageResult.setList(respVOS);
return pageResult;
}

View File

@ -3,15 +3,11 @@ package cn.iocoder.yudao.module.cms.service.outscontract;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractRespVO;
import cn.iocoder.yudao.module.cms.controller.admin.outscontract.vo.OutsContractPageReqVO;
import cn.iocoder.yudao.module.cms.controller.admin.outscontract.vo.OutsContractRespVO;
import cn.iocoder.yudao.module.cms.controller.admin.outscontract.vo.OutsContractSaveReqVO;
import cn.iocoder.yudao.module.cms.dal.dataobject.outscontract.OutsContractDO;
import cn.iocoder.yudao.module.cms.dal.dataobject.outscontracthistory.OutsContractHistoryDO;
import cn.iocoder.yudao.module.cms.dal.mysql.outscontract.OutsContractMapper;
import cn.iocoder.yudao.module.cms.dal.mysql.outscontracthistory.OutsContractHistoryMapper;
import cn.iocoder.yudao.module.cms.enums.*;
import cn.iocoder.yudao.module.cms.service.contract.ContractService;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@ -19,7 +15,6 @@ import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@ -58,106 +53,12 @@ public class OutsContractServiceImpl implements OutsContractService {
@Resource
private BpmProcessInstanceApi processInstanceApi;
@Resource
private OutsContractHistoryMapper outsContractHistoryMapper;
@Override
public Long createOutsContract(Long loginUserId,OutsContractSaveReqVO createReqVO) {
if (createReqVO == null) {
throw exception(PARAM_NOT_EXISTS);
}
if (loginUserId == null) {
throw exception(PARAM_NOT_EXISTS);
}
String userName = adminUserApi.getUser(loginUserId).getNickname();
if (userName == null) {
throw exception(USER_NOT_EXISTS);
}
OutsContractDO outsContractDO = BeanUtils.toBean(createReqVO, OutsContractDO.class);
//校验
Long projectId = outsContractDO.getProjectId();
//校验联表的字段是否和所联系的表内容相同
ContractRespVO contract = contractService.getContract(createReqVO.getContractId());
// 需要联表查询
// 1.合同名称
// 2.主控部门(跟踪部门)
// 3.项目经理
// 4.签订合同总额
//todo 待提取 枚举优化
String name = createReqVO.getName();
String trackingDep = createReqVO.getTrackingDep();
String projectManager = createReqVO.getProjectManager();
BigDecimal outsAmount = createReqVO.getOutsAmount();
if (!contract.getName().equals(name)){
throw exception(PARAM_ERROR);
}
if (!contract.getTrackingDep().equals(trackingDep)){
throw exception(PARAM_ERROR);
}
if (!contract.getProjectManager().equals(projectManager)){
throw exception(PARAM_ERROR);
}
if (contract.getAmount().compareTo(outsAmount) != 0){
throw exception(PARAM_ERROR);
}
OutsContractRespVO outsContractRespVO = BeanUtils.toBean(outsContractDO, OutsContractRespVO.class);
outsContractDO.setCreator(userName);
outsContractDO.setUpdater(userName);
//判断该合同是否已经存在,比较各个字段值是否完全一样
//得到所有的合同逐个比较
List<OutsContractDO> outsContractDOList = outsContractMapper.selectList("project_id", projectId);
List<OutsContractRespVO> outsContractRespList = BeanUtils.toBean(outsContractDOList, OutsContractRespVO.class);
for (OutsContractRespVO respVO : outsContractRespList) {
if (respVO.equals(outsContractRespVO)){
throw exception(CONTRACT_ALREADY_EXISTS);
}
}
outsContractMapper.insert(outsContractDO);
Long outsContractDOId = outsContractDO.getId();
OutsContractHistoryDO outsContractHistoryDO = BeanUtils.toBean(outsContractDO, OutsContractHistoryDO.class);
// 启动流程同时写入历史合同
if (createReqVO.getId() == null) {
String processInstanceId = processInstanceApi.createProcessInstance(loginUserId,
new BpmProcessInstanceCreateReqDTO()
.setProcessDefinitionKey(PROCESS_KEY).setBusinessKey(String.valueOf(outsContractDOId)));
// 写入工作流编号
outsContractHistoryDO.setProcessInstanceId(processInstanceId);
outsContractHistoryDO.setOutsContractId(outsContractDOId);
Long count = outsContractHistoryMapper.selectCount("project_id", projectId);
if (count < 1) {
outsContractHistoryDO.setVersion(VERSION);
} else {
outsContractHistoryDO.setVersion(String.valueOf(count+1));
}
outsContractHistoryDO.setProcessStatus("0");
outsContractHistoryMapper.insert(outsContractHistoryDO);
}
return outsContractDO.getId();
return null;
}
@Override
@ -166,10 +67,6 @@ public class OutsContractServiceImpl implements OutsContractService {
validateOutsContractExists(updateReqVO.getId());
Long contractId = updateReqVO.getContractId();
ContractRespVO contract = contractService.getContract(contractId);
if (contract == null) {
throw exception(CONTRACT_NOT_EXISTS);
}
OutsContractDO outsContractDO = outsContractMapper.selectById(updateReqVO.getId());
if (!Objects.equals(updateReqVO.getProjectId(), outsContractDO.getProjectId())) {
throw exception(PROJECT_NOT_EXISTS);
@ -207,12 +104,7 @@ public class OutsContractServiceImpl implements OutsContractService {
OutsContractDO outsContractDO = outsContractMapper.selectById(id);
OutsContractRespVO outsContractRespVO = BeanUtils.toBean(outsContractDO, OutsContractRespVO.class);
Long contractId = outsContractDO.getContractId();
ContractRespVO contract = contractService.getContract(contractId);
outsContractRespVO.setName(contract.getName());
outsContractRespVO.setTrackingDep(contract.getTrackingDep());
outsContractRespVO.setProjectManager(contract.getProjectManager());
outsContractRespVO.setOutsAmount(contract.getAmount());
outsContractRespVO.setMajor(OutsContractMajorEnum.getNoByCode(outsContractRespVO.getMajor()));
outsContractRespVO.setCountType(CountTypeEnum.getNoByCode(outsContractRespVO.getCountType()));

View File

@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.pms.api.projectschedule.dto;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @author wyw
* @description
@ -15,4 +17,9 @@ public class ProjectScheduleDetailDTO {
*/
private String projectManager;
/**
* 外部合同商议提示
*/
private LocalDateTime exReminderTime;
}

View File

@ -33,4 +33,10 @@ public class ProjectTrackingDetailDTO {
*/
private BigDecimal expectedContractAmount;
/**
* 建设方
*/
private String constructionSide;
}

View File

@ -75,7 +75,7 @@ public class ProjectScheduleDO extends BaseDO {
/**
* 外部合同商议时间
*/
private LocalDateTime contractNegotiationTime;
private LocalDateTime exReminderTime;
/**
* 已完成百分比
*/

View File

@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.pms.dal.dataobject.projectschedule;
import cn.iocoder.yudao.module.pms.dal.dataobject.project.ProjectDO;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @author wyw
@ -17,4 +19,8 @@ public class ProjectScheduleDetailDO extends ProjectDO {
*/
private String projectManager;
/**
* 外部合同商议时间
*/
private LocalDateTime exReminderTime;
}

View File

@ -36,4 +36,9 @@ public class ProjectTrackingDetailDO extends ProjectDO {
*/
private BigDecimal expectedContractAmount;
/**
* 建设方
*/
private String constructionSide;
}