package com.kingdee.eas.custom.beisen.synchronouspos.osf; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Maps; import com.kingdee.bos.BOSException; import com.kingdee.bos.Context; import com.kingdee.bos.bsf.service.app.IHRMsfService; import com.kingdee.bos.rabbitmq.guava.Lists; import com.kingdee.eas.common.EASBizException; import com.kingdee.eas.custom.beisen.utils.BeiSenUtils; import com.kingdee.eas.custom.beisen.utils.BeisenParamByPropertiesUtil; import com.kingdee.eas.custom.beisen.utils.Helper; import com.kingdee.eas.util.app.DbUtil; import com.kingdee.jdbc.rowset.IRowSet; import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.net.URISyntaxException; import java.net.URLEncoder; import java.sql.Date; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** * description: SynchronousPosOSFService
* date: 2025/7/11 17:46
* author: lhbj
* version: 1.0
*/ public class SynchronousPosOSFService implements IHRMsfService { @Override public Object process(Context context, Map map) throws EASBizException, BOSException { //例:/server/properties/beisen/posConfig.properties String path = (String) map.get("path"); String posId = (String) map.get("posId"); String syncStartTimeStr = (String) map.get("syncStartTimeStr"); String syncEndTimeStr = (String) map.get("syncEndTimeStr"); try { BeisenParamByPropertiesUtil util = new BeisenParamByPropertiesUtil(path); Map keyMap = util.getConfig(); return this._syncPosToBeiSen(context,keyMap,posId,syncStartTimeStr,syncEndTimeStr); } catch (IOException e) { e.printStackTrace(); } catch (SQLException throwables) { throwables.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } return null; } protected String _syncPosToBeiSen(Context ctx,Map keyMap, String posId, String syncStartTimeStr, String syncEndTimeStr) throws BOSException, SQLException, IOException, URISyntaxException { List responseList =Lists.newArrayList(); List addNewList = this._sendAddNewPosToBeisen(ctx,keyMap,posId,syncStartTimeStr,syncEndTimeStr); responseList.addAll(addNewList); List editList = this._sendEditPosToBeisen(ctx,keyMap,posId,syncStartTimeStr,syncEndTimeStr); responseList.addAll(editList); return responseList.toString(); } /** * shr系统数据组装北森请求参数 * * @param ctx * @param keyMap * @param sql * @return * @throws BOSException * @throws SQLException */ protected List> getPostData(Context ctx,Map keyMap,StringBuilder sql) throws BOSException, SQLException { IRowSet rowSet = DbUtil.executeQuery(ctx,sql.toString()); List> posList = Lists.newArrayList(); while (rowSet.next()){ Map pos = Maps.newHashMap(); for(Map.Entry entry : keyMap.entrySet()){ String shrKey = entry.getKey(); String beisenKey = entry.getValue(); if(shrKey.indexOf(".")>0){ String[] keys=shrKey.split("\\."); if(2==keys.length){ Map map1 = (Map) pos.get(keys[0]); if(null==map1){ map1=Maps.newHashMap(); pos.put(keys[0],map1); } String valueStr = rowSet.getString(keys[1]); if(beisenKey.indexOf(",")>0) { String[] beisenKeys = beisenKey.split(","); Object value = null; if("integer".equals(beisenKeys[1])){ if(null!=valueStr){ value=Integer.parseInt(valueStr); } }else { value = valueStr; } if(null!=value) { map1.put(beisenKeys[0], value); } }else { if(null!=valueStr) { map1.put(beisenKey, valueStr); } } }else if (3==keys.length){ Map map1 = (Map) pos.get(keys[0]); if(null==map1){ map1=Maps.newHashMap(); pos.put(keys[0],map1); } Map map2 = (Map) map1.get(keys[1]); if(null==map2){ map2=Maps.newHashMap(); map1.put(keys[1],map1); } String valueStr = rowSet.getString(keys[2]); if(beisenKey.indexOf(",")>0) { String[] beisenKeys = beisenKey.split(","); Object value = null; if("integer".equals(beisenKeys[1])){ if(null!=valueStr){ value=Integer.parseInt(valueStr); } }else { value = valueStr; } if(null!=value) { map2.put(beisenKeys[0], value); } }else { if(null!=valueStr) { map2.put(beisenKey,valueStr); } } } }else { String valueStr = rowSet.getString(shrKey); if(beisenKey.indexOf(",")>0) { String[] beisenKeys = beisenKey.split(","); Object value = null; if("integer".equals(beisenKeys[1])){ if(null!=valueStr){ value=Integer.parseInt(valueStr); } }else { value = valueStr; } if(null!=value) { pos.put(beisenKeys[0],value); } }else { if(null!=valueStr) { pos.put(beisenKey,valueStr); } } } } posList.add(pos); } return posList; } public StringBuilder getSql(String posId,String syncStartTimeStr, String syncEndTimeStr,Boolean isAddNew){ StringBuilder sql = new StringBuilder(); sql.append(" "); sql.append(" select "); sql.append(" pos.fid posId, "); sql.append(" pos.CFOriginalId posOriginalId, "); sql.append(" pos.fnumber posNumber, "); sql.append(" pos.fname_l2 posName, "); sql.append(" org.fid orgId, "); sql.append(" org.CFOriginalId orgOriginalId, "); sql.append(" org.fnumber orgNumber, "); sql.append(" org.fname_l2 orgName, "); sql.append(" (case when pos.FDELETEDSTATUS=2 then 0 else 1 end) posDeletedStatus, "); sql.append(" pos.cfzwjzygx posZwjzygx, "); sql.append(" pos.cfzyzz posZyzz, "); sql.append(" pos.cfgwdwsccg posGwdwsccg, "); sql.append(" pos.cfcgzb posCgzb, "); sql.append(" pos.cfzlzb posZlzb, "); sql.append(" jobf.fname_l2 hrJobFamily, "); sql.append(" jobc.fname_l2 hrJobCategory, "); sql.append(" jobsc.fname_l2 jobscHrJobSubCategory, "); sql.append(" job.fnumber jobNumber, "); sql.append(" job.fname_l2 jobName, "); sql.append(" lowjg.fname_l2 lowJobGrade, "); sql.append(" highjg.fname_l2 highJobGrade, "); sql.append(" lowjl.fname_l2 lowJobLevel, "); sql.append(" highjl.fname_l2 highJobLevel, "); sql.append(" pos.cfeducation education, "); sql.append(" pos.cfrequirement requirement, "); sql.append(" pos.cfcertification certification, "); sql.append(" pos.cfforeignLang foreignLang, "); sql.append(" pos.cfknowledge knowledge, "); sql.append(" pos.cfskills skills, "); sql.append(" pos.cfexperience experience, "); sql.append(" pos.cfcoreCompe coreCompe, "); sql.append(" pos.cfposition1 position1, "); sql.append(" pos.cfptime1 ptime1, "); sql.append(" pos.cfposition2 position2, "); sql.append(" pos.cfptime2 ptime2, "); sql.append(" workAdd.fnumber workAdd, "); sql.append(" pos.CFFrequency frequency, "); sql.append(" pos.cfjobRespon jobRespon, "); sql.append(" pos.cfqualifications qualifications, "); sql.append(" pos.cfreserved1 reserved1, "); sql.append(" pos.cfreserved2 reserved2, "); sql.append(" pos.cfreserved3 reserved3, "); sql.append(" pos.cfreserved4 reserved4, "); sql.append(" redf.FNumber reserved5, "); sql.append(" posp.CFOriginalId pospOriginalId1, "); sql.append(" posp.CFOriginalId pospOriginalId2, "); sql.append(" '' "); sql.append(" from "); sql.append(" t_org_position pos "); sql.append(" left join t_org_admin org on pos.FADMINORGUNITID = org.fid "); sql.append(" left join CT_CUS_WorkAdd workAdd on workAdd.fid=pos.CFWorkAddID "); sql.append(" left join T_ORG_Job orgjob on orgjob.fid=pos.fjobid "); sql.append(" left join T_HR_HRJob job on job.FjobID = orgjob.fid "); sql.append(" left join T_HR_POSITIONEXTEND posex on posex.FPositionID=pos.fid "); sql.append(" left join T_HR_HRJobFamily jobf on jobf.fid = job.FHRJobFamilyID "); sql.append(" left join T_HR_HRJobCategory jobc on jobc.fid = job.FHRJobCategoryID "); sql.append(" left join T_HR_HRJobSubCategory jobsc on jobsc.fid=job.FHRJobSubCategoryID "); sql.append(" left join T_HR_JobGrade lowjg on lowjg.fid = pos.FLowJobGradeID "); sql.append(" left join T_HR_JobGrade highjg on highjg.fid = pos.FHighJobGradeID "); sql.append(" left join T_HR_JobLevel lowjl on lowjl.fid=posex.FLowJobLevel "); sql.append(" left join T_HR_JobLevel highjl on highjl.fid=posex.FHighJobLevel "); sql.append(" left join t_org_position posp on posp.fid=pos.FPARENTID "); sql.append(" left join CT_CUS_ReservedField redf on redf.fid=pos.CFReserved5ID "); sql.append(" where 1=1 "); if(StringUtils.isNotBlank(posId)){ String[] posIds=posId.split(","); sql.append(" and pos.fid in('' "); for(String id : posIds){ sql.append(",'"); sql.append(id); sql.append("'"); } sql.append(") "); } if(StringUtils.isNotBlank(syncStartTimeStr)){ sql.append(" and pos.FLastUpdateTime >='"+syncStartTimeStr+"'"); } if(StringUtils.isNotBlank(syncEndTimeStr)){ sql.append(" and pos.FLastUpdateTime <='"+syncEndTimeStr+"'"); } if(isAddNew){ sql.append(" and (pos.CFOriginalId is null or pos.CFOriginalId ='')"); }else { sql.append(" and (pos.CFOriginalId is not null and pos.CFOriginalId !='')"); } return sql; } protected List _sendAddNewPosToBeisen(Context ctx,Map keyMap, String posId, String syncStartTimeStr, String syncEndTimeStr) throws BOSException, SQLException, IOException, URISyntaxException { BeiSenUtils b = new BeiSenUtils(ctx); Helper helper = b.helper; StringBuilder sql = this.getSql(posId, syncStartTimeStr, syncEndTimeStr, true); List> list = this.getPostData(ctx, keyMap, sql); List responseList = Lists.newArrayList(); for (Map pos : list) { // 获取访问令牌 String token = b.getAccessToken(); // 若访问令牌不为空且开始时间和结束时间不为空 if (!com.kingdee.util.StringUtils.isEmpty(token)) { // 创建请求头的 Map Map header = new HashMap(); // 设置请求头的 Content-Type header.put("Content-Type", "application/json"); // 设置请求头的 Authorization header.put("Authorization", "Bearer " + token); String url = "https://openapi.italent.cn/RecruitV6/api/v1/RecruitOnBoarding/CreatePost"; JSONObject requestBody = new JSONObject(pos); System.out.println("url:" + url); System.out.println("requestBody:" + requestBody); JSONObject responseJson = helper.getURL(url, header, requestBody, "POST", requestBody.getString("posId"), "创建", "北森"); System.out.println("responseJson:" + responseJson); Integer code = responseJson.getInteger("code"); if(200==code){ String data = responseJson.getString("data"); String posId1 = requestBody.getString("posId"); DbUtil.execute(ctx,"update t_org_position set CFOriginalId = ? where fid=?",new String[]{data,posId1}); } responseList.add(responseJson); } } return responseList; } protected List _sendEditPosToBeisen(Context ctx,Map keyMap, String posId, String syncStartTimeStr, String syncEndTimeStr) throws BOSException, SQLException, IOException, URISyntaxException { BeiSenUtils b = new BeiSenUtils(ctx); Helper helper = b.helper; StringBuilder sql1 = this.getSql(posId,syncStartTimeStr,syncEndTimeStr,false); List> list1 = this.getPostData(ctx,keyMap,sql1); List responseList = Lists.newArrayList(); // 获取访问令牌 String token = b.getAccessToken(); for(Map pos : list1){ // 若访问令牌不为空且开始时间和结束时间不为空 if (!com.kingdee.util.StringUtils.isEmpty(token)) { // 创建请求头的 Map Map header = new HashMap(); // 设置请求头的 Content-Type header.put("Content-Type", "application/json"); // 设置请求头的 Authorization header.put("Authorization", "Bearer " + token); String url = "https://openapi.italent.cn/RecruitV6/api/v1/RecruitOnBoarding/UpdatePost"; JSONObject requestBody = new JSONObject(pos); System.out.println("url:"+url); System.out.println("requestBody:"+requestBody); JSONObject responseJson = helper.getURL(url,header, requestBody, "PUT",requestBody.getString("posId"),"更新","北森"); System.out.println("responseJson:"+responseJson); responseList.add(responseJson); } } return responseList; } }