@@ -2,8 +2,7 @@ package com.ningdatech.pmapi.meeting.builder; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | ||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteType; | |||||
import com.ningdatech.pmapi.user.entity.UserInfo; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -19,10 +18,10 @@ public class ExpertInviteBuilder { | |||||
} | } | ||||
public static MeetingExpert getExpertByRandom(Long meetingId, ExpertUserFullInfo user, Long ruleId) { | public static MeetingExpert getExpertByRandom(Long meetingId, ExpertUserFullInfo user, Long ruleId) { | ||||
return getExpertBasic(meetingId, user, ruleId, ExpertInviteType.RANDOM); | |||||
return getExpertBasic(meetingId, user, ruleId, ExpertInviteTypeEnum.RANDOM); | |||||
} | } | ||||
private static MeetingExpert getExpertBasic(Long meetingId, ExpertUserFullInfo user, Long ruleId, ExpertInviteType type) { | |||||
private static MeetingExpert getExpertBasic(Long meetingId, ExpertUserFullInfo user, Long ruleId, ExpertInviteTypeEnum type) { | |||||
MeetingExpert expert = new MeetingExpert(); | MeetingExpert expert = new MeetingExpert(); | ||||
expert.setMeetingId(meetingId); | expert.setMeetingId(meetingId); | ||||
expert.setMobile(user.getPhoneNo()); | expert.setMobile(user.getPhoneNo()); | ||||
@@ -34,7 +33,7 @@ public class ExpertInviteBuilder { | |||||
} | } | ||||
public static MeetingExpert getExpertByAppoint(Long meetingId, ExpertUserFullInfo user, Long ruleId) { | public static MeetingExpert getExpertByAppoint(Long meetingId, ExpertUserFullInfo user, Long ruleId) { | ||||
return getExpertBasic(meetingId, user, ruleId, ExpertInviteType.APPOINT); | |||||
return getExpertBasic(meetingId, user, ruleId, ExpertInviteTypeEnum.APPOINT); | |||||
} | } | ||||
} | } |
@@ -36,20 +36,20 @@ public class MeetingController { | |||||
@PostMapping("/save") | @PostMapping("/save") | ||||
@ApiOperation("新建会议") | @ApiOperation("新建会议") | ||||
@WebLog(value = "新建会议") | @WebLog(value = "新建会议") | ||||
public IdVo<Long> meetingCreate(@Valid @RequestBody MeetingBasicDTO req) { | |||||
public IdVo<Long> meetingCreate(@Valid @RequestBody MeetingCreateReq req) { | |||||
return meetingManage.save(req); | return meetingManage.save(req); | ||||
} | } | ||||
@PostMapping("/expertInviteByCreate") | @PostMapping("/expertInviteByCreate") | ||||
@ApiOperation("新建会议-专家抽取") | @ApiOperation("新建会议-专家抽取") | ||||
@WebLog(value = "新建会议-专家抽取") | @WebLog(value = "新建会议-专家抽取") | ||||
public void expertInviteByCreate(@Valid @RequestBody ExpertInviteCreateReq po) { | |||||
public void expertInviteByCreate(@Valid @RequestBody ExpertInviteReq po) { | |||||
meetingManage.expertInviteByCreate(po); | meetingManage.expertInviteByCreate(po); | ||||
} | } | ||||
@ApiOperation("专家抽取数量校验") | @ApiOperation("专家抽取数量校验") | ||||
@PostMapping("/expertCountOnChange") | @PostMapping("/expertCountOnChange") | ||||
public ExpertCountOnChangeVO expertCountOnChange(@RequestBody ExpertInviteCreateReq po) { | |||||
public ExpertCountOnChangeVO expertCountOnChange(@RequestBody ExpertInviteReq po) { | |||||
return meetingManage.expertCountOnChange(po); | return meetingManage.expertCountOnChange(po); | ||||
} | } | ||||
@@ -35,11 +35,14 @@ public class ExpertInviteAvoidRule implements Serializable { | |||||
@ApiModelProperty("回避专家ID") | @ApiModelProperty("回避专家ID") | ||||
private String expertIds; | private String expertIds; | ||||
@ApiModelProperty("回避单位名称") | |||||
private String companyIds; | |||||
@ApiModelProperty("回避单位ID") | |||||
private String avoidUnitIds; | |||||
@ApiModelProperty("回避本单位同事") | |||||
private Boolean avoidMates; | |||||
@ApiModelProperty("回避条线ID") | |||||
private String avoidOrgIds; | |||||
@ApiModelProperty("每周参与次数") | |||||
private Integer weekInviteCount; | |||||
@ApiModelProperty("创建人ID") | @ApiModelProperty("创建人ID") | ||||
private Long createBy; | private Long createBy; | ||||
@@ -81,20 +81,13 @@ public class Meeting implements Serializable { | |||||
@ApiModelProperty("是否停止随机邀请") | @ApiModelProperty("是否停止随机邀请") | ||||
private Boolean inviteStopped; | private Boolean inviteStopped; | ||||
@ApiModelProperty("是否进行了专家抽取") | |||||
private Boolean invited; | |||||
@ApiModelProperty("取消说明") | |||||
private String cancelRemark; | |||||
@ApiModelProperty("举办单位") | @ApiModelProperty("举办单位") | ||||
private String holdOrg; | private String holdOrg; | ||||
@ApiModelProperty("举办单位ID") | @ApiModelProperty("举办单位ID") | ||||
private String holdOrgCode; | private String holdOrgCode; | ||||
public String getHoldCompanyBracket() { | |||||
return "(" + this.getHoldOrg() + ")"; | |||||
} | |||||
@ApiModelProperty("是否为内部项目") | |||||
private Boolean isInnerProject; | |||||
} | } |
@@ -6,12 +6,11 @@ import lombok.Data; | |||||
import javax.validation.constraints.NotEmpty; | import javax.validation.constraints.NotEmpty; | ||||
import javax.validation.constraints.NotNull; | import javax.validation.constraints.NotNull; | ||||
import java.util.Collections; | |||||
import java.util.List; | import java.util.List; | ||||
/** | /** | ||||
* <p> | * <p> | ||||
* AvoidInfoDto | |||||
* 专家邀请回避规则 | |||||
* </p> | * </p> | ||||
* | * | ||||
* @author WendyYang | * @author WendyYang | ||||
@@ -23,38 +22,17 @@ public class AvoidInfoDTO { | |||||
@ApiModelProperty("回避单位") | @ApiModelProperty("回避单位") | ||||
@NotEmpty(message = "回避单位不能为空", groups = {AbstractInviteRule.RuleSave.class}) | @NotEmpty(message = "回避单位不能为空", groups = {AbstractInviteRule.RuleSave.class}) | ||||
private List<String> companyIds; | |||||
private List<String> avoidUnitIdList; | |||||
@ApiModelProperty("是否回避同单位其他专家") | |||||
@NotNull(message = "是否回避同单位其他专家不能为空") | |||||
private Boolean avoidMates; | |||||
@ApiModelProperty("回避条线") | |||||
@NotEmpty(message = "回避条线不能为空", groups = {AbstractInviteRule.RuleSave.class}) | |||||
private List<String> avoidOrgIdList; | |||||
@ApiModelProperty("回避专家ID") | |||||
private List<Long> expertIds; | |||||
@ApiModelProperty("每周邀请次数") | |||||
private Integer weekInviteCount; | |||||
/** | |||||
* 返回一个默认值,仅在前端未传值时使用 | |||||
* | |||||
* @return / | |||||
*/ | |||||
public static AvoidInfoDTO defVal() { | |||||
AvoidInfoDTO val = new AvoidInfoDTO(); | |||||
val.setAvoidMates(false); | |||||
val.setCompanyIds(Collections.emptyList()); | |||||
val.setExpertIds(Collections.emptyList()); | |||||
return val; | |||||
} | |||||
public void initDefVal() { | |||||
if (this.avoidMates == null) { | |||||
this.setAvoidMates(false); | |||||
} | |||||
if (this.companyIds == null) { | |||||
this.setCompanyIds(Collections.emptyList()); | |||||
} | |||||
if (this.expertIds == null) { | |||||
this.setExpertIds(Collections.emptyList()); | |||||
} | |||||
} | |||||
@ApiModelProperty("回避专家") | |||||
@NotEmpty(message = "回避专家不能为空", groups = {AbstractInviteRule.RuleSave.class}) | |||||
private List<Long> expertIds; | |||||
} | } |
@@ -1,6 +1,5 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.dto; | package com.ningdatech.pmapi.meeting.entity.dto; | ||||
import com.alibaba.excel.annotation.format.DateTimeFormat; | |||||
import com.fasterxml.jackson.annotation.JsonFormat; | import com.fasterxml.jackson.annotation.JsonFormat; | ||||
import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
@@ -22,6 +21,10 @@ import java.time.LocalDateTime; | |||||
@ApiModel("会议基本信息") | @ApiModel("会议基本信息") | ||||
public class MeetingBasicDTO { | public class MeetingBasicDTO { | ||||
@NotNull(message = "是否是系统内部项目不能为空") | |||||
@ApiModelProperty("是否是系统内部项目") | |||||
private Boolean isInnerProject; | |||||
@NotEmpty(message = "事务名称不能为空") | @NotEmpty(message = "事务名称不能为空") | ||||
@ApiModelProperty("事务名称") | @ApiModelProperty("事务名称") | ||||
private String name; | private String name; | ||||
@@ -50,7 +53,7 @@ public class MeetingBasicDTO { | |||||
@NotEmpty(message = "联系人不能为空") | @NotEmpty(message = "联系人不能为空") | ||||
@ApiModelProperty("联系人") | @ApiModelProperty("联系人") | ||||
private String contacter; | |||||
private String connecter; | |||||
@NotEmpty(message = "联系方式不能为空") | @NotEmpty(message = "联系方式不能为空") | ||||
@ApiModelProperty("联系方式") | @ApiModelProperty("联系方式") | ||||
@@ -13,7 +13,7 @@ import java.util.Arrays; | |||||
* @since 10:11 2022/7/26 | * @since 10:11 2022/7/26 | ||||
*/ | */ | ||||
@Getter | @Getter | ||||
public enum ExpertInviteType { | |||||
public enum ExpertInviteTypeEnum { | |||||
/** | /** | ||||
* 专家抽取类型 | * 专家抽取类型 | ||||
@@ -24,12 +24,16 @@ public enum ExpertInviteType { | |||||
private final Integer code; | private final Integer code; | ||||
private final String name; | private final String name; | ||||
ExpertInviteType(Integer code, String name) { | |||||
ExpertInviteTypeEnum(Integer code, String name) { | |||||
this.code = code; | this.code = code; | ||||
this.name = name; | this.name = name; | ||||
} | } | ||||
public static ExpertInviteType getByCode(Integer code) { | |||||
public boolean eq(Integer code) { | |||||
return this.getCode().equals(code); | |||||
} | |||||
public static ExpertInviteTypeEnum 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() |
@@ -1,6 +1,5 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.req; | package com.ningdatech.pmapi.meeting.entity.req; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.AbstractInviteRule; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.AppointInviteRuleDTO; | import com.ningdatech.pmapi.meeting.entity.dto.AppointInviteRuleDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.RandomInviteRuleDTO; | import com.ningdatech.pmapi.meeting.entity.dto.RandomInviteRuleDTO; | ||||
@@ -22,15 +21,19 @@ import java.util.List; | |||||
*/ | */ | ||||
@Data | @Data | ||||
@ApiModel("专家抽取新家实体") | @ApiModel("专家抽取新家实体") | ||||
public class ExpertInviteCreateReq { | |||||
public class ExpertInviteReq { | |||||
@NotNull(message = "会议ID不能为空", groups = {AbstractInviteRule.RuleSave.class, AbstractInviteRule.CountCheck.class}) | |||||
@ApiModelProperty("会议ID") | @ApiModelProperty("会议ID") | ||||
private Long meetingId; | private Long meetingId; | ||||
@NotNull(message = "抽取类型不能为空") | |||||
@ApiModelProperty("抽取类型:1 随机抽取、2 指定抽取") | |||||
private Integer inviteType; | |||||
@Valid | @Valid | ||||
@NotNull(message = "回避信息不能为空") | |||||
@ApiModelProperty("回避信息") | @ApiModelProperty("回避信息") | ||||
private AvoidInfoDTO avoidInfo; | |||||
private AvoidInfoDTO avoidRule; | |||||
@Valid | @Valid | ||||
@ApiModelProperty("随机抽取规则") | @ApiModelProperty("随机抽取规则") |
@@ -0,0 +1,31 @@ | |||||
package com.ningdatech.pmapi.meeting.entity.req; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingBasicDTO; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import javax.validation.Valid; | |||||
import javax.validation.constraints.NotNull; | |||||
/** | |||||
* <p> | |||||
* MeetingCreateReq | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:33 2023/2/28 | |||||
*/ | |||||
@Data | |||||
public class MeetingCreateReq { | |||||
@Valid | |||||
@NotNull(message = "会议基本信息不能为空") | |||||
@ApiModelProperty("会议基本信息") | |||||
private MeetingBasicDTO meetingBasicInfo; | |||||
@Valid | |||||
@NotNull(message = "会议邀请规则不能为空") | |||||
@ApiModelProperty("会议邀请规则") | |||||
private ExpertInviteReq expertInviteRule; | |||||
} |
@@ -37,9 +37,11 @@ public class InviteRuleDetailVO { | |||||
@Data | @Data | ||||
public static class AvoidInfoVo { | public static class AvoidInfoVo { | ||||
private List<String> companyIds; | |||||
private List<String> avoidUnitIds; | |||||
private Boolean avoidMates; | |||||
private List<String> avoidOrgIds; | |||||
private Integer weekInviteCount; | |||||
private List<ExpertBasicInfoVO> experts; | private List<ExpertBasicInfoVO> experts; | ||||
@@ -1,10 +1,17 @@ | |||||
package com.ningdatech.pmapi.meeting.helper; | package com.ningdatech.pmapi.meeting.helper; | ||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | |||||
import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteRule; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | ||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.AbstractInviteRule; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.AppointInviteRuleDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus; | ||||
@@ -12,7 +19,9 @@ import com.ningdatech.pmapi.meeting.service.IMeetingExpertService; | |||||
import com.ningdatech.pmapi.meeting.service.IMeetingService; | import com.ningdatech.pmapi.meeting.service.IMeetingService; | ||||
import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.util.Assert; | |||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.*; | import java.util.*; | ||||
@@ -32,6 +41,7 @@ public class ExpertInviteHelper { | |||||
private final IMeetingService meetingService; | private final IMeetingService meetingService; | ||||
private final IMeetingExpertService meetingExpertService; | private final IMeetingExpertService meetingExpertService; | ||||
private final IExpertUserFullInfoService expertUserFullInfoService; | |||||
/** | /** | ||||
* 获取时间段内被抽中的专家(通知中、确认参加) | * 获取时间段内被抽中的专家(通知中、确认参加) | ||||
@@ -77,4 +87,43 @@ public class ExpertInviteHelper { | |||||
return expertIds; | return expertIds; | ||||
} | } | ||||
public Map<Long, ExpertUserFullInfo> checkAppointExpert(AppointInviteRuleDTO appointRule, AvoidInfoDTO avoidRule) { | |||||
if (appointRule == null) { | |||||
return Collections.emptyMap(); | |||||
} | |||||
List<ExpertUserFullInfo> expertInfos = expertUserFullInfoService.listByUserId(appointRule.getExpertIds()); | |||||
Map<Long, ExpertUserFullInfo> infoMap = CollUtils.listToMap(expertInfos, ExpertUserFullInfo::getUserId); | |||||
if (avoidRule == null) { | |||||
return infoMap; | |||||
} | |||||
infoMap.forEach((key, userFullInfo) -> { | |||||
if (CollectionUtils.isNotEmpty(avoidRule.getExpertIds())) { | |||||
boolean contains = avoidRule.getExpertIds().contains(key); | |||||
Assert.isTrue(!contains, "已回避的专家不可被指定邀请"); | |||||
} | |||||
if (CollUtil.isNotEmpty(avoidRule.getAvoidUnitIdList())) { | |||||
boolean contains = avoidRule.getAvoidUnitIdList().contains(userFullInfo.getCompany()); | |||||
Assert.isTrue(!contains, "回避单位的专家不可出现在指定邀请名单中"); | |||||
} | |||||
}); | |||||
return infoMap; | |||||
} | |||||
/** | |||||
* 构建邀请规则 | |||||
* | |||||
* @param rule 邀请规则 | |||||
* @param meetingId 会议ID | |||||
* @return {@link ExpertInviteRule} | |||||
* @author WendyYang | |||||
**/ | |||||
public static ExpertInviteRule getExpertInviteRule(AbstractInviteRule rule, Long meetingId) { | |||||
ExpertInviteRule result = new ExpertInviteRule(); | |||||
result.setInviteRule(JSONObject.toJSONString(rule)); | |||||
result.setInviteCount(rule.getCount()); | |||||
result.setInviteType(rule.getInviteType()); | |||||
result.setMeetingId(meetingId); | |||||
return result; | |||||
} | |||||
} | } |
@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||||
import com.ningdatech.basic.exception.BizException; | import com.ningdatech.basic.exception.BizException; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import com.ningdatech.pmapi.common.util.BizUtils; | import com.ningdatech.pmapi.common.util.BizUtils; | ||||
import com.ningdatech.pmapi.common.util.StrUtils; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | import com.ningdatech.pmapi.expert.constant.ExpertAccountStatusEnum; | ||||
import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; | ||||
import com.ningdatech.pmapi.expert.service.ExpertInfoService; | import com.ningdatech.pmapi.expert.service.ExpertInfoService; | ||||
@@ -80,7 +79,6 @@ public class MeetingManageHelper { | |||||
.connecter(meeting.getConnecter()) | .connecter(meeting.getConnecter()) | ||||
.contact(meeting.getContact()) | .contact(meeting.getContact()) | ||||
.status(meeting.getStatus()) | .status(meeting.getStatus()) | ||||
.invited(meeting.getInvited()) | |||||
.holdOrg(meeting.getHoldOrg()) | .holdOrg(meeting.getHoldOrg()) | ||||
.build(); | .build(); | ||||
} | } | ||||
@@ -134,11 +132,12 @@ public class MeetingManageHelper { | |||||
public AvoidInfoDTO getAvoidInfoDto(Long meetingId) { | public AvoidInfoDTO getAvoidInfoDto(Long meetingId) { | ||||
ExpertInviteAvoidRule avoidRule = inviteAvoidRuleService.getByMeetingId(meetingId); | ExpertInviteAvoidRule avoidRule = inviteAvoidRuleService.getByMeetingId(meetingId); | ||||
AvoidInfoDTO avoidInfoDto = new AvoidInfoDTO(); | |||||
avoidInfoDto.setAvoidMates(avoidRule.getAvoidMates()); | |||||
avoidInfoDto.setExpertIds(BizUtils.splitToLong(avoidRule.getExpertIds())); | |||||
avoidInfoDto.setCompanyIds(StrUtils.split(avoidRule.getCompanyIds())); | |||||
return avoidInfoDto; | |||||
AvoidInfoDTO result = new AvoidInfoDTO(); | |||||
result.setAvoidOrgIdList(StrUtil.split(avoidRule.getAvoidOrgIds(), ",")); | |||||
result.setExpertIds(BizUtils.splitToLong(avoidRule.getExpertIds())); | |||||
result.setAvoidUnitIdList(StrUtil.split(avoidRule.getAvoidUnitIds(), ",")); | |||||
result.setWeekInviteCount(result.getWeekInviteCount()); | |||||
return result; | |||||
} | } | ||||
public void saveAvoidInfo(Long meetingId, List<Long> expertIds) { | public void saveAvoidInfo(Long meetingId, List<Long> expertIds) { | ||||
@@ -159,16 +158,12 @@ public class MeetingManageHelper { | |||||
AvoidInfoDTO avoidRule = getAvoidInfoDto(meetingId); | AvoidInfoDTO avoidRule = getAvoidInfoDto(meetingId); | ||||
Map<String, Integer> countMap = new HashMap<>(16); | Map<String, Integer> countMap = new HashMap<>(16); | ||||
experts.forEach(expert -> { | experts.forEach(expert -> { | ||||
if (avoidRule.getCompanyIds().contains(expert.getCompany())) { | |||||
if (avoidRule.getAvoidUnitIdList().contains(expert.getCompany())) { | |||||
throw BizException.wrap("回避单位的专家不可出现在指定邀请名单中"); | throw BizException.wrap("回避单位的专家不可出现在指定邀请名单中"); | ||||
} | } | ||||
if (CollectionUtils.isNotEmpty(avoidRule.getExpertIds()) && avoidRule.getExpertIds().contains(expert.getUserId())) { | if (CollectionUtils.isNotEmpty(avoidRule.getExpertIds()) && avoidRule.getExpertIds().contains(expert.getUserId())) { | ||||
throw BizException.wrap("已回避的专家不可被指定邀请"); | throw BizException.wrap("已回避的专家不可被指定邀请"); | ||||
} | } | ||||
if (avoidRule.getAvoidMates()) { | |||||
Integer oldValue = countMap.put(expert.getCompany(), 1); | |||||
Assert.isNull(oldValue, "不可选择同单位的多个专家"); | |||||
} | |||||
// 校验专家状态 | // 校验专家状态 | ||||
ExpertAccountStatusEnum accountStatus = ExpertAccountStatusEnum.of(expert.getExpertAccountStatus()); | ExpertAccountStatusEnum accountStatus = ExpertAccountStatusEnum.of(expert.getExpertAccountStatus()); | ||||
if (!accountStatus.equals(ExpertAccountStatusEnum.AVAILABLE)) { | if (!accountStatus.equals(ExpertAccountStatusEnum.AVAILABLE)) { | ||||
@@ -13,7 +13,7 @@ import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.CountConfirmByMeetingIdDTO; | import com.ningdatech.pmapi.meeting.entity.dto.CountConfirmByMeetingIdDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteType; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatusByDashboard; | import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatusByDashboard; | ||||
import com.ningdatech.pmapi.meeting.entity.req.MeetingCalenderReq; | import com.ningdatech.pmapi.meeting.entity.req.MeetingCalenderReq; | ||||
@@ -202,7 +202,7 @@ public class DashboardManage { | |||||
item.setExpertMeetingId(w.getId()); | item.setExpertMeetingId(w.getId()); | ||||
Meeting meeting = meetingMap.get(w.getMeetingId()); | Meeting meeting = meetingMap.get(w.getMeetingId()); | ||||
item.setMeetingName(meeting.getName()); | item.setMeetingName(meeting.getName()); | ||||
item.setInviteType(ExpertInviteType.getByCode(w.getInviteType()).getName()); | |||||
item.setInviteType(ExpertInviteTypeEnum.getByCode(w.getInviteType()).getName()); | |||||
item.setStatus(w.getStatus()); | item.setStatus(w.getStatus()); | ||||
item.setStartTime(meeting.getStartTime()); | item.setStartTime(meeting.getStartTime()); | ||||
item.setEndTime(meeting.getEndTime()); | item.setEndTime(meeting.getEndTime()); | ||||
@@ -1,7 +1,6 @@ | |||||
package com.ningdatech.pmapi.meeting.manage; | package com.ningdatech.pmapi.meeting.manage; | ||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
@@ -16,7 +15,10 @@ import com.ningdatech.pmapi.meeting.builder.ExpertInviteBuilder; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteRule; | import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteRule; | ||||
import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | ||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.*; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.ExpertChooseDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.ExpertDictChooseDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.RandomInviteRuleDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; | import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; | ||||
import com.ningdatech.pmapi.meeting.helper.YxtCallOrSmsHelper; | import com.ningdatech.pmapi.meeting.helper.YxtCallOrSmsHelper; | ||||
@@ -35,13 +37,14 @@ import org.apache.commons.collections4.Predicate; | |||||
import org.apache.commons.lang3.ObjectUtils; | import org.apache.commons.lang3.ObjectUtils; | ||||
import org.apache.commons.lang3.RandomUtils; | import org.apache.commons.lang3.RandomUtils; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.util.Assert; | |||||
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 java.util.stream.Stream; | import java.util.stream.Stream; | ||||
import static com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper.getExpertInviteRule; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
* 专家邀请管理 | * 专家邀请管理 | ||||
@@ -149,7 +152,7 @@ public class ExpertInviteManage { | |||||
return null; | return null; | ||||
} | } | ||||
// 处理专家回避单位 与 抽取回避单位是否相同 | // 处理专家回避单位 与 抽取回避单位是否相同 | ||||
List<Long> avoidCompanyExpertIds = avoidCompanyExpertIds(avoidInfo.getCompanyIds()); | |||||
List<Long> avoidCompanyExpertIds = avoidCompanyExpertIds(avoidInfo.getAvoidUnitIdList()); | |||||
// 聚合用户ID | // 聚合用户ID | ||||
List<Long> expertIdsIn = new ArrayList<>(); | List<Long> expertIdsIn = new ArrayList<>(); | ||||
@@ -261,10 +264,10 @@ public class ExpertInviteManage { | |||||
} | } | ||||
boolean avoid = avoidInfo != null; | boolean avoid = avoidInfo != null; | ||||
boolean avoidExpert = avoid && CollUtil.isNotEmpty(avoidInfo.getExpertIds()); | boolean avoidExpert = avoid && CollUtil.isNotEmpty(avoidInfo.getExpertIds()); | ||||
boolean avoidCompany = avoid && CollUtil.isNotEmpty(avoidInfo.getCompanyIds()); | |||||
boolean avoidCompany = avoid && CollUtil.isNotEmpty(avoidInfo.getAvoidUnitIdList()); | |||||
Set<String> tmpAvoidCompany = new HashSet<>(); | Set<String> tmpAvoidCompany = new HashSet<>(); | ||||
if (avoidCompany) { | if (avoidCompany) { | ||||
List<String> companyIds = avoidInfo.getCompanyIds(); | |||||
List<String> companyIds = avoidInfo.getAvoidUnitIdList(); | |||||
for (String companyId : companyIds) { | for (String companyId : companyIds) { | ||||
if (companyId.contains(",")) { | if (companyId.contains(",")) { | ||||
String[] splitCompanyIds = companyId.split(","); | String[] splitCompanyIds = companyId.split(","); | ||||
@@ -277,16 +280,11 @@ public class ExpertInviteManage { | |||||
} | } | ||||
} | } | ||||
// 回避信息 | // 回避信息 | ||||
if (CollUtil.isNotEmpty(appointExpertIds) && avoid && avoidInfo.getAvoidMates()) { | |||||
// 如果设置了回避本单位同事且手动指定了专家,则对应的单位需要排除 | |||||
List<ExpertUserFullInfo> appointUsers = expertUserFullInfoService.listByUserId(appointExpertIds); | |||||
tmpAvoidCompany.addAll(CollUtils.fieldList(appointUsers, ExpertUserFullInfo::getCompany)); | |||||
} | |||||
LambdaQueryWrapper<ExpertUserFullInfo> query = buildBaseExpertQuery(); | LambdaQueryWrapper<ExpertUserFullInfo> query = buildBaseExpertQuery(); | ||||
query.notIn(!tmpAvoidCompany.isEmpty(), ExpertUserFullInfo::getCompany, tmpAvoidCompany); | query.notIn(!tmpAvoidCompany.isEmpty(), ExpertUserFullInfo::getCompany, tmpAvoidCompany); | ||||
if (avoidCompany) { | if (avoidCompany) { | ||||
query.notExists("select 1 from expert_avoid_company eac where eac.user_id = expert_user_full_info.user_id" + | query.notExists("select 1 from expert_avoid_company eac where eac.user_id = expert_user_full_info.user_id" + | ||||
" and company_name in ({0})", CollUtils.joinByComma(avoidInfo.getCompanyIds())); | |||||
" and company_name in ({0})", CollUtils.joinByComma(avoidInfo.getAvoidUnitIdList())); | |||||
} | } | ||||
// 处理专家层级 | // 处理专家层级 | ||||
addRegionLimit(query, randomRule); | addRegionLimit(query, randomRule); | ||||
@@ -326,21 +324,11 @@ public class ExpertInviteManage { | |||||
if (userFullInfos.isEmpty()) { | if (userFullInfos.isEmpty()) { | ||||
return result; | return result; | ||||
} | } | ||||
if (avoid && avoidInfo.getAvoidMates()) { | |||||
// 回避同单位其他专家 | |||||
Map<String, List<ExpertUserFullInfo>> userFullInfoMap = CollUtils.group(userFullInfos, ExpertUserFullInfo::getCompany); | |||||
result.setTotal(userFullInfoMap.size()); | |||||
if (randomRule.getCount() == null || userFullInfoMap.size() >= randomRule.getCount()) { | |||||
List<ExpertUserFullInfo> userFullInfoList = inviteGroupByCompany(userFullInfoMap, randomRule.getCount()); | |||||
result.setExperts(userFullInfoList); | |||||
} | |||||
} else { | |||||
result.setTotal(userFullInfos.size()); | |||||
// count为空表示数量校验 | |||||
if (randomRule.getCount() == null || result.getTotal() >= randomRule.getCount()) { | |||||
List<ExpertUserFullInfo> userFullInfoList = inviteWithoutCompany(userFullInfos, randomRule.getCount()); | |||||
result.setExperts(userFullInfoList); | |||||
} | |||||
result.setTotal(userFullInfos.size()); | |||||
// count为空表示数量校验 | |||||
if (randomRule.getCount() == null || result.getTotal() >= randomRule.getCount()) { | |||||
List<ExpertUserFullInfo> userFullInfoList = inviteWithoutCompany(userFullInfos, randomRule.getCount()); | |||||
result.setExperts(userFullInfoList); | |||||
} | } | ||||
return result; | return result; | ||||
} | } | ||||
@@ -369,9 +357,9 @@ public class ExpertInviteManage { | |||||
return result; | return result; | ||||
} | } | ||||
LambdaQueryWrapper<ExpertUserFullInfo> query = buildBaseExpertQuery(); | LambdaQueryWrapper<ExpertUserFullInfo> query = buildBaseExpertQuery(); | ||||
query.notIn(ExpertUserFullInfo::getCompany, avoidInfo.getCompanyIds()); | |||||
query.notIn(ExpertUserFullInfo::getCompany, avoidInfo.getAvoidUnitIdList()); | |||||
query.notExists("select 1 from expert_avoid_company eac where eac.user_id = expert_user_full_info.user_id" + | query.notExists("select 1 from expert_avoid_company eac where eac.user_id = expert_user_full_info.user_id" + | ||||
" and company_name in ({0})", CollUtils.joinByComma(avoidInfo.getCompanyIds())); | |||||
" and company_name in ({0})", CollUtils.joinByComma(avoidInfo.getAvoidOrgIdList())); | |||||
// 处理专家层级 | // 处理专家层级 | ||||
if (ObjectUtils.allNotNull(randomRule.getExpertRegionCode(), randomRule.getExpertRegionLevel())) { | if (ObjectUtils.allNotNull(randomRule.getExpertRegionCode(), randomRule.getExpertRegionLevel())) { | ||||
@@ -440,23 +428,10 @@ public class ExpertInviteManage { | |||||
removeExpertIds.add(replacedExpertId); | removeExpertIds.add(replacedExpertId); | ||||
} | } | ||||
List<Long> tempExpertIds = CollUtils.fieldList(removeExpertByCompany, MeetingExpert::getExpertId); | List<Long> tempExpertIds = CollUtils.fieldList(removeExpertByCompany, MeetingExpert::getExpertId); | ||||
if (avoidInfo.getAvoidMates()) { | |||||
if (!tempExpertIds.isEmpty()) { | |||||
Set<String> confirmedCompany = userFullInfos.stream() | |||||
.filter(w -> tempExpertIds.contains(w.getUserId())) | |||||
.map(ExpertUserFullInfo::getCompany).collect(Collectors.toSet()); | |||||
userFullInfos.removeIf(w -> confirmedCompany.contains(w.getCompany())); | |||||
} | |||||
userFullInfos.removeIf(w -> removeExpertIds.contains(w.getUserId())); | |||||
Map<String, List<ExpertUserFullInfo>> groupByCompany = CollUtils.group(userFullInfos, ExpertUserFullInfo::getCompany); | |||||
result.setTotal(groupByCompany.size()); | |||||
result.setExperts(inviteGroupByCompany(groupByCompany, count)); | |||||
} else { | |||||
// 移除确认参加、通知中的、拒绝参加、已取消 | |||||
userFullInfos.removeIf(w -> tempExpertIds.contains(w.getUserId()) || removeExpertIds.contains(w.getUserId())); | |||||
result.setTotal(userFullInfos.size()); | |||||
result.setExperts(inviteWithoutCompany(userFullInfos, count)); | |||||
} | |||||
// 移除确认参加、通知中的、拒绝参加、已取消 | |||||
userFullInfos.removeIf(w -> tempExpertIds.contains(w.getUserId()) || removeExpertIds.contains(w.getUserId())); | |||||
result.setTotal(userFullInfos.size()); | |||||
result.setExperts(inviteWithoutCompany(userFullInfos, count)); | |||||
return result; | return result; | ||||
} | } | ||||
@@ -569,78 +544,27 @@ public class ExpertInviteManage { | |||||
} | } | ||||
/** | /** | ||||
* 构建邀请规则 | |||||
* | |||||
* @param inviteRule 邀请规则 | |||||
* @param meetingId 会议ID | |||||
* @return {@link ExpertInviteRule} | |||||
* @author WendyYang | |||||
**/ | |||||
private static ExpertInviteRule getExpertInviteRule(AbstractInviteRule inviteRule, Long meetingId) { | |||||
ExpertInviteRule rule = new ExpertInviteRule(); | |||||
rule.setInviteRule(JSONObject.toJSONString(inviteRule)); | |||||
rule.setInviteCount(inviteRule.getCount()); | |||||
rule.setInviteType(inviteRule.getInviteType()); | |||||
rule.setMeetingId(meetingId); | |||||
return rule; | |||||
} | |||||
public Map<Long, ExpertUserFullInfo> checkAppointExpertConflictWithAvoidRule(AppointInviteRuleDTO appointRule, AvoidInfoDTO avoidRule) { | |||||
if (appointRule == null) { | |||||
return Collections.emptyMap(); | |||||
} | |||||
List<ExpertUserFullInfo> expertInfos = expertUserFullInfoService.listByUserId(appointRule.getExpertIds()); | |||||
Map<Long, ExpertUserFullInfo> infoMap = CollUtils.listToMap(expertInfos, ExpertUserFullInfo::getUserId); | |||||
if (avoidRule == null) { | |||||
return infoMap; | |||||
} | |||||
Map<String, Integer> countMap = new HashMap<>(16); | |||||
infoMap.forEach((key, userFullInfo) -> { | |||||
if (CollectionUtils.isNotEmpty(avoidRule.getExpertIds())) { | |||||
boolean contains = avoidRule.getExpertIds().contains(key); | |||||
Assert.isTrue(!contains, "已回避的专家不可被指定邀请"); | |||||
} | |||||
if (CollectionUtils.isNotEmpty(avoidRule.getCompanyIds())) { | |||||
boolean contains = avoidRule.getCompanyIds().contains(userFullInfo.getCompany()); | |||||
Assert.isTrue(!contains, "回避单位的专家不可出现在指定邀请名单中"); | |||||
} | |||||
if (avoidRule.getAvoidMates()) { | |||||
Integer oldValue = countMap.put(userFullInfo.getCompany(), 1); | |||||
Assert.isNull(oldValue, "不可选择同单位的多个专家"); | |||||
} | |||||
}); | |||||
return infoMap; | |||||
} | |||||
/** | |||||
* 专家抽取(会议创建时抽取) | * 专家抽取(会议创建时抽取) | ||||
* | * | ||||
* @param randomRules 随机抽取规则 | * @param randomRules 随机抽取规则 | ||||
* @param appointRule 指定抽取规则 | |||||
* @param avoid 回避信息 | * @param avoid 回避信息 | ||||
* @author WendyYang | * @author WendyYang | ||||
**/ | **/ | ||||
public void expertInviteByMeetingCreate(Meeting meeting, | |||||
List<RandomInviteRuleDTO> randomRules, | |||||
AppointInviteRuleDTO appointRule, | |||||
AvoidInfoDTO avoid) { | |||||
Map<Long, ExpertUserFullInfo> appointUser = checkAppointExpertConflictWithAvoidRule(appointRule, avoid); | |||||
public void expertRandomInviteByMeetingCreate(Meeting meeting, | |||||
List<RandomInviteRuleDTO> randomRules, | |||||
AvoidInfoDTO avoid) { | |||||
List<MeetingExpert> expertInserts = new ArrayList<>(); | List<MeetingExpert> expertInserts = new ArrayList<>(); | ||||
boolean appointed = appointRule != null; | |||||
// 处理随机抽取规则 | // 处理随机抽取规则 | ||||
if (CollectionUtils.isNotEmpty(randomRules)) { | if (CollectionUtils.isNotEmpty(randomRules)) { | ||||
List<ExpertInviteRule> randoms = new ArrayList<>(); | List<ExpertInviteRule> randoms = new ArrayList<>(); | ||||
List<ExpertChooseDTO> expertsByRandom = new ArrayList<>(); | List<ExpertChooseDTO> expertsByRandom = new ArrayList<>(); | ||||
List<Long> tempExpertIdSelected = new ArrayList<>(); | |||||
if (appointed) { | |||||
tempExpertIdSelected.addAll(appointRule.getExpertIds()); | |||||
} | |||||
LocalDateTime startTime = meeting.getStartTime(), endTime = meeting.getEndTime(); | |||||
List<Long> choosedExpertIds = new ArrayList<>(); | |||||
LocalDateTime startTime = meeting.getStartTime(); | |||||
LocalDateTime endTime = meeting.getEndTime(); | |||||
randomRules.forEach(rule -> { | randomRules.forEach(rule -> { | ||||
ExpertChooseDTO tempExperts = expertInviteByRandomRule(avoid, rule, tempExpertIdSelected, startTime, endTime); | |||||
ExpertChooseDTO tempExperts = expertInviteByRandomRule(avoid, rule, choosedExpertIds, startTime, endTime); | |||||
expertsByRandom.add(tempExperts); | expertsByRandom.add(tempExperts); | ||||
tempExpertIdSelected.addAll(CollUtils.fieldList(tempExperts.getExperts(), ExpertUserFullInfo::getUserId)); | |||||
choosedExpertIds.addAll(CollUtils.fieldList(tempExperts.getExperts(), ExpertUserFullInfo::getUserId)); | |||||
randoms.add(getExpertInviteRule(rule, meeting.getId())); | randoms.add(getExpertInviteRule(rule, meeting.getId())); | ||||
}); | }); | ||||
inviteRuleService.saveBatch(randoms); | inviteRuleService.saveBatch(randoms); | ||||
@@ -654,18 +578,6 @@ public class ExpertInviteManage { | |||||
} | } | ||||
yxtCallOrSmsHelper.callByMeetingExperts(meeting, expertInserts); | yxtCallOrSmsHelper.callByMeetingExperts(meeting, expertInserts); | ||||
} | } | ||||
if (appointed) { | |||||
// 处理指定抽取规则 | |||||
ExpertInviteRule appoint = getExpertInviteRule(appointRule, meeting.getId()); | |||||
inviteRuleService.save(appoint); | |||||
Long ruleId = appoint.getId(); | |||||
appointRule.getExpertIds().forEach(w -> { | |||||
ExpertUserFullInfo info = appointUser.get(w); | |||||
MeetingExpert expert = ExpertInviteBuilder.getExpertByAppoint(meeting.getId(), info, ruleId); | |||||
expert.setStatus(ExpertAttendStatus.NOTICING.getCode()); | |||||
expertInserts.add(expert); | |||||
}); | |||||
} | |||||
meetingExpertService.saveBatch(expertInserts); | meetingExpertService.saveBatch(expertInserts); | ||||
} | } | ||||
@@ -2,6 +2,7 @@ package com.ningdatech.pmapi.meeting.manage; | |||||
import cn.hutool.core.bean.BeanUtil; | import cn.hutool.core.bean.BeanUtil; | ||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import cn.hutool.core.util.ObjectUtil; | |||||
import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||
import cn.hutool.crypto.SecureUtil; | import cn.hutool.crypto.SecureUtil; | ||||
import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||
@@ -26,7 +27,7 @@ import com.ningdatech.pmapi.meeting.entity.domain.Meeting; | |||||
import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.*; | import com.ningdatech.pmapi.meeting.entity.dto.*; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteType; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus.Manager; | import com.ningdatech.pmapi.meeting.entity.enumeration.MeetingStatus.Manager; | ||||
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.*; | ||||
@@ -46,7 +47,6 @@ import com.ningdatech.pmapi.user.security.auth.model.UserInfoDetails; | |||||
import com.ningdatech.pmapi.user.service.IUserInfoService; | 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.apache.commons.collections4.CollectionUtils; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||
import org.springframework.util.Assert; | import org.springframework.util.Assert; | ||||
@@ -54,6 +54,9 @@ import org.springframework.util.Assert; | |||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.*; | import java.util.*; | ||||
import java.util.function.Function; | import java.util.function.Function; | ||||
import java.util.stream.Collectors; | |||||
import static com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper.getExpertInviteRule; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -93,23 +96,28 @@ public class MeetingManage { | |||||
*/ | */ | ||||
public static final int RETRY_TIMES = 3; | public static final int RETRY_TIMES = 3; | ||||
public IdVo<Long> save(MeetingBasicDTO po) { | |||||
String md5ByParam = SecureUtil.md5(po.toString()); | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public IdVo<Long> save(MeetingCreateReq req) { | |||||
MeetingBasicDTO meetingBasic = req.getMeetingBasicInfo(); | |||||
String md5ByParam = SecureUtil.md5(meetingBasic.toString()); | |||||
String key = MEETING_CREATE_KEY + md5ByParam; | String key = MEETING_CREATE_KEY + md5ByParam; | ||||
if (!distributedLock.lock(key, RETRY_TIMES)) { | if (!distributedLock.lock(key, RETRY_TIMES)) { | ||||
throw BizException.wrap("会议正在创建中"); | throw BizException.wrap("会议正在创建中"); | ||||
} | } | ||||
try { | try { | ||||
Meeting meeting = BeanUtil.copyProperties(po, Meeting.class); | |||||
// 保存会议基本信息 | |||||
Meeting meeting = BeanUtil.copyProperties(meetingBasic, Meeting.class); | |||||
meeting.setStatus(Manager.UNCOMPLETED.getCode()); | meeting.setStatus(Manager.UNCOMPLETED.getCode()); | ||||
UserInfoDetails userDetail = LoginUserUtil.loginUserDetail(); | UserInfoDetails userDetail = LoginUserUtil.loginUserDetail(); | ||||
// TODO | |||||
meeting.setHoldOrg(userDetail.getOrganizationName()); | meeting.setHoldOrg(userDetail.getOrganizationName()); | ||||
meeting.setHoldOrgCode(userDetail.getOrganizationCode()); | meeting.setHoldOrgCode(userDetail.getOrganizationCode()); | ||||
meeting.setRegionCode(userDetail.getRegionCode()); | |||||
meeting.setCreator(userDetail.getUsername()); | meeting.setCreator(userDetail.getUsername()); | ||||
meeting.setInvited(Boolean.FALSE); | |||||
meeting.setInviteStopped(true); | meeting.setInviteStopped(true); | ||||
meetingService.save(meeting); | meetingService.save(meeting); | ||||
// 抽取专家 | |||||
req.getExpertInviteRule().setMeetingId(meeting.getId()); | |||||
expertInviteByCreate(req.getExpertInviteRule()); | |||||
return IdVo.of(meeting.getId()); | return IdVo.of(meeting.getId()); | ||||
} finally { | } finally { | ||||
distributedLock.releaseLock(key); | distributedLock.releaseLock(key); | ||||
@@ -117,44 +125,59 @@ public class MeetingManage { | |||||
} | } | ||||
@Transactional(rollbackFor = Exception.class) | @Transactional(rollbackFor = Exception.class) | ||||
public void expertInviteByCreate(ExpertInviteCreateReq req) { | |||||
// 未传递指定邀请专家直接忽略 | |||||
if (req.getAppointRule() != null && CollectionUtils.isEmpty(req.getAppointRule().getExpertIds())) { | |||||
Assert.isTrue(CollectionUtils.isNotEmpty(req.getRandomRules()), "未指定抽取规则"); | |||||
req.setAppointRule(null); | |||||
} | |||||
public void expertInviteByCreate(ExpertInviteReq req) { | |||||
String key = INVITED_RULE_CREATE + req.getMeetingId(); | String key = INVITED_RULE_CREATE + req.getMeetingId(); | ||||
if (!distributedLock.lock(key, RETRY_TIMES)) { | if (!distributedLock.lock(key, RETRY_TIMES)) { | ||||
throw BizException.wrap("不可重复进行专家抽取"); | throw BizException.wrap("不可重复进行专家抽取"); | ||||
} | } | ||||
try { | try { | ||||
AvoidInfoDTO avoidInfo = req.getAvoidRule(); | |||||
Meeting meeting = meetingService.getById(req.getMeetingId()); | Meeting meeting = meetingService.getById(req.getMeetingId()); | ||||
Assert.isTrue(!meeting.getInvited(), "不可重复进行专家抽取"); | |||||
ExpertCountOnChangeVO countOnChange = expertCountOnChange(req); | |||||
for (int i = 0; i < req.getRandomRules().size(); i++) { | |||||
Integer checkCount = countOnChange.getCountList().get(i); | |||||
Integer inviteCount = req.getRandomRules().get(i).getCount(); | |||||
Assert.isTrue(checkCount >= inviteCount, "可供抽取的专家数量不足"); | |||||
} | |||||
AvoidInfoDTO avoidInfo = req.getAvoidInfo(); | |||||
expertInviteManage.expertInviteByMeetingCreate(meeting, req.getRandomRules(), req.getAppointRule(), avoidInfo); | |||||
LambdaUpdateWrapper<Meeting> updater = Wrappers.lambdaUpdate(Meeting.class) | |||||
.set(Meeting::getInvited, Boolean.TRUE) | |||||
.eq(Meeting::getId, req.getMeetingId()); | |||||
if (CollectionUtils.isNotEmpty(req.getRandomRules())) { | |||||
if (ExpertInviteTypeEnum.RANDOM.eq(req.getInviteType())) { | |||||
List<RandomInviteRuleDTO> randomRules = req.getRandomRules(); | |||||
Assert.notEmpty(randomRules, "随机抽取规则不能为空"); | |||||
// 随机抽取的话则需进行抽取数量校验 | |||||
ExpertCountOnChangeVO countOnChange = expertCountOnChange(req); | |||||
if (!countOnChange.getStatus()) { | |||||
throw BizException.wrap(countOnChange.getMessage()); | |||||
} | |||||
for (int i = 0; i < randomRules.size(); i++) { | |||||
Integer checkCount = countOnChange.getCountList().get(i); | |||||
Integer inviteCount = randomRules.get(i).getCount(); | |||||
Assert.isTrue(checkCount >= inviteCount, "可供抽取的专家数量不足"); | |||||
} | |||||
expertInviteManage.expertRandomInviteByMeetingCreate(meeting, randomRules, avoidInfo); | |||||
expertInviteTask.addInviteExpertTaskByMeetingCreate(meeting.getId(), 5); | expertInviteTask.addInviteExpertTaskByMeetingCreate(meeting.getId(), 5); | ||||
updater.set(Meeting::getInviteStopped, false); | |||||
LambdaUpdateWrapper<Meeting> update = Wrappers.lambdaUpdate(Meeting.class); | |||||
update.set(Meeting::getInviteStopped, false); | |||||
update.eq(Meeting::getId, meeting.getId()); | |||||
meetingService.update(update); | |||||
} else { | |||||
// 指定邀请 | |||||
AppointInviteRuleDTO appointRule = req.getAppointRule(); | |||||
Assert.notNull(appointRule, "指定邀请规则不能为空"); | |||||
Map<Long, ExpertUserFullInfo> usersMap = expertInviteHelper.checkAppointExpert(appointRule, avoidInfo); | |||||
// 处理指定抽取规则 | |||||
ExpertInviteRule appoint = getExpertInviteRule(appointRule, meeting.getId()); | |||||
inviteRuleService.save(appoint); | |||||
Long ruleId = appoint.getId(); | |||||
List<MeetingExpert> experts = appointRule.getExpertIds().stream().map(w -> { | |||||
ExpertUserFullInfo info = usersMap.get(w); | |||||
MeetingExpert expert = ExpertInviteBuilder.getExpertByAppoint(meeting.getId(), info, ruleId); | |||||
expert.setStatus(ExpertAttendStatus.NOTICING.getCode()); | |||||
return expert; | |||||
}).collect(Collectors.toList()); | |||||
meetingExpertService.saveBatch(experts); | |||||
} | } | ||||
meetingService.update(updater); | |||||
// 回避规则 | // 回避规则 | ||||
if (avoidInfo != null) { | if (avoidInfo != null) { | ||||
ExpertInviteAvoidRule avoidRule = new ExpertInviteAvoidRule(); | ExpertInviteAvoidRule avoidRule = new ExpertInviteAvoidRule(); | ||||
avoidRule.setMeetingId(meeting.getId()); | avoidRule.setMeetingId(meeting.getId()); | ||||
avoidRule.setAvoidMates(avoidInfo.getAvoidMates()); | |||||
avoidRule.setCompanyIds(CollUtils.joinByComma(avoidInfo.getCompanyIds())); | |||||
if (CollectionUtils.isNotEmpty(avoidInfo.getExpertIds())) { | |||||
avoidRule.setExpertIds(CollUtils.joinByComma(avoidInfo.getExpertIds())); | |||||
} | |||||
// 未传值时设置为0 表示不限制周参与次数 | |||||
avoidRule.setWeekInviteCount(ObjectUtil.defaultIfNull(avoidRule.getWeekInviteCount(), 0)); | |||||
avoidRule.setAvoidOrgIds(CollUtils.joinByComma(avoidInfo.getAvoidOrgIdList())); | |||||
avoidRule.setAvoidUnitIds(CollUtils.joinByComma(avoidInfo.getAvoidUnitIdList())); | |||||
avoidRule.setExpertIds(CollUtils.joinByComma(avoidInfo.getExpertIds())); | |||||
inviteAvoidRuleService.save(avoidRule); | inviteAvoidRuleService.save(avoidRule); | ||||
} | } | ||||
} finally { | } finally { | ||||
@@ -165,35 +188,27 @@ public class MeetingManage { | |||||
/** | /** | ||||
* 抽取数量校验 | * 抽取数量校验 | ||||
* | * | ||||
* @param po 抽取参数 | |||||
* @param req 抽取参数 | |||||
* @return {@link ExpertCountOnChangeVO} | * @return {@link ExpertCountOnChangeVO} | ||||
* @author WendyYang | * @author WendyYang | ||||
**/ | **/ | ||||
public ExpertCountOnChangeVO expertCountOnChange(ExpertInviteCreateReq po) { | |||||
public ExpertCountOnChangeVO expertCountOnChange(ExpertInviteReq req) { | |||||
// 未传递指定邀请专家直接忽略 | // 未传递指定邀请专家直接忽略 | ||||
if (po.getAppointRule() != null && CollUtil.isEmpty(po.getAppointRule().getExpertIds())) { | |||||
Assert.isTrue(CollUtil.isNotEmpty(po.getRandomRules()), "未指定抽取规则"); | |||||
po.setAppointRule(null); | |||||
} | |||||
boolean appointed = po.getAppointRule() != null; | |||||
expertInviteManage.checkAppointExpertConflictWithAvoidRule(po.getAppointRule(), po.getAvoidInfo()); | |||||
Meeting meeting = meetingService.getById(po.getMeetingId()); | |||||
expertInviteHelper.checkAppointExpert(req.getAppointRule(), req.getAvoidRule()); | |||||
Meeting meeting = meetingService.getById(req.getMeetingId()); | |||||
ExpertCountOnChangeVO resultCount = new ExpertCountOnChangeVO(); | ExpertCountOnChangeVO resultCount = new ExpertCountOnChangeVO(); | ||||
resultCount.setStatus(true); | resultCount.setStatus(true); | ||||
resultCount.setCountList(new ArrayList<>()); | resultCount.setCountList(new ArrayList<>()); | ||||
// 参数校验 | // 参数校验 | ||||
String errMsg = ValidUtil.validFast(po, AbstractInviteRule.CountCheck.class); | |||||
String errMsg = ValidUtil.validFast(req, AbstractInviteRule.CountCheck.class); | |||||
if (errMsg != null) { | if (errMsg != null) { | ||||
resultCount.setStatus(false); | resultCount.setStatus(false); | ||||
resultCount.setMessage(errMsg); | resultCount.setMessage(errMsg); | ||||
return resultCount; | return resultCount; | ||||
} | } | ||||
List<Long> expertIdsChoose = new ArrayList<>(); | List<Long> expertIdsChoose = new ArrayList<>(); | ||||
if (appointed) { | |||||
expertIdsChoose.addAll(po.getAppointRule().getExpertIds()); | |||||
} | |||||
for (RandomInviteRuleDTO randomRule : po.getRandomRules()) { | |||||
ExpertChooseDTO chooseExpert = expertInviteManage.expertInviteByRandomRule(po.getAvoidInfo(), | |||||
for (RandomInviteRuleDTO randomRule : req.getRandomRules()) { | |||||
ExpertChooseDTO chooseExpert = expertInviteManage.expertInviteByRandomRule(req.getAvoidRule(), | |||||
randomRule, expertIdsChoose, meeting.getStartTime(), meeting.getEndTime()); | randomRule, expertIdsChoose, meeting.getStartTime(), meeting.getEndTime()); | ||||
resultCount.addCountList(chooseExpert.getTotal()); | resultCount.addCountList(chooseExpert.getTotal()); | ||||
} | } | ||||
@@ -301,10 +316,8 @@ public class MeetingManage { | |||||
.connecter(meeting.getConnecter()) | .connecter(meeting.getConnecter()) | ||||
.status(meeting.getStatus()) | .status(meeting.getStatus()) | ||||
.attendStatus(attendStatus) | .attendStatus(attendStatus) | ||||
.cancelRemark(meeting.getCancelRemark()) | |||||
.createBy(meeting.getCreator()) | .createBy(meeting.getCreator()) | ||||
.holdOrg(meeting.getHoldOrg()) | .holdOrg(meeting.getHoldOrg()) | ||||
.invited(meeting.getInvited()) | |||||
.build(); | .build(); | ||||
} | } | ||||
@@ -340,7 +353,7 @@ public class MeetingManage { | |||||
List<MeetingExpert> attendList = new ArrayList<>(); | List<MeetingExpert> attendList = new ArrayList<>(); | ||||
List<Long> expertIds = new ArrayList<>(); | List<Long> expertIds = new ArrayList<>(); | ||||
experts.forEach(w -> { | experts.forEach(w -> { | ||||
boolean randomInvite = w.getInviteType().equals(ExpertInviteType.RANDOM.getCode()); | |||||
boolean randomInvite = w.getInviteType().equals(ExpertInviteTypeEnum.RANDOM.getCode()); | |||||
if (randomInvite) { | if (randomInvite) { | ||||
randomList.add(w); | randomList.add(w); | ||||
} else { | } else { | ||||
@@ -382,7 +395,7 @@ public class MeetingManage { | |||||
attendList.forEach(w -> { | attendList.forEach(w -> { | ||||
ExpertBasicInfoVO expertBasicInfoVo = expertBasicInfoVoMap.get(w.getExpertId()); | ExpertBasicInfoVO expertBasicInfoVo = expertBasicInfoVoMap.get(w.getExpertId()); | ||||
ExpertAttendListItemVO item = BeanUtil.copyProperties(expertBasicInfoVo, ExpertAttendListItemVO.class); | ExpertAttendListItemVO item = BeanUtil.copyProperties(expertBasicInfoVo, ExpertAttendListItemVO.class); | ||||
item.setInviteType(ExpertInviteType.getByCode(w.getInviteType()).getName()); | |||||
item.setInviteType(ExpertInviteTypeEnum.getByCode(w.getInviteType()).getName()); | |||||
result.addAttendList(item); | result.addAttendList(item); | ||||
}); | }); | ||||
return result; | return result; | ||||
@@ -434,9 +447,9 @@ public class MeetingManage { | |||||
return result; | return result; | ||||
} | } | ||||
result.setRandomRules(new ArrayList<>()); | result.setRandomRules(new ArrayList<>()); | ||||
Map<ExpertInviteType, List<ExpertInviteRule>> groupByType = CollUtils.group(inviteRules, w -> ExpertInviteType.getByCode(w.getInviteType())); | |||||
List<ExpertInviteRule> randoms = groupByType.get(ExpertInviteType.RANDOM); | |||||
if (CollectionUtils.isNotEmpty(randoms)) { | |||||
Map<ExpertInviteTypeEnum, List<ExpertInviteRule>> groupByType = CollUtils.group(inviteRules, w -> ExpertInviteTypeEnum.getByCode(w.getInviteType())); | |||||
List<ExpertInviteRule> randoms = groupByType.get(ExpertInviteTypeEnum.RANDOM); | |||||
if (CollUtil.isNotEmpty(randoms)) { | |||||
randoms.forEach(random -> { | randoms.forEach(random -> { | ||||
RandomInviteRuleVO randomRule = JSON.parseObject(random.getInviteRule(), RandomInviteRuleVO.class); | RandomInviteRuleVO randomRule = JSON.parseObject(random.getInviteRule(), RandomInviteRuleVO.class); | ||||
if (randomRule.getExpertTags() != null) { | if (randomRule.getExpertTags() != null) { | ||||
@@ -452,17 +465,19 @@ public class MeetingManage { | |||||
}); | }); | ||||
} | } | ||||
if (StrUtil.isNotEmpty(randomRule.getIntentionRegionCode())) { | if (StrUtil.isNotEmpty(randomRule.getIntentionRegionCode())) { | ||||
// TODO 履职意向地 | |||||
/*List<RegionDTO> intentionRegions = regionCache.listParents(randomRule.getIntentionRegionCode(), randomRule.getIntentionRegionLevel()); | /*List<RegionDTO> intentionRegions = regionCache.listParents(randomRule.getIntentionRegionCode(), randomRule.getIntentionRegionLevel()); | ||||
randomRule.setIntentionRegions(intentionRegions);*/ | randomRule.setIntentionRegions(intentionRegions);*/ | ||||
} | } | ||||
if (StrUtil.isNotEmpty(randomRule.getExpertRegionCode())) { | if (StrUtil.isNotEmpty(randomRule.getExpertRegionCode())) { | ||||
// TODO 专家层级 | |||||
/*List<RegionDTO> expertRegions = regionCache.listParents(randomRule.getExpertRegionCode(), randomRule.getExpertRegionLevel()); | /*List<RegionDTO> expertRegions = regionCache.listParents(randomRule.getExpertRegionCode(), randomRule.getExpertRegionLevel()); | ||||
randomRule.setExpertRegions(expertRegions);*/ | randomRule.setExpertRegions(expertRegions);*/ | ||||
} | } | ||||
result.getRandomRules().add(randomRule); | result.getRandomRules().add(randomRule); | ||||
}); | }); | ||||
} | } | ||||
List<ExpertInviteRule> appoints = groupByType.get(ExpertInviteType.APPOINT); | |||||
List<ExpertInviteRule> appoints = groupByType.get(ExpertInviteTypeEnum.APPOINT); | |||||
if (result.setAndGetHasAppointRule(CollUtil.isNotEmpty(appoints))) { | if (result.setAndGetHasAppointRule(CollUtil.isNotEmpty(appoints))) { | ||||
ExpertInviteRule appoint = appoints.get(0); | ExpertInviteRule appoint = appoints.get(0); | ||||
AppointInviteRuleDTO appointRule = JSON.parseObject(appoint.getInviteRule(), AppointInviteRuleDTO.class); | AppointInviteRuleDTO appointRule = JSON.parseObject(appoint.getInviteRule(), AppointInviteRuleDTO.class); | ||||
@@ -474,9 +489,9 @@ public class MeetingManage { | |||||
AvoidInfoDTO avoidInfo = inviteAvoidRuleService.getAvoidInfoDto(meetingId); | AvoidInfoDTO avoidInfo = inviteAvoidRuleService.getAvoidInfoDto(meetingId); | ||||
if (result.setAndGetHasAvoidInfo(avoidInfo != null)) { | if (result.setAndGetHasAvoidInfo(avoidInfo != null)) { | ||||
InviteRuleDetailVO.AvoidInfoVo vo = new InviteRuleDetailVO.AvoidInfoVo(); | InviteRuleDetailVO.AvoidInfoVo vo = new InviteRuleDetailVO.AvoidInfoVo(); | ||||
vo.setAvoidMates(avoidInfo.getAvoidMates()); | |||||
vo.setCompanyIds(avoidInfo.getCompanyIds()); | |||||
if (CollectionUtils.isNotEmpty(avoidInfo.getExpertIds())) { | |||||
vo.setAvoidOrgIds(avoidInfo.getAvoidOrgIdList()); | |||||
vo.setAvoidUnitIds(avoidInfo.getAvoidUnitIdList()); | |||||
if (CollUtil.isNotEmpty(avoidInfo.getExpertIds())) { | |||||
vo.setExperts(new ArrayList<>(meetingManageHelper.getExpertBasicInfo(avoidInfo.getExpertIds()).values())); | vo.setExperts(new ArrayList<>(meetingManageHelper.getExpertBasicInfo(avoidInfo.getExpertIds()).values())); | ||||
} | } | ||||
result.setAvoidInfo(vo); | result.setAvoidInfo(vo); | ||||
@@ -506,7 +521,7 @@ public class MeetingManage { | |||||
// 邀请规则 | // 邀请规则 | ||||
RandomInviteRuleDTO randomInviteRuleDto = null; | RandomInviteRuleDTO randomInviteRuleDto = null; | ||||
for (ExpertInviteRule rule : inviteRules) { | for (ExpertInviteRule rule : inviteRules) { | ||||
if (rule.getInviteType().equals(ExpertInviteType.RANDOM.getCode()) && | |||||
if (rule.getInviteType().equals(ExpertInviteTypeEnum.RANDOM.getCode()) && | |||||
rule.getId().equals(meetingExpert.getRuleId())) { | rule.getId().equals(meetingExpert.getRuleId())) { | ||||
randomInviteRuleDto = JSON.parseObject(rule.getInviteRule(), RandomInviteRuleDTO.class); | randomInviteRuleDto = JSON.parseObject(rule.getInviteRule(), RandomInviteRuleDTO.class); | ||||
ruleId = rule.getId(); | ruleId = rule.getId(); | ||||
@@ -607,7 +622,6 @@ public class MeetingManage { | |||||
LambdaUpdateWrapper<Meeting> update = Wrappers.lambdaUpdate(Meeting.class) | LambdaUpdateWrapper<Meeting> update = Wrappers.lambdaUpdate(Meeting.class) | ||||
.set(Meeting::getStatus, Manager.CANCELED.getCode()) | .set(Meeting::getStatus, Manager.CANCELED.getCode()) | ||||
.set(Meeting::getUpdateBy, LoginUserUtil.getUserId()) | .set(Meeting::getUpdateBy, LoginUserUtil.getUserId()) | ||||
.set(Meeting::getCancelRemark, po.getCancelRemark()) | |||||
.set(Meeting::getUpdateOn, LocalDateTime.now()) | .set(Meeting::getUpdateOn, LocalDateTime.now()) | ||||
.eq(Meeting::getId, po.getMeetingId()); | .eq(Meeting::getId, po.getMeetingId()); | ||||
meetingService.update(update); | meetingService.update(update); | ||||
@@ -6,7 +6,7 @@ import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.CountConfirmByMeetingIdDTO; | import com.ningdatech.pmapi.meeting.entity.dto.CountConfirmByMeetingIdDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteType; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
import java.util.Collection; | import java.util.Collection; | ||||
import java.util.List; | import java.util.List; | ||||
@@ -100,7 +100,7 @@ public interface IMeetingExpertService extends IService<MeetingExpert> { | |||||
* @return int | * @return int | ||||
* @author WendyYang | * @author WendyYang | ||||
**/ | **/ | ||||
int countExpertByStatusAndMeetingId(ExpertAttendStatus status, Long meetingId, ExpertInviteType inviteType); | |||||
int countExpertByStatusAndMeetingId(ExpertAttendStatus status, Long meetingId, ExpertInviteTypeEnum inviteType); | |||||
/** | /** | ||||
* 查询所有同意参加的专家记录 | * 查询所有同意参加的专家记录 | ||||
@@ -36,9 +36,10 @@ public class ExpertInviteAvoidRuleServiceImpl extends ServiceImpl<ExpertInviteAv | |||||
return null; | return null; | ||||
} | } | ||||
AvoidInfoDTO avoidInfo = new AvoidInfoDTO(); | AvoidInfoDTO avoidInfo = new AvoidInfoDTO(); | ||||
avoidInfo.setAvoidMates(avoidRule.getAvoidMates()); | |||||
avoidInfo.setAvoidOrgIdList(StrUtils.split(avoidRule.getAvoidOrgIds())); | |||||
avoidInfo.setAvoidUnitIdList(StrUtils.split(avoidRule.getAvoidUnitIds())); | |||||
avoidInfo.setExpertIds(BizUtils.splitToLong(avoidRule.getExpertIds())); | avoidInfo.setExpertIds(BizUtils.splitToLong(avoidRule.getExpertIds())); | ||||
avoidInfo.setCompanyIds(StrUtils.split(avoidRule.getCompanyIds())); | |||||
avoidInfo.setWeekInviteCount(avoidInfo.getWeekInviteCount()); | |||||
return avoidInfo; | return avoidInfo; | ||||
} | } | ||||
@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||
import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteRule; | import com.ningdatech.pmapi.meeting.entity.domain.ExpertInviteRule; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.RandomInviteRuleDTO; | import com.ningdatech.pmapi.meeting.entity.dto.RandomInviteRuleDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteType; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
import com.ningdatech.pmapi.meeting.mapper.ExpertInviteRuleMapper; | import com.ningdatech.pmapi.meeting.mapper.ExpertInviteRuleMapper; | ||||
import com.ningdatech.pmapi.meeting.service.IExpertInviteRuleService; | import com.ningdatech.pmapi.meeting.service.IExpertInviteRuleService; | ||||
import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
@@ -38,7 +38,7 @@ public class ExpertInviteRuleServiceImpl extends ServiceImpl<ExpertInviteRuleMap | |||||
@Override | @Override | ||||
public Map<Long, RandomInviteRuleDTO> randomRuleByMeetingId(Long meetingId) { | public Map<Long, RandomInviteRuleDTO> randomRuleByMeetingId(Long meetingId) { | ||||
LambdaQueryWrapper<ExpertInviteRule> query = wrapperByMeetingId(meetingId) | LambdaQueryWrapper<ExpertInviteRule> query = wrapperByMeetingId(meetingId) | ||||
.eq(ExpertInviteRule::getInviteType, ExpertInviteType.RANDOM.getCode()); | |||||
.eq(ExpertInviteRule::getInviteType, ExpertInviteTypeEnum.RANDOM.getCode()); | |||||
List<ExpertInviteRule> inviteRules = baseMapper.selectList(query); | List<ExpertInviteRule> inviteRules = baseMapper.selectList(query); | ||||
return inviteRules.stream().collect(Collectors.toMap(ExpertInviteRule::getId, | return inviteRules.stream().collect(Collectors.toMap(ExpertInviteRule::getId, | ||||
w -> JSONObject.parseObject(w.getInviteRule(), RandomInviteRuleDTO.class))); | w -> JSONObject.parseObject(w.getInviteRule(), RandomInviteRuleDTO.class))); | ||||
@@ -10,7 +10,7 @@ import com.ningdatech.pmapi.meeting.entity.domain.MeetingExpert; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.CountConfirmByMeetingIdDTO; | import com.ningdatech.pmapi.meeting.entity.dto.CountConfirmByMeetingIdDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | import com.ningdatech.pmapi.meeting.entity.dto.MeetingAndAttendStatusDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteType; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
import com.ningdatech.pmapi.meeting.mapper.ExpertInviteRuleMapper; | import com.ningdatech.pmapi.meeting.mapper.ExpertInviteRuleMapper; | ||||
import com.ningdatech.pmapi.meeting.mapper.MeetingExpertMapper; | import com.ningdatech.pmapi.meeting.mapper.MeetingExpertMapper; | ||||
import com.ningdatech.pmapi.meeting.service.IMeetingExpertService; | import com.ningdatech.pmapi.meeting.service.IMeetingExpertService; | ||||
@@ -44,7 +44,7 @@ public class MeetingExpertServiceImpl extends ServiceImpl<MeetingExpertMapper, M | |||||
@Override | @Override | ||||
public Map<Long, CountConfirmByMeetingIdDTO> countConfirmedByMeetingIds(List<Long> meetingIds) { | public Map<Long, CountConfirmByMeetingIdDTO> countConfirmedByMeetingIds(List<Long> meetingIds) { | ||||
List<ExpertInviteRule> inviteRules = inviteRuleMapper.selectList(Wrappers.lambdaQuery(ExpertInviteRule.class) | List<ExpertInviteRule> inviteRules = inviteRuleMapper.selectList(Wrappers.lambdaQuery(ExpertInviteRule.class) | ||||
.eq(ExpertInviteRule::getInviteType, ExpertInviteType.RANDOM.getCode()) | |||||
.eq(ExpertInviteRule::getInviteType, ExpertInviteTypeEnum.RANDOM.getCode()) | |||||
.in(ExpertInviteRule::getMeetingId, meetingIds)); | .in(ExpertInviteRule::getMeetingId, meetingIds)); | ||||
Map<Long, Integer> countByRandom = CollUtils.groupSumInt(inviteRules, ExpertInviteRule::getMeetingId, ExpertInviteRule::getInviteCount); | Map<Long, Integer> countByRandom = CollUtils.groupSumInt(inviteRules, ExpertInviteRule::getMeetingId, ExpertInviteRule::getInviteCount); | ||||
Page<MeetingExpert> page = pageExpertByStatusAndMeetingIds(new Page<>(0, 500), meetingIds, null); | Page<MeetingExpert> page = pageExpertByStatusAndMeetingIds(new Page<>(0, 500), meetingIds, null); | ||||
@@ -59,7 +59,7 @@ public class MeetingExpertServiceImpl extends ServiceImpl<MeetingExpertMapper, M | |||||
.build(); | .build(); | ||||
w.forEach(item -> { | w.forEach(item -> { | ||||
ExpertAttendStatus attendStatus = ExpertAttendStatus.getByCode(item.getStatus()); | ExpertAttendStatus attendStatus = ExpertAttendStatus.getByCode(item.getStatus()); | ||||
if (item.getInviteType().equals(ExpertInviteType.APPOINT.getCode())) { | |||||
if (item.getInviteType().equals(ExpertInviteTypeEnum.APPOINT.getCode())) { | |||||
// 被替换和已取消的不计数 | // 被替换和已取消的不计数 | ||||
if (attendStatus.equals(ExpertAttendStatus.CANCELED) | if (attendStatus.equals(ExpertAttendStatus.CANCELED) | ||||
|| attendStatus.equals(ExpertAttendStatus.REPLACED)) { | || attendStatus.equals(ExpertAttendStatus.REPLACED)) { | ||||
@@ -113,7 +113,7 @@ public class MeetingExpertServiceImpl extends ServiceImpl<MeetingExpertMapper, M | |||||
} | } | ||||
@Override | @Override | ||||
public int countExpertByStatusAndMeetingId(ExpertAttendStatus status, Long meetingId, ExpertInviteType inviteType) { | |||||
public int countExpertByStatusAndMeetingId(ExpertAttendStatus status, Long meetingId, ExpertInviteTypeEnum inviteType) { | |||||
Integer tempStatus = status == null ? null : status.getCode(); | Integer tempStatus = status == null ? null : status.getCode(); | ||||
Integer tempInviteType = inviteType == null ? null : inviteType.getCode(); | Integer tempInviteType = inviteType == null ? null : inviteType.getCode(); | ||||
return baseMapper.countExpertByStatusAndMeetingId(tempStatus, meetingId, tempInviteType); | return baseMapper.countExpertByStatusAndMeetingId(tempStatus, meetingId, tempInviteType); | ||||
@@ -17,7 +17,7 @@ import com.ningdatech.pmapi.meeting.entity.dto.AvoidInfoDTO; | |||||
import com.ningdatech.pmapi.meeting.entity.dto.ExpertChooseDTO; | import com.ningdatech.pmapi.meeting.entity.dto.ExpertChooseDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.dto.RandomInviteRuleDTO; | import com.ningdatech.pmapi.meeting.entity.dto.RandomInviteRuleDTO; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertAttendStatus; | ||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteType; | |||||
import com.ningdatech.pmapi.meeting.entity.enumeration.ExpertInviteTypeEnum; | |||||
import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; | import com.ningdatech.pmapi.meeting.helper.ExpertInviteHelper; | ||||
import com.ningdatech.pmapi.meeting.helper.YxtCallOrSmsHelper; | import com.ningdatech.pmapi.meeting.helper.YxtCallOrSmsHelper; | ||||
import com.ningdatech.pmapi.meeting.manage.ExpertInviteManage; | import com.ningdatech.pmapi.meeting.manage.ExpertInviteManage; | ||||
@@ -125,9 +125,9 @@ public class ExpertInviteTask { | |||||
**/ | **/ | ||||
private boolean inviteCheck(Long meetingId) { | private boolean inviteCheck(Long meetingId) { | ||||
List<ExpertInviteRule> expertInviteRules = inviteRuleService.listByMeetingId(meetingId); | List<ExpertInviteRule> expertInviteRules = inviteRuleService.listByMeetingId(meetingId); | ||||
Function<ExpertInviteRule, ExpertInviteType> groupKey = w -> ExpertInviteType.getByCode(w.getInviteType()); | |||||
Map<ExpertInviteType, List<ExpertInviteRule>> groupByType = CollUtils.group(expertInviteRules, groupKey); | |||||
List<ExpertInviteRule> randomRules = groupByType.get(ExpertInviteType.RANDOM); | |||||
Function<ExpertInviteRule, ExpertInviteTypeEnum> groupKey = w -> ExpertInviteTypeEnum.getByCode(w.getInviteType()); | |||||
Map<ExpertInviteTypeEnum, List<ExpertInviteRule>> groupByType = CollUtils.group(expertInviteRules, groupKey); | |||||
List<ExpertInviteRule> randomRules = groupByType.get(ExpertInviteTypeEnum.RANDOM); | |||||
if (CollUtil.isEmpty(randomRules)) { | if (CollUtil.isEmpty(randomRules)) { | ||||
return false; | return false; | ||||
} | } | ||||