diff --git a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/EmergencyProfessionUser.java b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/EmergencyProfessionUser.java index 951ee20..9376f33 100644 --- a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/EmergencyProfessionUser.java +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/EmergencyProfessionUser.java @@ -126,4 +126,8 @@ public class EmergencyProfessionUser implements Serializable { // 专业人员 @TableField(exist = false) private Integer professionNum; + + // 科室名称 + @TableField(exist = false) + private String deptName; } diff --git a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/OrderOperator.java b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/OrderOperator.java index d571500..fc3cbe3 100644 --- a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/OrderOperator.java +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/OrderOperator.java @@ -37,7 +37,7 @@ public class OrderOperator implements Serializable { /** * 人员类型(人员类型0:操作人员 1:专业人员) */ - @Schema(title = "人员类型(人员类型0:操作人员 1:专业人员)") + @Schema(title = "人员类型(人员类型0:操作人员 1:专业人员 2:员工)") private Integer operatorType; /** diff --git a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/dto/AddOtherMemberDTO.java b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/dto/AddOtherMemberDTO.java index ac550ed..62bef10 100644 --- a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/dto/AddOtherMemberDTO.java +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/dto/AddOtherMemberDTO.java @@ -33,4 +33,10 @@ public class AddOtherMemberDTO { @Size(min = 1, max = 100, message = "邀请成员数量必须在1-100个之间") @Schema(title = "邀请成员id集合") private List memberList; + + /** + * 邀请成员类型:0=专家/专业人员,1=员工,默认0向后兼容 + */ + @Schema(title = "邀请成员类型(0:专家, 1:员工)") + private Integer memberType; } diff --git a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/dto/RemoveGroupMemberDTO.java b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/dto/RemoveGroupMemberDTO.java new file mode 100644 index 0000000..bc7e1b4 --- /dev/null +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/dto/RemoveGroupMemberDTO.java @@ -0,0 +1,36 @@ +package com.renkang.emergency.entity.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * @author PengJ + * @version 1.0 + * @description: 移除群成员DTO + * @date 2025/6/25 + */ +@NoArgsConstructor +@Data +public class RemoveGroupMemberDTO { + + /** + * 群组id + */ + @NotBlank(message = "群组id不能为空") + @Schema(title = "群组id") + private String groupId; + + /** + * 移除成员id集合 + */ + @NotEmpty(message = "移除成员id集合不能为空") + @Size(min = 1, max = 100, message = "移除成员数量必须在1-100个之间") + @Schema(title = "移除成员id集合") + private List memberList; +} diff --git a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/EmployeeVO.java b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/EmployeeVO.java new file mode 100644 index 0000000..537b1a9 --- /dev/null +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/EmployeeVO.java @@ -0,0 +1,38 @@ +package com.renkang.emergency.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author PengJ + * @version 1.0 + * @description: 员工搜索结果VO + * @date 2025/6/25 + */ +@Data +public class EmployeeVO { + + @Schema(title = "用户ID") + private String userId; + + @Schema(title = "姓名") + private String realname; + + @Schema(title = "头像") + private String avatar; + + @Schema(title = "部门编码") + private String orgCode; + + @Schema(title = "单位名称") + private String orgName; + + @Schema(title = "部门名称") + private String deptName; + + @Schema(title = "手机号") + private String phone; + + @Schema(title = "工号") + private String workNo; +} diff --git a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/GroupMemberVO.java b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/GroupMemberVO.java index d7f729a..b4b6440 100644 --- a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/GroupMemberVO.java +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/GroupMemberVO.java @@ -42,4 +42,10 @@ public class GroupMemberVO { @Schema(title = "是否是群组成员, 0:不是群组成员, 1:是群组成员") private Integer isGroupMember; + /** + * 成员类型:-1=发起人, 0=操作人员, 1=专业人员, 2=员工 + */ + @Schema(title = "成员类型(-1:发起人, 0:操作人员, 1:专业人员, 2:员工)") + private Integer memberType; + } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/controller/EmergencyApiController.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/controller/EmergencyApiController.java index e5d12ea..bd86f89 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/controller/EmergencyApiController.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/controller/EmergencyApiController.java @@ -9,6 +9,7 @@ import com.renkang.emergency.bean.response.Call; import com.renkang.emergency.bean.response.Stat; import com.renkang.emergency.bean.response.StatSimple; import com.renkang.emergency.entity.dto.AddOtherMemberDTO; +import com.renkang.emergency.entity.dto.RemoveGroupMemberDTO; import com.renkang.emergency.entity.vo.CreateGroupMagVO; import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.api.vo.Result; @@ -123,4 +124,10 @@ public class EmergencyApiController { return Result.OK(emergencyApiService.addGroupUser(dto)); } + @Operation(summary = "移除群成员-应急") + @PostMapping(value = "/removeGroupUser") + public Result removeGroupUser(@RequestBody @Validated RemoveGroupMemberDTO dto) { + return Result.OK(emergencyApiService.removeGroupUser(dto)); + } + } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/controller/EmergencyOrderApiController.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/controller/EmergencyOrderApiController.java index 8a26530..5dc5757 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/controller/EmergencyOrderApiController.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/controller/EmergencyOrderApiController.java @@ -12,9 +12,11 @@ import com.renkang.emergency.bean.request.StationUpdateOrder; import com.renkang.emergency.bean.response.InitUserOrder; import com.renkang.emergency.bean.response.OrderThrough; import com.renkang.emergency.bean.response.SessionOrderUser; +import com.renkang.emergency.entity.EmergencyProfessionUser; import com.renkang.emergency.entity.Order; import com.renkang.emergency.entity.OrderDetail; import com.renkang.emergency.entity.OrderSendRecord; +import com.renkang.emergency.entity.vo.EmployeeVO; import com.renkang.emergency.entity.vo.GroupMemberVO; import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.api.vo.Result; @@ -296,5 +298,28 @@ public class EmergencyOrderApiController { return Result.OK(emergencyOrderApiService.getGroupMemberList(sessionId)); } + @Operation(summary = "搜索专家/专业人员") + @GetMapping("/searchExpert") + public Result> searchExpert( + @RequestParam(required = false) String realname, + @RequestParam(required = false) String centerId, + @RequestParam(required = false) String excludeSessionId, + @RequestParam(defaultValue = "1") Integer pageNo, + @RequestParam(defaultValue = "10") Integer pageSize) { + return Result.OK(emergencyOrderApiService.searchExpert(realname, centerId, excludeSessionId, pageNo, pageSize)); + } + + @Operation(summary = "搜索员工") + @GetMapping("/searchEmployee") + public Result> searchEmployee( + @RequestParam(required = false) String realname, + @RequestParam(required = false) String orgCode, + @RequestParam(required = false) String workNo, + @RequestParam(required = false) String phone, + @RequestParam(required = false) String excludeSessionId, + @RequestParam(defaultValue = "1") Integer pageNo, + @RequestParam(defaultValue = "10") Integer pageSize) { + return Result.OK(emergencyOrderApiService.searchEmployee(realname, orgCode, workNo, phone, excludeSessionId, pageNo, pageSize)); + } } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/EmergencyApiService.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/EmergencyApiService.java index 9f76261..2af9030 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/EmergencyApiService.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/EmergencyApiService.java @@ -7,6 +7,7 @@ import com.renkang.emergency.bean.response.Call; import com.renkang.emergency.bean.response.Stat; import com.renkang.emergency.bean.response.StatSimple; import com.renkang.emergency.entity.dto.AddOtherMemberDTO; +import com.renkang.emergency.entity.dto.RemoveGroupMemberDTO; import com.renkang.emergency.entity.vo.CreateGroupMagVO; import org.jeecg.common.api.vo.Result; @@ -37,4 +38,6 @@ public interface EmergencyApiService { List fixOrderStatus(); boolean addGroupUser(AddOtherMemberDTO dto); + + boolean removeGroupUser(RemoveGroupMemberDTO dto); } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/EmergencyOrderApiService.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/EmergencyOrderApiService.java index c84b788..b037446 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/EmergencyOrderApiService.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/EmergencyOrderApiService.java @@ -9,10 +9,12 @@ import com.renkang.emergency.bean.request.StationUpdateOrder; import com.renkang.emergency.bean.response.InitUserOrder; import com.renkang.emergency.bean.response.OrderThrough; import com.renkang.emergency.bean.response.SessionOrderUser; +import com.renkang.emergency.entity.EmergencyProfessionUser; import com.renkang.emergency.entity.Order; import com.renkang.emergency.entity.OrderDetail; import com.renkang.emergency.entity.OrderSendRecord; import com.renkang.emergency.entity.TblHelpCentorVo; +import com.renkang.emergency.entity.vo.EmployeeVO; import com.renkang.emergency.entity.vo.GroupMemberVO; import java.util.Date; @@ -75,4 +77,8 @@ public interface EmergencyOrderApiService { List getGroupMemberList(String sessionId); + IPage searchExpert(String realname, String centerId, String excludeSessionId, Integer pageNo, Integer pageSize); + + IPage searchEmployee(String realname, String orgCode, String workNo, String phone, String excludeSessionId, Integer pageNo, Integer pageSize); + } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyApiServiceImpl.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyApiServiceImpl.java index f5739b8..09c3063 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyApiServiceImpl.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyApiServiceImpl.java @@ -17,6 +17,7 @@ import com.renkang.emergency.bean.response.*; import com.renkang.emergency.constant.EmergencyConstants; import com.renkang.emergency.entity.*; import com.renkang.emergency.entity.dto.AddOtherMemberDTO; +import com.renkang.emergency.entity.dto.RemoveGroupMemberDTO; import com.renkang.emergency.entity.vo.CreateGroupMagVO; import com.renkang.emergency.manager.EmergencyCloudManager; import com.renkang.emergency.mapper.*; @@ -27,9 +28,11 @@ import com.renkang.emergency.util.DateUtils; import com.renkang.emergency.websocket.WebSocket; import com.renkang.im.api.IMHelloApi; import com.renkang.im.dto.AddGroupMemberDTO; +import com.renkang.im.dto.DeleteGroupMemberDTO; import com.renkang.im.entity.ConSessionRequestDO; import com.renkang.im.entity.ImGroupMsgTextReqDO; import com.renkang.im.vo.AddGroupMemberVO; +import com.renkang.im.vo.ImBaseResult; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.shiro.SecurityUtils; @@ -1079,25 +1082,34 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { ExceptionAssertsUtil.fail("应急单不存在"); } String orderId = order.getId(); + // memberType: 0=专家/专业人员(默认), 1=员工 + Integer memberType = dto.getMemberType(); + Integer operatorType = (memberType != null && memberType == 1) ? 2 : 1; + Date now = new Date(); + List newMemberList = new ArrayList<>(); dto.getMemberList().forEach(userId -> { - OrderOperator orderOperator = orderOperatorMapper.selectOne(new LambdaQueryWrapper() + OrderOperator existing = orderOperatorMapper.selectOne(new LambdaQueryWrapper() .eq(OrderOperator::getOrderId, orderId) .eq(OrderOperator::getUserId, userId) ); - if (orderOperator != null) { + if (existing != null) { return; } - orderOperator = new OrderOperator(); + OrderOperator orderOperator = new OrderOperator(); orderOperator.setOrderId(orderId); - orderOperator.setOperatorType(1); + orderOperator.setOperatorType(operatorType); orderOperator.setUserId(userId); orderOperator.setJoinType(1); - orderOperator.setJoinDate(new Date()); + orderOperator.setJoinDate(now); orderOperatorMapper.insert(orderOperator); + newMemberList.add(userId); }); + if (newMemberList.isEmpty()) { + ExceptionAssertsUtil.fail("所有成员已在群组中"); + } AddGroupMemberDTO addGroupMemberDTO = new AddGroupMemberDTO(); addGroupMemberDTO.setGroupId(dto.getGroupId()); - addGroupMemberDTO.setMemberList(dto.getMemberList().stream().map(userId -> { + addGroupMemberDTO.setMemberList(newMemberList.stream().map(userId -> { AddGroupMemberDTO.MemberListDTO memberListDTO = new AddGroupMemberDTO.MemberListDTO(); memberListDTO.setMemberAccount(userId); return memberListDTO; @@ -1110,4 +1122,34 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { } return true; } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean removeGroupUser(RemoveGroupMemberDTO dto) { + String groupId = dto.getGroupId(); + Order order = orderMapper.selectOne(new LambdaQueryWrapper() + .eq(Order::getSessionId, groupId) + ); + if (order == null) { + ExceptionAssertsUtil.fail("应急单不存在"); + } + String orderId = order.getId(); + // 只允许移除协助人员(joinType=1),不能移除初始处理人员(joinType=0) + for (String userId : dto.getMemberList()) { + orderOperatorMapper.delete(new LambdaQueryWrapper() + .eq(OrderOperator::getOrderId, orderId) + .eq(OrderOperator::getUserId, userId) + .eq(OrderOperator::getJoinType, 1) + ); + } + // 调用IM删除群成员 + DeleteGroupMemberDTO deleteDTO = new DeleteGroupMemberDTO(); + deleteDTO.setGroupId(groupId); + deleteDTO.setMemberToDelAccount(dto.getMemberList()); + Result result = iMHelloApi.deleteGroupMember(deleteDTO); + if (!result.isSuccess()) { + ExceptionAssertsUtil.fail("IM删除群成员失败"); + } + return true; + } } diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyOrderApiServiceImpl.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyOrderApiServiceImpl.java index 3ebe544..8c11ff0 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyOrderApiServiceImpl.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyOrderApiServiceImpl.java @@ -19,8 +19,10 @@ import com.renkang.emergency.bean.request.StationUpdateOrder; import com.renkang.emergency.bean.response.*; import com.renkang.emergency.constant.EmergencyConstants; import com.renkang.emergency.entity.*; +import com.renkang.emergency.entity.vo.EmployeeVO; import com.renkang.emergency.entity.vo.GroupMemberVO; import com.renkang.emergency.manager.EmergencyCacheManager; +import com.renkang.emergency.manager.EmergencyCloudManager; import com.renkang.emergency.mapper.*; import com.renkang.emergency.service.IOrderDetailService; import com.renkang.emergency.service.IOrderService; @@ -28,10 +30,14 @@ import com.renkang.im.api.IMHelloApi; import com.renkang.im.entity.ImGroupMsgTextReqDO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.ExceptionAssertsUtil; +import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.system.vo.LoginUserNew; import org.jeecg.global.GlobalUtils; +import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.manager.ISysCache; import org.jeecg.modules.system.entity.SysDepart; import org.springframework.beans.factory.annotation.Autowired; @@ -69,6 +75,10 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService { private OrderOperatorMapper orderOperatorMapper; @Autowired private EmergencyProfessionUserMapper emergencyProfessionUserMapper; + @Autowired + private ISysBaseAPI sysBaseAPI; + @Autowired + private EmergencyCloudManager emergencyCloudManager; @Override public IPage initUserOrderPage(Page page) { @@ -608,12 +618,12 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService { ExceptionAssertsUtil.fail("应急单不存在"); } String orderId = order.getId(); - // 添加发起人信息 + // 添加发起人信息,memberType=-1 handleGroupMember(groupMemberVos, orderId, order.getInitiatorUserId(), order.getInitiatorUserName(), order.getInitiatorUserAvatar(), - 1); + 1, -1); // 已加入应急单人员 List orderOperators = orderOperatorMapper.selectList( @@ -625,22 +635,49 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService { .map(OrderOperator::getUserId) .collect(Collectors.toList()); - // 查询已加入人员的专业信息 + // 查询已加入人员的专业信息(从EmergencyProfessionUser) + Map profUserMap = new HashMap<>(); if (!userIds.isEmpty()) { List emergencyProfessionUsers = emergencyProfessionUserMapper.selectList( new LambdaQueryWrapper() .in(EmergencyProfessionUser::getUserId, userIds) ); - emergencyProfessionUsers.forEach(emergencyProfessionUser -> - handleGroupMember(groupMemberVos, orderId, - emergencyProfessionUser.getUserId(), - emergencyProfessionUser.getRealname(), - emergencyProfessionUser.getAvatar(), - 1) - ); + for (EmergencyProfessionUser u : emergencyProfessionUsers) { + profUserMap.put(u.getUserId(), u); + } } - // 其他专业人员(排除已在应急单中的用户) + // 查询员工成员(operatorType=2)的系统用户信息 + List employeeUserIds = orderOperators.stream() + .filter(op -> op.getOperatorType() != null && op.getOperatorType() == 2) + .map(OrderOperator::getUserId) + .filter(uid -> !profUserMap.containsKey(uid)) + .collect(Collectors.toList()); + Map sysUserMap = new HashMap<>(); + if (!employeeUserIds.isEmpty()) { + sysUserMap = emergencyCloudManager.listUser(employeeUserIds); + } + + // 遍历OrderOperator,填充已加入的群成员 + for (OrderOperator op : orderOperators) { + String userName = ""; + String avatar = ""; + EmergencyProfessionUser profUser = profUserMap.get(op.getUserId()); + if (profUser != null) { + userName = profUser.getRealname(); + avatar = profUser.getAvatar(); + } else { + LoginUserNew sysUser = sysUserMap.get(op.getUserId()); + if (sysUser != null) { + userName = sysUser.getRealname(); + avatar = sysUser.getAvatar(); + } + } + handleGroupMember(groupMemberVos, orderId, + op.getUserId(), userName, avatar, 1, op.getOperatorType()); + } + + // 其他专业人员(排除已在应急单中的用户),memberType=1 LambdaQueryWrapper otherMajorQuery = new LambdaQueryWrapper<>(); otherMajorQuery.eq(EmergencyProfessionUser::getType, "6"); if (!userIds.isEmpty()) { @@ -653,21 +690,105 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService { otherMajorMember.getUserId(), otherMajorMember.getRealname(), otherMajorMember.getAvatar(), - 0) + 0, 1) ); return groupMemberVos.stream().filter(groupMemberVO -> !groupMemberVO.getUserId().equals(loginUser.getId())).collect(Collectors.toList()); } - public void handleGroupMember(List groupMemberVos, String orderId, String userId, String userName, String avatar, Integer isGroupMember) { + public void handleGroupMember(List groupMemberVos, String orderId, String userId, String userName, String avatar, Integer isGroupMember, Integer memberType) { GroupMemberVO groupMemberVO = new GroupMemberVO(); groupMemberVO.setOrderId(orderId); groupMemberVO.setUserId(userId); groupMemberVO.setUserName(userName); groupMemberVO.setAvatar(avatar); groupMemberVO.setIsGroupMember(isGroupMember); + groupMemberVO.setMemberType(memberType); groupMemberVos.add(groupMemberVO); } + @Override + public IPage searchExpert(String realname, String centerId, String excludeSessionId, Integer pageNo, Integer pageSize) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(EmergencyProfessionUser::getType, "6"); + if (StrUtil.isNotBlank(realname)) { + query.like(EmergencyProfessionUser::getRealname, realname); + } + if (StrUtil.isNotBlank(centerId)) { + query.eq(EmergencyProfessionUser::getCenterId, centerId); + } + // 排除已在群中的人员 + if (StrUtil.isNotBlank(excludeSessionId)) { + Order order = orderMapper.selectOne(new LambdaQueryWrapper() + .eq(Order::getSessionId, excludeSessionId)); + if (order != null) { + List ops = orderOperatorMapper.selectList( + new LambdaQueryWrapper() + .eq(OrderOperator::getOrderId, order.getId())); + List existUserIds = ops.stream().map(OrderOperator::getUserId).collect(Collectors.toList()); + if (!existUserIds.isEmpty()) { + query.notIn(EmergencyProfessionUser::getUserId, existUserIds); + } + } + } + Page page = new Page<>(pageNo != null ? pageNo : 1, pageSize != null ? pageSize : 10); + IPage result = emergencyProfessionUserMapper.selectPage(page, query); + // 批量查询系统用户信息,填充科室(部门)名称 + List userIds = result.getRecords().stream() + .map(EmergencyProfessionUser::getUserId).collect(Collectors.toList()); + if (!userIds.isEmpty()) { + Map userMap = emergencyCloudManager.listUser(userIds); + result.getRecords().forEach(prof -> { + LoginUserNew sysUser = userMap.get(prof.getUserId()); + if (sysUser != null && StrUtil.isNotBlank(sysUser.getOrgCode())) { + prof.setDeptName(emergencyCacheManager.getUserDepart(sysUser.getOrgCode()).getDepartName()); + } + }); + } + return result; + } + + @Override + public IPage searchEmployee(String realname, String orgCode, String workNo, String phone, String excludeSessionId, Integer pageNo, Integer pageSize) { + // 收集需要在结果中排除的用户ID + final Set excludeUserIds = new HashSet<>(); + if (StrUtil.isNotBlank(excludeSessionId)) { + Order order = orderMapper.selectOne(new LambdaQueryWrapper() + .eq(Order::getSessionId, excludeSessionId)); + if (order != null) { + List ops = orderOperatorMapper.selectList( + new LambdaQueryWrapper() + .eq(OrderOperator::getOrderId, order.getId())); + excludeUserIds.addAll(ops.stream().map(OrderOperator::getUserId).collect(Collectors.toList())); + } + } + // 构建查询条件 + SysUser filter = new SysUser(); + filter.setRealname(realname); + filter.setOrgCode(orgCode); + filter.setWorkNo(workNo); + filter.setPhone(phone); + Page srcPage = sysBaseAPI.pageUser(filter, pageNo != null ? pageNo : 1, pageSize != null ? pageSize : 10, null); + Page targetPage = new Page<>(srcPage.getCurrent(), srcPage.getSize(), srcPage.getTotal()); + targetPage.setRecords(srcPage.getRecords().stream() + .filter(u -> !excludeUserIds.contains(u.getId())) + .map(u -> { + EmployeeVO vo = new EmployeeVO(); + vo.setUserId(u.getId()); + vo.setRealname(u.getRealname()); + vo.setAvatar(u.getAvatar()); + vo.setOrgCode(u.getOrgCode()); + vo.setPhone(u.getPhone()); + vo.setWorkNo(u.getWorkNo()); + // 填充单位名称和部门名称 + if (StrUtil.isNotBlank(u.getOrgCode())) { + vo.setOrgName(emergencyCacheManager.getUserSecondDepart(u.getOrgCode()).getDepartName()); + vo.setDeptName(emergencyCacheManager.getUserDepart(u.getOrgCode()).getDepartName()); + } + return vo; + }).collect(Collectors.toList())); + return targetPage; + } + private List convertOrder(List orders) { if (CollectionUtils.isEmpty(orders)) { return Collections.emptyList(); diff --git a/health-im/health-im-api/src/main/java/com/renkang/im/api/IMHelloApi.java b/health-im/health-im-api/src/main/java/com/renkang/im/api/IMHelloApi.java index d32d610..b1a2fac 100644 --- a/health-im/health-im-api/src/main/java/com/renkang/im/api/IMHelloApi.java +++ b/health-im/health-im-api/src/main/java/com/renkang/im/api/IMHelloApi.java @@ -3,6 +3,7 @@ package com.renkang.im.api; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.renkang.im.api.fallback.IMHelloFallback; import com.renkang.im.dto.AddGroupMemberDTO; +import com.renkang.im.dto.DeleteGroupMemberDTO; import com.renkang.im.entity.*; import com.renkang.im.vo.AddGroupMemberVO; import com.renkang.im.vo.ImBaseResult; @@ -80,4 +81,12 @@ public interface IMHelloApi { @GetMapping("/wnapp/destroyGroup") Result destroyGroup(@RequestParam("groupId") String groupId); + /** + * @description: 删除群成员 + * @author PengJ + * @date 2025/6/25 + */ + @PostMapping(value = "/wnapp/deleteGroupMember") + Result deleteGroupMember(@RequestBody @Validated DeleteGroupMemberDTO dto); + } diff --git a/health-im/health-im-api/src/main/java/com/renkang/im/dto/DeleteGroupMemberDTO.java b/health-im/health-im-api/src/main/java/com/renkang/im/dto/DeleteGroupMemberDTO.java new file mode 100644 index 0000000..657624d --- /dev/null +++ b/health-im/health-im-api/src/main/java/com/renkang/im/dto/DeleteGroupMemberDTO.java @@ -0,0 +1,41 @@ +package com.renkang.im.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author PengJ + * @version 1.0 + * @description: 删除群成员dto + * @date 2025/6/25 + */ +@NoArgsConstructor +@Data +public class DeleteGroupMemberDTO { + + /** + * 要操作的群组(必填) + */ + @NotNull(message = "群组ID不能为空") + @JsonProperty("GroupId") + private String groupId; + + /** + * 是否静默删人。 + * 0:非静默删人。 + * 1:静默删人。 + * 不填该字段默认为0。 + */ + @JsonProperty("Silence") + private Integer silence; + + /** + * 要删除的群成员ID列表 + */ + @JsonProperty("MemberToDel_Account") + private List memberToDelAccount; +} diff --git a/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TXController.java b/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TXController.java index f0ad59c..828605c 100644 --- a/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TXController.java +++ b/health-im/health-im-biz/src/main/java/com/renkang/im/controller/TXController.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject; import com.renkang.consultation.api.ConSessionHelloApi; import com.renkang.consultation.entity.ConSessionDO; import com.renkang.im.dto.AddGroupMemberDTO; +import com.renkang.im.dto.DeleteGroupMemberDTO; import com.renkang.im.entity.*; import com.renkang.im.service.IImMsgRecordAllService; import com.renkang.im.util.IdWorker; @@ -398,6 +399,12 @@ public class TXController { return Result.OK(tencentCloudImUtil.addGroupMember(dto)); } + @Operation(summary = "删除群成员", description = "删除群成员") + @PostMapping("/deleteGroupMember") + public Result deleteGroupMember(@RequestBody @Validated DeleteGroupMemberDTO dto) { + return Result.OK(tencentCloudImUtil.deleteGroupMember(dto)); + } + @Operation(summary = "解散群组", description = "解散群组") @GetMapping("/destroyGroup") public Result destroyGroup(@RequestParam("groupId") String groupId) { diff --git a/health-im/health-im-biz/src/main/java/com/renkang/im/util/TencentCloudImUtil.java b/health-im/health-im-biz/src/main/java/com/renkang/im/util/TencentCloudImUtil.java index 3df3070..0b90295 100644 --- a/health-im/health-im-biz/src/main/java/com/renkang/im/util/TencentCloudImUtil.java +++ b/health-im/health-im-biz/src/main/java/com/renkang/im/util/TencentCloudImUtil.java @@ -11,6 +11,7 @@ import com.renkang.im.ImSendEnum; import com.renkang.im.common.TencentCloudImApiConstant; import com.renkang.im.common.TencentCloudImConstant; import com.renkang.im.dto.AddGroupMemberDTO; +import com.renkang.im.dto.DeleteGroupMemberDTO; import com.renkang.im.entity.*; import com.renkang.im.vo.AddGroupMemberVO; import com.renkang.im.vo.ImBaseResult; @@ -505,6 +506,30 @@ public class TencentCloudImUtil { } + /** + * 删除群成员 + * + * @param dto 删除群成员请求 + * @return ImBaseResult + */ + public ImBaseResult deleteGroupMember(DeleteGroupMemberDTO dto) { + try { + Integer random = RandomUtils.nextInt(0, 999999999); + String httpsUrl = getHttpsUrl(TencentCloudImApiConstant.GroupManage.DELETE_GROUP_MEMBER, random); + String jsonString = objectMapper.writeValueAsString(dto); + JSONObject jsonObject = JSONObject.parseObject(jsonString); + log.info("腾讯云im【删除群成员】,请求参数:{}", jsonObject); + String result = HttpUtil.doPost(httpsUrl, jsonObject); + log.info("腾讯云im【删除群成员】,返回结果:{}", result); + return JSONObject.toJavaObject(JSONObject.parseObject(result), ImBaseResult.class); + } catch (Exception e) { + log.error("【删除群成员】异常:{}", e.getMessage()); + ImBaseResult result = new ImBaseResult(); + result.setActionStatus("FAIL"); + return result; + } + } + /** * 拉取群聊历史消息 * diff --git a/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java b/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java index ad059d9..ac08c82 100644 --- a/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java +++ b/jeecg-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysBaseApiImpl.java @@ -1127,8 +1127,13 @@ public class SysBaseApiImpl implements ISysBaseAPI { if (map != null) { for (Map.Entry entry : map.entrySet()) { String str = "${" + entry.getKey() + "}"; - title = title.replace(str, entry.getValue()); - content = content.replace(str, entry.getValue()); + String value = entry.getValue() != null ? entry.getValue() : ""; + if (title != null) { + title = title.replace(str, value); + } + if (content != null) { + content = content.replace(str, value); + } } } SysMessage sysMessage = new SysMessage(); @@ -1161,7 +1166,10 @@ public class SysBaseApiImpl implements ISysBaseAPI { if (map != null) { for (Map.Entry entry : map.entrySet()) { String str = "${" + entry.getKey() + "}"; - content = content.replace(str, entry.getValue()); + String value = entry.getValue() != null ? entry.getValue() : ""; + if (content != null) { + content = content.replace(str, value); + } } } return content;