# Conflicts: # pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.javatags/24080901
@@ -204,10 +204,6 @@ | |||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
<groupId>com.ningdatech</groupId> | <groupId>com.ningdatech</groupId> | ||||
<artifactId>nd-dict-starter</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-cache-starter</artifactId> | <artifactId>nd-cache-starter</artifactId> | ||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
@@ -5,7 +5,6 @@ import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.pmapi.expert.manage.ExpertAdminManage; | import com.ningdatech.pmapi.expert.manage.ExpertAdminManage; | ||||
import com.ningdatech.pmapi.expert.manage.ExpertManage; | import com.ningdatech.pmapi.expert.manage.ExpertManage; | ||||
import com.ningdatech.pmapi.expert.model.ExpertAdminExpertManageQuery; | import com.ningdatech.pmapi.expert.model.ExpertAdminExpertManageQuery; | ||||
import com.ningdatech.pmapi.expert.model.req.ExpertRecommendProofSubmitRequest; | |||||
import com.ningdatech.pmapi.expert.model.req.ExpertUserBasicInfoSubmitRequest; | import com.ningdatech.pmapi.expert.model.req.ExpertUserBasicInfoSubmitRequest; | ||||
import com.ningdatech.pmapi.expert.model.vo.ExpertAdminExpertManageListVO; | import com.ningdatech.pmapi.expert.model.vo.ExpertAdminExpertManageListVO; | ||||
import com.ningdatech.pmapi.expert.model.vo.ExpertFullInfoVO; | import com.ningdatech.pmapi.expert.model.vo.ExpertFullInfoVO; | ||||
@@ -36,16 +35,9 @@ public class ExpertController { | |||||
@PostMapping("/basic-info-submit") | @PostMapping("/basic-info-submit") | ||||
@ApiOperation("填写基本信息接口(专家报名使用))") | @ApiOperation("填写基本信息接口(专家报名使用))") | ||||
public void expertBasicInfoSubmit(@Valid @RequestBody ExpertUserBasicInfoSubmitRequest request) { | public void expertBasicInfoSubmit(@Valid @RequestBody ExpertUserBasicInfoSubmitRequest request) { | ||||
// ExpertUserInfoValidator.expertUserBasicInfoSubmitRequestValidate(request); | |||||
expertManage.expertBasicInfoSubmit(request); | expertManage.expertBasicInfoSubmit(request); | ||||
} | } | ||||
@PostMapping("/recommend-proof-submit") | |||||
@ApiOperation("推荐证明提交接口(专家报名使用)") | |||||
public void expertRecommendProofSubmit(@Valid @RequestBody ExpertRecommendProofSubmitRequest request) { | |||||
expertManage.expertRecommendProofSubmit(request); | |||||
} | |||||
@GetMapping("/detail") | @GetMapping("/detail") | ||||
@ApiOperation("专家获取专家详细信息") | @ApiOperation("专家获取专家详细信息") | ||||
public ExpertFullInfoVO getExpertFullInfoDetail() { | public ExpertFullInfoVO getExpertFullInfoDetail() { | ||||
@@ -15,7 +15,6 @@ import com.ningdatech.pmapi.expert.model.cmd.ExpertFullInfoSaveCmd; | |||||
import com.ningdatech.pmapi.expert.model.cmd.ExpertRecommendProofSaveCmd; | import com.ningdatech.pmapi.expert.model.cmd.ExpertRecommendProofSaveCmd; | ||||
import com.ningdatech.pmapi.expert.model.dto.ExpertDictionaryDTO; | import com.ningdatech.pmapi.expert.model.dto.ExpertDictionaryDTO; | ||||
import com.ningdatech.pmapi.expert.model.dto.ExpertFullInfoAllDTO; | import com.ningdatech.pmapi.expert.model.dto.ExpertFullInfoAllDTO; | ||||
import com.ningdatech.pmapi.expert.model.req.ExpertRecommendProofSubmitRequest; | |||||
import com.ningdatech.pmapi.expert.model.req.ExpertUserBasicInfoSubmitRequest; | import com.ningdatech.pmapi.expert.model.req.ExpertUserBasicInfoSubmitRequest; | ||||
import com.ningdatech.pmapi.expert.model.vo.ExpertFullInfoVO; | import com.ningdatech.pmapi.expert.model.vo.ExpertFullInfoVO; | ||||
import com.ningdatech.pmapi.expert.service.ExpertInfoService; | import com.ningdatech.pmapi.expert.service.ExpertInfoService; | ||||
@@ -84,10 +83,16 @@ public class ExpertManage { | |||||
.buildExpertFullInfoSaveCmd(userId, basicInfo, eduInfo, jobInfo, professionalInfo); | .buildExpertFullInfoSaveCmd(userId, basicInfo, eduInfo, jobInfo, professionalInfo); | ||||
expertInfoService.saveExpertInfo(expertFullInfoSaveCmd); | expertInfoService.saveExpertInfo(expertFullInfoSaveCmd); | ||||
} | } | ||||
// 推荐证明材料 | |||||
List<DictionaryFieldInfo> recommendedWay = request.getRecommendedWay(); | |||||
// 推荐方式 | |||||
List<FileBasicInfo> recommendProofFile = request.getRecommendProofFile(); | |||||
expertRecommendProofSubmit(recommendedWay, recommendProofFile); | |||||
} | } | ||||
public void expertRecommendProofSubmit(ExpertRecommendProofSubmitRequest request) { | |||||
public void expertRecommendProofSubmit(List<DictionaryFieldInfo> recommendedWay, List<FileBasicInfo> recommendProofFile) { | |||||
// 用户id | // 用户id | ||||
Long expertUserId = LoginUserUtil.getUserId(); | Long expertUserId = LoginUserUtil.getUserId(); | ||||
ExpertUserFullInfo expertUserFullInfo = iExpertUserFullInfoService.getByUserId(expertUserId); | ExpertUserFullInfo expertUserFullInfo = iExpertUserFullInfoService.getByUserId(expertUserId); | ||||
@@ -97,20 +102,15 @@ public class ExpertManage { | |||||
|| ExpertUserInfoStepEnum.EVIDENCE_HAS_BEEN_SUBMITTED.getKey().equals(expertUserFullInfo.getUserInfoStep())) { | || ExpertUserInfoStepEnum.EVIDENCE_HAS_BEEN_SUBMITTED.getKey().equals(expertUserFullInfo.getUserInfoStep())) { | ||||
throw new BizException("当前状态无法提交证明材料"); | throw new BizException("当前状态无法提交证明材料"); | ||||
} | } | ||||
// 根据用户id 获取用户信息,获取手机号校验 验证码是否正确 | |||||
String phoneNo = expertUserFullInfo.getPhoneNo(); | |||||
String verificationCode = request.getVerificationCode(); | |||||
// 证明材料提交 | // 证明材料提交 | ||||
List<FileBasicInfo> recommendProofFile = request.getRecommendProofFile(); | |||||
List<DictionaryFieldInfo> recommendedWayList = request.getRecommendedWay(); | |||||
ExpertRecommendProofSaveCmd expertRecommendProofSaveCmd = new ExpertRecommendProofSaveCmd(); | ExpertRecommendProofSaveCmd expertRecommendProofSaveCmd = new ExpertRecommendProofSaveCmd(); | ||||
if (CollectionUtils.isNotEmpty(recommendProofFile)) { | if (CollectionUtils.isNotEmpty(recommendProofFile)) { | ||||
expertRecommendProofSaveCmd.setRecommendationProofFileIdList(recommendProofFile.stream().map(FileBasicInfo::getFileId).collect(Collectors.toList())); | expertRecommendProofSaveCmd.setRecommendationProofFileIdList(recommendProofFile.stream().map(FileBasicInfo::getFileId).collect(Collectors.toList())); | ||||
} | } | ||||
List<ExpertDictionaryDTO> recommendedWayDictionaryDTOList = new ArrayList<>(); | List<ExpertDictionaryDTO> recommendedWayDictionaryDTOList = new ArrayList<>(); | ||||
if (CollectionUtils.isNotEmpty(recommendedWayList)) { | |||||
recommendedWayDictionaryDTOList = recommendedWayList.stream().map(r -> { | |||||
if (CollectionUtils.isNotEmpty(recommendedWay)) { | |||||
recommendedWayDictionaryDTOList = recommendedWay.stream().map(r -> { | |||||
ExpertDictionaryDTO expertDictionaryDTO = new ExpertDictionaryDTO(); | ExpertDictionaryDTO expertDictionaryDTO = new ExpertDictionaryDTO(); | ||||
expertDictionaryDTO.setDictionaryCode(r.getDictionaryCode()); | expertDictionaryDTO.setDictionaryCode(r.getDictionaryCode()); | ||||
expertDictionaryDTO.setExpertInfoField(DictExpertInfoTypeEnum.RECOMMENDED_WAY.getKey()); | expertDictionaryDTO.setExpertInfoField(DictExpertInfoTypeEnum.RECOMMENDED_WAY.getKey()); | ||||
@@ -133,5 +133,6 @@ public class ExpertManage { | |||||
} | } | ||||
List<Long> fileIdList = expertInfoCommonHelper.getExpertFileIdList(expertUserFullInfoAll); | List<Long> fileIdList = expertInfoCommonHelper.getExpertFileIdList(expertUserFullInfoAll); | ||||
List<AttachFileVo> attachFiles = fileService.getByIds(fileIdList); | List<AttachFileVo> attachFiles = fileService.getByIds(fileIdList); | ||||
return expertUserInfoAssembler.buildExpertFullInfoVO(attachFiles, expertUserFullInfoAll); } | |||||
return expertUserInfoAssembler.buildExpertFullInfoVO(attachFiles, expertUserFullInfoAll); | |||||
} | |||||
} | } |
@@ -1,31 +0,0 @@ | |||||
package com.ningdatech.pmapi.expert.model.req; | |||||
import com.ningdatech.pmapi.expert.model.DictionaryFieldInfo; | |||||
import com.ningdatech.pmapi.expert.model.FileBasicInfo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import javax.validation.constraints.NotBlank; | |||||
import javax.validation.constraints.NotEmpty; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2022/7/22 下午5:49 | |||||
*/ | |||||
@Data | |||||
@ApiModel("专家证明材料提交Request") | |||||
public class ExpertRecommendProofSubmitRequest { | |||||
@NotEmpty | |||||
@ApiModelProperty("推荐方式") | |||||
private List<DictionaryFieldInfo> recommendedWay; | |||||
@ApiModelProperty("推荐证明材料") | |||||
private List<FileBasicInfo> recommendProofFile; | |||||
@NotBlank | |||||
@ApiModelProperty("短信验证码") | |||||
private String verificationCode; | |||||
} |
@@ -1,14 +1,13 @@ | |||||
package com.ningdatech.pmapi.expert.model.req; | package com.ningdatech.pmapi.expert.model.req; | ||||
import com.ningdatech.pmapi.expert.model.ExpertBasicInfo; | |||||
import com.ningdatech.pmapi.expert.model.ExpertEduInfo; | |||||
import com.ningdatech.pmapi.expert.model.ExpertJobInfo; | |||||
import com.ningdatech.pmapi.expert.model.ExpertProfessionalInfo; | |||||
import com.ningdatech.pmapi.expert.model.*; | |||||
import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
import lombok.Data; | import lombok.Data; | ||||
import javax.validation.constraints.NotEmpty; | |||||
import javax.validation.constraints.NotNull; | import javax.validation.constraints.NotNull; | ||||
import java.util.List; | |||||
/** | /** | ||||
* @author liuxinxin | * @author liuxinxin | ||||
@@ -33,4 +32,16 @@ public class ExpertUserBasicInfoSubmitRequest { | |||||
@NotNull | @NotNull | ||||
@ApiModelProperty("专业信息") | @ApiModelProperty("专业信息") | ||||
private ExpertProfessionalInfo professionalInfo; | private ExpertProfessionalInfo professionalInfo; | ||||
/** | |||||
* 补充推荐方式 | |||||
*/ | |||||
@NotEmpty | |||||
@ApiModelProperty("推荐方式") | |||||
private List<DictionaryFieldInfo> recommendedWay; | |||||
@ApiModelProperty("推荐证明材料") | |||||
private List<FileBasicInfo> recommendProofFile; | |||||
} | } |
@@ -67,17 +67,17 @@ public class MeetingController { | |||||
} | } | ||||
@ApiOperation("会议详情-基本信息") | @ApiOperation("会议详情-基本信息") | ||||
@GetMapping("detail/{meetingId}/basicInfo") | |||||
@GetMapping("/basicInfo/{meetingId}") | |||||
@WebLog(value = "会议详情-基本信息") | @WebLog(value = "会议详情-基本信息") | ||||
public MeetingDetailBasicVO meetingBasic(@PathVariable Long meetingId) { | public MeetingDetailBasicVO meetingBasic(@PathVariable Long meetingId) { | ||||
return meetingManage.getMeetingDetail(meetingId); | return meetingManage.getMeetingDetail(meetingId); | ||||
} | } | ||||
@ApiOperation("邀请情况详情") | |||||
@GetMapping("/detail/{meetingId}/inviteDetail") | |||||
@ApiOperation("抽取情况") | |||||
@GetMapping("/inviteExpertList/{meetingId}") | |||||
@WebLog(value = "邀请情况详请") | @WebLog(value = "邀请情况详请") | ||||
public ExpertInviteDetailVO inviteDetail(@PathVariable Long meetingId) { | |||||
return meetingManage.inviteDetail(meetingId); | |||||
public ExpertInviteDetailVO inviteExpertList(@PathVariable Long meetingId) { | |||||
return meetingManage.inviteExpertList(meetingId); | |||||
} | } | ||||
@ApiOperation("会议基础信息修改") | @ApiOperation("会议基础信息修改") | ||||
@@ -88,33 +88,17 @@ public class MeetingController { | |||||
} | } | ||||
@ApiOperation("会议详情-抽取规则") | @ApiOperation("会议详情-抽取规则") | ||||
@GetMapping("/detail/inviteRule/{meetingId}") | |||||
@GetMapping("/inviteRuleDetail/{meetingId}") | |||||
@WebLog(value = "会议详情-抽取规则") | @WebLog(value = "会议详情-抽取规则") | ||||
public InviteRuleDetailVO inviteRuleDetail(@PathVariable Long meetingId) { | public InviteRuleDetailVO inviteRuleDetail(@PathVariable Long meetingId) { | ||||
return meetingManage.inviteRuleDetail(meetingId); | return meetingManage.inviteRuleDetail(meetingId); | ||||
} | } | ||||
@ApiOperation("专家移除") | |||||
@PostMapping("/expertRemove") | |||||
@WebLog(value = "专家移除") | |||||
public void expertRemove(@RequestBody ExpertRemoveReq po) { | |||||
meetingManage.expertRemove(po); | |||||
} | |||||
@ApiOperation("专家替换") | @ApiOperation("专家替换") | ||||
@PostMapping("/expertReplace") | @PostMapping("/expertReplace") | ||||
@WebLog(value = "专家替换") | @WebLog(value = "专家替换") | ||||
public void expertReplace(@RequestBody ExpertRemoveReq po) { | public void expertReplace(@RequestBody ExpertRemoveReq po) { | ||||
meetingManage.expertReplace(po); | meetingManage.expertReplace(po); | ||||
} | |||||
@ApiOperation("确认名单(下发会议通知)") | |||||
@GetMapping("/sendMeetingNotice/{meetingId}") | |||||
@WebLog(value = "确认名单(下发会议通知") | |||||
public void sendMeetingNotice(@PathVariable Long meetingId) { | |||||
meetingManage.sendMeetingNotice(meetingId); | |||||
} | } | ||||
@ApiOperation("停止抽取") | @ApiOperation("停止抽取") | ||||
@@ -122,7 +106,6 @@ public class MeetingController { | |||||
@WebLog(value = "停止抽取") | @WebLog(value = "停止抽取") | ||||
public void stopInvite(@PathVariable Long meetingId) { | public void stopInvite(@PathVariable Long meetingId) { | ||||
meetingManage.stopRandomInvite(meetingId); | meetingManage.stopRandomInvite(meetingId); | ||||
} | } | ||||
@ApiOperation("取消会议") | @ApiOperation("取消会议") | ||||
@@ -133,10 +116,10 @@ public class MeetingController { | |||||
} | } | ||||
@ApiOperation("邀请函信息") | @ApiOperation("邀请函信息") | ||||
@GetMapping("/expertInvitationDetail") | |||||
@GetMapping("/expertInviteDetail") | |||||
@WebLog(value = "邀请函信息") | @WebLog(value = "邀请函信息") | ||||
public ExpertInvitationDetailVO expertInvitationDetail(@RequestParam("meetingId") Long meetingId, | |||||
@RequestParam(required = false) Long expertId) { | |||||
public ExpertInvitationDetailVO expertInvitationDetail(@RequestParam(required = false) Long expertId, | |||||
@RequestParam Long meetingId) { | |||||
return meetingManage.expertInvitationDetail(meetingId, expertId); | return meetingManage.expertInvitationDetail(meetingId, expertId); | ||||
} | } | ||||
@@ -148,10 +131,32 @@ public class MeetingController { | |||||
} | } | ||||
@ApiOperation("确认参加") | @ApiOperation("确认参加") | ||||
@PostMapping("/confirmAttendByManager") | |||||
@PostMapping("/expert/confirm") | |||||
@WebLog(value = "确认参加") | @WebLog(value = "确认参加") | ||||
public void confirmAttendByManager(@RequestBody ExpertRemoveReq po) { | |||||
meetingManage.confirmAttendByManager(po); | |||||
public void confirmAttendByManager(@RequestBody ExpertConfirmReq req) { | |||||
meetingManage.confirmAttendByManager(req); | |||||
} | } | ||||
@ApiOperation("释放专家") | |||||
@PostMapping("/expert/release") | |||||
@WebLog(value = "释放专家") | |||||
public void releaseExperts(@RequestBody MeetingCancelReq req) { | |||||
meetingManage.releaseExperts(req); | |||||
} | |||||
@ApiOperation("设置专家组长") | |||||
@PostMapping("setUpHeadman") | |||||
@WebLog(value = "设置专家组长") | |||||
public void setUpHeadman(@RequestBody ExpertConfirmReq req) { | |||||
meetingManage.setUpHeadman(req); | |||||
} | |||||
@ApiOperation("重发短信") | |||||
@PostMapping("/confirmedRoster") | |||||
@WebLog(value = "重发短信") | |||||
public void resendSms(MeetingCancelReq req) { | |||||
meetingManage.confirmedRoster(req.getMeetingId()); | |||||
} | |||||
} | } |
@@ -1,20 +0,0 @@ | |||||
package com.ningdatech.pmapi.meeting.controller; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.stereotype.Controller; | |||||
/** | |||||
* <p> | |||||
* 会议评审内部项目表 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-28 | |||||
*/ | |||||
@Controller | |||||
@RequestMapping("/pmapi.meeting/meeting-inner-project") | |||||
public class MeetingInnerProjectController { | |||||
} |
@@ -1,20 +0,0 @@ | |||||
package com.ningdatech.pmapi.meeting.controller; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.stereotype.Controller; | |||||
/** | |||||
* <p> | |||||
* 会议评审外部项目 前端控制器 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023-02-28 | |||||
*/ | |||||
@Controller | |||||
@RequestMapping("/pmapi.meeting/meeting-outer-project") | |||||
public class MeetingOuterProjectController { | |||||
} |
@@ -54,22 +54,6 @@ public class Meeting implements Serializable { | |||||
@ApiModelProperty("联系方式") | @ApiModelProperty("联系方式") | ||||
private String contact; | private String contact; | ||||
@ApiModelProperty("创建人ID") | |||||
@TableField(fill = FieldFill.INSERT) | |||||
private Long createBy; | |||||
@ApiModelProperty("创建时间") | |||||
@TableField(fill = FieldFill.INSERT) | |||||
private LocalDateTime createOn; | |||||
@ApiModelProperty("修改人ID") | |||||
@TableField(fill = FieldFill.INSERT_UPDATE) | |||||
private Long updateBy; | |||||
@ApiModelProperty("修改时间") | |||||
@TableField(fill = FieldFill.INSERT_UPDATE) | |||||
private LocalDateTime updateOn; | |||||
@ApiModelProperty("创建人") | @ApiModelProperty("创建人") | ||||
private String creator; | private String creator; | ||||
@@ -81,6 +65,9 @@ public class Meeting implements Serializable { | |||||
@ApiModelProperty("是否停止随机邀请") | @ApiModelProperty("是否停止随机邀请") | ||||
private Boolean inviteStopped; | private Boolean inviteStopped; | ||||
@ApiModelProperty("是否确认名单") | |||||
private Boolean confirmedRoster; | |||||
@ApiModelProperty("举办单位") | @ApiModelProperty("举办单位") | ||||
private String holdOrg; | private String holdOrg; | ||||
@@ -90,4 +77,23 @@ public class Meeting implements Serializable { | |||||
@ApiModelProperty("是否为内部项目") | @ApiModelProperty("是否为内部项目") | ||||
private Boolean isInnerProject; | private Boolean isInnerProject; | ||||
@ApiModelProperty("抽取类型") | |||||
private Integer inviteType; | |||||
@ApiModelProperty("创建人ID") | |||||
@TableField(fill = FieldFill.INSERT) | |||||
private Long createBy; | |||||
@ApiModelProperty("创建时间") | |||||
@TableField(fill = FieldFill.INSERT) | |||||
private LocalDateTime createOn; | |||||
@ApiModelProperty("修改人ID") | |||||
@TableField(fill = FieldFill.INSERT_UPDATE) | |||||
private Long updateBy; | |||||
@ApiModelProperty("修改时间") | |||||
@TableField(fill = FieldFill.INSERT_UPDATE) | |||||
private LocalDateTime updateOn; | |||||
} | } |
@@ -47,9 +47,14 @@ public class MeetingExpert implements Serializable { | |||||
private String mobile; | private String mobile; | ||||
private String expertName; | |||||
@ApiModelProperty("当前状态") | @ApiModelProperty("当前状态") | ||||
private Integer status; | private Integer status; | ||||
@ApiModelProperty("是否是专家组长") | |||||
private Boolean isHeadman; | |||||
@ApiModelProperty("前一个状态") | @ApiModelProperty("前一个状态") | ||||
private Integer preStatus; | private Integer preStatus; | ||||
@@ -68,6 +73,5 @@ public class MeetingExpert implements Serializable { | |||||
private String submitKey; | private String submitKey; | ||||
private String expertName; | |||||
} | } |
@@ -18,14 +18,15 @@ import java.util.Arrays; | |||||
public enum ExpertAttendStatusEnum { | public enum ExpertAttendStatusEnum { | ||||
NOTICING("通知中", 0), | NOTICING("通知中", 0), | ||||
NOT_ANSWERED("未应答", 1), | |||||
UNANSWERED("未应答", 1), | |||||
REPLACED("已替换", 2), | REPLACED("已替换", 2), | ||||
AGREED("同意参加", 3), | AGREED("同意参加", 3), | ||||
REFUSED("拒绝参加", 4), | REFUSED("拒绝参加", 4), | ||||
CANCELED("已移除", 5), | |||||
ON_LEAVE("已请假", 6); | |||||
REMOVED("已移除", 5), | |||||
ON_LEAVE("已请假", 6), | |||||
RELEASED("已释放", 7); | |||||
private final String desc; | |||||
private final String value; | |||||
private final Integer code; | private final Integer code; | ||||
public boolean eq(Integer code) { | public boolean eq(Integer code) { | ||||
@@ -1,32 +1,32 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.enumeration; | package com.ningdatech.pmapi.meeting.entity.enumeration; | ||||
import lombok.AllArgsConstructor; | |||||
import lombok.Getter; | import lombok.Getter; | ||||
import java.util.Arrays; | import java.util.Arrays; | ||||
/** | /** | ||||
* <p> | * <p> | ||||
* MeetingDateTermType-会议日期类型 | |||||
* MeetingDateTermType | |||||
* </p> | * </p> | ||||
* | * | ||||
* @author WendyYang | * @author WendyYang | ||||
* @since 09:54 2022/8/15 | * @since 09:54 2022/8/15 | ||||
*/ | */ | ||||
@Getter | @Getter | ||||
public enum MeetingDateTermType { | |||||
@AllArgsConstructor | |||||
public enum MeetingDateTermTypeEnum { | |||||
/** | |||||
* 会议日期类型 | |||||
*/ | |||||
ONE_DAY(1, "一天"), | ONE_DAY(1, "一天"), | ||||
MORE_THAN_ONE(2, "两天及以上"); | MORE_THAN_ONE(2, "两天及以上"); | ||||
private final Integer code; | private final Integer code; | ||||
private final String name; | |||||
private final String value; | |||||
MeetingDateTermType(Integer code, String name) { | |||||
this.code = code; | |||||
this.name = name; | |||||
} | |||||
public static MeetingDateTermType getByCode(Integer code) { | |||||
public static MeetingDateTermTypeEnum getByCode(Integer code) { | |||||
return Arrays.stream(values()) | return Arrays.stream(values()) | ||||
.filter(w -> w.getCode().equals(code)) | .filter(w -> w.getCode().equals(code)) | ||||
.findFirst() | .findFirst() |
@@ -0,0 +1,29 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.req; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import javax.validation.constraints.NotNull; | |||||
/** | |||||
* <p> | |||||
* 确认参加参数类 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 08:59 2022/8/10 | |||||
*/ | |||||
@Data | |||||
@ApiModel("确认参加") | |||||
public class ExpertConfirmReq { | |||||
@NotNull(message = "会议ID不能为空") | |||||
@ApiModelProperty("会议ID") | |||||
private Long meetingId; | |||||
@NotNull(message = "专家会议ID不能为空") | |||||
@ApiModelProperty("专家会议ID") | |||||
private Long expertMeetingId; | |||||
} |
@@ -0,0 +1,20 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.req; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
/** | |||||
* <p> | |||||
* MeetingExpertIdReq | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:11 2023/3/3 | |||||
*/ | |||||
@Data | |||||
public class MeetingExpertIdReq { | |||||
@ApiModelProperty("专家会议ID") | |||||
private Long expertMeetingId; | |||||
} |
@@ -3,13 +3,12 @@ package com.ningdatech.pmapi.meeting.entity.vo; | |||||
import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
import lombok.Data; | import lombok.Data; | ||||
import lombok.EqualsAndHashCode; | |||||
import java.util.List; | import java.util.List; | ||||
/** | /** | ||||
* <p> | * <p> | ||||
* ExpertInviteDetailVo | |||||
* ExpertInviteDetailVO | |||||
* </p> | * </p> | ||||
* | * | ||||
* @author WendyYang | * @author WendyYang | ||||
@@ -19,73 +18,16 @@ import java.util.List; | |||||
@ApiModel("专家邀请情况实体") | @ApiModel("专家邀请情况实体") | ||||
public class ExpertInviteDetailVO { | public class ExpertInviteDetailVO { | ||||
@Data | |||||
@EqualsAndHashCode(callSuper = true) | |||||
@ApiModel("最终参与名单实体") | |||||
public static class ExpertAttendListItemVO extends ExpertBasicInfoVO { | |||||
private Long meetingId; | |||||
private Long expertMeetingId; | |||||
@ApiModelProperty("邀请方式") | |||||
private String inviteType; | |||||
} | |||||
@Data | |||||
@EqualsAndHashCode(callSuper = true) | |||||
@ApiModel("随机邀请名单实体") | |||||
public static class RandomInviteListItemVO extends ExpertBasicInfoVO { | |||||
@ApiModelProperty("会议ID") | |||||
private Long meetingId; | |||||
@ApiModelProperty("专家会议ID") | |||||
private Long expertMeetingId; | |||||
@ApiModelProperty("电话通知状态") | |||||
private String noticeStatus; | |||||
@ApiModelProperty("邀请结果") | |||||
private String confirmResult; | |||||
@ApiModelProperty("邀请状态") | |||||
private Integer status; | |||||
} | |||||
@ApiModelProperty("参与数量总计") | |||||
private Integer attendTotal; | |||||
@ApiModelProperty("随机邀请参与数量") | |||||
private Integer randomAttend; | |||||
@ApiModelProperty("指定邀请参与数量") | |||||
private Integer appointAttend; | |||||
@ApiModelProperty("是否已停止邀请") | @ApiModelProperty("是否已停止邀请") | ||||
private Boolean invitedStopped; | private Boolean invitedStopped; | ||||
@ApiModelProperty("最终参与名单") | |||||
private List<ExpertAttendListItemVO> attendList; | |||||
@ApiModelProperty("随机邀请名单") | |||||
private List<RandomInviteListItemVO> randomInviteList; | |||||
@ApiModelProperty("指定邀请名单") | |||||
private List<RandomInviteListItemVO> appointInviteList; | |||||
public void addAttendList(ExpertAttendListItemVO attend) { | |||||
this.attendList.add(attend); | |||||
} | |||||
@ApiModelProperty("是否已确认名单") | |||||
private Boolean confirmedRoster; | |||||
public void addRandomInviteList(RandomInviteListItemVO randomInvite) { | |||||
this.randomInviteList.add(randomInvite); | |||||
} | |||||
@ApiModelProperty("邀请名单") | |||||
private List<InviteExpertListItemVO> inviteExpertList; | |||||
public void addAppointInviteList(RandomInviteListItemVO appointInvite) { | |||||
this.appointInviteList.add(appointInvite); | |||||
} | |||||
@ApiModelProperty("抽取情况") | |||||
private List<InviteStatisticsByRuleVO> inviteStatistics; | |||||
} | } |
@@ -0,0 +1,41 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.vo; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import lombok.EqualsAndHashCode; | |||||
import java.time.LocalDateTime; | |||||
/** | |||||
* <p> | |||||
* RandomInviteListItemVO | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 16:48 2023/3/3 | |||||
*/ | |||||
@Data | |||||
@ApiModel("邀请名单实体") | |||||
@EqualsAndHashCode(callSuper = true) | |||||
public class InviteExpertListItemVO extends ExpertBasicInfoVO { | |||||
@ApiModelProperty("邀请规则ID") | |||||
private Long ruleId; | |||||
@ApiModelProperty("会议ID") | |||||
private Long meetingId; | |||||
@ApiModelProperty("专家会议ID") | |||||
private Long expertMeetingId; | |||||
@ApiModelProperty("电话通知状态") | |||||
private String noticeStatus; | |||||
@ApiModelProperty("邀请状态") | |||||
private Integer status; | |||||
@ApiModelProperty("通知时间") | |||||
private LocalDateTime noticeTime; | |||||
} |
@@ -0,0 +1,50 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.vo; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
/** | |||||
* <p> | |||||
* InviteStatisticsVO | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 18:07 2023/3/4 | |||||
*/ | |||||
@Data | |||||
public class InviteStatisticsByRuleVO { | |||||
@ApiModelProperty("抽取规则ID") | |||||
private Long ruleId; | |||||
@ApiModelProperty("抽取人数") | |||||
private Integer inviteCnt; | |||||
@ApiModelProperty("同意人数") | |||||
private Integer agreeCnt; | |||||
@ApiModelProperty("实抽人数") | |||||
private Integer noticedCnt; | |||||
public static InviteStatisticsByRuleVO init(Long ruleId) { | |||||
InviteStatisticsByRuleVO statistics = new InviteStatisticsByRuleVO(); | |||||
statistics.setRuleId(ruleId); | |||||
statistics.setNoticedCnt(0); | |||||
statistics.setInviteCnt(0); | |||||
statistics.setAgreeCnt(0); | |||||
return statistics; | |||||
} | |||||
public void incrInviteCnt() { | |||||
this.inviteCnt++; | |||||
} | |||||
public void incrAgreeCnt() { | |||||
this.agreeCnt++; | |||||
} | |||||
public void incrNoticedCnt() { | |||||
this.noticedCnt++; | |||||
} | |||||
} |
@@ -17,7 +17,6 @@ import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingBasicDTO; | import com.ningdatech.pmapi.meeting.entity.dto.MeetingBasicDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatusEnum; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatusEnum; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatusEnum; | |||||
import com.ningdatech.pmapi.meeting.entity.req.MeetingListReq; | import com.ningdatech.pmapi.meeting.entity.req.MeetingListReq; | ||||
import com.ningdatech.pmapi.meeting.entity.vo.ExpertBasicInfoVO; | import com.ningdatech.pmapi.meeting.entity.vo.ExpertBasicInfoVO; | ||||
import com.ningdatech.pmapi.meeting.entity.vo.MeetingByManagerVO; | import com.ningdatech.pmapi.meeting.entity.vo.MeetingByManagerVO; | ||||
@@ -184,13 +183,13 @@ public class MeetingManageHelper { | |||||
switch (ExpertAttendStatusEnum.getByCode(w.getStatus())) { | switch (ExpertAttendStatusEnum.getByCode(w.getStatus())) { | ||||
case REFUSED: | case REFUSED: | ||||
throw BizException.wrap("专家%s已拒绝参加", expertName); | throw BizException.wrap("专家%s已拒绝参加", expertName); | ||||
case CANCELED: | |||||
case REMOVED: | |||||
throw BizException.wrap("专家%s已被移除", expertName); | throw BizException.wrap("专家%s已被移除", expertName); | ||||
case REPLACED: | case REPLACED: | ||||
switch (ExpertAttendStatusEnum.getByCode(w.getPreStatus())) { | switch (ExpertAttendStatusEnum.getByCode(w.getPreStatus())) { | ||||
case REFUSED: | case REFUSED: | ||||
throw BizException.wrap("专家%s已拒绝参加", expertName); | throw BizException.wrap("专家%s已拒绝参加", expertName); | ||||
case CANCELED: | |||||
case REMOVED: | |||||
throw BizException.wrap("专家%s已被移除", expertName); | throw BizException.wrap("专家%s已被移除", expertName); | ||||
default: | default: | ||||
break; | break; | ||||
@@ -409,7 +409,7 @@ public class ExpertInviteManage { | |||||
removeExpertIds.addAll(tempRefused); | removeExpertIds.addAll(tempRefused); | ||||
}); | }); | ||||
// 被取消的也不可以被再次抽中 | // 被取消的也不可以被再次抽中 | ||||
BizUtils.notEmpty(expertIdGroupByStatus.get(ExpertAttendStatusEnum.CANCELED), w -> { | |||||
BizUtils.notEmpty(expertIdGroupByStatus.get(ExpertAttendStatusEnum.REMOVED), w -> { | |||||
List<Long> tempCanceled = CollUtils.fieldList(w, MeetingExpert::getExpertId); | List<Long> tempCanceled = CollUtils.fieldList(w, MeetingExpert::getExpertId); | ||||
removeExpertIds.addAll(tempCanceled); | removeExpertIds.addAll(tempCanceled); | ||||
}); | }); | ||||
@@ -417,7 +417,7 @@ public class ExpertInviteManage { | |||||
BizUtils.notEmpty(expertIdGroupByStatus.get(ExpertAttendStatusEnum.REPLACED), w -> { | BizUtils.notEmpty(expertIdGroupByStatus.get(ExpertAttendStatusEnum.REPLACED), w -> { | ||||
for (MeetingExpert me : w) { | for (MeetingExpert me : w) { | ||||
BizUtils.notNull(me.getPreStatus(), preStatus -> { | BizUtils.notNull(me.getPreStatus(), preStatus -> { | ||||
if (ExpertAttendStatusEnum.REFUSED.eq(preStatus) || ExpertAttendStatusEnum.CANCELED.eq(preStatus)) { | |||||
if (ExpertAttendStatusEnum.REFUSED.eq(preStatus) || ExpertAttendStatusEnum.REMOVED.eq(preStatus)) { | |||||
removeExpertIds.add(me.getExpertId()); | removeExpertIds.add(me.getExpertId()); | ||||
} | } | ||||
}); | }); | ||||
@@ -16,7 +16,6 @@ import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import com.ningdatech.basic.util.ValidUtil; | import com.ningdatech.basic.util.ValidUtil; | ||||
import com.ningdatech.cache.lock.DistributedLock; | import com.ningdatech.cache.lock.DistributedLock; | ||||
import com.ningdatech.file.service.FileService; | |||||
import com.ningdatech.pmapi.common.helper.RegionCacheHelper; | import com.ningdatech.pmapi.common.helper.RegionCacheHelper; | ||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | ||||
import com.ningdatech.pmapi.expert.helper.PermissionCheckHelper; | import com.ningdatech.pmapi.expert.helper.PermissionCheckHelper; | ||||
@@ -29,8 +28,6 @@ import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatusEnum; | import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatusEnum; | ||||
import com.ningdatech.pmapi.meeting.entity.req.*; | import com.ningdatech.pmapi.meeting.entity.req.*; | ||||
import com.ningdatech.pmapi.meeting.entity.vo.*; | import com.ningdatech.pmapi.meeting.entity.vo.*; | ||||
import com.ningdatech.pmapi.meeting.entity.vo.ExpertInviteDetailVO.ExpertAttendListItemVO; | |||||
import com.ningdatech.pmapi.meeting.entity.vo.ExpertInviteDetailVO.RandomInviteListItemVO; | |||||
import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; | import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; | ||||
import com.ningdatech.pmapi.meeting.helper.MeetingManageHelper; | import com.ningdatech.pmapi.meeting.helper.MeetingManageHelper; | ||||
import com.ningdatech.pmapi.meeting.helper.YxtCallOrSmsHelper; | import com.ningdatech.pmapi.meeting.helper.YxtCallOrSmsHelper; | ||||
@@ -42,7 +39,6 @@ import com.ningdatech.pmapi.projectlib.model.entity.Project; | |||||
import com.ningdatech.pmapi.projectlib.service.IProjectService; | import com.ningdatech.pmapi.projectlib.service.IProjectService; | ||||
import com.ningdatech.pmapi.sys.model.dto.RegionDTO; | import com.ningdatech.pmapi.sys.model.dto.RegionDTO; | ||||
import com.ningdatech.pmapi.user.security.auth.model.UserInfoDetails; | import com.ningdatech.pmapi.user.security.auth.model.UserInfoDetails; | ||||
import com.ningdatech.pmapi.user.service.IUserInfoService; | |||||
import com.ningdatech.pmapi.user.util.LoginUserUtil; | import com.ningdatech.pmapi.user.util.LoginUserUtil; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
@@ -73,7 +69,6 @@ public class MeetingManage { | |||||
private final IExpertInviteAvoidRuleService inviteAvoidRuleService; | private final IExpertInviteAvoidRuleService inviteAvoidRuleService; | ||||
private final IExpertInviteRuleService inviteRuleService; | private final IExpertInviteRuleService inviteRuleService; | ||||
private final IExpertUserFullInfoService expertUserFullInfoService; | private final IExpertUserFullInfoService expertUserFullInfoService; | ||||
private final FileService fileService; | |||||
private final TagCache tagCache; | private final TagCache tagCache; | ||||
private final DictionaryCache dictionaryCache; | private final DictionaryCache dictionaryCache; | ||||
private final IMeetingExpertService meetingExpertService; | private final IMeetingExpertService meetingExpertService; | ||||
@@ -83,7 +78,6 @@ public class MeetingManage { | |||||
private final YxtCallOrSmsHelper yxtCallOrSmsHelper; | private final YxtCallOrSmsHelper yxtCallOrSmsHelper; | ||||
private final DistributedLock distributedLock; | private final DistributedLock distributedLock; | ||||
private final PermissionCheckHelper permissionCheckHelper; | private final PermissionCheckHelper permissionCheckHelper; | ||||
private final IUserInfoService userInfoService; | |||||
private final IProjectService projectService; | private final IProjectService projectService; | ||||
private final IMeetingInnerProjectService meetingInnerProjectService; | private final IMeetingInnerProjectService meetingInnerProjectService; | ||||
private final IMeetingOuterProjectService meetingOuterProjectService; | private final IMeetingOuterProjectService meetingOuterProjectService; | ||||
@@ -116,7 +110,8 @@ public class MeetingManage { | |||||
meeting.setHoldOrgCode(userDetail.getOrganizationCode()); | meeting.setHoldOrgCode(userDetail.getOrganizationCode()); | ||||
meeting.setRegionCode(userDetail.getRegionCode()); | meeting.setRegionCode(userDetail.getRegionCode()); | ||||
meeting.setCreator(userDetail.getUsername()); | meeting.setCreator(userDetail.getUsername()); | ||||
meeting.setInviteStopped(true); | |||||
meeting.setInviteStopped(Boolean.FALSE); | |||||
meeting.setConfirmedRoster(Boolean.FALSE); | |||||
meetingService.save(meeting); | meetingService.save(meeting); | ||||
if (meetingBasic.getIsInnerProject()) { | if (meetingBasic.getIsInnerProject()) { | ||||
List<MeetingInnerProject> projects = meetingBasic.getProjectIdList().stream().map(w -> { | List<MeetingInnerProject> projects = meetingBasic.getProjectIdList().stream().map(w -> { | ||||
@@ -351,80 +346,60 @@ public class MeetingManage { | |||||
return detail; | return detail; | ||||
} | } | ||||
public ExpertInviteDetailVO inviteDetail(Long meetingId) { | |||||
ExpertInviteDetailVO result = new ExpertInviteDetailVO(); | |||||
public ExpertInviteDetailVO inviteExpertList(Long meetingId) { | |||||
Meeting meeting = meetingService.getById(meetingId); | Meeting meeting = meetingService.getById(meetingId); | ||||
if (Objects.isNull(meeting)) { | |||||
throw new BizException("该会议信息不存在"); | |||||
if (meeting == null) { | |||||
throw BizException.wrap("该会议信息不存在"); | |||||
} | } | ||||
ExpertInviteDetailVO result = new ExpertInviteDetailVO(); | |||||
result.setInvitedStopped(meeting.getInviteStopped()); | result.setInvitedStopped(meeting.getInviteStopped()); | ||||
result.setConfirmedRoster(meeting.getConfirmedRoster()); | |||||
List<MeetingExpert> experts = meetingExpertService.listByMeetingId(meetingId); | List<MeetingExpert> experts = meetingExpertService.listByMeetingId(meetingId); | ||||
if (experts.isEmpty()) { | if (experts.isEmpty()) { | ||||
return result; | return result; | ||||
} | } | ||||
List<MeetingExpert> randomList = new ArrayList<>(); | |||||
List<MeetingExpert> appointList = new ArrayList<>(); | |||||
List<MeetingExpert> attendList = new ArrayList<>(); | |||||
List<Long> expertIds = new ArrayList<>(); | |||||
experts.forEach(w -> { | |||||
boolean randomInvite = w.getInviteType().equals(ExpertInviteTypeEnum.RANDOM.getCode()); | |||||
if (randomInvite) { | |||||
randomList.add(w); | |||||
} else { | |||||
appointList.add(w); | |||||
} | |||||
if (w.getStatus().equals(ExpertAttendStatusEnum.AGREED.getCode())) { | |||||
attendList.add(w); | |||||
if (randomInvite) { | |||||
result.setRandomAttend(result.getRandomAttend() + 1); | |||||
} else { | |||||
result.setAppointAttend(result.getAppointAttend() + 1); | |||||
} | |||||
} | |||||
expertIds.add(w.getExpertId()); | |||||
}); | |||||
result.setAttendTotal(attendList.size()); | |||||
Map<Long, ExpertBasicInfoVO> expertBasicInfoVoMap = meetingManageHelper.getExpertBasicInfo(expertIds); | |||||
Function<MeetingExpert, RandomInviteListItemVO> mapping = sme -> { | |||||
ExpertBasicInfoVO basicInfoVo = expertBasicInfoVoMap.get(sme.getExpertId()); | |||||
RandomInviteListItemVO item = BeanUtil.copyProperties(basicInfoVo, RandomInviteListItemVO.class); | |||||
item.setStatus(sme.getStatus()); | |||||
item.setMeetingId(sme.getMeetingId()); | |||||
List<Long> expertIds = CollUtils.fieldList(experts, MeetingExpert::getExpertId); | |||||
Map<Long, ExpertBasicInfoVO> expertMap = meetingManageHelper.getExpertBasicInfo(expertIds); | |||||
Function<MeetingExpert, InviteExpertListItemVO> mapping = sme -> { | |||||
ExpertBasicInfoVO expert = expertMap.get(sme.getExpertId()); | |||||
InviteExpertListItemVO item = BeanUtil.copyProperties(expert, InviteExpertListItemVO.class); | |||||
item.setExpertMeetingId(sme.getId()); | item.setExpertMeetingId(sme.getId()); | ||||
ExpertAttendStatusEnum status = ExpertAttendStatusEnum.getByCode(sme.getStatus()); | |||||
if (status.equals(ExpertAttendStatusEnum.NOTICING)) { | |||||
item.setNoticeStatus(status.getDesc()); | |||||
item.setConfirmResult(StrUtil.EMPTY); | |||||
item.setMeetingId(sme.getMeetingId()); | |||||
item.setStatus(sme.getStatus()); | |||||
item.setNoticeTime(sme.getCreateOn()); | |||||
item.setRuleId(sme.getRuleId()); | |||||
if (ExpertAttendStatusEnum.NOTICING.eq(sme.getStatus())) { | |||||
item.setNoticeStatus("通知中"); | |||||
} else { | } else { | ||||
item.setNoticeStatus("已通知"); | item.setNoticeStatus("已通知"); | ||||
item.setConfirmResult(status.getDesc()); | |||||
} | } | ||||
return item; | return item; | ||||
}; | }; | ||||
// 随机邀请列表 | |||||
randomList.forEach(w -> result.addRandomInviteList(mapping.apply(w))); | |||||
// 指定抽取列表 | |||||
appointList.forEach(w -> result.addAppointInviteList(mapping.apply(w))); | |||||
boolean isRandom = ExpertInviteTypeEnum.RANDOM.eq(meeting.getInviteType()); | |||||
if (!isRandom) { | |||||
result.setInviteStatistics(new ArrayList<>()); | |||||
Map<Long, List<MeetingExpert>> groupByRule = CollUtils.group(experts, MeetingExpert::getRuleId); | |||||
List<ExpertInviteRule> inviteRules = inviteRuleService.listByIds(groupByRule.keySet()); | |||||
Map<Long, ExpertInviteRule> ruleMap = CollUtils.listToMap(inviteRules, ExpertInviteRule::getId); | |||||
groupByRule.forEach((ruleId, expertList) -> { | |||||
InviteStatisticsByRuleVO statistics = InviteStatisticsByRuleVO.init(ruleId); | |||||
expertList.forEach((expert) -> { | |||||
Integer status = expert.getStatus(); | |||||
if (ExpertAttendStatusEnum.AGREED.eq(status)) { | |||||
statistics.incrAgreeCnt(); | |||||
} | |||||
statistics.setInviteCnt(ruleMap.get(ruleId).getInviteCount()); | |||||
statistics.incrNoticedCnt(); | |||||
}); | |||||
result.getInviteStatistics().add(statistics); | |||||
}); | |||||
} | |||||
List<InviteExpertListItemVO> converts = CollUtils.convert(experts, mapping); | |||||
result.setInviteExpertList(converts); | |||||
// 确定参加列表 | // 确定参加列表 | ||||
attendList.forEach(w -> { | |||||
ExpertBasicInfoVO expertBasicInfoVo = expertBasicInfoVoMap.get(w.getExpertId()); | |||||
ExpertAttendListItemVO item = BeanUtil.copyProperties(expertBasicInfoVo, ExpertAttendListItemVO.class); | |||||
item.setInviteType(ExpertInviteTypeEnum.getByCode(w.getInviteType()).getName()); | |||||
result.addAttendList(item); | |||||
}); | |||||
return result; | return result; | ||||
} | } | ||||
private boolean meetingInfoChange(Meeting old, Meeting current) { | |||||
if (!old.getStartTime().equals(current.getStartTime())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
if (!old.getRegionCode().equals(current.getRegionCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
} | |||||
/** | /** | ||||
* 会议基本信息修改 | * 会议基本信息修改 | ||||
* | * | ||||
@@ -506,7 +481,7 @@ public class MeetingManage { | |||||
public void expertRemove(ExpertRemoveReq po) { | public void expertRemove(ExpertRemoveReq po) { | ||||
LambdaUpdateWrapper<MeetingExpert> update = Wrappers.lambdaUpdate(MeetingExpert.class) | LambdaUpdateWrapper<MeetingExpert> update = Wrappers.lambdaUpdate(MeetingExpert.class) | ||||
.eq(MeetingExpert::getId, po.getExpertMeetingId()) | .eq(MeetingExpert::getId, po.getExpertMeetingId()) | ||||
.set(MeetingExpert::getStatus, ExpertAttendStatusEnum.CANCELED.getCode()); | |||||
.set(MeetingExpert::getStatus, ExpertAttendStatusEnum.REMOVED.getCode()); | |||||
meetingExpertService.update(update); | meetingExpertService.update(update); | ||||
} | } | ||||
@@ -582,32 +557,6 @@ public class MeetingManage { | |||||
meetingExpertService.saveBatch(expertList); | meetingExpertService.saveBatch(expertList); | ||||
} | } | ||||
public void sendMeetingNotice(Long meetingId) { | |||||
String key = "SEND_MEETING_NOTICE:" + meetingId; | |||||
if (!distributedLock.lock(key, RETRY_TIMES)) { | |||||
throw BizException.wrap("正在下发会议通知"); | |||||
} | |||||
try { | |||||
Meeting meeting = meetingService.getById(meetingId); | |||||
Assert.isTrue(meeting.getInviteStopped(), "随机邀请未结束"); | |||||
int noticeCount = meetingExpertService.countExpertByStatusAndMeetingId(ExpertAttendStatusEnum.NOTICING, meetingId, null); | |||||
Assert.isTrue(noticeCount == 0, "存在未确认完成的专家,暂无法下发会议通知"); | |||||
LambdaUpdateWrapper<Meeting> update = Wrappers.lambdaUpdate(Meeting.class) | |||||
.eq(Meeting::getId, meetingId); | |||||
meetingService.update(update); | |||||
// 发送会议通知 | |||||
List<MeetingExpert> experts = meetingExpertService.listAgreedExperts(Collections.singletonList(meetingId)); | |||||
if (!experts.isEmpty()) { | |||||
// TODO | |||||
// String meetingType = dictionaryCache.getByCode(meeting.getType()).getName(); | |||||
// List<SendSmsContext> contexts = YxtSmsContextBuilder.smsToExpertBySendNotice(meeting, experts, meetingType); | |||||
// yxtCallOrSmsHelper.sendSms(contexts); | |||||
} | |||||
} finally { | |||||
distributedLock.releaseLock(key); | |||||
} | |||||
} | |||||
public void stopRandomInvite(Long meetingId) { | public void stopRandomInvite(Long meetingId) { | ||||
expertInviteTask.cancelByMeetingId(meetingId); | expertInviteTask.cancelByMeetingId(meetingId); | ||||
} | } | ||||
@@ -649,12 +598,16 @@ public class MeetingManage { | |||||
public ExpertInvitationDetailVO expertInvitationDetail(Long meetingId, Long expertId) { | public ExpertInvitationDetailVO expertInvitationDetail(Long meetingId, Long expertId) { | ||||
Long userId = expertId == null ? LoginUserUtil.getUserId() : expertId; | Long userId = expertId == null ? LoginUserUtil.getUserId() : expertId; | ||||
MeetingExpert me = meetingExpertService.getByMeetingIdAndExpertId(meetingId, userId); | MeetingExpert me = meetingExpertService.getByMeetingIdAndExpertId(meetingId, userId); | ||||
Assert.notNull(me, "未被邀请参加"); | |||||
Assert.isTrue(ExpertAttendStatusEnum.AGREED.eq(me.getStatus()), "未确认参加"); | |||||
ExpertUserFullInfo expertInfo = expertUserFullInfoService.getByUserId(userId); | |||||
if (me == null) { | |||||
throw BizException.wrap("未被邀请参加此会议"); | |||||
} | |||||
if (ExpertAttendStatusEnum.AGREED.eq(me.getStatus())) { | |||||
throw BizException.wrap("未确认参加此会议"); | |||||
} | |||||
ExpertUserFullInfo userInfo = expertUserFullInfoService.getByUserId(userId); | |||||
Meeting meeting = meetingService.getById(meetingId); | Meeting meeting = meetingService.getById(meetingId); | ||||
return ExpertInvitationDetailVO.builder() | return ExpertInvitationDetailVO.builder() | ||||
.expertName(expertInfo.getExpertName()) | |||||
.expertName(userInfo.getExpertName()) | |||||
.holdOrg(meeting.getHoldOrg()) | .holdOrg(meeting.getHoldOrg()) | ||||
.meetingName(meeting.getName()) | .meetingName(meeting.getName()) | ||||
.startTime(meeting.getStartTime()) | .startTime(meeting.getStartTime()) | ||||
@@ -665,18 +618,95 @@ public class MeetingManage { | |||||
.build(); | .build(); | ||||
} | } | ||||
public void confirmAttendByManager(ExpertRemoveReq po) { | |||||
MeetingExpert meetingExpert = meetingExpertService.getById(po.getExpertMeetingId()); | |||||
if (meetingExpert.getStatus().equals(ExpertAttendStatusEnum.NOTICING.getCode())) { | |||||
public void confirmAttendByManager(ExpertConfirmReq req) { | |||||
String key = "CONFIRM_ATTEND:" + req.getExpertMeetingId(); | |||||
if (!distributedLock.lock(key, RETRY_TIMES)) { | |||||
throw BizException.wrap("确认参加失败,请重试!"); | |||||
} | |||||
try { | |||||
MeetingExpert me = meetingExpertService.getById(req.getExpertMeetingId()); | |||||
if (!ExpertAttendStatusEnum.NOTICING.eq(me.getStatus())) { | |||||
throw BizException.wrap("确认参加失败,请重试!"); | |||||
} | |||||
LambdaUpdateWrapper<MeetingExpert> update = Wrappers.lambdaUpdate(MeetingExpert.class) | LambdaUpdateWrapper<MeetingExpert> update = Wrappers.lambdaUpdate(MeetingExpert.class) | ||||
.set(MeetingExpert::getStatus, ExpertAttendStatusEnum.AGREED.getCode()) | .set(MeetingExpert::getStatus, ExpertAttendStatusEnum.AGREED.getCode()) | ||||
.set(MeetingExpert::getUpdateOn, LocalDateTime.now()) | |||||
.set(MeetingExpert::getUpdateBy, LoginUserUtil.getUserId()) | |||||
.eq(MeetingExpert::getId, po.getExpertMeetingId()); | |||||
.eq(MeetingExpert::getId, req.getExpertMeetingId()); | |||||
meetingExpertService.update(update); | meetingExpertService.update(update); | ||||
} else { | |||||
ExpertAttendStatusEnum status = ExpertAttendStatusEnum.getByCode(meetingExpert.getStatus()); | |||||
throw BizException.wrap("该专家" + status.getDesc()); | |||||
} finally { | |||||
distributedLock.releaseLock(key); | |||||
} | |||||
} | |||||
public void releaseExperts(MeetingCancelReq req) { | |||||
String key = "EXPERT_RELEASE:" + req.getMeetingId(); | |||||
if (!distributedLock.lock(key, RETRY_TIMES)) { | |||||
throw BizException.wrap("释放专家失败,请重试!"); | |||||
} | |||||
try { | |||||
Meeting meeting = meetingService.getById(req.getMeetingId()); | |||||
if (MeetingStatusEnum.CANCELED.eq(meeting.getStatus())) { | |||||
throw BizException.wrap("会议已取消"); | |||||
} | |||||
LambdaUpdateWrapper<MeetingExpert> update = Wrappers.lambdaUpdate(MeetingExpert.class) | |||||
.set(MeetingExpert::getStatus, ExpertAttendStatusEnum.RELEASED.getCode()) | |||||
.eq(MeetingExpert::getMeetingId, req.getMeetingId()); | |||||
meetingExpertService.update(update); | |||||
} finally { | |||||
distributedLock.releaseLock(key); | |||||
} | |||||
} | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public void setUpHeadman(ExpertConfirmReq req) { | |||||
String key = "SETUP_HEADMAN:" + req.getMeetingId(); | |||||
if (!distributedLock.lock(key, RETRY_TIMES)) { | |||||
throw BizException.wrap("设置专家组长失败,请重试!"); | |||||
} | |||||
try { | |||||
Meeting meeting = meetingService.getById(req.getMeetingId()); | |||||
if (MeetingStatusEnum.CANCELED.eq(meeting.getStatus())) { | |||||
throw BizException.wrap("会议已取消"); | |||||
} | |||||
LambdaUpdateWrapper<MeetingExpert> cancel = Wrappers.lambdaUpdate(MeetingExpert.class) | |||||
.set(MeetingExpert::getIsHeadman, Boolean.FALSE) | |||||
.eq(MeetingExpert::getIsHeadman, Boolean.TRUE) | |||||
.eq(MeetingExpert::getMeetingId, req.getMeetingId()); | |||||
meetingExpertService.update(cancel); | |||||
MeetingExpert headman = meetingExpertService.getById(req.getExpertMeetingId()); | |||||
if (!ExpertAttendStatusEnum.AGREED.eq(headman.getStatus())) { | |||||
ExpertAttendStatusEnum status = ExpertAttendStatusEnum.getByCode(headman.getStatus()); | |||||
throw BizException.wrap("该专家处于:%s状态,不能被设置为专家组长!", status.getValue()); | |||||
} | |||||
LambdaUpdateWrapper<MeetingExpert> setup = Wrappers.lambdaUpdate(MeetingExpert.class) | |||||
.set(MeetingExpert::getIsHeadman, Boolean.TRUE) | |||||
.eq(MeetingExpert::getId, req.getExpertMeetingId()); | |||||
meetingExpertService.update(setup); | |||||
} finally { | |||||
distributedLock.releaseLock(key); | |||||
} | |||||
} | |||||
public void confirmedRoster(Long meetingId) { | |||||
String key = "MEETING_RESEND_SMS:" + meetingId; | |||||
if (!distributedLock.lock(key, RETRY_TIMES)) { | |||||
throw BizException.wrap("请刷新后重试!"); | |||||
} | |||||
try { | |||||
Meeting meeting = meetingService.getById(meetingId); | |||||
if (!MeetingStatusEnum.NORMAL.eq(meeting.getStatus())) { | |||||
throw BizException.wrap("请刷新后重试!"); | |||||
} | |||||
if (!meeting.getConfirmedRoster()) { | |||||
// 首次确认的 | |||||
LambdaUpdateWrapper<Meeting> update = Wrappers.lambdaUpdate(Meeting.class); | |||||
update.set(Meeting::getConfirmedRoster, Boolean.TRUE); | |||||
update.eq(Meeting::getId, meetingId); | |||||
meetingService.update(update); | |||||
} | |||||
List<MeetingExpert> experts = meetingExpertService.listAgreedExperts(meetingId); | |||||
// TODO 发送会议通知 | |||||
} finally { | |||||
distributedLock.releaseLock(key); | |||||
} | } | ||||
} | } | ||||
@@ -61,7 +61,7 @@ public class MeetingExpertServiceImpl extends ServiceImpl<MeetingExpertMapper, M | |||||
ExpertAttendStatusEnum attendStatus = ExpertAttendStatusEnum.getByCode(item.getStatus()); | ExpertAttendStatusEnum attendStatus = ExpertAttendStatusEnum.getByCode(item.getStatus()); | ||||
if (item.getInviteType().equals(ExpertInviteTypeEnum.APPOINT.getCode())) { | if (item.getInviteType().equals(ExpertInviteTypeEnum.APPOINT.getCode())) { | ||||
// 被替换和已取消的不计数 | // 被替换和已取消的不计数 | ||||
if (attendStatus.equals(ExpertAttendStatusEnum.CANCELED) | |||||
if (attendStatus.equals(ExpertAttendStatusEnum.REMOVED) | |||||
|| attendStatus.equals(ExpertAttendStatusEnum.REPLACED)) { | || attendStatus.equals(ExpertAttendStatusEnum.REPLACED)) { | ||||
return; | return; | ||||
} | } | ||||
@@ -63,13 +63,13 @@ public class InitProcessTask { | |||||
Map<String, WflowForms> formsMap = Maps.newConcurrentMap(); | Map<String, WflowForms> formsMap = Maps.newConcurrentMap(); | ||||
//2.首先插入表单默认配置 | //2.首先插入表单默认配置 | ||||
for(Region region : regions){ | for(Region region : regions){ | ||||
log.info("当前初始化的是 【{}】 表单信息",region.getName()); | |||||
log.info("当前初始化的是 【{}】 表单信息",region.getRegionName()); | |||||
WflowForms existsForm = formsService.getOne(Wrappers.lambdaQuery(WflowForms.class) | WflowForms existsForm = formsService.getOne(Wrappers.lambdaQuery(WflowForms.class) | ||||
.eq(WflowForms::getRegionCode, region.getRegionCode()) | .eq(WflowForms::getRegionCode, region.getRegionCode()) | ||||
.last("limit 1")); | .last("limit 1")); | ||||
if(Objects.nonNull(existsForm)){ | if(Objects.nonNull(existsForm)){ | ||||
log.info("当前区域 【{}】 已经有表单数据 不需要初始化",region.getName()); | |||||
log.info("当前区域 【{}】 已经有表单数据 不需要初始化",region.getRegionName()); | |||||
formsMap.put(existsForm.getRegionCode(),existsForm); | formsMap.put(existsForm.getRegionCode(),existsForm); | ||||
continue; | continue; | ||||
} | } | ||||
@@ -80,28 +80,28 @@ public class InitProcessTask { | |||||
wflowForms.setUpdateOn(LocalDateTime.now()); | wflowForms.setUpdateOn(LocalDateTime.now()); | ||||
wflowForms.setFormName(TaskContant.Wflow.DEFAULT_FORM_NAME); | wflowForms.setFormName(TaskContant.Wflow.DEFAULT_FORM_NAME); | ||||
wflowForms.setRegionCode(region.getRegionCode()); | wflowForms.setRegionCode(region.getRegionCode()); | ||||
wflowForms.setRegionName(region.getName()); | |||||
wflowForms.setRegionName(region.getRegionName()); | |||||
if(formsService.save(wflowForms)){ | if(formsService.save(wflowForms)){ | ||||
log.info("当前区域 【{}】 表单数据已经保存成功",region.getName()); | |||||
log.info("当前区域 【{}】 表单数据已经保存成功",region.getRegionName()); | |||||
formsMap.put(wflowForms.getRegionCode(),wflowForms); | formsMap.put(wflowForms.getRegionCode(),wflowForms); | ||||
}else{ | }else{ | ||||
log.info("当前区域 【{}】 表单数据已经保存失败",region.getName()); | |||||
log.info("当前区域 【{}】 表单数据已经保存失败",region.getRegionName()); | |||||
} | } | ||||
} | } | ||||
//3.接着插入流程默认配置 | //3.接着插入流程默认配置 | ||||
for(Region region : regions){ | for(Region region : regions){ | ||||
log.info("当前初始化的是 【{}】 流程配置",region.getName()); | |||||
log.info("当前初始化的是 【{}】 流程配置",region.getRegionName()); | |||||
if(processModelService.count(Wrappers.lambdaQuery(WflowModels.class) | if(processModelService.count(Wrappers.lambdaQuery(WflowModels.class) | ||||
.eq(WflowModels::getRegionCode,region.getRegionCode())) > 0){ | .eq(WflowModels::getRegionCode,region.getRegionCode())) > 0){ | ||||
log.info("当前区域 【{}】 已经有流程数据 不需要初始化",region.getName()); | |||||
log.info("当前区域 【{}】 已经有流程数据 不需要初始化",region.getRegionName()); | |||||
continue; | continue; | ||||
} | } | ||||
// WflowForms form = formsMap.get(region.getRegionCode()); | // WflowForms form = formsMap.get(region.getRegionCode()); | ||||
// if(Objects.isNull(form)){ | // if(Objects.isNull(form)){ | ||||
// log.info("此区域 【{}】 没有对应form 不进行 流程配置初始化",region.getName()); | |||||
// log.info("此区域 【{}】 没有对应form 不进行 流程配置初始化",region.getRegionName()); | |||||
// continue; | // continue; | ||||
// } | // } | ||||
@@ -124,12 +124,12 @@ public class InitProcessTask { | |||||
if(StringUtils.isNotBlank(processModelService.saveProcess(models))){ | if(StringUtils.isNotBlank(processModelService.saveProcess(models))){ | ||||
//初始的流程在部署表也存一份,用来查询 | //初始的流程在部署表也存一份,用来查询 | ||||
if(StringUtils.isNotBlank(processModelService.deployProcess(models.getFormId(),null))){ | if(StringUtils.isNotBlank(processModelService.deployProcess(models.getFormId(),null))){ | ||||
log.info("当前区域 【{}】 流程名[{}] 流程数据已经保存成功",region.getName(),formName); | |||||
log.info("当前区域 【{}】 流程名[{}] 流程数据已经保存成功",region.getRegionName(),formName); | |||||
}else{ | }else{ | ||||
log.info("当前区域 【{}】 流程名[{}] 流程数据保存失败",region.getName(),formName); | |||||
log.info("当前区域 【{}】 流程名[{}] 流程数据保存失败",region.getRegionName(),formName); | |||||
} | } | ||||
}else{ | }else{ | ||||
log.info("当前区域 【{}】流程名[{}] 流程数据保存失败",region.getName(),formName); | |||||
log.info("当前区域 【{}】流程名[{}] 流程数据保存失败",region.getRegionName(),formName); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -46,7 +46,7 @@ public class WorkNoticeFlowTask { | |||||
private final INdWorkNoticeStagingService workNoticeStagingService; | private final INdWorkNoticeStagingService workNoticeStagingService; | ||||
private final ZwddClient zwddClient; | private final ZwddClient zwddClient; | ||||
@Scheduled(cron = "0 */1 * * * ?") | |||||
// @Scheduled(cron = "0 */1 * * * ?") | |||||
public void statusFlow() throws UnknownHostException { | public void statusFlow() throws UnknownHostException { | ||||
//测试暂时用自己电脑HOST | //测试暂时用自己电脑HOST | ||||
if (TaskContant.Host.HOST_CMM.equals(InetAddress.getLocalHost().getHostName())) { | if (TaskContant.Host.HOST_CMM.equals(InetAddress.getLocalHost().getHostName())) { | ||||
@@ -26,7 +26,7 @@ public class RegionConverter { | |||||
public static RegionDTO toRegionDTO(Region region) { | public static RegionDTO toRegionDTO(Region region) { | ||||
RegionDTO dto = new RegionDTO(); | RegionDTO dto = new RegionDTO(); | ||||
dto.setRegionLevel(region.getRegionLevel()); | dto.setRegionLevel(region.getRegionLevel()); | ||||
dto.setRegionName(region.getName()); | |||||
dto.setRegionName(region.getRegionName()); | |||||
dto.setParentCode(region.getParentCode()); | dto.setParentCode(region.getParentCode()); | ||||
dto.setRegionCode(region.getRegionCode()); | dto.setRegionCode(region.getRegionCode()); | ||||
dto.setId(region.getId()); | dto.setId(region.getId()); | ||||
@@ -27,7 +27,7 @@ public class Region implements Serializable { | |||||
private String regionCode; | private String regionCode; | ||||
private String name; | |||||
private String regionName; | |||||
private Integer regionLevel; | private Integer regionLevel; | ||||
@@ -37,10 +37,6 @@ public class Region implements Serializable { | |||||
private Long parentId; | private Long parentId; | ||||
private LocalDateTime createOn; | |||||
private LocalDateTime updateOn; | |||||
private String regionCodePath; | private String regionCodePath; | ||||
private Boolean deleted; | private Boolean deleted; | ||||
@@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.google.common.collect.Sets; | import com.google.common.collect.Sets; | ||||
import com.ningdatech.basic.exception.BizException; | import com.ningdatech.basic.exception.BizException; | ||||
import com.ningdatech.basic.function.VUtils; | |||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import com.ningdatech.pmapi.common.constant.CommonConst; | import com.ningdatech.pmapi.common.constant.CommonConst; | ||||
@@ -28,8 +29,8 @@ import com.ningdatech.pmapi.todocenter.bean.entity.WorkNoticeInfo; | |||||
import com.ningdatech.pmapi.todocenter.bean.vo.ProcessProgressDetailVo; | import com.ningdatech.pmapi.todocenter.bean.vo.ProcessProgressDetailVo; | ||||
import com.ningdatech.pmapi.todocenter.enumeration.IsAppendProjectEnum; | import com.ningdatech.pmapi.todocenter.enumeration.IsAppendProjectEnum; | ||||
import com.ningdatech.pmapi.todocenter.model.dto.req.ProcessDetailReq; | import com.ningdatech.pmapi.todocenter.model.dto.req.ProcessDetailReq; | ||||
import com.ningdatech.pmapi.todocenter.model.dto.req.ToBeProcessedReq; | |||||
import com.ningdatech.pmapi.todocenter.model.dto.req.ToBeProcessedExportReq; | import com.ningdatech.pmapi.todocenter.model.dto.req.ToBeProcessedExportReq; | ||||
import com.ningdatech.pmapi.todocenter.model.dto.req.ToBeProcessedReq; | |||||
import com.ningdatech.pmapi.todocenter.model.dto.vo.ResToBeProcessedVO; | import com.ningdatech.pmapi.todocenter.model.dto.vo.ResToBeProcessedVO; | ||||
import com.ningdatech.pmapi.user.entity.UserInfo; | import com.ningdatech.pmapi.user.entity.UserInfo; | ||||
import com.ningdatech.pmapi.user.service.IUserInfoService; | import com.ningdatech.pmapi.user.service.IUserInfoService; | ||||
@@ -43,20 +44,23 @@ import com.wflow.workflow.bean.vo.ProcessInstanceVo; | |||||
import com.wflow.workflow.bean.vo.ProcessProgressVo; | import com.wflow.workflow.bean.vo.ProcessProgressVo; | ||||
import com.wflow.workflow.bean.vo.ProcessTaskVo; | import com.wflow.workflow.bean.vo.ProcessTaskVo; | ||||
import com.wflow.workflow.enums.ProcessStatusEnum; | import com.wflow.workflow.enums.ProcessStatusEnum; | ||||
import com.wflow.workflow.service.*; | |||||
import com.wflow.workflow.service.ProcessInstanceService; | |||||
import com.wflow.workflow.service.ProcessTaskService; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.assertj.core.util.Lists; | import org.assertj.core.util.Lists; | ||||
import org.flowable.bpmn.model.*; | import org.flowable.bpmn.model.*; | ||||
import org.flowable.engine.*; | |||||
import org.flowable.engine.HistoryService; | |||||
import org.flowable.engine.history.HistoricProcessInstance; | import org.flowable.engine.history.HistoricProcessInstance; | ||||
import org.flowable.engine.runtime.ActivityInstance; | import org.flowable.engine.runtime.ActivityInstance; | ||||
import org.springframework.beans.BeanUtils; | import org.springframework.beans.BeanUtils; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.*; | import java.util.*; | ||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
import static com.ningdatech.pmapi.todocenter.constant.WorkNotice.*; | import static com.ningdatech.pmapi.todocenter.constant.WorkNotice.*; | ||||
import static com.wflow.workflow.task.TriggerServiceTask.runtimeService; | import static com.wflow.workflow.task.TriggerServiceTask.runtimeService; | ||||
@@ -95,8 +99,8 @@ public class TodoCenterManage { | |||||
Long userId = LoginUserUtil.getUserId(); | Long userId = LoginUserUtil.getUserId(); | ||||
//因为要解耦 不能把项目和工作流一起查 | //因为要解耦 不能把项目和工作流一起查 | ||||
//1.先查出用户工作流 | //1.先查出用户工作流 | ||||
List<ProcessTaskVo> userTodoList = processTaskService.getUserTodoList(param.getProcessDefId(),String.valueOf(userId)); | |||||
if(CollUtil.isEmpty(userTodoList)){ | |||||
List<ProcessTaskVo> userTodoList = processTaskService.getUserTodoList(param.getProcessDefId(), String.valueOf(userId)); | |||||
if (CollUtil.isEmpty(userTodoList)) { | |||||
return PageVo.empty(); | return PageVo.empty(); | ||||
} | } | ||||
List<String> instCodes = userTodoList.stream().map(ProcessTaskVo::getInstanceId).collect(Collectors.toList()); | List<String> instCodes = userTodoList.stream().map(ProcessTaskVo::getInstanceId).collect(Collectors.toList()); | ||||
@@ -105,16 +109,16 @@ public class TodoCenterManage { | |||||
//2.再分页查询项目信息 | //2.再分页查询项目信息 | ||||
ProjectListReq projectListReq = new ProjectListReq(); | ProjectListReq projectListReq = new ProjectListReq(); | ||||
projectListReq.setInstCodes(instCodes); | projectListReq.setInstCodes(instCodes); | ||||
BeanUtils.copyProperties(param,projectListReq); | |||||
BeanUtils.copyProperties(param, projectListReq); | |||||
PageVo<ProjectLibListItemVO> projectPage = projectLibManage.projectLibList(projectListReq); | PageVo<ProjectLibListItemVO> projectPage = projectLibManage.projectLibList(projectListReq); | ||||
if(0L == projectPage.getTotal()){ | |||||
if (0L == projectPage.getTotal()) { | |||||
return PageVo.empty(); | return PageVo.empty(); | ||||
} | } | ||||
List<HistoricProcessInstance> instances = historyService.createHistoricProcessInstanceQuery() | List<HistoricProcessInstance> instances = historyService.createHistoricProcessInstanceQuery() | ||||
.list(); | .list(); | ||||
Map<String,HistoricProcessInstance> instanceMap = CollUtils.listToMap(instances,HistoricProcessInstance::getId); | |||||
Map<String, HistoricProcessInstance> instanceMap = CollUtils.listToMap(instances, HistoricProcessInstance::getId); | |||||
List<ResToBeProcessedVO> resVos = projectPage.getRecords().stream().map(d -> { | List<ResToBeProcessedVO> resVos = projectPage.getRecords().stream().map(d -> { | ||||
ResToBeProcessedVO res = new ResToBeProcessedVO(); | ResToBeProcessedVO res = new ResToBeProcessedVO(); | ||||
@@ -122,9 +126,9 @@ public class TodoCenterManage { | |||||
res.setProjectId(d.getId()); | res.setProjectId(d.getId()); | ||||
ProcessTaskVo taskVo = taskVoMap.get(d.getInstCode()); | ProcessTaskVo taskVo = taskVoMap.get(d.getInstCode()); | ||||
res.setNodeId(taskVo.getTaskDefKey()); | res.setNodeId(taskVo.getTaskDefKey()); | ||||
if(instanceMap.containsKey(d.getInstCode())){ | |||||
if (instanceMap.containsKey(d.getInstCode())) { | |||||
res.setProcessStatusName(processInstanceService | res.setProcessStatusName(processInstanceService | ||||
.buildProcessStatusStr(instanceMap.get(d.getInstCode()).getEndActivityId())); | |||||
.buildProcessStatusStr(instanceMap.get(d.getInstCode()))); | |||||
} | } | ||||
res.setProcessLaunchTime(d.getCreateOn()); | res.setProcessLaunchTime(d.getCreateOn()); | ||||
return res; | return res; | ||||
@@ -149,13 +153,13 @@ public class TodoCenterManage { | |||||
//因为要解耦 不能把项目和工作流一起查 | //因为要解耦 不能把项目和工作流一起查 | ||||
//1.先查出用户工作流 | //1.先查出用户工作流 | ||||
List<ProcessTaskVo> userTodoList = processTaskService.getUserTodoList(param.getProcessDefId(),String.valueOf(userId)); | |||||
List<ProcessTaskVo> userTodoList = processTaskService.getUserTodoList(param.getProcessDefId(), String.valueOf(userId)); | |||||
List<String> instCodes = userTodoList.stream().map(ProcessTaskVo::getInstanceId).collect(Collectors.toList()); | List<String> instCodes = userTodoList.stream().map(ProcessTaskVo::getInstanceId).collect(Collectors.toList()); | ||||
//2.再查询项目信息 | //2.再查询项目信息 | ||||
ProjectListReq projectListReq = new ProjectListReq(); | ProjectListReq projectListReq = new ProjectListReq(); | ||||
projectListReq.setInstCodes(instCodes); | projectListReq.setInstCodes(instCodes); | ||||
BeanUtils.copyProperties(param,projectListReq); | |||||
BeanUtils.copyProperties(param, projectListReq); | |||||
List<Project> projects = CollUtil.isEmpty(userTodoList) ? Collections.emptyList() : projectLibManage.projectList(projectListReq); | List<Project> projects = CollUtil.isEmpty(userTodoList) ? Collections.emptyList() : projectLibManage.projectList(projectListReq); | ||||
PageVo<ProjectLibListItemVO> projectLibList = projectLibManage.projectLibList(projectListReq); | PageVo<ProjectLibListItemVO> projectLibList = projectLibManage.projectLibList(projectListReq); | ||||
@@ -195,11 +199,13 @@ public class TodoCenterManage { | |||||
// 获取入参 | // 获取入参 | ||||
String processInstanceId = param.getInstanceId(); | String processInstanceId = param.getInstanceId(); | ||||
Long projectId = param.getProjectId(); | Long projectId = param.getProjectId(); | ||||
VUtils.isTrue(Objects.isNull(processInstanceId)).throwMessage("获取流程实例ID失败!"); | |||||
VUtils.isTrue(Objects.isNull(projectId)).throwMessage("获取项目ID失败!"); | |||||
// 获取当前申报项目 | // 获取当前申报项目 | ||||
Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) | Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) | ||||
.eq(Project::getInstCode, processInstanceId) | .eq(Project::getInstCode, processInstanceId) | ||||
.eq(Project::getId,projectId)); | |||||
.eq(Project::getId, projectId)); | |||||
VUtils.isTrue(Objects.isNull(projectId)).throwMessage("获取项目ID失败!"); | |||||
// 获取当前项目名称 | // 获取当前项目名称 | ||||
String projectName = declaredProject.getProjectName(); | String projectName = declaredProject.getProjectName(); | ||||
// 获取当前项目状态 | // 获取当前项目状态 | ||||
@@ -235,23 +241,18 @@ public class TodoCenterManage { | |||||
ProgressNode currentNode = newProgressInfo.get(newProgressInfo.size() - 1); | ProgressNode currentNode = newProgressInfo.get(newProgressInfo.size() - 1); | ||||
UserInfo auditUserInfo = null; | UserInfo auditUserInfo = null; | ||||
// 说明当前节点是子流程节点 | // 说明当前节点是子流程节点 | ||||
if (currentNode.getNodeType().name().equals(NodeTypeEnum.SUB.name())){ | |||||
if (currentNode.getNodeType().name().equals(NodeTypeEnum.SUB.name())) { | |||||
List<ProgressNode> children = currentNode.getChildren(); | List<ProgressNode> children = currentNode.getChildren(); | ||||
// 获取子流程当前审核人节点 | // 获取子流程当前审核人节点 | ||||
ProgressNode subCurrentNode = children.get(children.size() - 1); | ProgressNode subCurrentNode = children.get(children.size() - 1); | ||||
auditUserInfo = userInfoService.getById(Long.valueOf(subCurrentNode.getUserId())); | auditUserInfo = userInfoService.getById(Long.valueOf(subCurrentNode.getUserId())); | ||||
}else { | |||||
} else { | |||||
auditUserInfo = userInfoService.getById(Long.valueOf(currentNode.getUserId())); | auditUserInfo = userInfoService.getById(Long.valueOf(currentNode.getUserId())); | ||||
} | } | ||||
// 如果流程状态是被退回状态,流程通过后,进入下一个审核人, | // 如果流程状态是被退回状态,流程通过后,进入下一个审核人, | ||||
// 当前通过审核人一定不是最后一个审核人(下一个审核人至多是最后一个),更新流程状态为审核中 | // 当前通过审核人一定不是最后一个审核人(下一个审核人至多是最后一个),更新流程状态为审核中 | ||||
if (ProcessStatusEnum.BE_BACKED.getDesc().equals(currentProcessStatus)) { | if (ProcessStatusEnum.BE_BACKED.getDesc().equals(currentProcessStatus)) { | ||||
// 更新流程状态为审核中 | |||||
declaredProject.setProcessStatus(ProcessStatusEnum.UNDER_REVIEW.getCode()); | |||||
declaredProject.setUpdateOn(LocalDateTime.now()); | |||||
declaredProject.setUpdateBy(userId); | |||||
projectService.updateById(declaredProject); | |||||
// 获取发送浙政钉工作通知必要信息 | // 获取发送浙政钉工作通知必要信息 | ||||
WorkNoticeInfo passWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); | WorkNoticeInfo passWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); | ||||
String passMsg = String.format(PASS_MSG_TEMPLATE, passWorkNoticeInfo.getOrganizationName(), projectName); | String passMsg = String.format(PASS_MSG_TEMPLATE, passWorkNoticeInfo.getOrganizationName(), projectName); | ||||
@@ -267,13 +268,13 @@ public class TodoCenterManage { | |||||
switch (Objects.requireNonNull(ProjectStatusEnum.getValue(projectStatus))) { | switch (Objects.requireNonNull(ProjectStatusEnum.getValue(projectStatus))) { | ||||
// 当前项目状态是单位内部审核中 | // 当前项目状态是单位内部审核中 | ||||
case UNDER_INTERNAL_AUDIT: | case UNDER_INTERNAL_AUDIT: | ||||
// 当前项目状态是预审中 | |||||
// 当前项目状态是预审中 | |||||
case PRE_APPLYING: | case PRE_APPLYING: | ||||
// 当前项目状态是部门联审中 | |||||
// 当前项目状态是部门联审中 | |||||
case DEPARTMENT_JOINT_REVIEW: | case DEPARTMENT_JOINT_REVIEW: | ||||
// 当前项目状态是方案评审中 | |||||
// 当前项目状态是方案评审中 | |||||
case SCHEME_UNDER_REVIEW: | case SCHEME_UNDER_REVIEW: | ||||
// 当前项目状态是终验审核中 | |||||
// 当前项目状态是终验审核中 | |||||
case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: | case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: | ||||
updatePassProjectStatus(userId, declaredProject); | updatePassProjectStatus(userId, declaredProject); | ||||
break; | break; | ||||
@@ -286,10 +287,13 @@ public class TodoCenterManage { | |||||
passWorkNoticeInfo2.setMsg(passMsg2); | passWorkNoticeInfo2.setMsg(passMsg2); | ||||
// 放入工作通知暂存表中,通过扫表异步发送 | // 放入工作通知暂存表中,通过扫表异步发送 | ||||
workNoticeStagingService.addByWorkNotice(passWorkNoticeInfo2, MsgTypeEnum.PASS); | workNoticeStagingService.addByWorkNotice(passWorkNoticeInfo2, MsgTypeEnum.PASS); | ||||
}else { | |||||
} else { | |||||
// 若有下一个审核人(当前节点的用户), | // 若有下一个审核人(当前节点的用户), | ||||
// 向其发送浙政钉工作通知:标题:审核任务 内容:【单位名称】的【项目名称】需要您审核。 | // 向其发送浙政钉工作通知:标题:审核任务 内容:【单位名称】的【项目名称】需要您审核。 | ||||
// 获取发送浙政钉工作通知必要信息 | // 获取发送浙政钉工作通知必要信息 | ||||
if (Objects.isNull(auditUserInfo)) { | |||||
throw new BizException("审核人信息不存在!"); | |||||
} | |||||
WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); | WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); | ||||
String msg = String.format(PASS_MSG_TEMPLATE, sendWorkNoticeInfo.getOrganizationName(), projectName); | String msg = String.format(PASS_MSG_TEMPLATE, sendWorkNoticeInfo.getOrganizationName(), projectName); | ||||
sendWorkNoticeInfo.setMsg(msg); | sendWorkNoticeInfo.setMsg(msg); | ||||
@@ -321,11 +325,6 @@ public class TodoCenterManage { | |||||
case BACK: | case BACK: | ||||
// 退回该任务 | // 退回该任务 | ||||
processTaskService.handleTask(param, userId); | processTaskService.handleTask(param, userId); | ||||
// 更新申报项目表中的流程状态为被退回 | |||||
declaredProject.setProcessStatus(ProcessStatusEnum.BE_BACKED.getCode()); | |||||
declaredProject.setUpdateOn(LocalDateTime.now()); | |||||
declaredProject.setUpdateBy(userId); | |||||
projectService.updateById(declaredProject); | |||||
// 给项目创建人、流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被退回,请及时处理。 | // 给项目创建人、流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被退回,请及时处理。 | ||||
// 获取发送浙政钉工作通知必要信息 | // 获取发送浙政钉工作通知必要信息 | ||||
WorkNoticeInfo backWorkNoticeInfo = getSendWorkNoticeInfo(startUserInfo); | WorkNoticeInfo backWorkNoticeInfo = getSendWorkNoticeInfo(startUserInfo); | ||||
@@ -337,7 +336,7 @@ public class TodoCenterManage { | |||||
// 撤回(流程发起人和当前流程审核人的前一个审核人操作) | // 撤回(流程发起人和当前流程审核人的前一个审核人操作) | ||||
case WITHDRAW: | case WITHDRAW: | ||||
// 当前登录用户是流程发起人 | // 当前登录用户是流程发起人 | ||||
if (userId.equals(Long.valueOf(startUserId))){ | |||||
if (userId.equals(Long.valueOf(startUserId))) { | |||||
processTaskService.handleTask(param, userId); | processTaskService.handleTask(param, userId); | ||||
// 若是流程发起人点击撤回,项目回到上一个状态,需调用状态机更新项目状态,流程状态更新为审核通过 | // 若是流程发起人点击撤回,项目回到上一个状态,需调用状态机更新项目状态,流程状态更新为审核通过 | ||||
switch (Objects.requireNonNull(ProjectStatusEnum.getValue(projectStatus))) { | switch (Objects.requireNonNull(ProjectStatusEnum.getValue(projectStatus))) { | ||||
@@ -356,7 +355,7 @@ public class TodoCenterManage { | |||||
default: | default: | ||||
throw new IllegalStateException("Unexpected value: " + projectStatus); | throw new IllegalStateException("Unexpected value: " + projectStatus); | ||||
} | } | ||||
}else { | |||||
} else { | |||||
// 当前登录用户不是流程发起人 | // 当前登录用户不是流程发起人 | ||||
List<ProgressNode> currentProgressInfo = currentInstanceDetail.getProgressInfo(); | List<ProgressNode> currentProgressInfo = currentInstanceDetail.getProgressInfo(); | ||||
// 获取当前工作流任务前一个审核人信息 | // 获取当前工作流任务前一个审核人信息 | ||||
@@ -367,12 +366,12 @@ public class TodoCenterManage { | |||||
ProcessInstanceUserDto currentUser = currentProgressNode.getUser(); | ProcessInstanceUserDto currentUser = currentProgressNode.getUser(); | ||||
// 判断当前工作流任务前一个审核人的部门和当前登录用户的部门是否是同一个,如果是同一个才可以撤回,否则抛出异常 | // 判断当前工作流任务前一个审核人的部门和当前登录用户的部门是否是同一个,如果是同一个才可以撤回,否则抛出异常 | ||||
boolean orgFlag = currentUser.getOrgCode().equals(beforeUser.getOrgCode()); | boolean orgFlag = currentUser.getOrgCode().equals(beforeUser.getOrgCode()); | ||||
boolean userFlag = beforeUser.getUserId().equals(String.valueOf( userId)); | |||||
boolean userFlag = beforeUser.getUserId().equals(String.valueOf(userId)); | |||||
if (!orgFlag) { | if (!orgFlag) { | ||||
throw new BizException("下一个审核人和您不是同一个部门,无法撤回!"); | throw new BizException("下一个审核人和您不是同一个部门,无法撤回!"); | ||||
} else if (!userFlag){ | |||||
} else if (!userFlag) { | |||||
throw new BizException("当前登录用户无法进行撤回操作!"); | throw new BizException("当前登录用户无法进行撤回操作!"); | ||||
} else{ | |||||
} else { | |||||
processTaskService.handleTask(param, userId); | processTaskService.handleTask(param, userId); | ||||
} | } | ||||
} | } | ||||
@@ -404,16 +403,13 @@ public class TodoCenterManage { | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
throw new BizException("状态机执行失败!"); | throw new BizException("状态机执行失败!"); | ||||
} | } | ||||
// 更新流程状态、项目状态到下一个状态 | |||||
declaredProject.setProcessStatus(ProcessStatusEnum.BE_REJECTED.getCode()); | |||||
declaredProject.setUpdateOn(LocalDateTime.now()); | |||||
declaredProject.setUpdateBy(userId); | |||||
projectService.updateById(declaredProject); | projectService.updateById(declaredProject); | ||||
} | } | ||||
/** | /** | ||||
* 获取发送浙政钉工作通知的信息 | * 获取发送浙政钉工作通知的信息 | ||||
* | |||||
* @param auditUserInfo | * @param auditUserInfo | ||||
* @return com.ningdatech.pmapi.todocenter.bean.entity.WorkNoticeInfo | * @return com.ningdatech.pmapi.todocenter.bean.entity.WorkNoticeInfo | ||||
* @author CMM | * @author CMM | ||||
@@ -422,7 +418,7 @@ public class TodoCenterManage { | |||||
public WorkNoticeInfo getSendWorkNoticeInfo(UserInfo auditUserInfo) { | public WorkNoticeInfo getSendWorkNoticeInfo(UserInfo auditUserInfo) { | ||||
WorkNoticeInfo workNoticeInfo = new WorkNoticeInfo(); | WorkNoticeInfo workNoticeInfo = new WorkNoticeInfo(); | ||||
Long accountId = auditUserInfo.getAccountId(); | Long accountId = auditUserInfo.getAccountId(); | ||||
if (Objects.isNull(accountId)){ | |||||
if (Objects.isNull(accountId)) { | |||||
throw new BizException("该用户没有录入浙政钉信息!"); | throw new BizException("该用户没有录入浙政钉信息!"); | ||||
} | } | ||||
workNoticeInfo.setAccountId(accountId); | workNoticeInfo.setAccountId(accountId); | ||||
@@ -438,12 +434,13 @@ public class TodoCenterManage { | |||||
workNoticeInfo.setOrganizationName(organizationName); | workNoticeInfo.setOrganizationName(organizationName); | ||||
// 构建唯一的消息ID | // 构建唯一的消息ID | ||||
String bizMsgId = "ZD_WORK_NOTICE_" + StrUtil.UNDERLINE + organizationCode + StrUtil.UNDERLINE | String bizMsgId = "ZD_WORK_NOTICE_" + StrUtil.UNDERLINE + organizationCode + StrUtil.UNDERLINE | ||||
+ organizationName + accountId + StrUtil.UNDERLINE + System.currentTimeMillis(); | |||||
+ organizationName + accountId + StrUtil.UNDERLINE + System.currentTimeMillis(); | |||||
workNoticeInfo.setBizMsgId(bizMsgId); | workNoticeInfo.setBizMsgId(bizMsgId); | ||||
String receiverUserId = String.valueOf(accountId); | String receiverUserId = String.valueOf(accountId); | ||||
workNoticeInfo.setReceiverUserId(receiverUserId); | workNoticeInfo.setReceiverUserId(receiverUserId); | ||||
return workNoticeInfo; | return workNoticeInfo; | ||||
} | } | ||||
/** | /** | ||||
* 当为通过操作时,更新项目表中项目状态 | * 当为通过操作时,更新项目表中项目状态 | ||||
* | * | ||||
@@ -465,10 +462,6 @@ public class TodoCenterManage { | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
throw new BizException("状态机执行失败!"); | throw new BizException("状态机执行失败!"); | ||||
} | } | ||||
// 更新流程状态、项目状态到下一个状态 | |||||
declaredProject.setProcessStatus(ProcessStatusEnum.APPROVED.getCode()); | |||||
declaredProject.setUpdateOn(LocalDateTime.now()); | |||||
declaredProject.setUpdateBy(userId); | |||||
projectService.updateById(declaredProject); | projectService.updateById(declaredProject); | ||||
} | } | ||||
@@ -503,6 +496,7 @@ public class TodoCenterManage { | |||||
return rootUserId; | return rootUserId; | ||||
} | } | ||||
/** | /** | ||||
* 获取当前节点的下一个节点的审核用户ID | * 获取当前节点的下一个节点的审核用户ID | ||||
* | * | ||||
@@ -559,11 +553,6 @@ public class TodoCenterManage { | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
throw new BizException("状态机执行失败!"); | throw new BizException("状态机执行失败!"); | ||||
} | } | ||||
// 更新项目状态 | |||||
declaredProject.setProcessStatus(ProcessStatusEnum.APPROVED.getCode()); | |||||
declaredProject.setUpdateOn(LocalDateTime.now()); | |||||
declaredProject.setUpdateBy(userId); | |||||
projectService.updateById(declaredProject); | |||||
} | } | ||||
/** | /** | ||||
@@ -582,18 +571,18 @@ public class TodoCenterManage { | |||||
Set<String> userSet = Sets.newHashSet(); | Set<String> userSet = Sets.newHashSet(); | ||||
progressInfo.forEach(node -> { | progressInfo.forEach(node -> { | ||||
if(CollUtil.isNotEmpty(node.getChildren())){ | |||||
for(ProgressNode innerNode : node.getChildren()){ | |||||
if (CollUtil.isNotEmpty(node.getChildren())) { | |||||
for (ProgressNode innerNode : node.getChildren()) { | |||||
userSet.add(innerNode.getUserId()); | userSet.add(innerNode.getUserId()); | ||||
} | } | ||||
}else{ | |||||
} else { | |||||
userSet.add(node.getUserId()); | userSet.add(node.getUserId()); | ||||
} | } | ||||
}); | }); | ||||
Map<String, ProcessInstanceUserDto> userMap = userInfoService.getUserMapByIds(userSet); | Map<String, ProcessInstanceUserDto> userMap = userInfoService.getUserMapByIds(userSet); | ||||
// 装配节点审核人员信息 | // 装配节点审核人员信息 | ||||
buildUser(progressInfo,userMap); | |||||
buildUser(progressInfo, userMap); | |||||
ProcessProgressDetailVo res = new ProcessProgressDetailVo(); | ProcessProgressDetailVo res = new ProcessProgressDetailVo(); | ||||
res.setProcessProgressVo(progressInstanceDetail); | res.setProcessProgressVo(progressInstanceDetail); | ||||
@@ -602,11 +591,11 @@ public class TodoCenterManage { | |||||
return res; | return res; | ||||
} | } | ||||
private void buildUser(List<ProgressNode> progressInfo,Map<String, ProcessInstanceUserDto> userMap) { | |||||
private void buildUser(List<ProgressNode> progressInfo, Map<String, ProcessInstanceUserDto> userMap) { | |||||
for (ProgressNode progressNode : progressInfo) { | for (ProgressNode progressNode : progressInfo) { | ||||
progressNode.setUser(userMap.get(progressNode.getUserId())); | progressNode.setUser(userMap.get(progressNode.getUserId())); | ||||
if(CollUtil.isNotEmpty(progressNode.getChildren())){ | |||||
buildUser(progressNode.getChildren(),userMap); | |||||
if (CollUtil.isNotEmpty(progressNode.getChildren())) { | |||||
buildUser(progressNode.getChildren(), userMap); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -623,8 +612,8 @@ public class TodoCenterManage { | |||||
Long userId = LoginUserUtil.getUserId(); | Long userId = LoginUserUtil.getUserId(); | ||||
// 查出用户已处理工作流 | // 查出用户已处理工作流 | ||||
List<ProcessTaskVo> userIdoList = processTaskService.getUserIdoList(param.getProcessDefId(),String.valueOf(userId)); | |||||
if(CollUtil.isEmpty(userIdoList)){ | |||||
List<ProcessTaskVo> userIdoList = processTaskService.getUserIdoList(param.getProcessDefId(), String.valueOf(userId)); | |||||
if (CollUtil.isEmpty(userIdoList)) { | |||||
return PageVo.empty(); | return PageVo.empty(); | ||||
} | } | ||||
List<String> instCodes = userIdoList.stream().map(ProcessTaskVo::getInstanceId).collect(Collectors.toList()); | List<String> instCodes = userIdoList.stream().map(ProcessTaskVo::getInstanceId).collect(Collectors.toList()); | ||||
@@ -633,7 +622,7 @@ public class TodoCenterManage { | |||||
// 分页查询项目信息 | // 分页查询项目信息 | ||||
ProjectListReq projectListReq = new ProjectListReq(); | ProjectListReq projectListReq = new ProjectListReq(); | ||||
projectListReq.setInstCodes(instCodes); | projectListReq.setInstCodes(instCodes); | ||||
BeanUtils.copyProperties(param,projectListReq); | |||||
BeanUtils.copyProperties(param, projectListReq); | |||||
PageVo<ProjectLibListItemVO> projectPage = projectLibManage.projectLibList(projectListReq); | PageVo<ProjectLibListItemVO> projectPage = projectLibManage.projectLibList(projectListReq); | ||||
if (0L == projectPage.getTotal()) { | if (0L == projectPage.getTotal()) { | ||||
@@ -648,7 +637,7 @@ public class TodoCenterManage { | |||||
res.setProcessHandleTime(d.getUpdateOn()); | res.setProcessHandleTime(d.getUpdateOn()); | ||||
return res; | return res; | ||||
}).collect(Collectors.toList()); | }).collect(Collectors.toList()); | ||||
return PageVo.of(resVos,projectPage.getTotal()); | |||||
return PageVo.of(resVos, projectPage.getTotal()); | |||||
} | } | ||||
/** | /** | ||||
@@ -715,10 +704,12 @@ public class TodoCenterManage { | |||||
public PageVo<ResToBeProcessedVO> mySubmittedList(ToBeProcessedReq param) { | public PageVo<ResToBeProcessedVO> mySubmittedList(ToBeProcessedReq param) { | ||||
// 获取登录用户ID | // 获取登录用户ID | ||||
Long startUserId = LoginUserUtil.getUserId(); | |||||
Long startUserId = LoginUserUtil.getUserId(); | |||||
// 查出登录用户已提交工作流 | // 查出登录用户已提交工作流 | ||||
List<ProcessInstanceVo> userSubmittedList = processInstanceService.getUserSubmittedList(String.valueOf(startUserId), param.getProcessDefId(), null); | List<ProcessInstanceVo> userSubmittedList = processInstanceService.getUserSubmittedList(String.valueOf(startUserId), param.getProcessDefId(), null); | ||||
if(CollUtil.isEmpty(userSubmittedList)){ | |||||
Map<String, ProcessInstanceVo> instanceVoMap = userSubmittedList.stream() | |||||
.collect(Collectors.toMap(ProcessInstanceVo::getInstanceId, v -> v)); | |||||
if (CollUtil.isEmpty(userSubmittedList)) { | |||||
return PageVo.empty(); | return PageVo.empty(); | ||||
} | } | ||||
List<String> instCodes = userSubmittedList.stream().map(ProcessInstanceVo::getInstanceId).collect(Collectors.toList()); | List<String> instCodes = userSubmittedList.stream().map(ProcessInstanceVo::getInstanceId).collect(Collectors.toList()); | ||||
@@ -726,7 +717,7 @@ public class TodoCenterManage { | |||||
// 分页查询项目信息 | // 分页查询项目信息 | ||||
ProjectListReq projectListReq = new ProjectListReq(); | ProjectListReq projectListReq = new ProjectListReq(); | ||||
projectListReq.setInstCodes(instCodes); | projectListReq.setInstCodes(instCodes); | ||||
BeanUtils.copyProperties(param,projectListReq); | |||||
BeanUtils.copyProperties(param, projectListReq); | |||||
PageVo<ProjectLibListItemVO> projectPage = projectLibManage.projectLibList(projectListReq); | PageVo<ProjectLibListItemVO> projectPage = projectLibManage.projectLibList(projectListReq); | ||||
if (0L == projectPage.getTotal()) { | if (0L == projectPage.getTotal()) { | ||||
@@ -737,11 +728,12 @@ public class TodoCenterManage { | |||||
ResToBeProcessedVO res = new ResToBeProcessedVO(); | ResToBeProcessedVO res = new ResToBeProcessedVO(); | ||||
BeanUtils.copyProperties(d, res); | BeanUtils.copyProperties(d, res); | ||||
res.setProjectId(d.getId()); | res.setProjectId(d.getId()); | ||||
res.setProcessStatusName(ProcessStatusEnum.getDescByCode(d.getProcessStatus())); | |||||
ProcessInstanceVo instanceVo = instanceVoMap.get(d.getInstCode()); | |||||
res.setProcessStatusName(instanceVo.getStatus()); | |||||
res.setProcessLaunchTime(d.getCreateOn()); | res.setProcessLaunchTime(d.getCreateOn()); | ||||
return res; | return res; | ||||
}).collect(Collectors.toList()); | }).collect(Collectors.toList()); | ||||
return PageVo.of(resVos,projectPage.getTotal()); | |||||
return PageVo.of(resVos, projectPage.getTotal()); | |||||
} | } | ||||
/** | /** | ||||
@@ -756,7 +748,7 @@ public class TodoCenterManage { | |||||
public void exportMySubmittedList(HttpServletResponse response, ToBeProcessedExportReq param) { | public void exportMySubmittedList(HttpServletResponse response, ToBeProcessedExportReq param) { | ||||
// 获取登录用户ID | // 获取登录用户ID | ||||
long userId = LoginUserUtil.getUserId(); | |||||
long userId = LoginUserUtil.getUserId(); | |||||
param.setPageNumber(CommonConst.EXPORT_PAGE_NUMBER); | param.setPageNumber(CommonConst.EXPORT_PAGE_NUMBER); | ||||
param.setPageSize(CommonConst.EXPORT_PAGE_SIZE); | param.setPageSize(CommonConst.EXPORT_PAGE_SIZE); | ||||
@@ -769,7 +761,8 @@ public class TodoCenterManage { | |||||
projectListReq.setInstCodes(instCodes); | projectListReq.setInstCodes(instCodes); | ||||
BeanUtils.copyProperties(param, projectListReq); | BeanUtils.copyProperties(param, projectListReq); | ||||
List<Project> projects = CollUtil.isEmpty(userSubmittedList) ? Collections.emptyList() : | List<Project> projects = CollUtil.isEmpty(userSubmittedList) ? Collections.emptyList() : | ||||
projectLibManage.projectList(projectListReq);projectLibManage.projectList(projectListReq); | |||||
projectLibManage.projectList(projectListReq); | |||||
projectLibManage.projectList(projectListReq); | |||||
ExcelExportWriter excelExportWriter = new ExcelExportWriter(); | ExcelExportWriter excelExportWriter = new ExcelExportWriter(); | ||||
@@ -807,11 +800,11 @@ public class TodoCenterManage { | |||||
*/ | */ | ||||
public PageVo<ResToBeProcessedVO> ccmeList(ToBeProcessedReq param) { | public PageVo<ResToBeProcessedVO> ccmeList(ToBeProcessedReq param) { | ||||
// 获取当前登录用户ID | // 获取当前登录用户ID | ||||
Long userId = LoginUserUtil.getUserId(); | |||||
Long userId = LoginUserUtil.getUserId(); | |||||
// 查询抄送登录用户的工作流 | // 查询抄送登录用户的工作流 | ||||
List<ProcessInstanceVo> ccMeList = processInstanceService.getCcMeList(param.getProcessDefId(), String.valueOf(userId)); | List<ProcessInstanceVo> ccMeList = processInstanceService.getCcMeList(param.getProcessDefId(), String.valueOf(userId)); | ||||
if(CollUtil.isEmpty(ccMeList)){ | |||||
if (CollUtil.isEmpty(ccMeList)) { | |||||
return PageVo.empty(); | return PageVo.empty(); | ||||
} | } | ||||
List<String> instCodes = ccMeList.stream().map(ProcessInstanceVo::getInstanceId).collect(Collectors.toList()); | List<String> instCodes = ccMeList.stream().map(ProcessInstanceVo::getInstanceId).collect(Collectors.toList()); | ||||
@@ -821,7 +814,7 @@ public class TodoCenterManage { | |||||
// 分页查询项目信息 | // 分页查询项目信息 | ||||
ProjectListReq projectListReq = new ProjectListReq(); | ProjectListReq projectListReq = new ProjectListReq(); | ||||
projectListReq.setInstCodes(instCodes); | projectListReq.setInstCodes(instCodes); | ||||
BeanUtils.copyProperties(param,projectListReq); | |||||
BeanUtils.copyProperties(param, projectListReq); | |||||
PageVo<ProjectLibListItemVO> projectPage = projectLibManage.projectLibList(projectListReq); | PageVo<ProjectLibListItemVO> projectPage = projectLibManage.projectLibList(projectListReq); | ||||
if (0L == projectPage.getTotal()) { | if (0L == projectPage.getTotal()) { | ||||
@@ -834,11 +827,11 @@ public class TodoCenterManage { | |||||
ProcessInstanceVo instanceVo = instanceVoMap.get(d.getInstCode()); | ProcessInstanceVo instanceVo = instanceVoMap.get(d.getInstCode()); | ||||
res.setNodeId(instanceVo.getNodeId()); | res.setNodeId(instanceVo.getNodeId()); | ||||
res.setProjectId(d.getId()); | res.setProjectId(d.getId()); | ||||
res.setProcessStatusName(ProcessStatusEnum.getDescByCode(d.getProcessStatus())); | |||||
res.setProcessStatusName(instanceVo.getStatus()); | |||||
res.setProcessLaunchTime(d.getCreateOn()); | res.setProcessLaunchTime(d.getCreateOn()); | ||||
return res; | return res; | ||||
}).collect(Collectors.toList()); | }).collect(Collectors.toList()); | ||||
return PageVo.of(resVos,projectPage.getTotal()); | |||||
return PageVo.of(resVos, projectPage.getTotal()); | |||||
} | } | ||||
/** | /** | ||||
@@ -88,11 +88,6 @@ | |||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
<groupId>com.ningdatech</groupId> | <groupId>com.ningdatech</groupId> | ||||
<artifactId>nd-dict-starter</artifactId> | |||||
<version>1.0.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.ningdatech</groupId> | |||||
<artifactId>nd-basic</artifactId> | <artifactId>nd-basic</artifactId> | ||||
<version>1.0.0</version> | <version>1.0.0</version> | ||||
</dependency> | </dependency> | ||||