|
|
@@ -0,0 +1,387 @@
|
|
|
+package com.ruoyi.flowable.service.impl;
|
|
|
+
|
|
|
+import com.ruoyi.common.core.domain.AjaxResult;
|
|
|
+import com.ruoyi.common.core.domain.entity.SysUser;
|
|
|
+import com.ruoyi.common.enums.FileType;
|
|
|
+import com.ruoyi.common.utils.DateUtils;
|
|
|
+import com.ruoyi.common.utils.SecurityUtils;
|
|
|
+import com.ruoyi.common.utils.StringUtils;
|
|
|
+import com.ruoyi.common.utils.sms.SmsSenderUtils;
|
|
|
+import com.ruoyi.common.utils.uuid.IdUtils;
|
|
|
+import com.ruoyi.flowable.common.constant.ProcessConstants;
|
|
|
+import com.ruoyi.flowable.common.constant.UUIDGenerator;
|
|
|
+import com.ruoyi.flowable.common.enums.FlowStatusEnum;
|
|
|
+import com.ruoyi.flowable.factory.FlowServiceFactory;
|
|
|
+import com.ruoyi.flowable.service.IApprovalService;
|
|
|
+import com.ruoyi.flowable.service.IDecisionService;
|
|
|
+import com.ruoyi.flowable.service.IFlowInstanceService;
|
|
|
+import com.ruoyi.flowable.service.IFlowService;
|
|
|
+import com.ruoyi.invest.domain.*;
|
|
|
+import com.ruoyi.invest.domain.vo.ProjectApprovalVo;
|
|
|
+import com.ruoyi.invest.domain.vo.ProjectDecisionVo;
|
|
|
+import com.ruoyi.invest.mapper.ApprovalMapper;
|
|
|
+import com.ruoyi.invest.mapper.DecisionMapper;
|
|
|
+import com.ruoyi.invest.mapper.TProjectPoolMapper;
|
|
|
+import com.ruoyi.invest.mapper.TProjectScoringMapper;
|
|
|
+import com.ruoyi.invest.service.*;
|
|
|
+import com.ruoyi.system.mapper.SysDeptMapper;
|
|
|
+import com.ruoyi.system.service.ISysUserService;
|
|
|
+import com.ruoyi.tool.service.ITUnifyFileService;
|
|
|
+import org.flowable.engine.repository.ProcessDefinition;
|
|
|
+import org.flowable.engine.runtime.ProcessInstance;
|
|
|
+import org.flowable.task.api.Task;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 项目池Service业务层处理
|
|
|
+ *
|
|
|
+ * @author ruoyi
|
|
|
+ * @date 2024-02-21
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class DecisionServiceImpl extends FlowServiceFactory implements IDecisionService
|
|
|
+{
|
|
|
+ @Autowired
|
|
|
+ private DecisionMapper decisionMapper;
|
|
|
+ @Autowired
|
|
|
+ private ITProjectDecisionService tProjectDecisionService;
|
|
|
+ @Autowired
|
|
|
+ private TProjectPoolMapper tProjectPoolMapper;
|
|
|
+ @Autowired
|
|
|
+ private ITProjectPoolService tProjectPoolService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ITProjectCompanyService tProjectCompanyService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ITProjectContactsService tProjectContactsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ITProjectCirculationService tProjectCirculationService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ITUnifyFileService tUnifyFileService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IFlowBaseInfoService activitiBaseInfoService;
|
|
|
+ @Autowired
|
|
|
+ private IFlowInstanceService flowInstanceService;
|
|
|
+ @Autowired
|
|
|
+ private ISysUserService sysUserService;
|
|
|
+ @Autowired
|
|
|
+ private SysDeptMapper sysDeptMapper;
|
|
|
+ @Autowired
|
|
|
+ private ITProjectReviewService tProjectReviewService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IFlowService flowService;
|
|
|
+ @Autowired
|
|
|
+ private ITProjectMeetingService tProjectMeetingService;
|
|
|
+ @Autowired
|
|
|
+ private ITProjectScoringService tProjectScoringService;
|
|
|
+ @Autowired
|
|
|
+ private TProjectScoringMapper tProjectScoringMapper;
|
|
|
+ @Override
|
|
|
+ public List<ProjectDecisionVo> getMyTaskList(String userId, TProjectDecision tProjectDecision){
|
|
|
+ return decisionMapper.getMyTaskList(userId, tProjectDecision);
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public List<ProjectDecisionVo> getMyDoneTaskList(String userId, TProjectDecision tProjectDecision){
|
|
|
+ return decisionMapper.getMyDoneTaskList(userId, tProjectDecision);
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public List<ProjectDecisionVo> getMyList(String userId,TProjectDecision tProjectDecision){
|
|
|
+ return decisionMapper.getMyList(userId, tProjectDecision);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询项目池
|
|
|
+ *
|
|
|
+ * @param pInstId 流程实例Id
|
|
|
+ * @return 项目池
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TProjectDecision selectTProjectDecisionByProcInstId(String pInstId)
|
|
|
+ {
|
|
|
+ return decisionMapper.selectTProjectDecisionByProcInstId(pInstId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public AjaxResult start(TProjectDecision tProjectDecision) {
|
|
|
+
|
|
|
+ // 根据key值获取最新的流程部署id
|
|
|
+ String pDefId = null;
|
|
|
+ ProcessInstance pInst = null;
|
|
|
+ try {
|
|
|
+ List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
|
|
|
+ .processDefinitionKey("dgt-decision-workflow")
|
|
|
+ .orderByProcessDefinitionVersion().desc().list();
|
|
|
+ if(list.size()==0){
|
|
|
+ return AjaxResult.error("未找到该流程,无法开启流程!");
|
|
|
+ }
|
|
|
+ pDefId = list.get(0).getId();
|
|
|
+ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pDefId)
|
|
|
+ .latestVersion().singleResult();
|
|
|
+ if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
|
|
|
+ return AjaxResult.error("流程已被挂起,请先激活流程");
|
|
|
+ }
|
|
|
+ if(StringUtils.isNotBlank(pDefId)){
|
|
|
+
|
|
|
+ //设置参数
|
|
|
+ Map<String, Object> formProperties = new HashMap<String, Object>();
|
|
|
+ // 设置流程发起人Id到流程中
|
|
|
+ SysUser sysUser = SecurityUtils.getLoginUser().getUser();
|
|
|
+ identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
|
|
|
+ formProperties.put("auditPass",tProjectDecision.isFlag()?true:false);
|
|
|
+ //暂存
|
|
|
+ formProperties.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
|
|
|
+ //投资部负责人
|
|
|
+ String leader=sysDeptMapper.selectDeptLeader("投资部");
|
|
|
+ formProperties.put("MANAGER",sysUserService.selectUserByUserName(leader).getUserId());
|
|
|
+ pInst = runtimeService.startProcessInstanceById(pDefId, formProperties);
|
|
|
+ // ProcessInstance p = runtimeService.startProcessInstanceById(procDefId, variables);
|
|
|
+ if(pInst!=null){
|
|
|
+ String nickName= SecurityUtils.getLoginUser().getUser().getNickName();
|
|
|
+ String userId=SecurityUtils.getLoginUser().getUserId().toString();
|
|
|
+ //保存信息
|
|
|
+ tProjectDecision.setId(IdUtils.fastSimpleUUID());
|
|
|
+ tProjectDecision.setProcInstId(pInst.getProcessInstanceId());
|
|
|
+ tProjectDecision.setCreateBy(userId);
|
|
|
+
|
|
|
+ // todo 保存投决资料
|
|
|
+ tUnifyFileService.insertTUnifyFileList(tProjectDecision.getListFile(),
|
|
|
+ tProjectDecision.getProjectPoolId(),
|
|
|
+ tProjectDecision.getId(),
|
|
|
+ String.valueOf(FileType.DECISION.ordinal()),
|
|
|
+ nickName);
|
|
|
+
|
|
|
+ // todo 更改投决状态
|
|
|
+ tProjectPoolService.updateTProjectPoolByDecisionFlag(tProjectDecision.getProjectPoolId(),"1");
|
|
|
+
|
|
|
+ // todo 短信提醒
|
|
|
+ /*if(StringUtils.isNotEmpty(tProjectDecision.getParticipantsId())){
|
|
|
+ StringUtils.str2List(tProjectDecision.getParticipantsId(),",",true,true).stream().forEach(str -> {
|
|
|
+ SysUser user = sysUserService.selectUserById(Long.valueOf(str));
|
|
|
+ String contents = "您好,"+user.getNickName()+"," + tProjectDecision.getProjectName() + "已发起投决申请。";
|
|
|
+ try {
|
|
|
+ SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
|
|
|
+ } catch (IOException e) {
|
|
|
+ logger.error("短信发送失败"+e.getMessage());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }*/
|
|
|
+
|
|
|
+ // todo 增加项目创建记录
|
|
|
+ tProjectCirculationService.insertTProjectCirculation(tProjectDecision.getProjectPoolId(),"投决申请",nickName);
|
|
|
+
|
|
|
+ tProjectDecisionService.insertTProjectDecision(tProjectDecision);
|
|
|
+
|
|
|
+
|
|
|
+ FlowBaseInfo flowBaseInfo = new FlowBaseInfo();
|
|
|
+ flowBaseInfo.setCreateBy(userId);
|
|
|
+ flowBaseInfo.setId(UUIDGenerator.uuid());
|
|
|
+ flowBaseInfo.setFormProperties(flowInstanceService.getFormProperties(pInst));
|
|
|
+ flowBaseInfo.setProcDefId(pDefId);
|
|
|
+ flowBaseInfo.setProcInsId(pInst.getId());
|
|
|
+ flowBaseInfo.setTaskName("申请人");
|
|
|
+ flowBaseInfo.setFlag(true);
|
|
|
+ flowBaseInfo.setComment("[提交申请]");
|
|
|
+ flowBaseInfo.setStatus(FlowStatusEnum.STARTED.getName());
|
|
|
+
|
|
|
+ activitiBaseInfoService.addActivitiBaseInfo(flowBaseInfo);
|
|
|
+ TProjectPool tProjectPool=new TProjectPool();
|
|
|
+ tProjectPool.setId(tProjectDecision.getProjectPoolId());
|
|
|
+ tProjectPool.setProjectStage("5");//项目阶段-项目投决
|
|
|
+ tProjectPool.setProjectState("h");//项目状态-准备项目投决材料
|
|
|
+ tProjectPoolService.updateTProjectPool(tProjectPool);
|
|
|
+ return AjaxResult.success();
|
|
|
+ }
|
|
|
+ return AjaxResult.error();
|
|
|
+ }
|
|
|
+ return AjaxResult.error();
|
|
|
+ } catch (Exception e) {
|
|
|
+ /*res.put("status",false);
|
|
|
+ res.put("msg", "流程定义id为空, 无法开启流程!");*/
|
|
|
+ e.printStackTrace();
|
|
|
+ return AjaxResult.error("msg", "流程定义id为空, 无法开启流程!");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public AjaxResult complete(TProjectDecision tProjectDecision, TProjectMeeting tProjectMeeting,TProjectScoring tProjectScoring, FlowBaseInfo flow,HttpServletRequest request){
|
|
|
+ //Task task=taskService.createTaskQuery().processInstanceId(tProjectApproval.getProcInstId()).singleResult();
|
|
|
+ Task task = taskService.createTaskQuery().taskId(flow.getTaskId()).singleResult();
|
|
|
+ if (Objects.isNull(task)) {
|
|
|
+ return AjaxResult.error("任务不存在");
|
|
|
+ }
|
|
|
+ //当前你登录人
|
|
|
+ SysUser userInfo=SecurityUtils.getLoginUser().getUser();
|
|
|
+ Map<String, Object> rs = new HashMap<String, Object>();
|
|
|
+ rs.put("status",true);
|
|
|
+ Map<String, Object> formProperties = new HashMap<>();
|
|
|
+ formProperties.put("auditPass", tProjectDecision.isFlag());
|
|
|
+ //会议投决人
|
|
|
+ if("meeting".equals(task.getTaskDefinitionKey())) {
|
|
|
+ //立项审批人
|
|
|
+ List<String> userIds = Arrays.asList(tProjectDecision.getParticipantsId().split(","));
|
|
|
+ //List<String> userIds = Arrays.asList(tProjectMeeting.getParticipantsId().split(","));//会议人
|
|
|
+ formProperties.put("decisionList", userIds);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> fpMap = flowService.getFormProperties(task.getProcessDefinitionId(), task.getId());
|
|
|
+ try {
|
|
|
+ rs = flowService.taskComplete( task.getId(), tProjectDecision.isFlag(), formProperties, userInfo.getUserId().toString());
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ rs.put("status", false);
|
|
|
+ rs.put("msg", "流程审批失败");
|
|
|
+ }
|
|
|
+ boolean status = (boolean) rs.get("status");
|
|
|
+ // 审核成功, 则记录审核信息
|
|
|
+ if (status) {
|
|
|
+ TProjectPool tProjectPool=new TProjectPool();
|
|
|
+ tProjectPool.setId(tProjectDecision.getProjectPoolId());
|
|
|
+ //发起会议
|
|
|
+ if ("meeting".equals(task.getTaskDefinitionKey())) {
|
|
|
+ tProjectMeeting.setId(IdUtils.fastSimpleUUID());
|
|
|
+ tProjectMeeting.setCreateBy(userInfo.getNickName());
|
|
|
+ tProjectMeeting.setProjectPoolId(tProjectDecision.getProjectPoolId());
|
|
|
+ if(tProjectMeeting.getMeetingType().equals("LX")||tProjectMeeting.getMeetingType().equals("TJ")){
|
|
|
+ int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.lastTwoDigits()+"-");
|
|
|
+ tProjectMeeting.setMeetingCode(tProjectMeeting.getProjectGroup()+"-"+ DateUtils.lastTwoDigits() +"-"+tProjectMeeting.getMeetingType()+"-"+ String.format("%03d",number+1));
|
|
|
+ }else{
|
|
|
+ int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.dateTimeNow("YYYY"));
|
|
|
+ tProjectMeeting.setMeetingCode(DateUtils.dateNow()+ String.format("%03d",number+1));
|
|
|
+ }
|
|
|
+ // todo 保存附件信息
|
|
|
+ tUnifyFileService.insertTUnifyFileList(tProjectMeeting.getListFile(),
|
|
|
+ tProjectMeeting.getProjectPoolId(),
|
|
|
+ tProjectMeeting.getId(),//会议ID
|
|
|
+ String.valueOf(FileType.MEETING.ordinal()),//文件类型:会议
|
|
|
+ userInfo.getNickName());
|
|
|
+
|
|
|
+ // todo 增加会议创建记录
|
|
|
+ tProjectCirculationService.insertTProjectCirculation(tProjectMeeting.getProjectPoolId(),tProjectMeeting.getMeetingTheme()+"(会议)",userInfo.getNickName());
|
|
|
+
|
|
|
+ // todo 发送短信-参与人-发起人
|
|
|
+ if(tProjectMeeting.getMeetingType().equals("LX") || tProjectMeeting.getMeetingType().equals("TJ")){
|
|
|
+ // todo 参与人
|
|
|
+ /*if(StringUtils.isNotEmpty(tProjectMeeting.getParticipantsId())){
|
|
|
+ StringUtils.str2List(tProjectMeeting.getParticipantsId(),",",true,true).stream().forEach(str -> {
|
|
|
+ SysUser user = sysUserService.selectUserById(Long.valueOf(str));
|
|
|
+ String contents = "您好," + user.getNickName() + ",兹定于 " +
|
|
|
+ DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
|
|
|
+ "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
|
|
|
+ try {
|
|
|
+ SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
|
|
|
+ } catch (IOException e) {
|
|
|
+ logger.error("短信发送失败"+e.getMessage());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }*/
|
|
|
+
|
|
|
+ // todo 发起人
|
|
|
+ /*if(StringUtils.isNotEmpty(tProjectMeeting.getPromoterId())){
|
|
|
+ SysUser user = sysUserService.selectUserById(Long.valueOf(tProjectMeeting.getPromoterId()));
|
|
|
+ String contents = "您好," + user.getNickName() + ",兹定于 " +
|
|
|
+ DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
|
|
|
+ "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
|
|
|
+ try {
|
|
|
+ SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
|
|
|
+ } catch (IOException e) {
|
|
|
+ logger.error("短信发送失败"+e.getMessage());
|
|
|
+ }
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+
|
|
|
+ tProjectMeetingService.insertTProjectMeeting(tProjectMeeting);
|
|
|
+ }
|
|
|
+ //上传打分表
|
|
|
+ if("decision".equals(task.getTaskDefinitionKey())){
|
|
|
+ tProjectScoring.setCreateBy(userInfo.getNickName());
|
|
|
+ tProjectScoring.setProjectPoolId(tProjectDecision.getProjectPoolId());
|
|
|
+ // todo 增加项目创建记录
|
|
|
+ tProjectCirculationService.insertTProjectCirculation(tProjectScoring.getProjectPoolId(),"上传打分表", userInfo.getNickName());
|
|
|
+
|
|
|
+ tProjectScoringService.insertTProjectScoring(tProjectScoring);
|
|
|
+ }
|
|
|
+ if("president".equals(task.getTaskDefinitionKey())){
|
|
|
+ tProjectPool.setProjectStage("5");//项目阶段-项目投决
|
|
|
+ tProjectPool.setProjectState("i");//项目状态-项目投决通过
|
|
|
+ tProjectPool.setProjectDate(new Date());//立项通过日期
|
|
|
+ }
|
|
|
+ //FlowBaseInfo flow = new FlowBaseInfo();
|
|
|
+ if(flow==null){
|
|
|
+ flow = new FlowBaseInfo();
|
|
|
+ }
|
|
|
+ flow.setId(UUIDGenerator.uuid());
|
|
|
+ flow.setFormProperties(flowService.getFormProperties(fpMap, request.getParameterMap()));
|
|
|
+ flow.setStatus(FlowStatusEnum.RUNNING.getName());
|
|
|
+ flow.setProcDefId(task.getProcessDefinitionId());
|
|
|
+ flow.setProcInsId(task.getProcessInstanceId());
|
|
|
+ flow.setTaskDefKey(task.getTaskDefinitionKey());
|
|
|
+ String isOk = tProjectDecision.isFlag() ? "[同意]" : "[驳回]";
|
|
|
+ if ("modifyApply".equals(task.getTaskDefinitionKey())) {
|
|
|
+ //tProjectPool.setStatus(tProjectPool.isFlag() ? 1 : 4);
|
|
|
+ isOk = tProjectDecision.isFlag() ? "[提交]" : "[关闭]";
|
|
|
+ } else {
|
|
|
+ //tProjectPool.setStatus(tProjectPool.isFlag() ? 2 : 0);
|
|
|
+ }
|
|
|
+ if (null != flow.getComment()) {
|
|
|
+ flow.setComment(isOk + flow.getComment());
|
|
|
+ } else {
|
|
|
+ flow.setComment(isOk);
|
|
|
+ }
|
|
|
+ flow.setTaskName(task.getName());
|
|
|
+ flow.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString());
|
|
|
+
|
|
|
+ ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).active().singleResult();
|
|
|
+ // 表示流程已经审批结束了
|
|
|
+ if (processInstance == null) {
|
|
|
+ flow.setStatus(FlowStatusEnum.ENDED.getName());
|
|
|
+ if (!"modifyApply".equals(task.getTaskDefinitionKey())) {
|
|
|
+ tProjectPool.setProjectStage("6");//项目阶段-项目终止
|
|
|
+ tProjectPool.setProjectState("j");//项目状态-签约协议沟通中
|
|
|
+ tProjectPool.setUpdateBy(userInfo.getNickName());
|
|
|
+ tProjectPoolService.updateTProjectPool(tProjectPool);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tProjectDecisionService.updateTProjectDecision(tProjectDecision);
|
|
|
+ activitiBaseInfoService.addActivitiBaseInfo(flow);
|
|
|
+ }
|
|
|
+ return AjaxResult.success();
|
|
|
+ }
|
|
|
+ public TProjectMeeting selectTProjectMeetingByProcInstId(String pInstId){
|
|
|
+ TProjectDecision tProjectDecision=this.selectTProjectDecisionByProcInstId(pInstId);
|
|
|
+ TProjectMeeting tProjectMeeting=null;
|
|
|
+ if(tProjectDecision!=null){
|
|
|
+ tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectDecision.getProjectPoolId());
|
|
|
+ }
|
|
|
+ return tProjectMeeting;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 根据流程Id查询汇总分数和平均分数
|
|
|
+ * @param pInstId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<String, String> selectSumScore(String pInstId) {
|
|
|
+ TProjectDecision tProjectDecision=this.selectTProjectDecisionByProcInstId(pInstId);
|
|
|
+ Map<String, String> sumScore=new HashMap<>();
|
|
|
+ if(tProjectDecision!=null){
|
|
|
+ TProjectMeeting tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectDecision.getProjectPoolId());
|
|
|
+ sumScore=tProjectScoringMapper.selectMeetingId(tProjectMeeting.getId());
|
|
|
+ }
|
|
|
+ return sumScore;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|