SynchronousPosOSFService.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package com.kingdee.eas.custom.beisen.synchronouspos.osf;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.google.common.collect.Maps;
  5. import com.kingdee.bos.BOSException;
  6. import com.kingdee.bos.Context;
  7. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  8. import com.kingdee.bos.rabbitmq.guava.Lists;
  9. import com.kingdee.eas.common.EASBizException;
  10. import com.kingdee.eas.custom.beisen.utils.BeiSenUtils;
  11. import com.kingdee.eas.custom.beisen.utils.BeisenParamByPropertiesUtil;
  12. import com.kingdee.eas.custom.beisen.utils.Helper;
  13. import com.kingdee.eas.util.app.DbUtil;
  14. import com.kingdee.jdbc.rowset.IRowSet;
  15. import org.apache.commons.lang3.StringUtils;
  16. import java.io.IOException;
  17. import java.net.URISyntaxException;
  18. import java.net.URLEncoder;
  19. import java.sql.Date;
  20. import java.sql.SQLException;
  21. import java.text.SimpleDateFormat;
  22. import java.util.Arrays;
  23. import java.util.HashMap;
  24. import java.util.List;
  25. import java.util.Map;
  26. /**
  27. * description: SynchronousPosOSFService <br>
  28. * date: 2025/7/11 17:46 <br>
  29. * author: lhbj <br>
  30. * version: 1.0 <br>
  31. */
  32. public class SynchronousPosOSFService implements IHRMsfService {
  33. @Override
  34. public Object process(Context context, Map<String, Object> map) throws EASBizException, BOSException {
  35. //例:/server/properties/beisen/posConfig.properties
  36. String path = (String) map.get("path");
  37. String posId = (String) map.get("posId");
  38. String syncStartTimeStr = (String) map.get("syncStartTimeStr");
  39. String syncEndTimeStr = (String) map.get("syncEndTimeStr");
  40. try {
  41. BeisenParamByPropertiesUtil util = new BeisenParamByPropertiesUtil(path);
  42. Map<String,String> keyMap = util.getConfig();
  43. return this._syncPosToBeiSen(context,keyMap,posId,syncStartTimeStr,syncEndTimeStr);
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. } catch (SQLException throwables) {
  47. throwables.printStackTrace();
  48. } catch (URISyntaxException e) {
  49. e.printStackTrace();
  50. }
  51. return null;
  52. }
  53. protected String _syncPosToBeiSen(Context ctx,Map<String,String> keyMap, String posId, String syncStartTimeStr, String syncEndTimeStr) throws BOSException, SQLException, IOException, URISyntaxException {
  54. List<JSONObject> responseList =Lists.newArrayList();
  55. List<JSONObject> addNewList = this._sendAddNewPosToBeisen(ctx,keyMap,posId,syncStartTimeStr,syncEndTimeStr);
  56. responseList.addAll(addNewList);
  57. List<JSONObject> editList = this._sendEditPosToBeisen(ctx,keyMap,posId,syncStartTimeStr,syncEndTimeStr);
  58. responseList.addAll(editList);
  59. return responseList.toString();
  60. }
  61. /**
  62. * shr系统数据组装北森请求参数
  63. *
  64. * @param ctx
  65. * @param keyMap
  66. * @param sql
  67. * @return
  68. * @throws BOSException
  69. * @throws SQLException
  70. */
  71. protected List<Map<String, Object>> getPostData(Context ctx,Map<String,String> keyMap,StringBuilder sql) throws BOSException, SQLException {
  72. IRowSet rowSet = DbUtil.executeQuery(ctx,sql.toString());
  73. List<Map<String, Object>> posList = Lists.newArrayList();
  74. while (rowSet.next()){
  75. Map<String, Object> pos = Maps.newHashMap();
  76. for(Map.Entry<String,String> entry : keyMap.entrySet()){
  77. String shrKey = entry.getKey();
  78. String beisenKey = entry.getValue();
  79. if(shrKey.indexOf(".")>0){
  80. String[] keys=shrKey.split("\\.");
  81. if(2==keys.length){
  82. Map<String,Object> map1 = (Map<String, Object>) pos.get(keys[0]);
  83. if(null==map1){
  84. map1=Maps.newHashMap();
  85. pos.put(keys[0],map1);
  86. }
  87. String valueStr = rowSet.getString(keys[1]);
  88. if(beisenKey.indexOf(",")>0) {
  89. String[] beisenKeys = beisenKey.split(",");
  90. Object value = null;
  91. if("integer".equals(beisenKeys[1])){
  92. if(null!=valueStr){
  93. value=Integer.parseInt(valueStr);
  94. }
  95. }else {
  96. value = valueStr;
  97. }
  98. if(null!=value) {
  99. map1.put(beisenKeys[0], value);
  100. }
  101. }else {
  102. if(null!=valueStr) {
  103. map1.put(beisenKey, valueStr);
  104. }
  105. }
  106. }else if (3==keys.length){
  107. Map<String,Object> map1 = (Map<String, Object>) pos.get(keys[0]);
  108. if(null==map1){
  109. map1=Maps.newHashMap();
  110. pos.put(keys[0],map1);
  111. }
  112. Map<String,Object> map2 = (Map<String, Object>) map1.get(keys[1]);
  113. if(null==map2){
  114. map2=Maps.newHashMap();
  115. map1.put(keys[1],map1);
  116. }
  117. String valueStr = rowSet.getString(keys[2]);
  118. if(beisenKey.indexOf(",")>0) {
  119. String[] beisenKeys = beisenKey.split(",");
  120. Object value = null;
  121. if("integer".equals(beisenKeys[1])){
  122. if(null!=valueStr){
  123. value=Integer.parseInt(valueStr);
  124. }
  125. }else {
  126. value = valueStr;
  127. }
  128. if(null!=value) {
  129. map2.put(beisenKeys[0], value);
  130. }
  131. }else {
  132. if(null!=valueStr) {
  133. map2.put(beisenKey,valueStr);
  134. }
  135. }
  136. }
  137. }else {
  138. String valueStr = rowSet.getString(shrKey);
  139. if(beisenKey.indexOf(",")>0) {
  140. String[] beisenKeys = beisenKey.split(",");
  141. Object value = null;
  142. if("integer".equals(beisenKeys[1])){
  143. if(null!=valueStr){
  144. value=Integer.parseInt(valueStr);
  145. }
  146. }else {
  147. value = valueStr;
  148. }
  149. if(null!=value) {
  150. pos.put(beisenKeys[0],value);
  151. }
  152. }else {
  153. if(null!=valueStr) {
  154. pos.put(beisenKey,valueStr);
  155. }
  156. }
  157. }
  158. }
  159. posList.add(pos);
  160. }
  161. return posList;
  162. }
  163. public StringBuilder getSql(String posId,String syncStartTimeStr, String syncEndTimeStr,Boolean isAddNew){
  164. StringBuilder sql = new StringBuilder();
  165. sql.append(" ");
  166. sql.append(" select ");
  167. sql.append(" pos.fid posId, ");
  168. sql.append(" pos.CFOriginalId posOriginalId, ");
  169. sql.append(" pos.fnumber posNumber, ");
  170. sql.append(" pos.fname_l2 posName, ");
  171. sql.append(" org.fid orgId, ");
  172. sql.append(" org.CFOriginalId orgOriginalId, ");
  173. sql.append(" org.fnumber orgNumber, ");
  174. sql.append(" org.fname_l2 orgName, ");
  175. sql.append(" (case when pos.FDELETEDSTATUS=2 then 0 else 1 end) posDeletedStatus, ");
  176. sql.append(" pos.cfzwjzygx posZwjzygx, ");
  177. sql.append(" pos.cfzyzz posZyzz, ");
  178. sql.append(" pos.cfgwdwsccg posGwdwsccg, ");
  179. sql.append(" pos.cfcgzb posCgzb, ");
  180. sql.append(" pos.cfzlzb posZlzb, ");
  181. sql.append(" jobf.fname_l2 hrJobFamily, ");
  182. sql.append(" jobc.fname_l2 hrJobCategory, ");
  183. sql.append(" jobsc.fname_l2 jobscHrJobSubCategory, ");
  184. sql.append(" job.fnumber jobNumber, ");
  185. sql.append(" job.fname_l2 jobName, ");
  186. sql.append(" lowjg.fname_l2 lowJobGrade, ");
  187. sql.append(" highjg.fname_l2 highJobGrade, ");
  188. sql.append(" lowjl.fname_l2 lowJobLevel, ");
  189. sql.append(" highjl.fname_l2 highJobLevel, ");
  190. sql.append(" pos.cfeducation education, ");
  191. sql.append(" pos.cfrequirement requirement, ");
  192. sql.append(" pos.cfcertification certification, ");
  193. sql.append(" pos.cfforeignLang foreignLang, ");
  194. sql.append(" pos.cfknowledge knowledge, ");
  195. sql.append(" pos.cfskills skills, ");
  196. sql.append(" pos.cfexperience experience, ");
  197. sql.append(" pos.cfcoreCompe coreCompe, ");
  198. sql.append(" pos.cfposition1 position1, ");
  199. sql.append(" pos.cfptime1 ptime1, ");
  200. sql.append(" pos.cfposition2 position2, ");
  201. sql.append(" pos.cfptime2 ptime2, ");
  202. sql.append(" workAdd.fnumber workAdd, ");
  203. sql.append(" pos.CFFrequency frequency, ");
  204. sql.append(" pos.cfjobRespon jobRespon, ");
  205. sql.append(" pos.cfqualifications qualifications, ");
  206. sql.append(" pos.cfreserved1 reserved1, ");
  207. sql.append(" pos.cfreserved2 reserved2, ");
  208. sql.append(" pos.cfreserved3 reserved3, ");
  209. sql.append(" pos.cfreserved4 reserved4, ");
  210. sql.append(" redf.FNumber reserved5, ");
  211. sql.append(" posp.CFOriginalId pospOriginalId1, ");
  212. sql.append(" posp.CFOriginalId pospOriginalId2, ");
  213. sql.append(" '' ");
  214. sql.append(" from ");
  215. sql.append(" t_org_position pos ");
  216. sql.append(" left join t_org_admin org on pos.FADMINORGUNITID = org.fid ");
  217. sql.append(" left join CT_CUS_WorkAdd workAdd on workAdd.fid=pos.CFWorkAddID ");
  218. sql.append(" left join T_ORG_Job orgjob on orgjob.fid=pos.fjobid ");
  219. sql.append(" left join T_HR_HRJob job on job.FjobID = orgjob.fid ");
  220. sql.append(" left join T_HR_POSITIONEXTEND posex on posex.FPositionID=pos.fid ");
  221. sql.append(" left join T_HR_HRJobFamily jobf on jobf.fid = job.FHRJobFamilyID ");
  222. sql.append(" left join T_HR_HRJobCategory jobc on jobc.fid = job.FHRJobCategoryID ");
  223. sql.append(" left join T_HR_HRJobSubCategory jobsc on jobsc.fid=job.FHRJobSubCategoryID ");
  224. sql.append(" left join T_HR_JobGrade lowjg on lowjg.fid = pos.FLowJobGradeID ");
  225. sql.append(" left join T_HR_JobGrade highjg on highjg.fid = pos.FHighJobGradeID ");
  226. sql.append(" left join T_HR_JobLevel lowjl on lowjl.fid=posex.FLowJobLevel ");
  227. sql.append(" left join T_HR_JobLevel highjl on highjl.fid=posex.FHighJobLevel ");
  228. sql.append(" left join t_org_position posp on posp.fid=pos.FPARENTID ");
  229. sql.append(" left join CT_CUS_ReservedField redf on redf.fid=pos.CFReserved5ID ");
  230. sql.append(" where 1=1 ");
  231. if(StringUtils.isNotBlank(posId)){
  232. String[] posIds=posId.split(",");
  233. sql.append(" and pos.fid in('' ");
  234. for(String id : posIds){
  235. sql.append(",'");
  236. sql.append(id);
  237. sql.append("'");
  238. }
  239. sql.append(") ");
  240. }
  241. if(StringUtils.isNotBlank(syncStartTimeStr)){
  242. sql.append(" and pos.FLastUpdateTime >='"+syncStartTimeStr+"'");
  243. }
  244. if(StringUtils.isNotBlank(syncEndTimeStr)){
  245. sql.append(" and pos.FLastUpdateTime <='"+syncEndTimeStr+"'");
  246. }
  247. if(isAddNew){
  248. sql.append(" and (pos.CFOriginalId is null or pos.CFOriginalId ='')");
  249. }else {
  250. sql.append(" and (pos.CFOriginalId is not null and pos.CFOriginalId !='')");
  251. }
  252. return sql;
  253. }
  254. protected List<JSONObject> _sendAddNewPosToBeisen(Context ctx,Map<String,String> keyMap, String posId, String syncStartTimeStr, String syncEndTimeStr) throws BOSException, SQLException, IOException, URISyntaxException {
  255. BeiSenUtils b = new BeiSenUtils(ctx);
  256. Helper helper = b.helper;
  257. StringBuilder sql = this.getSql(posId, syncStartTimeStr, syncEndTimeStr, true);
  258. List<Map<String, Object>> list = this.getPostData(ctx, keyMap, sql);
  259. List<JSONObject> responseList = Lists.newArrayList();
  260. for (Map<String, Object> pos : list) {
  261. // 获取访问令牌
  262. String token = b.getAccessToken();
  263. // 若访问令牌不为空且开始时间和结束时间不为空
  264. if (!com.kingdee.util.StringUtils.isEmpty(token)) {
  265. // 创建请求头的 Map
  266. Map<String, String> header = new HashMap<String, String>();
  267. // 设置请求头的 Content-Type
  268. header.put("Content-Type", "application/json");
  269. // 设置请求头的 Authorization
  270. header.put("Authorization", "Bearer " + token);
  271. String url = "https://openapi.italent.cn/RecruitV6/api/v1/RecruitOnBoarding/CreatePost";
  272. JSONObject requestBody = new JSONObject(pos);
  273. System.out.println("url:" + url);
  274. System.out.println("requestBody:" + requestBody);
  275. JSONObject responseJson = helper.getURL(url, header, requestBody, "POST", requestBody.getString("posId"), "创建", "北森");
  276. System.out.println("responseJson:" + responseJson);
  277. Integer code = responseJson.getInteger("code");
  278. if(200==code){
  279. String data = responseJson.getString("data");
  280. String posId1 = requestBody.getString("posId");
  281. DbUtil.execute(ctx,"update t_org_position set CFOriginalId = ? where fid=?",new String[]{data,posId1});
  282. }
  283. responseList.add(responseJson);
  284. }
  285. }
  286. return responseList;
  287. }
  288. protected List<JSONObject> _sendEditPosToBeisen(Context ctx,Map<String,String> keyMap, String posId, String syncStartTimeStr, String syncEndTimeStr) throws BOSException, SQLException, IOException, URISyntaxException {
  289. BeiSenUtils b = new BeiSenUtils(ctx);
  290. Helper helper = b.helper;
  291. StringBuilder sql1 = this.getSql(posId,syncStartTimeStr,syncEndTimeStr,false);
  292. List<Map<String,Object>> list1 = this.getPostData(ctx,keyMap,sql1);
  293. List<JSONObject> responseList = Lists.newArrayList();
  294. // 获取访问令牌
  295. String token = b.getAccessToken();
  296. for(Map<String,Object> pos : list1){
  297. // 若访问令牌不为空且开始时间和结束时间不为空
  298. if (!com.kingdee.util.StringUtils.isEmpty(token)) {
  299. // 创建请求头的 Map
  300. Map<String, String> header = new HashMap<String, String>();
  301. // 设置请求头的 Content-Type
  302. header.put("Content-Type", "application/json");
  303. // 设置请求头的 Authorization
  304. header.put("Authorization", "Bearer " + token);
  305. String url = "https://openapi.italent.cn/RecruitV6/api/v1/RecruitOnBoarding/UpdatePost";
  306. JSONObject requestBody = new JSONObject(pos);
  307. System.out.println("url:"+url);
  308. System.out.println("requestBody:"+requestBody);
  309. JSONObject responseJson = helper.getURL(url,header, requestBody, "PUT",requestBody.getString("posId"),"更新","北森");
  310. System.out.println("responseJson:"+responseJson);
  311. responseList.add(responseJson);
  312. }
  313. }
  314. return responseList;
  315. }
  316. }