fix(emergency): addCareUsersToGroup改为员工编号匹配,解决手机号不准的TODO
数据流: 安眼手机号 → AYGC_YWK.EMP_BASIC_INFO查EMPLOYEE_NUM → getUserListByWorkNoList → 本系统用户ID 变更: - LargeScreenDataMapper: 新增selectEmployeeNumsByPhones,INSTR模糊匹配支持多手机号字段 - EmergencyApiServiceImpl: 替换getUserByPhoneList直接匹配,改为两步反查;order_operator匹配同步调整 - 移除旧TODO注释 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+42
-12
@@ -13,6 +13,7 @@ import com.renkang.anyan.client.AnYanClient;
|
||||
import com.renkang.anyan.model.dto.EmergencyContactParam;
|
||||
import com.renkang.anyan.model.vo.EmergencyContactVO;
|
||||
import com.renkang.emergency.api.service.EmergencyApiService;
|
||||
import com.renkang.emergency.largeScreen.mapper.LargeScreenDataMapper;
|
||||
import com.renkang.emergency.bean.request.CallBack;
|
||||
import com.renkang.emergency.bean.request.EmergencyCall;
|
||||
import com.renkang.emergency.bean.request.EmergencySocket;
|
||||
@@ -126,6 +127,8 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
|
||||
private EmergencyProfessionUserMapper emergencyProfessionUserMapper;
|
||||
@Autowired
|
||||
private AnYanClient anYanClient;
|
||||
@Autowired
|
||||
private LargeScreenDataMapper largeScreenDataMapper;
|
||||
|
||||
|
||||
@Override
|
||||
@@ -989,7 +992,7 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
|
||||
|
||||
/**
|
||||
* 拉入关爱联络员和急救人员到群聊
|
||||
* <p>通过手机号匹配安眼系统联系人 → 本系统用户ID</p>
|
||||
* <p>通过安眼返回的手机号 → EMP_BASIC_INFO查询员工编号 → 本系统用户ID</p>
|
||||
*
|
||||
* @param userId 发起人ID
|
||||
* @param groupId IM群组ID
|
||||
@@ -1035,17 +1038,38 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
|
||||
return;
|
||||
}
|
||||
|
||||
// 4. 手机号反查本系统用户ID
|
||||
// 4. 手机号 → EMP_BASIC_INFO 反查员工编号
|
||||
List<String> phones = new ArrayList<>(phoneRoleMap.keySet());
|
||||
Result<List<SysUser>> userResult = sysBaseAPI.getUserByPhoneList(phones);
|
||||
if (!userResult.isSuccess() || CollUtil.isEmpty(userResult.getResult())) {
|
||||
log.warn("关爱/急救人员手机号均未匹配到本系统用户, phones={}", phones);
|
||||
List<Map<String, String>> empBasicList = largeScreenDataMapper.selectEmployeeNumsByPhones(phones);
|
||||
if (CollUtil.isEmpty(empBasicList)) {
|
||||
log.warn("关爱/急救人员手机号均未匹配到EMP_BASIC_INFO, phones={}", phones);
|
||||
return;
|
||||
}
|
||||
List<SysUser> sysUsers = userResult.getResult();
|
||||
log.info("关爱/急救人员手机号匹配到{}个系统用户, phones={}", sysUsers.size(), phones);
|
||||
// 构建 phone → employeeNum 映射(拆分多手机号字段,\D+匹配任意非数字分隔符)
|
||||
Map<String, String> phoneWorkNoMap = new LinkedHashMap<>();
|
||||
for (Map<String, String> row : empBasicList) {
|
||||
String phoneField = row.get("phone");
|
||||
String employeeNum = row.get("employeeNum");
|
||||
if (StrUtil.isNotBlank(phoneField) && StrUtil.isNotBlank(employeeNum)) {
|
||||
for (String singlePhone : phoneField.split("\\D+")) {
|
||||
if (StrUtil.isNotBlank(singlePhone)) {
|
||||
phoneWorkNoMap.put(singlePhone, employeeNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
log.info("手机号匹配到{}个EMP_BASIC_INFO员工编号, phones={}", phoneWorkNoMap.size(), phones);
|
||||
|
||||
// 5. 拉入IM群聊
|
||||
// 5. 员工编号 → 本系统用户ID
|
||||
List<String> workNoList = new ArrayList<>(phoneWorkNoMap.values());
|
||||
List<SysUser> sysUsers = sysBaseAPI.getUserListByWorkNoList(workNoList);
|
||||
if (CollUtil.isEmpty(sysUsers)) {
|
||||
log.warn("关爱/急救人员员工编号均未匹配到本系统用户, workNos={}", workNoList);
|
||||
return;
|
||||
}
|
||||
log.info("关爱/急救人员员工编号匹配到{}个系统用户, workNos={}", sysUsers.size(), workNoList);
|
||||
|
||||
// 6. 拉入IM群聊
|
||||
List<String> memberAccounts = sysUsers.stream().map(SysUser::getId).collect(Collectors.toList());
|
||||
AddGroupMemberDTO addDto = new AddGroupMemberDTO();
|
||||
addDto.setGroupId(groupId);
|
||||
@@ -1064,13 +1088,19 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
|
||||
// IM拉人失败不影响建群流程,继续写入 order_operator
|
||||
}
|
||||
|
||||
// 6. 写入 order_operator 表
|
||||
// 7. 写入 order_operator 表
|
||||
Date now = new Date();
|
||||
Map<String, Integer> userIdRoleMap = new HashMap<>();
|
||||
for (SysUser sysUser : sysUsers) {
|
||||
for (Map.Entry<String, Integer> entry : phoneRoleMap.entrySet()) {
|
||||
if (entry.getKey().equals(sysUser.getPhone())) {
|
||||
userIdRoleMap.put(sysUser.getId(), entry.getValue());
|
||||
String sysUserWorkNo = sysUser.getWorkNo();
|
||||
if (StrUtil.isBlank(sysUserWorkNo)) {
|
||||
continue;
|
||||
}
|
||||
// 遍历 phoneRoleMap 反查:phone → phoneWorkNoMap.get(phone) → 匹配 workNo
|
||||
for (Map.Entry<String, Integer> roleEntry : phoneRoleMap.entrySet()) {
|
||||
String mappedWorkNo = phoneWorkNoMap.get(roleEntry.getKey());
|
||||
if (sysUserWorkNo.equals(mappedWorkNo)) {
|
||||
userIdRoleMap.put(sysUser.getId(), roleEntry.getValue());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+12
@@ -6,6 +6,9 @@ import com.renkang.emergency.largeScreen.entity.vo.OnePersonCaseVO;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Description: large_screen
|
||||
* @Author: wang hao
|
||||
@@ -32,4 +35,13 @@ public interface LargeScreenDataMapper extends MPJBaseMapper<LargeScreenData> {
|
||||
*/
|
||||
OnePersonCaseVO selectOnePersonCase(@Param("idCard") String idCard);
|
||||
|
||||
/**
|
||||
* 根据手机号批量查询 EMP_BASIC_INFO 的员工编号
|
||||
* SQL 见同包 xml/LargeScreenDataMapper.xml
|
||||
*
|
||||
* @param phones 手机号集合
|
||||
* @return 手机号→员工编号映射列表 (key: PHONE, EMPLOYEE_NUM)
|
||||
*/
|
||||
List<Map<String, String>> selectEmployeeNumsByPhones(@Param("phones") List<String> phones);
|
||||
|
||||
}
|
||||
|
||||
+16
@@ -188,4 +188,20 @@
|
||||
FETCH FIRST 1 ROWS ONLY
|
||||
</select>
|
||||
|
||||
<!-- 根据手机号批量查询EMP_BASIC_INFO的员工编号,INSTR模糊匹配支持任意分隔符的多手机号场景 -->
|
||||
<select id="selectEmployeeNumsByPhones" resultType="java.util.HashMap">
|
||||
SELECT
|
||||
b.PHONE AS "phone",
|
||||
b.EMPLOYEE_NUM AS "employeeNum"
|
||||
FROM
|
||||
AYGC_YWK.EMP_BASIC_INFO b
|
||||
WHERE
|
||||
b.DEL_FLAG = '0'
|
||||
AND (
|
||||
<foreach collection="phones" item="phone" separator=" OR " open="(" close=")">
|
||||
INSTR(b.PHONE, #{phone}) > 0
|
||||
</foreach>
|
||||
)
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user