SynPersonService.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. package com.kingdee.shr.customer.gtiit.osf;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Calendar;
  4. import java.util.Date;
  5. import java.util.HashSet;
  6. import java.util.Map;
  7. import java.util.Set;
  8. import org.apache.commons.lang3.StringUtils;
  9. import org.apache.log4j.Logger;
  10. import com.alibaba.fastjson.JSONArray;
  11. import com.alibaba.fastjson.JSONObject;
  12. import com.kingdee.bos.BOSException;
  13. import com.kingdee.bos.Context;
  14. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  15. import com.kingdee.eas.common.EASBizException;
  16. import com.kingdee.eas.util.app.DbUtil;
  17. import com.kingdee.jdbc.rowset.IRowSet;
  18. /**
  19. * 同步人员信息接口
  20. *
  21. * @author xiaoxin
  22. *
  23. */
  24. public class SynPersonService implements IHRMsfService {
  25. private static Logger logger = Logger.getLogger("com.kingdee.shr.customer.gtiit.osf.SynPersonService");
  26. @Override
  27. public Object process(Context ctx, Map map) throws EASBizException, BOSException {
  28. logger.error("进入获取员工信息接口");
  29. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  30. // 开始日期
  31. String startDate = (String) map.get("startDate");
  32. // 截止日期
  33. String endDate = (String) map.get("endDate");
  34. // 员工工号
  35. String personNumber = (String) map.get("personNumber");
  36. logger.error("获取员工信息接口参数-开始日期:" + startDate + ",截止日期:" + endDate + ",人员:" + personNumber);
  37. if (StringUtils.isBlank(startDate) || StringUtils.isBlank(endDate)) {
  38. Calendar calendar = Calendar.getInstance();
  39. startDate = sdf.format(calendar.getTime());
  40. calendar.add(Calendar.DAY_OF_MONTH, 1);
  41. endDate = sdf.format(calendar.getTime());
  42. }
  43. JSONArray jsonArray = new JSONArray();
  44. Set<String> personIdSet = new HashSet<String>();
  45. try {
  46. // 入职审核通过、当天入职的员工
  47. String enrollSql = "SELECT b.fpersonid FROM T_HR_EmpEnrollBizBill a left join T_HR_EmpEnrollBizBillentry b on a.fid=b.fbillid where a.fbillstate = '3' and b.fenrolldate='"
  48. + startDate + "'";
  49. IRowSet enrollRow = DbUtil.executeQuery(ctx, enrollSql);
  50. while (enrollRow.next()) {
  51. personIdSet.add(enrollRow.getString("fpersonid"));
  52. }
  53. // 调动单审核通过的员工
  54. String fluctuaSql = "SELECT b.fpersonid FROM T_HR_FluctuationBizBill a left join T_HR_FluctuationBizBillentry b on a.fid=b.fbillid where FBILLSTATE ='3' and FLASTUPDATETIME >='"
  55. + startDate + "' and FLASTUPDATETIME <='" + endDate + "'";
  56. IRowSet fluctuaRow = DbUtil.executeQuery(ctx, fluctuaSql);
  57. while (fluctuaRow.next()) {
  58. personIdSet.add(fluctuaRow.getString("fpersonid"));
  59. }
  60. // 离职单审核通过、前一天离职的员工
  61. Calendar resignCalendar = Calendar.getInstance();
  62. resignCalendar.add(Calendar.DAY_OF_MONTH, -1);
  63. String resignSql = "select b.fpersonid from T_HR_ResignBizBill a left join T_HR_ResignBizBillentry b on a.fid=b.fbillid where a.FBILLSTATE = '3' and b.FBIZDATE = '"
  64. + sdf.format(resignCalendar.getTime()) + "'";
  65. IRowSet resignRow = DbUtil.executeQuery(ctx, resignSql);
  66. while (resignRow.next()) {
  67. personIdSet.add(resignRow.getString("fpersonid"));
  68. }
  69. // 预入职生效的员工
  70. String preSql = "select per.fid from T_HR_PreEntry pre left join T_BD_Person per on per.fnumber = pre.CFEMPNUMBER where FBILLSTATE = '3' and FCHECKINSTATE = '3' and CFEMPNUMBER <> '' and FBIZDATE >='"
  71. + startDate + "' and FBIZDATE <='" + endDate + "'";
  72. IRowSet preRow = DbUtil.executeQuery(ctx, preSql);
  73. while (preRow.next()) {
  74. personIdSet.add(preRow.getString("fid"));
  75. }
  76. // 员工信息变动的员工
  77. String lastDateSql = "SELECT fid FROM T_BD_Person where flastupdatetime>='" + startDate
  78. + "' and flastupdatetime<='" + endDate + "'";
  79. IRowSet lastDateRow = DbUtil.executeQuery(ctx, lastDateSql);
  80. while (lastDateRow.next()) {
  81. personIdSet.add(lastDateRow.getString("fid"));
  82. }
  83. if (StringUtils.isNotBlank(personNumber)) {
  84. personIdSet = new HashSet<String>();
  85. String personSql = "SELECT fid FROM T_BD_Person where fnumber = '" + personNumber + "'";
  86. IRowSet personRow = DbUtil.executeQuery(ctx, personSql);
  87. while (personRow.next()) {
  88. personIdSet.add(personRow.getString("fid"));
  89. }
  90. }
  91. logger.error("员工id集合:" + personIdSet.toString());
  92. StringBuilder sb = new StringBuilder();
  93. if (personIdSet.size() == 0) {
  94. sb.append("''");
  95. } else {
  96. for (String value : personIdSet) {
  97. sb.append("'").append(value).append("',");
  98. }
  99. // 移除最后一个逗号
  100. sb.deleteCharAt(sb.length() - 1);
  101. }
  102. StringBuffer sql = new StringBuffer();
  103. sql.append("\r\n" +
  104. "SELECT p.FEFFDT,p.fnumber personnumber,p.fname_l2 personname,p.femail email,fu.fname_l2 fullorpartName, p.fcell cell,p.fofficephone officephone, case when p.fgender='1' then '男' when p.fgender='2' then '女' else '' end as gender\r\n" +
  105. ",emp.departmentname ,emp.positionname ,emp.jobname ,emp.CFOalevel as seclevel , emp.jobgradename\r\n" +
  106. ",ify.fname_l2 persontypename\r\n" +
  107. ",emp.fnumber personparent ,emp.workercategory as Jobactivitydesc\r\n" +
  108. ",zt.statusname\r\n" +
  109. ",la.fenterdate enterdate,la.FPlanFormalDate AS probationenddate \r\n" +
  110. ",us.fpassword password,us.fnumber usnumber\r\n" +
  111. ",ht.maxstartDate as startdate ,ht.maxenddate as enddate\r\n" +
  112. "FROM T_BD_Person p \r\n" +
  113. " left join CT_MP_FULLORPART fu on fu.fid=p.cfftorptid \r\n" +
  114. "left join T_HR_EmployeeClassify ify on ify.fid = p.cfpersontypeid \r\n" +
  115. " left join (select re.FPERSONID,re.maxDate,p.fname_l2 name,p.fnumber ,w.fname_l2 workercategory , rl.FAdminOrgID ,bu.fnumber departmentname,\r\n" +
  116. " post.fnumber positionname ,job.fname_l2 jobname ,job2.CFOalevel ,gra.fname_l2 jobgradename from\r\n" +
  117. " (SELECT FPERSONID,max(FEFFDT) as maxDate FROM T_HR_EmpOrgRelation where fisLatestInAday ='1' and fassignType ='1' group by FPERSONID ) as re \r\n" +
  118. " left join T_HR_EmpOrgRelation rl on re.fpersonid = rl.fpersonid and re.maxDate = rl.feffdt \r\n" +
  119. " left join CT_MP_WorkerCategory w on w.fid =rl.CFWorkercategoryID\r\n" +
  120. " left join T_BD_Person p on p.fid=rl.cflinemanagernameI \r\n" +
  121. " left join T_ORG_BaseUnit bu on bu.fid=rl.FAdminOrgID\r\n" +
  122. " left join T_ORG_Position post on rl.fpositionid = post.fid\r\n" +
  123. " left join T_ORG_Job job on job.fid = post.fjobid \r\n" +
  124. " left join T_HR_HRJob job2 on job2.FJobID =job.fid\r\n" +
  125. " left join (SELECT * FROM T_HR_EmpPostRank where fislatest='1') r on r.fpersonid = rl.fpersonid \r\n" +
  126. " left join T_HR_JobGrade gra on gra.fid=r.fjobgradeid \r\n" +
  127. " where rl.fisLatestInAday ='1' and rl.fassignType ='1' ) emp on emp.fpersonid=p.fid \r\n" +
  128. " left join ( SELECT fname_l2 statusname ,fid FROM T_HR_BDEmployeeType ) zt on zt.fid=p.femployeetypeid\r\n" +
  129. " left join T_HR_EmpLaborRelation la on la.fpersonid=p.fid \r\n" +
  130. " left join T_PM_USER us on us.FPERSONID=p.fid\r\n" +
  131. "left join (\r\n" +
  132. " SELECt pco.fpersonid ,pco.maxstartDate,max(pco.CFExpiredDate) as maxenddate FROM (\r\n" +
  133. " SELECT pco.fpersonid ,pco2.maxstartDate,pco.CFExpiredDate FROM CT_MP_Pcontractinfo pco\r\n" +
  134. " inner join (SELECT fpersonid , max(CFCommencingDate) maxstartDate from CT_MP_Pcontractinfo group by fpersonid ) as pco2 on pco.fpersonid = pco.fpersonid and pco.CFCommencingDate = pco2.maxstartDate ) as pco\r\n" +
  135. " group by pco.fpersonid ,pco.maxstartDate\r\n" +
  136. ") ht on ht.fpersonid =p.fid\r\n ");
  137. // sql.append(
  138. // "SELECT sj.workercategory, emp.departmentname,emp.positionname,p.fnumber
  139. // personnumber,p.fname_l2 personname,p.femail email,");
  140. // sql.append(
  141. // "case when p.fgender='1' then '男' when p.fgender='2' then '女' else '' end as
  142. // gender,ify.fname_l2 persontypename,");
  143. // sql.append(
  144. // "sj.fnumber personparent,zt.fname_l2 statusname,p.fcell cell,p.fofficephone
  145. // officephone,la.fenterdate enterdate,");
  146. // sql.append(
  147. // "la.factualFormalDate actualFormalDate,la.FEFFDT EFFDT,la.fleffdt
  148. // leffdt,us.fpassword password,emp.jobname,emp.jobgradename FROM T_BD_Person p
  149. // ");
  150. // sql.append(
  151. // "left join (select e.fpersonid personid,a.fname_l2 departmentname,g.fname_l2
  152. // positionname,job.fname_l2 jobname,gra.fname_l2 jobgradename ");
  153. // sql.append(
  154. // "from (SELECT FPERSONID,max(FEFFDT) as maxDate FROM T_HR_EmpPostExperienceHis
  155. // group by FPERSONID) as h ");
  156. // sql.append(
  157. // " left join T_HR_EmpPostExperienceHis e on e.fpersonid= h.FPERSONID and
  158. // e.feffdt = h.maxDate ");
  159. // sql.append(" left join T_ORG_Admin a on a.fid=e.fadminorgid ");
  160. // sql.append(" left join T_ORG_Position g on g.fid=e.fpositionid ");
  161. // sql.append(" left join T_ORG_Job job on job.fid = g.fjobid ");
  162. // sql.append(
  163. // " left join (SELECT * FROM T_HR_EmpPostRank where fislatest='1') r on
  164. // r.fpersonid = e.fpersonid ");
  165. // sql.append(" left join T_HR_JobGrade gra on gra.fid=r.fjobgradeid ) emp on
  166. // p.fid=emp.personid ");
  167. // sql.append("left join T_HR_EmployeeClassify ify on ify.fid = p.cfpersontypeid
  168. // ");
  169. // sql.append(
  170. // "left join (select re.FPERSONID,p.fname_l2 name,p.fnumber ,w.fname_l2
  171. // workercategory from (SELECT FPERSONID,max(FEFFDT) as maxDate FROM
  172. // T_HR_EmpOrgRelation "
  173. // + " where fisLatestInAday ='1' and fassignType ='1' "
  174. // + " group by FPERSONID) as re ");
  175. // sql.append(
  176. // " left join T_HR_EmpOrgRelation rl on re.fpersonid = rl.fpersonid and
  177. // re.maxDate = rl.feffdt ");
  178. // sql.append(
  179. // " left join CT_MP_WorkerCategory w on w.fid =rl.CFWorkercategoryID ");
  180. // sql.append(" left join T_BD_Person p on p.fid=rl.cflinemanagernameI) sj on
  181. // sj.fpersonid=p.fid ");
  182. // sql.append("left join T_HR_BDEmployeeType zt on zt.fid=p.femployeetypeid ");
  183. // sql.append(
  184. // "left join (select
  185. // a.fpersonid,b.fenterdate,b.factualFormalDate,b.FEFFDT,b.fleffdt from (SELECT
  186. // FPERSONID,max(FEFFDT) as maxDate FROM T_HR_EmpLaborRelationHis group by
  187. // fpersonid) a ");
  188. // sql.append(
  189. // " left join T_HR_EmpLaborRelationHis b on a.fpersonid=b.fpersonid and
  190. // a.maxdate=b.FEFFDT) la on la.fpersonid=p.fid ");
  191. // sql.append("left join T_PM_USER us on us.FPERSONID=p.fid ");
  192. sql.append("where p.fid in (" + sb.toString() + ")");
  193. String str = sql.toString();
  194. str = str.replaceAll("(?i)fname_l2", "fname_l1");
  195. logger.info("人员查询SQL"+str);
  196. IRowSet iRowSet = DbUtil.executeQuery(ctx, str);
  197. Calendar calendar = Calendar.getInstance();
  198. while (iRowSet.next()) {
  199. JSONObject jsonObject = new JSONObject();
  200. // 员工工号
  201. jsonObject.put("workcode", iRowSet.getString("personnumber"));
  202. // 姓名
  203. jsonObject.put("lastname", iRowSet.getString("personname"));
  204. // 登录名
  205. jsonObject.put("loginid", iRowSet.getString("usnumber"));
  206. // 密码
  207. jsonObject.put("password", iRowSet.getString("password"));
  208. // 性别
  209. jsonObject.put("sex", iRowSet.getString("gender"));
  210. // 安全级别
  211. jsonObject.put("seclevel", iRowSet.getString("seclevel"));
  212. // 部门
  213. //String s="\\";
  214. //格式 {JSON}{\"departmentcode\":\"code\"}
  215. jsonObject.put("department", "{JSON}{\"departmentcode\":\""+iRowSet.getString("departmentname")+"\"}");
  216. // 岗位
  217. jsonObject.put("jobtitle", "{JSON}{\"jobtitlecode\":\""+iRowSet.getString("positionname")+"\"}");
  218. // 职务
  219. jsonObject.put("jobactivityid", iRowSet.getString("jobname"));
  220. //兼职全职
  221. jsonObject.put("usekind", "Full Time".equals(iRowSet.getString("fullorpartName"))?"正式员工":"兼职员工");
  222. // 职级
  223. if (StringUtils.isNotBlank(iRowSet.getString("jobgradename"))) {
  224. jsonObject.put("joblevel", iRowSet.getString("jobgradename").replace("L", ""));
  225. } else {
  226. jsonObject.put("joblevel", iRowSet.getString("jobgradename"));
  227. }
  228. // 员工类别
  229. jsonObject.put("jobactivitydesc", iRowSet.getString("Jobactivitydesc"));
  230. // 直接上级
  231. jsonObject.put("managerid", iRowSet.getString("personparent"));
  232. // 状态
  233. jsonObject.put("status", iRowSet.getString("statusname"));
  234. // 办公室
  235. jsonObject.put("workroom", "");
  236. // 办公室电话
  237. jsonObject.put("telephone", StringUtils.isBlank(iRowSet.getString("officephone"))?"":iRowSet.getString("officephone"));
  238. // 移动电话
  239. jsonObject.put("mobile", StringUtils.isBlank(iRowSet.getString("cell"))?"":iRowSet.getString("cell"));
  240. // 电子邮件
  241. jsonObject.put("email", iRowSet.getString("email"));
  242. // 入职日期
  243. jsonObject.put("companystartdate", stringDateFormat(iRowSet.getDate("enterdate")));
  244. // 试用期结束日期
  245. Date date = iRowSet.getDate("probationenddate");
  246. if (date == null) {
  247. // 无试用日期 去入职日期
  248. jsonObject.put("probationenddate", stringDateFormat(iRowSet.getDate("enterdate")));
  249. } else {
  250. calendar.setTime(date);
  251. calendar.add(Calendar.DATE, -1);
  252. date = calendar.getTime();
  253. // 试用期结束日期 = 预计转正日期 -1天
  254. jsonObject.put("probationenddate", stringDateFormat(date));
  255. }
  256. // 合同开始日期
  257. jsonObject.put("startdate", stringDateFormat(iRowSet.getDate("startdate")));
  258. // 合同结束日期
  259. jsonObject.put("enddate", stringDateFormat(iRowSet.getDate("enddate")));
  260. jsonArray.add(jsonObject);
  261. }
  262. } catch (Exception e) {
  263. e.printStackTrace();
  264. JSONObject resultJson = new JSONObject();
  265. resultJson.put("code", "0");
  266. resultJson.put("status", "false");
  267. resultJson.put("message", "获取人员信息失败:" + e.getMessage());
  268. resultJson.put("data", "");
  269. logger.error("获取人员信息失败:" + e.getMessage());
  270. return resultJson.toJSONString();
  271. }
  272. JSONObject resultJson = new JSONObject();
  273. resultJson.put("code", "1");
  274. resultJson.put("status", "true");
  275. resultJson.put("message", "获取人员信息成功");
  276. resultJson.put("data", jsonArray);
  277. logger.error("返回员工信息结果集:" + resultJson);
  278. return resultJson;
  279. }
  280. private String stringDateFormat(Date date) {
  281. if (date == null) {
  282. return null;
  283. }
  284. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
  285. // 使用format方法将Date对象转换为指定格式的字符串
  286. return formatter.format(date.getTime());
  287. }
  288. }