4 Commits

Author SHA1 Message Date
wyw
faf72f2456 [fix] 优化合同管理 2024-08-14 13:49:58 +08:00
wyw
39f92c378c Merge remote-tracking branch 'origin/feature-Contract-8.12-wyw' into feature-Contract-8.12-wyw 2024-08-14 13:49:44 +08:00
wyw
668f7283d8 [fix] 优化合同管理 2024-08-14 13:49:26 +08:00
wyw
b8a80432f6 [fix] 优化项目跟踪和项目进度 2024-08-14 11:30:06 +08:00
33 changed files with 297 additions and 442 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,13 @@
package cn.iocoder.yudao.module.cms.dal.dataobject.contract;
import lombok.Data;
@Data
public class ProjectScheduleDetailRespDO extends ContractDO{
/**
* 项目负责人
*/
private String projectManager;
}

View File

@@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.cms.dal.dataobject.contract;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ProjectTrackDetailRespDO extends ContractDO{
/**
* 项目编号
*/
private String code;
/**
* 出图公司
*/
private String drawingCompany;
/**
* 主控部门
*/
private String trackingDepName;
/**
* 预计合同金额
*/
private BigDecimal expectedContractAmount;
}

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

@@ -0,0 +1,15 @@
package cn.iocoder.yudao.module.pms.api.projectschedule;
import cn.iocoder.yudao.module.pms.api.projectschedule.dto.ProjectScheduleDetailRespDTO;
import cn.iocoder.yudao.module.pms.api.projecttracking.dto.ProjectTrackDetailRespDTO;
public interface ProjectScheduleApi {
/**
* 获得项目进度信息
* @param id 项目进度信息id
* @return ProjectScheduleDetailRespDTO
*/
ProjectScheduleDetailRespDTO getProjectScheduleDetail(Long id);
ProjectScheduleDetailRespDTO getProjectTrackDetailByProjectId(Long projectId);
}

View File

@@ -0,0 +1,13 @@
package cn.iocoder.yudao.module.pms.api.projectschedule.dto;
import lombok.Data;
@Data
public class ProjectScheduleDetailRespDTO {
/**
* 项目负责人
*/
private String projectManager;
}

View File

@@ -0,0 +1,15 @@
package cn.iocoder.yudao.module.pms.api.projecttracking;
import cn.iocoder.yudao.module.pms.api.projecttracking.dto.ProjectTrackDetailRespDTO;
public interface ProjectTrackingApi {
/**
* 获得项目追踪信息
* @param id 项目追踪信息id
* @return ProjectScheduleDetailRespDTO
*/
ProjectTrackDetailRespDTO getProjectTrackDetail(Long id);
}

View File

@@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.pms.api.projecttracking.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ProjectTrackDetailRespDTO {
/**
* 项目编号
*/
private String code;
/**
* 出图公司
*/
private String drawingCompany;
/**
* 主控部门
*/
private String trackingDepName;
/**
* 预计合同金额
*/
private BigDecimal expectedContractAmount;
}

View File

@@ -1,44 +0,0 @@
package cn.iocoder.yudao.module.pms.api.project;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.pms.api.project.dto.ProjectDetailRespDTO;
import cn.iocoder.yudao.module.pms.api.project.dto.ProjectRespDTO;
import cn.iocoder.yudao.module.pms.dal.dataobject.project.ProjectDO;
import cn.iocoder.yudao.module.pms.dal.dataobject.project.ProjectDetailDO;
import cn.iocoder.yudao.module.pms.dal.mysql.project.ProjectMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstants.PROJECT_NOT_EXISTS;
@Service
@Validated
public class ProjectImpl implements ProjectApi {
@Resource
private ProjectMapper projectMapper;
@Override
public ProjectRespDTO getProject(Long projectId) {
ProjectDO projectDO = projectMapper.selectById(projectId);
return BeanUtils.toBean(projectDO, ProjectRespDTO.class);
}
@Override
public ProjectDetailRespDTO getProjectDetailById(Long projectId) {
ProjectDetailDO projectMapperDetail = projectMapper.getDetailById(projectId);
return BeanUtils.toBean(projectMapperDetail, ProjectDetailRespDTO.class);
}
@Override
public void validProjectExist(Long projectId) {
if (projectMapper.selectById(projectId) == null) {
throw exception(PROJECT_NOT_EXISTS);
}
}
}

View File

