@@ -97,6 +97,7 @@ public class MsgCallHelper { | |||||
if (SendStatus.SUCCESS.equals(mcr.getSendStatus())) { | if (SendStatus.SUCCESS.equals(mcr.getSendStatus())) { | ||||
switch (bizType) { | switch (bizType) { | ||||
case EXPERT_INVITE: | case EXPERT_INVITE: | ||||
case MEETING_ROSTER_CONFIRM: | |||||
mcr.setNeedReply(Boolean.TRUE); | mcr.setNeedReply(Boolean.TRUE); | ||||
mcr.setReplyStatus(ReplyStatus.WAITING); | mcr.setReplyStatus(ReplyStatus.WAITING); | ||||
break; | break; | ||||
@@ -52,6 +52,9 @@ public class Meeting implements Serializable { | |||||
@ApiModelProperty("会议地址") | @ApiModelProperty("会议地址") | ||||
private String meetingAddress; | private String meetingAddress; | ||||
@ApiModelProperty("会议详细地址") | |||||
private String meetingAddressDetail; | |||||
@ApiModelProperty("评审地点经度") | @ApiModelProperty("评审地点经度") | ||||
private Double addressLongitude; | private Double addressLongitude; | ||||
@@ -92,4 +92,7 @@ public class MeetingExpert implements Serializable { | |||||
@ApiModelProperty("专家签到地点") | @ApiModelProperty("专家签到地点") | ||||
private String signAddress; | private String signAddress; | ||||
@ApiModelProperty("确认名单短信通知标识") | |||||
private String confirmedRosterMsgSubmitKey; | |||||
} | } |
@@ -53,6 +53,10 @@ public class MeetingBasicDTO { | |||||
@ApiModelProperty("评审地点") | @ApiModelProperty("评审地点") | ||||
private String meetingAddress; | private String meetingAddress; | ||||
@Length(max = 200, message = "评审详细地址超出限制") | |||||
@ApiModelProperty("评审详细地址") | |||||
private String meetingAddressDetail; | |||||
@ApiModelProperty("评审地点经度") | @ApiModelProperty("评审地点经度") | ||||
private Double addressLongitude; | private Double addressLongitude; | ||||
@@ -62,6 +62,10 @@ public class InviteExpertListItemVO extends ExpertBasicInfoVO { | |||||
@ApiModelProperty("专家签到地点") | @ApiModelProperty("专家签到地点") | ||||
private String signAddress; | private String signAddress; | ||||
@ApiModelProperty("是否已确认名单") | |||||
private Boolean confirmedRoster; | |||||
@ApiModelProperty("确认名单短信回复内容") | |||||
private String confirmedRosterReplyContent; | |||||
} | } |
@@ -42,6 +42,9 @@ public class MeetingByManagerVO { | |||||
@ApiModelProperty("评审地点") | @ApiModelProperty("评审地点") | ||||
private String meetingAddress; | private String meetingAddress; | ||||
@ApiModelProperty("评审详细地址") | |||||
private String meetingAddressDetail; | |||||
@ApiModelProperty("会议状态") | @ApiModelProperty("会议状态") | ||||
private Integer status; | private Integer status; | ||||
@@ -59,6 +59,9 @@ public class MeetingDetailBasicVO { | |||||
@ApiModelProperty("评审地点") | @ApiModelProperty("评审地点") | ||||
private String meetingAddress; | private String meetingAddress; | ||||
@ApiModelProperty("评审详细地址") | |||||
private String meetingAddressDetail; | |||||
@ApiModelProperty("联系方式") | @ApiModelProperty("联系方式") | ||||
private String contact; | private String contact; | ||||
@@ -112,6 +112,7 @@ public class MeetingManageHelper { | |||||
result.setConnecter(meeting.getConnecter()); | result.setConnecter(meeting.getConnecter()); | ||||
result.setContact(meeting.getContact()); | result.setContact(meeting.getContact()); | ||||
result.setMeetingAddress(meeting.getMeetingAddress()); | result.setMeetingAddress(meeting.getMeetingAddress()); | ||||
result.setMeetingAddressDetail(meeting.getMeetingAddressDetail()); | |||||
result.setIsInnerProject(meeting.getIsInnerProject()); | result.setIsInnerProject(meeting.getIsInnerProject()); | ||||
result.setHasMeetingResult(StrUtil.isNotBlank(meeting.getResultDescription())); | result.setHasMeetingResult(StrUtil.isNotBlank(meeting.getResultDescription())); | ||||
result.setSignQrCodeUrl(meeting.getSignQrCodeUrl()); | result.setSignQrCodeUrl(meeting.getSignQrCodeUrl()); | ||||
@@ -27,6 +27,7 @@ import com.hz.pm.api.user.model.entity.UserInfo; | |||||
import com.hz.pm.api.user.service.IUserInfoService; | import com.hz.pm.api.user.service.IUserInfoService; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Value; | import org.springframework.beans.factory.annotation.Value; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||
@@ -43,6 +44,7 @@ import java.util.*; | |||||
* @author WendyYang | * @author WendyYang | ||||
* @since 2023/4/20 | * @since 2023/4/20 | ||||
**/ | **/ | ||||
@Slf4j | |||||
@Component | @Component | ||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class MeetingNotifyHelper { | public class MeetingNotifyHelper { | ||||
@@ -130,12 +132,18 @@ public class MeetingNotifyHelper { | |||||
String meetingTime = sTime + "至" + eTime; | String meetingTime = sTime + "至" + eTime; | ||||
List<Notify> notifies = new ArrayList<>(); | List<Notify> notifies = new ArrayList<>(); | ||||
List<WorkNoticeInfo> workingNotices = new ArrayList<>(); | List<WorkNoticeInfo> workingNotices = new ArrayList<>(); | ||||
String meetingAddress = meeting.getMeetingAddress() + " " + meeting.getMeetingAddressDetail(); | |||||
experts.forEach(w -> { | experts.forEach(w -> { | ||||
String msgContent = String.format(MeetingMsgTemplateConst.CONFIRMED_ROSTER, | String msgContent = String.format(MeetingMsgTemplateConst.CONFIRMED_ROSTER, | ||||
w.getExpertName(), officialTime(w.getCreateOn()), meetingTime, meeting.getMeetingAddress(), | |||||
w.getExpertName(), officialTime(w.getCreateOn()), meetingTime, meetingAddress, | |||||
meeting.getConnecter(), meeting.getContact()); | meeting.getConnecter(), meeting.getContact()); | ||||
// 音信通消息 | // 音信通消息 | ||||
msgCallHelper.sendMsg(w.getMobile(), msgContent, BizTypeEnum.MEETING_ROSTER_CONFIRM); | |||||
try { | |||||
String submitKey = msgCallHelper.sendMsg(w.getMobile(), msgContent, BizTypeEnum.MEETING_ROSTER_CONFIRM); | |||||
w.setConfirmedRosterMsgSubmitKey(submitKey); | |||||
} catch (Exception e) { | |||||
log.error("确认名单失败:{}", w.getMobile(), e); | |||||
} | |||||
UserInfo info = userMap.get(w.getExpertId()); | UserInfo info = userMap.get(w.getExpertId()); | ||||
// 发送工作通知 | // 发送工作通知 | ||||
if (info.getAccountId() != null) { | if (info.getAccountId() != null) { | ||||
@@ -49,6 +49,9 @@ import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | ||||
import com.hz.pm.api.projectlib.service.IProjectService; | import com.hz.pm.api.projectlib.service.IProjectService; | ||||
import com.hz.pm.api.sys.model.dto.RegionDTO; | import com.hz.pm.api.sys.model.dto.RegionDTO; | ||||
import com.hz.pm.api.sys.model.entity.MsgCallRecord; | |||||
import com.hz.pm.api.sys.model.enumeration.SubmitTypeEnum; | |||||
import com.hz.pm.api.sys.service.IMsgCallRecordService; | |||||
import com.hz.pm.api.user.helper.MhUnitCache; | import com.hz.pm.api.user.helper.MhUnitCache; | ||||
import com.hz.pm.api.user.model.entity.UserInfo; | import com.hz.pm.api.user.model.entity.UserInfo; | ||||
import com.hz.pm.api.user.model.enumeration.RoleEnum; | import com.hz.pm.api.user.model.enumeration.RoleEnum; | ||||
@@ -112,6 +115,7 @@ public class MeetingManage { | |||||
private final EnvironmentUtil environmentUtil; | private final EnvironmentUtil environmentUtil; | ||||
private final MhUnitCache mhUnitCache; | private final MhUnitCache mhUnitCache; | ||||
private final ProjectStateMachineUtil projectStateMachineUtil; | private final ProjectStateMachineUtil projectStateMachineUtil; | ||||
private final IMsgCallRecordService msgCallRecordService; | |||||
private static final String INVITED_RULE_CREATE = "INVITED_RULE_CREATE:"; | private static final String INVITED_RULE_CREATE = "INVITED_RULE_CREATE:"; | ||||
@@ -494,6 +498,7 @@ public class MeetingManage { | |||||
.meetingName(meeting.getName()) | .meetingName(meeting.getName()) | ||||
.meetingType(meeting.getType()) | .meetingType(meeting.getType()) | ||||
.meetingAddress(meeting.getMeetingAddress()) | .meetingAddress(meeting.getMeetingAddress()) | ||||
.meetingAddressDetail(meeting.getMeetingAddressDetail()) | |||||
.typeName(getDictName(meeting.getType())) | .typeName(getDictName(meeting.getType())) | ||||
.startTime(meeting.getStartTime()) | .startTime(meeting.getStartTime()) | ||||
.endTime(meeting.getEndTime()) | .endTime(meeting.getEndTime()) | ||||
@@ -543,12 +548,31 @@ public class MeetingManage { | |||||
if (experts.isEmpty()) { | if (experts.isEmpty()) { | ||||
return result; | return result; | ||||
} | } | ||||
List<Long> expertIds = CollUtils.fieldList(experts, MeetingExpert::getExpertId); | |||||
List<String> confirmedRosterSubmitKeys = new ArrayList<>(); | |||||
List<Long> expertIds = CollUtils.fieldList(experts, w -> { | |||||
if (StrUtil.isNotBlank(w.getConfirmedRosterMsgSubmitKey())) { | |||||
confirmedRosterSubmitKeys.add(w.getConfirmedRosterMsgSubmitKey()); | |||||
} | |||||
return w.getExpertId(); | |||||
}); | |||||
Map<String, String> confirmedRosterReplyMap = new HashMap<>(); | |||||
if (!confirmedRosterSubmitKeys.isEmpty()) { | |||||
Wrapper<MsgCallRecord> query = Wrappers.lambdaQuery(MsgCallRecord.class) | |||||
.select(MsgCallRecord::getSubmitKey, MsgCallRecord::getReplyContent) | |||||
.eq(MsgCallRecord::getSubmitType, SubmitTypeEnum.SMS) | |||||
.in(MsgCallRecord::getSubmitKey, confirmedRosterSubmitKeys); | |||||
List<MsgCallRecord> msgCallRecords = msgCallRecordService.list(query); | |||||
for (MsgCallRecord msgCallRecord : msgCallRecords) { | |||||
confirmedRosterReplyMap.put(msgCallRecord.getSubmitKey(), msgCallRecord.getReplyContent()); | |||||
} | |||||
} | |||||
Map<Long, ExpertBasicInfoVO> expertMap = meetingManageHelper.getExpertBasicInfo(expertIds); | Map<Long, ExpertBasicInfoVO> expertMap = meetingManageHelper.getExpertBasicInfo(expertIds); | ||||
BiFunction<MeetingExpert, Map<Long, ExpertInviteRule>, InviteExpertListItemVO> mapping = (me, ruleMap) -> { | BiFunction<MeetingExpert, Map<Long, ExpertInviteRule>, InviteExpertListItemVO> mapping = (me, ruleMap) -> { | ||||
ExpertBasicInfoVO expert = expertMap.get(me.getExpertId()); | ExpertBasicInfoVO expert = expertMap.get(me.getExpertId()); | ||||
InviteExpertListItemVO item = BeanUtil.copyProperties(expert, InviteExpertListItemVO.class); | InviteExpertListItemVO item = BeanUtil.copyProperties(expert, InviteExpertListItemVO.class); | ||||
item.setExpertMeetingId(me.getId()); | item.setExpertMeetingId(me.getId()); | ||||
item.setConfirmedRoster(me.getConfirmedRoster()); | |||||
item.setConfirmedRosterReplyContent(confirmedRosterReplyMap.get(me.getConfirmedRosterMsgSubmitKey())); | |||||
item.setMeetingId(me.getMeetingId()); | item.setMeetingId(me.getMeetingId()); | ||||
item.setStatus(me.getStatus()); | item.setStatus(me.getStatus()); | ||||
item.setStatusName(ExpertAttendStatusEnum.getValByCode(me.getStatus())); | item.setStatusName(ExpertAttendStatusEnum.getValByCode(me.getStatus())); | ||||
@@ -910,13 +934,21 @@ public class MeetingManage { | |||||
return; | return; | ||||
} | } | ||||
List<Long> currConfirmedMeIds = CollUtils.fieldList(expertNoticing, MeetingExpert::getId); | List<Long> currConfirmedMeIds = CollUtils.fieldList(expertNoticing, MeetingExpert::getId); | ||||
Wrapper<MeetingExpert> meUpdate = Wrappers.lambdaUpdate(MeetingExpert.class) | |||||
.in(MeetingExpert::getId, currConfirmedMeIds) | |||||
LambdaUpdateWrapper<MeetingExpert> meUpdate = Wrappers.lambdaUpdate(MeetingExpert.class) | |||||
.set(MeetingExpert::getConfirmedRoster, Boolean.TRUE); | .set(MeetingExpert::getConfirmedRoster, Boolean.TRUE); | ||||
meetingExpertService.update(meUpdate); | |||||
if (environmentUtil.isProdEnv()) { | if (environmentUtil.isProdEnv()) { | ||||
meetingNotifyHelper.sendConfirmedRosterMsg(expertNoticing, meeting); | meetingNotifyHelper.sendConfirmedRosterMsg(expertNoticing, meeting); | ||||
for (MeetingExpert expert : expertNoticing) { | |||||
if (StrUtil.isBlank(expert.getConfirmedRosterMsgSubmitKey())) { | |||||
currConfirmedMeIds.remove(expert.getId()); | |||||
} | |||||
} | |||||
if (currConfirmedMeIds.isEmpty()) { | |||||
throw ReturnException.wrap("参会通知短信发送失败,请重试!"); | |||||
} | |||||
} | } | ||||
meUpdate.in(MeetingExpert::getId, currConfirmedMeIds); | |||||
meetingExpertService.update(meUpdate); | |||||
} finally { | } finally { | ||||
distributedLock.releaseLock(key); | distributedLock.releaseLock(key); | ||||
} | } | ||||
@@ -930,6 +962,7 @@ public class MeetingManage { | |||||
data.setEndTime(meeting.getEndTime()); | data.setEndTime(meeting.getEndTime()); | ||||
data.setMeetingName(meeting.getName()); | data.setMeetingName(meeting.getName()); | ||||
data.setMeetingAddress(meeting.getMeetingAddress()); | data.setMeetingAddress(meeting.getMeetingAddress()); | ||||
data.setMeetingAddressDetail(meeting.getMeetingAddressDetail()); | |||||
data.setConnecter(meeting.getConnecter()); | data.setConnecter(meeting.getConnecter()); | ||||
data.setContact(meeting.getContact()); | data.setContact(meeting.getContact()); | ||||
data.setLongitude(meeting.getAddressLongitude()); | data.setLongitude(meeting.getAddressLongitude()); | ||||
@@ -1113,10 +1146,6 @@ public class MeetingManage { | |||||
if (meeting == null || MeetingStatusEnum.CANCEL.eq(meeting.getStatus())) { | if (meeting == null || MeetingStatusEnum.CANCEL.eq(meeting.getStatus())) { | ||||
throw ReturnException.wrap("会议不存在或已取消"); | throw ReturnException.wrap("会议不存在或已取消"); | ||||
} | } | ||||
LocalDateTime now = LocalDateTime.now(); | |||||
if (meeting.getEndTime().isAfter(now)) { | |||||
throw ReturnException.wrap("会议未结束"); | |||||
} | |||||
if (!Boolean.TRUE.equals(meeting.getIsInnerProject())) { | if (!Boolean.TRUE.equals(meeting.getIsInnerProject())) { | ||||
throw ReturnException.wrap("此会议未关联项目"); | throw ReturnException.wrap("此会议未关联项目"); | ||||
} | } | ||||
@@ -34,6 +34,9 @@ public class MeetingExpertToMhDTO { | |||||
@ApiModelProperty("会议地址") | @ApiModelProperty("会议地址") | ||||
private String meetingAddress; | private String meetingAddress; | ||||
@ApiModelProperty("会议地址详情") | |||||
private String meetingAddressDetail; | |||||
@ApiModelProperty("会议地址经度") | @ApiModelProperty("会议地址经度") | ||||
private Double longitude; | private Double longitude; | ||||
@@ -2,6 +2,7 @@ package com.hz.pm.api.projectdeclared.model.entity; | |||||
import com.baomidou.mybatisplus.annotation.*; | import com.baomidou.mybatisplus.annotation.*; | ||||
import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | import lombok.Data; | ||||
import java.io.Serializable; | import java.io.Serializable; | ||||
@@ -43,4 +44,7 @@ public class ProjectChangeHistory implements Serializable { | |||||
private Integer status; | private Integer status; | ||||
@ApiModelProperty("是否允许重新发起") | |||||
private Boolean canResubmit; | |||||
} | } |
@@ -176,6 +176,7 @@ public class ProjectChangeManage { | |||||
projectChangeHistory.setProjectId(project.getId()); | projectChangeHistory.setProjectId(project.getId()); | ||||
projectChangeHistory.setProjectCode(project.getProjectCode()); | projectChangeHistory.setProjectCode(project.getProjectCode()); | ||||
projectChangeHistory.setStatus(ProjectChangeStatus.ON_CHANGE_APPLY.getCode()); | projectChangeHistory.setStatus(ProjectChangeStatus.ON_CHANGE_APPLY.getCode()); | ||||
projectChangeHistory.setCanResubmit(Boolean.TRUE); | |||||
projectChangeHistory.setInstCode(instId); | projectChangeHistory.setInstCode(instId); | ||||
projectChangeHistory.setId(req.getId()); | projectChangeHistory.setId(req.getId()); | ||||
projectChangeHistoryService.saveOrUpdate(projectChangeHistory); | projectChangeHistoryService.saveOrUpdate(projectChangeHistory); | ||||
@@ -500,7 +500,8 @@ | |||||
npch.status as changeStatus, | npch.status as changeStatus, | ||||
npch.create_on as change_apply_time, | npch.create_on as change_apply_time, | ||||
npch.id as changeId, | npch.id as changeId, | ||||
npch.inst_code as instCode | |||||
npch.inst_code as instCode, | |||||
npch.can_resubmit as canResubmit | |||||
from (select * from nd_project ${ew.customSqlSegment}) np | from (select * from nd_project ${ew.customSqlSegment}) np | ||||
inner join nd_project_change_history npch | inner join nd_project_change_history npch | ||||
on np.id = npch.project_id | on np.id = npch.project_id | ||||
@@ -59,4 +59,7 @@ public class ProjectChangeListDTO { | |||||
@ApiModelProperty("变更ID") | @ApiModelProperty("变更ID") | ||||
private Long changeId; | private Long changeId; | ||||
@ApiModelProperty("是否可重新提交") | |||||
private Boolean canResubmit; | |||||
} | } |
@@ -62,4 +62,7 @@ public class ProjectChangeListVO { | |||||
@ApiModelProperty("流程实例ID") | @ApiModelProperty("流程实例ID") | ||||
private String instCode; | private String instCode; | ||||
@ApiModelProperty("是否可重新提交") | |||||
private Boolean canResubmit; | |||||
} | } |
@@ -15,7 +15,6 @@ import com.hz.pm.api.sys.model.entity.UserRole; | |||||
import com.hz.pm.api.sys.service.IRoleService; | import com.hz.pm.api.sys.service.IRoleService; | ||||
import com.hz.pm.api.sys.service.IUserRoleService; | import com.hz.pm.api.sys.service.IUserRoleService; | ||||
import com.hz.pm.api.user.helper.MhUnitCache; | import com.hz.pm.api.user.helper.MhUnitCache; | ||||
import com.hz.pm.api.user.model.dto.UnitDTO; | |||||
import com.hz.pm.api.user.model.entity.UserInfo; | import com.hz.pm.api.user.model.entity.UserInfo; | ||||
import com.hz.pm.api.user.model.enumeration.UserAvailableEnum; | import com.hz.pm.api.user.model.enumeration.UserAvailableEnum; | ||||
import com.hz.pm.api.user.model.po.ReqUserDetailEditPO; | import com.hz.pm.api.user.model.po.ReqUserDetailEditPO; | ||||
@@ -75,6 +74,8 @@ public class UserInfoManage { | |||||
if (page.getTotal() == 0) { | if (page.getTotal() == 0) { | ||||
return PageVo.empty(); | return PageVo.empty(); | ||||
} | } | ||||
List<Long> userIds = CollUtils.fieldList(page.getRecords(), UserInfo::getId); | |||||
Map<Long, List<UserRoleVO>> userRoleMap = getUserRoleMap(userIds); | |||||
List<UserInfoListVO> result = new ArrayList<>(); | List<UserInfoListVO> result = new ArrayList<>(); | ||||
page.getRecords().forEach(r -> { | page.getRecords().forEach(r -> { | ||||
UserInfoListVO item = new UserInfoListVO(); | UserInfoListVO item = new UserInfoListVO(); | ||||
@@ -82,7 +83,7 @@ public class UserInfoManage { | |||||
userStatusBuilder(item, r); | userStatusBuilder(item, r); | ||||
item.setUpdateTime(r.getUpdateOn()); | item.setUpdateTime(r.getUpdateOn()); | ||||
item.setEmployeeCode(r.getEmployeeCode()); | item.setEmployeeCode(r.getEmployeeCode()); | ||||
item.setUserRoleList(getUserRole(item.getUserId())); | |||||
item.setUserRoleList(userRoleMap.get(r.getId())); | |||||
item.setUserId(r.getId()); | item.setUserId(r.getId()); | ||||
item.setPhoneNo(r.getMobile()); | item.setPhoneNo(r.getMobile()); | ||||
item.setMhUnitId(r.getMhUnitId()); | item.setMhUnitId(r.getMhUnitId()); | ||||
@@ -154,6 +155,36 @@ public class UserInfoManage { | |||||
return userRoleInfoList; | return userRoleInfoList; | ||||
} | } | ||||
private Map<Long, List<UserRoleVO>> getUserRoleMap(Collection<Long> userIds) { | |||||
if (CollUtil.isEmpty(userIds)) { | |||||
return Collections.emptyMap(); | |||||
} | |||||
List<UserRole> userRoleList = userRoleService.list(Wrappers.lambdaQuery(UserRole.class) | |||||
.in(UserRole::getUserId, userIds) | |||||
.orderByAsc(UserRole::getCreateOn)); | |||||
if (CollUtil.isNotEmpty(userRoleList)) { | |||||
List<Long> roleIds = CollUtils.fieldList(userRoleList, UserRole::getRoleId); | |||||
List<Role> roleList = roleService.listByIds(roleIds); | |||||
Map<Long, Role> roleMap = CollUtils.listToMap(roleList, Role::getId); | |||||
Map<Long, List<UserRoleVO>> userRoleMap = userRoleList.stream() | |||||
.filter(r -> roleMap.containsKey(r.getRoleId())) | |||||
.collect(Collectors.groupingBy(UserRole::getUserId, | |||||
Collectors.mapping(w -> { | |||||
Role role = roleMap.get(w.getRoleId()); | |||||
UserRoleVO userRoleVO = new UserRoleVO(); | |||||
userRoleVO.setId(role.getId()); | |||||
userRoleVO.setName(role.getName()); | |||||
userRoleVO.setCreateOn(role.getCreateOn()); | |||||
return userRoleVO; | |||||
}, Collectors.toList()))); | |||||
for (List<UserRoleVO> value : userRoleMap.values()) { | |||||
value.sort(Comparator.comparing(UserRoleVO::getCreateOn)); | |||||
} | |||||
return userRoleMap; | |||||
} | |||||
return Collections.emptyMap(); | |||||
} | |||||
@Transactional(rollbackFor = Exception.class) | @Transactional(rollbackFor = Exception.class) | ||||
public void disableOrEnable(ReqUserDisableOrEnablePO req) { | public void disableOrEnable(ReqUserDisableOrEnablePO req) { | ||||
Long userId; | Long userId; | ||||