[fix] 优化合同管理

This commit is contained in:
wyw 2024-08-14 13:49:26 +08:00
parent 39c410f56e
commit 668f7283d8
14 changed files with 95 additions and 310 deletions

View File

@ -8,8 +8,10 @@ import cn.iocoder.yudao.framework.jackson.core.databind.TimestampLocalDateTimeSe
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
@ -18,6 +20,7 @@ import org.springframework.context.annotation.Bean;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
@AutoConfiguration @AutoConfiguration
@ -38,8 +41,8 @@ public class YudaoJacksonAutoConfiguration {
.addSerializer(LocalTime.class, LocalTimeSerializer.INSTANCE) .addSerializer(LocalTime.class, LocalTimeSerializer.INSTANCE)
.addDeserializer(LocalTime.class, LocalTimeDeserializer.INSTANCE) .addDeserializer(LocalTime.class, LocalTimeDeserializer.INSTANCE)
// 新增 LocalDateTime 序列化反序列化规则使用 Long 时间戳 // 新增 LocalDateTime 序列化反序列化规则使用 Long 时间戳
.addSerializer(LocalDateTime.class, TimestampLocalDateTimeSerializer.INSTANCE) .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
.addDeserializer(LocalDateTime.class, TimestampLocalDateTimeDeserializer.INSTANCE); .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
// 1.2 注册到 objectMapper // 1.2 注册到 objectMapper
objectMappers.forEach(objectMapper -> objectMapper.registerModule(simpleModule)); objectMappers.forEach(objectMapper -> objectMapper.registerModule(simpleModule));

View File

@ -27,10 +27,6 @@ public class ContractRespVO {
@ExcelProperty("项目id") @ExcelProperty("项目id")
private Long projectId; private Long projectId;
@Schema(description = "外部合同id", example = "32057")
@ExcelProperty("外部合同id")
private Long extContractId;
@Schema(description = "项目编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SJ24001") @Schema(description = "项目编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SJ24001")

View File

@ -23,36 +23,6 @@ public class ContractSaveReqVO {
@ExcelProperty("项目id") @ExcelProperty("项目id")
private Long projectId; private Long projectId;
@Schema(description = "外部合同id", example = "32057")
@ExcelProperty("外部合同id")
private Long extContractId;
//
@Schema(description = "项目编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SJ24001")
@ExcelProperty("项目编号")
private String code;
@Schema(description = "主控部门", requiredMode = Schema.RequiredMode.REQUIRED, example = "生产一部")
@ExcelProperty("主控部门")
private String trackingDep;
@Schema(description = "项目负责人", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("项目负责人")
private String projectManager;
@Schema(description = "预计合同金额", requiredMode = Schema.RequiredMode.REQUIRED,example = "200.0000")
@ExcelProperty("预计合同金额")
private BigDecimal expectedContractAmount;
@Schema(description = "合同商议提示")
@ExcelProperty("合同商议提示")
private LocalDateTime reminderTime;
@Schema(description = "出图公司", requiredMode = Schema.RequiredMode.REQUIRED,example = "***设计院")
@ExcelProperty("出图公司")
private String drawingCompany;

View File

@ -32,10 +32,6 @@ public class ContractDO extends BaseDO {
* 项目id * 项目id
*/ */
private Long projectId; private Long projectId;
/**
* 外部合同id
*/
private Long extContractId;
/** /**
* 合同名称 * 合同名称
*/ */

View File

@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.cms.dal.dataobject.contract;
import lombok.Data;
/**
* @author wyw
* @description
* @date 2024/8/14
*/
@Data
public class ProjectScheduleDetailDO extends ContractDO {
/**
* 项目负责人
*/
private String projectLeader;
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.cms.dal.dataobject.contract;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author wyw
* @description
* @date 2024/8/14
*/
@Data
public class ProjectTrackingDetailDO extends ContractDO {
/**
* 项目编号
*/
private String code;
/**
* 跟踪部门
*/
private String trackingDep;
/**
* 出图公司
*/
private BigDecimal lettingPartyPeople;
/**
* 预计公司合同总金额
*/
private BigDecimal companyContractAmount;
}

View File

@ -1,29 +0,0 @@
package cn.iocoder.yudao.module.cms.dal.mysql.customerCompany;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.cms.dal.dataobject.customerCompany.CustomerCompanyDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.cms.controller.admin.customerCompany.vo.*;
/**
* 客户公司 Mapper
*
* @author hhyykk
*/
@Mapper
public interface CustomerCompanyMapper extends BaseMapperX<CustomerCompanyDO> {
default PageResult<CustomerCompanyDO> selectPage(CustomerCompanyPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<CustomerCompanyDO>()
.likeIfPresent(CustomerCompanyDO::getContacts, reqVO.getContacts())
.likeIfPresent(CustomerCompanyDO::getName, reqVO.getName())
.eqIfPresent(CustomerCompanyDO::getAddress, reqVO.getAddress())
.eqIfPresent(CustomerCompanyDO::getPhone, reqVO.getPhone())
.orderByDesc(CustomerCompanyDO::getId));
}
}

View File

@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.cms.service.contract; package cn.iocoder.yudao.module.cms.service.contract;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceRespDTO; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceRespDTO;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmTaskRespDTO; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmTaskRespDTO;
import cn.iocoder.yudao.module.cms.dal.dataobject.contractHistory.ContractHistoryDO; import cn.iocoder.yudao.module.cms.dal.dataobject.contractHistory.ContractHistoryDO;
@ -66,100 +65,55 @@ public class ContractServiceImpl implements ContractService {
@Override @Override
public Long createContract(Long loginUserId, ContractSaveReqVO createReqVO) { public Long createContract(Long loginUserId, ContractSaveReqVO createReqVO) {
if (loginUserId == null) {
throw exception(PARAM_NOT_EXISTS);
}
String userName = adminUserApi.getUser(loginUserId).getNickname(); String userName = adminUserApi.getUser(loginUserId).getNickname();
if (userName == null) { if (userName == null) {
throw exception(USER_NOT_EXISTS); throw exception(USER_NOT_EXISTS);
} }
//校验,项目是否存在 //校验,项目是否存在
Long projectId = createReqVO.getProjectId(); Long projectId = createReqVO.getProjectId();
projectApi.validProjectExist(projectId); projectApi.validProjectExist(projectId);
//校验联表的字段是否和所联系的表内容相同
ProjectRespDTO project = projectApi.getProject(projectId);
ProjectDetailRespDTO projectDetail = projectApi.getProjectDetailById(projectId);
String name = createReqVO.getName();
//todo 待提取 String trimName = name.trim();
String code = createReqVO.getCode(); List<ContractDO> projectList = contractMapper.selectList("project_id", projectId);
String trackingDep = createReqVO.getTrackingDep(); for (ContractDO contractDO : projectList) {
String projectManager = createReqVO.getProjectManager(); if (contractDO.getName().equals(trimName)){
String drawingCompany = createReqVO.getDrawingCompany();
BigDecimal expectedContractAmount = createReqVO.getExpectedContractAmount();
BigDecimal provisionalSettlement = createReqVO.getProvisionalSettlement();
//LocalDateTime reminderTime = createReqVO.getReminderTime();
if (!project.getCode().equals(code)) {
throw exception(PARAM_ERROR);
}
if (!projectDetail.getTrackingDepName().equals(trackingDep)) {
throw exception(PARAM_ERROR);
}
if (!projectDetail.getProjectManagerName().equals(projectManager)) {
throw exception(PARAM_ERROR);
}
if (!project.getDrawingCompany().equals(drawingCompany)) {
throw exception(PARAM_ERROR);
}
if (!Objects.equals(project.getContractAmount(), expectedContractAmount)) {
throw exception(PARAM_ERROR);
}
if (!Objects.equals(provisionalSettlement, getProvisionalSettlement(createReqVO))) {
throw exception(PARAM_ERROR);
}
ContractDO contract = BeanUtils.toBean(createReqVO, ContractDO.class);
ContractRespVO contractResp = BeanUtils.toBean(contract, ContractRespVO.class);
contract.setCreator(userName);
contract.setUpdater(userName);
//判断该合同是否已经存在,比较各个字段值是否完全一样
//得到所有的合同逐个比较
List<ContractDO> contractList = contractMapper.selectList("project_id", projectId);
List<ContractRespVO> respVOList = BeanUtils.toBean(contractList, ContractRespVO.class);
for (ContractRespVO respVO : respVOList) {
if (respVO.equals(contractResp)) {
throw exception(CONTRACT_ALREADY_EXISTS); throw exception(CONTRACT_ALREADY_EXISTS);
} }
} }
ContractDO contract = BeanUtils.toBean(createReqVO, ContractDO.class);
contract.setCreator(userName);
contract.setUpdater(userName);
contractMapper.insert(contract); contractMapper.insert(contract);
Long contractId = contract.getId(); // Long contractId = contract.getId();
ContractHistoryDO contractHistory = BeanUtils.toBean(contract, ContractHistoryDO.class); // ContractHistoryDO contractHistory = BeanUtils.toBean(contract, ContractHistoryDO.class);
//
// // 启动流程同时写入历史合同
// 启动流程同时写入历史合同 // if (createReqVO.getId() == null) {
if (createReqVO.getId() == null) { // String processInstanceId = processInstanceApi.createProcessInstance(loginUserId,
String processInstanceId = processInstanceApi.createProcessInstance(loginUserId, // new BpmProcessInstanceCreateReqDTO()
new BpmProcessInstanceCreateReqDTO() // .setProcessDefinitionKey(PROCESS_KEY).setBusinessKey(String.valueOf(contractId)));
.setProcessDefinitionKey(PROCESS_KEY).setBusinessKey(String.valueOf(contractId))); //
// // 写入工作流编号
// 写入工作流编号 // contractHistory.setProcessInstanceId(processInstanceId);
contractHistory.setProcessInstanceId(processInstanceId); // contractHistory.setContractId(contractId);
contractHistory.setContractId(contractId); //
// Long count = contractHistoryMapper.selectCount("project_id", projectId);
Long count = contractHistoryMapper.selectCount("project_id", projectId); // if (count < 1) {
if (count < 1) { // contractHistory.setVersion(VERSION);
contractHistory.setVersion(VERSION); // } else {
} else { // contractHistory.setVersion(String.valueOf(count + 1));
contractHistory.setVersion(String.valueOf(count + 1)); // }
} //
// contractHistory.setProcessStatus("0");
contractHistory.setProcessStatus("0"); // contractHistoryMapper.insert(contractHistory);
contractHistoryMapper.insert(contractHistory); // }
}
//返回 //返回
@ -203,38 +157,12 @@ public class ContractServiceImpl implements ContractService {
} }
Long projectId = contractDO.getProjectId(); Long projectId = contractDO.getProjectId();
if (projectId == null) { if (projectId == null) {
throw exception(PROJECT_NOT_EXISTS); throw exception(PROJECT_NOT_EXISTS);
} }
ContractRespVO contractRespVO = BeanUtils.toBean(contractDO, ContractRespVO.class); ContractRespVO contractRespVO = BeanUtils.toBean(contractDO, ContractRespVO.class);
// 需要联表查询
// 1.项目编号 pms_project 直接
// 2.主控部门(跟踪部门) pms_project找到的是id 需要联表
// 3.项目经理 pms_project找到的是id 需要联表
// 4.出图公司 pms_project 直接
// 5.预计合同金额 pms_project 直接
// 6.合同商议提示 外部合同表里
// 7.暂定结算数
ProjectRespDTO project = projectApi.getProject(projectId);
contractRespVO.setCode(project.getCode());
contractRespVO.setDrawingCompany(project.getDrawingCompany());
contractRespVO.setExpectedContractAmount(project.getContractAmount());
ProjectDetailRespDTO projectDetail = projectApi.getProjectDetailById(projectId);
contractRespVO.setTrackingDep(projectDetail.getTrackingDepName());
contractRespVO.setProjectManager(projectDetail.getProjectManagerName());
//分包合同商议提示 TODO 待优化
// ExtContractDO extContractDO = extContractMapper.selectOne("project_id", projectId);
// LocalDateTime reminderTime = extContractDO.getReminderTime();
contractRespVO.setReminderTime(null);
//暂定结算数
BigDecimal provisionalSettlement = getProvisionalSettlementById(id);
contractRespVO.setProvisionalSettlement(provisionalSettlement);
return contractRespVO; return contractRespVO;
} }

View File

@ -1,53 +0,0 @@
package cn.iocoder.yudao.module.cms.service.customerCompany;
import jakarta.validation.*;
import cn.iocoder.yudao.module.cms.controller.admin.customerCompany.vo.*;
import cn.iocoder.yudao.module.cms.dal.dataobject.customerCompany.CustomerCompanyDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
/**
* 客户公司 Service 接口
*
* @author hhyykk
*/
public interface CustomerCompanyService {
/**
* 创建客户公司
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createCustomerCompany(@Valid CustomerCompanySaveReqVO createReqVO);
/**
* 更新客户公司
*
* @param updateReqVO 更新信息
*/
void updateCustomerCompany(@Valid CustomerCompanySaveReqVO updateReqVO);
/**
* 删除客户公司
*
* @param id 编号
*/
void deleteCustomerCompany(Long id);
/**
* 获得客户公司
*
* @param id 编号
* @return 客户公司
*/
CustomerCompanyDO getCustomerCompany(Long id);
/**
* 获得客户公司分页
*
* @param pageReqVO 分页查询
* @return 客户公司分页
*/
PageResult<CustomerCompanyDO> getCustomerCompanyPage(CustomerCompanyPageReqVO pageReqVO);
}

View File

@ -1,71 +0,0 @@
package cn.iocoder.yudao.module.cms.service.customerCompany;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.module.cms.controller.admin.customerCompany.vo.*;
import cn.iocoder.yudao.module.cms.dal.dataobject.customerCompany.CustomerCompanyDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.cms.dal.mysql.customerCompany.CustomerCompanyMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.cms.enums.ErrorCodeConstants.*;
/**
* 客户公司 Service 实现类
*
* @author hhyykk
*/
@Service
@Validated
public class CustomerCompanyServiceImpl implements CustomerCompanyService {
@Resource
private CustomerCompanyMapper customerCompanyMapper;
@Override
public Long createCustomerCompany(CustomerCompanySaveReqVO createReqVO) {
// 插入
CustomerCompanyDO customerCompany = BeanUtils.toBean(createReqVO, CustomerCompanyDO.class);
customerCompanyMapper.insert(customerCompany);
// 返回
return customerCompany.getId();
}
@Override
public void updateCustomerCompany(CustomerCompanySaveReqVO updateReqVO) {
// 校验存在
validateCustomerCompanyExists(updateReqVO.getId());
// 更新
CustomerCompanyDO updateObj = BeanUtils.toBean(updateReqVO, CustomerCompanyDO.class);
customerCompanyMapper.updateById(updateObj);
}
@Override
public void deleteCustomerCompany(Long id) {
// 校验存在
validateCustomerCompanyExists(id);
// 删除
customerCompanyMapper.deleteById(id);
}
private void validateCustomerCompanyExists(Long id) {
if (customerCompanyMapper.selectById(id) == null) {
throw exception(CUSTOMER_COMPANY_NOT_EXISTS);
}
}
@Override
public CustomerCompanyDO getCustomerCompany(Long id) {
return customerCompanyMapper.selectById(id);
}
@Override
public PageResult<CustomerCompanyDO> getCustomerCompanyPage(CustomerCompanyPageReqVO pageReqVO) {
return customerCompanyMapper.selectPage(pageReqVO);
}
}

View File

@ -10,7 +10,6 @@ import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractRe
import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractSaveReqVO; import cn.iocoder.yudao.module.cms.controller.admin.extContract.vo.ExtContractSaveReqVO;
import cn.iocoder.yudao.module.cms.dal.dataobject.extcontract.ExtContractDO; import cn.iocoder.yudao.module.cms.dal.dataobject.extcontract.ExtContractDO;
import cn.iocoder.yudao.module.cms.dal.dataobject.extcontracthistory.ExtContractHistoryDO; import cn.iocoder.yudao.module.cms.dal.dataobject.extcontracthistory.ExtContractHistoryDO;
import cn.iocoder.yudao.module.cms.dal.mysql.customerCompany.CustomerCompanyMapper;
import cn.iocoder.yudao.module.cms.dal.mysql.extContract.ExtContractMapper; 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.dal.mysql.extcontracthistory.ExtContractHistoryMapper;
import cn.iocoder.yudao.module.cms.enums.ChargingStandardEnum; import cn.iocoder.yudao.module.cms.enums.ChargingStandardEnum;
@ -60,8 +59,6 @@ public class ExtContractServiceImpl implements ExtContractService {
@Resource @Resource
private ProjectApi projectApi; private ProjectApi projectApi;
@Resource
private CustomerCompanyMapper customerCompanyMapper;
@Resource @Resource
private AdminUserApi adminUserApi; private AdminUserApi adminUserApi;

View File

@ -1,7 +1,5 @@
package cn.iocoder.yudao.module.cms.service.extcontracthistory; package cn.iocoder.yudao.module.cms.service.extcontracthistory;
import cn.iocoder.yudao.module.cms.dal.dataobject.customerCompany.CustomerCompanyDO;
import cn.iocoder.yudao.module.cms.dal.mysql.customerCompany.CustomerCompanyMapper;
import cn.iocoder.yudao.module.cms.enums.ChargingStandardEnum; import cn.iocoder.yudao.module.cms.enums.ChargingStandardEnum;
import cn.iocoder.yudao.module.cms.enums.ContractStatusEnum; import cn.iocoder.yudao.module.cms.enums.ContractStatusEnum;
import cn.iocoder.yudao.module.cms.enums.ContractTypeEnum; import cn.iocoder.yudao.module.cms.enums.ContractTypeEnum;
@ -47,8 +45,7 @@ public class ExtContractHistoryServiceImpl implements ExtContractHistoryService
@Resource @Resource
private AdminUserApi adminUserApi; private AdminUserApi adminUserApi;
@Resource
private CustomerCompanyMapper customerCompanyMapper;
@Resource @Resource
private ExtContractService extContractService; private ExtContractService extContractService;
@ -104,9 +101,7 @@ public class ExtContractHistoryServiceImpl implements ExtContractHistoryService
HistoryResp.setProjectManager(projectDetail.getProjectManagerName()); HistoryResp.setProjectManager(projectDetail.getProjectManagerName());
//用客户公司id查询 //用客户公司id查询
CustomerCompanyDO customerCompanyDO = customerCompanyMapper.selectById(customerCompanyId); HistoryResp.setCustomerCompanyName(null);
String name = customerCompanyDO.getName();
HistoryResp.setCustomerCompanyName(name);
// TODO 枚举优化 // TODO 枚举优化
//合同总金额 //合同总金额

View File

@ -18,6 +18,7 @@ import java.time.LocalDateTime;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import org.glassfish.jaxb.core.v2.TODO;
/** /**
* 项目跟踪信息 DO * 项目跟踪信息 DO

View File

@ -57,7 +57,7 @@ public class ProjectTrackingServiceImpl implements ProjectTrackingService {
private void validateProjectTrackingExists(Long id) { private void validateProjectTrackingExists(Long id) {
if (projectTrackingMapper.selectById(id) == null) { if (projectTrackingMapper.selectById(id) == null) {
throw exception(PROJECT_TRACKING_NOT_EXISTS); throw exception(null);
} }
} }