OrgUnitListHandlerEx.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. package com.kingdee.eas.custom.synctask.handler;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.kingdee.bos.BOSException;
  5. import com.kingdee.bos.Context;
  6. import com.kingdee.bos.metadata.entity.*;
  7. import com.kingdee.bos.metadata.query.util.CompareType;
  8. import com.kingdee.eas.basedata.org.*;
  9. import com.kingdee.eas.basedata.person.PersonCollection;
  10. import com.kingdee.eas.basedata.person.PersonInfo;
  11. import com.kingdee.eas.common.EASBizException;
  12. import com.kingdee.eas.cp.taskmng.util.StringUtil;
  13. import com.kingdee.eas.custom.log.ISyncLog;
  14. import com.kingdee.eas.custom.log.SyncLogFactory;
  15. import com.kingdee.eas.custom.log.SyncLogInfo;
  16. import com.kingdee.eas.custom.log.app.DataDirectionEnum;
  17. import com.kingdee.eas.custom.log.app.DockingSystemEnum;
  18. import com.kingdee.eas.custom.log.app.SyncEntityNameEnum;
  19. import com.kingdee.eas.custom.log.app.SyncStatusEnum;
  20. import com.kingdee.eas.custom.synctask.ISyncTranForIOTFacade;
  21. import com.kingdee.eas.custom.synctask.SyncTranForIOTFacadeFactory;
  22. import com.kingdee.eas.custom.synctask.SyncTranForOAFacadeFactory;
  23. import com.kingdee.eas.custom.synctask.util.ExpiringMapCache;
  24. import com.kingdee.eas.hr.ats.AtsUtil;
  25. import com.kingdee.eas.hr.org.web.handler.OrgUnitListHandler;
  26. import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsBody;
  27. import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsHeader;
  28. import com.kingdee.shr.base.syssetting.context.SHRContext;
  29. import com.kingdee.shr.base.syssetting.exception.SHRWebException;
  30. import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
  31. import com.kingdee.shr.base.syssetting.web.json.JSONUtils;
  32. import okhttp3.*;
  33. import org.springframework.util.DigestUtils;
  34. import org.apache.log4j.Logger;
  35. import org.springframework.ui.ModelMap;
  36. import javax.servlet.http.HttpServletRequest;
  37. import javax.servlet.http.HttpServletResponse;
  38. import java.io.FileInputStream;
  39. import java.io.IOException;
  40. import java.util.*;
  41. import org.apache.commons.lang3.StringUtils;
  42. /**
  43. * @author qingwu
  44. * @date 2024/10/21
  45. * @apiNote
  46. */
  47. public class OrgUnitListHandlerEx extends OrgUnitListHandler {
  48. Logger logger = Logger.getLogger(OrgUnitListHandlerEx.class);
  49. private Context ctx = SHRContext.getInstance().getContext();
  50. private Properties propt = new Properties();
  51. //缓存
  52. private static ExpiringMapCache<String, String> cache = new ExpiringMapCache();
  53. private static Map<String, Integer> personStatusMap = new HashMap<String, Integer>();
  54. static {
  55. personStatusMap.put("集团", 1);//集团
  56. personStatusMap.put("公司", 2);//公司
  57. personStatusMap.put("一级组织", 3);//一级组织 区域
  58. personStatusMap.put("二级组织", 4);//二级组织 分公司
  59. personStatusMap.put("三级组织", 5);//三级组织 子公司
  60. personStatusMap.put("四级组织", 6);//四级组织 管理
  61. }
  62. public OrgUnitListHandlerEx() throws BOSException {
  63. String syncOAConfigPath = System.getProperty("EAS_HOME") + "/server/properties/scy/syncIOTConfig.properties";
  64. try {
  65. propt.load(new FileInputStream(syncOAConfigPath));
  66. } catch (IOException e) {
  67. e.printStackTrace();
  68. String errorMsg = "获取配置文件报错,请检查配置:" + syncOAConfigPath + " " + e.getMessage();
  69. throw new BOSException(errorMsg);
  70. }
  71. }
  72. /**
  73. * 获取组织批处理信息
  74. *
  75. * @param request
  76. * @param response
  77. * @param modelMap
  78. * @return
  79. */
  80. public void getAdminOrgBatchInfoAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, ShrWebBizException {
  81. try {
  82. IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx);
  83. AdminOrgUnitCollection adminOrgUnitCollection = null;
  84. String ids = request.getParameter("ids");
  85. if (StringUtil.isEmpty(ids)) {
  86. adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection();
  87. } else {
  88. Set<String> adminOrgIds = AtsUtil.toSet(ids);
  89. FilterInfo filterInfo = new FilterInfo();
  90. FilterItemCollection filterItems = filterInfo.getFilterItems();
  91. filterItems.add(new FilterItemInfo("id", adminOrgIds, CompareType.INCLUDE));
  92. EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, null, null);
  93. adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection(entityViewInfo);
  94. }
  95. List list = new ArrayList();
  96. for (int i = 0; i < adminOrgUnitCollection.size(); i++) {
  97. AdminOrgUnitInfo adminOrgUnitInfo = adminOrgUnitCollection.get(i);
  98. list.add(adminOrgUnitInfo);
  99. }
  100. JSONUtils.SUCCESS(list);
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. throw new ShrWebBizException(e);
  104. }
  105. }
  106. /**
  107. * 同步IOT平台
  108. *
  109. * @param request
  110. * @param response
  111. * @param modelMap
  112. * @return 后续如需部署生产去掉Ex
  113. */
  114. public Map syncOrgUnitToIotExAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, ShrWebBizException {
  115. try {
  116. String billds = request.getParameter("billIds");
  117. logger.error("_syncOrgUnitToOA---billds: " + billds);
  118. Set<String> adminOrgIds = null;
  119. if (StringUtils.isEmpty(billds)) {
  120. IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx);
  121. AdminOrgUnitCollection adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection("select id ,name,number");
  122. StringBuilder sb = new StringBuilder();
  123. for (int i = 0; i < adminOrgUnitCollection.size(); i++) {
  124. String adminOrgId = adminOrgUnitCollection.get(i).getId().toString();
  125. sb.append(adminOrgId).append(",");
  126. }
  127. sb.deleteCharAt(sb.lastIndexOf(","));
  128. billds = sb.toString();
  129. }
  130. adminOrgIds = AtsUtil.toSet(billds);
  131. ISyncTranForIOTFacade iSyncTranForIOTFacade = SyncTranForIOTFacadeFactory.getLocalInstance(ctx);
  132. Map<String, List<Map<String, String>>> result = iSyncTranForIOTFacade.syncOrgUnitToIot(billds);
  133. logger.error("result---" + result);
  134. List<Map<String, String>> list = result.get("data");
  135. int success = adminOrgIds.size();
  136. int failure = 0;
  137. BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader();
  138. if (list.size() > 0) {
  139. failure = list.size();
  140. for (int i = 0; i < list.size(); i++) {
  141. BatchMessageTipsBody body = new BatchMessageTipsBody();
  142. Map<String, String> map = list.get(i);
  143. body.setId(map.get("id"));
  144. body.setMuitTipsState(Boolean.FALSE);
  145. body.setMuitTipsMessage(map.get("msg"));
  146. batchMessageTipsHeader.addResult(body);
  147. }
  148. success -= list.size();
  149. }
  150. logger.error("handleEnableWithTips----- >> ");
  151. batchMessageTipsHeader.setBillId(billds);
  152. batchMessageTipsHeader.setFailureCount(failure);
  153. batchMessageTipsHeader.setSuccessCount(success);
  154. logger.error("batchMessageTipsHeader " + batchMessageTipsHeader.getSuccessCount());
  155. request.setAttribute("res_method_data", batchMessageTipsHeader);
  156. this.writeSuccessData(batchMessageTipsHeader);
  157. logger.error("handleEnableWithTips----- end ");
  158. } catch (SHRWebException e) {
  159. e.printStackTrace();
  160. throw new ShrWebBizException(e);
  161. } catch (EASBizException e) {
  162. throw new ShrWebBizException(e);
  163. }
  164. return null;
  165. }
  166. /**
  167. * 获取token
  168. * 本地缓存token,有效时长6.5小时
  169. *
  170. * @return
  171. */
  172. public String getToken() {
  173. String token = cache.get("token");
  174. if (StringUtils.isBlank(token)) {
  175. token = getTokenByRemote();
  176. }
  177. return token;
  178. }
  179. /**
  180. * 请求方法
  181. *
  182. * @param data
  183. */
  184. public Map syncOrg(String data, SyncLogInfo syncLogInfo) throws BOSException, EASBizException {
  185. Response response = null;
  186. Map result = null;
  187. try {
  188. String syncOrgUnitApiUrl = this.propt.getProperty("syncOrgUnitApiUrl");
  189. //String syncOrgUnitApiUrl = "http://10.0.3.87/api/open/enterpriseright/org-manage/v1/external/org/batch";
  190. if (StringUtils.isBlank(syncOrgUnitApiUrl)) {
  191. throw new BOSException("syncOrgUnitApiUrl不能为空!");
  192. }
  193. logger.error("syncOrg---data-----" + data);
  194. OkHttpClient client = new OkHttpClient();
  195. MediaType mediaType = MediaType.parse("application/json");
  196. RequestBody body = RequestBody.create(mediaType, data);
  197. Request request = new Request.Builder()
  198. .url(syncOrgUnitApiUrl)
  199. .post(body)
  200. //.addHeader("Authorization", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ2UzVMT29mYiIsInNlcnZlciI6dHJ1ZSwidXNlcl9uYW1lIjoic0hSIiwicHJvamVjdE1hcCI6IntcIlNDWVwiOlwiMTMwMDgwNTYwNDAwNDA0NDgwMFwifSIsInNjb3BlIjpbInNlcnZlciJdLCJuYW1lIjoic0hSIiwicHJvamVjdCI6IiIsImV4cCI6MTczMDkxMzQwOSwidGVuYW50IjoidGFpb3QiLCJjbGllbnRfaWQiOiJzeXMifQ.hS1LVZ56rHPvVZmRdipay3XNAmmtFBZKt-wPc7UK2rg ")
  201. .addHeader("Authorization", getToken())
  202. .addHeader("Accept", "*/*")
  203. .addHeader("User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0")
  204. .addHeader("Connection", "keep-alive")
  205. .addHeader("Content-Type", "application/json")
  206. .build();
  207. response = client.newCall(request).execute();
  208. String string = response.body().string();
  209. ObjectMapper objectMapper = new ObjectMapper();
  210. result = objectMapper.readValue(string, Map.class);
  211. } catch (IOException | BOSException e) {
  212. e.printStackTrace();
  213. throw new RuntimeException("同步IOT平台组织失败: " + e.getMessage());
  214. }
  215. logger.error("result-----" + result);
  216. logger.error("response.isSuccessful()-----" + response.isSuccessful());
  217. if (response.isSuccessful()) {
  218. //todo
  219. //return (String) result.get("token");
  220. syncLogInfo.setSyncStatus(SyncStatusEnum.SUCCESS);
  221. //syncLogInfo.setSyncCount(total);
  222. //syncLogInfo.setSuccessNum(success);
  223. //syncLogInfo.setFailNum(fail);
  224. syncLogInfo.setSyncResult((String) result.get("msg"));
  225. SyncLogFactory.getLocalInstance(ctx).save(syncLogInfo);
  226. } else {
  227. syncLogInfo.setSyncStatus(SyncStatusEnum.ERROR);
  228. //syncLogInfo.setSyncCount(total);
  229. //syncLogInfo.setSuccessNum(success);
  230. //syncLogInfo.setFailNum(fail);
  231. syncLogInfo.setSyncResult((String) result.get("msg"));
  232. SyncLogFactory.getLocalInstance(ctx).save(syncLogInfo);
  233. }
  234. return result;
  235. }
  236. /**
  237. * 远程获取Token
  238. *
  239. * @return
  240. */
  241. private String getTokenByRemote() {
  242. Response response = null;
  243. Map result = null;
  244. try {
  245. long now = System.currentTimeMillis();
  246. Map<String, String> params = new HashMap<>();
  247. String getTokenApiUrl = this.propt.getProperty("getTokenApiUrl");
  248. if (StringUtils.isBlank(getTokenApiUrl)) {
  249. throw new BOSException("获取token接口地址不能为空!");
  250. }
  251. String appid = this.propt.getProperty("appid");
  252. if (StringUtils.isBlank(appid)) {
  253. throw new BOSException("appid不能为空!");
  254. }
  255. String secret = this.propt.getProperty("secret");
  256. if (StringUtils.isBlank(secret)) {
  257. throw new BOSException("secret不能为空!");
  258. }
  259. params.put("appid", appid);
  260. params.put("sign_method", "md5");
  261. params.put("timestamp", now + secret);
  262. //生成签名
  263. String sign = DigestUtils.md5DigestAsHex((appendUrl(null, params)).getBytes());
  264. params.put("timestamp", String.valueOf(now));
  265. params.put("sign", sign);
  266. String requestUrl = appendUrl(getTokenApiUrl, params);
  267. logger.error("getTokenByRemote -> requestUrl " + requestUrl);
  268. OkHttpClient client = new OkHttpClient().newBuilder()
  269. .build();
  270. Request request = new Request.Builder()
  271. .url(requestUrl)
  272. .get()
  273. .build();
  274. response = client.newCall(request).execute();
  275. String string = response.body().string();
  276. ObjectMapper objectMapper = new ObjectMapper();
  277. result = objectMapper.readValue(string, Map.class);
  278. logger.error("getTokenByRemote -> result " + result);
  279. } catch (IOException | BOSException e) {
  280. e.printStackTrace();
  281. throw new RuntimeException("远程获取IOT平台token失败: " + e.getMessage());
  282. }
  283. if (response.isSuccessful()) {
  284. String token = (String) result.get("token");
  285. //缓存token
  286. cache.put("token", token, 27000000);//6.5小时
  287. return token;
  288. } else {
  289. throw new RuntimeException((String) result.get("msg"));
  290. }
  291. }
  292. /**
  293. * 拼接地址参数
  294. */
  295. private String appendUrl(String url, Map<String, String> data) {
  296. StringBuilder paramStr = new StringBuilder();
  297. for (String key : data.keySet()) {
  298. paramStr.append(key).append("=").append(data.get(key)).append("&");
  299. }
  300. paramStr.deleteCharAt(paramStr.lastIndexOf("&"));
  301. if (!StringUtils.isEmpty(url)) {
  302. return url.contains("?") ? (url + "&" + paramStr) : (url + "?" + paramStr);
  303. }
  304. return paramStr.toString();
  305. }
  306. /**
  307. * 同步OA部门
  308. *
  309. * @param request
  310. * @param response
  311. * @param modelMap
  312. * @throws BOSException
  313. * @throws EASBizException
  314. */
  315. public void syncOrgUnitToOAAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, EASBizException, ShrWebBizException {
  316. String billIds = request.getParameter("billIds");
  317. //同步组织到OA
  318. //Map map = SyncTranForOAFacadeFactory.getLocalInstance(ctx).syncOrgUnitToOA(billIds, null);
  319. try {
  320. IAdminOrgUnit iAdminOrgUnit = AdminOrgUnitFactory.getLocalInstance(ctx);
  321. String billds = request.getParameter("billIds");
  322. logger.error("_syncOrgUnitToOA---billds: " + billds);
  323. Set<String> adminOrgIds = null;
  324. if (StringUtils.isEmpty(billds)) {
  325. AdminOrgUnitCollection adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection("select id ,name,number");
  326. StringBuilder sb = new StringBuilder();
  327. for (int i = 0; i < adminOrgUnitCollection.size(); i++) {
  328. String adminOrgId = adminOrgUnitCollection.get(i).getId().toString();
  329. sb.append(adminOrgId).append(",");
  330. }
  331. sb.deleteCharAt(sb.lastIndexOf(","));
  332. billds = sb.toString();
  333. }
  334. adminOrgIds = AtsUtil.toSet(billds);
  335. Map<String, List<Map<String, String>>> result = SyncTranForOAFacadeFactory.getLocalInstance(ctx).syncOrgUnitToOA(billIds, null);
  336. if (result != null && !result.isEmpty()) {
  337. logger.error("handleEnableWithTips----- start ");
  338. logger.error("handleEnableWithTips----- billId-- " + billIds);
  339. AdminOrgUnitCollection adminOrgUnitCollection = iAdminOrgUnit.getAdminOrgUnitCollection("select id,number where id in (" + AtsUtil.getStrFromString(billds) + ")");
  340. int sucess = 0;
  341. int failure = 0;
  342. BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader();
  343. for (int i = 0; i < adminOrgUnitCollection.size(); i++) {
  344. BatchMessageTipsBody body = new BatchMessageTipsBody();
  345. AdminOrgUnitInfo adminOrgUnitInfo = adminOrgUnitCollection.get(i);
  346. body.setId(adminOrgUnitInfo.getId().toString());
  347. String adminOrgNumber = adminOrgUnitInfo.getNumber();
  348. Map<String, String> map = (Map<String, String>) result.get(adminOrgNumber);
  349. logger.error("map----" + map);
  350. if (map == null) {
  351. ++failure;
  352. body.setMuitTipsState(Boolean.FALSE);
  353. body.setMuitTipsMessage("同步数据不能为空或检查是否同步OA字段是否等于否!");
  354. } else {
  355. if ("success".equals(map.get("state"))) {
  356. ++sucess;
  357. body.setMuitTipsState(Boolean.TRUE);
  358. body.setMuitTipsMessage(map.get("msg"));
  359. } else {
  360. ++failure;
  361. body.setMuitTipsState(Boolean.FALSE);
  362. body.setMuitTipsMessage(map.get("msg"));
  363. }
  364. }
  365. batchMessageTipsHeader.addResult(body);
  366. }
  367. logger.error("handleEnableWithTips----- >> ");
  368. batchMessageTipsHeader.setBillId(billds);
  369. batchMessageTipsHeader.setFailureCount(failure);
  370. batchMessageTipsHeader.setSuccessCount(sucess);
  371. logger.error("batchMessageTipsHeader " + batchMessageTipsHeader.getSuccessCount());
  372. request.setAttribute("res_method_data", batchMessageTipsHeader);
  373. this.writeSuccessData(batchMessageTipsHeader);
  374. logger.error("handleEnableWithTips----- end ");
  375. }
  376. } catch (SHRWebException e) {
  377. e.printStackTrace();
  378. throw new ShrWebBizException(e);
  379. }
  380. }
  381. }