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:
2026-07-16 09:43:34 +08:00
co-authored by Claude
parent d4f1d1a7bd
commit 145cf89a89
3 changed files with 70 additions and 12 deletions
@@ -13,6 +13,7 @@ import com.renkang.anyan.client.AnYanClient;
import com.renkang.anyan.model.dto.EmergencyContactParam; import com.renkang.anyan.model.dto.EmergencyContactParam;
import com.renkang.anyan.model.vo.EmergencyContactVO; import com.renkang.anyan.model.vo.EmergencyContactVO;
import com.renkang.emergency.api.service.EmergencyApiService; 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.CallBack;
import com.renkang.emergency.bean.request.EmergencyCall; import com.renkang.emergency.bean.request.EmergencyCall;
import com.renkang.emergency.bean.request.EmergencySocket; import com.renkang.emergency.bean.request.EmergencySocket;
@@ -126,6 +127,8 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
private EmergencyProfessionUserMapper emergencyProfessionUserMapper; private EmergencyProfessionUserMapper emergencyProfessionUserMapper;
@Autowired @Autowired
private AnYanClient anYanClient; private AnYanClient anYanClient;
@Autowired
private LargeScreenDataMapper largeScreenDataMapper;
@Override @Override
@@ -989,7 +992,7 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
/** /**
* 拉入关爱联络员和急救人员到群聊 * 拉入关爱联络员和急救人员到群聊
* <p>通过手机号匹配安眼系统联系人 → 本系统用户ID</p> * <p>通过安眼返回的手机号 → EMP_BASIC_INFO查询员工编号 → 本系统用户ID</p>
* *
* @param userId 发起人ID * @param userId 发起人ID
* @param groupId IM群组ID * @param groupId IM群组ID
@@ -1035,17 +1038,38 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
return; return;
} }
// 4. 手机号反查本系统用户ID // 4. 手机号 → EMP_BASIC_INFO 反查员工编号
List<String> phones = new ArrayList<>(phoneRoleMap.keySet()); List<String> phones = new ArrayList<>(phoneRoleMap.keySet());
Result<List<SysUser>> userResult = sysBaseAPI.getUserByPhoneList(phones); List<Map<String, String>> empBasicList = largeScreenDataMapper.selectEmployeeNumsByPhones(phones);
if (!userResult.isSuccess() || CollUtil.isEmpty(userResult.getResult())) { if (CollUtil.isEmpty(empBasicList)) {
log.warn("关爱/急救人员手机号均未匹配到本系统用户, phones={}", phones); log.warn("关爱/急救人员手机号均未匹配到EMP_BASIC_INFO, phones={}", phones);
return; return;
} }
List<SysUser> sysUsers = userResult.getResult(); // 构建 phone → employeeNum 映射(拆分多手机号字段,\D+匹配任意非数字分隔符)
log.info("关爱/急救人员手机号匹配到{}个系统用户, phones={}", sysUsers.size(), phones); 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()); List<String> memberAccounts = sysUsers.stream().map(SysUser::getId).collect(Collectors.toList());
AddGroupMemberDTO addDto = new AddGroupMemberDTO(); AddGroupMemberDTO addDto = new AddGroupMemberDTO();
addDto.setGroupId(groupId); addDto.setGroupId(groupId);
@@ -1064,13 +1088,19 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
// IM拉人失败不影响建群流程,继续写入 order_operator // IM拉人失败不影响建群流程,继续写入 order_operator
} }
// 6. 写入 order_operator 表 // 7. 写入 order_operator 表
Date now = new Date(); Date now = new Date();
Map<String, Integer> userIdRoleMap = new HashMap<>(); Map<String, Integer> userIdRoleMap = new HashMap<>();
for (SysUser sysUser : sysUsers) { for (SysUser sysUser : sysUsers) {
for (Map.Entry<String, Integer> entry : phoneRoleMap.entrySet()) { String sysUserWorkNo = sysUser.getWorkNo();
if (entry.getKey().equals(sysUser.getPhone())) { if (StrUtil.isBlank(sysUserWorkNo)) {
userIdRoleMap.put(sysUser.getId(), entry.getValue()); 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; break;
} }
} }
@@ -6,6 +6,9 @@ import com.renkang.emergency.largeScreen.entity.vo.OnePersonCaseVO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
/** /**
* @Description: large_screen * @Description: large_screen
* @Author: wang hao * @Author: wang hao
@@ -32,4 +35,13 @@ public interface LargeScreenDataMapper extends MPJBaseMapper<LargeScreenData> {
*/ */
OnePersonCaseVO selectOnePersonCase(@Param("idCard") String idCard); 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);
} }
@@ -188,4 +188,20 @@
FETCH FIRST 1 ROWS ONLY FETCH FIRST 1 ROWS ONLY
</select> </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}) &gt; 0
</foreach>
)
</select>
</mapper> </mapper>