|
|
@@ -5,8 +5,10 @@ import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
|
import com.complaint.workorder.domain.ComplaintStaff;
|
|
|
+import com.complaint.workorder.domain.UnitSchool;
|
|
|
import com.complaint.workorder.domain.StaffImportDTO;
|
|
|
import com.complaint.workorder.mapper.ComplaintStaffMapper;
|
|
|
+import com.complaint.workorder.mapper.UnitSchoolMapper;
|
|
|
import com.complaint.workorder.service.IComplaintStaffService;
|
|
|
import com.complaint.workorder.sync.ODataClient;
|
|
|
import com.ruoyi.common.annotation.Excel;
|
|
|
@@ -33,6 +35,9 @@ public class ComplaintStaffServiceImpl implements IComplaintStaffService
|
|
|
{
|
|
|
private static final Logger log = LoggerFactory.getLogger(ComplaintStaffServiceImpl.class);
|
|
|
|
|
|
+ /** 临时存储:最近一次导入中学校为空的人员列表(用于导出) */
|
|
|
+ private static final List<StaffImportDTO> lastEmptySchoolList = new ArrayList<>();
|
|
|
+
|
|
|
private static final String INTERFACE_NAME = "RYJCSJXXZL_4";
|
|
|
private static final String FILTER = "ID_TYPE_NAME eq '教职工'";
|
|
|
private static final String SCHOOL_ADMIN_ROLE_NAME = "学校管理员";
|
|
|
@@ -41,6 +46,9 @@ public class ComplaintStaffServiceImpl implements IComplaintStaffService
|
|
|
@Autowired
|
|
|
private ComplaintStaffMapper staffMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private UnitSchoolMapper unitSchoolMapper;
|
|
|
+
|
|
|
@Autowired
|
|
|
private ODataClient oDataClient;
|
|
|
|
|
|
@@ -159,6 +167,9 @@ public class ComplaintStaffServiceImpl implements IComplaintStaffService
|
|
|
@Override
|
|
|
public String importStaff(MultipartFile file) throws Exception
|
|
|
{
|
|
|
+ // 清空上次的学校为空人员列表
|
|
|
+ lastEmptySchoolList.clear();
|
|
|
+
|
|
|
ExcelUtil<StaffImportDTO> util = new ExcelUtil<StaffImportDTO>(StaffImportDTO.class);
|
|
|
List<StaffImportDTO> importList = util.importExcel(file.getInputStream());
|
|
|
|
|
|
@@ -178,13 +189,21 @@ public class ComplaintStaffServiceImpl implements IComplaintStaffService
|
|
|
int fail = 0;
|
|
|
int notFound = 0;
|
|
|
int alreadyExists = 0;
|
|
|
+ int fuzzyMatched = 0;
|
|
|
List<String> failMsgs = new ArrayList<>();
|
|
|
+ List<String> emptySchoolMsgs = new ArrayList<>(); // 学校为空的人员
|
|
|
|
|
|
for (int i = 0; i < importList.size(); i++)
|
|
|
{
|
|
|
StaffImportDTO dto = importList.get(i);
|
|
|
int rowNum = i + 1;
|
|
|
|
|
|
+ // 跳过空行
|
|
|
+ if (dto == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
if (StringUtils.isBlank(dto.getUserName()) || StringUtils.isBlank(dto.getMobile()))
|
|
|
{
|
|
|
fail++;
|
|
|
@@ -194,6 +213,17 @@ public class ComplaintStaffServiceImpl implements IComplaintStaffService
|
|
|
|
|
|
try
|
|
|
{
|
|
|
+ // 学校为空,记录下来
|
|
|
+ if (StringUtils.isBlank(dto.getUnitName()))
|
|
|
+ {
|
|
|
+ emptySchoolMsgs.add("第" + rowNum + "行:" + dto.getUserName().trim() + "(" + dto.getMobile().trim() + ")");
|
|
|
+ StaffImportDTO emptyDto = new StaffImportDTO();
|
|
|
+ emptyDto.setUserName(dto.getUserName().trim());
|
|
|
+ emptyDto.setMobile(dto.getMobile().trim());
|
|
|
+ emptyDto.setUnitName("");
|
|
|
+ lastEmptySchoolList.add(emptyDto);
|
|
|
+ }
|
|
|
+
|
|
|
// 根据姓名+学校+手机号匹配教职工表
|
|
|
ComplaintStaff match = new ComplaintStaff();
|
|
|
match.setUserName(dto.getUserName().trim());
|
|
|
@@ -201,34 +231,74 @@ public class ComplaintStaffServiceImpl implements IComplaintStaffService
|
|
|
match.setUnitName(StringUtils.isBlank(dto.getUnitName()) ? "" : dto.getUnitName().trim());
|
|
|
ComplaintStaff staff = staffMapper.matchStaff(match);
|
|
|
|
|
|
+ // 精确匹配不到,且学校名不为空,尝试模糊匹配(学校简称匹配)
|
|
|
+ if (staff == null && StringUtils.isNotBlank(dto.getUnitName()))
|
|
|
+ {
|
|
|
+ staff = staffMapper.matchStaffFuzzy(match);
|
|
|
+ if (staff != null)
|
|
|
+ {
|
|
|
+ fuzzyMatched++;
|
|
|
+ log.info("第{}行:模糊匹配成功(输入学校={},匹配到={})", rowNum, dto.getUnitName(), staff.getUnitName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (staff == null)
|
|
|
{
|
|
|
notFound++;
|
|
|
- failMsgs.add("第" + rowNum + "行:未匹配到教职工(姓名=" + dto.getUserName() + ",手机=" + dto.getMobile() + ")");
|
|
|
- continue;
|
|
|
+ log.info("第{}行:未匹配到教职工,将直接创建用户(姓名={},手机={})", rowNum, dto.getUserName(), dto.getMobile());
|
|
|
}
|
|
|
|
|
|
// 检查系统用户是否已存在
|
|
|
SysUser existUser = sysUserMapper.checkPhoneUnique(dto.getMobile().trim());
|
|
|
if (existUser != null)
|
|
|
{
|
|
|
- // 已存在,更新学工号和学校UID
|
|
|
- existUser.setStaffNo(staff.getIdNumber());
|
|
|
- existUser.setUnitUid(staff.getUnitUid());
|
|
|
- sysUserMapper.updateUser(existUser);
|
|
|
alreadyExists++;
|
|
|
- success++;
|
|
|
+ // 已存在用户:比较学校名称,不一致则更新(模糊匹配)
|
|
|
+ boolean updated = updateUserIfSchoolChanged(existUser, dto, rowNum);
|
|
|
+ if (updated)
|
|
|
+ {
|
|
|
+ success++;
|
|
|
+ }
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
// 创建系统用户
|
|
|
SysUser user = new SysUser();
|
|
|
user.setUserName(dto.getMobile().trim()); // 用户名用手机号
|
|
|
- user.setNickName(staff.getUserName());
|
|
|
+ user.setNickName(staff != null ? staff.getUserName() : dto.getUserName().trim());
|
|
|
user.setPhonenumber(dto.getMobile().trim());
|
|
|
user.setPassword(SecurityUtils.encryptPassword(DEFAULT_PASSWORD));
|
|
|
- user.setUnitUid(staff.getUnitUid());
|
|
|
- user.setStaffNo(staff.getIdNumber());
|
|
|
+ if (staff != null)
|
|
|
+ {
|
|
|
+ user.setUnitUid(staff.getUnitUid());
|
|
|
+ user.setStaffNo(staff.getIdNumber());
|
|
|
+ }
|
|
|
+ else if (StringUtils.isNotBlank(dto.getUnitName()))
|
|
|
+ {
|
|
|
+ // 教职工匹配不到,从学校表模糊查询学校UID
|
|
|
+ UnitSchool school = unitSchoolMapper.selectUnitByNameFuzzy(dto.getUnitName().trim());
|
|
|
+ if (school != null)
|
|
|
+ {
|
|
|
+ user.setUnitUid(school.getUnitUid());
|
|
|
+ log.info("第{}行:从学校表匹配到学校(输入学校={},匹配到={},UID={})",
|
|
|
+ rowNum, dto.getUnitName(), school.getUnitName(), school.getUnitUid());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ log.warn("第{}行:学校表也未匹配到学校(输入学校={})", rowNum, dto.getUnitName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 设置性别:优先使用Excel中的性别,其次用教职工的性别,最后设为未知(2)
|
|
|
+ String userSex = convertSex(dto.getSex());
|
|
|
+ if (StringUtils.isBlank(userSex) && staff != null && StringUtils.isNotBlank(staff.getUserSex()))
|
|
|
+ {
|
|
|
+ userSex = staff.getUserSex();
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(userSex))
|
|
|
+ {
|
|
|
+ userSex = "2"; // 未知
|
|
|
+ }
|
|
|
+ user.setSex(userSex);
|
|
|
user.setStatus("0"); // 正常
|
|
|
user.setRoleIds(new Long[]{schoolAdminRoleId});
|
|
|
user.setCreateBy("import");
|
|
|
@@ -254,9 +324,26 @@ public class ComplaintStaffServiceImpl implements IComplaintStaffService
|
|
|
|
|
|
StringBuilder result = new StringBuilder();
|
|
|
result.append("导入完成:成功").append(success).append("条");
|
|
|
- result.append("(其中已存在更新").append(alreadyExists).append("条)");
|
|
|
- result.append(",未匹配").append(notFound).append("条");
|
|
|
+ result.append("(其中已存在跳过").append(alreadyExists).append("条");
|
|
|
+ result.append(",模糊匹配学校").append(fuzzyMatched).append("条)");
|
|
|
+ result.append(",未匹配教职工但已创建").append(notFound).append("条");
|
|
|
result.append(",失败").append(fail).append("条");
|
|
|
+ if (!emptySchoolMsgs.isEmpty())
|
|
|
+ {
|
|
|
+ result.append("。学校为空的人员(").append(emptySchoolMsgs.size()).append("人):");
|
|
|
+ if (emptySchoolMsgs.size() <= 10)
|
|
|
+ {
|
|
|
+ result.append(String.join(";", emptySchoolMsgs));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ result.append("数量过多,请查看日志");
|
|
|
+ for (String msg : emptySchoolMsgs)
|
|
|
+ {
|
|
|
+ log.warn("学校为空:{}", msg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
if (!failMsgs.isEmpty() && failMsgs.size() <= 10)
|
|
|
{
|
|
|
result.append("。失败详情:").append(String.join(";", failMsgs));
|
|
|
@@ -310,4 +397,104 @@ public class ComplaintStaffServiceImpl implements IComplaintStaffService
|
|
|
staff.setDataUpdateFlog(row.getString("DATA_UPDATE_FLOG"));
|
|
|
return staff;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 导出最近一次导入中学校为空的人员列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<StaffImportDTO> getEmptySchoolList()
|
|
|
+ {
|
|
|
+ return new ArrayList<>(lastEmptySchoolList);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换性别:中文转数字
|
|
|
+ * 男 -> 0, 女 -> 1, 未知 -> 2, 其他 -> null
|
|
|
+ */
|
|
|
+ private String convertSex(String sex)
|
|
|
+ {
|
|
|
+ if (StringUtils.isBlank(sex))
|
|
|
+ {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ String trimmed = sex.trim();
|
|
|
+ if ("男".equals(trimmed) || "0".equals(trimmed))
|
|
|
+ {
|
|
|
+ return "0";
|
|
|
+ }
|
|
|
+ if ("女".equals(trimmed) || "1".equals(trimmed))
|
|
|
+ {
|
|
|
+ return "1";
|
|
|
+ }
|
|
|
+ if ("未知".equals(trimmed) || "2".equals(trimmed))
|
|
|
+ {
|
|
|
+ return "2";
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 已存在用户:比较学校名称,不一致则更新(模糊匹配)
|
|
|
+ * @return true=更新了,false=未更新
|
|
|
+ */
|
|
|
+ private boolean updateUserIfSchoolChanged(SysUser existUser, StaffImportDTO dto, int rowNum)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ // 导入的学校名为空,不更新
|
|
|
+ if (StringUtils.isBlank(dto.getUnitName()))
|
|
|
+ {
|
|
|
+ log.info("第{}行:用户已存在,导入学校为空,不更新(手机号={})", rowNum, dto.getMobile());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 用导入的学校名模糊匹配教职工表,获取最新的教职工信息
|
|
|
+ ComplaintStaff match = new ComplaintStaff();
|
|
|
+ match.setUserName(dto.getUserName().trim());
|
|
|
+ match.setMobile(dto.getMobile().trim());
|
|
|
+ match.setUnitName(dto.getUnitName().trim());
|
|
|
+ ComplaintStaff staff = staffMapper.matchStaffFuzzy(match);
|
|
|
+
|
|
|
+ // 模糊匹配不到教职工,不更新
|
|
|
+ if (staff == null)
|
|
|
+ {
|
|
|
+ log.info("第{}行:用户已存在,模糊匹配不到教职工,不更新(手机号={},学校={})", rowNum, dto.getMobile(), dto.getUnitName());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 比较学校UID是否一致
|
|
|
+ String currentUnitUid = existUser.getUnitUid();
|
|
|
+ String newUnitUid = staff.getUnitUid();
|
|
|
+ String currentStaffNo = existUser.getStaffNo();
|
|
|
+ String newStaffNo = staff.getIdNumber();
|
|
|
+
|
|
|
+ boolean unitChanged = !StringUtils.equals(currentUnitUid, newUnitUid);
|
|
|
+ boolean staffNoChanged = !StringUtils.equals(currentStaffNo, newStaffNo);
|
|
|
+
|
|
|
+ if (!unitChanged && !staffNoChanged)
|
|
|
+ {
|
|
|
+ log.info("第{}行:用户已存在,学校信息一致,不更新(手机号={})", rowNum, dto.getMobile());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 学校信息不一致,更新
|
|
|
+ if (unitChanged)
|
|
|
+ {
|
|
|
+ existUser.setUnitUid(newUnitUid);
|
|
|
+ }
|
|
|
+ if (staffNoChanged)
|
|
|
+ {
|
|
|
+ existUser.setStaffNo(newStaffNo);
|
|
|
+ }
|
|
|
+ sysUserMapper.updateUser(existUser);
|
|
|
+ log.info("第{}行:用户已存在,学校信息已更新(手机号={},原学校UID={},新学校UID={},原学工号={},新学工号={})",
|
|
|
+ rowNum, dto.getMobile(), currentUnitUid, newUnitUid, currentStaffNo, newStaffNo);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ log.error("第{}行:更新已存在用户学校信息失败(手机号={})", rowNum, dto.getMobile(), e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|