@@ -26,6 +26,7 @@ public class ProjectReviewResultBuilder { | |||
prr.setOtherAdvices(mip.getOtherAdvices()); | |||
prr.setTechFeasibility(mip.getTechFeasibility()); | |||
prr.setNeedRationality(mip.getNeedRationality()); | |||
prr.setAttachFiles(mip.getAttachFiles()); | |||
return prr; | |||
} | |||
@@ -38,6 +39,7 @@ public class ProjectReviewResultBuilder { | |||
prr.setOtherAdvices(mop.getOtherAdvices()); | |||
prr.setTechFeasibility(mop.getTechFeasibility()); | |||
prr.setNeedRationality(mop.getNeedRationality()); | |||
prr.setAttachFiles(mop.getAttachFiles()); | |||
return prr; | |||
} | |||
@@ -203,6 +203,13 @@ public class MeetingController { | |||
meetingManage.uploadMeetingResult(req); | |||
} | |||
@GetMapping("/{meetingId}/result/detail") | |||
@ApiOperation("会议结果详情") | |||
@WebLog("会议结详情") | |||
public void uploadMeetingResult(@PathVariable Long meetingId) { | |||
meetingManage.meetingResultDetail(meetingId); | |||
} | |||
@PostMapping("/project/result/upload") | |||
@ApiOperation("评审结果上传") | |||
@WebLog("评审结果上传") | |||
@@ -3,11 +3,10 @@ package com.hz.pm.api.meeting.controller; | |||
import com.hz.pm.api.meeting.entity.enumeration.MeetingSettingsTypeEnum; | |||
import com.hz.pm.api.meeting.entity.req.MeetingSettingsSaveReq; | |||
import com.hz.pm.api.meeting.manage.MeetingSettingsManage; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.AllArgsConstructor; | |||
import org.springframework.web.bind.annotation.GetMapping; | |||
import org.springframework.web.bind.annotation.PathVariable; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RestController; | |||
import org.springframework.web.bind.annotation.*; | |||
/** | |||
* <p> | |||
@@ -17,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController; | |||
* @author WendyYang | |||
* @since 2023-12-27 | |||
*/ | |||
@Api(tags = "会议配置管理") | |||
@RestController | |||
@AllArgsConstructor | |||
@RequestMapping("/api/v1/meeting/settings") | |||
@@ -25,9 +25,15 @@ public class MeetingSettingsController { | |||
private final MeetingSettingsManage meetingSettingsManage; | |||
@GetMapping("/{settingsType}") | |||
@ApiOperation("获取配置详情") | |||
public MeetingSettingsSaveReq getSettings(@PathVariable MeetingSettingsTypeEnum settingsType) { | |||
return meetingSettingsManage.getSettings(settingsType); | |||
} | |||
@PostMapping("/save") | |||
@ApiOperation("保存配置") | |||
public void saveSettings(@RequestBody MeetingSettingsSaveReq req) { | |||
meetingSettingsManage.saveSettings(req); | |||
} | |||
} |
@@ -58,6 +58,8 @@ public class MeetingInnerProject implements Serializable { | |||
@ApiModelProperty("建议资金(单位:万元)") | |||
private BigDecimal suggestedFunding; | |||
private String attachFiles; | |||
@TableField(fill = FieldFill.INSERT_UPDATE) | |||
private LocalDateTime updateOn; | |||
@@ -64,6 +64,8 @@ public class MeetingOuterProject implements Serializable { | |||
@ApiModelProperty("建议资金(单位:万元)") | |||
private BigDecimal suggestedFunding; | |||
private String attachFiles; | |||
@ApiModelProperty("会议ID") | |||
private Long meetingId; | |||
@@ -13,7 +13,7 @@ import java.time.LocalTime; | |||
* @since 00:27 2023/12/27 | |||
*/ | |||
@Data | |||
public class ExpertInviteIgnoreTimeContentDTO { | |||
public class InviteCallIgnoreTimeContentDTO { | |||
private LocalTime startTime; | |||
@@ -67,6 +67,7 @@ public class MeetingBasicDTO { | |||
private String contact; | |||
@ApiModelProperty("是否是系统内部项目") | |||
@NotNull(message = "是否系统内项目不能为空") | |||
private Boolean isInnerProject; | |||
@ApiModelProperty("内部项目ID") | |||
@@ -37,4 +37,6 @@ public class ProjectReviewResultDTO { | |||
@ApiModelProperty("建议资金(单位:万元)") | |||
private BigDecimal suggestedFunding; | |||
private String attachFiles; | |||
} |
@@ -1,5 +1,7 @@ | |||
package com.hz.pm.api.meeting.entity.enumeration; | |||
import com.hz.pm.api.meeting.entity.dto.ExpertJudgeTimeLimitContentDTO; | |||
import com.hz.pm.api.meeting.entity.dto.InviteCallIgnoreTimeContentDTO; | |||
import lombok.AllArgsConstructor; | |||
import lombok.Getter; | |||
@@ -15,9 +17,11 @@ import lombok.Getter; | |||
@AllArgsConstructor | |||
public enum MeetingSettingsTypeEnum { | |||
MEETING_INVITE_IGNORE_TIME("专家抽取免打扰时段配置"), | |||
EXPERT_JUDGE_TIME_LIMIT("专家星级评分时间配置"); | |||
INVITE_CALL_IGNORE_TIME("专家抽取免打扰时段配置", InviteCallIgnoreTimeContentDTO.class), | |||
SMS_SEND_IGNORE_TIME("短信发送免打扰时间段", InviteCallIgnoreTimeContentDTO.class), | |||
EXPERT_JUDGE_TIME_LIMIT("专家星级评分时间配置", ExpertJudgeTimeLimitContentDTO.class); | |||
private final String name; | |||
private final Class<?> contentClass; | |||
} |
@@ -1,6 +1,6 @@ | |||
package com.hz.pm.api.meeting.entity.req; | |||
import com.hz.pm.api.meeting.entity.dto.ExpertInviteIgnoreTimeContentDTO; | |||
import com.hz.pm.api.meeting.entity.dto.InviteCallIgnoreTimeContentDTO; | |||
import com.hz.pm.api.meeting.entity.dto.ExpertJudgeTimeLimitContentDTO; | |||
import com.hz.pm.api.meeting.entity.enumeration.MeetingSettingsTypeEnum; | |||
import io.swagger.annotations.ApiModelProperty; | |||
@@ -32,7 +32,7 @@ public class MeetingSettingsSaveReq { | |||
public static class SettingsContentPackageDTO { | |||
@ApiModelProperty("专家邀请免打扰时段设置") | |||
private ExpertInviteIgnoreTimeContentDTO expertInviteIgnoreTimeContent; | |||
private InviteCallIgnoreTimeContentDTO expertInviteIgnoreTimeContent; | |||
@ApiModelProperty("专家评价时间设置") | |||
private ExpertJudgeTimeLimitContentDTO expertJudgeTimeLimitContent; | |||
@@ -0,0 +1,52 @@ | |||
package com.hz.pm.api.meeting.entity.req; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import javax.validation.constraints.NotNull; | |||
import java.math.BigDecimal; | |||
/** | |||
* <p> | |||
* MeetingResultUploadReq | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 15:35 2023/12/18 | |||
*/ | |||
@Data | |||
public class ProjectReviewResultUploadReq { | |||
@ApiModelProperty("会议ID") | |||
@NotNull(message = "会议ID不能为空") | |||
private Long meetingId; | |||
@ApiModelProperty("项目关联会议ID") | |||
@NotNull(message = "项目关联会议ID不能为空") | |||
private Long meetingProjectId; | |||
@ApiModelProperty("建设必要性") | |||
private String buildNecessity; | |||
@ApiModelProperty("需求合理性") | |||
private String needRationality; | |||
@ApiModelProperty("技术方案可行性") | |||
private String techFeasibility; | |||
@ApiModelProperty("审核结果:1 通过、0 不通过") | |||
private Integer reviewResult; | |||
@ApiModelProperty("其他意见") | |||
private String otherAdvices; | |||
@ApiModelProperty("投资测算合理性") | |||
private String investRationality; | |||
@ApiModelProperty("建议资金(单位:万元)") | |||
private BigDecimal suggestedFunding; | |||
@ApiModelProperty("相关材料") | |||
private String attachFiles; | |||
} |
@@ -80,4 +80,13 @@ public class MeetingByManagerVO { | |||
@ApiModelProperty("是否评价") | |||
private Boolean hasJudge; | |||
@ApiModelProperty("是否关联系统内项目") | |||
private Boolean isInnerProject; | |||
@ApiModelProperty("会议结果是否上传") | |||
private Boolean hasMeetingResult; | |||
@ApiModelProperty("所有项目是否已上传评审结果") | |||
private Boolean allProjectReviewed; | |||
} |
@@ -61,12 +61,8 @@ public class MeetingManageHelper { | |||
private final RegionCacheHelper regionCacheHelper; | |||
public void checkReviewProject(MeetingBasicDTO meetingBasic) { | |||
if (meetingBasic.getIsInnerProject() != null) { | |||
if (meetingBasic.getIsInnerProject()) { | |||
Assert.notEmpty(meetingBasic.getInnerProjects(), "评审项目不能为空"); | |||
} else { | |||
Assert.notEmpty(meetingBasic.getProjects(), "评审项目不能为空"); | |||
} | |||
if (Boolean.TRUE.equals(meetingBasic.getIsInnerProject())) { | |||
Assert.notEmpty(meetingBasic.getInnerProjects(), "评审项目不能为空"); | |||
} | |||
} | |||
@@ -117,6 +113,8 @@ public class MeetingManageHelper { | |||
result.setConnecter(meeting.getConnecter()); | |||
result.setContact(meeting.getContact()); | |||
result.setMeetingAddress(meeting.getMeetingAddress()); | |||
result.setIsInnerProject(meeting.getIsInnerProject()); | |||
result.setHasMeetingResult(StrUtil.isNotBlank(meeting.getResultDescription())); | |||
return result; | |||
} | |||
@@ -104,14 +104,11 @@ public class ExpertExportManage { | |||
data.setMeetingTime(DateUtil.localDateTimeFormat(meeting.getStartTime(), "yyyy-MM-dd HH:mm")); | |||
data.setMeetingAddress(meeting.getMeetingAddress()); | |||
List<String> projectNames = new ArrayList<>(); | |||
if (meeting.getIsInnerProject()) { | |||
if (Boolean.TRUE.equals(meeting.getIsInnerProject())) { | |||
List<MeetingInnerProject> inners = meetingInnerProjectService.listByMeetingId(meetingId); | |||
List<Long> projectIds = CollUtils.fieldList(inners, MeetingInnerProject::getProjectId); | |||
List<Project> projects = projectService.listByIds(projectIds); | |||
projects.forEach(w -> projectNames.add(w.getProjectName())); | |||
} else { | |||
List<MeetingOuterProject> inners = meetingOuterProjectService.listByMeetingId(meetingId); | |||
inners.forEach(w -> projectNames.add(w.getProjectName())); | |||
} | |||
data.setProjectName(StrUtil.join("、", projectNames)); | |||
data.setExperts(new ArrayList<>()); | |||
@@ -147,41 +144,27 @@ public class ExpertExportManage { | |||
public void expertReviewTable(Long meetingId, HttpServletResponse response) { | |||
try { | |||
Meeting meeting = meetingService.getById(meetingId); | |||
String startTime = DateUtil.localDateTimeFormat(meeting.getStartTime(), "yyyy年M月d日"); | |||
List<FreemarkerBatchExportDTO> fbeList; | |||
if (meeting.getIsInnerProject()) { | |||
List<MeetingInnerProject> inners = meetingInnerProjectService.listByMeetingId(meetingId); | |||
Map<Long, String> reviewResultMap = expertReviewManage.buildExpertReviewToStr(meetingId); | |||
List<Long> projectIds = CollUtils.fieldList(inners, MeetingInnerProject::getProjectId); | |||
List<Project> projects = projectService.listByIds(projectIds); | |||
fbeList = projects.stream().map(w -> { | |||
FreemarkerBatchExportDTO fbe = new FreemarkerBatchExportDTO(); | |||
ExpertReviewTableDTO currData = new ExpertReviewTableDTO(); | |||
currData.setHoldOrg(meeting.getHoldOrg()); | |||
currData.setMeetingTime(startTime); | |||
currData.setMeetingAddress(meeting.getMeetingAddress()); | |||
currData.setProjectName(w.getProjectName()); | |||
currData.setReviewResult(reviewResultMap.get(w.getId())); | |||
fbe.setData(currData); | |||
fbe.setTemplate(EXPERT_REVIEW); | |||
fbe.setFileName(w.getProjectName() + ".doc"); | |||
return fbe; | |||
}).collect(Collectors.toList()); | |||
} else { | |||
List<MeetingOuterProject> inners = meetingOuterProjectService.listByMeetingId(meetingId); | |||
fbeList = inners.stream().map(w -> { | |||
FreemarkerBatchExportDTO fbe = new FreemarkerBatchExportDTO(); | |||
ExpertReviewTableDTO currData = new ExpertReviewTableDTO(); | |||
currData.setHoldOrg(meeting.getHoldOrg()); | |||
currData.setMeetingTime(startTime); | |||
currData.setMeetingAddress(meeting.getMeetingAddress()); | |||
currData.setProjectName(w.getProjectName()); | |||
fbe.setData(currData); | |||
fbe.setTemplate(EXPERT_REVIEW); | |||
fbe.setFileName(w.getProjectName() + ".doc"); | |||
return fbe; | |||
}).collect(Collectors.toList()); | |||
if (!Boolean.TRUE.equals(meeting.getIsInnerProject())) { | |||
throw BizException.wrap("未关联项目"); | |||
} | |||
String startTime = DateUtil.localDateTimeFormat(meeting.getStartTime(), "yyyy年M月d日"); | |||
List<MeetingInnerProject> inners = meetingInnerProjectService.listByMeetingId(meetingId); | |||
Map<Long, String> reviewResultMap = expertReviewManage.buildExpertReviewToStr(meetingId); | |||
List<Long> projectIds = CollUtils.fieldList(inners, MeetingInnerProject::getProjectId); | |||
List<Project> projects = projectService.listByIds(projectIds); | |||
List<FreemarkerBatchExportDTO> fbeList = projects.stream().map(w -> { | |||
FreemarkerBatchExportDTO fbe = new FreemarkerBatchExportDTO(); | |||
ExpertReviewTableDTO currData = new ExpertReviewTableDTO(); | |||
currData.setHoldOrg(meeting.getHoldOrg()); | |||
currData.setMeetingTime(startTime); | |||
currData.setMeetingAddress(meeting.getMeetingAddress()); | |||
currData.setProjectName(w.getProjectName()); | |||
currData.setReviewResult(reviewResultMap.get(w.getId())); | |||
fbe.setData(currData); | |||
fbe.setTemplate(EXPERT_REVIEW); | |||
fbe.setFileName(w.getProjectName() + ".doc"); | |||
return fbe; | |||
}).collect(Collectors.toList()); | |||
String exportFileName = meeting.getName() + "专家评审表.zip"; | |||
FreemarkerWordUtil.exportBatch(response, fbeList, exportFileName); | |||
} catch (TemplateException | IOException e) { | |||
@@ -137,22 +137,13 @@ public class MeetingManage { | |||
meeting.setConfirmedRoster(Boolean.FALSE); | |||
meeting.setInviteType(inviteRule.getInviteType()); | |||
meetingService.save(meeting); | |||
if (meeting.getIsInnerProject() != null) { | |||
if (Boolean.TRUE.equals(meetingBasic.getIsInnerProject())) { | |||
List<MeetingInnerProject> projects = meetingBasic.getInnerProjects().stream().map(w -> { | |||
MeetingInnerProject project = BeanUtil.copyProperties(w, MeetingInnerProject.class); | |||
project.setMeetingId(meeting.getId()); | |||
return project; | |||
}).collect(Collectors.toList()); | |||
meetingInnerProjectService.saveBatch(projects); | |||
} else { | |||
List<MeetingOuterProject> projects = meetingBasic.getProjects().stream().map(w -> { | |||
MeetingOuterProject project = BeanUtil.copyProperties(w, MeetingOuterProject.class); | |||
project.setMeetingId(meeting.getId()); | |||
return project; | |||
}).collect(Collectors.toList()); | |||
meetingOuterProjectService.saveBatch(projects); | |||
} | |||
if (Boolean.TRUE.equals(meetingBasic.getIsInnerProject())) { | |||
List<MeetingInnerProject> projects = meetingBasic.getInnerProjects().stream().map(w -> { | |||
MeetingInnerProject project = BeanUtil.copyProperties(w, MeetingInnerProject.class); | |||
project.setMeetingId(meeting.getId()); | |||
return project; | |||
}).collect(Collectors.toList()); | |||
meetingInnerProjectService.saveBatch(projects); | |||
} | |||
// 抽取专家 | |||
inviteRule.setMeetingId(meeting.getId()); | |||
@@ -411,13 +402,42 @@ public class MeetingManage { | |||
return PageVo.empty(); | |||
} | |||
PageVo<MeetingByManagerVO> result = new PageVo<>(new ArrayList<>(), page.getTotal()); | |||
LocalDateTime now = LocalDateTime.now(); | |||
List<Long> meetingIds = page.getRecords().stream() | |||
.filter(w -> { | |||
if (!MeetingStatusEnum.NORMAL.eq(w.getStatus())) { | |||
return Boolean.FALSE; | |||
} | |||
if (!Boolean.TRUE.equals(w.getIsInnerProject())) { | |||
return Boolean.FALSE; | |||
} | |||
return w.getEndTime().isBefore(now); | |||
}).map(Meeting::getId) | |||
.collect(Collectors.toList()); | |||
Map<Long, Boolean> projectReviewProgress; | |||
if (!meetingIds.isEmpty()) { | |||
projectReviewProgress = getMeetingProjectReviewProgress(meetingIds); | |||
} else { | |||
projectReviewProgress = Collections.emptyMap(); | |||
} | |||
page.getRecords().forEach(meeting -> { | |||
MeetingByManagerVO item = meetingManageHelper.buildByMeeting(meeting); | |||
item.setAllProjectReviewed(projectReviewProgress.get(meeting.getId())); | |||
result.getRecords().add(item); | |||
}); | |||
return result; | |||
} | |||
private Map<Long, Boolean> getMeetingProjectReviewProgress(Collection<Long> meetingIds) { | |||
Wrapper<MeetingInnerProject> query = Wrappers.lambdaQuery(MeetingInnerProject.class) | |||
.select(MeetingInnerProject::getReviewResult, MeetingInnerProject::getMeetingId) | |||
.in(MeetingInnerProject::getMeetingId, meetingIds); | |||
List<MeetingInnerProject> projects = meetingInnerProjectService.list(query); | |||
return projects.stream().collect(Collectors.groupingBy(MeetingInnerProject::getMeetingId, | |||
Collectors.collectingAndThen(Collectors.toList(), | |||
w -> w.stream().noneMatch(x -> x.getReviewResult() == null)))); | |||
} | |||
public MeetingDetailBasicVO getMeetingDetail(Long meetingId) { | |||
Meeting meeting = meetingService.getById(meetingId); | |||
Assert.notNull(meeting, "会议不存在"); | |||
@@ -445,28 +465,18 @@ public class MeetingManage { | |||
.resultAttachFiles(meeting.getResultAttachFiles()) | |||
.remark(meeting.getRemark()) | |||
.build(); | |||
if (meeting.getIsInnerProject() != null) { | |||
if (Boolean.TRUE.equals(meeting.getIsInnerProject())) { | |||
List<MeetingInnerProject> innerProjects = meetingInnerProjectService.listByMeetingId(meetingId); | |||
Map<Long, MeetingInnerProject> innerProjectMap = CollUtils.listToMap(innerProjects, MeetingInnerProject::getProjectId); | |||
List<Project> projects = projectService.listByIds(innerProjectMap.keySet()); | |||
List<MeetingReviewProjectDTO> convert = CollUtils.convert(projects, w -> { | |||
MeetingReviewProjectDTO mrp = MeetingReviewProjectBuilder.convert(w); | |||
MeetingInnerProject mip = innerProjectMap.get(mrp.getProjectId()); | |||
mrp.setMeetingProjectId(mip.getId()); | |||
mrp.setReviewResultDetail(ProjectReviewResultBuilder.convert(mip)); | |||
return mrp; | |||
}); | |||
detail.setProjects(convert); | |||
} else { | |||
List<MeetingOuterProject> outerProjects = meetingOuterProjectService.listByMeetingId(meetingId); | |||
detail.setProjects(CollUtils.convert(outerProjects, mop -> { | |||
MeetingReviewProjectDTO mrp = MeetingReviewProjectBuilder.convert(mop); | |||
ProjectReviewResultDTO result = ProjectReviewResultBuilder.convert(mop); | |||
mrp.setReviewResultDetail(result); | |||
return mrp; | |||
})); | |||
} | |||
if (Boolean.TRUE.equals(meeting.getIsInnerProject())) { | |||
List<MeetingInnerProject> innerProjects = meetingInnerProjectService.listByMeetingId(meetingId); | |||
Map<Long, MeetingInnerProject> innerProjectMap = CollUtils.listToMap(innerProjects, MeetingInnerProject::getProjectId); | |||
List<Project> projects = projectService.listByIds(innerProjectMap.keySet()); | |||
List<MeetingReviewProjectDTO> convert = CollUtils.convert(projects, w -> { | |||
MeetingReviewProjectDTO mrp = MeetingReviewProjectBuilder.convert(w); | |||
MeetingInnerProject mip = innerProjectMap.get(mrp.getProjectId()); | |||
mrp.setMeetingProjectId(mip.getId()); | |||
mrp.setReviewResultDetail(ProjectReviewResultBuilder.convert(mip)); | |||
return mrp; | |||
}); | |||
detail.setProjects(convert); | |||
} | |||
detail.setInviteRule(inviteRuleDetail(meetingId)); | |||
return detail; | |||
@@ -897,14 +907,8 @@ public class MeetingManage { | |||
vo.setReviewResultDetail(ProjectReviewResultBuilder.convert(mip)); | |||
return vo; | |||
}); | |||
} else { | |||
List<MeetingOuterProject> projects = meetingOuterProjectService.listByMeetingId(meetingId); | |||
return CollUtils.convert(projects, w -> { | |||
MeetingReviewProjectVO mrr = MeetingReviewProjectBuilder.to(w); | |||
mrr.setReviewResultDetail(ProjectReviewResultBuilder.convert(w)); | |||
return mrr; | |||
}); | |||
} | |||
return Collections.emptyList(); | |||
} | |||
private void buildOptionProjectQuery(LambdaQueryWrapper<Project> query, String meetingType, ProjectStatusEnum status) { | |||
@@ -945,6 +949,17 @@ public class MeetingManage { | |||
} | |||
} | |||
public MeetingResultUploadReq meetingResultDetail(Long meetingId) { | |||
Meeting meeting = meetingService.getById(meetingId); | |||
if (StrUtil.isBlank(meeting.getResultDescription())) { | |||
throw BizException.wrap("未上传会议结果"); | |||
} | |||
MeetingResultUploadReq result = new MeetingResultUploadReq(); | |||
result.setResultDescription(meeting.getResultDescription()); | |||
result.setResultAttachFiles(meeting.getResultAttachFiles()); | |||
return result; | |||
} | |||
public void uploadProjectReviewResult(ProjectReviewResultUploadReq req) { | |||
String key = "meeting_project_result_upload:" + req.getMeetingProjectId(); | |||
if (!distributedLock.lock(key, RETRY_TIMES)) { | |||
@@ -959,18 +974,12 @@ public class MeetingManage { | |||
if (meeting.getEndTime().isAfter(now)) { | |||
throw BizException.wrap("会议未结束"); | |||
} | |||
if (meeting.getIsInnerProject() == null) { | |||
if (meeting.getIsInnerProject()) { | |||
throw BizException.wrap("此会议未关联项目"); | |||
} | |||
if (Boolean.TRUE.equals(meeting.getIsInnerProject())) { | |||
MeetingInnerProject mip = BeanUtil.copyProperties(req, MeetingInnerProject.class); | |||
mip.setId(req.getMeetingProjectId()); | |||
meetingInnerProjectService.updateById(mip); | |||
} else { | |||
MeetingOuterProject mop = BeanUtil.copyProperties(req, MeetingOuterProject.class); | |||
mop.setId(req.getMeetingProjectId()); | |||
meetingOuterProjectService.updateById(mop); | |||
} | |||
MeetingInnerProject mip = BeanUtil.copyProperties(req, MeetingInnerProject.class); | |||
mip.setId(req.getMeetingProjectId()); | |||
meetingInnerProjectService.updateById(mip); | |||
} finally { | |||
distributedLock.releaseLock(key); | |||
} | |||