@@ -26,6 +26,7 @@ public class ProjectReviewResultBuilder { | |||||
prr.setOtherAdvices(mip.getOtherAdvices()); | prr.setOtherAdvices(mip.getOtherAdvices()); | ||||
prr.setTechFeasibility(mip.getTechFeasibility()); | prr.setTechFeasibility(mip.getTechFeasibility()); | ||||
prr.setNeedRationality(mip.getNeedRationality()); | prr.setNeedRationality(mip.getNeedRationality()); | ||||
prr.setAttachFiles(mip.getAttachFiles()); | |||||
return prr; | return prr; | ||||
} | } | ||||
@@ -38,6 +39,7 @@ public class ProjectReviewResultBuilder { | |||||
prr.setOtherAdvices(mop.getOtherAdvices()); | prr.setOtherAdvices(mop.getOtherAdvices()); | ||||
prr.setTechFeasibility(mop.getTechFeasibility()); | prr.setTechFeasibility(mop.getTechFeasibility()); | ||||
prr.setNeedRationality(mop.getNeedRationality()); | prr.setNeedRationality(mop.getNeedRationality()); | ||||
prr.setAttachFiles(mop.getAttachFiles()); | |||||
return prr; | return prr; | ||||
} | } | ||||
@@ -203,6 +203,13 @@ public class MeetingController { | |||||
meetingManage.uploadMeetingResult(req); | meetingManage.uploadMeetingResult(req); | ||||
} | } | ||||
@GetMapping("/{meetingId}/result/detail") | |||||
@ApiOperation("会议结果详情") | |||||
@WebLog("会议结详情") | |||||
public void uploadMeetingResult(@PathVariable Long meetingId) { | |||||
meetingManage.meetingResultDetail(meetingId); | |||||
} | |||||
@PostMapping("/project/result/upload") | @PostMapping("/project/result/upload") | ||||
@ApiOperation("评审结果上传") | @ApiOperation("评审结果上传") | ||||
@WebLog("评审结果上传") | @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.enumeration.MeetingSettingsTypeEnum; | ||||
import com.hz.pm.api.meeting.entity.req.MeetingSettingsSaveReq; | import com.hz.pm.api.meeting.entity.req.MeetingSettingsSaveReq; | ||||
import com.hz.pm.api.meeting.manage.MeetingSettingsManage; | import com.hz.pm.api.meeting.manage.MeetingSettingsManage; | ||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.AllArgsConstructor; | 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> | * <p> | ||||
@@ -17,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController; | |||||
* @author WendyYang | * @author WendyYang | ||||
* @since 2023-12-27 | * @since 2023-12-27 | ||||
*/ | */ | ||||
@Api(tags = "会议配置管理") | |||||
@RestController | @RestController | ||||
@AllArgsConstructor | @AllArgsConstructor | ||||
@RequestMapping("/api/v1/meeting/settings") | @RequestMapping("/api/v1/meeting/settings") | ||||
@@ -25,9 +25,15 @@ public class MeetingSettingsController { | |||||
private final MeetingSettingsManage meetingSettingsManage; | private final MeetingSettingsManage meetingSettingsManage; | ||||
@GetMapping("/{settingsType}") | @GetMapping("/{settingsType}") | ||||
@ApiOperation("获取配置详情") | |||||
public MeetingSettingsSaveReq getSettings(@PathVariable MeetingSettingsTypeEnum settingsType) { | public MeetingSettingsSaveReq getSettings(@PathVariable MeetingSettingsTypeEnum settingsType) { | ||||
return meetingSettingsManage.getSettings(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("建议资金(单位:万元)") | @ApiModelProperty("建议资金(单位:万元)") | ||||
private BigDecimal suggestedFunding; | private BigDecimal suggestedFunding; | ||||
private String attachFiles; | |||||
@TableField(fill = FieldFill.INSERT_UPDATE) | @TableField(fill = FieldFill.INSERT_UPDATE) | ||||
private LocalDateTime updateOn; | private LocalDateTime updateOn; | ||||
@@ -64,6 +64,8 @@ public class MeetingOuterProject implements Serializable { | |||||
@ApiModelProperty("建议资金(单位:万元)") | @ApiModelProperty("建议资金(单位:万元)") | ||||
private BigDecimal suggestedFunding; | private BigDecimal suggestedFunding; | ||||
private String attachFiles; | |||||
@ApiModelProperty("会议ID") | @ApiModelProperty("会议ID") | ||||
private Long meetingId; | private Long meetingId; | ||||
@@ -13,7 +13,7 @@ import java.time.LocalTime; | |||||
* @since 00:27 2023/12/27 | * @since 00:27 2023/12/27 | ||||
*/ | */ | ||||
@Data | @Data | ||||
public class ExpertInviteIgnoreTimeContentDTO { | |||||
public class InviteCallIgnoreTimeContentDTO { | |||||
private LocalTime startTime; | private LocalTime startTime; | ||||
@@ -67,6 +67,7 @@ public class MeetingBasicDTO { | |||||
private String contact; | private String contact; | ||||
@ApiModelProperty("是否是系统内部项目") | @ApiModelProperty("是否是系统内部项目") | ||||
@NotNull(message = "是否系统内项目不能为空") | |||||
private Boolean isInnerProject; | private Boolean isInnerProject; | ||||
@ApiModelProperty("内部项目ID") | @ApiModelProperty("内部项目ID") | ||||
@@ -37,4 +37,6 @@ public class ProjectReviewResultDTO { | |||||
@ApiModelProperty("建议资金(单位:万元)") | @ApiModelProperty("建议资金(单位:万元)") | ||||
private BigDecimal suggestedFunding; | private BigDecimal suggestedFunding; | ||||
private String attachFiles; | |||||
} | } |
@@ -1,5 +1,7 @@ | |||||
package com.hz.pm.api.meeting.entity.enumeration; | 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.AllArgsConstructor; | ||||
import lombok.Getter; | import lombok.Getter; | ||||
@@ -15,9 +17,11 @@ import lombok.Getter; | |||||
@AllArgsConstructor | @AllArgsConstructor | ||||
public enum MeetingSettingsTypeEnum { | 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 String name; | ||||
private final Class<?> contentClass; | |||||
} | } |
@@ -1,6 +1,6 @@ | |||||
package com.hz.pm.api.meeting.entity.req; | 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.dto.ExpertJudgeTimeLimitContentDTO; | ||||
import com.hz.pm.api.meeting.entity.enumeration.MeetingSettingsTypeEnum; | import com.hz.pm.api.meeting.entity.enumeration.MeetingSettingsTypeEnum; | ||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
@@ -32,7 +32,7 @@ public class MeetingSettingsSaveReq { | |||||
public static class SettingsContentPackageDTO { | public static class SettingsContentPackageDTO { | ||||
@ApiModelProperty("专家邀请免打扰时段设置") | @ApiModelProperty("专家邀请免打扰时段设置") | ||||
private ExpertInviteIgnoreTimeContentDTO expertInviteIgnoreTimeContent; | |||||
private InviteCallIgnoreTimeContentDTO expertInviteIgnoreTimeContent; | |||||
@ApiModelProperty("专家评价时间设置") | @ApiModelProperty("专家评价时间设置") | ||||
private ExpertJudgeTimeLimitContentDTO expertJudgeTimeLimitContent; | 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("是否评价") | @ApiModelProperty("是否评价") | ||||
private Boolean hasJudge; | 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; | private final RegionCacheHelper regionCacheHelper; | ||||
public void checkReviewProject(MeetingBasicDTO meetingBasic) { | 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.setConnecter(meeting.getConnecter()); | ||||
result.setContact(meeting.getContact()); | result.setContact(meeting.getContact()); | ||||
result.setMeetingAddress(meeting.getMeetingAddress()); | result.setMeetingAddress(meeting.getMeetingAddress()); | ||||
result.setIsInnerProject(meeting.getIsInnerProject()); | |||||
result.setHasMeetingResult(StrUtil.isNotBlank(meeting.getResultDescription())); | |||||
return result; | return result; | ||||
} | } | ||||
@@ -104,14 +104,11 @@ public class ExpertExportManage { | |||||
data.setMeetingTime(DateUtil.localDateTimeFormat(meeting.getStartTime(), "yyyy-MM-dd HH:mm")); | data.setMeetingTime(DateUtil.localDateTimeFormat(meeting.getStartTime(), "yyyy-MM-dd HH:mm")); | ||||
data.setMeetingAddress(meeting.getMeetingAddress()); | data.setMeetingAddress(meeting.getMeetingAddress()); | ||||
List<String> projectNames = new ArrayList<>(); | List<String> projectNames = new ArrayList<>(); | ||||
if (meeting.getIsInnerProject()) { | |||||
if (Boolean.TRUE.equals(meeting.getIsInnerProject())) { | |||||
List<MeetingInnerProject> inners = meetingInnerProjectService.listByMeetingId(meetingId); | List<MeetingInnerProject> inners = meetingInnerProjectService.listByMeetingId(meetingId); | ||||
List<Long> projectIds = CollUtils.fieldList(inners, MeetingInnerProject::getProjectId); | List<Long> projectIds = CollUtils.fieldList(inners, MeetingInnerProject::getProjectId); | ||||
List<Project> projects = projectService.listByIds(projectIds); | List<Project> projects = projectService.listByIds(projectIds); | ||||
projects.forEach(w -> projectNames.add(w.getProjectName())); | 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.setProjectName(StrUtil.join("、", projectNames)); | ||||
data.setExperts(new ArrayList<>()); | data.setExperts(new ArrayList<>()); | ||||
@@ -147,41 +144,27 @@ public class ExpertExportManage { | |||||
public void expertReviewTable(Long meetingId, HttpServletResponse response) { | public void expertReviewTable(Long meetingId, HttpServletResponse response) { | ||||
try { | try { | ||||
Meeting meeting = meetingService.getById(meetingId); | 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"; | String exportFileName = meeting.getName() + "专家评审表.zip"; | ||||
FreemarkerWordUtil.exportBatch(response, fbeList, exportFileName); | FreemarkerWordUtil.exportBatch(response, fbeList, exportFileName); | ||||
} catch (TemplateException | IOException e) { | } catch (TemplateException | IOException e) { | ||||
@@ -137,22 +137,13 @@ public class MeetingManage { | |||||
meeting.setConfirmedRoster(Boolean.FALSE); | meeting.setConfirmedRoster(Boolean.FALSE); | ||||
meeting.setInviteType(inviteRule.getInviteType()); | meeting.setInviteType(inviteRule.getInviteType()); | ||||
meetingService.save(meeting); | 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()); | inviteRule.setMeetingId(meeting.getId()); | ||||
@@ -411,13 +402,42 @@ public class MeetingManage { | |||||
return PageVo.empty(); | return PageVo.empty(); | ||||
} | } | ||||
PageVo<MeetingByManagerVO> result = new PageVo<>(new ArrayList<>(), page.getTotal()); | 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 -> { | page.getRecords().forEach(meeting -> { | ||||
MeetingByManagerVO item = meetingManageHelper.buildByMeeting(meeting); | MeetingByManagerVO item = meetingManageHelper.buildByMeeting(meeting); | ||||
item.setAllProjectReviewed(projectReviewProgress.get(meeting.getId())); | |||||
result.getRecords().add(item); | result.getRecords().add(item); | ||||
}); | }); | ||||
return result; | 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) { | public MeetingDetailBasicVO getMeetingDetail(Long meetingId) { | ||||
Meeting meeting = meetingService.getById(meetingId); | Meeting meeting = meetingService.getById(meetingId); | ||||
Assert.notNull(meeting, "会议不存在"); | Assert.notNull(meeting, "会议不存在"); | ||||
@@ -445,28 +465,18 @@ public class MeetingManage { | |||||
.resultAttachFiles(meeting.getResultAttachFiles()) | .resultAttachFiles(meeting.getResultAttachFiles()) | ||||
.remark(meeting.getRemark()) | .remark(meeting.getRemark()) | ||||
.build(); | .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)); | detail.setInviteRule(inviteRuleDetail(meetingId)); | ||||
return detail; | return detail; | ||||
@@ -897,14 +907,8 @@ public class MeetingManage { | |||||
vo.setReviewResultDetail(ProjectReviewResultBuilder.convert(mip)); | vo.setReviewResultDetail(ProjectReviewResultBuilder.convert(mip)); | ||||
return vo; | 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) { | 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) { | public void uploadProjectReviewResult(ProjectReviewResultUploadReq req) { | ||||
String key = "meeting_project_result_upload:" + req.getMeetingProjectId(); | String key = "meeting_project_result_upload:" + req.getMeetingProjectId(); | ||||
if (!distributedLock.lock(key, RETRY_TIMES)) { | if (!distributedLock.lock(key, RETRY_TIMES)) { | ||||
@@ -959,18 +974,12 @@ public class MeetingManage { | |||||
if (meeting.getEndTime().isAfter(now)) { | if (meeting.getEndTime().isAfter(now)) { | ||||
throw BizException.wrap("会议未结束"); | throw BizException.wrap("会议未结束"); | ||||
} | } | ||||
if (meeting.getIsInnerProject() == null) { | |||||
if (meeting.getIsInnerProject()) { | |||||
throw BizException.wrap("此会议未关联项目"); | 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 { | } finally { | ||||
distributedLock.releaseLock(key); | distributedLock.releaseLock(key); | ||||
} | } | ||||