mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-02-08 14:44:57 +08:00
[feat] 新增合同管理中的流程查询功能
This commit is contained in:
parent
fff41eda04
commit
579a647566
@ -2,8 +2,12 @@ package cn.iocoder.yudao.module.bpm.api.task;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
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.BpmTaskRespDTO;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程实例 Api 接口
|
* 流程实例 Api 接口
|
||||||
*
|
*
|
||||||
@ -20,4 +24,20 @@ public interface BpmProcessInstanceApi {
|
|||||||
*/
|
*/
|
||||||
String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO);
|
String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询流程
|
||||||
|
*
|
||||||
|
* @param id 流程id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
BpmProcessInstanceRespDTO getProcessInstance(String id);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询指定流程的任务
|
||||||
|
* @param id 流程id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<BpmTaskRespDTO> getTask(String id);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,115 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.api.task.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程定义
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class BpmProcessDefinitionRespDTO {
|
||||||
|
/**
|
||||||
|
* 编号
|
||||||
|
*/
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 版本
|
||||||
|
*/
|
||||||
|
private Integer version;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程名称
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程标识
|
||||||
|
*/
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程图标
|
||||||
|
*/
|
||||||
|
private String icon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程描述
|
||||||
|
*/
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程分类
|
||||||
|
*/
|
||||||
|
private String category;
|
||||||
|
/**
|
||||||
|
* 流程分类名字
|
||||||
|
*/
|
||||||
|
private String categoryName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单类型
|
||||||
|
*/
|
||||||
|
private Integer formType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单编号
|
||||||
|
*/
|
||||||
|
private Long formId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单名字
|
||||||
|
*/
|
||||||
|
private String formName;
|
||||||
|
/**
|
||||||
|
* 表单的配置
|
||||||
|
*/
|
||||||
|
private String formConf;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单项的数组
|
||||||
|
*/
|
||||||
|
private List<String> formFields;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义表单的提交路径
|
||||||
|
*/
|
||||||
|
private String formCustomCreatePath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义表单的查看路径
|
||||||
|
*/
|
||||||
|
private String formCustomViewPath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 中断状态-参见 SuspensionState 枚举
|
||||||
|
*/
|
||||||
|
private Integer suspensionState; // 参见 SuspensionState 枚举
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部署时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime deploymentTime; // 需要从对应的 Deployment 读取,非必须返回
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BPMN XML
|
||||||
|
*/
|
||||||
|
private String bpmnXml; // 需要从对应的 BpmnModel 读取,非必须返回
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发起用户需要选择审批人的任务数组
|
||||||
|
*/
|
||||||
|
private List<UserTask> startUserSelectTasks; // 需要从对应的 BpmnModel 读取,非必须返回
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class UserTask {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,118 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.api.task.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例的获得 Resp DTO
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class BpmProcessInstanceRespDTO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例编号
|
||||||
|
*/
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例名称
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程分类
|
||||||
|
*/
|
||||||
|
private String category;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程分类名称
|
||||||
|
*/
|
||||||
|
private String categoryName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例状态
|
||||||
|
*/
|
||||||
|
private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发起时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime startTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime endTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 持续时间
|
||||||
|
*/
|
||||||
|
private Long durationInMillis;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发起流程的用户
|
||||||
|
*/
|
||||||
|
private User startUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程定义编号
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String processDefinitionId;
|
||||||
|
/**
|
||||||
|
* 流程定义
|
||||||
|
*/
|
||||||
|
private BpmProcessDefinitionRespDTO processDefinition;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前审批中的任务
|
||||||
|
*/
|
||||||
|
private List<Task> tasks; // 仅在流程实例分页才返回
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户信息
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public static class User {
|
||||||
|
/**
|
||||||
|
* 用户编号
|
||||||
|
*/
|
||||||
|
private Long id;
|
||||||
|
/**
|
||||||
|
* 用户名称
|
||||||
|
*/
|
||||||
|
private String nickname;
|
||||||
|
/**
|
||||||
|
* 部门编号
|
||||||
|
*/
|
||||||
|
private Long deptId;
|
||||||
|
/**
|
||||||
|
* 部门名称
|
||||||
|
*/
|
||||||
|
private String deptName;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程任务
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public static class Task {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程任务编号
|
||||||
|
*/
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务名称
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,144 @@
|
|||||||
|
package cn.iocoder.yudao.module.bpm.api.task.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 指定流程实例的任务
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class BpmTaskRespDTO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务编号
|
||||||
|
*/
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务名字
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime endTime;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 持续时间
|
||||||
|
*/
|
||||||
|
private Long durationInMillis;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务状态
|
||||||
|
*/
|
||||||
|
private Integer status; // 参见 BpmTaskStatusEnum 枚举
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 审批理由
|
||||||
|
*/
|
||||||
|
private String reason;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 负责人的用户信息
|
||||||
|
*/
|
||||||
|
private BpmProcessInstanceRespDTO.User ownerUser;
|
||||||
|
/**
|
||||||
|
* 审核的用户信息
|
||||||
|
*/
|
||||||
|
private BpmProcessInstanceRespDTO.User assigneeUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务定义的标识
|
||||||
|
*/
|
||||||
|
private String taskDefinitionKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所属流程实例编号
|
||||||
|
*/
|
||||||
|
private String processInstanceId;
|
||||||
|
/**
|
||||||
|
* 所属流程实例
|
||||||
|
*/
|
||||||
|
private ProcessInstance processInstance;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 父任务编号
|
||||||
|
*/
|
||||||
|
private String parentTaskId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 子任务列表(由加签生成)
|
||||||
|
*/
|
||||||
|
private List<BpmTaskRespDTO> children;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单编号
|
||||||
|
*/
|
||||||
|
private Long formId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单名字
|
||||||
|
*/
|
||||||
|
private String formName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单的配置-JSON 字符串
|
||||||
|
*/
|
||||||
|
private String formConf;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表单项的数组
|
||||||
|
*/
|
||||||
|
private List<String> formFields;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交的表单值
|
||||||
|
*/
|
||||||
|
private Map<String, Object> formVariables;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public static class ProcessInstance {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例编号
|
||||||
|
*/
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程实例名称
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交时间
|
||||||
|
*/
|
||||||
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程定义的编号
|
||||||
|
*/
|
||||||
|
private String processDefinitionId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发起人的用户信息
|
||||||
|
*/
|
||||||
|
private BpmProcessInstanceRespDTO.User startUser;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -1,13 +1,42 @@
|
|||||||
package cn.iocoder.yudao.module.bpm.api.task;
|
package cn.iocoder.yudao.module.bpm.api.task;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
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.BpmTaskRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
|
||||||
|
import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
|
||||||
|
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
|
||||||
|
import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
|
||||||
|
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
|
||||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||||
|
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||||
|
import org.flowable.engine.history.HistoricProcessInstance;
|
||||||
|
import org.flowable.engine.repository.ProcessDefinition;
|
||||||
|
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flowable 流程实例 Api 实现类
|
* Flowable 流程实例 Api 实现类
|
||||||
*
|
*
|
||||||
@ -21,8 +50,80 @@ public class BpmProcessInstanceApiImpl implements BpmProcessInstanceApi {
|
|||||||
@Resource
|
@Resource
|
||||||
private BpmProcessInstanceService processInstanceService;
|
private BpmProcessInstanceService processInstanceService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AdminUserApi adminUserApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DeptApi deptApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BpmProcessDefinitionService processDefinitionService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BpmTaskService taskService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BpmFormService formService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO) {
|
public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO) {
|
||||||
return processInstanceService.createProcessInstance(userId, reqDTO);
|
return processInstanceService.createProcessInstance(userId, reqDTO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BpmProcessInstanceRespDTO getProcessInstance(String id) {
|
||||||
|
|
||||||
|
HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id);
|
||||||
|
if (processInstance == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拼接返回
|
||||||
|
ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition(
|
||||||
|
processInstance.getProcessDefinitionId());
|
||||||
|
BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
|
||||||
|
processInstance.getProcessDefinitionId());
|
||||||
|
|
||||||
|
String bpmnXml = BpmnModelUtils.getBpmnXml(
|
||||||
|
processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()));
|
||||||
|
|
||||||
|
AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId()));
|
||||||
|
DeptRespDTO dept = null;
|
||||||
|
if (startUser != null) {
|
||||||
|
dept = deptApi.getDept(startUser.getDeptId());
|
||||||
|
}
|
||||||
|
BpmProcessInstanceRespVO bpmProcessInstanceRespVO = BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance,
|
||||||
|
processDefinition, processDefinitionInfo, bpmnXml, startUser, dept);
|
||||||
|
|
||||||
|
return BeanUtils.toBean(bpmProcessInstanceRespVO, BpmProcessInstanceRespDTO.class);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//List<BpmTaskRespVO>
|
||||||
|
@Override
|
||||||
|
public List<BpmTaskRespDTO> getTask(String id) {
|
||||||
|
List<HistoricTaskInstance> taskList = taskService.getTaskListByProcessInstanceId(id);
|
||||||
|
if (CollUtil.isEmpty(taskList)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 拼接数据
|
||||||
|
HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id);
|
||||||
|
// 获得 User 和 Dept Map
|
||||||
|
Set<Long> userIds = convertSetByFlatMap(taskList, task ->
|
||||||
|
Stream.of(NumberUtils.parseLong(task.getAssignee()), NumberUtils.parseLong(task.getOwner())));
|
||||||
|
userIds.add(NumberUtils.parseLong(processInstance.getStartUserId()));
|
||||||
|
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
|
||||||
|
Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
|
||||||
|
convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
|
||||||
|
// 获得 Form Map
|
||||||
|
Map<Long, BpmFormDO> formMap = formService.getFormMap(
|
||||||
|
convertSet(taskList, task -> NumberUtils.parseLong(task.getFormKey())));
|
||||||
|
List<BpmTaskRespVO> bpmTaskRespVOS = BpmTaskConvert.INSTANCE.buildTaskListByProcessInstanceId(taskList, processInstance,
|
||||||
|
formMap, userMap, deptMap);
|
||||||
|
return BeanUtils.toBean(bpmTaskRespVOS, BpmTaskRespDTO.class);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ public class BpmProcessInstanceRespVO {
|
|||||||
|
|
||||||
@Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
@Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
private String category;
|
private String category;
|
||||||
|
|
||||||
@Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假")
|
@Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假")
|
||||||
private String categoryName;
|
private String categoryName;
|
||||||
|
|
||||||
|
@ -12,11 +12,11 @@ import lombok.Getter;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum ChargingStandardEnum {
|
public enum ChargingStandardEnum {
|
||||||
//厦建设
|
//厦建设
|
||||||
XIA_BUILDING("xia_building","XB"),
|
XIA_BUILDING("0","xia_building"),
|
||||||
//包干价
|
//包干价
|
||||||
LUMP("lump","LU"),
|
LUMP("1","lump"),
|
||||||
//其他省份
|
//其他省份
|
||||||
OTHER("other","OT");
|
OTHER("2","other");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 类型编号
|
* 类型编号
|
||||||
|
@ -12,15 +12,15 @@ import lombok.Getter;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum ContractStatusEnum {
|
public enum ContractStatusEnum {
|
||||||
//应签未签
|
//应签未签
|
||||||
NO_SIGN("no_sign","NS"),
|
NO_SIGN("0","no_sign"),
|
||||||
//已拟定
|
//已拟定
|
||||||
PREPARED("prepared","PP"),
|
PREPARED("1","prepared"),
|
||||||
//已盖章
|
//已盖章
|
||||||
STAMP("stamp","ST"),
|
STAMP("2","stamp"),
|
||||||
//已签订
|
//已签订
|
||||||
SIGN("sign","SI"),
|
SIGN("3","sign"),
|
||||||
//已终止
|
//已终止
|
||||||
TERMINATION("termination","TE"),;
|
TERMINATION("4","termination"),;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 类型编号
|
* 类型编号
|
||||||
|
@ -12,13 +12,13 @@ import lombok.Getter;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum ContractTypeEnum {
|
public enum ContractTypeEnum {
|
||||||
//勘察设计
|
//勘察设计
|
||||||
SURVEY("survey","KS"),
|
SURVEY("0","survey"),
|
||||||
//检测
|
//检测
|
||||||
DETECTION("detection","JC"),
|
DETECTION("1","detection"),
|
||||||
//总承包合同
|
//总承包合同
|
||||||
GENERAL_CONTRACT("general_contract","GC"),
|
GENERAL_CONTRACT("2","general_contract"),
|
||||||
//全过程咨询
|
//全过程咨询
|
||||||
PROCESS_CONSULTATION("process_consultation","PC");
|
PROCESS_CONSULTATION("3","process_consultation");
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -12,9 +12,9 @@ import lombok.Getter;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum CountTypeEnum {
|
public enum CountTypeEnum {
|
||||||
//费率合同
|
//费率合同
|
||||||
RATE_CONTRACT("rate_contract","RC"),
|
RATE_CONTRACT("0","rate_contract"),
|
||||||
//包干合同
|
//包干合同
|
||||||
RES_CONTRACT("res_contract","RC");
|
RES_CONTRACT("1","res_contract");
|
||||||
/**
|
/**
|
||||||
* 类型编号
|
* 类型编号
|
||||||
*/
|
*/
|
||||||
|
@ -12,15 +12,15 @@ import lombok.Getter;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum OutsContractMajorEnum {
|
public enum OutsContractMajorEnum {
|
||||||
//地勘
|
//地勘
|
||||||
GROUND_SERVICE("ground_service","GE"),
|
GROUND_SERVICE("0","ground_service"),
|
||||||
//景观
|
//景观
|
||||||
SCENERY("scenery","SC"),
|
SCENERY("1","scenery"),
|
||||||
//建筑
|
//建筑
|
||||||
ARCHITECTURE("architecture","AR"),
|
ARCHITECTURE("2","architecture"),
|
||||||
//测量
|
//测量
|
||||||
MEASURE("measure","ME"),
|
MEASURE("3","measure"),
|
||||||
//效果图
|
//效果图
|
||||||
EFFECT_PICTURE("effect_picture","EF");
|
EFFECT_PICTURE("4","effect_picture");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 类型编号
|
* 类型编号
|
||||||
|
@ -12,11 +12,11 @@ import lombok.Getter;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum ProcessStatusEnum {
|
public enum ProcessStatusEnum {
|
||||||
//未执行
|
//未执行
|
||||||
NO_EXECUTION("0","NO_EXECUTION"),
|
NO_EXECUTION("0","no_execution"),
|
||||||
//正在执行
|
//正在执行
|
||||||
EXECUTING("1","EXECUTING"),
|
EXECUTING("1","executing"),
|
||||||
//执行完成
|
//执行完成
|
||||||
COMPLETED("2","COMPLETED");
|
COMPLETED("2","completed");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 类型编号
|
* 类型编号
|
||||||
|
@ -12,11 +12,11 @@ import lombok.Getter;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum SourceEnum {
|
public enum SourceEnum {
|
||||||
//市财政
|
//市财政
|
||||||
MUNICIPAL_FINANCE("municipal_finance","MF"),
|
MUNICIPAL_FINANCE("0","municipal_finance"),
|
||||||
//区财政
|
//区财政
|
||||||
DISTRICT_FINANCE("district_finance","DF"),
|
DISTRICT_FINANCE("1","district_finance"),
|
||||||
//业主自筹
|
//业主自筹
|
||||||
OWNER_FINANCE("owner_finance","OF");
|
OWNER_FINANCE("2","owner_finance");
|
||||||
/**
|
/**
|
||||||
* 类型编号
|
* 类型编号
|
||||||
*/
|
*/
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cn.iocoder.yudao.module.cms.controller.admin.contract;
|
package cn.iocoder.yudao.module.cms.controller.admin.contract;
|
||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractProcessInstanceRespVO;
|
||||||
import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractPageReqVO;
|
import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractPageReqVO;
|
||||||
import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractRespVO;
|
import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractRespVO;
|
||||||
import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractSaveReqVO;
|
import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.ContractSaveReqVO;
|
||||||
@ -39,6 +40,8 @@ public class ContractController {
|
|||||||
@Resource
|
@Resource
|
||||||
private ContractService contractService;
|
private ContractService contractService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
@Operation(summary = "创建合同")
|
@Operation(summary = "创建合同")
|
||||||
@PreAuthorize("@ss.hasPermission('cms:contract:create')")
|
@PreAuthorize("@ss.hasPermission('cms:contract:create')")
|
||||||
@ -92,4 +95,17 @@ public class ContractController {
|
|||||||
ExcelUtils.write(response, "合同.xls", "数据", ContractRespVO.class,
|
ExcelUtils.write(response, "合同.xls", "数据", ContractRespVO.class,
|
||||||
BeanUtils.toBean(list, ContractRespVO.class));
|
BeanUtils.toBean(list, ContractRespVO.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/get_process")
|
||||||
|
@Operation(summary = "查询流程")
|
||||||
|
@Parameter(name = "id", description = "合同id", required = true)
|
||||||
|
@PreAuthorize("@ss.hasPermission('cms:contract:process')")
|
||||||
|
public CommonResult<ContractProcessInstanceRespVO> getContractProcess(@RequestParam("id") Long id) {
|
||||||
|
ContractProcessInstanceRespVO contractProcessInstance = contractService.getContractProcess(id);
|
||||||
|
return success(contractProcessInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
package cn.iocoder.yudao.module.cms.controller.admin.contract.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 流程实例的 Response VO")
|
||||||
|
@Data
|
||||||
|
public class ContractProcessInstanceRespVO {
|
||||||
|
|
||||||
|
@Schema(description = "流程实例的编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private String category;
|
||||||
|
|
||||||
|
@Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private String categoryName;
|
||||||
|
|
||||||
|
@Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
|
||||||
|
|
||||||
|
@Schema(description = "发起时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private LocalDateTime startTime;
|
||||||
|
|
||||||
|
@Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private LocalDateTime endTime;
|
||||||
|
|
||||||
|
@Schema(description = "持续时间", example = "1000")
|
||||||
|
private Long durationInMillis;
|
||||||
|
|
||||||
|
@Schema(description = "提交的表单值", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
private Map<String, Object> formVariables;
|
||||||
|
|
||||||
|
@Schema(description = "业务的唯一标识-例如说,请假申请的编号", example = "1")
|
||||||
|
private String businessKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发起流程的用户
|
||||||
|
*/
|
||||||
|
private User startUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前审批中的任务
|
||||||
|
*/
|
||||||
|
private List<Task> tasks; // 仅在流程实例分页才返回
|
||||||
|
|
||||||
|
@Schema(description = "用户信息")
|
||||||
|
@Data
|
||||||
|
public static class User {
|
||||||
|
|
||||||
|
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
|
private Long id;
|
||||||
|
@Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
|
||||||
|
private String nickname;
|
||||||
|
|
||||||
|
@Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||||
|
private Long deptId;
|
||||||
|
@Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部")
|
||||||
|
private String deptName;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Schema(description = "流程任务")
|
||||||
|
@Data
|
||||||
|
public static class Task {
|
||||||
|
|
||||||
|
@Schema(description = "流程任务的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.cms.service.contract;
|
|||||||
|
|
||||||
import jakarta.validation.*;
|
import jakarta.validation.*;
|
||||||
import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.*;
|
import cn.iocoder.yudao.module.cms.controller.admin.contract.vo.*;
|
||||||
import cn.iocoder.yudao.module.cms.dal.dataobject.contract.ContractDO;
|
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
@ -73,4 +72,10 @@ public interface ContractService {
|
|||||||
void validateContractExists(Long id);
|
void validateContractExists(Long id);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询流程
|
||||||
|
* @param id 合同id
|
||||||
|
*/
|
||||||
|
ContractProcessInstanceRespVO getContractProcess(Long id);
|
||||||
|
|
||||||
}
|
}
|
@ -2,9 +2,12 @@ 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.BpmProcessInstanceCreateReqDTO;
|
||||||
|
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.cms.dal.dataobject.contractHistory.ContractHistoryDO;
|
import cn.iocoder.yudao.module.cms.dal.dataobject.contractHistory.ContractHistoryDO;
|
||||||
import cn.iocoder.yudao.module.cms.dal.mysql.contract.ContractMapper;
|
import cn.iocoder.yudao.module.cms.dal.mysql.contract.ContractMapper;
|
||||||
import cn.iocoder.yudao.module.cms.dal.mysql.contractHistory.ContractHistoryMapper;
|
import cn.iocoder.yudao.module.cms.dal.mysql.contractHistory.ContractHistoryMapper;
|
||||||
|
import cn.iocoder.yudao.module.cms.enums.ContractTypeEnum;
|
||||||
import cn.iocoder.yudao.module.pms.api.ProjectApi;
|
import cn.iocoder.yudao.module.pms.api.ProjectApi;
|
||||||
import cn.iocoder.yudao.module.pms.api.project.dto.ProjectDetailRespDTO;
|
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.api.project.dto.ProjectRespDTO;
|
||||||
@ -61,6 +64,9 @@ public class ContractServiceImpl implements ContractService {
|
|||||||
@Resource
|
@Resource
|
||||||
private ContractHistoryMapper contractHistoryMapper;
|
private ContractHistoryMapper contractHistoryMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BpmProcessInstanceApi bpmProcessInstanceApi;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long createContract(Long loginUserId, ContractSaveReqVO createReqVO) {
|
public Long createContract(Long loginUserId, ContractSaveReqVO createReqVO) {
|
||||||
|
|
||||||
@ -83,7 +89,6 @@ public class ContractServiceImpl implements ContractService {
|
|||||||
ProjectDetailRespDTO projectDetail = projectApi.getProjectDetailById(projectId);
|
ProjectDetailRespDTO projectDetail = projectApi.getProjectDetailById(projectId);
|
||||||
|
|
||||||
|
|
||||||
//todo 待提取
|
|
||||||
String code = createReqVO.getCode();
|
String code = createReqVO.getCode();
|
||||||
String trackingDep = createReqVO.getTrackingDep();
|
String trackingDep = createReqVO.getTrackingDep();
|
||||||
String projectManager = createReqVO.getProjectManager();
|
String projectManager = createReqVO.getProjectManager();
|
||||||
@ -224,6 +229,8 @@ public class ContractServiceImpl implements ContractService {
|
|||||||
contractRespVO.setTrackingDep(projectDetail.getTrackingDepName());
|
contractRespVO.setTrackingDep(projectDetail.getTrackingDepName());
|
||||||
contractRespVO.setProjectManager(projectDetail.getProjectManagerName());
|
contractRespVO.setProjectManager(projectDetail.getProjectManagerName());
|
||||||
|
|
||||||
|
// TODO 枚举优化
|
||||||
|
contractRespVO.setType(ContractTypeEnum.getNoByCode(contractRespVO.getType()));
|
||||||
//分包合同商议提示 TODO 待优化
|
//分包合同商议提示 TODO 待优化
|
||||||
// ExtContractDO extContractDO = extContractMapper.selectOne("project_id", projectId);
|
// ExtContractDO extContractDO = extContractMapper.selectOne("project_id", projectId);
|
||||||
// LocalDateTime reminderTime = extContractDO.getReminderTime();
|
// LocalDateTime reminderTime = extContractDO.getReminderTime();
|
||||||
@ -265,6 +272,36 @@ public class ContractServiceImpl implements ContractService {
|
|||||||
return pageResult;
|
return pageResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ContractProcessInstanceRespVO getContractProcess(Long id) {
|
||||||
|
validateContractExists(id);
|
||||||
|
//去历史里面找
|
||||||
|
ContractHistoryDO contractHistory = contractHistoryMapper.selectOne("contract_id", id);
|
||||||
|
if (contractHistory == null) {
|
||||||
|
throw exception(CONTRACT_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
//拿到历史之后 找到process_instance_id 和 status
|
||||||
|
String processInstanceId = contractHistory.getProcessInstanceId();
|
||||||
|
String processStatus = contractHistory.getProcessStatus();
|
||||||
|
//与当前流程里的进行比较
|
||||||
|
String status = String.valueOf(bpmProcessInstanceApi.getProcessInstance(processInstanceId).getStatus());
|
||||||
|
|
||||||
|
//如果不相等
|
||||||
|
if (!status.equals(processStatus)){
|
||||||
|
//更新当前合同对应历史表里面的状态
|
||||||
|
contractHistory.setProcessStatus(status);
|
||||||
|
contractHistoryMapper.updateById(contractHistory);
|
||||||
|
}
|
||||||
|
//返回给前端必要的数据 当前流程里面对应的数据
|
||||||
|
BpmProcessInstanceRespDTO processInstance = bpmProcessInstanceApi.getProcessInstance(processInstanceId);
|
||||||
|
List<BpmTaskRespDTO> tasks = bpmProcessInstanceApi.getTask(processInstanceId);
|
||||||
|
List<BpmProcessInstanceRespDTO.Task> taskList = BeanUtils.toBean(tasks, BpmProcessInstanceRespDTO.Task.class);
|
||||||
|
processInstance.setTasks(taskList);
|
||||||
|
|
||||||
|
return BeanUtils.toBean(processInstance, ContractProcessInstanceRespVO.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BigDecimal getProvisionalSettlementById(Long id) {
|
public BigDecimal getProvisionalSettlementById(Long id) {
|
||||||
ContractDO contractDO = contractMapper.selectById(id);
|
ContractDO contractDO = contractMapper.selectById(id);
|
||||||
|
@ -95,6 +95,7 @@ public class ContractHistoryServiceImpl implements cn.iocoder.yudao.module.cms.s
|
|||||||
// 6.分包合同商议提示 √
|
// 6.分包合同商议提示 √
|
||||||
// 7.暂定结算数 √
|
// 7.暂定结算数 √
|
||||||
|
|
||||||
|
// TODO 枚举优化
|
||||||
ProjectRespDTO project = projectApi.getProject(projectId);
|
ProjectRespDTO project = projectApi.getProject(projectId);
|
||||||
contractHistoryRespVO.setCode(project.getCode());
|
contractHistoryRespVO.setCode(project.getCode());
|
||||||
contractHistoryRespVO.setDrawingCompany(project.getDrawingCompany());
|
contractHistoryRespVO.setDrawingCompany(project.getDrawingCompany());
|
||||||
|
@ -102,7 +102,7 @@ public class ExtContractServiceImpl implements ExtContractService {
|
|||||||
// 5.合同总金额 √
|
// 5.合同总金额 √
|
||||||
// 6.合同商议提示(和分包提示不一样)√
|
// 6.合同商议提示(和分包提示不一样)√
|
||||||
|
|
||||||
//todo 待提取
|
//todo 待提取 枚举优化
|
||||||
String code = createReqVO.getCode();
|
String code = createReqVO.getCode();
|
||||||
String trackingDep = createReqVO.getTrackingDep();
|
String trackingDep = createReqVO.getTrackingDep();
|
||||||
String projectManager = createReqVO.getProjectManager();
|
String projectManager = createReqVO.getProjectManager();
|
||||||
|
@ -104,7 +104,7 @@ public class ExtContractHistoryServiceImpl implements ExtContractHistoryService
|
|||||||
CustomerCompanyDO customerCompanyDO = customerCompanyMapper.selectById(customerCompanyId);
|
CustomerCompanyDO customerCompanyDO = customerCompanyMapper.selectById(customerCompanyId);
|
||||||
String name = customerCompanyDO.getName();
|
String name = customerCompanyDO.getName();
|
||||||
HistoryResp.setCustomerCompanyName(name);
|
HistoryResp.setCustomerCompanyName(name);
|
||||||
|
// TODO 枚举优化
|
||||||
|
|
||||||
//合同总金额
|
//合同总金额
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ public class OutsContractServiceImpl implements OutsContractService {
|
|||||||
// 3.项目经理 √
|
// 3.项目经理 √
|
||||||
// 4.签订合同总额 √
|
// 4.签订合同总额 √
|
||||||
|
|
||||||
//todo 待提取
|
//todo 待提取 枚举优化
|
||||||
String name = createReqVO.getName();
|
String name = createReqVO.getName();
|
||||||
String trackingDep = createReqVO.getTrackingDep();
|
String trackingDep = createReqVO.getTrackingDep();
|
||||||
String projectManager = createReqVO.getProjectManager();
|
String projectManager = createReqVO.getProjectManager();
|
||||||
|
@ -65,7 +65,7 @@ public class OutsContractHistoryServiceImpl implements OutsContractHistoryServic
|
|||||||
OutsContractHistoryRespVO outsContractHistoryResp = BeanUtils.toBean(outsContractHistoryDO, OutsContractHistoryRespVO.class);
|
OutsContractHistoryRespVO outsContractHistoryResp = BeanUtils.toBean(outsContractHistoryDO, OutsContractHistoryRespVO.class);
|
||||||
Long contractId = outsContractHistoryResp.getContractId();
|
Long contractId = outsContractHistoryResp.getContractId();
|
||||||
ContractRespVO contract = contractService.getContract(contractId);
|
ContractRespVO contract = contractService.getContract(contractId);
|
||||||
|
// TODO 枚举优化
|
||||||
outsContractHistoryResp.setName(contract.getName());
|
outsContractHistoryResp.setName(contract.getName());
|
||||||
outsContractHistoryResp.setTrackingDep(contract.getTrackingDep());
|
outsContractHistoryResp.setTrackingDep(contract.getTrackingDep());
|
||||||
outsContractHistoryResp.setProjectManager(contract.getProjectManager());
|
outsContractHistoryResp.setProjectManager(contract.getProjectManager());
|
||||||
|
Loading…
Reference in New Issue
Block a user