SynchronousPosOSFService.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. package 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. }else {
  137. String valueStr = rowSet.getString(shrKey);
  138. if(beisenKey.indexOf(",")>0) {
  139. String[] beisenKeys = beisenKey.split(",");
  140. Object value = null;
  141. if("integer".equals(beisenKeys[1])){
  142. if(null!=valueStr){
  143. value=Integer.parseInt(valueStr);
  144. }
  145. }else {
  146. value = valueStr;
  147. }
  148. if(null!=value) {
  149. pos.put(beisenKeys[0],value);
  150. }
  151. }else {
  152. if(null!=valueStr) {
  153. pos.put(beisenKey,valueStr);
  154. }
  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.fname_l2 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(" pos.cfreserved5 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_HR_HRJob job on job.FID = pos.FJOBID ");
  219. sql.append(" left join T_HR_HRJobFamily jobf on jobf.fid = job.FHRJobFamilyID ");
  220. sql.append(" left join T_HR_HRJobCategory jobc on jobc.fid = job.FHRJobCategoryID ");
  221. sql.append(" left join T_HR_HRJobSubCategory jobsc on jobsc.fid=job.FHRJobSubCategoryID ");
  222. sql.append(" left join T_HR_JobGrade lowjg on lowjg.fid = job.FLowJobGradeID ");
  223. sql.append(" left join T_HR_JobGrade highjg on highjg.fid = job.FHighJobGradeID ");
  224. sql.append(" left join T_HR_JobLevel lowjl on lowjl.fid=job.FLowJobLevelID ");
  225. sql.append(" left join T_HR_JobLevel highjl on highjl.fid=job.FHighJobLevelID ");
  226. sql.append(" left join t_org_position posp on posp.fid=pos.FPARENTID ");
  227. sql.append(" where 1=1 ");
  228. if(StringUtils.isNotBlank(posId)){
  229. String[] posIds=posId.split(",");
  230. sql.append(" and pos.fid in('' ");
  231. for(String id : posIds){
  232. sql.append(",'");
  233. sql.append(id);
  234. sql.append("'");
  235. }
  236. sql.append(") ");
  237. }
  238. if(StringUtils.isNotBlank(syncStartTimeStr)){
  239. sql.append(" and pos.FLastUpdateTime >='"+syncStartTimeStr+"'");
  240. }
  241. if(StringUtils.isNotBlank(syncEndTimeStr)){
  242. sql.append(" and pos.FLastUpdateTime <='"+syncEndTimeStr+"'");
  243. }
  244. if(isAddNew){
  245. sql.append(" and (pos.CFOriginalId is null or pos.CFOriginalId ='')");
  246. }else {
  247. sql.append(" and (pos.CFOriginalId is not null and pos.CFOriginalId !='')");
  248. }
  249. return sql;
  250. }
  251. protected List<JSONObject> _sendAddNewPosToBeisen(Context ctx,Map<String,String> keyMap, String posId, String syncStartTimeStr, String syncEndTimeStr) throws BOSException, SQLException, IOException, URISyntaxException {
  252. BeiSenUtils b = new BeiSenUtils(ctx);
  253. Helper helper = b.helper;
  254. StringBuilder sql = this.getSql(posId, syncStartTimeStr, syncEndTimeStr, true);
  255. List<Map<String, Object>> list = this.getPostData(ctx, keyMap, sql);
  256. List<JSONObject> responseList = Lists.newArrayList();
  257. for (Map<String, Object> pos : list) {
  258. // 获取访问令牌
  259. String token = b.getAccessToken();
  260. // 若访问令牌不为空且开始时间和结束时间不为空
  261. if (!com.kingdee.util.StringUtils.isEmpty(token)) {
  262. // 创建请求头的 Map
  263. Map<String, String> header = new HashMap<String, String>();
  264. // 设置请求头的 Content-Type
  265. header.put("Content-Type", "application/json");
  266. // 设置请求头的 Authorization
  267. header.put("Authorization", "Bearer " + token);
  268. String url = "https://openapi.italent.cn/RecruitV6/api/v1/RecruitOnBoarding/CreatePost";
  269. JSONObject requestBody = new JSONObject(pos);
  270. System.out.println("url:" + url);
  271. System.out.println("requestBody:" + requestBody);
  272. JSONObject responseJson = helper.getURL(url, header, requestBody, "POST", "", "创建", "北森");
  273. System.out.println("responseJson:" + responseJson);
  274. responseList.add(responseJson);
  275. }
  276. }
  277. return responseList;
  278. }
  279. protected List<JSONObject> _sendEditPosToBeisen(Context ctx,Map<String,String> keyMap, String posId, String syncStartTimeStr, String syncEndTimeStr) throws BOSException, SQLException, IOException, URISyntaxException {
  280. BeiSenUtils b = new BeiSenUtils(ctx);
  281. Helper helper = b.helper;
  282. StringBuilder sql1 = this.getSql(posId,syncStartTimeStr,syncEndTimeStr,false);
  283. List<Map<String,Object>> list1= this.getPostData(ctx,keyMap,sql1);
  284. List<JSONObject> responseList = Lists.newArrayList();
  285. for(Map<String,Object> pos : list1){
  286. // 获取访问令牌
  287. String token = b.getAccessToken();
  288. // 若访问令牌不为空且开始时间和结束时间不为空
  289. if (!com.kingdee.util.StringUtils.isEmpty(token)) {
  290. // 创建请求头的 Map
  291. Map<String, String> header = new HashMap<String, String>();
  292. // 设置请求头的 Content-Type
  293. header.put("Content-Type", "application/json");
  294. // 设置请求头的 Authorization
  295. header.put("Authorization", "Bearer " + token);
  296. String url = "https://openapi.italent.cn/RecruitV6/api/v1/RecruitOnBoarding/CreatePost";
  297. JSONObject requestBody = new JSONObject(pos);
  298. System.out.println("url:"+url);
  299. System.out.println("requestBody:"+requestBody);
  300. JSONObject responseJson = helper.getURL(url,header, requestBody, "PUT",requestBody.getString("id"),"更新","北森");
  301. System.out.println("responseJson:"+responseJson);
  302. responseList.add(responseJson);
  303. }
  304. }
  305. return responseList;
  306. }
  307. }