From 92033a17cb5a00120844b835ecefbd3a99892361 Mon Sep 17 00:00:00 2001 From: PengJ <2413927716@qq.com> Date: Fri, 7 Nov 2025 15:30:34 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=BA=94=E6=80=A5=E3=80=91IM=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E9=80=9A=E8=AF=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/dto/AddOtherMemberDTO.java | 43 +++++ .../emergency/entity/vo/CreateGroupMagVO.java | 51 ++++++ .../emergency/entity/vo/GroupMemberVO.java | 45 +++++ .../emergency/entity/vo/WeekDataVO.java | 6 + .../controller/EmergencyApiController.java | 21 ++- .../EmergencyOrderApiController.java | 13 ++ .../api/service/EmergencyApiService.java | 5 +- .../api/service/EmergencyOrderApiService.java | 4 + .../service/impl/EmergencyApiServiceImpl.java | 166 +++++++++++++++--- .../impl/EmergencyOrderApiServiceImpl.java | 131 +++++++++++--- .../emergency/controller/OrderController.java | 43 ++++- .../emergency/mapper/OrderOperatorMapper.java | 14 ++ .../xml/EmergencySchedulesNewItemMapper.xml | 3 + .../EmergencySchedulesNewServiceImpl.java | 96 +++++++--- .../service/impl/OrderServiceImpl.java | 58 +++++- .../java/com/renkang/im/api/IMHelloApi.java | 9 + .../com/renkang/im/dto/AddGroupMemberDTO.java | 54 ++++++ .../com/renkang/im/vo/AddGroupMemberVO.java | 67 +++++++ .../main/java/com/renkang/im/vo/ImResult.java | 45 +++++ .../renkang/im/controller/TXController.java | 75 ++++---- .../renkang/im/util/TencentCloudImUtil.java | 75 ++++---- .../java/org/jeecg/util/RSAEncryptUtils.java | 2 +- 22 files changed, 865 insertions(+), 161 deletions(-) create mode 100644 health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/dto/AddOtherMemberDTO.java create mode 100644 health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/CreateGroupMagVO.java create mode 100644 health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/GroupMemberVO.java create mode 100644 health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/mapper/OrderOperatorMapper.java create mode 100644 health-im/health-im-api/src/main/java/com/renkang/im/dto/AddGroupMemberDTO.java create mode 100644 health-im/health-im-api/src/main/java/com/renkang/im/vo/AddGroupMemberVO.java create mode 100644 health-im/health-im-api/src/main/java/com/renkang/im/vo/ImResult.java 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 new file mode 100644 index 0000000..86e7499 --- /dev/null +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/dto/AddOtherMemberDTO.java @@ -0,0 +1,43 @@ +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 Huawei + * @version 1.0 + * @description: 添加其他成员DTO + * @date 2025/11/3 10:41 + */ +@NoArgsConstructor +@Data +public class AddOtherMemberDTO { + + /** + * 群组id + */ + @NotBlank(message = "群组id不能为空") + @Schema(title = "群组id") + private String groupId; + + /** + * 应急单id + */ + @NotBlank(message = "应急单id不能为空") + @Schema(title = "应急单id") + private String orderId; + + /** + * 邀请成员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/CreateGroupMagVO.java b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/CreateGroupMagVO.java new file mode 100644 index 0000000..f5057f1 --- /dev/null +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/CreateGroupMagVO.java @@ -0,0 +1,51 @@ +package com.renkang.emergency.entity.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author Huawei + * @version 1.0 + * @description: 创建群聊VO + * @date 2025/11/3 10:41 + */ +@NoArgsConstructor +@Data +public class CreateGroupMagVO { + + /** + * 群组id + */ + @JsonProperty("groupId") + private String groupId; + + /** + * 用户id + */ + @JsonProperty("userId") + private String userId; + + /** + * 成员集合(当前加入成员) + */ + @JsonProperty("member") + private List member; + + /** + * 应急单id + */ + @JsonProperty("id") + private String id; + + @JsonProperty("tfNew") + private String tfNew; + + /** + * 成员集合(待加入成员) + */ + @JsonProperty("otherMember") + private List otherMember; +} 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 new file mode 100644 index 0000000..d7f729a --- /dev/null +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/GroupMemberVO.java @@ -0,0 +1,45 @@ +package com.renkang.emergency.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author Huawei + * @version 1.0 + * @description: 群组成员VO + * @date 2025/11/5 13:17 + */ +@Data +public class GroupMemberVO { + + /** + * 应急单id + */ + @Schema(title = "应急单id") + private String orderId; + + /** + * 用户ID + */ + @Schema(title = "用户ID") + private String userId; + + /** + * 用户名称 + */ + @Schema(title = "用户名称") + private String userName; + + /** + * 头像 + */ + @Schema(title = "头像") + private String avatar; + + /** + * 是否是群组成员, 0:不是群组成员, 1:是群组成员 + */ + @Schema(title = "是否是群组成员, 0:不是群组成员, 1:是群组成员") + private Integer isGroupMember; + +} diff --git a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/WeekDataVO.java b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/WeekDataVO.java index ecc919c..aa0fec3 100644 --- a/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/WeekDataVO.java +++ b/health-emergency/health-emergency-api/src/main/java/com/renkang/emergency/entity/vo/WeekDataVO.java @@ -29,6 +29,12 @@ public class WeekDataVO { @Schema(title ="专业人员集合") private List professionalUserList; + @Schema(title ="操作人员id集合") + private List operationUserListIds; + + @Schema(title ="专业人员id集合") + private List professionalUserListIds; + public List getOperationUserList(List itemList) { return itemList.stream() .filter(item -> "0".equals(item.getUserType())) 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 278b5f3..e5d12ea 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 @@ -8,6 +8,8 @@ import com.renkang.emergency.bean.request.SingleParam; 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.vo.CreateGroupMagVO; import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.api.vo.Result; import org.springframework.beans.factory.annotation.Autowired; @@ -95,19 +97,19 @@ public class EmergencyApiController { @Operation(summary = "创建群聊-应急") @GetMapping(value = "/createGroupMag") - public Result> createGroupMag(@RequestParam("name") String name, @RequestParam("longitude") String longitude, - @RequestParam("latitude") String latitude, - @RequestParam(required = false) String type) { - return emergencyApiService.createGroupMag(name, longitude, latitude, type); + public Result createGroupMag(@RequestParam("name") String name, @RequestParam("longitude") String longitude, + @RequestParam("latitude") String latitude, + @RequestParam(required = false) String type) { + return Result.OK(emergencyApiService.createGroupMag(name, longitude, latitude, type)); } @Operation(summary = "创建群聊-干预") @GetMapping(value = "/createGroupMagIntervene") public Result> createGroupMagIntervene(@RequestParam("name") String name, @RequestParam("longitude") String longitude, - @RequestParam("latitude") String latitude, + @RequestParam("latitude") String latitude, @RequestParam(required = false) String type) { - return emergencyApiService.createGroupMagIntervene(name, longitude, latitude,type); + return emergencyApiService.createGroupMagIntervene(name, longitude, latitude, type); } @GetMapping(value = "/fixOrderStatus") @@ -115,7 +117,10 @@ public class EmergencyApiController { return Result.ok(emergencyApiService.fixOrderStatus()); } - - + @Operation(summary = "邀请用户加入群聊-应急") + @PostMapping(value = "/addGroupUser") + public Result addGroupUser(@RequestBody @Validated AddOtherMemberDTO dto) { + return Result.OK(emergencyApiService.addGroupUser(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 33eecdf..b97702e 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 @@ -15,6 +15,8 @@ import com.renkang.emergency.bean.response.SessionOrderUser; import com.renkang.emergency.entity.Order; import com.renkang.emergency.entity.OrderDetail; import com.renkang.emergency.entity.OrderSendRecord; +import com.renkang.emergency.entity.vo.GroupMemberVO; +import io.swagger.v3.oas.annotations.Operation; import org.jeecg.common.api.vo.Result; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; @@ -283,5 +285,16 @@ public class EmergencyOrderApiController { } + /** + * @description: 获取群组成员和其他专业人员 + * @author PengJ + * @date 2025/11/5 13:14 + */ + @Operation(summary = "获取群组成员和其他专业人员") + @GetMapping("/getGroupMemberList") + public Result> getGroupMemberList(@RequestParam("orderId") String orderId) { + return Result.OK(emergencyOrderApiService.getGroupMemberList(orderId)); + } + } 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 4c6e4f8..9f76261 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 @@ -6,6 +6,8 @@ import com.renkang.emergency.bean.request.SingleParam; 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.vo.CreateGroupMagVO; import org.jeecg.common.api.vo.Result; import java.util.List; @@ -28,10 +30,11 @@ public interface EmergencyApiService { StatSimple statSimple(); - Result> createGroupMag(String name, String longitude, String latitude, String type); + CreateGroupMagVO createGroupMag(String name, String longitude, String latitude, String type); Result> createGroupMagIntervene(String name, String longitude, String latitude, String type); List fixOrderStatus(); + boolean addGroupUser(AddOtherMemberDTO 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 561a82a..e7032af 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 @@ -13,6 +13,7 @@ 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.GroupMemberVO; import java.util.List; @@ -70,4 +71,7 @@ public interface EmergencyOrderApiService { Order getOrderById(String id); List getSicknessTypeStatistic(String sex, String depart); + + List getGroupMemberList(String orderId); + } 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 9f51f70..bd6e77a 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 @@ -16,6 +16,8 @@ import com.renkang.emergency.bean.request.SingleParam; 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.vo.CreateGroupMagVO; import com.renkang.emergency.manager.EmergencyCloudManager; import com.renkang.emergency.mapper.*; import com.renkang.emergency.service.IEmergencyCenterService; @@ -24,14 +26,17 @@ import com.renkang.emergency.service.ITblAmbulanceGpsService; 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.entity.ConSessionRequestDO; import com.renkang.im.entity.ImGroupMsgTextReqDO; +import com.renkang.im.vo.AddGroupMemberVO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.bean.request.ListUser; 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; @@ -43,6 +48,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; @@ -104,6 +110,10 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { private EmergencySchedulesNewItemMapper emergencySchedulesNewItemMapper; @Autowired private LargeScreenImpl largeScreen; + @Autowired + private OrderOperatorMapper orderOperatorMapper; + @Autowired + private EmergencyProfessionUserMapper emergencyProfessionUserMapper; @Override @@ -658,6 +668,10 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { }); } + /** + * @description: 保存应急订单信息 + * @date 2025/10/31 10:57 + */ private String insertOrder(EmergencyCall emergencyCall) { LoginUser loginUser = GlobalUtils.getLoginUser(); @@ -695,17 +709,53 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { Call call = officerOnDuty(); order.setCenterId(call.getCenterId()); socket.setPopType(0); - }else { + } else { socket.setPopType(1); } orderMapper.insert(order); socket.setType(emergencyCall.getCallType()); socket.setCenterId(emergencyCall.getCenterId()); socket.setOrgCode(loginUser.getOrgCode()); - largeScreen.orderPush(socket, emergencyCall.getLongitude(), emergencyCall.getLatitude(),order.getId()); + largeScreen.orderPush(socket, emergencyCall.getLongitude(), emergencyCall.getLatitude(), order.getId()); return order.getId(); } + /** + * @description: 保存应急工单人员信息 + * @author PengJ + * @date 2025/10/31 10:58 + */ + private void saveOrderOperator(Order order) { + OrderOperator orderOperator; + if (order.getOperationUserId() != null) { + orderOperator = new OrderOperator(); + orderOperator.setOrderId(order.getId()); + orderOperator.setOperatorType(0); + orderOperator.setUserId(order.getOperationUserId()); + orderOperator.setJoinType(0); + orderOperator.setJoinDate(order.getOperationResponseTime()); + orderOperatorMapper.insert(orderOperator); + } + if (order.getMajorUserId() != null) { + orderOperator = new OrderOperator(); + orderOperator.setOrderId(order.getId()); + orderOperator.setOperatorType(1); + orderOperator.setUserId(order.getMajorUserId()); + orderOperator.setJoinType(0); + orderOperator.setJoinDate(order.getMajorResponseTime()); + orderOperatorMapper.insert(orderOperator); + } + if (order.getMajorUserTwoId() != null) { + orderOperator = new OrderOperator(); + orderOperator.setOrderId(order.getId()); + orderOperator.setOperatorType(1); + orderOperator.setUserId(order.getMajorUserTwoId()); + orderOperator.setJoinType(0); + orderOperator.setJoinDate(new Date()); + orderOperatorMapper.insert(orderOperator); + } + } + private String insertOrderIntervene(String callType, String resourceId, Double longitude, Double latitude, String type) { LoginUser loginUser = GlobalUtils.getLoginUser(); @@ -742,47 +792,65 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { return order.getId(); } + @Transactional(rollbackFor = Exception.class) @Override - public Result> createGroupMag(String name, String longitude, String latitude, String type) { + public CreateGroupMagVO createGroupMag(String name, String longitude, String latitude, String type) { + CreateGroupMagVO createGroupMagVO = new CreateGroupMagVO(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); //查是否有已经存在的应急工单,有则直接返回相关信息 Order order = emergencyResourceApiServiceImpl.sessionNowSession(sysUser.getId()); List userList = new ArrayList<>(); if (order != null) { - Map res = new HashMap<>(); - res.put("userId", sysUser.getId()); - res.put("groupId", order.getSessionId()); - res.put("tfNew", "0"); + createGroupMagVO.setUserId(sysUser.getId()); + createGroupMagVO.setGroupId(order.getSessionId()); + createGroupMagVO.setTfNew("0"); userList.add(order.getOperationUserId()); userList.add(order.getMajorUserId()); - if(null != order.getMajorUserTwoId()){ + if (null != order.getMajorUserTwoId()) { userList.add(order.getMajorUserTwoId()); } - res.put("member", userList); - res.put("id", order.getId()); - return Result.OK(res); + createGroupMagVO.setMember(userList); + createGroupMagVO.setId(order.getId()); + //查询其他专业人员(先注释) +// List emergencyProfessionUsers = emergencyProfessionUserMapper.selectList(new LambdaQueryWrapper() +// .notIn(EmergencyProfessionUser::getUserId, userList) +// .eq(EmergencyProfessionUser::getType, "6") +// ); +// List otherMember = emergencyProfessionUsers.stream().map(EmergencyProfessionUser::getUserId).collect(Collectors.toList()); +// createGroupMagVO.setOtherMember(otherMember); + return createGroupMagVO; } // 查询当前应急中心值班人员 Call rs = this.officerOnDuty(); if (rs == null || CollectionUtils.isEmpty(rs.getMajors()) || CollectionUtils.isEmpty(rs.getOperators())) { - return Result.error("没有接受方人员!"); + ExceptionAssertsUtil.fail("没有接受方人员!"); } List yesIds = new ArrayList<>(); String majorsId = rs.getMajors().get(0).getUserId(); String operatorsId = rs.getOperators().get(0).getUserId(); String majorsTwoId = null; - if(rs.getMajors().size() > 1){ - //20250926前是 多个值班人员随机取第一个 , 后改成取两个专业人员 , 将两个专业人员都拉入群聊 - majorsTwoId = rs.getMajors().get(1).getUserId(); - yesIds.add(majorsTwoId); - userList.add(majorsTwoId); - } + // 20251015改为默认仅排班的三方通话(取排班的第一个),第四方(及多方)仅在添加入群组时才能接入多方通话 +// if (rs.getMajors().size() > 1) { +// //20250926前是 多个值班人员随机取第一个 , 后改成取两个专业人员 , 将两个专业人员都拉入群聊 +// majorsTwoId = rs.getMajors().get(1).getUserId(); +// yesIds.add(majorsTwoId); +// userList.add(majorsTwoId); +// } + //查询其他专业人员(先注释) +// List emergencyProfessionUsers = emergencyProfessionUserMapper.selectList(new LambdaQueryWrapper() +// .ne(EmergencyProfessionUser::getUserId, majorsId) +// .eq(EmergencyProfessionUser::getType, "6") +// ); +// List otherMember = emergencyProfessionUsers.stream().map(EmergencyProfessionUser::getUserId).collect(Collectors.toList()); +// createGroupMagVO.setOtherMember(otherMember); userList.add(operatorsId); userList.add(majorsId); yesIds.add(sysUser.getId()); yesIds.add(majorsId); yesIds.add(operatorsId); + //添加其他专业人员 +// yesIds.addAll(otherMember); //获取参与应急的人员信息 ConSessionRequestDO conSessionRequestDO = selectConSessionRequestDO(yesIds, "", name); conSessionRequestDO.setUserId(sysUser.getId()); @@ -790,9 +858,10 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { Result> imrs = iMHelloApi.creatGroupMagNew(conSessionRequestDO); boolean isSuccess = imrs.isSuccess(); if (!isSuccess) { - return Result.error("应急单创建失败"); + ExceptionAssertsUtil.fail("应急单创建失败"); } String sessionId = (String) imrs.getResult().get("groupId"); + createGroupMagVO.setGroupId(sessionId); String callType = StrUtil.isNotBlank(type) ? "2" : "1"; //发送IM 提醒消息 sendInitMsg(sessionId, callType, sysUser.getId()); @@ -804,16 +873,19 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { //保存应急工单 String orderId = this.call(emergencyCall); //保存参与应急的人员信息 PS: 不想大改之前的代码逻辑此处 没有将同一条记录的赋值逻辑合并 - saveOderOperationInfo(orderId,sessionId,majorsId,operatorsId,majorsTwoId,rs.getCenterId(),conSessionRequestDO.getAccountList()); + saveOderOperationInfo(orderId, sessionId, majorsId, operatorsId, majorsTwoId, rs.getCenterId(), conSessionRequestDO.getAccountList()); imrs.getResult().put("member", userList); imrs.getResult().put("tfNew", "1"); imrs.getResult().put("id", orderId); - return imrs; + createGroupMagVO.setMember(userList); + createGroupMagVO.setTfNew("1"); + createGroupMagVO.setId(orderId); + return createGroupMagVO; } public void saveOderOperationInfo(String orderId, String sessionId, String majorsId, String operatorsId, String majorsTwoId, - String centerId ,List accountList) { - Map userMap = accountList.stream().collect(Collectors.toMap(LoginUserNew::getId, user -> user)); + String centerId, List accountList) { + Map userMap = accountList.stream().collect(Collectors.toMap(LoginUserNew::getId, user -> user)); Date now = new Date(); Order order = new Order(); order.setId(orderId); @@ -822,7 +894,7 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { order.setOrderStatus(EmergencyConstants.ORDER_STATUS_1_NEW); order.setIsDispatch(EmergencyConstants.ORDER_SEND_STATUS_1); order.setCenterId(centerId); - if(null != operatorsId && null != userMap.get(operatorsId)){ + if (null != operatorsId && null != userMap.get(operatorsId)) { LoginUserNew operationUser = userMap.get(operatorsId); order.setOperationUserId(operatorsId); order.setOperationUserName(handleNull(operationUser).getRealname()); @@ -831,7 +903,7 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { order.setOperationUserAvatar(handleNull(operationUser).getAvatar()); order.setOperationResponseTime(now); } - if(null != majorsId && null != userMap.get(majorsId)){ + if (null != majorsId && null != userMap.get(majorsId)) { LoginUserNew majorUser = userMap.get(majorsId); order.setMajorUserId(majorsId); order.setMajorUserName(handleNull(majorUser).getRealname()); @@ -840,7 +912,7 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { order.setMajorUserAvatar(handleNull(majorUser).getAvatar()); order.setMajorResponseTime(now); } - if(null != majorsTwoId && null != userMap.get(majorsTwoId)){ + if (null != majorsTwoId && null != userMap.get(majorsTwoId)) { LoginUserNew majorUserTwo = userMap.get(majorsTwoId); order.setMajorUserTwoId(majorsTwoId); order.setMajorUserTwoName(handleNull(majorUserTwo).getRealname()); @@ -849,6 +921,8 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { order.setMajorUserTwoAvatar(handleNull(majorUserTwo).getAvatar()); } orderMapper.updateById(order); + //保存工单人员信息 + saveOrderOperator(order); } @Override @@ -987,4 +1061,44 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { } }).map(Order::getId).collect(Collectors.toList()); } + + /** + * @description: 添加参与应急其他专业人员 + * @author PengJ + * @date 2025/11/3 16:41 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public boolean addGroupUser(AddOtherMemberDTO dto) { + dto.getMemberList().forEach(userId -> { + OrderOperator orderOperator = orderOperatorMapper.selectOne(new LambdaQueryWrapper() + .eq(OrderOperator::getOrderId, dto.getOrderId()) + .eq(OrderOperator::getUserId, userId) + ); + if (orderOperator != null) { + return; + } + orderOperator = new OrderOperator(); + orderOperator.setOrderId(dto.getOrderId()); + orderOperator.setOperatorType(1); + orderOperator.setUserId(userId); + orderOperator.setJoinType(1); + orderOperator.setJoinDate(new Date()); + orderOperatorMapper.insert(orderOperator); + }); + AddGroupMemberDTO addGroupMemberDTO = new AddGroupMemberDTO(); + addGroupMemberDTO.setGroupId(dto.getGroupId()); + addGroupMemberDTO.setMemberList(dto.getMemberList().stream().map(userId -> { + AddGroupMemberDTO.MemberListDTO memberListDTO = new AddGroupMemberDTO.MemberListDTO(); + memberListDTO.setMemberAccount(userId); + return memberListDTO; + }).collect(Collectors.toList())); + //添加群成员 + Result addGroupMemberVoResult = iMHelloApi.addGroupMember(addGroupMemberDTO); + String actionStatus = addGroupMemberVoResult.getResult().getActionStatus(); + if (!"OK".equals(actionStatus)) { + ExceptionAssertsUtil.fail(addGroupMemberVoResult.getResult().getErrorInfo()); + } + 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 967faaf..3e975f4 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 @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.renkang.emergency.api.service.EmergencyOrderApiService; import com.renkang.emergency.bean.request.ListSession; import com.renkang.emergency.bean.request.OrderEvaluation; @@ -15,14 +16,10 @@ import com.renkang.emergency.bean.request.SingleParam; import com.renkang.emergency.bean.request.StationUpdateOrder; import com.renkang.emergency.bean.response.*; import com.renkang.emergency.constant.EmergencyConstants; -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.*; +import com.renkang.emergency.entity.vo.GroupMemberVO; import com.renkang.emergency.manager.EmergencyCacheManager; -import com.renkang.emergency.mapper.OrderDetailMapper; -import com.renkang.emergency.mapper.OrderMapper; -import com.renkang.emergency.mapper.OrderSendRecordMapper; +import com.renkang.emergency.mapper.*; import com.renkang.emergency.service.IOrderDetailService; import com.renkang.emergency.service.IOrderService; import com.renkang.im.api.IMHelloApi; @@ -30,6 +27,7 @@ import com.renkang.im.entity.ImGroupMsgTextReqDO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.exception.ExceptionAssertsUtil; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.global.GlobalUtils; import org.jeecg.modules.manager.ISysCache; @@ -39,6 +37,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; /** * @author Junqiang Zhu @@ -64,6 +63,10 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService { private IMHelloApi imHelloApi; @Autowired private ISysCache sysCache; + @Autowired + private OrderOperatorMapper orderOperatorMapper; + @Autowired + private EmergencyProfessionUserMapper emergencyProfessionUserMapper; @Override public IPage initUserOrderPage(Page page) { @@ -550,11 +553,11 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService { @Override public List getSicknessTypeStatistic(String sex, String depart) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (StrUtil.isNotBlank(sex) && !"0".equals(sex)){ - queryWrapper.eq(Order::getSalvageUserSex,sex); + if (StrUtil.isNotBlank(sex) && !"0".equals(sex)) { + queryWrapper.eq(Order::getSalvageUserSex, sex); } - if (StrUtil.isNotBlank(depart)){ - queryWrapper.like(Order::getSalvageUserDepart,depart); + if (StrUtil.isNotBlank(depart)) { + queryWrapper.like(Order::getSalvageUserDepart, depart); } queryWrapper.eq(Order::getDelFlag, CommonConstant.DEL_FLAG_0); List orders = orderMapper.selectList(queryWrapper); @@ -578,6 +581,83 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService { return voList; } + /** + * 获取群组成员和其他专业人员 + * + * @param orderId + * @return + */ + @Override + public List getGroupMemberList(String orderId) { + List groupMemberVos = new ArrayList<>(); + + // 校验订单是否存在 + Order order = orderMapper.selectById(orderId); + if (order == null) { + ExceptionAssertsUtil.fail("应急单不存在"); + } + + // 添加发起人信息 + handleGroupMember(groupMemberVos, orderId, + order.getInitiatorUserId(), + order.getInitiatorUserName(), + order.getInitiatorUserAvatar(), + 1); + + // 已加入应急单人员 + List orderOperators = orderOperatorMapper.selectList( + new LambdaQueryWrapper() + .eq(OrderOperator::getOrderId, orderId) + ); + + List userIds = orderOperators.stream() + .map(OrderOperator::getUserId) + .collect(Collectors.toList()); + + // 查询已加入人员的专业信息 + 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) + ); + } + + // 其他专业人员(排除已在应急单中的用户) + LambdaQueryWrapper otherMajorQuery = new LambdaQueryWrapper<>(); + otherMajorQuery.eq(EmergencyProfessionUser::getType, "6"); + if (!userIds.isEmpty()) { + otherMajorQuery.notIn(EmergencyProfessionUser::getUserId, userIds); + } + + List otherMajorMemberList = emergencyProfessionUserMapper.selectList(otherMajorQuery); + otherMajorMemberList.forEach(otherMajorMember -> + handleGroupMember(groupMemberVos, orderId, + otherMajorMember.getUserId(), + otherMajorMember.getRealname(), + otherMajorMember.getAvatar(), + 0) + ); + + return groupMemberVos; + } + + public void handleGroupMember(List groupMemberVos, String orderId, String userId, String userName, String avatar, Integer isGroupMember) { + GroupMemberVO groupMemberVO = new GroupMemberVO(); + groupMemberVO.setOrderId(orderId); + groupMemberVO.setUserId(userId); + groupMemberVO.setUserName(userName); + groupMemberVO.setAvatar(avatar); + groupMemberVO.setIsGroupMember(isGroupMember); + groupMemberVos.add(groupMemberVO); + } + private List convertOrder(List orders) { if (CollectionUtils.isEmpty(orders)) { return Collections.emptyList(); @@ -623,16 +703,25 @@ public class EmergencyOrderApiServiceImpl implements EmergencyOrderApiService { private List getSessionOrder(List sessions, String type) { String userId = GlobalUtils.getLoginUser().getId(); - LambdaQueryWrapper queryWrapper = GlobalUtils.getLambdaQueryWrapper(); - if (EmergencyConstants.MAJOR.equals(type)) { - queryWrapper.and(orWrapper -> orWrapper.eq(Order::getMajorUserId, userId).or().eq(Order::getMajorUserTwoId, userId)); - } - if (EmergencyConstants.OPERATION.equals(type)) { - queryWrapper.eq(Order::getOperationUserId, userId); - } - queryWrapper.ne(Order::getOrderStatus, EmergencyConstants.ORDER_STATUS_5_NEW); - queryWrapper.apply("FIND_IN_SET(session_id, {0})", String.join(",", sessions)); - return orderMapper.selectList(queryWrapper); + //应急单参与人员同步至子表,故修改查询方法 + MPJLambdaWrapper wrapper = new MPJLambdaWrapper<>(); + wrapper.leftJoin(OrderOperator.class, OrderOperator::getOrderId, Order::getId); + wrapper.eq(OrderOperator::getUserId, userId); + wrapper.eq(OrderOperator::getOperatorType, type); + wrapper.ne(Order::getOrderStatus, EmergencyConstants.ORDER_STATUS_5_NEW); + wrapper.eq(Order::getStatus, 1); + wrapper.in(Order::getSessionId, sessions); +// LambdaQueryWrapper queryWrapper = GlobalUtils.getLambdaQueryWrapper(); +// if (EmergencyConstants.MAJOR.equals(type)) { +// queryWrapper.and(orWrapper -> orWrapper.eq(Order::getMajorUserId, userId).or().eq(Order::getMajorUserTwoId, userId)); +// } +// if (EmergencyConstants.OPERATION.equals(type)) { +// queryWrapper.eq(Order::getOperationUserId, userId); +// } +// queryWrapper.ne(Order::getOrderStatus, EmergencyConstants.ORDER_STATUS_5_NEW); +// queryWrapper.apply("FIND_IN_SET(session_id, {0})", String.join(",", sessions)); +// queryWrapper.in(Order::getSessionId, sessions); + return orderMapper.selectList(wrapper); } private void handleUserDepart(Order order) { diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/controller/OrderController.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/controller/OrderController.java index 5b3a35b..30e379d 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/controller/OrderController.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/controller/OrderController.java @@ -2,17 +2,18 @@ package com.renkang.emergency.controller; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.renkang.emergency.entity.Order; -import com.renkang.emergency.entity.OrderDetail; -import com.renkang.emergency.entity.Resource; +import com.renkang.emergency.entity.*; import com.renkang.emergency.manager.EmergencyCacheManager; import com.renkang.emergency.manager.EmergencyCloudManager; +import com.renkang.emergency.mapper.EmergencyProfessionUserMapper; +import com.renkang.emergency.mapper.OrderOperatorMapper; import com.renkang.emergency.service.IOrderDetailService; import com.renkang.emergency.service.IOrderService; -import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.jeecg.common.api.vo.Result; @@ -28,7 +29,9 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @Description: emergency_order @@ -49,6 +52,11 @@ public class OrderController extends JeecgController { private IOrderDetailService orderDetailService; @Autowired private EmergencyCloudManager emergencyCloudManager; + @Autowired + private OrderOperatorMapper orderOperatorMapper; + + @Autowired + private EmergencyProfessionUserMapper emergencyProfessionUserMapper; /** * 分页列表查询 @@ -76,8 +84,8 @@ public class OrderController extends JeecgController { */ @GetMapping(value = "/listOrderMajor") public Result> listOrderMajor(Order order, - @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { Page page = new Page<>(pageNo, pageSize); IPage pageList = orderService.listOrderMajor(page, order); return Result.OK(pageList); @@ -186,6 +194,13 @@ public class OrderController extends JeecgController { Order order = orderService.getById(id); if (ObjectUtil.isNotNull(order)) { + List orderOperators = orderOperatorMapper.selectList(new LambdaQueryWrapper() + .eq(OrderOperator::getOrderId, order.getId()) + ); + List userIds = orderOperators.stream().map(OrderOperator::getUserId).collect(Collectors.toList()); + List emergencyProfessionUsers = emergencyProfessionUserMapper.selectList(new LambdaQueryWrapper() + .in(EmergencyProfessionUser::getUserId, userIds) + ); OrderDetail detail = orderDetailService.getById(order.getId()); order.setOrderDetail(detail); @@ -203,6 +218,22 @@ public class OrderController extends JeecgController { order.setResourceName(resource.getName()); } } + + //操作人员信息 + List operatorsUserIds = orderOperators.stream().filter(orderOperator -> + orderOperator.getOrderId().equals(order.getId()) + && orderOperator.getOperatorType().equals(0) + ).map(OrderOperator::getUserId).collect(Collectors.toList()); + String operatorsName = emergencyProfessionUsers.stream().filter(u -> operatorsUserIds.contains(u.getUserId())).map(EmergencyProfessionUser::getRealname).collect(Collectors.joining(",")); + order.setOperationUserName(operatorsName); + + //专业人员信息 + List majorUserIds = orderOperators.stream().filter(orderOperator -> + orderOperator.getOrderId().equals(order.getId()) + && orderOperator.getOperatorType().equals(1) + ).map(OrderOperator::getUserId).collect(Collectors.toList()); + String majorName = emergencyProfessionUsers.stream().filter(u -> majorUserIds.contains(u.getUserId())).map(EmergencyProfessionUser::getRealname).collect(Collectors.joining(",")); + order.setMajorUserName(majorName); } return Result.OK(order); diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/mapper/OrderOperatorMapper.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/mapper/OrderOperatorMapper.java new file mode 100644 index 0000000..8220736 --- /dev/null +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/mapper/OrderOperatorMapper.java @@ -0,0 +1,14 @@ +package com.renkang.emergency.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.renkang.emergency.entity.OrderOperator; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author PengJ + * @description: 应急单参与人员 + * @date 2025/10/31 10:53 + */ +@Mapper +public interface OrderOperatorMapper extends BaseMapper { +} diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/mapper/xml/EmergencySchedulesNewItemMapper.xml b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/mapper/xml/EmergencySchedulesNewItemMapper.xml index 1827551..9d901f2 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/mapper/xml/EmergencySchedulesNewItemMapper.xml +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/mapper/xml/EmergencySchedulesNewItemMapper.xml @@ -11,6 +11,9 @@ left join emergency_profession_user t3 on t1.user_id = t3.user_id WHERE t2.center_id = #{centerId} AND date_format(t2.schedules_time, '%Y-%m-%d') = #{time} + ORDER BY + t3.type, + t1.sort