@@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.pms.api.projectschedule;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.pms.api.projectschedule.dto.ProjectScheduleDetailRespDTO;
import cn.iocoder.yudao.module.pms.dal.dataobject.projectschedule.ProjectScheduleDO;
import cn.iocoder.yudao.module.pms.service.projectschedule.ProjectScheduleService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@Service
@Validated
public class ProjectScheduleImpl implements ProjectScheduleApi {
@Resource
private ProjectScheduleService projectScheduleService;
@Override
public ProjectScheduleDetailRespDTO getProjectScheduleDetail(Long id) {
ProjectScheduleDO projectSchedule = projectScheduleService.getProjectSchedule(id);
return BeanUtils.toBean(projectSchedule,ProjectScheduleDetailRespDTO.class);
}
@Override
public ProjectScheduleDetailRespDTO getProjectTrackDetailByProjectId(Long projectId) {
ProjectScheduleDO projectScheduleByProjectId = projectScheduleService.getProjectScheduleByProjectId(projectId);
return BeanUtils.toBean(projectScheduleByProjectId,ProjectScheduleDetailRespDTO.class);
}
}

View File

@@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.pms.api.projecttracking;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.pms.api.projecttracking.dto.ProjectTrackDetailRespDTO;
import cn.iocoder.yudao.module.pms.dal.dataobject.projecttracking.ProjectTrackingDO;
import cn.iocoder.yudao.module.pms.service.projecttracking.ProjectTrackingService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@Service
@Validated
public class ProjectTrackingImpl implements ProjectTrackingApi {
@Resource
private ProjectTrackingService projectTrackingService;
@Override
public ProjectTrackDetailRespDTO getProjectTrackDetail(Long id) {
ProjectTrackingDO projectTracking = projectTrackingService.getProjectTracking(id);
return BeanUtils.toBean(projectTracking, ProjectTrackDetailRespDTO.class);
}
}

View File

@@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.pms.controller.admin.projectschedule.vo; package cn.iocoder.yudao.module.pms.controller.admin.projectschedule.vo;
import lombok.*; import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageParam;
import java.math.BigDecimal; import java.math.BigDecimal;
@@ -84,24 +83,4 @@ public class ProjectSchedulePageReqVO extends PageParam {
@Schema(description = "最后编辑人") @Schema(description = "最后编辑人")
private String finalEditor; private String finalEditor;
@Schema(description = "创建人")
private String creator;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "更新人")
private String updator;
@Schema(description = "更新时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] updateTime;
@Schema(description = "是否删除")
private Boolean deleted;
@Schema(description = "租户id", example = "1")
private Long tenantId;
} }

View File

@@ -105,28 +105,4 @@ public class ProjectScheduleRespVO {
@ExcelProperty("最后编辑人") @ExcelProperty("最后编辑人")
private String finalEditor; private String finalEditor;
@Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建人")
private String creator;
@Schema(description = "创建时间")
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "更新人", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("更新人")
private String updator;
@Schema(description = "更新时间")
@ExcelProperty("更新时间")
private LocalDateTime updateTime;
@Schema(description = "是否删除", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("是否删除")
private Boolean deleted;
@Schema(description = "租户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty("租户id")
private Long tenantId;
} }

View File

@@ -91,26 +91,5 @@ public class ProjectScheduleSaveReqVO {
@Schema(description = "最后编辑人") @Schema(description = "最后编辑人")
private String finalEditor; private String finalEditor;
@Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "创建人不能为空")
private String creator;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "更新人", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "更新人不能为空")
private String updator;
@Schema(description = "更新时间")
private LocalDateTime updateTime;
@Schema(description = "是否删除", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "是否删除不能为空")
private Boolean deleted;
@Schema(description = "租户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "租户id不能为空")
private Long tenantId;
} }

View File

