Browse Source

接口修改

zqy 1 tuần trước cách đây
mục cha
commit
780075283c

+ 51 - 40
doc/接口开发.md

@@ -1,3 +1,11 @@
+### SDK
+
+文件结构:s-HR-SDK.zip
+
+shr_sso_client.jar:为调用接口sdk
+
+requiredLib.zip:为依赖jar的压缩包
+
 ### 一.获取组织信息接口
 服务名:getOrgInfoOsfService
 
@@ -5,7 +13,7 @@
 
 | 字段名 | 类型 | 必填 | 说明 | 示例 |
 | :--- | :--- | :--- | :--- | :--- |
-| layerType | String | 否 | 组织类型(精确匹配) | 公司 |
+| layerType | String | 否 | 组织类型,支持逗号分隔多个值(精确匹配) | 公司,部门 |
 | modifyDate | String | 否 | 最后修改日期(>= 该日期) | yyyy-MM-dd |
 | name | String | 否 | 组织名称(左模糊匹配) | 业务部 |
 | code | String | 否 | 组织编号(精确匹配) | 010056 |
@@ -17,15 +25,15 @@
 | 描述 | 接口字段 | 类型 | 说明 |
 | --- | --- | --- | --- |
 | 组织名称 | name | String |  |
-| 组织全称 | fullname | String |  |
+| 组织全称 | fullname | String | 显示名 |
 | 组织编号 | code | String |  |
-| 上级组织 | parent | String | 区分大小写的字符串uuid |
-| 组织全编码 | fullnumber | String | 根据”!”分割,前一数字是上级组织编号 |
+| 上级组织编号 | parent | String |  |
+| 组织全编码 | fullnumber | String | 长编码层级路径,根据”!”分割,前一数字是上级组织编号 |
 | 显示顺序 | disporder | String | 根据”!”分割,前一数字是上级组织排序码 |
-| 是否启用 | status | String | 1(有效);0(封存),与DB字段fissealup取反 |
+| 是否启用 | status | String | 1(有效);0(封存) |
 | 主键 | id | String | 区分大小写的字符串uuid |
 | 备注 | description | String |  |
-| 修改日期 | modifyDate | String | 当前版本不返回此字段 |
+| 修改日期 | modifyDate | String | 当前版本不返回此字段,如需返回请取消注释 |
 | 组织类型 | layerType | String | 公司 / 部门 / 集团 / 子中心 / 中心 / 公司(新) |
 
 返回说明:
@@ -40,7 +48,7 @@
 
 使用sdk调用示例(Java)
 
-| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = “[http://192.168.1.250:6888/shr](http://192.168.1.250:6888/shr)”;<br/>Map<String, Object> map = new HashMap();<br/>map.put(“modifyDate”, “2025-01-01”);<br/>map.put(“layerType”, “部门”);<br/>map.put(“page”, 1);<br/>map.put(“size”, 100);<br/>String result = osfwsClient.proceedOSF(shrAddr, “getOrgInfoOsfService”, map);<br/>System.out.println(result); |
+| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = “http://172.16.38.1:6888/shr”;<br/>Map<String, Object> map = new HashMap();<br/>map.put(“modifyDate”, “2025-01-01”);<br/>map.put(“layerType”, “部门”);<br/>map.put(“page”, 1);<br/>map.put(“size”, 100);<br/>String result = osfwsClient.proceedOSF(shrAddr, “getOrgInfoOsfService”, map);<br/>System.out.println(result); |
 | :--- |
 
 
@@ -65,8 +73,8 @@
 | 岗位名称 | name | String |  |
 | 岗位编号 | code | String |  |
 | 显示顺序 | disporder | String |  |
-| 所属组织ID | department | String | 区分大小写的字符串uuid |
-| 上级岗位 | parent | String | 区分大小写的字符串uuid |
+| 所属组织编号 | department | String |  |
+| 上级岗位编号 | parent | String |  |
 | 部门副职 | vice | String | 1(是),0(否) |
 | 备注 | description | String |  |
 | 主键 | id | String | 区分大小写的字符串uuid |
@@ -83,7 +91,7 @@
 
 使用sdk调用示例(Java)
 
-| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = “[http://192.168.1.250:6888/shr](http://192.168.1.250:6888/shr)”;<br/>Map<String, Object> map = new HashMap();<br/>map.put(“modifyDate”, “2025-01-01”);<br/>map.put(“name”, “经理”);<br/>map.put(“page”, 1);<br/>map.put(“size”, 100);<br/>String result = osfwsClient.proceedOSF(shrAddr, “getPosInfoOsfService”, map);<br/>System.out.println(result); |
+| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = “http://172.16.38.1:6888/shr”;<br/>Map<String, Object> map = new HashMap();<br/>map.put(“modifyDate”, “2025-01-01”);<br/>map.put(“name”, “经理”);<br/>map.put(“page”, 1);<br/>map.put(“size”, 100);<br/>String result = osfwsClient.proceedOSF(shrAddr, “getPosInfoOsfService”, map);<br/>System.out.println(result); |
 | :--- |
 
 
@@ -95,31 +103,32 @@
 | 字段名 | 类型 | 必填 | 说明                        | 示例 |
 | :--- | :--- | :--- |:--------------------------| :--- |
 | modifyDate | String | 否 | 修改日期(范围过滤:员工或联系方式 >= 该日期) | yyyy-MM-dd |
-| name | String | 否 | 员工名称(精确匹配)                 | 张三 |
+| name | String | 否 | 员工名称(左模糊匹配)                 | 张三 |
 | code | String | 否 | 员工编号(精确匹配)                | 010056 |
 | size | int | 否 | 每页条数(默认100,最大1000)        | 100 |
 | page | int | 否 | 页码(默认1)                   | 1 |
 
 字段:
 
-| 描述 | 接口字段 | 类型 | 说明 |
-| --- | --- | --- | --- |
-| 员工ID | id | String | 区分大小写的字符串uuid |
-| 员工编码 | code | String |  |
-| 员工名称 | name | String |  |
-| 身份证号码 | idcardno | String |  |
-| 用工关系类型 | tyname | String |  |
-| 是否在职 | inservice | String | 1或4表示在职,其他值表示不在职 |
-| 性别 | gender | String | 1:男,2:女 |
-| 国际区号 | globalroaming | String |  |
-| 手机号码 | ncell | String |  |
-| 入司日期 | joindate | String | 格式:yyyy-MM-dd |
-| 所属组织ID | orgid | String | 区分大小写的字符串uuid |
-| 岗位ID | posid | String | 区分大小写的字符串uuid |
-| 上级ID列表 | leader | Array[String] | 一个员工可能有多个上级 |
-| 登录账号 | userAccount | String |  |
-| 办公电话 | officephone | String |  |
-| 护照号码 | passportno | String |  |
+| 描述       | 接口字段 | 类型 | 说明               |
+|----------| --- | --- |------------------|
+| 员工ID     | id | String | 区分大小写的字符串uuid    |
+| 员工编码     | code | String |                  |
+| 员工名称     | name | String |                  |
+| 身份证号码    | idcardno | String |                  |
+| 用工关系类型   | tyname | String |                  |
+| 是否在职     | inservice | String | 1或4表示在职,其他值表示不在职 |
+| 性别       | gender | String | 1:男,2:女          |
+| 国际区号     | globalroaming | String |                  |
+| 手机号码     | ncell | String |                  |
+| 入司日期     | joindate | String | 格式:yyyy-MM-dd    |
+| 所属组织编码   | orgCode | String |                  |
+| 主岗位编码    | posCode | String |                  |
+| 上级员工编码列表 | leader | Array[String] | 一个员工可能有多个上级      |
+| 登录账号     | userAccount | String |                  |
+| 办公电话     | officephone | String |                  |
+| 护照号码     | passportno | String |                  |
+| 顺序码      | disporder | String | 9999999          |
 
 返回说明:
 
@@ -133,7 +142,7 @@
 
 使用sdk调用示例(Java)
 
-| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = "http://192.168.1.250:6888/shr";<br/>Map<String, Object> map = new HashMap();<br/>map.put("modifyDate", "2025-01-01");<br/>map.put("name", "张三");<br/>map.put("page", 1);<br/>map.put("size", 100);<br/>String result = osfwsClient.proceedOSF(shrAddr, "getEmpInfoOsfService", map);<br/>System.out.println(result); |
+| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = "http://172.16.38.1:6888/shr";<br/>Map<String, Object> map = new HashMap();<br/>map.put("modifyDate", "2025-01-01");<br/>map.put("name", "张三");<br/>map.put("page", 1);<br/>map.put("size", 100);<br/>String result = osfwsClient.proceedOSF(shrAddr, "getEmpInfoOsfService", map);<br/>System.out.println(result); |
 |:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
 
 
@@ -157,16 +166,17 @@
 | --- | --- | --- |------------------------------------|
 | 主键 | id | String | 区分大小写的字符串uuid(人员-角色关联表主键)          |
 | 角色ID | roleid | String | 区分大小写的字符串uuid(关联 T_WFR_WFROLE.FID) |
-| 组织ID | orgid | String | 区分大小写的字符串uuid                      |
-| 人员ID | personid | String | 区分大小写的字符串uuid                      |
+| 组织编号 | orgCode | String |                                    |
+| 人员编号 | personCode | String |                                    |
 | 是否包含下级 | isinclude | String | 1(是),0(否)                          |
 | 是否委托 | isdele | String | 1(是),0(否)                          |
-| 委托操作人 | deleperson | String | 区分大小写的字符串uuid                      |
+| 委托操作人编号 | deleperson | String |                                    |
 | 角色名称 | rolename | String |                                    |
 | 角色编号 | rolenumber | String |                                    |
 | 角色描述 | roledescribe | String |                                    |
 | 角色类型 | roletype | String | 0  (职员角色),1  (职位角色),2  (组织角色)      |
 | 角色状态 | state | String | 1  (启用),0(禁用)                      |
+| 组织类型 | layerType | String | 公司 / 部门 / 集团 / 子中心 / 中心 / 公司(新) |
 
 返回说明:
 
@@ -180,7 +190,7 @@
 
 使用sdk调用示例(Java)
 
-| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = "[http://192.168.1.250:6888/shr](http://192.168.1.250:6888/shr)";<br/>Map<String, Object> map = new HashMap();<br/>map.put("modifyDate", "2025-01-01");<br/>map.put("name", "分管领导");<br/>map.put("page", 1);<br/>map.put("size", 100);<br/>String result = osfwsClient.proceedOSF(shrAddr, "getRoleSupervisorInfoOsfService", map);<br/>System.out.println(result); |
+| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = "http://172.16.38.1:6888/shr";<br/>Map<String, Object> map = new HashMap();<br/>map.put("modifyDate", "2025-01-01");<br/>map.put("name", "分管领导");<br/>map.put("page", 1);<br/>map.put("size", 100);<br/>String result = osfwsClient.proceedOSF(shrAddr, "getRoleSupervisorInfoOsfService", map);<br/>System.out.println(result); |
 | :--- |
 
 
@@ -196,7 +206,7 @@
 | 字段名 | 类型 | 必填 | 说明 | 示例 |
 | :--- | :--- | :--- | :--- | :--- |
 | modifyDate | String | 否 | 修改日期(范围过滤:加入兼职单或移除兼职单 >= 该日期) | yyyy-MM-dd |
-| personid | String | 否 | 员工ID(精确匹配) | 区分大小写的字符串uuid |
+| personCode | String | 否 | 员工编号(精确匹配) | 010056 |
 | size | int | 否 | 每页条数(默认100,最大1000) | 100 |
 | page | int | 否 | 页码(默认1) | 1 |
 
@@ -205,11 +215,12 @@
 | 描述 | 接口字段 | 类型 | 说明 |
 | --- | --- | --- | --- |
 | 员工ID | personid | String | 区分大小写的字符串uuid |
+| 员工编号 | personCode | String |  |
 | 兼职开始日期 | startDate | String | 格式:yyyy-MM-dd |
 | 兼职结束日期 | endDate | String | 格式:yyyy-MM-dd,未结束则为"2199-12-31" |
-| 兼职组织ID | orgid | String | 区分大小写的字符串uuid |
-| 兼职岗位ID | posid | String | 区分大小写的字符串uuid |
-| 上级ID列表 | leader | Array[String] | 一个员工可能有多个上级 |
+| 兼职组织编码 | orgCode | String |  |
+| 兼职岗位编码 | posCode | String |  |
+| 上级员工编码列表 | leader | Array[String] | 一个员工可能有多个上级 |
 | 兼职备注 | description | String | 来自加入兼职单分录 |
 
 返回说明:
@@ -224,7 +235,7 @@
 
 使用sdk调用示例(Java)
 
-| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = "http://192.168.1.250:6888/shr";<br/>Map<String, Object> map = new HashMap();<br/>map.put("modifyDate", "2025-01-01");<br/>map.put("personid", "区分大小写的字符串uuid");<br/>map.put("page", 1);<br/>map.put("size", 100);<br/>String result = osfwsClient.proceedOSF(shrAddr, "getPluralityInfoOsfService", map);<br/>System.out.println(result); |
+| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = "http://172.16.38.1:6888/shr";<br/>Map<String, Object> map = new HashMap();<br/>map.put("modifyDate", "2025-01-01");<br/>map.put("personCode", "010056");<br/>map.put("page", 1);<br/>map.put("size", 100);<br/>String result = osfwsClient.proceedOSF(shrAddr, "getPluralityInfoOsfService", map);<br/>System.out.println(result); |
 |:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
 
 
@@ -255,7 +266,7 @@
 
 使用sdk调用示例(Java)
 
-| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = "[<u>http://192.168.1.250:6888/shr</u>](http://192.168.1.250:6888/shr)";<br/>Map<String, String> paramMap = new HashMap();<br/>paramMap.put("EquNo","OA001");<br/>paramMap.put("CardId","980132");<br/>paramMap.put("RecDate","2026-06-15");<br/>paramMap.put("RecTime","09:00");<br/>list.add(paramMap);<br/>Gson gson =new Gson();<br/>param.put("records",gson.toJson(list));<br/>String result = osfwsClient.proceedOSF(shrAddr, "savePunchCardRecords", map);<br/>System.out.println(result); |
+| OSFWSClient osfwsClient = new OSFWSClient();<br/>String shrAddr = "http://172.16.38.1:6888/shr";<br/>Map<String, String> paramMap = new HashMap();<br/>paramMap.put("EquNo","OA001");<br/>paramMap.put("CardId","980132");<br/>paramMap.put("RecDate","2026-06-15");<br/>paramMap.put("RecTime","09:00");<br/>list.add(paramMap);<br/>Gson gson =new Gson();<br/>param.put("records",gson.toJson(list));<br/>String result = osfwsClient.proceedOSF(shrAddr, "savePunchCardRecords", map);<br/>System.out.println(result); |
 | :--- |
 
 

+ 481 - 0
websrc/com/kingdee/eas/custom/lgl/service/SaveEmpEnrollBizBillService.java

@@ -0,0 +1,481 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by FernFlower decompiler)
+//
+
+package com.kingdee.eas.custom.lgl.service;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.BOSObjectFactory;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.bsf.service.app.IHRMsfService;
+import com.kingdee.bos.dao.IObjectPK;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+import com.kingdee.bos.util.BOSObjectType;
+import com.kingdee.bos.util.BOSUuid;
+import com.kingdee.eas.base.codingrule.CodingRuleManagerFactory;
+import com.kingdee.eas.base.codingrule.ICodingRuleManager;
+import com.kingdee.eas.base.permission.UserFactory;
+import com.kingdee.eas.base.permission.UserInfo;
+import com.kingdee.eas.basedata.hraux.DiplomaFactory;
+import com.kingdee.eas.basedata.hraux.DiplomaInfo;
+import com.kingdee.eas.basedata.hraux.StandingFactory;
+import com.kingdee.eas.basedata.hraux.StandingInfo;
+import com.kingdee.eas.basedata.org.AdminOrgUnitFactory;
+import com.kingdee.eas.basedata.org.AdminOrgUnitInfo;
+import com.kingdee.eas.basedata.org.HROrgUnitFactory;
+import com.kingdee.eas.basedata.org.HROrgUnitInfo;
+import com.kingdee.eas.basedata.org.PositionCollection;
+import com.kingdee.eas.basedata.org.PositionFactory;
+import com.kingdee.eas.basedata.org.PositionInfo;
+import com.kingdee.eas.basedata.person.Genders;
+import com.kingdee.eas.basedata.person.PersonCollection;
+import com.kingdee.eas.basedata.person.PersonFactory;
+import com.kingdee.eas.basedata.person.PersonInfo;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.framework.CoreBaseCollection;
+import com.kingdee.eas.framework.ICoreBase;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntryInfo;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillFactory;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillInfo;
+import com.kingdee.eas.hr.base.AffairActionReasonFactory;
+import com.kingdee.eas.hr.base.AffairActionReasonInfo;
+import com.kingdee.eas.hr.base.BaseException;
+import com.kingdee.eas.hr.base.EmployeeTypeFactory;
+import com.kingdee.eas.hr.base.EmployeeTypeInfo;
+import com.kingdee.eas.hr.base.HRBillStateEnum;
+import com.kingdee.eas.hr.base.HRBizDefineFactory;
+import com.kingdee.eas.hr.base.HRBizDefineInfo;
+import com.kingdee.eas.hr.base.VariationReasonFactory;
+import com.kingdee.eas.hr.base.VariationReasonInfo;
+import com.kingdee.eas.hr.base.util.IDCardCommonUtil;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.compensation.CmpItemFactory;
+import com.kingdee.shr.compensation.CmpItemInfo;
+import com.kingdee.shr.compensation.FixAdjustSalaryFactory;
+import com.kingdee.shr.compensation.FixAdjustSalaryInfo;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+
+public class SaveEmpEnrollBizBillService implements IHRMsfService {
+    private static Logger logger = Logger.getLogger("com.kingdee.eas.custom.service.SaveEmpEnrollBizBillService");
+
+    public Object process(Context arg0, Map arg1) throws EASBizException, BOSException {
+        System.out.println("开始执行入职单接口...");
+        new HashMap();
+        String name = (String)arg1.get("name");
+        String position = (String)arg1.get("position");
+        String joinDate = (String)arg1.get("joinDate");
+        String idcard = (String)arg1.get("idcard");
+        String sex = (String)arg1.get("sex");
+        String birthDate = (String)arg1.get("birthDate");
+        String tel = (String)arg1.get("tel");
+        String rank = (String)arg1.get("rank");
+        String personLev = (String)arg1.get("personLev");
+        String lowerDep = (String)arg1.get("lowerDep");
+        String probation = (String)arg1.get("probation");
+        String becomeDate = (String)arg1.get("becomeDate");
+        String yearBonus = (String)arg1.get("yearBonus");
+        String applier = (String)arg1.get("applier");
+        String applyDate = (String)arg1.get("applyDate");
+        String oaNumber = (String)arg1.get("oaNumber");
+        String endlishName = (String)arg1.get("englishName");
+        String diplNumber = (String)arg1.get("diplNumber");
+        String hRBizDefine = (String)arg1.get("hRBizDefine");
+        String zwjb = (String)arg1.get("zwjb");
+        String sapDep = (String)arg1.get("sapDep");
+        String yybmbm = (String)arg1.get("yybmbm");
+        String yybm = (String)arg1.get("yybm");
+        if (StringUtils.isNotBlank(sapDep) && sapDep.indexOf("-") > 0) {
+            String[] sapDeps = sapDep.split("-");
+            if(sapDeps.length == 2){
+                yybmbm = sapDeps[0];
+                yybm = sapDeps[1];
+            }else  if(sapDeps.length == 1){
+                yybmbm = sapDeps[0];
+            }
+        }
+
+        String groupClass = (String)arg1.get("groupClass");
+        String groupClassDetails = (String)arg1.get("groupClassDetails");
+        String reimLevel = (String)arg1.get("reimLevel");
+        String bpcbmfldm = (String)arg1.get("bpcbmfldm");
+        String fyfl1 = (String)arg1.get("fyfl1");
+        String fyfl2 = (String)arg1.get("fyfl2");
+        String bmfl3 = (String)arg1.get("bmfl3");
+        String bmfl4 = (String)arg1.get("bmfl4");
+        if (StringUtils.isNotBlank(groupClass) && groupClass.indexOf("-") > 0) {
+            String[] groupClasss = groupClass.split("-");
+            if (groupClasss.length == 3) {
+                fyfl1 = groupClasss[0];
+                fyfl2 = groupClasss[1];
+                bmfl3 = groupClasss[2];
+            }else  if(groupClasss.length == 2) {
+                fyfl1 = groupClasss[0];
+                fyfl2 = groupClasss[1];
+            }else  if(groupClasss.length == 1) {
+                fyfl1 = groupClasss[0];
+            }
+
+        }
+
+        System.out.println("获取的参数值:" + ",name=" + name + ",position=" + position + ",joinDate=" + joinDate + ",idcard=" + idcard + ",sex=" + sex + ",birthDate=" + birthDate + ",tel=" + tel + ",rank=" + rank + ",personLev=" + personLev + ",lowerDep=" + lowerDep + ",probation=" + probation + ",becomeDate=" + becomeDate + ",yearBonus=" + yearBonus + ",applier=" + applier + ",applyDate=" + applyDate + ",oaNumber=" + oaNumber);
+        Map resultMap = this.createEmpEnrollBizBill(arg0, name, position, joinDate, idcard, sex, birthDate, tel, rank, personLev, lowerDep, probation, becomeDate, yearBonus, applier, applyDate, oaNumber, diplNumber, endlishName, hRBizDefine, zwjb, yybmbm, groupClass, reimLevel, yybm, bpcbmfldm, groupClassDetails, fyfl1, fyfl2, bmfl3, groupClassDetails);
+        System.out.println("执行入职单接口结束...");
+        return resultMap;
+    }
+
+    public Map<Object, Object> createEmpEnrollBizBill(Context ctx, String name, String position, String joinDate, String idcard, String sex, String birthDate, String tel, String rank, String personLev, String lowerDep, String probation, String becomeDate, String yearBonus, String applier, String applyDate, String oaNumber, String diplNumber, String endlishName, String hRBizDefine, String zwjb, String yybmbm, String groupClass, String reimLevel, String yybm, String bpcbmfldm, String groupClassDetails, String fyfl1, String fyfl2, String bmfl3, String bmfl4) throws BOSException {
+        Map<Object, Object> reurnMap = new HashMap();
+        String msg = null;
+        String fid = null;
+        String fnumber = null;
+        StringBuffer reason = new StringBuffer();
+        String msgType = null;
+        String rankSql = null;
+        String xjbmSql = null;
+        String number = null;
+        String cp = null;
+        Date cpDate = null;
+        EmpEnrollBizBillInfo info = new EmpEnrollBizBillInfo();
+        EmpEnrollBizBillEntryInfo enInfo = new EmpEnrollBizBillEntryInfo();
+        enInfo.put("yybmbm", yybmbm);
+        enInfo.put("groupClass", groupClass);
+        PersonInfo ccPeInfo = new PersonInfo();
+        if (zwjb != null && "" != zwjb) {
+            ICoreBase coreBase = (ICoreBase)BOSObjectFactory.createBOSObject(ctx, new BOSObjectType("DCBAAD05"));
+            CoreBaseCollection coreBaseColl = coreBase.getCollection(" where number = '" + zwjb + "'");
+            if (coreBaseColl.size() > 0) {
+                enInfo.put("zwjb", coreBaseColl.get(0));
+            }
+        }
+
+        enInfo.put("reimLevel", reimLevel);
+        enInfo.put("yybm", yybm);
+        enInfo.put("bpcbmfldm", bpcbmfldm);
+        enInfo.put("groupClassDetails", groupClassDetails);
+        enInfo.put("fyfl1", fyfl1);
+        enInfo.put("fyfl2", fyfl2);
+        enInfo.put("bmfl3", bmfl3);
+        enInfo.put("bmfl4", bmfl4);
+        info.setNumber("rz" + System.currentTimeMillis());
+        info.setBillState(HRBillStateEnum.SAVED);
+
+        try {
+            if (applier != null && applier != "") {
+                PersonCollection apCol = PersonFactory.getLocalInstance(ctx).getPersonCollection(" where number = '" + applier + "'");
+                if (apCol.size() > 0) {
+                    info.setApplier(apCol.get(0));
+                } else {
+                    reason.append("创建人编码获取信息有误,请检查传入参数applier");
+                }
+            } else {
+                reason.append("创建人编码为空,请检查传入参数applier");
+            }
+
+            HROrgUnitInfo hrInfo = HROrgUnitFactory.getLocalInstance(ctx).getHROrgUnitInfo(new ObjectUuidPK("00000000-0000-0000-0000-000000000000CCE7AED4"));
+            info.setHrOrgUnit(hrInfo);
+            if (applyDate != null && applyDate != "") {
+                DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+                info.setApplyDate(format1.parse(applyDate));
+            } else {
+                info.setApplyDate(new Date());
+            }
+
+            if (name != null && name != "") {
+                enInfo.setEmpName(name);
+                ccPeInfo.setName(name);
+            } else {
+                reason.append("员工姓名为空,请检查传入参数name");
+            }
+
+            new PositionInfo();
+            new PositionCollection();
+            new AdminOrgUnitInfo();
+            AdminOrgUnitInfo companyInfo = new AdminOrgUnitInfo();
+            if (position != null && position != "") {
+                PositionCollection poCol = PositionFactory.getLocalInstance(ctx).getPositionCollection(" where number = '" + position + "'");
+                if (poCol.size() > 0) {
+                    PositionInfo poInfo = poCol.get(0);
+                    AdminOrgUnitInfo adInfo = AdminOrgUnitFactory.getLocalInstance(ctx).getAdminOrgUnitInfo(new ObjectUuidPK(poInfo.getAdminOrgUnit().getId()));
+                    companyInfo = AdminOrgUnitFactory.getLocalInstance(ctx).getAdminOrgUnitInfo(new ObjectUuidPK(adInfo.getCompany().getId()));
+                    enInfo.setPosition(poInfo);
+                    enInfo.setAdminOrg(adInfo);
+                    enInfo.setCompany(companyInfo);
+                } else {
+                    reason.append("职位编码获取信息有误,请检查传入参数position");
+                }
+            } else {
+                reason.append("职位编码为空,请检查传入参数position");
+            }
+
+            if (joinDate != null && joinDate != "") {
+                DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+                enInfo.setBizDate(format1.parse(joinDate));
+            } else {
+                reason.append("入职日期为空,请检查传入参数joinDate");
+            }
+
+            if (idcard != null && idcard != "") {
+                try {
+                    new IDCardCommonUtil(idcard);
+                    enInfo.setIDCardNo(idcard);
+                    ccPeInfo.setIdCardNO(idcard);
+                } catch (BaseException e) {
+                    e.printStackTrace();
+                    reason.append(e.getMessage());
+                }
+            } else {
+                reason.append("身份证号码为空,请检查传入参数idcard");
+            }
+
+            if (sex != null && sex != "") {
+                if (sex.equals("女")) {
+                    enInfo.setGender(Genders.Female);
+                    ccPeInfo.setGender(Genders.Female);
+                } else {
+                    enInfo.setGender(Genders.Male);
+                    ccPeInfo.setGender(Genders.Male);
+                }
+            } else {
+                reason.append("性别为空,请检查传入参数sex");
+            }
+
+            if (birthDate != null && birthDate != "") {
+                DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+                enInfo.setBirthday(format1.parse(birthDate));
+                ccPeInfo.setBirthday(format1.parse(birthDate));
+            } else {
+                reason.append("出生日期为空,请检查传入参数birthDate");
+            }
+
+            if (tel != null && tel != "") {
+                enInfo.setTelNum(tel);
+                ccPeInfo.setCell(tel);
+            } else {
+                reason.append("手机号码为空,请检查传入参数tel");
+            }
+
+            StandingInfo sdInfo = new StandingInfo();
+            if (rank != null && rank != "") {
+                if (rank.equals("工人")) {
+                    sdInfo = StandingFactory.getLocalInstance(ctx).getStandingInfo(" where name = '工人'");
+                    enInfo.setStanding(sdInfo);
+                    ccPeInfo.setStanding(sdInfo);
+                } else if (rank.equals("职员")) {
+                    sdInfo = StandingFactory.getLocalInstance(ctx).getStandingInfo(" where name = '职员'");
+                    enInfo.setStanding(sdInfo);
+                    ccPeInfo.setStanding(sdInfo);
+                }
+            } else {
+                reason.append("入职员工身份类型为空,请检查传入参数rank");
+            }
+
+            new EmployeeTypeInfo();
+            if (personLev != null && personLev != "") {
+                EmployeeTypeInfo emInfo;
+                if (personLev.indexOf("试用") >= 0) {
+                    emInfo = EmployeeTypeFactory.getLocalInstance(ctx).getEmployeeTypeInfo(" where name = '试用员工'");
+                } else {
+                    emInfo = EmployeeTypeFactory.getLocalInstance(ctx).getEmployeeTypeInfo(" where name = '正式员工'");
+                }
+
+                enInfo.setEmpType(emInfo);
+            } else {
+                reason.append("入职员工用工关系状态为空,请检查传入参数personLev");
+            }
+
+            new HRBizDefineInfo();
+            StringBuilder sql = new StringBuilder("select p.fid,p.FEmployeeTypeID,pp.FPrimaryPositionID,pp.FPersonDep from t_bd_person p ");
+            sql.append(" left join T_HR_PersonPosition pp on pp.fpersonid=p.fid ");
+            sql.append(" where p.FIDCardNO='" + idcard + "'");
+            IRowSet rs9 = DbUtil.executeQuery(ctx, sql.toString());
+            if (rs9.next()) {
+                PersonInfo personInfo = new PersonInfo();
+                personInfo.setId(BOSUuid.read(rs9.getString("fid")));
+                new PositionInfo();
+                PositionInfo positionInfo = PositionFactory.getLocalInstance(ctx).getPositionInfo(new ObjectUuidPK(rs9.getString("FPrimaryPositionID")));
+                AdminOrgUnitInfo adminOrgUnitInfo = AdminOrgUnitFactory.getLocalInstance(ctx).getAdminOrgUnitInfo(new ObjectUuidPK(rs9.getString("FPersonDep")));
+                enInfo.setOldPosition(positionInfo);
+                enInfo.setOldAdminOrg(adminOrgUnitInfo);
+                EmployeeTypeInfo employeeTypeInfo = EmployeeTypeFactory.getLocalInstance(ctx).getEmployeeTypeInfo(new ObjectUuidPK(rs9.getString("FEmployeeTypeID")));
+                enInfo.setOldEmpType(employeeTypeInfo);
+                HRBizDefineInfo hrdInfo = HRBizDefineFactory.getLocalInstance(ctx).getHRBizDefineCollection(" where number='SHR02'").get(0);
+                enInfo.setHrBizDefine(hrdInfo);
+                enInfo.setPerson(personInfo);
+                enInfo.setUseOldNumber(false);
+                enInfo.setEnrollAgain(true);
+                enInfo.setIsPrimary(false);
+            } else {
+                enInfo.setHrBizDefine(HRBizDefineFactory.getLocalInstance(ctx).getHRBizDefineInfo(new ObjectUuidPK("DawAAAApC9DmaL7Z")));
+            }
+
+            new AffairActionReasonInfo();
+            AffairActionReasonInfo affInfo = AffairActionReasonFactory.getLocalInstance(ctx).getAffairActionReasonInfo(new ObjectUuidPK("1wXho31/Tsi0LhiLKfCQ+JYRae4="));
+            enInfo.setAffairActionReason(affInfo);
+            new VariationReasonInfo();
+            VariationReasonInfo varInfo = VariationReasonFactory.getLocalInstance(ctx).getVariationReasonInfo(new ObjectUuidPK("3LGpEFtuQoWg7hgx2AmOeOas36w="));
+            enInfo.setVariationReason(varInfo);
+            if (diplNumber != null) {
+                new DiplomaInfo();
+                DiplomaInfo dipl = DiplomaFactory.getLocalInstance(ctx).getDiplomaInfo(" where number ='" + diplNumber + "'");
+                enInfo.setString("diploma", dipl.getId().toString());
+                enInfo.setBoolean("isHighest", true);
+            }
+
+            if (probation != null && probation != "") {
+                enInfo.setProbation(Integer.valueOf(probation));
+            } else {
+                reason.append("试用期为空,请检查传入参数probation");
+            }
+
+            if (becomeDate != null && becomeDate != "") {
+                DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+                enInfo.setPlanFormalDate(format1.parse(becomeDate));
+            } else {
+                reason.append("预计转正日期为空,请检查传入参数becomeDate");
+            }
+
+            if (yearBonus == null || yearBonus == "") {
+                reason.append("年终奖系数为空,请检查传入参数yearBonus");
+            }
+
+            if (null != endlishName && !"".equals(endlishName)) {
+                enInfo.setString("endlishName", endlishName);
+            } else {
+                enInfo.setString("endlishName", (String)null);
+            }
+
+            enInfo.setString("oaNumber", oaNumber);
+            enInfo.setId(BOSUuid.create("04BEFD73"));
+            info.setId(BOSUuid.create("B41CAA3F"));
+            info.setIsMultiEntry(false);
+            info.getEntrys().add(enInfo);
+            System.out.println("info:" + info);
+            if (reason.length() <= 0) {
+                enInfo.setUseOldNumber(false);
+                String qz = companyInfo.getFax();
+                ICodingRuleManager iCodingRuleManager = CodingRuleManagerFactory.getLocalInstance(ctx);
+                number = iCodingRuleManager.getNumber(ccPeInfo, hrInfo.getId().toString());
+                enInfo.setEmpNumber(qz + number);
+            }
+
+            rankSql = "UPDATE T_BD_PERSON SET FSTANDINGID='" + sdInfo.getId() + "'  WHERE FNUMBER = '" + number + "'";
+            xjbmSql = "UPDATE T_BD_PERSON SET CFSubordinateDepar=(SELECT FID FROM CT_CUS_Xjbm where FNumber = '" + lowerDep + "') WHERE FNUMBER = '" + number + "'";
+        } catch (Exception e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        }
+
+        enInfo.setBill(info);
+        if (reason.length() > 0) {
+            msgType = "0";
+            msg = "失败";
+        } else {
+            try {
+                IObjectPK pk = EmpEnrollBizBillFactory.getLocalInstance(ctx).save(info);
+                fid = pk.toString();
+            } catch (EASBizException e) {
+                reason.append(e.getMessage());
+            } catch (BOSException e) {
+                reason.append(e.getMessage());
+            }
+
+            if (reason.length() > 0) {
+                msgType = "0";
+                msg = "失败";
+            } else {
+                msg = "成功";
+                msgType = "1";
+                String nuSql = "select FNumber from T_HR_EmpEnrollBizBill where FID = '" + fid + "'";
+
+                try {
+                    IRowSet nuSet = DbUtil.executeQuery(ctx, nuSql.toString());
+                    if (nuSet.next()) {
+                        fnumber = nuSet.getString("FNumber");
+                    }
+                } catch (BOSException e) {
+                    e.printStackTrace();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+
+                this.setOtherParam(ctx, lowerDep, yearBonus, fid);
+            }
+        }
+
+        reurnMap.put("reason", reason.toString());
+        reurnMap.put("msgType", msgType);
+        reurnMap.put("msg", msg);
+        reurnMap.put("fid", fid);
+        reurnMap.put("fnumber", fnumber);
+        return reurnMap;
+    }
+
+    private void setOtherParam(Context ctx, String lowerDep, String yearBonus, String id) {
+        String xjbmSql = "UPDATE T_HR_EmpEnrollBizBillEntry SET CFXjbmID = (SELECT FID FROM CT_CUS_Xjbm where FNumber = '" + lowerDep + "')  WHERE FBillID = '" + id + "' ";
+        String nzjSql = "UPDATE T_HR_EmpEnrollBizBillEntry SET CFNzjfaID = (SELECT FID FROM CT_MP_Nzjfa where FName_l2 = '" + yearBonus + "')  WHERE FBillID = '" + id + "' ";
+
+        try {
+            DbUtil.execute(ctx, xjbmSql);
+            DbUtil.execute(ctx, nzjSql);
+        } catch (BOSException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    private void setCompProgram(Context ctx, String compProgram, Date cpDate, String perNumber, String applier) {
+        int woMon = 0;
+        new CmpItemInfo();
+        UserInfo usInfo = new UserInfo();
+
+        try {
+            Properties prop = new Properties();
+            prop.load(new FileInputStream(System.getProperty("EAS_HOME") + "/server/properties/lgl/cmpItem.properties"));
+            String nums = prop.getProperty("number1");
+            CmpItemInfo cmInfo = CmpItemFactory.getLocalInstance(ctx).getCmpItemInfo("where number='" + nums + "'");
+            String sqls = "select us.FID ID from T_PM_USER us INNER JOIN T_BD_PERSON pe ON US.FPERSONID = PE.FID WHERE pe.FNUMBER = '" + applier + "'";
+            IRowSet asSet = DbUtil.executeQuery(ctx, sqls.toString());
+            if (asSet.next()) {
+                usInfo = UserFactory.getLocalInstance(ctx).getUserInfo(new ObjectUuidPK(asSet.getString("ID")));
+            }
+
+            woMon = Integer.parseInt(compProgram);
+            FixAdjustSalaryInfo info = new FixAdjustSalaryInfo();
+            info.setId(BOSUuid.create("0715640C"));
+            info.setCmpItem(cmInfo);
+            info.setMoney(new BigDecimal(woMon));
+            info.setEffectDay(cpDate);
+            info.setCreateTime(new Timestamp(System.currentTimeMillis()));
+            info.setCreator(usInfo);
+            PersonInfo personInfo = PersonFactory.getLocalInstance(ctx).getPersonCollection(" where number = '" + perNumber + "'").get(0);
+            info.setPerson(personInfo);
+            FixAdjustSalaryFactory.getLocalInstance(ctx).save(info);
+        } catch (EASBizException e) {
+            e.printStackTrace();
+        } catch (BOSException e) {
+            e.printStackTrace();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+    }
+}

+ 421 - 0
websrc/com/kingdee/eas/custom/lgl/service/SaveFluctuationBizBillService.java

@@ -0,0 +1,421 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by FernFlower decompiler)
+//
+
+package com.kingdee.eas.custom.lgl.service;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.BOSObjectFactory;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.bsf.service.app.IHRMsfService;
+import com.kingdee.bos.dao.IObjectPK;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+import com.kingdee.bos.util.BOSObjectType;
+import com.kingdee.eas.base.permission.UserFactory;
+import com.kingdee.eas.base.permission.UserInfo;
+import com.kingdee.eas.basedata.org.AdminOrgUnitFactory;
+import com.kingdee.eas.basedata.org.AdminOrgUnitInfo;
+import com.kingdee.eas.basedata.org.HROrgUnitFactory;
+import com.kingdee.eas.basedata.org.HROrgUnitInfo;
+import com.kingdee.eas.basedata.org.PositionCollection;
+import com.kingdee.eas.basedata.org.PositionFactory;
+import com.kingdee.eas.basedata.org.PositionInfo;
+import com.kingdee.eas.basedata.person.PersonCollection;
+import com.kingdee.eas.basedata.person.PersonFactory;
+import com.kingdee.eas.basedata.person.PersonInfo;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.framework.CoreBaseCollection;
+import com.kingdee.eas.framework.ICoreBase;
+import com.kingdee.eas.framework.ObjectBaseInfo;
+import com.kingdee.eas.hr.affair.FluctuationBizBillEntryInfo;
+import com.kingdee.eas.hr.affair.FluctuationBizBillFactory;
+import com.kingdee.eas.hr.affair.FluctuationBizBillInfo;
+import com.kingdee.eas.hr.base.AffairActionReasonFactory;
+import com.kingdee.eas.hr.base.AffairActionReasonInfo;
+import com.kingdee.eas.hr.base.EmployeeTypeFactory;
+import com.kingdee.eas.hr.base.EmployeeTypeInfo;
+import com.kingdee.eas.hr.base.HRBillStateEnum;
+import com.kingdee.eas.hr.base.HRBizDefineFactory;
+import com.kingdee.eas.hr.base.HRBizDefineInfo;
+import com.kingdee.eas.hr.base.VariationReasonFactory;
+import com.kingdee.eas.hr.base.VariationReasonInfo;
+import com.kingdee.eas.hr.emp.PersonPositionFactory;
+import com.kingdee.eas.hr.emp.PersonPositionInfo;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+
+public class SaveFluctuationBizBillService implements IHRMsfService {
+    private static Logger logger = Logger.getLogger("com.kingdee.eas.custom.service.SaveFluctuationBizBillService");
+
+    public Object process(Context arg0, Map arg1) throws EASBizException, BOSException {
+        System.out.println("开始执行调动单接口...");
+        new HashMap();
+        String number = (String)arg1.get("number");
+        String personNumbe = (String)arg1.get("personNumber");
+        String bizDate = (String)arg1.get("bizDate");
+        String position = (String)arg1.get("position");
+        String remarks = (String)arg1.get("remarks");
+        String oaNumber = (String)arg1.get("oaNumber");
+        String applier = (String)arg1.get("applier");
+        String applyDate = (String)arg1.get("applyDate");
+        String zwjb = (String)arg1.get("zwjb");
+        String sapDep = (String)arg1.get("sapDep");
+        String yybmbm = (String)arg1.get("yybmbm");
+        String yybm = (String)arg1.get("yybm");
+        if (StringUtils.isNotBlank(sapDep) && sapDep.indexOf("-") > 0) {
+            String[] sapDeps = sapDep.split("-");
+            if(sapDeps.length == 2){
+                yybmbm = sapDeps[0];
+                yybm = sapDeps[1];
+            }else  if(sapDeps.length == 1){
+                yybmbm = sapDeps[0];
+            }
+        }
+
+        String groupClass = (String)arg1.get("groupClass");
+        String groupClassDetails = (String)arg1.get("groupClassDetails");
+        String reimLevel = (String)arg1.get("reimLevel");
+        String bpcbmfldm = (String)arg1.get("bpcbmfldm");
+        String fyfl1 = (String)arg1.get("fyfl1");
+        String fyfl2 = (String)arg1.get("fyfl2");
+        String bmfl3 = (String)arg1.get("bmfl3");
+        String bmfl4 = (String)arg1.get("bmfl4");
+        if (StringUtils.isNotBlank(groupClass) && groupClass.indexOf("-") > 0) {
+            String[] groupClasss = groupClass.split("-");
+            if (groupClasss.length == 3) {
+                fyfl1 = groupClasss[0];
+                fyfl2 = groupClasss[1];
+                bmfl3 = groupClasss[2];
+            }else  if(groupClasss.length == 2) {
+                fyfl1 = groupClasss[0];
+                fyfl2 = groupClasss[1];
+            }else  if(groupClasss.length == 1) {
+                fyfl1 = groupClasss[0];
+            }
+
+        }
+
+        boolean isZyb = (String)arg1.get("isZyb") != "1";
+        String lowerDep = (String)arg1.get("lowerDep");
+        System.out.println("获取的参数值:number=" + number + ",personNumbe=" + personNumbe + ",bizDate=" + bizDate + ",position=" + position + ",isZyb=" + isZyb + ",remarks=" + remarks + ",oaNumber=" + oaNumber + ",applier=" + applier + ",applyDate=" + applyDate + ",lowerDep=" + lowerDep);
+        Map<Object, Object> resultMap = this.createFluctuationBizBill(arg0, number, personNumbe, bizDate, position, isZyb, remarks, oaNumber, applier, applyDate, lowerDep, zwjb, yybmbm, groupClass, reimLevel, yybm, bpcbmfldm, groupClassDetails, fyfl1, fyfl2, bmfl3, groupClassDetails);
+        System.out.println("执行调动单接口结束...");
+        return resultMap;
+    }
+
+    public Map<Object, Object> createFluctuationBizBill(Context ctx, String number, String personNumbe, String bizDate, String position, boolean isZyb, String remarks, String oaNumber, String applier, String applyDate, String lowerDep, String zwjb, String yybmbm, String groupClass, String reimLevel, String yybm, String bpcbmfldm, String groupClassDetails, String fyfl1, String fyfl2, String bmfl3, String bmfl4) {
+        Map<Object, Object> returnMap = new HashMap();
+        FluctuationBizBillInfo info = new FluctuationBizBillInfo();
+        FluctuationBizBillEntryInfo enInfo = new FluctuationBizBillEntryInfo();
+        String msg = null;
+        String fid = null;
+        String fnumber = null;
+        StringBuffer reason = new StringBuffer();
+        String msgType = null;
+
+        try {
+            if (number != null && number != "") {
+                info.setNumber(number);
+            } else {
+                info.setNumber("DD" + System.currentTimeMillis());
+            }
+
+            enInfo.put("yybmbm", yybmbm);
+            enInfo.put("groupClass", groupClass);
+            if (zwjb != null && "" != zwjb) {
+                ICoreBase coreBase = (ICoreBase)BOSObjectFactory.createBOSObject(ctx, new BOSObjectType("DCBAAD05"));
+                CoreBaseCollection coreBaseColl = coreBase.getCollection(" where number = '" + zwjb + "'");
+                if (coreBaseColl.size() > 0) {
+                    enInfo.put("zwjb", coreBaseColl.get(0));
+                }
+            }
+
+            enInfo.put("reimLevel", reimLevel);
+            enInfo.put("yybm", yybm);
+            enInfo.put("bpcbmfldm", bpcbmfldm);
+            enInfo.put("groupClassDetails", groupClassDetails);
+            enInfo.put("fyfl1", fyfl1);
+            enInfo.put("fyfl2", fyfl2);
+            enInfo.put("bmfl3", bmfl3);
+            enInfo.put("bmfl4", bmfl4);
+            HROrgUnitInfo hrInfo = HROrgUnitFactory.getLocalInstance(ctx).getHROrgUnitInfo(new ObjectUuidPK("00000000-0000-0000-0000-000000000000CCE7AED4"));
+            info.setHrOrgUnit(hrInfo);
+            info.setBillState(HRBillStateEnum.SAVED);
+            if (applyDate != null && applyDate != "") {
+                DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+                info.setApplyDate(format1.parse(applyDate));
+            } else {
+                info.setApplyDate(new Date());
+            }
+
+            new PersonInfo();
+            if (applier != null && applier != "") {
+                Map ap = this.getPerson(ctx, applier);
+                if (ap.get("pe") != null) {
+                    PersonInfo ueInfo = (PersonInfo)ap.get("pe");
+                    info.setApplier(ueInfo);
+                } else {
+                    reason.append("制单人编码有误,请检查传入参数applier");
+                }
+            } else {
+                reason.append("制单人编码为空,请检查传入参数applier");
+            }
+
+            new PersonInfo();
+            new PositionInfo();
+            new AdminOrgUnitInfo();
+            new AdminOrgUnitInfo();
+            if (personNumbe != null && personNumbe != "") {
+                Map pe = this.getPerson(ctx, personNumbe);
+                if (pe.get("pe") != null) {
+                    PersonInfo peInfo = (PersonInfo)pe.get("pe");
+                    enInfo.setPerson(peInfo);
+                    EmployeeTypeInfo emsInfo = EmployeeTypeFactory.getLocalInstance(ctx).getEmployeeTypeInfo(new ObjectUuidPK(peInfo.getEmployeeType().getId()));
+                    enInfo.setOldEmpType(emsInfo);
+                    enInfo.setEmpType(emsInfo);
+                } else {
+                    reason.append("调动员工编码获取员工信息有误,请检查传入参数personNumbe");
+                }
+
+                Map ap = this.getPersonAP(ctx, personNumbe);
+                if (ap.get("po") != null) {
+                    PositionInfo oldPoInfo = (PositionInfo)ap.get("po");
+                    enInfo.setOldPosition(oldPoInfo);
+                } else {
+                    reason.append("调动员工职位信息有误,请检查相关员工信息");
+                }
+
+                if (ap.get("ad") != null) {
+                    AdminOrgUnitInfo oldAdInfo = (AdminOrgUnitInfo)ap.get("ad");
+                    enInfo.setOldAdminOrg(oldAdInfo);
+                    AdminOrgUnitInfo oldCompanyInfo = AdminOrgUnitFactory.getLocalInstance(ctx).getAdminOrgUnitInfo(new ObjectUuidPK(oldAdInfo.getCompany().getId()));
+                    enInfo.setOldCompany(oldCompanyInfo);
+                } else {
+                    reason.append("调动员工组织信息有误,请检查相关员工信息");
+                }
+            } else {
+                reason.append("调动员工编码为空,请检查传入参数personNumbe");
+            }
+
+            new PositionInfo();
+            new AdminOrgUnitInfo();
+            new AdminOrgUnitInfo();
+            if (position != null && position != "") {
+                PositionCollection poCOl = PositionFactory.getLocalInstance(ctx).getPositionCollection(" where number = '" + position + "'");
+                if (poCOl.size() > 0) {
+                    PositionInfo poInfo = poCOl.get(0);
+                    enInfo.setPosition(poInfo);
+                    AdminOrgUnitInfo adInfo = AdminOrgUnitFactory.getLocalInstance(ctx).getAdminOrgUnitInfo(new ObjectUuidPK(poInfo.getAdminOrgUnit().getId()));
+                    enInfo.setAdminOrg(adInfo);
+                    AdminOrgUnitInfo companyInfo = AdminOrgUnitFactory.getLocalInstance(ctx).getAdminOrgUnitInfo(new ObjectUuidPK(adInfo.getCompany().getId()));
+                    enInfo.setCompany(companyInfo);
+                }
+            } else {
+                reason.append("调动后职位编码为空,请检查传入参数position");
+            }
+
+            if (bizDate != null && bizDate != "") {
+                DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+                enInfo.setBizDate(format1.parse(bizDate));
+            } else {
+                reason.append("调动日期为空,请检查传入参数bizDate");
+            }
+
+            enInfo.setDescription(remarks);
+            HRBizDefineInfo hrdInfo = HRBizDefineFactory.getLocalInstance(ctx).getHRBizDefineInfo(new ObjectUuidPK("DawAAAApVj/maL7Z"));
+            enInfo.setHrBizDefine(hrdInfo);
+            AffairActionReasonInfo affInfo = AffairActionReasonFactory.getLocalInstance(ctx).getAffairActionReasonInfo(new ObjectUuidPK("7ta1EwaZTZmts8L4z/J0LJYRae4="));
+            enInfo.setAffairActionReason(affInfo);
+            VariationReasonInfo varInfo = VariationReasonFactory.getLocalInstance(ctx).getVariationReasonInfo(new ObjectUuidPK("EIQNQWoyQP+Db8K7csPBNuas36w="));
+            enInfo.setVariationReason(varInfo);
+            enInfo.setString("ddqxz", this.getPeronGz(ctx, personNumbe));
+            enInfo.setBoolean("sfzyb", isZyb);
+            enInfo.setString("oaNumber", oaNumber);
+            info.getEntrys().add(enInfo);
+        } catch (ParseException e) {
+            e.printStackTrace();
+            reason.append("日期格式转化异常,请检查传入格式yyyy-MM-dd");
+        } catch (BOSException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        } catch (EASBizException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        }
+
+        if (reason.length() > 0) {
+            msgType = "0";
+            msg = "失败";
+        } else {
+            try {
+                IObjectPK pk = FluctuationBizBillFactory.getLocalInstance(ctx).save(info);
+                fid = pk.toString();
+            } catch (EASBizException e) {
+                e.printStackTrace();
+                reason.append(e.getMessage());
+            } catch (BOSException e) {
+                e.printStackTrace();
+                reason.append(e.getMessage());
+            }
+
+            if (reason.length() > 0) {
+                msgType = "0";
+                msg = "失败";
+            } else {
+                msg = "成功";
+                msgType = "1";
+                fnumber = info.getNumber();
+                if (org.apache.commons.lang.StringUtils.isBlank(lowerDep)) {
+                    this.setOtherParam(ctx, lowerDep, fid, enInfo.getPerson().getId().toString());
+                }
+            }
+        }
+
+        returnMap.put("reason", reason.toString());
+        returnMap.put("msgType", msgType);
+        returnMap.put("msg", msg);
+        returnMap.put("fid", fid);
+        returnMap.put("fnumber", fnumber);
+        return returnMap;
+    }
+
+    private void setOtherParam(Context ctx, String lowerDep, String id, String personid) {
+        String xjbmSql = "UPDATE T_HR_FluctuationBizBillEntry SET CFXjbmID = (SELECT FID FROM CT_CUS_Xjbm where FNumber = '" + lowerDep + "')  WHERE FBillID = '" + id + "' ";
+        String sql = "INSERT INTO t_person_Xjbm(fid, FXjbmID, sourceID, personID,fnumber) VALUES ('" + System.currentTimeMillis() + "', (SELECT FID FROM CT_CUS_Xjbm where FNumber = '" + lowerDep + "'), '" + id + "', '" + personid + "','" + lowerDep + "');";
+
+        try {
+            DbUtil.execute(ctx, xjbmSql);
+            DbUtil.execute(ctx, sql);
+        } catch (BOSException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    public Map<String, ObjectBaseInfo> getPersonAP(Context ctx, String number) {
+        Map<String, ObjectBaseInfo> a = new HashMap();
+        PersonPositionInfo psoInfo = null;
+        AdminOrgUnitInfo adInfo = null;
+        PositionInfo poInfo = null;
+        String sql = "SELECT PSO.FID PSOID,PO.FID POID,AD.FID ADID FROM T_BD_PERSON PE INNER JOIN T_HR_PERSONPOSITION PSO ON PE.FID = PSO.FPERSONID LEFT OUTER JOIN T_ORG_POSITION PO ON PO.FID = PSO.FPRIMARYPOSITIONID LEFT OUTER JOIN T_ORG_ADMIN AD ON AD.FID = PO.FADMINORGUNITID WHERE PE.FNUMBER = '" + number + "'";
+
+        try {
+            IRowSet asSet = DbUtil.executeQuery(ctx, sql.toString());
+            if (asSet.next()) {
+                if (asSet.getString("PSOID") != null) {
+                    psoInfo = PersonPositionFactory.getLocalInstance(ctx).getPersonPositionInfo(new ObjectUuidPK(asSet.getString("PSOID")));
+                }
+
+                if (asSet.getString("POID") != null) {
+                    poInfo = PositionFactory.getLocalInstance(ctx).getPositionInfo(new ObjectUuidPK(asSet.getString("POID")));
+                }
+
+                if (asSet.getString("ADID") != null) {
+                    adInfo = AdminOrgUnitFactory.getLocalInstance(ctx).getAdminOrgUnitInfo(new ObjectUuidPK(asSet.getString("ADID")));
+                }
+            }
+        } catch (BOSException e) {
+            e.printStackTrace();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } catch (EASBizException e) {
+            e.printStackTrace();
+        }
+
+        a.put("pso", psoInfo);
+        a.put("po", poInfo);
+        a.put("ad", adInfo);
+        System.out.println("getPersonAP:" + a);
+        return a;
+    }
+
+    public Map<String, ObjectBaseInfo> getPerson(Context ctx, String number) {
+        Map<String, ObjectBaseInfo> a = new HashMap();
+        PersonInfo peInfo = null;
+        UserInfo ueInfo = null;
+        String sql = "SELECT pe.FID PEID , UE.FID  UEID FROM T_BD_PERSON PE LEFT OUTER JOIN T_PM_USER UE ON UE.FPersonId = PE.FID WHERE PE.FNUMBER = '" + number + "'";
+
+        try {
+            IRowSet asSet = DbUtil.executeQuery(ctx, sql.toString());
+            if (asSet.next()) {
+                if (asSet.getString("PEID") != null) {
+                    peInfo = PersonFactory.getLocalInstance(ctx).getPersonInfo(new ObjectUuidPK(asSet.getString("PEID")));
+                }
+
+                if (asSet.getString("UEID") != null) {
+                    ueInfo = UserFactory.getLocalInstance(ctx).getUserInfo(new ObjectUuidPK(asSet.getString("UEID")));
+                }
+            }
+        } catch (BOSException e) {
+            e.printStackTrace();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } catch (EASBizException e) {
+            e.printStackTrace();
+        }
+
+        a.put("pe", peInfo);
+        a.put("ue", ueInfo);
+        return a;
+    }
+
+    public String getPeronGz(Context ctx, String personNumber) {
+        Properties prop = new Properties();
+        String retu = "";
+        if (personNumber != null && !"".equals(personNumber)) {
+            try {
+                prop.load(new FileInputStream(System.getProperty("EAS_HOME") + "/server/properties/lgl/personServiceParam.properties"));
+                new PersonInfo();
+                PersonCollection peCol = PersonFactory.getLocalInstance(ctx).getPersonCollection(" where number = '" + personNumber + "'");
+                if (peCol.size() > 0) {
+                    PersonInfo peInfo = peCol.get(0);
+                    String gzNumber = prop.getProperty("gz");
+                    String xmSql = "SELECT FieldSn FROM T_HR_SCmpItem where FNUMBER = '" + gzNumber + "'";
+                    IRowSet xmRs = DbUtil.executeQuery(ctx, xmSql);
+                    if (xmRs.next()) {
+                        String xh = "S" + xmRs.getString("FieldSn");
+                        String xxSql = "SELECT TOP 1 " + xh + " A FROM T_HR_SCmpCalTable where FCALSTATE = '20' and FPersonID = '" + peInfo.getId().toString() + "' order by FEndDate desc";
+                        IRowSet xxRs = DbUtil.executeQuery(ctx, xxSql);
+                        if (xxRs.next()) {
+                            new HashMap();
+                            if (xxRs.getBigDecimal("A") != null) {
+                                if (xxRs.getBigDecimal("A").compareTo(new BigDecimal(0)) > 0) {
+                                    retu = String.valueOf(xxRs.getDouble("A"));
+                                } else {
+                                    retu = "0";
+                                }
+                            } else {
+                                retu = "0";
+                            }
+                        }
+                    }
+                }
+            } catch (BOSException e) {
+                e.printStackTrace();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return retu;
+    }
+}

+ 492 - 0
websrc/com/kingdee/eas/custom/lgl/service/SubmitEffHrService.java

@@ -0,0 +1,492 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by FernFlower decompiler)
+//
+
+package com.kingdee.eas.custom.lgl.service;
+
+import com.google.common.collect.Maps;
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.BOSObjectFactory;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.bsf.service.app.IHRMsfService;
+import com.kingdee.bos.dao.IObjectPK;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+import com.kingdee.bos.util.BOSObjectType;
+import com.kingdee.eas.basedata.person.PersonFactory;
+import com.kingdee.eas.basedata.person.PersonInfo;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.framework.CoreBaseCollection;
+import com.kingdee.eas.framework.ICoreBase;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillCollection;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntryCollection;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntryInfo;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillFactory;
+import com.kingdee.eas.hr.affair.EmpEnrollBizBillInfo;
+import com.kingdee.eas.hr.affair.EmpHireBizBillCollection;
+import com.kingdee.eas.hr.affair.EmpHireBizBillEntryInfo;
+import com.kingdee.eas.hr.affair.EmpHireBizBillFactory;
+import com.kingdee.eas.hr.affair.EmpHireBizBillInfo;
+import com.kingdee.eas.hr.affair.FluctuationBizBillCollection;
+import com.kingdee.eas.hr.affair.FluctuationBizBillEntryCollection;
+import com.kingdee.eas.hr.affair.FluctuationBizBillEntryInfo;
+import com.kingdee.eas.hr.affair.FluctuationBizBillFactory;
+import com.kingdee.eas.hr.affair.FluctuationBizBillInfo;
+import com.kingdee.eas.hr.affair.ResignBizBillCollection;
+import com.kingdee.eas.hr.affair.ResignBizBillFactory;
+import com.kingdee.eas.hr.affair.ResignBizBillInfo;
+import com.kingdee.eas.hr.base.ApproveTypeEnum;
+import com.kingdee.eas.hr.base.HRBillStateEnum;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import java.sql.SQLException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
+
+public class SubmitEffHrService implements IHRMsfService {
+    public Object process(Context arg0, Map arg1) throws EASBizException, BOSException {
+        String types = (String)arg1.get("types");
+        String id = (String)arg1.get("id");
+        Map<Object, Object> reurnMap = Maps.newHashMapWithExpectedSize(10);
+        System.out.println("人事事务单据审批通过接口:" + arg1);
+        String zwjb = (String)arg1.get("zwjb");
+        String sapDep = (String)arg1.get("sapDep");
+        String yybmbm = (String)arg1.get("yybmbm");
+        String yybm = (String)arg1.get("yybm");
+        if (StringUtils.isNotBlank(sapDep) && sapDep.indexOf("-") > 0) {
+            String[] sapDeps = sapDep.split("-");
+            if(sapDeps.length == 2){
+                yybmbm = sapDeps[0];
+                yybm = sapDeps[1];
+            }else  if(sapDeps.length == 1){
+                yybmbm = sapDeps[0];
+            }
+        }
+
+        String groupClass = (String)arg1.get("groupClass");
+        String groupClassDetails = (String)arg1.get("groupClassDetails");
+        String reimLevel = (String)arg1.get("reimLevel");
+        String bpcbmfldm = (String)arg1.get("bpcbmfldm");
+        String fyfl1 = (String)arg1.get("fyfl1");
+        String fyfl2 = (String)arg1.get("fyfl2");
+        String bmfl3 = (String)arg1.get("bmfl3");
+        String bmfl4 = (String)arg1.get("bmfl4");
+        if (StringUtils.isNotBlank(groupClass) && groupClass.indexOf("-") > 0) {
+            String[] groupClasss = groupClass.split("-");
+            if (groupClasss.length == 3) {
+                fyfl1 = groupClasss[0];
+                fyfl2 = groupClasss[1];
+                bmfl3 = groupClasss[2];
+            }else  if(groupClasss.length == 2) {
+                fyfl1 = groupClasss[0];
+                fyfl2 = groupClasss[1];
+            }else  if(groupClasss.length == 1) {
+                fyfl1 = groupClasss[0];
+            }
+
+        }
+
+        if ("rz".equals(types)) {
+            String probation = (String)arg1.get("probation");
+            String yearBonus = (String)arg1.get("yearBonus");
+            String becomeDate = (String)arg1.get("becomeDate");
+            String becomeMon = (String)arg1.get("becomeMon");
+            String compDate = (String)arg1.get("compDate");
+            String bizDate = (String)arg1.get("bizDate");
+            reurnMap = this.submitEffectRZ(arg0, id, becomeMon, compDate, probation, yearBonus, becomeDate, bizDate, zwjb, yybmbm, groupClass, reimLevel, yybm, bpcbmfldm, groupClassDetails, fyfl1, fyfl2, bmfl3, groupClassDetails);
+        } else if ("lz".equals(types)) {
+            String bizDate = (String)arg1.get("compDate");
+            reurnMap = this.submitEffectLZ(arg0, id, bizDate);
+        } else if ("zz".equals(types)) {
+            String becomeMon = (String)arg1.get("becomeMon");
+            String compDate = (String)arg1.get("compDate");
+            reurnMap = this.submitEffectZZ(arg0, id, becomeMon, compDate);
+        } else if ("DD".equals(types)) {
+            String becomeMon = (String)arg1.get("becomeMon");
+            String compDate = (String)arg1.get("compDate");
+            reurnMap = this.submitEffectDD(arg0, id, becomeMon, compDate, zwjb, yybmbm, groupClass, reimLevel, yybm, bpcbmfldm, groupClassDetails, fyfl1, fyfl2, bmfl3, groupClassDetails);
+        }
+
+        return reurnMap;
+    }
+
+    public Map<Object, Object> submitEffectRZ(Context ctx, String id, String becomeMon, String compDate, String probation, String yearBonus, String becomeDate, String bizDate, String zwjb, String yybmbm, String groupClass, String reimLevel, String yybm, String bpcbmfldm, String groupClassDetails, String fyfl1, String fyfl2, String bmfl3, String bmfl4) {
+        Map reurnMap = new HashMap();
+        String msg = null;
+        String fid = null;
+        String fnumber = null;
+        StringBuffer reason = new StringBuffer();
+        String msgType = null;
+        String personNumber = null;
+        String txStr = null;
+        new EmpEnrollBizBillCollection();
+        EmpEnrollBizBillInfo enInfo = new EmpEnrollBizBillInfo();
+        PersonInfo peInfo = new PersonInfo();
+
+        try {
+            EmpEnrollBizBillCollection enCol = EmpEnrollBizBillFactory.getLocalInstance(ctx).getEmpEnrollBizBillCollection(" where number='" + id + "'");
+            if (enCol.size() > 0) {
+                DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+                enInfo = enCol.get(0);
+                EmpEnrollBizBillEntryCollection enInfoCON = enInfo.getEntrys();
+
+                for(int i = 0; i < enInfoCON.size(); ++i) {
+                    EmpEnrollBizBillEntryInfo enInfoEny = enInfoCON.get(i);
+                    enInfoEny.put("yybmbm", yybmbm);
+                    enInfoEny.put("groupClass", groupClass);
+                    new PersonInfo();
+                    if (zwjb != null && "" != zwjb) {
+                        ICoreBase coreBase = (ICoreBase)BOSObjectFactory.createBOSObject(ctx, new BOSObjectType("DCBAAD05"));
+                        CoreBaseCollection coreBaseColl = coreBase.getCollection(" where number = '" + zwjb + "'");
+                        if (coreBaseColl.size() > 0) {
+                            enInfoEny.put("zwjb", coreBaseColl.get(0));
+                        }
+                    }
+
+                    enInfoEny.put("reimLevel", reimLevel);
+                    enInfoEny.put("yybm", yybm);
+                    enInfoEny.put("bpcbmfldm", bpcbmfldm);
+                    enInfoEny.put("groupClassDetails", groupClassDetails);
+                    enInfoEny.put("fyfl1", fyfl1);
+                    enInfoEny.put("fyfl2", fyfl2);
+                    enInfoEny.put("bmfl3", bmfl3);
+                    enInfoEny.put("bmfl4", bmfl4);
+                }
+
+                EmpEnrollBizBillFactory.getLocalInstance(ctx).save(enInfo);
+                if (probation != null && probation != "") {
+                    enInfo.getEntrys().get(0).setProbation(Integer.valueOf(probation));
+                }
+
+                if (bizDate != null && !"".equals(bizDate)) {
+                    enInfo.getEntrys().get(0).setBizDate(format1.parse(bizDate));
+                }
+
+                enInfo.getEntrys().get(0).setPlanFormalDate(format1.parse(becomeDate));
+                EmpEnrollBizBillFactory.getLocalInstance(ctx).submitEffect(enInfo);
+                String peSql = "SELECT FNUMBER FROM T_BD_PERSON WHERE FID = (SELECT FPERSONID FROM T_HR_EmpEnrollBizBillEntry where FBILLID = (select FID from T_HR_EmpEnrollBizBill where FNUMBER = '" + id + "'))";
+                IRowSet peSet = DbUtil.executeQuery(ctx, peSql.toString());
+                if (peSet.next()) {
+                    personNumber = peSet.getString("FNUMBER");
+                    peInfo = PersonFactory.getLocalInstance(ctx).getPersonCollection(" where number='" + personNumber + "'").get(0);
+                }
+            } else {
+                reason.append("单据编码为:" + id + " 入职单不存在,请检查相关信息!");
+            }
+        } catch (BOSException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        } catch (EASBizException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        } catch (ParseException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        }
+
+        if (reason.length() > 0) {
+            msg = "失败";
+            msgType = "0";
+        } else {
+            msg = "成功";
+            msgType = "1";
+            fnumber = id;
+            fid = enInfo.getId().toString();
+            EmpEnrollBizBillEntryInfo ebEnInfo = enInfo.getEntrys().get(0);
+            if (org.apache.commons.lang.StringUtils.isNotBlank(becomeMon)) {
+                String rzStr = "UPDATE T_HR_EmpEnrollBizBillEntry SET CFGz='" + becomeMon + "',FZDY11='" + compDate + "'  WHERE  FBILLID = '" + fid + "'";
+                String nzStr = "UPDATE T_HR_EmpEnrollBizBillEntry SET CFNzjfaID=(SELECT FID FROM CT_MP_Nzjfa where fname_l2 = '" + yearBonus + "')  WHERE FBILLID = '" + fid + "'";
+
+                try {
+                    DbUtil.execute(ctx, rzStr);
+                    DbUtil.execute(ctx, nzStr);
+                } catch (BOSException e) {
+                    e.printStackTrace();
+                }
+            }
+
+            this.setPersonEx(ctx, ebEnInfo, peInfo.getNumber());
+        }
+
+        if (txStr != null) {
+            reurnMap.put("reason", reason.toString() + "," + txStr);
+        } else {
+            reurnMap.put("reason", reason.toString());
+        }
+
+        reurnMap.put("personNumber", personNumber);
+        reurnMap.put("msgType", msgType);
+        reurnMap.put("msg", msg);
+        reurnMap.put("fid", fid);
+        reurnMap.put("fnumber", fnumber);
+        return reurnMap;
+    }
+
+    public Map<Object, Object> submitEffectLZ(Context ctx, String id, String bizDate) {
+        Map reurnMap = new HashMap();
+        String msg = null;
+        String fid = null;
+        String fnumber = null;
+        StringBuffer reason = new StringBuffer();
+        String msgType = null;
+        DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+        ResignBizBillInfo rbInfo = new ResignBizBillInfo();
+        new ResignBizBillCollection();
+
+        try {
+            ResignBizBillCollection rbCol = ResignBizBillFactory.getLocalInstance(ctx).getResignBizBillCollection(" where number = '" + id + "'");
+            if (rbCol.size() > 0) {
+                rbInfo = rbCol.get(0);
+                if (org.apache.commons.lang.StringUtils.isNotBlank(bizDate)) {
+                    rbInfo.getEntrys().get(0).setBizDate(format1.parse(bizDate));
+                }
+
+                ResignBizBillFactory.getLocalInstance(ctx).submitEffect(rbInfo);
+            } else {
+                reason.append("单据编码为:" + id + " 离职单不存在,请检查相关信息!");
+            }
+        } catch (EASBizException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        } catch (BOSException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        } catch (ParseException e) {
+            e.printStackTrace();
+            reason.append("离职生效日期格式转化异常_yyyy-MM-dd," + e.getMessage());
+        }
+
+        if (reason.length() > 0) {
+            msg = "失败";
+            msgType = "0";
+        } else {
+            msg = "成功";
+            msgType = "1";
+            fnumber = id;
+            fid = rbInfo.getId().toString();
+        }
+
+        reurnMap.put("reason", reason.toString());
+        reurnMap.put("msgType", msgType);
+        reurnMap.put("msg", msg);
+        reurnMap.put("fid", fid);
+        reurnMap.put("fnumber", fnumber);
+        return reurnMap;
+    }
+
+    public Map<Object, Object> submitEffectZZ(Context ctx, String id, String becomeMon, String compDate) {
+        Map reurnMap = new HashMap();
+        String msg = null;
+        String fid = null;
+        String fnumber = null;
+        StringBuffer reason = new StringBuffer();
+        String msgType = null;
+        String txStr = null;
+        EmpHireBizBillInfo ehInfo = new EmpHireBizBillInfo();
+        new EmpHireBizBillCollection();
+
+        try {
+            EmpHireBizBillCollection ehCol = EmpHireBizBillFactory.getLocalInstance(ctx).getEmpHireBizBillCollection(" where number = '" + id + "'");
+            if (ehCol.size() > 0) {
+                ehInfo = ehCol.get(0);
+                if (ehInfo.getBillState() == null) {
+                    ehInfo.setBillState(HRBillStateEnum.SAVED);
+                }
+
+                ehInfo.setIsMultiEntry(Boolean.TRUE);
+                ehInfo.setApproveType(ApproveTypeEnum.DIRECT);
+                EmpHireBizBillFactory.getLocalInstance(ctx).submitEffect(ehInfo);
+            } else {
+                reason.append("单据编码为:" + id + " 转正单不存在,请检查相关信息!");
+            }
+        } catch (BOSException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        } catch (EASBizException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        }
+
+        if (reason.length() > 0) {
+            msg = "失败";
+            msgType = "0";
+        } else {
+            msg = "成功";
+            msgType = "1";
+            fnumber = id;
+            fid = ehInfo.getId().toString();
+            EmpHireBizBillEntryInfo ehEnInfo = ehInfo.getEntrys().get(0);
+            if (org.apache.commons.lang.StringUtils.isNotBlank(becomeMon)) {
+                String zzStr = "UPDATE T_HR_EmpHireBizBillEntry SET CFZzhxz='" + becomeMon + "',FZDY11='" + compDate + "' WHERE  FBillID = '" + fid + "'";
+
+                try {
+                    DbUtil.execute(ctx, zzStr);
+                } catch (BOSException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        if (txStr != null) {
+            reurnMap.put("reason", reason.toString() + "," + txStr);
+        } else {
+            reurnMap.put("reason", reason.toString());
+        }
+
+        reurnMap.put("msgType", msgType);
+        reurnMap.put("msg", msg);
+        reurnMap.put("fid", fid);
+        reurnMap.put("fnumber", fnumber);
+        return reurnMap;
+    }
+
+    public Map<Object, Object> submitEffectDD(Context ctx, String id, String becomeMon, String compDate, String zwjb, String yybmbm, String groupClass, String reimLevel, String yybm, String bpcbmfldm, String groupClassDetails, String fyfl1, String fyfl2, String bmfl3, String bmfl4) {
+        Map reurnMap = new HashMap();
+        String fids = null;
+        String msg = null;
+        String fid = null;
+        String fnumber = null;
+        String personNum = null;
+        StringBuffer reason = new StringBuffer();
+        String msgType = null;
+        String txStr = null;
+        FluctuationBizBillInfo fuInfo = new FluctuationBizBillInfo();
+        new FluctuationBizBillCollection();
+
+        try {
+            FluctuationBizBillCollection fuCol = FluctuationBizBillFactory.getLocalInstance(ctx).getFluctuationBizBillCollection(" where number= '" + id + "'");
+            if (fuCol.size() > 0) {
+                fuInfo = fuCol.get(0);
+                FluctuationBizBillEntryCollection enInfoCON = fuInfo.getEntrys();
+
+                for(int i = 0; i < enInfoCON.size(); ++i) {
+                    FluctuationBizBillEntryInfo enInfoEny = enInfoCON.get(i);
+                    enInfoEny.put("yybmbm", yybmbm);
+                    enInfoEny.put("groupClass", groupClass);
+                    new PersonInfo();
+                    if (zwjb != null && "" != zwjb) {
+                        ICoreBase coreBase = (ICoreBase)BOSObjectFactory.createBOSObject(ctx, new BOSObjectType("DCBAAD05"));
+                        CoreBaseCollection coreBaseColl = coreBase.getCollection(" where number = '" + zwjb + "'");
+                        if (coreBaseColl.size() > 0) {
+                            enInfoEny.put("zwjb", coreBaseColl.get(0));
+                        }
+                    }
+
+                    enInfoEny.put("reimLevel", reimLevel);
+                    enInfoEny.put("yybm", yybm);
+                    enInfoEny.put("bpcbmfldm", bpcbmfldm);
+                    enInfoEny.put("groupClassDetails", groupClassDetails);
+                    enInfoEny.put("fyfl1", fyfl1);
+                    enInfoEny.put("fyfl2", fyfl2);
+                    enInfoEny.put("bmfl3", bmfl3);
+                    enInfoEny.put("bmfl4", bmfl4);
+                }
+
+                FluctuationBizBillFactory.getLocalInstance(ctx).save(fuInfo);
+                IObjectPK pks = FluctuationBizBillFactory.getLocalInstance(ctx).submitEffect(fuInfo);
+                fids = pks.toString();
+            } else {
+                reason.append("单据编码为:" + id + " 调动单不存在,请检查相关信息!");
+            }
+        } catch (EASBizException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        } catch (BOSException e) {
+            e.printStackTrace();
+            reason.append(e.getMessage());
+        }
+
+        if (reason.length() > 0) {
+            msg = "失败";
+            msgType = "0";
+        } else {
+            msg = "成功";
+            msgType = "1";
+            fnumber = id;
+            fid = fuInfo.getId().toString();
+            FluctuationBizBillEntryInfo fuEnInfo = fuInfo.getEntrys().get(0);
+
+            try {
+                PersonInfo peInfo = PersonFactory.getLocalInstance(ctx).getPersonInfo(new ObjectUuidPK(fuEnInfo.getPerson().getId()));
+                personNum = peInfo.getNumber();
+                if (org.apache.commons.lang.StringUtils.isNotBlank(becomeMon)) {
+                    String ddStr = "UPDATE T_HR_FluctuationBizBillEntry SET CFDdhgz2='" + becomeMon + "',FZDY11='" + compDate + "'  WHERE FBillID = '" + fid + "'";
+                    DbUtil.execute(ctx, ddStr);
+                }
+            } catch (EASBizException e) {
+                e.printStackTrace();
+            } catch (BOSException e) {
+                e.printStackTrace();
+            }
+
+            this.setPersonDDEx(ctx, fids, personNum);
+        }
+
+        if (txStr != null) {
+            reurnMap.put("reason", reason.toString() + "," + txStr);
+        } else {
+            reurnMap.put("reason", reason.toString());
+        }
+
+        reurnMap.put("msgType", msgType);
+        reurnMap.put("msg", msg);
+        reurnMap.put("fid", fid);
+        reurnMap.put("fnumber", fnumber);
+        return reurnMap;
+    }
+
+    public void setPersonDDEx(Context ctx, String ids, String personNum) {
+        String xjbmSql = "select CFXjbmID from T_HR_FluctuationBizBillEntry WHERE FBillID = '" + ids + "'";
+
+        try {
+            IRowSet xjbmSet = DbUtil.executeQuery(ctx, xjbmSql);
+            if (xjbmSet.next() && org.apache.commons.lang.StringUtils.isNotBlank(xjbmSet.getString("CFXjbmID"))) {
+                String xjbmPeSql = "UPDATE T_BD_PERSON SET CFXjbmID='" + xjbmSet.getString("CFXjbmID") + "' WHERE FNUMBER = '" + personNum + "'";
+                DbUtil.execute(ctx, xjbmPeSql);
+            }
+        } catch (BOSException e) {
+            e.printStackTrace();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    public void setPersonEx(Context ctx, EmpEnrollBizBillEntryInfo ebEnInfo, String number) {
+        String seSql = "select FStandingID,CFXjbmID,CFNzjfaID from T_HR_EmpEnrollBizBillEntry where FID= '" + ebEnInfo.getId().toString() + "'";
+
+        try {
+            IRowSet seSet = DbUtil.executeQuery(ctx, seSql.toString());
+            if (seSet.next()) {
+                if (org.apache.commons.lang.StringUtils.isNotBlank(seSet.getString("CFXjbmID"))) {
+                    String xjbmSql = "UPDATE T_BD_PERSON SET CFXjbmID='" + seSet.getString("CFXjbmID") + "' WHERE FNUMBER = '" + number + "'";
+                    DbUtil.execute(ctx, xjbmSql);
+                }
+
+                if (org.apache.commons.lang.StringUtils.isNotBlank(seSet.getString("FStandingID"))) {
+                    String rankSql = "UPDATE T_BD_PERSON SET FSTANDINGID='" + seSet.getString("FStandingID") + "'  WHERE FNUMBER = '" + number + "'";
+                    DbUtil.execute(ctx, rankSql);
+                }
+
+                if (org.apache.commons.lang.StringUtils.isNotBlank(seSet.getString("CFNzjfaID"))) {
+                    String nzSql = "UPDATE T_BD_PERSON SET CFNzjfaID='" + seSet.getString("CFNzjfaID") + "'  WHERE FNUMBER = '" + number + "'";
+                    DbUtil.execute(ctx, nzSql);
+                }
+            }
+        } catch (BOSException e) {
+            e.printStackTrace();
+            System.out.println(e.getMessage());
+        } catch (SQLException e) {
+            e.printStackTrace();
+            System.out.println(e.getMessage());
+        }
+
+    }
+}

+ 64 - 36
websrc/com/kingdee/eas/custom/szpgm/osf/service/GetEmpInfoOsfService.java

@@ -24,8 +24,10 @@ import java.util.*;
  *     <li><b>T_HR_BDEmployeeType</b>(ty)—— 用工关系类型表</li>
  *     <li><b>T_HR_PERSONCONTACTMETHOD</b>(pm)—— 员工联系方式表</li>
  *     <li><b>t_hr_personposition</b>(ppos)—— 员工岗位关联表</li>
- *     <li><b>t_org_position</b>(pos)—— 组织岗位表</li>
- *     <li><b>T_HR_EMPPOSTEXPERIENCEHIS</b>(phis)—— 岗位任职历史表,取当前上级</li>
+ *     <li><b>t_org_position</b>(pos)—— 岗位表,取主岗位信息</li>
+ *     <li><b>t_org_admin</b>(org)—— 行政组织表</li>
+ *     <li><b>T_HR_EMPPOSTEXPERIENCEHIS</b>(phis)—— 岗位任职历史表,通过上级岗位取当前上级</li>
+ *     <li><b>t_bd_person</b>(ppe)—— 员工基础信息表(二次关联,取上级员工信息)</li>
  *     <li><b>t_pm_user</b>(puser)—— 用户账号表</li>
  * </ul>
  *
@@ -52,13 +54,13 @@ import java.util.*;
  *         "idcardno": "身份证号",
  *         "tyname": "用工关系类型",
  *         "inservice": "是否在职(1或4为在职)",
- *         "gender": "性别(1男,2女)",
- *         "globalroaming": "区号",
- *         "ncell": "电话号码",
+ *         "gender": "性别(1:男,2:女)",
+ *         "globalroaming": "国际区号",
+ *         "ncell": "手机号码",
  *         "joindate": "入司日期",
- *         "orgid": "组织ID",
- *         "posid": "岗位ID",
- *         "leader": ["上级ID列表"],
+ *         "orgCode": "所属组织编码",
+ *         "posCode": "主岗位编码",
+ *         "leader": ["上级员工编码列表"],
  *         "userAccount": "登录账号",
  *         "officephone": "办公电话",
  *         "passportno": "护照号码"
@@ -165,21 +167,29 @@ public class GetEmpInfoOsfService  implements IHRMsfService {
             // 遍历结果集,将同一员工的多行数据合并为一条记录
             while (rs.next()) {
                 String id = rs.getString("id");
-                Map<String, Object> param = maps.get(id);
-                // 首次遇到该员工时,初始化记录并创建上级ID列表
-                if (null == param) {
-                    param = new HashMap<>();
-                    List<String> leaderIds = new ArrayList<>();
-                    param.put("leader", leaderIds);
-                    maps.put(id, param);
-                }
-                // 收集该员工的所有上级ID(多行数据的共同字段会覆盖,但值相同)
-                List<String> leader = (List<String>) param.get("leader");
-                leader.add(rs.getString("leader"));
+                Map<String, Object> param = new HashMap<>();
+//                Map<String, Object> param = maps.get(id);
+//                // 首次遇到该员工时,初始化记录并创建上级编码列表
+//                if (null == param) {
+//                    param = new HashMap<>();
+//                    List<String> leaderIds = new ArrayList<>();
+//                    param.put("leader", leaderIds);
+//                    maps.put(id, param);
+//                }
+//                // 收集该员工的所有上级编码(多行数据的共同字段会覆盖,但值相同)
+//                List<String> leader = (List<String>) param.get("leader");
+//                leader.add(rs.getString("leader"));
 
                 // ---- 员工基本属性 ----
+
                 // 员工ID
                 param.put("id", id);
+                String leaderStr = rs.getString("leader");
+                List<String> leaders = new ArrayList<>();
+                if(StringUtils.isNotBlank(leaderStr)){
+                    leaders.addAll(Arrays.asList(leaderStr.split(",")));
+                }
+                param.put("leader", leaders);
                 // 员工编码
                 param.put("code", rs.getString("code"));
                 // 员工名称
@@ -202,11 +212,12 @@ public class GetEmpInfoOsfService  implements IHRMsfService {
                 param.put("joindate", (null != joindate ? sdf.format(joindate) : null));
 
                 // ---- 组织与岗位 ----
-                // 所属组织ID
-                param.put("orgid", rs.getString("orgid"));
-                // 主岗位ID
-                param.put("posid", rs.getString("posid"));
-
+                // 所属组织编码
+                param.put("orgCode", rs.getString("orgCode"));
+                // 主岗位编码
+                param.put("posCode", rs.getString("posCode"));
+                //顺序码
+                param.put("disporder", rs.getString("disporder"));
                 // ---- 账号与联系方式 ----
                 // 员工登录账号
                 param.put("userAccount", rs.getString("userAccount"));
@@ -214,9 +225,10 @@ public class GetEmpInfoOsfService  implements IHRMsfService {
                 param.put("officephone", rs.getString("officephone"));
                 // 护照号码
                 param.put("passportno", rs.getString("passportno"));
+                list.add(param);
             }
             // 将合并后的员工列表写入返回结果
-            result.put("data", maps.values());
+            result.put("data", list);
         } catch (Exception e) {
             // 异常时返回错误信息
             e.printStackTrace();
@@ -247,17 +259,23 @@ public class GetEmpInfoOsfService  implements IHRMsfService {
         sql.append(" pe.fname_l2 \"name\", ");                   // 员工名称
         sql.append(" pe.fnumber code, ");                        // 员工编码
         sql.append(" pe.fidcardno idcardno, ");                  // 身份证号
-        sql.append(" ty.fname_l2 tyname, ");                    // 用工关系类型名称
-        sql.append(" ty.finservice inservice, ");                // 是否在职标识
-        sql.append(" pe.fgender gender, ");                      // 性别
+        sql.append(" ty.fname_l2 tyname, ");                     // 用工关系类型名称
+        sql.append(" ty.finservice inservice, ");                // 是否在职标识(1/4为在职)
+        sql.append(" pe.fgender gender, ");                      // 性别(1:男,2:女)
         sql.append(" pm.fglobalroaming globalroaming, ");        // 国际区号
         sql.append(" pm.fncell ncell, ");                        // 手机号码
         sql.append(" ppos.fjoindate joindate, ");                // 入司日期
-        sql.append(" ppos.fpersondep orgid, ");                  // 所属组织ID
-        sql.append(" ppos.fprimarypositionid posid, ");          // 主岗位ID
-        sql.append(" phis.fpersonid leader, ");                  // 上级员工ID
+        sql.append(" org.fnumber orgCode, ");                    // 所属组织编码
+        sql.append(" pos.fnumber posCode, ");                    // 主岗位编码
+        // 使用STRING_AGG将同一上级岗位下的多位领导编码合并为逗号分隔字段(Kingbase/PostgreSQL语法)
+        sql.append(" (SELECT STRING_AGG(ppe_inner.fnumber, ',' ORDER BY ppe_inner.fnumber) ");
+        sql.append("  FROM T_HR_EMPPOSTEXPERIENCEHIS phis_inner ");
+        sql.append("  LEFT JOIN t_bd_person ppe_inner ON ppe_inner.fid = phis_inner.fpersonid ");
+        sql.append("  WHERE phis_inner.fpositionid = pos.fparentid ");
+        sql.append("  AND phis_inner.fpositionenddate >= '2199-12-31 00:00:00') leader, ");
         sql.append(" puser.fnumber userAccount, ");              // 登录账号
         sql.append(" pm.fofficephone officephone, ");            // 办公电话
+        sql.append(" pe.findex disporder, ");
         sql.append(" pe.fpassportno passportno ");               // 护照号码
 
         // ===== FROM 子句及关联表 =====
@@ -265,11 +283,21 @@ public class GetEmpInfoOsfService  implements IHRMsfService {
         sql.append(" t_bd_person pe ");                                                                          // 员工基础信息表(主表)
         sql.append(" left join T_HR_BDEmployeeType ty on pe.femployeetypeid = ty.fid ");                        // 用工关系类型
         sql.append(" left join T_HR_PERSONCONTACTMETHOD pm on pm.fpersonid = pe.fid ");                          // 联系方式
-        sql.append(" left join t_hr_personposition ppos on ppos.FPERSONID = pe.fid ");                           // 岗位关联
-        sql.append(" left join t_org_position pos on pos.fid = ppos.fprimarypositionid ");                       // 组织岗位(用于关联上级)
-        sql.append(" left join T_HR_EMPPOSTEXPERIENCEHIS phis on phis.fpositionid = pos.fparentid ");           // 岗位任职历史
-        sql.append(" and phis.fpositionenddate >= '2199-12-31 00:00:00' ");                                      // 只取当前有效的任职记录
-        sql.append(" left join t_pm_user puser on puser.FPERSONID = pe.fid ");                                   // 用户登录账号
+        sql.append(" left join t_hr_personposition ppos on ppos.FPERSONID = pe.fid ");                           // 员工岗位关联
+        sql.append(" left join t_org_position pos on pos.fid = ppos.fprimarypositionid ");                       // 主岗位信息
+        sql.append(" left join t_org_admin org on org.fid = ppos.fpersondep ");                                  // 所属行政组织
+        //sql.append(" left join t_pm_user puser on puser.FPERSONID = pe.fid ");                                   // 用户登录账号
+        sql.append(" left join (SELECT * ");
+        sql.append("  FROM ( ");
+        sql.append("   SELECT ");
+        sql.append("       *, ");
+        sql.append("   ROW_NUMBER() OVER ( ");
+        sql.append("   PARTITION BY FPERSONID ");
+        sql.append("   ORDER BY feffectivedate DESC, fid DESC   ");
+        sql.append("   ) AS rn ");
+        sql.append("   FROM t_pm_user ");
+        sql.append("  ) t ");
+        sql.append(" WHERE rn = 1 ) puser on puser.FPERSONID = pe.fid ");
 
         // WHERE 1=1 便于后续动态追加 AND 条件
         sql.append(" where 1=1 ");

+ 117 - 99
websrc/com/kingdee/eas/custom/szpgm/osf/service/GetOrgInfoOsfService.java

@@ -16,41 +16,49 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * 获取组织信息接口
+ * 获取组织信息接口
  * <p>
  * 根据组织类型、最后修改日期、组织名称、组织编号等条件分页查询组织基础信息,
  * 包含组织名称、编号、上下级关系、状态等字段。
+ * 数据来源于 t_org_admin(组织管理表),左连 T_Org_admin(取上级组织信息)、
+ * T_Org_LayerType(组织类型表),按修改时间降序排列。
  * </p>
  *
  * <h3>入参说明</h3>
- * <pre>
- * layerType  - 组织类型(如:公司、部门、集团、中心、子中心、公司(新))
- * modifyDate - 最后修改日期(yyyy-MM-dd)
- * name       - 组织名称(左模糊匹配)
- * code       - 组织编号(精确匹配)
- * size       - 每页条数(可选,默认100,最大1000)
- * page       - 页码(可选,默认1)
- * </pre>
+ * <table>
+ *   <tr><th>参数名</th><th>类型</th><th>必填</th><th>说明</th></tr>
+ *   <tr><td>layerType</td>  <td>String</td><td>否</td><td>组织类型,支持逗号分隔多个值(如:公司、部门、集团、中心、子中心、公司(新)),精确匹配</td></tr>
+ *   <tr><td>modifyDate</td> <td>String</td><td>否</td><td>最后修改日期(yyyy-MM-dd),查询该日期及之后修改的组织</td></tr>
+ *   <tr><td>name</td>       <td>String</td><td>否</td><td>组织名称,左模糊匹配</td></tr>
+ *   <tr><td>code</td>       <td>String</td><td>否</td><td>组织编号,精确匹配</td></tr>
+ *   <tr><td>size</td>       <td>int</td>   <td>否</td><td>每页条数,默认100,最大1000</td></tr>
+ *   <tr><td>page</td>       <td>int</td>   <td>否</td><td>页码,默认1</td></tr>
+ * </table>
  *
  * <h3>返回值说明</h3>
- * <pre>
- * code    - 状态码(200:成功, 500:异常)
- * msg     - 提示信息
- * page    - 当前页码
- * size    - 每页条数
- * data    - 组织列表,每项包含:
- *   id          - 主键
- *   name        - 组织名称
- *   fullname    - 组织全称
- *   code        - 组织编号
- *   parent      - 上级组织ID
- *   fullnumber  - 组织全编码
- *   disporder   - 显示顺序
- *   status      - 是否启用(1:有效, 0:封存,与数据库fissealup取反)
- *   description - 备注
- *   modifyDate  - 修改日期(yyyy-MM-dd,当前版本不返回此字段)
- *   layerType   - 组织类型
- * </pre>
+ * <table>
+ *   <tr><th>字段</th><th>类型</th><th>说明</th></tr>
+ *   <tr><td>code</td>   <td>String</td><td>状态码(200:成功,500:异常)</td></tr>
+ *   <tr><td>msg</td>    <td>String</td><td>提示信息</td></tr>
+ *   <tr><td>page</td>   <td>int</td>   <td>当前页码</td></tr>
+ *   <tr><td>size</td>   <td>int</td>   <td>每页条数</td></tr>
+ *   <tr><td>data</td>   <td>List</td>  <td>组织列表,每项字段见下方</td></tr>
+ * </table>
+ * <p>data 列表中每项包含以下字段:</p>
+ * <table>
+ *   <tr><th>字段</th><th>类型</th><th>说明</th></tr>
+ *   <tr><td>id</td>          <td>String</td><td>主键ID</td></tr>
+ *   <tr><td>name</td>        <td>String</td><td>组织名称</td></tr>
+ *   <tr><td>fullname</td>    <td>String</td><td>组织全称(显示名)</td></tr>
+ *   <tr><td>code</td>        <td>String</td><td>组织编号</td></tr>
+ *   <tr><td>parent</td>      <td>String</td><td>上级组织编号</td></tr>
+ *   <tr><td>fullnumber</td>  <td>String</td><td>组织全编码(长编码层级路径)</td></tr>
+ *   <tr><td>disporder</td>   <td>String</td><td>显示排序号</td></tr>
+ *   <tr><td>status</td>      <td>String</td><td>是否启用("1":有效,"0":封存,与数据库 fissealup 字段取反)</td></tr>
+ *   <tr><td>description</td> <td>String</td><td>备注说明</td></tr>
+ *   <tr><td>modifyDate</td>  <td>String</td><td>修改日期(yyyy-MM-dd,当前版本不返回此字段,如需返回请取消注释)</td></tr>
+ *   <tr><td>layerType</td>   <td>String</td><td>组织类型名称</td></tr>
+ * </table>
  *
  * @author szpgm
  * @since 1.0.0
@@ -58,19 +66,30 @@ import java.util.Map;
 public class GetOrgInfoOsfService implements IHRMsfService {
 
     /**
-     * 处理组织信息查询请求
+     * 查询组织基础信息(分页接口)。
+     * <p>
+     * 根据组织类型、修改日期、名称、编号等条件组合查询,支持分页返回。
+     * 组织类型支持逗号分隔的多个值,名称按左模糊匹配,编号精确匹配。
+     * </p>
      *
-     * @param context 上下文对象
-     * @param map     入参,支持以下 key:
+     * @param context EAS 平台上下文对象
+     * @param map     入参,支持以下 key(均为可选)
      *                <ul>
-     *                  <li><b>layerType</b>  - 组织类型(可选,精确匹配)</li>
-     *                  <li><b>modifyDate</b> - 最后修改日期(可选,yyyy-MM-dd)</li>
-     *                  <li><b>name</b>       - 组织名称(可选,左模糊匹配)</li>
-     *                  <li><b>code</b>       - 组织编号(可选,精确匹配)</li>
-     *                  <li><b>page</b>       - 页码(可选,默认1)</li>
-     *                  <li><b>size</b>       - 每页条数(可选,默认100,最大1000)</li>
+     *                  <li><b>layerType</b>  — 组织类型,逗号分隔多个值,精确匹配</li>
+     *                  <li><b>modifyDate</b> — 最后修改日期(yyyy-MM-dd),查询该日期及之后的数据</li>
+     *                  <li><b>name</b>       — 组织名称,左模糊匹配</li>
+     *                  <li><b>code</b>       — 组织编号,精确匹配</li>
+     *                  <li><b>page</b>       — 页码,默认1</li>
+     *                  <li><b>size</b>       — 每页条数,默认100,上限1000</li>
      *                </ul>
-     * @return Map&lt;String, Object&gt;,包含 code、msg、page、size、data 字段
+     * @return {@code Map<String, Object>},包含以下 key:
+     *         <ul>
+     *           <li><b>code</b> — 状态码("200" 成功,"500" 异常)</li>
+     *           <li><b>msg</b>  — 提示信息</li>
+     *           <li><b>page</b> — 当前页码</li>
+     *           <li><b>size</b> — 每页条数</li>
+     *           <li><b>data</b> — 组织信息列表({@code List<Map<String, Object>>})</li>
+     *         </ul>
      * @throws EASBizException 业务异常
      * @throws BOSException    平台异常
      */
@@ -79,13 +98,13 @@ public class GetOrgInfoOsfService implements IHRMsfService {
         Map<String, Object> result = new HashMap<String, Object>();
         List<Map<String, Object>> list = new ArrayList<>();
 
-        // ---------- 入参解析 ----------
+        // ==================== 入参解析 ====================
         String layerType = (String) map.get("layerType");
         String modifyDate = (String) map.get("modifyDate");
         String name = (String) map.get("name");
         String code = (String) map.get("code");
 
-        // 每页条数(默认100,上限1000)
+        // 每页条数:默认100,上限1000,兼容 Integer 和 String 类型
         int maxSize = 1000;
         int size = 100;
         if (map.get("size") != null) {
@@ -97,7 +116,7 @@ public class GetOrgInfoOsfService implements IHRMsfService {
             size = Math.min(maxSize, size);
         }
 
-        // 页码(默认1)
+        // 页码:默认1,兼容 Integer 和 String 类型
         int page = 1;
         if (map.get("page") != null) {
             if (map.get("page") instanceof Integer) {
@@ -107,7 +126,7 @@ public class GetOrgInfoOsfService implements IHRMsfService {
             }
         }
 
-        // ---------- 查询数据 ----------
+        // ==================== 构建查询并执行 ====================
         try {
             result.put("msg", "成功");
             result.put("code", "200");
@@ -115,7 +134,7 @@ public class GetOrgInfoOsfService implements IHRMsfService {
             result.put("size", size);
             result.put("data", list);
 
-            // 构建基础SQL并动态追加过滤条件
+            // 获取基础SQL(where 1=1),动态追加过滤条件和分页参数
             StringBuilder sql = getSql();
             List<Object> paramArr = new ArrayList<>();
 
@@ -125,10 +144,17 @@ public class GetOrgInfoOsfService implements IHRMsfService {
                 paramArr.add(modifyDate);
             }
 
-            // 组织类型精确匹配
+            // 组织类型精确匹配,支持逗号分隔多个值(IN 查询)
             if (StringUtils.isNotBlank(layerType)) {
-                sql.append(" and lt.fname_l2 = ? ");
-                paramArr.add(layerType);
+                sql.append(" and lt.fname_l2 in('' ");
+
+                    String[] layerTypeArr = layerType.split(",");
+                    for (int i = 0; i < layerTypeArr.length; i++) {
+                        sql.append(" ,?");
+                        paramArr.add(layerTypeArr[i]);
+                    }
+
+                sql.append(" ) ");
             }
 
             // 组织名称左模糊匹配
@@ -148,42 +174,34 @@ public class GetOrgInfoOsfService implements IHRMsfService {
             paramArr.add(size);
             paramArr.add(((page - 1) * size));
 
-            // 执行查询
+            // 执行SQL查询
             IRowSet rs = DbUtil.executeQuery(context, sql.toString(), paramArr.toArray());
 
-            // 日期格式化器(yyyy-MM-dd)
+            // 遍历结果集,逐行转换为 Map 放入返回列表
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             while (rs.next()) {
                 Map<String, Object> params = new HashMap<String, Object>();
 
-                // 组织名称
-                params.put("name", rs.getString("name"));
-                // 组织全称
-                params.put("fullname", rs.getString("fullname"));
-                // 组织编号
-                params.put("code", rs.getString("code"));
-                // 上级组织ID
-                params.put("parent", rs.getString("parent"));
-                // 组织全编码(长编码路径)
-                params.put("fullnumber", rs.getString("fullnumber"));
-                // 显示顺序
-                params.put("disporder", rs.getString("disporder"));
-                // 是否启用(DB字段fissealup: 1=封存,0=有效 → 取反后: 1=有效,0=封存)
+                params.put("name", rs.getString("name"));           // 组织名称
+                params.put("fullname", rs.getString("fullname"));   // 组织全称(显示名)
+                params.put("code", rs.getString("code"));           // 组织编号
+                params.put("parent", rs.getString("parent"));       // 上级组织编号
+                params.put("fullnumber", rs.getString("fullnumber")); // 组织全编码(长编码路径)
+                params.put("disporder", rs.getString("disporder")); // 显示排序号
+                // 状态取反:DB中 fissealup=1(封存)→接口返回 "0",fissealup=0(有效)→接口返回 "1"
                 int statusVal = rs.getInt("status");
                 params.put("status", statusVal == 1 ? "0" : "1");
-                // 主键ID
-                params.put("id", rs.getString("id"));
-                // 备注
-                params.put("description", rs.getString("description"));
-                // 修改日期(当前版本不返回此字段,如需返回请取消注释)
+                params.put("id", rs.getString("id"));               // 主键ID
+                params.put("description", rs.getString("description")); // 备注说明
+                // 修改日期(当前版本不返回,如需返回请取消下行注释)
                 //Date modifyDateVal = rs.getTimestamp("modifyDate");
                 //params.put("modifyDate", modifyDateVal != null ? sdf.format(modifyDateVal) : "");
-                // 组织类型(公司 / 部门 / 集团 / 子中心 / 中心 / 公司(新))
-                params.put("layerType", rs.getString("layerType"));
+                params.put("layerType", rs.getString("layerType")); // 组织类型名称
+
                 list.add(params);
             }
         } catch (Exception e) {
-            // 异常时返回错误信息
+            // 捕获所有异常,返回错误码和异常信息
             e.printStackTrace();
             result.put("msg", e.getMessage());
             result.put("code", "500");
@@ -192,44 +210,44 @@ public class GetOrgInfoOsfService implements IHRMsfService {
     }
 
     /**
-     * 构建组织信息查询SQL
+     * 构建组织信息查询的基础 SQL。
+     * <p>
+     * 从 t_org_admin(组织管理表)左连 T_Org_admin(取上级组织信息)、
+     * T_Org_LayerType(组织类型表),查询组织名称、编号、全编码、上级组织编号、
+     * 显示顺序、封存状态、备注、修改时间、类型等字段。
+     * 返回的 SQL 以 {@code where 1=1} 结尾,过滤条件和分页参数由调用方通过
+     * {@link StringBuilder#append} 动态拼接。
+     * </p>
      * <p>
-     * 从 t_org_admin(组织管理表)左连 T_Org_LayerType(组织类型表)
-     * 查询组织基础信息,按修改日期、组织类型、名称、编号过滤,支持分页。
+     * 涉及表:
+     * <ul>
+     *   <li><b>t_org_admin</b>(org)—— 组织管理表,主表</li>
+     *   <li><b>T_Org_admin</b>(porg)—— 组织管理表(二次关联,通过 fparentid 取上级组织信息)</li>
+     *   <li><b>T_Org_LayerType</b>(lt)—— 组织类型表</li>
+     * </ul>
      * </p>
      *
-     * @return 含占位符的基础SQL(where 1=1),过滤条件和分页参数由调用方动态追加
+     * @return 包含占位符的基础 SQL(以 {@code where 1=1} 结尾),
+     *         后续可动态追加 AND 条件和分页参数
      */
     private static StringBuilder getSql() {
         StringBuilder sql = new StringBuilder();
         sql.append(" /*dialect*/ select ");
-        // 组织名称
-        sql.append(" org.fname_l2 \"name\", ");
-        // 组织全称(显示名)
-        sql.append(" org.fdisplayname_l2 fullname, ");
-        // 组织编号
-        sql.append(" org.fnumber code, ");
-        // 上级组织ID
-        sql.append(" org.fparentid parent, ");
-        // 组织长编码(层级路径)
-        sql.append(" org.flongNumber fullnumber, ");
-        // 显示排序号
-        sql.append(" org.fsortcode disporder, ");
-        // 是否封存(1=封存, 0=有效,接口层取反)
-        sql.append(" org.fissealup status, ");
-        // 主键
-        sql.append(" org.fid id, ");
-        // 备注说明
-        sql.append(" org.fdescription_l2 description, ");
-        // 最后修改时间
-        sql.append(" org.flastupdatetime modifyDate, ");
-        // 组织类型名称
-        sql.append(" lt.fname_l2 layerType ");
-        // 组织管理表
-        sql.append(" from t_org_admin org ");
-        // 左连组织类型表
-        sql.append(" left join T_Org_LayerType lt on lt.fid = org.flayertypeid ");
-        sql.append(" where 1=1 ");
+        sql.append(" org.fname_l2 \"name\", ");              // 组织名称
+        sql.append(" org.fdisplayname_l2 fullname, ");      // 组织全称(显示名)
+        sql.append(" org.fnumber code, ");                  // 组织编号
+        sql.append(" porg.fnumber parent, ");              // 上级组织编号
+        sql.append(" org.flongNumber fullnumber, ");        // 组织长编码(层级路径)
+        sql.append(" org.fsortcode disporder, ");           // 显示排序号
+        sql.append(" org.fissealup status, ");              // 封存状态(1=封存,0=有效,接口层取反)
+        sql.append(" org.fid id, ");                        // 主键ID
+        sql.append(" org.fdescription_l2 description, ");   // 备注说明
+        sql.append(" org.flastupdatetime modifyDate, ");    // 最后修改时间
+        sql.append(" lt.fname_l2 layerType ");              // 组织类型名称
+        sql.append(" from t_org_admin org ");               // 组织管理表
+        sql.append(" left join T_Org_admin porg on porg.fid = org.fparentid ");  // 左连组织管理表(取上级组织信息)
+        sql.append(" left join T_Org_LayerType lt on lt.fid = org.flayertypeid "); // 左连组织类型表
+        sql.append(" where 1=1 ");                          // 占位,便于后续动态拼接 AND 条件
 
         return sql;
     }

+ 86 - 44
websrc/com/kingdee/eas/custom/szpgm/osf/service/GetPluralityInfoOsfService.java

@@ -16,7 +16,7 @@ import java.util.*;
  * <p>
  *     实现 {@link IHRMsfService} 接口,提供员工兼职信息的分页查询功能。
  *     支持按员工编号(精确)、最后修改时间进行过滤筛选。
- *     同一员工存在多个上级时,会将上级ID合并到一个列表中返回。
+ *     同一员工存在多个上级时,会将上级编码合并到一个列表中返回。
  * </p>
  *
  * <h3>关联数据表</h3>
@@ -25,14 +25,19 @@ import java.util.*;
  *     <li><b>T_HR_PluralityAddBizBill</b>(pa)—— 员工加入兼职单表,获取审批状态</li>
  *     <li><b>T_HR_PluralityDelBizBillentry</b>(pde)—— 员工移除兼职单分录表,获取结束日期</li>
  *     <li><b>T_HR_PluralityDelBizBill</b>(pd)—— 员工移除兼职单表,获取移除审批状态</li>
- *     <li><b>t_org_position</b>(pos)—— 组织岗位表,用于关联上级</li>
- *     <li><b>T_HR_EMPPOSTEXPERIENCEHIS</b>(phis)—— 岗位任职历史表,取当前上级</li>
+ *     <li><b>t_bd_person</b>(pe)—— 员工基础信息表,取员工编号</li>
+ *     <li><b>t_org_position</b>(pos)—— 岗位表,取兼职岗位信息</li>
+ *     <li><b>t_org_admin</b>(org)—— 行政组织表</li>
+ *     <li><b>T_HR_EMPPOSTEXPERIENCEHIS</b>(phis)—— 岗位任职历史表,通过上级岗位取当前上级</li>
+ *     <li><b>t_bd_person</b>(ppe)—— 员工基础信息表(二次关联,取上级员工信息)</li>
  * </ul>
  *
  * <h3>入参说明</h3>
  * <ul>
- *     <li><b>modifyDate</b>(String,可选)—— 最后修改日期(格式yyyy-MM-dd),筛选该日期之后修改的兼职记录</li>
- *     <li><b>personid</b>(String,可选)—— 员工编号/ID,精确匹配</li>
+ *     <li><b>modifyDate</b>(String,可选)—— 最后修改日期(格式yyyy-MM-dd),筛选该日期之后修改的兼职记录(增量同步场景)</li>
+ *     <li><b>startDate</b>(String,可选)—— 生效开始日期(格式yyyy-MM-dd),筛选在该日期之后仍有效的兼职记录,即兼职未结束或结束日期>=此日期</li>
+ *     <li><b>endDate</b>(String,可选)—— 生效结束日期(格式yyyy-MM-dd),筛选兼职开始日期<=此日期的记录</li>
+ *     <li><b>personCode</b>(String,可选)—— 员工编号,精确匹配</li>
  *     <li><b>page</b>(int/String,可选,默认1)—— 页码</li>
  *     <li><b>size</b>(int/String,可选,默认100,上限1000)—— 每页条数</li>
  * </ul>
@@ -48,9 +53,9 @@ import java.util.*;
  *         "personid": "员工ID",
  *         "startDate": "兼职开始日期(yyyy-MM-dd)",
  *         "endDate": "兼职结束日期(yyyy-MM-dd),未结束则为2199-12-31",
- *         "orgid": "兼职组织ID",
- *         "posid": "兼职岗位ID",
- *         "leader": ["上级ID列表"],
+ *         "orgCode": "兼职组织编码",
+ *         "posCode": "兼职岗位编码",
+ *         "leader": ["上级员工编码列表"],
  *         "description": "兼职备注"
  *     }]
  * }
@@ -84,10 +89,14 @@ public class GetPluralityInfoOsfService implements IHRMsfService {
 
         // ==================== 入参解析 ====================
 
-        // 最后修改日期(格式:yyyy-MM-dd),同时检查加入兼职表和移除兼职表
+        // 最后修改日期(格式:yyyy-MM-dd),同时检查加入兼职表和移除兼职表(增量同步场景)
         String modifyDate = (String) map.get("modifyDate");
-        // 员工ID(精确匹配)
-        String code = (String) map.get("personid");
+        // 生效开始日期(格式:yyyy-MM-dd),筛选兼职未结束或结束日期>=此日期的记录
+        String startDateStr = (String) map.get("startDate");
+        // 生效结束日期(格式:yyyy-MM-dd),筛选兼职开始日期<=此日期的记录
+        String endDateStr = (String) map.get("endDate");
+        // 员工编号(精确匹配)
+        String code = (String) map.get("personCode");
 
         // 每页条数(默认100,上限1000)
         int maxSize = 1000;
@@ -125,16 +134,29 @@ public class GetPluralityInfoOsfService implements IHRMsfService {
             // SQL参数列表(与?占位符一一对应)
             List<Object> paramArr = new ArrayList<>();
 
-            // 修改日期过滤:加入兼职单或移除兼职单的最后修改时间 >= 指定日期
+            // 修改日期过滤(增量同步):加入兼职单或移除兼职单的最后修改时间 >= 指定日期
             if (StringUtils.isNotBlank(modifyDate)) {
                 sql.append(" and (pa.flastupdatetime >= ? or pd.flastupdatetime >= ?) ");
                 paramArr.add(modifyDate);
                 paramArr.add(modifyDate);
             }
 
-            // 员工编号/ID精确匹配
+            // 生效开始日期过滤:筛选在该日期之后仍有兼职效力的记录
+            // 即:移除兼职单未审批通过(兼职未结束,视为2199-12-31),或结束日期 >= startDate
+            if (StringUtils.isNotBlank(startDateStr)) {
+                sql.append(" and (pd.fbillstate is null or pd.fbillstate != 3 or pde.fbizdate >= ?) ");
+                paramArr.add(startDateStr);
+            }
+
+            // 生效结束日期过滤:筛选兼职开始日期 <= endDate 的记录
+            if (StringUtils.isNotBlank(endDateStr)) {
+                sql.append(" and pae.fbizdate <= ? ");
+                paramArr.add(endDateStr);
+            }
+
+            // 员工编号精确匹配
             if (StringUtils.isNotBlank(code)) {
-                sql.append(" and pae.fpersonid = ? ");
+                sql.append(" and pe.fnumber = ? ");
                 paramArr.add(code);
             }
 
@@ -153,22 +175,29 @@ public class GetPluralityInfoOsfService implements IHRMsfService {
             // 遍历结果集,将同一员工的多行数据合并为一条记录
             while (rs.next()) {
                 String id = rs.getString("personid");
-                Map<String, Object> param = maps.get(id);
-                // 首次遇到该员工时,初始化记录并创建上级ID列表
-                if (null == param) {
-                    param = new HashMap<>();
-                    List<String> leaderIds = new ArrayList<>();
-                    param.put("leader", leaderIds);
-                    maps.put(id, param);
-                }
-                // 收集该员工的所有上级ID(多行数据的共同字段会覆盖,但值相同)
-                List<String> leader = (List<String>) param.get("leader");
-                leader.add(rs.getString("leader"));
+                Map<String, Object> param = new HashMap<>();
+//                Map<String, Object> param = maps.get(id);
+//                // 首次遇到该员工时,初始化记录并创建上级编码列表
+//                if (null == param) {
+//                    param = new HashMap<>();
+//                    List<String> leaderIds = new ArrayList<>();
+//                    param.put("leader", leaderIds);
+//                    maps.put(id, param);
+//                }
+//                // 收集该员工的所有上级编码(多行数据的共同字段会覆盖,但值相同)
+//                List<String> leader = (List<String>) param.get("leader");
+//                leader.add(rs.getString("leader"));
 
                 // ---- 员工基本信息 ----
                 // 员工ID
                 param.put("personid", id);
-
+                String leaderStr = rs.getString("leader");
+                List<String> leaders = new ArrayList<>();
+                if(StringUtils.isNotBlank(leaderStr)){
+                    leaders.addAll(Arrays.asList(leaderStr.split(",")));
+                }
+                param.put("leader", leaders);
+                param.put("personCode", rs.getString("personCode"));
                 // ---- 兼职日期(Date -> String 格式化) ----
                 // 兼职开始日期
                 Date startDate = rs.getDate("startDate");
@@ -181,17 +210,18 @@ public class GetPluralityInfoOsfService implements IHRMsfService {
                 param.put("endDate", (null != endDate && 3 == pdbillstate ? sdf.format(endDate) : "2199-12-31"));
 
                 // ---- 组织与岗位 ----
-                // 兼职所属组织ID
-                param.put("orgid", rs.getString("orgid"));
-                // 兼职岗位ID
-                param.put("posid", rs.getString("posid"));
+                // 兼职所属组织编码
+                param.put("orgCode", rs.getString("orgCode"));
+                // 兼职岗位编码
+                param.put("posCode", rs.getString("posCode"));
 
                 // ---- 备注 ----
                 // 兼职备注(来自加入兼职单分录)
                 param.put("description", rs.getString("description"));
+                list.add(param);
             }
             // 将合并后的员工列表写入返回结果
-            result.put("data", maps.values());
+            result.put("data", list);
         } catch (Exception e) {
             // 异常时返回错误信息
             e.printStackTrace();
@@ -204,20 +234,23 @@ public class GetPluralityInfoOsfService implements IHRMsfService {
     /**
      * 构建员工兼职信息查询的基础SQL
      * <p>
-     *     从员工加入兼职单分录表(T_HR_PluralityAddBizBillEntry)出发,
-     *     LEFT JOIN 加入兼职单表获取审批状态,
+     *     从员工加入兼职单分录表出发,LEFT JOIN 加入兼职单表获取审批状态,
      *     LEFT JOIN 移除兼职单分录表和移除兼职单表获取结束日期和移除审批状态,
-     *     LEFT JOIN 组织岗位表和岗位任职历史表获取当前上级信息。
+     *     LEFT JOIN 员工基础信息表、岗位表、行政组织表获取基本字段,
+     *     LEFT JOIN 岗位任职历史表和员工基础信息表(二次关联)获取当前上级信息。
      *     只查询加入兼职单审批通过(pa.fbillstate=3)的记录。
      * </p>
      *
      * <h3>核心关联逻辑</h3>
      * <ol>
      *     <li>pae → pa:关联加入兼职单,获取审批状态,WHERE条件限定 fbillstate=3(审批通过)</li>
+     *     <li>pae → pe:通过 fpersonid 关联员工基础信息表,获取员工编号</li>
      *     <li>pae → pde:通过 fpersonid 关联移除兼职单分录,获取兼职结束日期</li>
      *     <li>pde → pd:关联移除兼职单,获取移除审批状态,用于判断结束日期是否有效</li>
-     *     <li>pae → pos:通过 fpositionid 关联岗位表</li>
+     *     <li>pae → pos:通过 fpositionid 关联岗位表,获取兼职岗位编码</li>
+     *     <li>pae → org:通过 fadminorgid 关联行政组织表,获取兼职组织编码</li>
      *     <li>pos → phis:通过 pos.fparentid(上级岗位ID)关联任职历史,取当前有效上级(fpositionenddate >= 2199-12-31)</li>
+     *     <li>phis → ppe:关联员工基础信息表(二次),获取上级员工编码</li>
      * </ol>
      *
      * @return 包含完整SELECT语句的StringBuilder(以 WHERE pa.fbillstate=3 结尾,便于后续追加AND条件)
@@ -228,11 +261,18 @@ public class GetPluralityInfoOsfService implements IHRMsfService {
         sql.append(" /*dialect*/ select ");
 
         // ===== SELECT 字段列表 =====
-        sql.append(" pae.fpersonid personid, ");                    // 员工ID
-        sql.append(" pae.fbizdate startDate, ");                     // 兼职开始日期
-        sql.append(" pae.fpositionid posid, ");                      // 兼职岗位ID
-        sql.append(" pae.fadminorgid orgid, ");                      // 兼职所属组织ID
-        sql.append(" phis.fpersonid leader, ");                      // 上级员工ID(通过岗位任职历史关联)
+        sql.append(" pae.fpersonid personid, ");                    // 员工FID
+        sql.append(" pe.fnumber personCode, ");                     // 员工编号
+        sql.append(" pae.fbizdate startDate, ");                    // 兼职开始日期
+        sql.append(" pos.fnumber posCode, ");                       // 兼职岗位编码
+        sql.append(" org.fnumber orgCode, ");                       // 兼职所属组织编码
+        // 使用STRING_AGG将同一上级岗位下的多位领导编码合并为逗号分隔字段(Kingbase/PostgreSQL语法)
+        sql.append(" (SELECT STRING_AGG(ppe_inner.fnumber, ',' ORDER BY ppe_inner.fnumber) ");
+        sql.append("  FROM T_HR_EMPPOSTEXPERIENCEHIS phis_inner ");
+        sql.append("  LEFT JOIN t_bd_person ppe_inner ON ppe_inner.fid = phis_inner.fpersonid ");
+        sql.append("  WHERE phis_inner.fpositionid = pos.fparentid ");
+        sql.append("  AND phis_inner.fpositionenddate >= '2199-12-31 00:00:00') leader, ");
+       // sql.append(" ppe.fnumber leader, ");                        // 上级员工编码(通过岗位任职历史关联)
         sql.append(" pae.fdescription description, ");               // 加入兼职单备注
         sql.append(" pde.fdescription description2, ");              // 移除兼职单备注(查询用,未返回给调用方)
         sql.append(" pde.fbizdate endDate, ");                       // 兼职结束日期(来自移除兼职单)
@@ -244,10 +284,12 @@ public class GetPluralityInfoOsfService implements IHRMsfService {
         sql.append(" left join T_HR_PluralityAddBizBill pa on pae.fbillid = pa.fid ");                                  // 加入兼职单表(获取审批状态)
         sql.append(" left join T_HR_PluralityDelBizBillentry pde on pde.FPERSONID = pae.fpersonid ");                   // 移除兼职单分录表(获取结束日期)
         sql.append(" left join T_HR_PluralityDelBizBill pd on pd.fid = pde.fbillid ");                                   // 移除兼职单表(获取移除审批状态)
-        sql.append(" left join t_org_position pos on pos.fid = pae.fpositionid ");                                      // 组织岗位表(用于关联上级)
-        sql.append(" left join T_HR_EMPPOSTEXPERIENCEHIS phis on phis.fpositionid = pos.fparentid ");                   // 岗位任职历史表(获取当前上级)
-        sql.append(" and phis.fpositionenddate >= '2199-12-31 00:00:00'");                                              // 只取当前有效的任职记录
-
+        sql.append(" left join t_bd_person pe on pe.fid = pae.fpersonid ");                                           // 员工基础信息表(取员工编号)
+        sql.append(" left join t_org_position pos on pos.fid = pae.fpositionid ");                                      // 岗位表(取兼职岗位信息)
+        sql.append(" left join t_org_admin org on org.fid = pae.fadminorgid ");                                         // 行政组织表
+//        sql.append(" left join T_HR_EMPPOSTEXPERIENCEHIS phis on phis.fpositionid = pos.fparentid ");                   // 岗位任职历史表(通过上级岗位ID关联)
+//        sql.append(" and phis.fpositionenddate >= '2199-12-31 00:00:00'");                                              // 只取当前有效的任职记录
+//        sql.append(" left join t_bd_person ppe on ppe.fid = phis.fpersonid ");                                          // 上级员工(任职历史中的人员)
         // WHERE 条件:只查加入兼职单审批通过的记录,后续可动态追加 AND 条件
         sql.append(" where pa.fbillstate=3 ");
         return sql;

+ 42 - 32
websrc/com/kingdee/eas/custom/szpgm/osf/service/GetPosInfoOsfService.java

@@ -16,8 +16,17 @@ import java.util.*;
  * <p>
  * 根据修改日期、岗位名称、岗位编号等条件分页查询岗位基础信息,
  * 包含岗位名称、编号、所属组织、上级岗位、是否负责人岗等字段。
+ * 数据来源于 t_org_position(岗位表),左连 t_org_admin(行政组织表)、
+ * t_org_position(二次关联,取上级岗位信息),按修改时间降序排列。
  * </p>
  *
+ * <h3>关联数据表</h3>
+ * <ul>
+ *     <li><b>t_org_position</b>(pos)—— 岗位表,主表</li>
+ *     <li><b>t_org_admin</b>(org)—— 行政组织表</li>
+ *     <li><b>t_org_position</b>(ppos)—— 岗位表(二次关联,通过 fparentid 取上级岗位信息)</li>
+ * </ul>
+ *
  * <h3>入参说明</h3>
  * <pre>
  * modifyDate - 修改日期(可选,yyyy-MM-dd,范围过滤:岗位或人员职位 >= 该日期)
@@ -37,8 +46,8 @@ import java.util.*;
  *   id              - 主键
  *   name            - 岗位名称
  *   code            - 岗位编号
- *   department      - 所属组织ID
- *   parent          - 上级岗位ID
+ *   department      - 所属组织编号
+ *   parent          - 上级岗位编号
  *   vice            - 部门副职(1:是, 0:否)
  *   disporder       - 显示顺序
  *   description     - 备注
@@ -112,9 +121,9 @@ public class GetPosInfoOsfService  implements IHRMsfService {
 
             // 修改日期过滤:岗位或人员职位最后修改时间 >= 指定日期
             if (StringUtils.isNotBlank(modifyDate)) {
-                sql.append("and (pos.flastupdatetime >= ? or pp.flastupdatetime >= ? ) ");
-                paramArr.add(modifyDate);
+                sql.append(" and pos.flastupdatetime >= ? ");
                 paramArr.add(modifyDate);
+                //paramArr.add(modifyDate);
             }
 
             // 岗位名称左模糊匹配
@@ -142,11 +151,11 @@ public class GetPosInfoOsfService  implements IHRMsfService {
                 params.put("isrespposition", rs.getString("isrespposition"));
                 // 岗位名称
                 params.put("name", rs.getString("name"));
-                // 所属组织ID
+                // 所属组织编号
                 params.put("department", rs.getString("department"));
                 // 岗位编号
                 params.put("code", rs.getString("code"));
-                // 上级岗位ID
+                // 上级岗位编号
                 params.put("parent", rs.getString("parent"));
                 // 部门副职(1:是, 0:否)
                 params.put("vice", rs.getString("vice"));
@@ -170,39 +179,40 @@ public class GetPosInfoOsfService  implements IHRMsfService {
     }
 
     /**
-     * 构建岗位信息查询SQL
+     * 构建岗位信息查询的基础SQL
+     * <p>
+     *     从 t_org_position(岗位表)出发,LEFT JOIN t_org_admin(取所属组织信息)、
+     *     t_org_position(二次关联,取上级岗位信息),查询岗位名称、编号、显示顺序、
+     *     所属组织、上级岗位、部门副职、备注、是否负责人岗等字段。
+     *     以 {@code where 1=1} 结尾,便于后续动态追加 AND 条件。
+     * </p>
      * <p>
-     * 从 t_org_position(岗位表)查询岗位基础信息,
-     * 按修改日期、岗位名称、岗位编号过滤,支持分页。
-     * 以 {@code where 1=1} 结尾,便于动态追加 AND 条件。
+     * 涉及表:
+     * <ul>
+     *   <li><b>t_org_position</b>(pos)—— 岗位表,主表</li>
+     *   <li><b>t_org_admin</b>(org)—— 行政组织表</li>
+     *   <li><b>t_org_position</b>(ppos)—— 岗位表(二次关联,通过 fparentid 取上级岗位信息)</li>
+     * </ul>
      * </p>
      *
-     * @return 含占位符的基础SQL(where 1=1),过滤条件和分页参数由调用方动态追加
+     * @return 含占位符的基础SQL(以 {@code where 1=1} 结尾),过滤条件和分页参数由调用方动态追加
      */
     private static StringBuilder getSql() {
         StringBuilder sql = new StringBuilder();
         sql.append(" /*dialect*/ select ");
-        // 岗位名称
-        sql.append(" pos.fname_l2 \"name\", ");
-        // 岗位编号
-        sql.append(" pos.fnumber code, ");
-        // 显示顺序
-        sql.append(" pos.findex disporder, ");
-        // 所属组织ID
-        sql.append(" pos.fadminorgunitid department, ");
-        // 上级岗位ID
-        sql.append(" pos.fparentid parent, ");
-        // 部门副职(1:是, 0:否)
-        sql.append(" pos.cfsffz1 vice, ");
-        // 备注
-        sql.append(" pos.fdescription_l2 description, ");
-        // 主键
-        sql.append(" pos.fid id, ");
-        // 是否负责人岗(1:是, 0:否)
-        sql.append(" pos.fisrespposition isrespposition ");
-        // 岗位表
-        sql.append(" from t_org_position pos ");
-        sql.append(" where 1=1 ");
+        sql.append(" pos.fname_l2 \"name\", ");                   // 岗位名称
+        sql.append(" pos.fnumber code, ");                        // 岗位编号
+        sql.append(" pos.findex disporder, ");                    // 显示顺序
+        sql.append(" org.fnumber department, ");                  // 所属组织编号
+        sql.append(" ppos.fnumber parent, ");                     // 上级岗位编号
+        sql.append(" pos.cfsffz1 vice, ");                        // 部门副职(1:是,0:否)
+        sql.append(" pos.fdescription_l2 description, ");          // 备注
+        sql.append(" pos.fid id, ");                              // 主键ID
+        sql.append(" pos.fisrespposition isrespposition ");        // 是否负责人岗(1:是,0:否)
+        sql.append(" from t_org_position pos ");                  // 岗位表(主表)
+        sql.append(" left join t_org_admin org on pos.fadminorgunitid=org.fid ");   // 行政组织表
+        sql.append(" left join t_org_position ppos on pos.fparentid=ppos.fid ");    // 岗位表(二次关联,取上级岗位信息)
+        sql.append(" where 1=1 ");                                // 占位,便于后续动态拼接 AND 条件
 
         return sql;
     }

+ 60 - 46
websrc/com/kingdee/eas/custom/szpgm/osf/service/GetRoleSupervisorInfoOsfService.java

@@ -21,12 +21,23 @@ import java.util.Map;
  * <p>
  * 根据修改日期、角色名称、角色编号等条件分页查询角色成员-角色关联信息,
  * 包含角色名称、编号、类型、状态以及人员关联关系等字段。
+ * 数据来源于 T_WFR_PERSONROLE(人员-角色关联表),左连 T_WFR_WFROLE(工作流角色表)、
+ * t_org_admin(行政组织表)、t_bd_person(员工基础信息表)等。
  * </p>
  *
+ * <h3>关联数据表</h3>
+ * <ul>
+ *     <li><b>T_WFR_PERSONROLE</b>(prole)—— 人员-角色关联表,主表</li>
+ *     <li><b>T_WFR_WFROLE</b>(role)—— 工作流角色表</li>
+ *     <li><b>t_org_admin</b>(org)—— 行政组织表</li>
+ *     <li><b>t_bd_person</b>(pe)—— 员工基础信息表</li>
+ *     <li><b>t_bd_person</b>(dpe)—— 员工基础信息表(二次关联,取委托操作人信息)</li>
+ * </ul>
+ *
  * <h3>入参说明</h3>
  * <pre>
  * modifyDate - 最后修改日期(yyyy-MM-dd),同时过滤角色-角色成员关联的最后修改时间
- * name       - 成员名称(左模糊匹配)
+ * name       - 角色名称(左模糊匹配)
  * code       - 角色编号(精确匹配)
  * size       - 每页条数(可选,默认100,最大1000)
  * page       - 页码(可选,默认1)
@@ -41,11 +52,11 @@ import java.util.Map;
  * data    - 角色负责人列表,每项包含:
  *   id          - 主键(人员-角色关联表主键)
  *   roleid      - 角色ID(关联 T_WFR_WFROLE.FID)
- *   orgid       - 组织ID
- *   personid    - 人员ID
+ *   orgCode     - 组织编号
+ *   personCode  - 人员编号
  *   isinclude   - 是否包含下级
  *   isdele      - 是否委托
- *   deleperson  - 委托操作人
+ *   deleperson  - 委托操作人编号
  *   rolename    - 角色名称
  *   rolenumber  - 角色编号
  *   roledescribe- 角色描述
@@ -152,15 +163,15 @@ public class GetRoleSupervisorInfoOsfService  implements IHRMsfService {
                 params.put("id", rs.getString("id"));
                 // 角色ID
                 params.put("roleid", rs.getString("roleid"));
-                // 组织ID
-                params.put("orgid", rs.getString("orgid"));
-                // 人员ID
-                params.put("personid", rs.getString("personid"));
-                // 是否包含
+                // 组织编号
+                params.put("orgCode", rs.getString("orgCode"));
+                // 人员编号
+                params.put("personCode", rs.getString("personCode"));
+                // 是否包含下级
                 params.put("isinclude", rs.getString("isinclude"));
-                // 是否删除
+                // 是否委托
                 params.put("isdele", rs.getString("isdele"));
-                // 删除操作人
+                // 委托操作人编号
                 params.put("deleperson", rs.getString("deleperson"));
                 // 角色名称
                 params.put("rolename", rs.getString("rolename"));
@@ -170,12 +181,10 @@ public class GetRoleSupervisorInfoOsfService  implements IHRMsfService {
                 params.put("roledescribe", rs.getString("roledescribe"));
                 // 角色类型
                 params.put("roletype", rs.getString("roletype"));
+                params.put("layerType", rs.getString("layerType"));
+
                 // 角色状态
                 params.put("state", rs.getString("state"));
-                // 修改日期(格式化为 yyyy-MM-dd)
-                //Date modifyDateVal = rs.getTimestamp("modifyDate");
-                //params.put("modifyDate", modifyDateVal != null ? sdf.format(modifyDateVal) : "");
-
                 list.add(params);
             }
         } catch (Exception e) {
@@ -188,44 +197,49 @@ public class GetRoleSupervisorInfoOsfService  implements IHRMsfService {
     }
 
     /**
-     * 构建角色负责人信息查询SQL
+     * 构建角色负责人信息查询的基础SQL
+     * <p>
+     *     从 T_WFR_PERSONROLE(人员-角色关联表)出发,LEFT JOIN T_WFR_WFROLE(工作流角色表)、
+     *     t_org_admin(行政组织表)、t_bd_person(员工基础信息表,两次关联分别取人员和委托操作人),
+     *     查询角色与角色成员的关联信息,按修改日期、角色名称、角色编号过滤,支持分页。
+     *     以 {@code where 1=1} 结尾,便于动态追加 AND 条件。
+     * </p>
      * <p>
-     * 从 T_WFR_PERSONROLE(人员-角色关联表)左连 T_WFR_WFROLE(工作流角色表)
-     * 查询角色与角色成员的关联信息,按修改日期、岗位名称、岗位编号过滤,支持分页。
+     * 涉及表:
+     * <ul>
+     *   <li><b>T_WFR_PERSONROLE</b>(prole)—— 人员-角色关联表,主表</li>
+     *   <li><b>T_WFR_WFROLE</b>(role)—— 工作流角色表</li>
+     *   <li><b>t_org_admin</b>(org)—— 行政组织表</li>
+     *   <li><b>t_bd_person</b>(pe)—— 员工基础信息表</li>
+     *   <li><b>t_bd_person</b>(dpe)—— 员工基础信息表(二次关联,取委托操作人信息)</li>
+     * </ul>
      * </p>
      *
-     * @return 含占位符的SQL,参数顺序: modifyDate(×2), name, code, limit, offset
+     * @return 包含占位符的基础SQL(以 {@code where 1=1} 结尾),过滤条件和分页参数由调用方动态追加
      */
     private static StringBuilder getSql() {
         StringBuilder sql = new StringBuilder();
         sql.append(" /*dialect*/ select ");
-        // 人员-角色关联主键
-        sql.append(" prole.fid id, ");
-        // 角色ID
-        sql.append(" prole.froleid roleid, ");
-        // 组织ID
-        sql.append(" prole.forgid orgid, ");
-        // 人员ID
-        sql.append(" prole.fpsersonid personid, ");
-        // 是否包含子组织
-        sql.append(" prole.fisinclude isinclude, ");
-        // 是否已删除
-        sql.append(" prole.fisdele isdele, ");
-        // 删除操作人ID
-        sql.append(" prole.fdelepersonid deleperson, ");
-        // 角色名称
-        sql.append(" role.frolename_l2 rolename, ");
-        // 角色编号
-        sql.append(" role.fnumber rolenumber, ");
-        // 角色描述
-        sql.append(" role.froledescribe_l2 roledescribe, ");
-        // 角色类型
-        sql.append(" role.froletype roletype, ");
-        // 角色状态
-        sql.append(" role.fstate state ");
-        sql.append(" from T_WFR_PERSONROLE prole ");
-        sql.append(" LEFT JOIN T_WFR_WFROLE role on prole.FROLEID = role.FID ");
-        sql.append(" where 1=1 ");
+        sql.append(" prole.fid id, ");                             // 人员-角色关联表主键
+        sql.append(" prole.froleid roleid, ");                     // 角色ID
+        sql.append(" org.fnumber orgCode, ");                      // 组织编号
+        sql.append(" pe.fnumber personCode, ");                    // 人员编号
+        sql.append(" prole.fisinclude isinclude, ");               // 是否包含下级
+        sql.append(" prole.fisdele isdele, ");                     // 是否委托
+        sql.append(" dpe.fnumber deleperson, ");                   // 委托操作人编号
+        sql.append(" role.frolename_l2 rolename, ");               // 角色名称
+        sql.append(" role.fnumber rolenumber, ");                  // 角色编号
+        sql.append(" role.froledescribe_l2 roledescribe, ");       // 角色描述
+        sql.append(" role.froletype roletype, ");                  // 角色类型
+        sql.append(" role.fstate state, "); //状态
+        sql.append(" lt.fname_l2 layerType "); // 组织类型名称
+        sql.append(" from T_WFR_PERSONROLE prole ");               // 人员-角色关联表(主表)
+        sql.append(" LEFT JOIN T_WFR_WFROLE role on prole.FROLEID = role.FID ");   // 工作流角色表
+        sql.append(" LEFT JOIN t_org_admin org on prole.forgid = org.FID ");       // 行政组织表
+        sql.append(" LEFT JOIN t_bd_person pe on prole.fpsersonid = pe.FID ");     // 员工基础信息表
+        sql.append(" LEFT JOIN t_bd_person dpe on prole.fdelepersonid = dpe.FID ");// 员工基础信息表(二次关联,取委托操作人)
+        sql.append(" left join T_Org_LayerType lt on lt.fid = org.flayertypeid ");
+        sql.append(" where 1=1 ");                                // 占位,便于后续动态拼接 AND 条件
 
         return sql;
     }