Browse Source

更新编制数量同步

zqy 5 tháng trước cách đây
mục cha
commit
481bcac549

+ 12 - 0
properties/orgStaffConfig.properties

@@ -0,0 +1,12 @@
+posId=posId
+CFOriginalId=id
+staffName=staffName
+orgPosName=Name
+customProperties.FControlWay=extkongzhifangshi_433107_345852799
+customProperties.FPersonCount=extdangqianrenshu_433107_835858111,integer
+customProperties.FStaffYear=extdingbianrenshu_433107_457054722,integer
+customProperties.FYearActualStart=extqichurenshu_433107_1123968904,integer
+customProperties.FOnWayAddCount=extzaituliuru_433107_122108948,integer
+customProperties.FOnWaySubCount=extzaituliuchu_433107_614386617,integer
+customProperties.FStaffYearUsable=extkeyongbianzhi_433107_821499516,integer
+customProperties.FState=extzhuangtai_433107_1327792430

+ 43 - 0
properties/posConfig.properties

@@ -0,0 +1,43 @@
+customProperties.posNumber=extgangweibianma_433107_380359134
+orgOriginalId=Org,integer
+posId=posId
+posName=Name
+posOriginalId=id
+#pospOriginalId1=upManage,integer
+#pospOriginalId2=dotManage,integer
+posDeletedStatus=status,integer
+customProperties.posZwjzygx=extzhiweijiazhiyugongxian_433107_832609725
+customProperties.posZyzz=extzhuyaozhize_433107_1869816037
+customProperties.posGwdwsccg=extzhiweiduiwaijiaofuchengguo_433107_848485055
+customProperties.posCgzb=extchengguodezhibiao_433107_672018534
+customProperties.posZlzb=extzhiliangzhibiao_433107_1153480133
+customProperties.hrJobFamily=extzhiweizu_433107_1497123321
+customProperties.hrJobCategory=extzhiweilei_433107_1088618169
+customProperties.jobscHrJobSubCategory=extzhiweizilei_433107_1602866242
+customProperties.jobNumber=extzhiweibianma_433107_1290712431
+customProperties.jobName=extzhiweimingcheng_433107_512846676
+customProperties.lowJobLevel=extzuidizhiceng_433107_355678147
+customProperties.highJobLevel=extzuigaozhiceng_433107_174877615
+customProperties.lowJobGrade=extzuigaozhiji_433107_2045773973
+customProperties.highJobGrade=extzuidizhiji_433107_1385945899
+customProperties.education=extjiaoyushuiping_433107_1951575537
+customProperties.requirement=extzhuanyeyaoqiu_433107_1776687243
+customProperties.certification=extzigezhengshu_433107_1510044483
+customProperties.foreignLang=extwaiyuyaoqiu_433107_1249481814
+customProperties.knowledge=extzhishi_433107_641379677
+customProperties.skills=extjineng_433107_956614495
+customProperties.experience=extjingyan_433107_295083920
+customProperties.coreCompe=extguanjiansuzhi_433107_1844176444
+customProperties.position1=extgangwei1_433107_1257343019
+customProperties.ptime1=extshijian_433107_1542482809
+customProperties.position2=extgangwei2_433107_1926360484
+customProperties.ptime2=extshijian2_433107_2055690495
+customProperties.workAdd=extgongzuodidian_433107_1073710237
+customProperties.frequency=extchuchapinlu_433107_902126115
+customProperties.jobRespon=extgongzuozhize_433107_1005575449
+customProperties.qualifications=extrenzhizige_433107_1814678007
+customProperties.reserved1=extyuliuziduan1_433107_1429210295
+customProperties.reserved2=extyuliuziduan2_433107_1906458378
+customProperties.reserved3=extyuliuziduan3_433107_1446014427
+customProperties.reserved4=extyuliuziduan4_433107_785068249
+customProperties.reserved5=extyuliuziduan5_433107_2140944373

