package com.kingdee.eas.custom.synctask.handler; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import com.kingdee.bos.BOSException; import com.kingdee.bos.Context; import com.kingdee.bos.metadata.entity.*; import com.kingdee.bos.metadata.query.util.CompareType; import com.kingdee.eas.basedata.org.*; import com.kingdee.eas.basedata.person.IPerson; import com.kingdee.eas.basedata.person.PersonCollection; import com.kingdee.eas.basedata.person.PersonFactory; import com.kingdee.eas.basedata.person.PersonInfo; import com.kingdee.eas.common.EASBizException; import com.kingdee.eas.cp.taskmng.util.StringUtil; import com.kingdee.eas.custom.log.ISyncLog; import com.kingdee.eas.custom.log.SyncLogFactory; import com.kingdee.eas.custom.log.SyncLogInfo; import com.kingdee.eas.custom.log.app.DataDirectionEnum; import com.kingdee.eas.custom.log.app.DockingSystemEnum; import com.kingdee.eas.custom.log.app.SyncEntityNameEnum; import com.kingdee.eas.custom.log.app.SyncStatusEnum; import com.kingdee.eas.custom.synctask.SyncTranForIOTFacade; import com.kingdee.eas.custom.synctask.SyncTranForIOTFacadeFactory; import com.kingdee.eas.custom.synctask.SyncTranForOAFacadeFactory; import com.kingdee.eas.custom.synctask.util.ExpiringMapCache; import com.kingdee.eas.hr.ats.AtsUtil; import com.kingdee.eas.hr.base.EmployeeTypeInfo; import com.kingdee.eas.hr.emp.IPersonPosition; import com.kingdee.eas.hr.emp.PersonPositionCollection; import com.kingdee.eas.hr.emp.PersonPositionFactory; import com.kingdee.eas.hr.emp.PersonPositionInfo; import com.kingdee.eas.hr.emp.web.handler.EmployeeListHandler; import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsBody; import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsHeader; import com.kingdee.shr.base.syssetting.context.SHRContext; import com.kingdee.shr.base.syssetting.exception.SHRWebException; import com.kingdee.shr.base.syssetting.exception.ShrWebBizException; import com.kingdee.shr.base.syssetting.web.json.JSONUtils; import com.kingdee.util.StringUtils; import okhttp3.*; import org.apache.log4j.Logger; import org.springframework.ui.ModelMap; import org.springframework.util.DigestUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.util.*; /** * @author qingwu * @date 2024/10/24 * @apiNote 员工信息维护扩展 */ public class EmployeeListHandlerEx extends EmployeeListHandler { public static Logger logger = Logger.getLogger(EmployeeListHandlerEx.class); private Context ctx = SHRContext.getInstance().getContext(); private static Map personStatusMap = new HashMap(); private Properties propt = new Properties(); private static ExpiringMapCache cache = new ExpiringMapCache(); public EmployeeListHandlerEx() throws BOSException { String syncOAConfigPath = System.getProperty("EAS_HOME") + "/server/properties/scy/syncIOTConfig.properties"; try { propt.load(new FileInputStream(syncOAConfigPath)); } catch (IOException e) { e.printStackTrace(); String errorMsg = "获取配置文件报错,请检查配置:" + syncOAConfigPath + " " + e.getMessage(); throw new BOSException(errorMsg); } } static { personStatusMap.put("001", "1");//试用员工 personStatusMap.put("011", "1");//待岗 personStatusMap.put("006", "1");//长期病假 personStatusMap.put("007", "1");//停薪留职 personStatusMap.put("005", "1");//出国 personStatusMap.put("012", "1");//返聘员工 personStatusMap.put("031", "1");//长学 personStatusMap.put("S01", "1");//实习生 personStatusMap.put("S02", "1");//劳务派遣 personStatusMap.put("S05", "1");//待分配 personStatusMap.put("S03", "1");//顾问 personStatusMap.put("S20", "1");//临时工 personStatusMap.put("002", "3");//辞退 personStatusMap.put("010", "3");//辞职 personStatusMap.put("009", "3");//退休 personStatusMap.put("003", "3");//下岗 personStatusMap.put("004", "3");//离休 personStatusMap.put("013", "3");//开除 personStatusMap.put("020", "3");//解聘 personStatusMap.put("021", "3");//失踪 personStatusMap.put("030", "3");//死亡 personStatusMap.put("S04", "3");//返聘终止 personStatusMap.put("S08", "3");//离职 personStatusMap.put("S09", "3");//派遣终止 personStatusMap.put("035", "3");//临时工终止 personStatusMap.put("S07", "3");//实习终止 } /** * 获取人员批处理信息 * * @param request * @param response * @param modelMap * @return */ public void getPersonBatchInfoAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, ShrWebBizException { try { IPerson iPerson = PersonFactory.getLocalInstance(ctx); PersonCollection personCollection = null; String ids = request.getParameter("ids"); if (StringUtil.isEmpty(ids)) { personCollection = iPerson.getPersonCollection(); } else { Set adminOrgIds = AtsUtil.toSet(ids); FilterInfo filterInfo = new FilterInfo(); FilterItemCollection filterItems = filterInfo.getFilterItems(); filterItems.add(new FilterItemInfo("id", adminOrgIds, CompareType.INCLUDE)); EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, null, null); personCollection = iPerson.getPersonCollection(entityViewInfo); } List list = new ArrayList(); for (int i = 0; i < personCollection.size(); i++) { PersonInfo personInfo = personCollection.get(i); Map personMap = new HashMap(); personMap.put("person.name", personInfo.getName()); personMap.put("person.number", personInfo.getNumber()); personMap.put("person.id", personInfo.getId().toString()); personMap.put("id", personInfo.getId().toString()); list.add(personMap); } JSONUtils.SUCCESS(list); } catch (Exception e) { e.printStackTrace(); throw new ShrWebBizException(e); } } /** * 同步IOT人员 * 后续如需部署生产去掉Ex * @param request * @param response * @param modelMap * @throws BOSException * @throws EASBizException * @throws SHRWebException */ public void syncPersonToIotExAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, ShrWebBizException { String billId = request.getParameter("billId"); IPerson iPerson = PersonFactory.getLocalInstance(ctx); PersonCollection personCollection = null; Set personIds = null; Map personNameAndNumberMap = new HashMap(); if (StringUtils.isEmpty(billId)) { personCollection = iPerson.getPersonCollection("select id,number"); StringBuilder sb = new StringBuilder(); for (int i = 0; i < personCollection.size(); i++) { PersonInfo personInfo = personCollection.get(i); String personId = personInfo.getId().toString(); String personNumber = personInfo.getNumber().toString(); sb.append(personId).append(","); personNameAndNumberMap.put(personNumber, personId); } sb.deleteCharAt(sb.lastIndexOf(",")); billId = sb.toString(); } else { personCollection = iPerson.getPersonCollection("select id,number where id in (" + AtsUtil.getStrFromString(billId) + ")"); } personIds = AtsUtil.toSet(billId); //调用同步IOT人员 try { Map resultMap = SyncTranForIOTFacadeFactory.getLocalInstance(ctx).syncPersonToIot(billId); //Map resultMap = syncPersonToIot(billId); int failure = 0; int success = personIds.size(); BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader(); for (int i = 0; i < personCollection.size(); i++) { BatchMessageTipsBody body = new BatchMessageTipsBody(); PersonInfo personInfo = personCollection.get(i); body.setId(personInfo.getId().toString()); String personNumber = personInfo.getNumber(); if (resultMap.containsKey(personNumber)) { //失败 body.setMuitTipsState(false); body.setMuitTipsMessage(resultMap.get(personNumber)); failure++; } else { body.setMuitTipsState(true); } batchMessageTipsHeader.addResult(body); } success -= failure; //for (int i = 0; i < list.size(); i++) { // BatchMessageTipsBody body = new BatchMessageTipsBody(); // Map map = list.get(i); // //personNameAndNumberMap // String personId = personNameAndNumberMap.get(map.get("id")); // //body.setId(map.get("id")); // body.setId(personId); // body.setMuitTipsState(Boolean.FALSE); // logger.error("result--personId--" + personId); // logger.error("result--msg--" + map.get("msg")); // body.setMuitTipsMessage(map.get("msg")); // batchMessageTipsHeader.addResult(body); //} logger.error("handleEnableWithTips----- >> "); batchMessageTipsHeader.setBillId(billId); batchMessageTipsHeader.setFailureCount(failure); batchMessageTipsHeader.setSuccessCount(success); ObjectMapper mapper = new ObjectMapper(); logger.error("handleEnableWithTips----- >> " + mapper.writeValueAsString(batchMessageTipsHeader)); logger.error("handleEnableWithTips--size--- >> " + batchMessageTipsHeader.getResult().size()); //logger.error("batchMessageTipsHeader " + batchMessageTipsHeader.getSuccessCount()); request.setAttribute("res_method_data", batchMessageTipsHeader); this.writeSuccessData(batchMessageTipsHeader); logger.error("handleEnableWithTips----- end "); } catch (Exception e) { e.printStackTrace(); throw new ShrWebBizException(e); } } public Map syncPersonToIot(String billIds) throws BOSException, EASBizException, SHRWebException { ISyncLog iSyncLog = SyncLogFactory.getLocalInstance(ctx); SyncLogInfo syncLogInfo = new SyncLogInfo(); syncLogInfo.setEntityName(SyncEntityNameEnum.person); syncLogInfo.setDataDirection(DataDirectionEnum.outflow); syncLogInfo.setDockingSystem(DockingSystemEnum.IOT); IPersonPosition iPersonPosition = PersonPositionFactory.getLocalInstance(ctx); FilterInfo filterInfo = new FilterInfo(); FilterItemCollection filterItems = filterInfo.getFilterItems(); Set personIds = AtsUtil.toSet(billIds); logger.error("syncPersonToIot---personIds---" + personIds); filterItems.add(new FilterItemInfo("person", personIds, CompareType.INCLUDE)); SelectorItemCollection sic = new SelectorItemCollection(); sic.add("*"); sic.add("person.number"); sic.add("person.name"); sic.add("person.id"); sic.add("person.hireDate"); sic.add("person.nCell"); sic.add("person.gender"); sic.add("person.email"); sic.add("person.employeeType.number"); sic.add("personDep.name"); sic.add("personDep.number"); sic.add("personDep.id"); sic.add("personDep.parent.id"); EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, null); PersonPositionCollection personPositionCollection = iPersonPosition.getPersonPositionCollection(entityViewInfo); JSONObject jsonObject = new JSONObject(); jsonObject.put("dataSyncRule", 1);//1:组织ID存在时更新 2:组织ID存在时跳过不更新。默认值1 List dataList = new ArrayList(); for (int i = 0; i < personPositionCollection.size(); i++) { Map personMap = new HashMap(); PersonPositionInfo personPositionInfo = personPositionCollection.get(i); PersonInfo person = personPositionInfo.getPerson(); //personMap.put("id", person.getId().toString());//来源方用户ID personMap.put("id", person.getNumber());//来源方用户ID personMap.put("name", person.getName());//用户姓名 personMap.put("phone", person.getNCell());//手机号 personMap.put("gender", person.getGender() == null ? null : person.getGender().getValue());//性别 personMap.put("email", person.getEmail());//邮箱 EmployeeTypeInfo employeeType = person.getEmployeeType(); String number = employeeType.getNumber(); String personStatus = personStatusMap.get(number); personMap.put("status", personStatus);//状态 AdminOrgUnitInfo personDep = personPositionInfo.getPersonDep(); List orgIds = new ArrayList(); orgIds.add(personDep.getParent().getId().toString()); personMap.put("orgIds", orgIds);//来源方组织ID列表 dataList.add(personMap); //员工编码 Map paramsMap = new HashMap(); paramsMap.put("employeeNo", person.getNumber()); personMap.put("params", paramsMap); } jsonObject.put("data", dataList);//1:组织ID存在时更新 2:组织ID存在时跳过不更新。默认值1 //执行同步人员到Iot return syncPerson(jsonObject.toString(), syncLogInfo); } /** * 请求方法 * * @param data */ public Map syncPerson(String data, SyncLogInfo syncLogInfo) throws BOSException, EASBizException { Response response = null; Map result = new HashMap<>(); try { String syncOrgUnitApiUrl = this.propt.getProperty("syncUserApiUrl"); //String syncOrgUnitApiUrl = "http://10.0.3.87/api/open/enterpriseright/org-manage/v1/external/org/batch"; if (org.apache.commons.lang3.StringUtils.isBlank(syncOrgUnitApiUrl)) { throw new BOSException("syncOrgUnitApiUrl不能为空!"); } logger.error("syncOrg---data-----" + data); OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, data); Request request = new Request.Builder() .url(syncOrgUnitApiUrl) .post(body) //.addHeader("Authorization", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ2UzVMT29mYiIsInNlcnZlciI6dHJ1ZSwidXNlcl9uYW1lIjoic0hSIiwicHJvamVjdE1hcCI6IntcIlNDWVwiOlwiMTMwMDgwNTYwNDAwNDA0NDgwMFwifSIsInNjb3BlIjpbInNlcnZlciJdLCJuYW1lIjoic0hSIiwicHJvamVjdCI6IiIsImV4cCI6MTczMDkxMzQwOSwidGVuYW50IjoidGFpb3QiLCJjbGllbnRfaWQiOiJzeXMifQ.hS1LVZ56rHPvVZmRdipay3XNAmmtFBZKt-wPc7UK2rg ") .addHeader("Authorization", getToken()) .addHeader("Accept", "*/*") .addHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0") .addHeader("Connection", "keep-alive") .addHeader("Content-Type", "application/json") .build(); response = client.newCall(request).execute(); String string = response.body().string(); logger.error("string-----" + string); if (response.isSuccessful()) { ObjectMapper objectMapper = new ObjectMapper(); Map>> resultMap = objectMapper.readValue(string, Map.class); List> list = resultMap.get("data"); for (int i = 0; i < list.size(); i++) { Map map = list.get(i); result.put(map.get("id"), map.get("msg")); } //todo //return (String) result.get("token"); syncLogInfo.setSyncStatus(SyncStatusEnum.SUCCESS); //syncLogInfo.setSyncCount(total); //syncLogInfo.setSuccessNum(success); //syncLogInfo.setFailNum(fail); SyncLogFactory.getLocalInstance(ctx).save(syncLogInfo); } else { syncLogInfo.setSyncStatus(SyncStatusEnum.ERROR); //syncLogInfo.setSyncCount(total); //syncLogInfo.setSuccessNum(success); //syncLogInfo.setFailNum(fail); SyncLogFactory.getLocalInstance(ctx).save(syncLogInfo); } } catch (IOException | BOSException e) { e.printStackTrace(); throw new RuntimeException("同步IOT平台人员失败: " + e.getMessage()); } return result; } /** * 获取token * 本地缓存token,有效时长6.5小时 * * @return */ public String getToken() { String token = cache.get("token"); if (org.apache.commons.lang3.StringUtils.isBlank(token)) { token = getTokenByRemote(); } return token; } /** * 远程获取Token * * @return */ private String getTokenByRemote() { Response response = null; Map result = null; try { long now = System.currentTimeMillis(); Map params = new HashMap<>(); String getTokenApiUrl = this.propt.getProperty("getTokenApiUrl"); if (org.apache.commons.lang3.StringUtils.isBlank(getTokenApiUrl)) { throw new BOSException("获取token接口地址不能为空!"); } String appid = this.propt.getProperty("appid"); if (org.apache.commons.lang3.StringUtils.isBlank(appid)) { throw new BOSException("appid不能为空!"); } String secret = this.propt.getProperty("secret"); if (org.apache.commons.lang3.StringUtils.isBlank(secret)) { throw new BOSException("secret不能为空!"); } params.put("appid", appid); params.put("sign_method", "md5"); params.put("timestamp", now + secret); //生成签名 String sign = DigestUtils.md5DigestAsHex((appendUrl(null, params)).getBytes()); params.put("timestamp", String.valueOf(now)); params.put("sign", sign); String requestUrl = appendUrl(getTokenApiUrl, params); logger.error("getTokenByRemote -> requestUrl " + requestUrl); OkHttpClient client = new OkHttpClient().newBuilder() .build(); Request request = new Request.Builder() .url(requestUrl) .get() .build(); response = client.newCall(request).execute(); String string = response.body().string(); ObjectMapper objectMapper = new ObjectMapper(); result = objectMapper.readValue(string, Map.class); logger.error("getTokenByRemote -> result " + result); } catch (IOException | BOSException e) { e.printStackTrace(); throw new RuntimeException("远程获取IOT平台token失败: " + e.getMessage()); } if (response.isSuccessful()) { String token = (String) result.get("token"); //缓存token cache.put("token", token, 27000000);//6.5小时 return token; } else { throw new RuntimeException((String) result.get("msg")); } } /** * 拼接地址参数 */ private String appendUrl(String url, Map data) { StringBuilder paramStr = new StringBuilder(); for (String key : data.keySet()) { paramStr.append(key).append("=").append(data.get(key)).append("&"); } paramStr.deleteCharAt(paramStr.lastIndexOf("&")); if (!org.apache.commons.lang3.StringUtils.isEmpty(url)) { return url.contains("?") ? (url + "&" + paramStr) : (url + "?" + paramStr); } return paramStr.toString(); } /** * 同步OA人员 * * @param request * @param response * @param modelMap * @throws BOSException * @throws EASBizException * @throws SHRWebException */ public void syncPersonToOAAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, EASBizException, SHRWebException { Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); String headerValue = request.getHeader(headerName); logger.error("----headerNames------key【" + headerName + "】-value【 " + headerValue + "】"); } Enumeration enu = request.getParameterNames(); while (enu.hasMoreElements()) { String paraName = (String) enu.nextElement(); logger.error("----ParameterNames------key【" + paraName + "】-value【 " + request.getParameter(paraName) + "】"); } //String billId = request.getParameter("billId[]"); ////} //if (StringUtils.isEmpty(billId)) { // billId = (String) request.getAttribute("billId[]"); //} //if (StringUtils.isEmpty(billId)) { // billId = request.getParameter("billIds[]"); //} //if (StringUtils.isEmpty(billId)) { // billId = (String) request.getAttribute("billIds[]"); //} //logger.error("----headerNames------billId----" + billId); this.handleEnableWithTips(request, ""); } protected void handleEnableWithTips(HttpServletRequest request, String methodName) throws SHRWebException { //String billId = this.getBillId(request); String billId = request.getParameter("billId"); //} if (StringUtils.isEmpty(billId)) { billId = (String) request.getAttribute("billId"); } if (StringUtils.isEmpty(billId)) { billId = request.getParameter("billIds[]"); } if (StringUtils.isEmpty(billId)) { billId = (String) request.getAttribute("billId[]"); } try { IPerson iPerson = PersonFactory.getLocalInstance(ctx); if (StringUtils.isEmpty(billId)) { PersonCollection personCollection = iPerson.getPersonCollection("select id"); StringBuilder sb = new StringBuilder(); for (int i = 0; i < personCollection.size(); i++) { String personId = personCollection.get(i).getId().toString(); sb.append(personId).append(","); } sb.deleteCharAt(sb.lastIndexOf(",")); billId = sb.toString(); } Map resultMap = SyncTranForOAFacadeFactory.getLocalInstance(ctx).syncPersonToOA(billId, null); logger.error("handleEnableWithTips----- resultMap----" + resultMap); if (resultMap != null && !resultMap.isEmpty()) { logger.error("handleEnableWithTips----- start "); logger.error("handleEnableWithTips----- billId-- " + billId); PersonCollection personCollection = iPerson.getPersonCollection("select id,number where id in (" + AtsUtil.getStrFromString(billId) + ")"); int sucess = 0; int failure = 0; BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader(); for (int i = 0; i < personCollection.size(); i++) { BatchMessageTipsBody body = new BatchMessageTipsBody(); PersonInfo personInfo = personCollection.get(i); body.setId(personInfo.getId().toString()); String personNumber = personInfo.getNumber(); Map map = (Map) resultMap.get(personNumber); logger.error("map----" + map); if (map == null) { ++failure; body.setMuitTipsState(Boolean.FALSE); body.setMuitTipsMessage("同步数据不能为空或检查是否同步OA字段是否等于否!"); } else { if ("success".equals(map.get("state"))) { ++sucess; body.setMuitTipsState(Boolean.TRUE); body.setMuitTipsMessage(map.get("msg")); } else { ++failure; body.setMuitTipsState(Boolean.FALSE); body.setMuitTipsMessage(map.get("msg")); } } batchMessageTipsHeader.addResult(body); } //if (StringUtils.isEmpty(billId)) { // Set setPersonIds = (Set) resultMap.get("setPersonIds"); // FilterInfo filterInfo = new FilterInfo(); // filterInfo.getFilterItems().add(new FilterItemInfo("id", setPersonIds, CompareType.NOTINCLUDE)); // EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, null, null); // PersonCollection personCollection2 = iPerson.getPersonCollection(entityViewInfo); // StringBuilder sb = new StringBuilder(); // for (int i = 0; i < personCollection2.size(); i++) { // PersonInfo personInfo = personCollection2.get(i); // sb.append(personInfo.getId().toString()).append(","); // } // sb.deleteCharAt(sb.lastIndexOf(",")); // billId = sb.toString(); //} logger.error("handleEnableWithTips----- >> "); batchMessageTipsHeader.setBillId(billId); batchMessageTipsHeader.setFailureCount(failure); batchMessageTipsHeader.setSuccessCount(sucess); logger.error("batchMessageTipsHeader " + batchMessageTipsHeader.getSuccessCount()); request.setAttribute("res_method_data", batchMessageTipsHeader); this.writeSuccessData(batchMessageTipsHeader); logger.error("handleEnableWithTips----- end "); } } catch (Exception e) { e.printStackTrace(); throw new ShrWebBizException(e); } } }