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.PersonCollection; 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.ISyncTranForIOTFacade; 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.org.web.handler.OrgUnitListHandler; 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 okhttp3.*; import org.springframework.util.DigestUtils; import org.apache.log4j.Logger; import org.springframework.ui.ModelMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.util.*; import org.apache.commons.lang3.StringUtils; /** * @author qingwu * @date 2024/10/21 * @apiNote */ public class OrgUnitListHandlerEx extends OrgUnitListHandler { Logger logger = Logger.getLogger(OrgUnitListHandlerEx.class); private Context ctx = SHRContext.getInstance().getContext(); private Properties propt = new Properties(); //缓存 private static ExpiringMapCache cache = new ExpiringMapCache(); private static Map personStatusMap = new HashMap(); static { personStatusMap.put("集团", 1);//集团 personStatusMap.put("公司", 2);//公司 personStatusMap.put("一级组织", 3);//一级组织 区域 personStatusMap.put("二级组织", 4);//二级组织 分公司 personStatusMap.put("三级组织", 5);//三级组织 子公司 personStatusMap.put("四级组织", 6);//四级组织 管理 } public OrgUnitListHandlerEx() 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); } } /** * 获取组织批处理信息 * * @param request * @param response * @param modelMap * @return */ public void getAdminOrgBatchInfoAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, ShrWebBizException { try { IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx); AdminOrgUnitCollection adminOrgUnitCollection = null; String ids = request.getParameter("ids"); if (StringUtil.isEmpty(ids)) { adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection(); } 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); adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection(entityViewInfo); } List list = new ArrayList(); for (int i = 0; i < adminOrgUnitCollection.size(); i++) { AdminOrgUnitInfo adminOrgUnitInfo = adminOrgUnitCollection.get(i); list.add(adminOrgUnitInfo); } JSONUtils.SUCCESS(list); } catch (Exception e) { e.printStackTrace(); throw new ShrWebBizException(e); } } /** * 同步IOT平台 * * @param request * @param response * @param modelMap * @return 后续如需部署生产去掉Ex */ public Map syncOrgUnitToIotExAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, ShrWebBizException { try { String billds = request.getParameter("billIds"); logger.error("_syncOrgUnitToOA---billds: " + billds); Set adminOrgIds = null; if (StringUtils.isEmpty(billds)) { IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx); AdminOrgUnitCollection adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection("select id ,name,number"); StringBuilder sb = new StringBuilder(); for (int i = 0; i < adminOrgUnitCollection.size(); i++) { String adminOrgId = adminOrgUnitCollection.get(i).getId().toString(); sb.append(adminOrgId).append(","); } sb.deleteCharAt(sb.lastIndexOf(",")); billds = sb.toString(); } adminOrgIds = AtsUtil.toSet(billds); ISyncTranForIOTFacade iSyncTranForIOTFacade = SyncTranForIOTFacadeFactory.getLocalInstance(ctx); Map>> result = iSyncTranForIOTFacade.syncOrgUnitToIot(billds); logger.error("result---" + result); List> list = result.get("data"); int success = adminOrgIds.size(); int failure = 0; BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader(); if (list.size() > 0) { failure = list.size(); for (int i = 0; i < list.size(); i++) { BatchMessageTipsBody body = new BatchMessageTipsBody(); Map map = list.get(i); body.setId(map.get("id")); body.setMuitTipsState(Boolean.FALSE); body.setMuitTipsMessage(map.get("msg")); batchMessageTipsHeader.addResult(body); } success -= list.size(); } logger.error("handleEnableWithTips----- >> "); batchMessageTipsHeader.setBillId(billds); batchMessageTipsHeader.setFailureCount(failure); batchMessageTipsHeader.setSuccessCount(success); logger.error("batchMessageTipsHeader " + batchMessageTipsHeader.getSuccessCount()); request.setAttribute("res_method_data", batchMessageTipsHeader); this.writeSuccessData(batchMessageTipsHeader); logger.error("handleEnableWithTips----- end "); } catch (SHRWebException e) { e.printStackTrace(); throw new ShrWebBizException(e); } catch (EASBizException e) { throw new ShrWebBizException(e); } return null; } /** * 获取token * 本地缓存token,有效时长6.5小时 * * @return */ public String getToken() { String token = cache.get("token"); if (StringUtils.isBlank(token)) { token = getTokenByRemote(); } return token; } /** * 请求方法 * * @param data */ public Map syncOrg(String data, SyncLogInfo syncLogInfo) throws BOSException, EASBizException { Response response = null; Map result = null; try { String syncOrgUnitApiUrl = this.propt.getProperty("syncOrgUnitApiUrl"); //String syncOrgUnitApiUrl = "http://10.0.3.87/api/open/enterpriseright/org-manage/v1/external/org/batch"; if (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(); ObjectMapper objectMapper = new ObjectMapper(); result = objectMapper.readValue(string, Map.class); } catch (IOException | BOSException e) { e.printStackTrace(); throw new RuntimeException("同步IOT平台组织失败: " + e.getMessage()); } logger.error("result-----" + result); logger.error("response.isSuccessful()-----" + response.isSuccessful()); if (response.isSuccessful()) { //todo //return (String) result.get("token"); syncLogInfo.setSyncStatus(SyncStatusEnum.SUCCESS); //syncLogInfo.setSyncCount(total); //syncLogInfo.setSuccessNum(success); //syncLogInfo.setFailNum(fail); syncLogInfo.setSyncResult((String) result.get("msg")); SyncLogFactory.getLocalInstance(ctx).save(syncLogInfo); } else { syncLogInfo.setSyncStatus(SyncStatusEnum.ERROR); //syncLogInfo.setSyncCount(total); //syncLogInfo.setSuccessNum(success); //syncLogInfo.setFailNum(fail); syncLogInfo.setSyncResult((String) result.get("msg")); SyncLogFactory.getLocalInstance(ctx).save(syncLogInfo); } return result; } /** * 远程获取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 (StringUtils.isBlank(getTokenApiUrl)) { throw new BOSException("获取token接口地址不能为空!"); } String appid = this.propt.getProperty("appid"); if (StringUtils.isBlank(appid)) { throw new BOSException("appid不能为空!"); } String secret = this.propt.getProperty("secret"); if (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 (!StringUtils.isEmpty(url)) { return url.contains("?") ? (url + "&" + paramStr) : (url + "?" + paramStr); } return paramStr.toString(); } /** * 同步OA部门 * * @param request * @param response * @param modelMap * @throws BOSException * @throws EASBizException */ public void syncOrgUnitToOAAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, EASBizException, ShrWebBizException { String billIds = request.getParameter("billIds"); //同步组织到OA //Map map = SyncTranForOAFacadeFactory.getLocalInstance(ctx).syncOrgUnitToOA(billIds, null); try { IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx); String billds = request.getParameter("billIds"); logger.error("_syncOrgUnitToOA---billds: " + billds); Set adminOrgIds = null; if (StringUtils.isEmpty(billds)) { AdminOrgUnitCollection adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection("select id ,name,number"); StringBuilder sb = new StringBuilder(); for (int i = 0; i < adminOrgUnitCollection.size(); i++) { String adminOrgId = adminOrgUnitCollection.get(i).getId().toString(); sb.append(adminOrgId).append(","); } sb.deleteCharAt(sb.lastIndexOf(",")); billds = sb.toString(); } adminOrgIds = AtsUtil.toSet(billds); Map>> result = SyncTranForOAFacadeFactory.getLocalInstance(ctx).syncOrgUnitToOA(billIds, null); if (result != null && !result.isEmpty()) { logger.error("handleEnableWithTips----- start "); logger.error("handleEnableWithTips----- billId-- " + billIds); AdminOrgUnitCollection adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection("select id,number where id in (" + AtsUtil.getStrFromString(billds) + ")"); int sucess = 0; int failure = 0; BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader(); for (int i = 0; i < adminOrgUnitCollection.size(); i++) { BatchMessageTipsBody body = new BatchMessageTipsBody(); AdminOrgUnitInfo adminOrgUnitInfo = adminOrgUnitCollection.get(i); body.setId(adminOrgUnitInfo.getId().toString()); String adminOrgNumber = adminOrgUnitInfo.getNumber(); Map map = (Map) result.get(adminOrgNumber); 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); } logger.error("handleEnableWithTips----- >> "); batchMessageTipsHeader.setBillId(billds); 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 (SHRWebException e) { e.printStackTrace(); throw new ShrWebBizException(e); } } }