+ 12 - 0
properties/posStaffConfig.properties

@@ -0,0 +1,12 @@
+posId=posId
+CFOriginalId=id
+staffName=staffName
+orgPosName=Name
+customProperties.FControlWay=extkongzhifangshi_433107_1749927714
+customProperties.FPersonCount=extdangqianrenshu_433107_353309291,integer
+customProperties.FStaffYear=extdingbianrenshu_433107_1066638704,integer
+customProperties.FYearActualStart=extqichurenshu_433107_694651189,integer
+customProperties.FOnWayAddCount=extzaituliuru_433107_1824855468,integer
+customProperties.FOnWaySubCount=extzaituliuchu_433107_323381103,integer
+customProperties.FStaffYearUsable=extkeyongbianzhi_433107_767442239,integer
+customProperties.FState=extzhuangtai_433107_674860266

+ 49 - 2
src/com/kingdee/eas/custom/beisen/synchronouspos/SynchronousPosFacadeControllerBean.java

@@ -24,6 +24,8 @@ import com.kingdee.bos.service.ServiceContext;
 import com.kingdee.bos.service.IServiceContext;
 
 import java.lang.String;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
 import java.util.Map;
 
 public class SynchronousPosFacadeControllerBean extends AbstractSynchronousPosFacadeControllerBean