@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.pms.controller.admin.projecttracking.vo; package cn.iocoder.yudao.module.pms.controller.admin.projecttracking.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@@ -16,6 +17,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@ToString(callSuper = true) @ToString(callSuper = true)
public class ProjectTrackingPageReqVO extends PageParam { public class ProjectTrackingPageReqVO extends PageParam {
@Schema(description = "跟踪项目名称", example = "张三") @Schema(description = "跟踪项目名称", example = "张三")
private String name; private String name;

View File

@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.pms.controller.admin.projecttracking.vo; package cn.iocoder.yudao.module.pms.controller.admin.projecttracking.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;

View File

@@ -1,17 +1,10 @@
package cn.iocoder.yudao.module.pms.dal.dataobject.projectschedule; package cn.iocoder.yudao.module.pms.dal.dataobject.projectschedule;
import lombok.*; import lombok.*;
import java.util.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
import java.math.BigDecimal;
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;
@@ -123,9 +116,5 @@ public class ProjectScheduleDO extends BaseDO {
* 最后编辑人 * 最后编辑人
*/ */
private String finalEditor; private String finalEditor;
/**
* 更新人
*/
private String updator;
} }

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
@@ -39,6 +40,7 @@ public class ProjectTrackingDO extends BaseDO {
*/ */
@TableId @TableId
private Long id; private Long id;
/** /**
* 跟踪项目名称 * 跟踪项目名称
*/ */
@@ -80,11 +82,11 @@ public class ProjectTrackingDO extends BaseDO {
/** /**
* 建设方 * 建设方
*/ */
private BigDecimal constructionSide; private String constructionSide;
/** /**
* 发包人 * 发包人
*/ */
private BigDecimal lettingPartyPeople; private String lettingPartyPeople;
/** /**
* 客户联系人 * 客户联系人
*/ */

View File

@@ -40,12 +40,8 @@ public interface ProjectScheduleMapper extends BaseMapperX<ProjectScheduleDO> {
.eqIfPresent(ProjectScheduleDO::getChoose, reqVO.getChoose()) .eqIfPresent(ProjectScheduleDO::getChoose, reqVO.getChoose())
.eqIfPresent(ProjectScheduleDO::getCompletionFileUrl, reqVO.getCompletionFileUrl()) .eqIfPresent(ProjectScheduleDO::getCompletionFileUrl, reqVO.getCompletionFileUrl())
.eqIfPresent(ProjectScheduleDO::getFinalEditor, reqVO.getFinalEditor()) .eqIfPresent(ProjectScheduleDO::getFinalEditor, reqVO.getFinalEditor())
.eqIfPresent(ProjectScheduleDO::getCreator, reqVO.getCreator())
.betweenIfPresent(ProjectScheduleDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(ProjectScheduleDO::getUpdator, reqVO.getUpdator())
.betweenIfPresent(ProjectScheduleDO::getUpdateTime, reqVO.getUpdateTime())
.eqIfPresent(ProjectScheduleDO::getDeleted, reqVO.getDeleted())
.orderByDesc(ProjectScheduleDO::getId)); .orderByDesc(ProjectScheduleDO::getId));
} }
} }

View File

@@ -50,4 +50,7 @@ public interface ProjectScheduleService {
*/ */
PageResult<ProjectScheduleDO> getProjectSchedulePage(ProjectSchedulePageReqVO pageReqVO); PageResult<ProjectScheduleDO> getProjectSchedulePage(ProjectSchedulePageReqVO pageReqVO);
ProjectScheduleDO getProjectScheduleByProjectId(Long id);
} }

View File

@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.pms.service.projectschedule; package cn.iocoder.yudao.module.pms.service.projectschedule;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -11,6 +12,8 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.pms.dal.mysql.projectschedule.ProjectScheduleMapper; import cn.iocoder.yudao.module.pms.dal.mysql.projectschedule.ProjectScheduleMapper;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstants.*;
@@ -68,4 +71,16 @@ public class ProjectScheduleServiceImpl implements ProjectScheduleService {
return projectScheduleMapper.selectPage(pageReqVO); return projectScheduleMapper.selectPage(pageReqVO);
} }
@Override
public ProjectScheduleDO getProjectScheduleByProjectId(Long projectId) {
QueryWrapper<ProjectScheduleDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("project_id", projectId);
queryWrapper.orderByDesc("create_time");
List<ProjectScheduleDO> projectScheduleDOS = projectScheduleMapper.selectList(queryWrapper);
if (projectScheduleDOS == null || projectScheduleDOS.isEmpty()) {
throw exception(PROJECT_SCHEDULE_NOT_EXISTS);
}
return projectScheduleDOS.get(0);
}
} }

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);
} }
} }

View File

@@ -18,8 +18,8 @@ spring:
# Jackson 配置项y # Jackson 配置项y
jackson: jackson:
serialization: serialization:
write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 # write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳
write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 # write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
fail-on-empty-beans: false # 允许序列化无属性的 Bean fail-on-empty-beans: false # 允许序列化无属性的 Bean