@@ -33,13 +35,27 @@ public class SynchronousPosFacadeControllerBean extends AbstractSynchronousPosFa
 
     @Override
     protected String _syncPosToBeiSen(Context ctx, String posId, String syncStartTimeStr, String syncEndTimeStr) throws BOSException {
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
         super._syncPosToBeiSen(ctx, posId, syncStartTimeStr, syncEndTimeStr);
         Object obj=null;
         try {
             Map<String, Object> map = Maps.newHashMap();
             map.put("posId",posId);
-            map.put("syncStartTimeStr","syncStartTimeStr");
-            map.put("syncEndTimeStr","syncEndTimeStr");
+            if(!StringUtils.isNotBlank(posId)) {
+                if (StringUtils.isNotBlank(syncStartTimeStr)) {
+                    map.put("syncStartTimeStr", syncStartTimeStr);
+                } else if (StringUtils.isNotBlank(syncEndTimeStr)) {
+                    map.put("syncEndTimeStr", syncEndTimeStr);
+                } else {
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.add(Calendar.DAY_OF_MONTH, 1);
+                    syncEndTimeStr = sf.format(calendar.getTime());
+                    calendar.add(Calendar.DAY_OF_MONTH, -2);
+                    syncStartTimeStr = sf.format(calendar.getTime());
+                    map.put("syncStartTimeStr", syncStartTimeStr);
+                    map.put("syncEndTimeStr", syncEndTimeStr);
+                }
+            }
             obj = MSFServiceFacadeFactory.getLocalInstance(ctx).processService("synchronousPosOSF", map);
         }catch (Exception e){
             e.printStackTrace();
@@ -54,9 +70,25 @@ public class SynchronousPosFacadeControllerBean extends AbstractSynchronousPosFa
         super._sendAddNewPosToBeisen(ctx, jsonStr);
         Object obj=null;
         try {
+
             JSONObject jsonObject = JSON.parseObject(jsonStr);
             Map<String, Object> map = Maps.newHashMap();
             map.putAll(jsonObject);
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
+            String syncStartTimeStr= (String) map.get("syncStartTimeStr");
+            String syncEndTimeStr= (String) map.get("syncEndTimeStr");
+            if(StringUtils.isNotBlank(syncStartTimeStr)) {
+                map.put("syncStartTimeStr", syncStartTimeStr);
+            }else if(StringUtils.isNotBlank(syncEndTimeStr)){
+                map.put("syncEndTimeStr", syncEndTimeStr);
+            }else {
+                Calendar calendar = Calendar.getInstance();
+                syncEndTimeStr=sf.format(calendar.getTime());
+                calendar.add(Calendar.DAY_OF_MONTH,-1);
+                syncStartTimeStr= sf.format(calendar.getTime());
+                map.put("syncStartTimeStr", syncStartTimeStr);
+                map.put("syncEndTimeStr", syncEndTimeStr);
+            }
             obj = MSFServiceFacadeFactory.getLocalInstance(ctx).processService("synchronousPosOSF", map);
         }catch (Exception e){
             e.printStackTrace();
@@ -72,6 +104,21 @@ public class SynchronousPosFacadeControllerBean extends AbstractSynchronousPosFa
             JSONObject jsonObject = JSON.parseObject(jsonStr);
             Map<String, Object> map = Maps.newHashMap();
             map.putAll(jsonObject);
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
+            String syncStartTimeStr= (String) map.get("syncStartTimeStr");
+            String syncEndTimeStr= (String) map.get("syncEndTimeStr");
+            if(StringUtils.isNotBlank(syncStartTimeStr)) {
+                map.put("syncStartTimeStr", syncStartTimeStr);
+            }else if(StringUtils.isNotBlank(syncEndTimeStr)){
+                map.put("syncEndTimeStr", syncEndTimeStr);
+            }else {
+                Calendar calendar = Calendar.getInstance();
+                syncEndTimeStr=sf.format(calendar.getTime());
+                calendar.add(Calendar.DAY_OF_MONTH,-1);
+                syncStartTimeStr= sf.format(calendar.getTime());
+                map.put("syncStartTimeStr", syncStartTimeStr);
+                map.put("syncEndTimeStr", syncEndTimeStr);
+            }
             obj = MSFServiceFacadeFactory.getLocalInstance(ctx).processService("synchronousPosOSF", map);
         }catch (Exception e){
             e.printStackTrace();

+ 110 - 0
websrc/com/kingdee/eas/custom/beisen/synchronouspos/handler/PositionListHandlerEx.java

@@ -0,0 +1,110 @@
+package com.kingdee.eas.custom.beisen.synchronouspos.handler;
+
+import com.google.common.collect.Maps;
+import com.kingdee.bos.Context;
+import com.kingdee.eas.hr.org.OrgnizationBizException;
+import com.kingdee.shr.base.syssetting.MSFServiceFacadeFactory;
+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.ml.SHRWebResource;
+import com.kingdee.util.StringUtils;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Map;
+
+/**
+ * description: PositionListHandlerEx <br>
+ * date: 2025/7/18 10:07 <br>
+ * author: lhbj <br>
+ * version: 1.0 <br>
+ */
+public class PositionListHandlerEx extends com.kingdee.eas.hr.org.web.handler.PositionListHandler {
+    private String multilingual(String key) {
+        return SHRWebResource.getString("com.kingdee.eas.hr.org.OrganisationBizResource", key);
+    }
+
+    @RequestMapping(
+            params = {"method=syncEnable"}
+    )
+    public String syncEnableAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
+        String billIds = this.getPosBillId(request);
+
+        Object obj = null;
+        try {
+            Context ctx = SHRContext.getInstance().getContext();
+            int successCount = 0;
+            int errorCount = 0;
+            BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader();
+            if (billIds.length() > 0) {
+                String[] ids = billIds.split(",");
+                int i = 0;
+
+                for (int size = ids.length; i < size; ++i) {
+                    BatchMessageTipsBody body = new BatchMessageTipsBody();
+                    body.setId(ids[i]);
+                    try {
+                        Map<String, Object> map = Maps.newHashMap();
+                        map.put("posId", ids[i]);
+                        if (org.apache.commons.lang3.StringUtils.isNotBlank(billIds)) {
+                            obj = MSFServiceFacadeFactory.getLocalInstance(ctx).processService("synchronousPosOSF", map);
+                            body.setMuitTipsState(Boolean.TRUE);
+                            body.setMuitTipsMessage(obj.toString());
+                            ++successCount;
+                        }
+                    } catch (Exception var15) {
+                        var15.printStackTrace();
+                        body.setMuitTipsState(Boolean.FALSE);
+                        body.setMuitTipsMessage("" + SHRWebResource.getString("com.kingdee.eas.hr.base.BaseBizResourse", "Operation_failed") + ":" + this.translateErrorMsg(var15.getMessage()));
+                        ++errorCount;
+                        batchMessageTipsHeader.addResult(body);
+                        continue;
+                    }
+                    batchMessageTipsHeader.addResult(body);
+                }
+            }
+            batchMessageTipsHeader.setBillId(billIds);
+            batchMessageTipsHeader.setFailureCount(errorCount);
+            batchMessageTipsHeader.setSuccessCount(successCount);
+            this.writeSuccessData(batchMessageTipsHeader);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    private String translateErrorMsg(String msg) {
+        if ("POS_NAME_DUPLICATE".equals(msg)) {
+            msg = this.multilingual("ExistEnabledSameNamePositonUnderOneAdminOrg");
+        } else if ("EXIST_PRE_POSITION".equals(msg)) {
+            msg = this.multilingual("CannotEnableLowerPositionBecauseSuperiorPositionForbiddenStatus");
+        } else if (msg != null && msg.indexOf(this.multilingual("DataAlreadyQuotedOperationFailed")) > 0) {
+            msg = this.multilingual("DataAlreadyQuotedOperationFailed");
+        }
+
+        return msg;
+    }
+
+    private String getPosBillId(HttpServletRequest request) throws ShrWebBizException {
+        String billId = "";
+
+        try {
+            billId = super.getBillId(request);
+        } catch (SHRWebException var4) {
+            var4.printStackTrace();
+        }
+
+        if (StringUtils.isEmpty(billId)) {
+            throw new ShrWebBizException(new OrgnizationBizException(OrgnizationBizException.NO_FIND_BILLID));
+        } else {
+            return billId;
+        }
+    }
+
+}

+ 73 - 0
websrc/com/kingdee/eas/custom/beisen/synchronouspos/handler/StaffManageProjectListHandlerEx.java

@@ -0,0 +1,73 @@
+package com.kingdee.eas.custom.beisen.synchronouspos.handler;
+
+import com.google.common.collect.Maps;
+import com.kingdee.bos.Context;
+import com.kingdee.shr.base.syssetting.MSFServiceFacadeFactory;
+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.ml.SHRWebResource;
+import com.kingdee.shr.staffcontrol.web.handler.StaffManageProjectListHandler;
+import org.springframework.ui.ModelMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+public class StaffManageProjectListHandlerEx extends StaffManageProjectListHandler {
+
+    public void batchEnableAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
+
+
+        try {
+            Context ctx = SHRContext.getInstance().getContext();
+            int successCount = 0;
+            int errorCount = 0;
+            BatchMessageTipsHeader batchMessageTipsHeader = new BatchMessageTipsHeader();
+            int i = 0;
+            Map<String, Object> map = Maps.newHashMap();
+            StringBuilder billIds = new StringBuilder("CFOriginalId,");
+            //同步编制,返回参数,以及同步结果
+            Map<String,List<Map<String,Object>>> result = (Map<String,List<Map<String,Object>>>) MSFServiceFacadeFactory.getLocalInstance(ctx).processService("syncStaffManageOSF", map);
+            //同步参数
+            List<Map<String, Object>> list = result.get("list");
+            //同步结果
+            List<Map<String, Object>> listMap = result.get("listMap");
+            for (int size = list.size(); i < size; ++i) {
+                Map<String, Object> objMap = list.get(i);
+                Map<String, Object> returnMap = listMap.get(i);
+                //获取同步状态
+                String code = String.valueOf(returnMap.get("code"));
+                BatchMessageTipsBody body = new BatchMessageTipsBody();
+                String CFOriginalId = (String) objMap.get("CFOriginalId");
+                billIds.append("," + CFOriginalId);
+                body.setId(CFOriginalId);
+                Boolean MuitTipsState = null;
+                if("200".equals(code)){
+                    MuitTipsState=Boolean.TRUE;
+                    ++successCount;
+                }else {
+                    MuitTipsState=Boolean.FALSE;
+                    ++errorCount;
+                }
+                body.setMuitTipsState(MuitTipsState);
+                body.setMuitTipsMessage(objMap.toString());
+                batchMessageTipsHeader.addResult(body);
+            }
+            String billIdstr = billIds.toString();
+            billIdstr.replace("CFOriginalId,", "");
+            batchMessageTipsHeader.setBillId(billIdstr);
+            batchMessageTipsHeader.setFailureCount(errorCount);
+            batchMessageTipsHeader.setSuccessCount(successCount);
+            this.writeSuccessData(batchMessageTipsHeader);
+        } catch (Exception var15) {
+            var15.printStackTrace();
+
+        }
+        return;
+    }
+
+
+}

+ 239 - 0
websrc/com/kingdee/eas/custom/beisen/synchronouspos/osf/SyncStaffManageOSFService.java

@@ -0,0 +1,239 @@
+package com.kingdee.eas.custom.beisen.synchronouspos.osf;
+
+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 java.sql.SQLException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public  class SyncStaffManageOSFService implements IHRMsfService {
+
+
+    @Override
+    public Object process(Context context, Map<String, Object> map) throws EASBizException, BOSException {
+        Map<String,List<Map<String,Object>>> result = Maps.newHashMap();
+        List<Map<String,Object>> list = Lists.newArrayList();
+        List<Map<String,Object>> listMap = Lists.newArrayList();
+        result.put("list",list);
+        result.put("listMap",listMap);
+        String posPath = (String) map.get("posPath");
+        String orgPath = (String) map.get("orgPath");
+        StringBuilder sql = new StringBuilder();
+        sql.append(" ");
+        sql.append(" select fid,FYear,FTableName from T_HR_StaffManageProject ");
+        sql.append(" where FRule in ( ");
+        sql.append("         select fid from T_HR_StaffManageRule where fid in ( ");
+        sql.append("                 select FStaffManageRuleId from T_HR_STAFFMANAGERULEFIELD where FColumn in ('FpositionID', 'FAdminOrgID') group by FStaffManageRuleId HAVING count(fid)>1 ");
+        sql.append("         ) and FState = 1 ");
+        sql.append(" ) ");
+        sql.append(" and FState = 1 ");
+        sql.append(" and FChannel = 1 ");
+        IRowSet rs = DbUtil.executeQuery(context, sql.toString());
+        try{
+            BeiSenUtils b = new BeiSenUtils(context);
+            Helper helper = b.helper;
+            BeisenParamByPropertiesUtil posUtil = new BeisenParamByPropertiesUtil(posPath);
+            Map<String,String> poskeyMap = posUtil.getConfig();
+            BeisenParamByPropertiesUtil orgUtil = new BeisenParamByPropertiesUtil(orgPath);
+            Map<String,String> orgkeyMap = orgUtil.getConfig();
+            while (rs.next()) {
+                String fid = rs.getString("fid");
+                String FTableName = rs.getString("FTableName");
+                String FYear = rs.getString("FYear");
+                StringBuilder selSql = new StringBuilder();
+                selSql.append(" select 'org' orgpos,org.fid posId,org.fname_l2 orgPosName,org.FDisplayName_L2 staffName, ");
+                selSql.append("         org.CFOriginalId,staff.FControlWay, ");
+                selSql.append("         staff.FPersonCount,staff.FStaffYear,staff.FYearActualStart, ");
+                selSql.append("         staff.FOnWayAddCount,staff.FOnWaySubCount, ");
+                selSql.append("         (staff.FStaffYear-staff.FOnWayAddCount+staff.FOnWaySubCount-staff.FPersonCount) FStaffYearUsable, ");
+                selSql.append("         staff.FState ");
+                selSql.append(" from ");
+                selSql.append(" T_HR_Staff20250623152307 staff ");
+                selSql.append(" left join t_org_admin org on org.fid=staff.FAdminOrgID ");
+                selSql.append(" left join t_org_position pos on pos.fid = staff.FpositionID ");
+                selSql.append(" where pos.fid is null and org.CFOriginalId is not null ");
+                selSql.append(" UNION all ");
+                selSql.append(" select 'pos' orgpos,org.fid posId,org.fname_l2 orgPosName,org.FDisplayName_L2 staffName,pos.CFOriginalId,staff.FControlWay, ");
+                selSql.append("         staff.FPersonCount,staff.FStaffYear,staff.FYearActualStart, ");
+                selSql.append("         staff.FOnWayAddCount,staff.FOnWaySubCount, ");
+                selSql.append("         (staff.FStaffYear-staff.FOnWayAddCount+staff.FOnWaySubCount-staff.FPersonCount) FStaffYearUsable, ");
+                selSql.append("         staff.FState ");
+                selSql.append(" from ");
+                selSql.append(" T_HR_Staff20250623152307 staff ");
+                selSql.append(" left join t_org_admin org on org.fid=staff.FAdminOrgID ");
+                selSql.append(" left join t_org_position pos on pos.fid = staff.FpositionID ");
+                selSql.append(" where pos.fid is not null and pos.CFOriginalId is not null ");
+                IRowSet rsSel = DbUtil.executeQuery(context, selSql.toString());
+                // 获取访问令牌
+                String token = b.getAccessToken();
+                while (rsSel.next()){
+                    String orgpos= rsSel.getString("orgpos");
+
+
+                    if("org".equals(orgpos)){
+                        Map<String, Object> pos = this.getPostData(orgkeyMap,rsSel);
+
+                        if(null!=pos){
+                            // 若访问令牌不为空且开始时间和结束时间不为空
+                            if (!com.kingdee.util.StringUtils.isEmpty(token)) {
+                                // 创建请求头的 Map
+                                Map<String, String> header = new HashMap<String, String>();
+                                // 设置请求头的 Content-Type
+                                header.put("Content-Type", "application/json");
+                                // 设置请求头的 Authorization
+                                header.put("Authorization", "Bearer " + token);
+                                String url = "https://openapi.italent.cn/UserFrameworkApiV3/api/v1/departments/Put";
+
+                                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);
+                                listMap.add(responseJson);
+                                list.add(pos);
+                            }
+                        }
+                    }else if ("pos".equals(orgpos)){
+                        Map<String, Object> pos = this.getPostData(poskeyMap,rsSel);
+                        if(null!=pos){
+                            // 若访问令牌不为空且开始时间和结束时间不为空
+                            if (!com.kingdee.util.StringUtils.isEmpty(token)) {
+                                // 创建请求头的 Map
+                                Map<String, String> header = new HashMap<String, String>();
+                                // 设置请求头的 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);
+                                listMap.add(responseJson);
+                                list.add(pos);
+                            }
+                        }
+                    }
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+
+        }
+        return result;
+    }
+    /**
+     * shr系统数据组装北森请求参数
+     *
+     * @param keyMap
+     * @param rowSet
+     * @return
+     * @throws SQLException
+     */
+    protected Map<String, Object> getPostData(Map<String,String> keyMap, IRowSet rowSet) throws SQLException {
+        Map<String, Object> pos = Maps.newHashMap();
+        if (null!=rowSet){
+            for(Map.Entry<String,String> entry : keyMap.entrySet()){
+                String shrKey = entry.getKey();
+                String beisenKey = entry.getValue();
+                if(shrKey.indexOf(".")>0){
+                    String[] keys=shrKey.split("\\.");
+                    if(2==keys.length){
+                        Map<String,Object> map1 = (Map<String, Object>) 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<String,Object> map1 = (Map<String, Object>) pos.get(keys[0]);
+                        if(null==map1){
+                            map1=Maps.newHashMap();
+                            pos.put(keys[0],map1);
+                        }
+                        Map<String,Object> map2 = (Map<String, Object>) 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);
+                        }
+                    }
+                }
+            }
+        }
+        return pos;
+    }
+}

+ 332 - 0
websrc/com/kingdee/eas/custom/beisen/synchronouspos/osf/SynchronousPosOSFService.java

@@ -0,0 +1,332 @@
+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 <br>
+ * date: 2025/7/11 17:46 <br>
+ * author: lhbj <br>
+ * version: 1.0 <br>
+ */
+public class SynchronousPosOSFService implements IHRMsfService {
+
+    @Override
+    public Object process(Context context, Map<String, Object> 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<String,String> 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<String,String> keyMap, String posId, String syncStartTimeStr, String syncEndTimeStr) throws BOSException, SQLException, IOException, URISyntaxException {
+        List<JSONObject> responseList =Lists.newArrayList();
+        List<JSONObject> addNewList = this._sendAddNewPosToBeisen(ctx,keyMap,posId,syncStartTimeStr,syncEndTimeStr);
+        responseList.addAll(addNewList);
+        List<JSONObject> 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<Map<String, Object>> getPostData(Context ctx,Map<String,String> keyMap,StringBuilder sql) throws BOSException, SQLException {
+        IRowSet rowSet = DbUtil.executeQuery(ctx,sql.toString());
+        List<Map<String, Object>> posList = Lists.newArrayList();
+        while (rowSet.next()){
+            Map<String, Object> pos = Maps.newHashMap();
+            for(Map.Entry<String,String> entry : keyMap.entrySet()){
+               String shrKey = entry.getKey();
+               String beisenKey = entry.getValue();
+               if(shrKey.indexOf(".")>0){
+                   String[] keys=shrKey.split("\\.");
+                   if(2==keys.length){
+                      Map<String,Object> map1 = (Map<String, Object>) 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<String,Object> map1 = (Map<String, Object>) pos.get(keys[0]);
+                       if(null==map1){
+                           map1=Maps.newHashMap();
+                           pos.put(keys[0],map1);
+                       }
+                       Map<String,Object> map2 = (Map<String, Object>) 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<JSONObject> _sendAddNewPosToBeisen(Context ctx,Map<String,String> 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<Map<String, Object>> list = this.getPostData(ctx, keyMap, sql);
+        List<JSONObject> responseList = Lists.newArrayList();
+        for (Map<String, Object> pos : list) {
+            // 获取访问令牌
+            String token = b.getAccessToken();
+            // 若访问令牌不为空且开始时间和结束时间不为空
+            if (!com.kingdee.util.StringUtils.isEmpty(token)) {
+                // 创建请求头的 Map
+                Map<String, String> header = new HashMap<String, String>();
+                // 设置请求头的 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<JSONObject> _sendEditPosToBeisen(Context ctx,Map<String,String> 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<Map<String,Object>> list1 = this.getPostData(ctx,keyMap,sql1);
+        List<JSONObject> responseList = Lists.newArrayList();
+        // 获取访问令牌
+        String token = b.getAccessToken();
+        for(Map<String,Object> pos : list1){
+
+            // 若访问令牌不为空且开始时间和结束时间不为空
+            if (!com.kingdee.util.StringUtils.isEmpty(token)) {
+                // 创建请求头的 Map
+                Map<String, String> header = new HashMap<String, String>();
+                // 设置请求头的 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;
+    }
+}