LeaveAllowanceOSFService.java 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759
  1. package com.kingdee.shr.customer.gtiit.osf;
  2. import com.kingdee.bos.BOSException;
  3. import com.kingdee.bos.Context;
  4. import com.kingdee.bos.bsf.service.app.IHRMsfService;
  5. import com.kingdee.bos.dao.IObjectPK;
  6. import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
  7. import com.kingdee.bos.util.BOSUuid;
  8. import com.kingdee.eas.basedata.org.AdminOrgUnitInfo;
  9. import com.kingdee.eas.basedata.org.CtrlUnitInfo;
  10. import com.kingdee.eas.basedata.org.HROrgUnitInfo;
  11. import com.kingdee.eas.basedata.org.PositionInfo;
  12. import com.kingdee.eas.basedata.person.PersonInfo;
  13. import com.kingdee.eas.common.EASBizException;
  14. import com.kingdee.eas.custom.bd.param.ParamCollection;
  15. import com.kingdee.eas.custom.bd.param.ParamFactory;
  16. import com.kingdee.eas.custom.facade.leave.LeaveAllowanceFacadeFactory;
  17. import com.kingdee.eas.framework.CoreBaseCollection;
  18. import com.kingdee.eas.hr.ats.HolidayLimitFactory;
  19. import com.kingdee.eas.hr.ats.HolidayLimitInfo;
  20. import com.kingdee.eas.hr.ats.HolidayLimitStatus;
  21. import com.kingdee.eas.hr.ats.HolidayPolicyInfo;
  22. import com.kingdee.eas.hr.ats.HolidayTypeUnitEnum;
  23. import com.kingdee.eas.util.app.ContextUtil;
  24. import com.kingdee.eas.util.app.DbUtil;
  25. import com.kingdee.jdbc.rowset.IRowSet;
  26. import com.kingdee.util.DateTimeUtils;
  27. import java.math.BigDecimal;
  28. import java.math.RoundingMode;
  29. import java.sql.SQLException;
  30. import java.sql.Timestamp;
  31. import java.text.ParseException;
  32. import java.text.SimpleDateFormat;
  33. import java.util.ArrayList;
  34. import java.util.Date;
  35. import java.util.HashMap;
  36. import java.util.List;
  37. import java.util.Map;
  38. import org.apache.commons.lang3.StringUtils;
  39. public class LeaveAllowanceOSFService implements IHRMsfService {
  40. private static final String WC_General_Administrative_Staff = "General Administrative Staff";
  41. private static final String WC_Professional_Supervisory_Staff = "Professional Supervisory Staff";
  42. private static final String WC_Senior_Administrative_Staff = "Senior Administrative Staff";
  43. private static final String WC_Academic_Staff = "Academic Staff";
  44. private static final String WC_Others = "Others";
  45. private static final int IV_General_Administrative_Staff = 12;
  46. private static final int IV_Professional_Supervisory_Staff = 15;
  47. private static final int IV_Senior_Administrative_Staff = 18;
  48. private static final int IV_Year = 2;
  49. private static final int IV_YearAddValue = 1;
  50. private static final int IV_MAXADD = 8;
  51. private static final int MONTH_NUM_12 = 12;
  52. private static final String PARAM_ANNUALLEAVE_CONVERSIONMETHOD = "param_001";
  53. private static final String PARAM_ANNUALLEAVE_INTEGERMETHOD = "param_002";
  54. private static final String PARAM_ANNUALLEAVE_INTEGERPERCISION = "param_003";
  55. private static final String PARAM_ANNUALLEAVE_CONVERTDATE = "param_004";
  56. private static final String PARAM_ANNUALLEAVE_GENERATEDAY = "param_005";
  57. private static final String PARAM_NURSINGLEAVE_LIMIT = "param_006";
  58. private static final String PARAM_PARENTALLEAVE_LIMIT = "param_007";
  59. private static final String PARAM_NURSINGANDPARENTALLEAVE_CONVERSIONMETHOD = "param_008";
  60. private static final String PARAM_NURSINGANDPARENTALLEAVE_INTEGERMETHOD = "param_009";
  61. private static final String PARAM_NURSINGANDPARENTALLEAVE_INTEGERPERCISION = "param_010";
  62. private static final String PARAM_NURSINGANDPARENTALLEAVE_UPDATESQL = "param_011";
  63. private static final String CONVERSIONMETHOD_BYDAY = "D";
  64. private static final String CONVERSIONMETHOD_BYMONTH = "M";
  65. private static final String INTEGERMETHOD_UP = "U";
  66. private static final String INTEGERMETHOD_DOWN = "D";
  67. private static final double INTEGERPERCISION_HALF = (double)0.5F;
  68. private static final double INTEGERPERCISION_ONE = (double)1.0F;
  69. private static String annualLeaveConversionMethod;
  70. private static String annualLeaveIntegerMethod;
  71. private static double annualLeaveIntegerPrecision;
  72. private static String annualLeaveConvertDate;
  73. private static String annualLeaveGenerateDay;
  74. private static int nursingLeaveLimit;
  75. private static int parentalLeaveLimit;
  76. private static String nursingAndParentalLeaveConversionMethod;
  77. private static String nursingAndParentalLeaveIntegerMethod;
  78. private static double nursingAndParentalLeaveIntegerPrecision;
  79. private static String nursingAndParentalLeaveUpdateSql;
  80. public Object process(Context context, Map<String, Object> map) throws EASBizException, BOSException {
  81. String year = (String)map.get("year");
  82. String personNum = (String)map.get("personNum");
  83. String Date = (String)map.get("currentDate");
  84. String mack = (String)map.get("mack");
  85. if ("ParentalLeave".equals(mack)) {
  86. this.createNursingOrParentalLeave(context, Integer.parseInt(year), personNum, "JQLX000015Y", parentalLeaveLimit, "C");
  87. } else if ("NursingLeave".equals(mack)) {
  88. this.createNursingOrParentalLeave(context, Integer.parseInt(year), personNum, "JQLX000016Y", nursingLeaveLimit, "P");
  89. } else if("updateHolidaypolicy".equals(mack)) {
  90. updateHolidaypolicy(context,Integer.parseInt(year));
  91. }
  92. else {
  93. SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
  94. Date currentDate = null;
  95. try {
  96. currentDate = sf.parse(Date);
  97. } catch (ParseException e) {
  98. e.printStackTrace();
  99. }
  100. this.generateAnnualLeave(context, Integer.parseInt(year), personNum, currentDate);
  101. }
  102. return null;
  103. }
  104. private void initialGlobalParam(Context ctx) throws BOSException {
  105. Map<String, String> param = new HashMap();
  106. ParamCollection paramCollection = ParamFactory.getLocalInstance(ctx).getParamCollection();
  107. for(int i = 0; i < paramCollection.size(); ++i) {
  108. param.put(paramCollection.get(i).getNumber(), paramCollection.get(i).getValue());
  109. }
  110. annualLeaveConversionMethod = (String)param.get("param_001");
  111. annualLeaveIntegerMethod = (String)param.get("param_002");
  112. annualLeaveIntegerPrecision = Double.valueOf((String)param.get("param_003"));
  113. annualLeaveConvertDate = (String)param.get("param_004");
  114. annualLeaveGenerateDay = (String)param.get("param_005");
  115. nursingLeaveLimit = Integer.parseInt((String)param.get("param_006"));
  116. parentalLeaveLimit = Integer.parseInt((String)param.get("param_007"));
  117. nursingAndParentalLeaveConversionMethod = (String)param.get("param_008");
  118. nursingAndParentalLeaveIntegerMethod = (String)param.get("param_009");
  119. nursingAndParentalLeaveIntegerPrecision = Double.valueOf((String)param.get("param_010"));
  120. nursingAndParentalLeaveUpdateSql = (String)param.get("param_011");
  121. }
  122. private synchronized static void updateHolidaypolicy(Context ctx,int year) throws BOSException {
  123. String updateHolidaypolicy = "/*dialect*/MERGE INTO T_HR_ATS_HolidayLimit AS hl \n USING ( \n select\n hl.fid,\n af.fproposerid, hpf.fid AS holiday_policy_id \n from \n T_HR_ATS_AtsHolidayFile af \n left JOIN T_HR_ATS_HolidayPolicy hpf ON hpf.fholidaypolicysetid = af.fholidaypolicysetid \n left JOIN T_HR_ATS_HolidayType ht ON ht.FID = hpf.fholidaytypeid \n left join T_HR_ATS_HolidayLimit hl on af.FPROPOSERID =hl.fproposerid \n where ht.FNUMBER = 'JQLX000001Y' and hl.fholidaypolicyid in( \n select hp.fid from T_HR_ATS_HolidayPolicy hp \n inner JOIN T_HR_ATS_HolidayType ht ON ht.FID = hp.fholidaytypeid \n where ht.FNUMBER = 'JQLX000001Y' \n ) \n and to_char(hl.fcyclebegindate,'yyyy')='" + year + "' \n ) AS src ON hl.fid = src.fid and to_char(hl.fcyclebegindate,'yyyy') ='" + year + "' \n WHEN MATCHED THEN \n UPDATE SET hl.fname_l3=hl.fholidaypolicyid,hl.fholidaypolicyid = src.holiday_policy_id";
  124. DbUtil.execute(ctx, updateHolidaypolicy);
  125. StringBuilder sqlLastCarryforward = new StringBuilder();
  126. sqlLastCarryforward.append(" /*dialect*/merge into T_HR_ATS_HolidayLimit hln ");
  127. sqlLastCarryforward.append(" using ( ");
  128. sqlLastCarryforward.append(" select hln.fid,hlo.cfcarryforward from T_HR_ATS_HolidayLimit hln ");
  129. sqlLastCarryforward.append(" inner join( ");
  130. sqlLastCarryforward.append(" select ht.fname_l2,hl.FPROPOSERID,hl.fholidaypolicyid, ");
  131. sqlLastCarryforward.append(" max(COALESCE(hl.cfcarryforward,0)) cfcarryforward ");
  132. sqlLastCarryforward.append(" from T_HR_ATS_HolidayLimit hl ");
  133. sqlLastCarryforward.append(" inner join (select ");
  134. sqlLastCarryforward.append(" hp.fid,ht.fname_l2 ");
  135. sqlLastCarryforward.append(" from ");
  136. sqlLastCarryforward.append(" T_HR_ATS_HolidayPolicy hp ");
  137. sqlLastCarryforward.append(" inner JOIN T_HR_ATS_HolidayType ht ON ht.FID = hp.fholidaytypeid ");
  138. sqlLastCarryforward.append(" where ");
  139. sqlLastCarryforward.append(" ht.FNUMBER = 'JQLX000001Y') ht on ht.fid=hl.fholidaypolicyid ");
  140. sqlLastCarryforward.append(" where to_char(hl.fcyclebegindate, 'yyyy') = '" + (year - 1) + "' ");
  141. sqlLastCarryforward.append(" group by ht.fname_l2,hl.FPROPOSERID,hl.fholidaypolicyid ");
  142. sqlLastCarryforward.append(" ) hlo on hln.FPROPOSERID = hlo.FPROPOSERID ");
  143. sqlLastCarryforward.append(" where hln.fholidaypolicyid = hlo.fholidaypolicyid ");
  144. sqlLastCarryforward.append(" and to_char(hln.fcyclebegindate, 'yyyy') ='" + year + "' ");
  145. sqlLastCarryforward.append(" ) hlo on hln.fid=hlo.fid ");
  146. sqlLastCarryforward.append(" WHEN MATCHED THEN ");
  147. sqlLastCarryforward.append(" update set hln.cflastCarryforward = hlo.cfcarryforward ");
  148. DbUtil.execute(ctx, sqlLastCarryforward.toString());
  149. }
  150. private void generateAnnualLeave(Context ctx, int year, String personNum, Date currentDate) throws BOSException {
  151. this.initialGlobalParam(ctx);
  152. try {
  153. Date nowDate = new Date();
  154. Map<String, String> holidayPolicyMap = new HashMap();
  155. String holidayPolicySql = "select hps.FNUMBER, hp.fid from T_HR_ATS_HolidayPolicy hp left join T_HR_ATS_HolidayPolicySet hps on hp.FHOLIDAYPOLICYSETID = hps.fid where FHOLIDAYTYPEID = (select fid from T_HR_ATS_HolidayType where FNUMBER = 'JQLX000001Y')";
  156. IRowSet holidayPolicyRowSet = DbUtil.executeQuery(ctx, holidayPolicySql);
  157. while(holidayPolicyRowSet.next()) {
  158. holidayPolicyMap.put(holidayPolicyRowSet.getString("FNUMBER"), holidayPolicyRowSet.getString("fid"));
  159. }
  160. String currentDateStr = DateTimeUtils.format(currentDate, "yyyy-MM-dd");
  161. Date yearFirstDay = DateTimeUtils.parseDate(DateTimeUtils.getYear(currentDate) + "-01-01");
  162. Date yearLastDay = DateTimeUtils.parseDate(DateTimeUtils.getYear(currentDate) + "-12-31");
  163. List<String> personNumberList = new ArrayList();
  164. CoreBaseCollection addList = new CoreBaseCollection();
  165. CoreBaseCollection updateList = new CoreBaseCollection();
  166. List<String> deleteList = new ArrayList();
  167. List<Map<String, Object>> reCalList = new ArrayList();
  168. String personNumStr = "";
  169. if (StringUtils.isNotEmpty(personNum)) {
  170. String[] personNumArr = personNum.split(",");
  171. for(int i = 0; i < personNumArr.length; ++i) {
  172. personNumberList.add("'" + personNumArr[i] + "'");
  173. }
  174. personNumStr = String.join(",", personNumberList);
  175. }
  176. String dbType = ContextUtil.getDbType(ctx);
  177. String sql = " /*dialect*/select * from (select row_number() over (partition by p.fid order by p.fid,eo.feffdt desc,l.fid) as rn,p.fid,p.fnumber,eo.FADMINORGID,eo.FHRORGUNITID,eo.FPOSITIONID,p.cfftorptid fullOrPartId,fp.fnumber fullOrPartNumber, p.cffae annualleavelimit,case when rbe.fid is null then eo.cfworkercategoryid else rbe.CFWcategoryID end workercategoryid,wc.fname_l2 workercategoryname,p.fhiredate, (to_char(to_date('" + currentDateStr + "','yyyy-MM-dd'),'yyyy') - to_char(p.fhiredate,'yyyy')+1)joinDateYear,case when rbe.fid is null then null else rbe.FBIZDATE end leaveDate,l.fid limitId,coalesce(l.FADDORSUBLIMIT,0) FADDORSUBLIMIT,coalesce(l.FUSEDLIMIT,0) FUSEDLIMIT,coalesce(l.FREEZELIMIT,0) FREEZELIMIT,coalesce(l.cflastcarryforward,0) cflastcarryforward,coalesce(l.cfcarryforward,0) cfcarryforward,coalesce(l.CFEntitlementLimit,0) CFEntitlementLimit,coalesce(l.CFInitializedLimit,0) CFInitializedLimit, ebe.FPROBATION,ebe.FPLANFORMALDATE,hp.fid holidayPolicyId,l.fisleftconvert isleftconvert from T_HR_ATS_AtsHolidayFile f left join T_BD_Person p on f.fproposerid = p.fid left join T_HR_EmpOrgRelation eo on p.fid = eo.fpersonid and eo.fleffdt='2199-12-31 00:00:00' left join CT_MP_Fullorpart fp on fp.fid = p.cfftorptid left join T_HR_ATS_HolidayType ht on ht.FNUMBER = 'JQLX000001Y' left join T_HR_ATS_HolidayPolicy hp on ht.FID =hp.fholidaytypeid and f.fholidaypolicysetid = hp.fholidaypolicysetid left join T_HR_ATS_HolidayLimit l on hp.fid = l.FHOLIDAYPOLICYID and l.FPROPOSERID = p.fid and l.FCYCLEBEGINDATE >= p.fhiredate and l.FCYCLEBEGINDATE <= p.FLEFFDT and l.fyear = " + year + " left join ( select rownum rownumber,ebe.FPERSONID, ebe.FPROBATION,ebe.FPLANFORMALDATE, ebe.FBIZDATE from T_HR_EmpEnrollBizBillEntry ebe inner join (select re1.fpersonid,max(re1.fbizdate) fbizdate,count(fid) from T_HR_EmpEnrollBizBillEntry re1 group by re1.fpersonid) re1 on ebe.fpersonid=re1.fpersonid and re1.fbizdate=ebe.fbizdate left join T_HR_EmpEnrollBizBill eb on ebe.FBILLID = eb.FID where eb.FBILLSTATE = 3 order by ebe.fbizdate desc) ebe on ebe.FPERSONID = p.fid and ebe.FBIZDATE = p.fhiredate left join( select rownum rownumber,rbe.fid, rbe.FPERSONID, rbe.FENTERDATE, rbe.CFWcategoryID, rbe.FBIZDATE from T_HR_ResignBizBillEntry rbe inner join (select re1.fpersonid,max(re1.fbizdate) fbizdate,count(fid) from T_HR_ResignBizBillEntry re1 group by re1.fpersonid) re1 on rbe.fpersonid=re1.fpersonid and re1.fbizdate=rbe.fbizdate left join T_HR_ResignBizBill rb on rb.fid = rbe.FBILLID where rb.FBILLSTATE = 3 order by rbe.fbizdate desc ) rbe on rbe.FPERSONID = p.fid and p.fhiredate = rbe.FENTERDATE left join CT_MP_WorkerCategory wc on (wc.fid = eo.cfworkercategoryid or wc.fid = rbe.CFWcategoryID) where f.fattendfilestate in( 1,2) and ht.FNUMBER = 'JQLX000001Y' and fp.fnumber = 'FULL' and eo.fassigntype = 1 and eo.feffdt <= to_date('" + currentDateStr + "','yyyy-MM-dd') and to_char(p.fhiredate, 'yyyy')<=" + year + " and to_char(p.FLEFFDT,'yyyy')>=" + year + " ";
  178. if (StringUtils.isNotEmpty(personNumStr)) {
  179. sql = sql + " and p.fnumber in (" + personNumStr + ") ";
  180. }
  181. sql = sql + " order by l.fid ) temp where temp.rn = 1 ";
  182. IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
  183. while(iRowSet.next()) {
  184. String holidayPolicyId = iRowSet.getString("holidayPolicyId");
  185. if (StringUtils.isEmpty(holidayPolicyId)) {
  186. holidayPolicyId = (String)holidayPolicyMap.values().stream().findFirst().get();
  187. } else {
  188. String limitId = iRowSet.getString("limitId");
  189. int annualleavelimit = iRowSet.getInt("annualleavelimit");
  190. String workercategoryname = iRowSet.getString("workercategoryname");
  191. int joinDateYear = iRowSet.getInt("joinDateYear");
  192. Date joinDate = iRowSet.getDate("fhiredate");
  193. Date fplanformaldate = iRowSet.getDate("FPLANFORMALDATE");
  194. Date leaveDate = iRowSet.getDate("leaveDate");
  195. BigDecimal standardLimit = BigDecimal.ZERO;
  196. BigDecimal convertedLimit = BigDecimal.ZERO;
  197. BigDecimal entitlementLimit = BigDecimal.ZERO;
  198. int isLeave = 0;
  199. BigDecimal realLimit = BigDecimal.ZERO;
  200. BigDecimal remainLimit = BigDecimal.ZERO;
  201. BigDecimal entitlementLimitOld = iRowSet.getBigDecimal("CFEntitlementLimit");
  202. BigDecimal initializedLimit = iRowSet.getBigDecimal("CFInitializedLimit");
  203. BigDecimal lastCarryforward = iRowSet.getBigDecimal("CFLastCarryforward");
  204. BigDecimal carryforward = iRowSet.getBigDecimal("CFCarryforward");
  205. BigDecimal addOrSubLimit = iRowSet.getBigDecimal("FADDORSUBLIMIT");
  206. BigDecimal usedLimit = iRowSet.getBigDecimal("FUSEDLIMIT");
  207. BigDecimal freezeLimit = iRowSet.getBigDecimal("FreezeLimit");
  208. int isleftconvert = iRowSet.getInt("isleftconvert");
  209. if (!StringUtils.equalsIgnoreCase(workercategoryname, "General Administrative Staff") && !StringUtils.equalsIgnoreCase(workercategoryname, "Professional Supervisory Staff") && !StringUtils.equalsIgnoreCase(workercategoryname, "Senior Administrative Staff")) {
  210. if (StringUtils.equalsIgnoreCase(workercategoryname, "Academic Staff") || StringUtils.equalsIgnoreCase(workercategoryname, "Others")) {
  211. convertedLimit = BigDecimal.valueOf((long)annualleavelimit);
  212. }
  213. } else if (annualleavelimit > 0) {
  214. convertedLimit = BigDecimal.valueOf((long)(annualleavelimit + (joinDateYear - 1) / 2 * 1));
  215. if (convertedLimit.compareTo(BigDecimal.valueOf(30L)) > 0) {
  216. convertedLimit = BigDecimal.valueOf(30L);
  217. }
  218. } else {
  219. if (StringUtils.equalsIgnoreCase(workercategoryname, "General Administrative Staff")) {
  220. convertedLimit = BigDecimal.valueOf((long)(12 + (joinDateYear - 1) / 2 * 1));
  221. if (convertedLimit.compareTo(BigDecimal.valueOf(20L)) > 0) {
  222. convertedLimit = BigDecimal.valueOf(20L);
  223. }
  224. }
  225. if (StringUtils.equalsIgnoreCase(workercategoryname, "Professional Supervisory Staff")) {
  226. convertedLimit = BigDecimal.valueOf((long)(15 + (joinDateYear - 1) / 2 * 1));
  227. if (convertedLimit.compareTo(BigDecimal.valueOf(23L)) > 0) {
  228. convertedLimit = BigDecimal.valueOf(23L);
  229. }
  230. }
  231. if (StringUtils.equalsIgnoreCase(workercategoryname, "Senior Administrative Staff")) {
  232. convertedLimit = BigDecimal.valueOf((long)(18 + (joinDateYear - 1) / 2 * 1));
  233. if (convertedLimit.compareTo(BigDecimal.valueOf(26L)) > 0) {
  234. convertedLimit = BigDecimal.valueOf(26L);
  235. }
  236. }
  237. }
  238. entitlementLimit = convertedLimit;
  239. if (leaveDate != null && DateTimeUtils.getYear(currentDate) == DateTimeUtils.getYear(leaveDate) && joinDate.compareTo(leaveDate) < 0) {
  240. if (StringUtils.equals("D", annualLeaveConversionMethod)) {
  241. if (DateTimeUtils.getYear(currentDate) == DateTimeUtils.getYear(joinDate)) {
  242. convertedLimit = convertedLimit.multiply(BigDecimal.valueOf((long)(DateTimeUtils.getMonth(leaveDate) - DateTimeUtils.getMonth(joinDate) + 1))).divide(BigDecimal.valueOf(12L), 10, 4);
  243. } else {
  244. convertedLimit = convertedLimit.multiply(BigDecimal.valueOf((long)DateTimeUtils.getMonth(leaveDate))).divide(BigDecimal.valueOf(12L), 10, 4);
  245. }
  246. } else if (DateTimeUtils.getYear(currentDate) == DateTimeUtils.getYear(joinDate)) {
  247. convertedLimit = convertedLimit.multiply(BigDecimal.valueOf((long)(DateTimeUtils.getMonth(leaveDate) - DateTimeUtils.getMonth(joinDate) + 1))).divide(BigDecimal.valueOf(12L), 10, 4);
  248. } else {
  249. convertedLimit = convertedLimit.multiply(BigDecimal.valueOf((long)DateTimeUtils.getMonth(leaveDate))).divide(BigDecimal.valueOf(12L), 10, 4);
  250. }
  251. } else if (DateTimeUtils.getYear(currentDate) == DateTimeUtils.getYear(joinDate)) {
  252. if (StringUtils.equals("D", annualLeaveConversionMethod)) {
  253. convertedLimit = convertedLimit.multiply(BigDecimal.valueOf((long)(12 - DateTimeUtils.getMonth(joinDate) + 1))).divide(BigDecimal.valueOf(12L), 10, 4);
  254. } else {
  255. convertedLimit = convertedLimit.multiply(BigDecimal.valueOf((long)(12 - DateTimeUtils.getMonth(joinDate) + 1))).divide(BigDecimal.valueOf(12L), 10, 4);
  256. }
  257. }
  258. BigDecimal standardLimitInteger = convertedLimit.setScale(0, RoundingMode.FLOOR);
  259. BigDecimal standardLimitDecimal = convertedLimit.subtract(standardLimitInteger);
  260. if (Double.doubleToLongBits((double)0.5F) == Double.doubleToLongBits(annualLeaveIntegerPrecision)) {
  261. if (StringUtils.equals("U", annualLeaveIntegerMethod)) {
  262. if (standardLimitDecimal.compareTo(BigDecimal.valueOf((double)0.5F)) > 0) {
  263. convertedLimit = convertedLimit.setScale(0, RoundingMode.CEILING);
  264. } else if (standardLimitDecimal.compareTo(BigDecimal.ZERO) > 0) {
  265. convertedLimit = standardLimitInteger.add(BigDecimal.valueOf((double)0.5F));
  266. } else {
  267. convertedLimit = standardLimitInteger;
  268. }
  269. } else if (standardLimitDecimal.compareTo(BigDecimal.valueOf((double)0.5F)) > 0) {
  270. convertedLimit = standardLimitInteger.add(BigDecimal.valueOf((double)0.5F));
  271. } else {
  272. convertedLimit = convertedLimit.setScale(0, RoundingMode.FLOOR);
  273. }
  274. } else if (StringUtils.equals("U", annualLeaveIntegerMethod)) {
  275. convertedLimit = convertedLimit.setScale(0, RoundingMode.CEILING);
  276. } else {
  277. convertedLimit = convertedLimit.setScale(0, RoundingMode.FLOOR);
  278. }
  279. if (entitlementLimit.compareTo(entitlementLimitOld) != 0 && year <= DateTimeUtils.getYear(nowDate)) {
  280. lastCarryforward = BigDecimal.ZERO;
  281. Map<String, Object> param = new HashMap();
  282. param.put("year", year);
  283. param.put("personNum", iRowSet.getString("fnumber"));
  284. reCalList.add(param);
  285. }
  286. standardLimit = convertedLimit.add(initializedLimit).add(lastCarryforward).subtract(carryforward);
  287. realLimit = standardLimit.add(addOrSubLimit);
  288. remainLimit = realLimit.subtract(usedLimit).subtract(freezeLimit);
  289. BigDecimal addOrSub = BigDecimal.ZERO;
  290. if (remainLimit.compareTo(BigDecimal.valueOf(30L)) > 0) {
  291. addOrSub = BigDecimal.valueOf(30L).subtract(remainLimit);
  292. remainLimit = remainLimit.add(addOrSub);
  293. }
  294. if (StringUtils.isNotEmpty(limitId)) {
  295. HolidayLimitInfo holidayLimitInfo = new HolidayLimitInfo();
  296. holidayLimitInfo.setId(BOSUuid.read(limitId));
  297. holidayLimitInfo.setStandardLimit(standardLimit);
  298. addOrSubLimit = addOrSubLimit.add(addOrSub);
  299. holidayLimitInfo.setAddOrSubLimit(addOrSubLimit);
  300. holidayLimitInfo.setBigDecimal("convertedLimit", convertedLimit);
  301. holidayLimitInfo.setBigDecimal("entitlementLimit", entitlementLimit);
  302. holidayLimitInfo.setRealLimit(realLimit);
  303. holidayLimitInfo.setRemainLimit(remainLimit);
  304. holidayLimitInfo.setBigDecimal("lastCarryforward", lastCarryforward);
  305. holidayLimitInfo.setBigDecimal("Carryforward", carryforward);
  306. if (leaveDate != null && DateTimeUtils.getYear(currentDate) == DateTimeUtils.getYear(leaveDate) && joinDate.compareTo(leaveDate) < 0) {
  307. holidayLimitInfo.setCycleEndDate(leaveDate);
  308. holidayLimitInfo.setDelayDate(leaveDate);
  309. holidayLimitInfo.setIsLeftConvert(true);
  310. } else {
  311. if (DateTimeUtils.getYear(currentDate) == DateTimeUtils.getYear(joinDate)) {
  312. holidayLimitInfo.setCycleBeginDate(joinDate);
  313. int fprobation = iRowSet.getInt("FPROBATION");
  314. if (fprobation > 0) {
  315. holidayLimitInfo.setEffectDate(iRowSet.getDate("FPLANFORMALDATE"));
  316. } else {
  317. holidayLimitInfo.setEffectDate(holidayLimitInfo.getCycleBeginDate());
  318. }
  319. }
  320. holidayLimitInfo.setIsLeftConvert(false);
  321. }
  322. if (StringUtils.isNotEmpty(iRowSet.getString("FADMINORGID"))) {
  323. AdminOrgUnitInfo adminOrgUnitInfo = new AdminOrgUnitInfo();
  324. adminOrgUnitInfo.setId(BOSUuid.read(iRowSet.getString("FADMINORGID")));
  325. holidayLimitInfo.setAdminOrgUnit(adminOrgUnitInfo);
  326. }
  327. if (StringUtils.isNotEmpty(iRowSet.getString("FPOSITIONID"))) {
  328. PositionInfo positionInfo = new PositionInfo();
  329. positionInfo.setId(BOSUuid.read(iRowSet.getString("FPOSITIONID")));
  330. holidayLimitInfo.setPosition(positionInfo);
  331. }
  332. holidayLimitInfo.setLastUpdateUser(ContextUtil.getCurrentUserInfo(ctx));
  333. holidayLimitInfo.setLastUpdateTime(new Timestamp(nowDate.getTime()));
  334. if (leaveDate == null || 1 != isleftconvert || leaveDate.getTime() > holidayLimitInfo.getCycleEndDate().getTime()) {
  335. updateList.add(holidayLimitInfo);
  336. }
  337. } else {
  338. HolidayLimitInfo holidayLimitInfo = new HolidayLimitInfo();
  339. holidayLimitInfo.setStandardLimit(standardLimit);
  340. holidayLimitInfo.setBigDecimal("convertedLimit", convertedLimit);
  341. holidayLimitInfo.setBigDecimal("entitlementLimit", entitlementLimit);
  342. holidayLimitInfo.setRealLimit(realLimit);
  343. holidayLimitInfo.setRemainLimit(remainLimit);
  344. holidayLimitInfo.setFreezeLimit(BigDecimal.ZERO);
  345. holidayLimitInfo.setUsedLimit(BigDecimal.ZERO);
  346. holidayLimitInfo.setAddOrSubLimit(addOrSub);
  347. holidayLimitInfo.setPreOverdraftLimit(BigDecimal.ZERO);
  348. if (DateTimeUtils.getYear(currentDate) == DateTimeUtils.getYear(joinDate)) {
  349. holidayLimitInfo.setCycleBeginDate(joinDate);
  350. int fprobation = iRowSet.getInt("FPROBATION");
  351. if (fprobation > 0) {
  352. holidayLimitInfo.setEffectDate(iRowSet.getDate("FPLANFORMALDATE"));
  353. } else {
  354. holidayLimitInfo.setEffectDate(holidayLimitInfo.getCycleBeginDate());
  355. }
  356. } else if (fplanformaldate != null && DateTimeUtils.getYear(currentDate) == DateTimeUtils.getYear(fplanformaldate)) {
  357. holidayLimitInfo.setCycleBeginDate(yearFirstDay);
  358. int fprobation = iRowSet.getInt("FPROBATION");
  359. if (fprobation > 0) {
  360. holidayLimitInfo.setEffectDate(iRowSet.getDate("FPLANFORMALDATE"));
  361. } else {
  362. holidayLimitInfo.setEffectDate(holidayLimitInfo.getCycleBeginDate());
  363. }
  364. } else {
  365. holidayLimitInfo.setCycleBeginDate(yearFirstDay);
  366. holidayLimitInfo.setEffectDate(holidayLimitInfo.getCycleBeginDate());
  367. }
  368. if (leaveDate != null && DateTimeUtils.getYear(currentDate) == DateTimeUtils.getYear(leaveDate)) {
  369. holidayLimitInfo.setCycleEndDate(leaveDate);
  370. holidayLimitInfo.setDelayDate(leaveDate);
  371. holidayLimitInfo.setIsLeftConvert(true);
  372. } else {
  373. holidayLimitInfo.setCycleEndDate(yearLastDay);
  374. holidayLimitInfo.setDelayDate(yearLastDay);
  375. }
  376. holidayLimitInfo.setYear(DateTimeUtils.getYear(yearFirstDay));
  377. HolidayPolicyInfo holidayPolicyInfo = new HolidayPolicyInfo();
  378. holidayPolicyInfo.setId(BOSUuid.read(holidayPolicyId));
  379. holidayLimitInfo.setHolidayPolicy(holidayPolicyInfo);
  380. holidayLimitInfo.setHolidayUnit(HolidayTypeUnitEnum.day);
  381. holidayLimitInfo.setEnableCycle(true);
  382. PersonInfo personInfo = new PersonInfo();
  383. personInfo.setId(BOSUuid.read(iRowSet.getString("fid")));
  384. holidayLimitInfo.setProposer(personInfo);
  385. holidayLimitInfo.setStatus(HolidayLimitStatus.audited);
  386. if (StringUtils.isNotEmpty(iRowSet.getString("FADMINORGID"))) {
  387. AdminOrgUnitInfo adminOrgUnitInfo = new AdminOrgUnitInfo();
  388. adminOrgUnitInfo.setId(BOSUuid.read(iRowSet.getString("FADMINORGID")));
  389. holidayLimitInfo.setAdminOrgUnit(adminOrgUnitInfo);
  390. }
  391. if (StringUtils.isNotEmpty(iRowSet.getString("FHRORGUNITID"))) {
  392. HROrgUnitInfo hrOrgUnitInfo = new HROrgUnitInfo();
  393. hrOrgUnitInfo.setId(BOSUuid.read(iRowSet.getString("FHRORGUNITID")));
  394. holidayLimitInfo.setHrOrgUnit(hrOrgUnitInfo);
  395. }
  396. if (StringUtils.isNotEmpty(iRowSet.getString("FPOSITIONID"))) {
  397. PositionInfo positionInfo = new PositionInfo();
  398. positionInfo.setId(BOSUuid.read(iRowSet.getString("FPOSITIONID")));
  399. holidayLimitInfo.setPosition(positionInfo);
  400. }
  401. CtrlUnitInfo ctrlUnitInfo = new CtrlUnitInfo();
  402. ctrlUnitInfo.setId(BOSUuid.read("00000000-0000-0000-0000-000000000000CCE7AED4"));
  403. holidayLimitInfo.setCU(ctrlUnitInfo);
  404. holidayLimitInfo.setCycleDate(yearLastDay);
  405. holidayLimitInfo.setCreator(ContextUtil.getCurrentUserInfo(ctx));
  406. holidayLimitInfo.setCreateTime(new Timestamp(nowDate.getTime()));
  407. holidayLimitInfo.setLastUpdateUser(ContextUtil.getCurrentUserInfo(ctx));
  408. holidayLimitInfo.setLastUpdateTime(new Timestamp(nowDate.getTime()));
  409. if (leaveDate == null || 1 != isleftconvert || leaveDate.getTime() > holidayLimitInfo.getCycleEndDate().getTime()) {
  410. addList.add(holidayLimitInfo);
  411. }
  412. }
  413. }
  414. }
  415. if (addList.size() > 0) {
  416. HolidayLimitFactory.getLocalInstance(ctx).addnewBatchData(addList);
  417. }
  418. if (updateList.size() > 0) {
  419. HolidayLimitFactory.getLocalInstance(ctx).updateBatchData(updateList);
  420. }
  421. if (deleteList.size() > 0) {
  422. IObjectPK[] iObjectPKS = new IObjectPK[deleteList.size()];
  423. for(int i = 0; i < deleteList.size(); ++i) {
  424. iObjectPKS[i] = new ObjectUuidPK((String)deleteList.get(i));
  425. }
  426. HolidayLimitFactory.getLocalInstance(ctx).deleteBatchData(iObjectPKS);
  427. }
  428. if (reCalList.size() > 0) {
  429. for(int i = 0; i < reCalList.size(); ++i) {
  430. int yearP = (Integer)((Map)reCalList.get(i)).get("year");
  431. String personNumP = (String)((Map)reCalList.get(i)).get("personNum");
  432. String lastYearSql = "/*dialect*/select p.fid,l.fid limitId,l.FSTANDARDLIMIT,l.FADDORSUBLIMIT,l.FUSEDLIMIT,l.FREEZELIMIT, coalesce(l.CFInitializedLimit, 0) CFInitializedLimit,coalesce(l.CFConvertedLimit, 0) CFConvertedLimit, coalesce(l.cflastcarryforward,0) cflastcarryforward,coalesce(l.cfcarryforward,0) cfcarryforward from t_bd_person p\n left join T_HR_ATS_AtsHolidayFile f on f.fproposerid = p.fid \n left join T_HR_ATS_HolidayPolicySet hps on f.fholidaypolicysetid = hps.fid \n left join T_HR_ATS_HolidayPolicy hp on hps.fid = hp.fholidaypolicysetid \n left join T_HR_ATS_HolidayType ht on ht.FNUMBER = 'JQLX000001Y' and ht.fid = hp.FHOLIDAYTYPEID \n left join T_HR_ATS_HolidayLimit l on hp.fid = l.FHOLIDAYPOLICYID and l.FPROPOSERID = p.fid and l.FCYCLEBEGINDATE >= p.fhiredate and l.FCYCLEBEGINDATE <= p.FLEFFDT and l.fyear = " + (yearP - 1) + "\n where f.fattendfilestate = 1 and p.fnumber = '" + personNumP + "' and l.fid is not null and ht.FNUMBER = 'JQLX000001Y' ";
  433. if (StringUtils.equalsIgnoreCase("MS SQL Server", dbType)) {
  434. lastYearSql = "/*dialect*/select p.fid,l.fid limitId,l.FSTANDARDLIMIT,l.FADDORSUBLIMIT,l.FUSEDLIMIT,l.FREEZELIMIT, isnull(l.CFInitializedLimit, 0) CFInitializedLimit,isnull(l.CFConvertedLimit, 0) CFConvertedLimit, isnull(l.cflastcarryforward,0) cflastcarryforward,isnull(l.cfcarryforward,0) cfcarryforward from t_bd_person p\n left join T_HR_ATS_AtsHolidayFile f on f.fproposerid = p.fid \n left join T_HR_ATS_HolidayPolicySet hps on f.fholidaypolicysetid = hps.fid \n left join T_HR_ATS_HolidayPolicy hp on hps.fid = hp.fholidaypolicysetid \n left join T_HR_ATS_HolidayType ht on ht.FNUMBER = 'JQLX000001Y' and ht.fid = hp.FHOLIDAYTYPEID \n left join T_HR_ATS_HolidayLimit l on hp.fid = l.FHOLIDAYPOLICYID and l.FPROPOSERID = p.fid and l.FCYCLEBEGINDATE >= p.fhiredate and l.FCYCLEBEGINDATE <= p.FLEFFDT and l.fyear = " + (yearP - 1) + "\n where f.fattendfilestate = 1 and p.fnumber = '" + personNumP + "' and l.fid is not null and ht.FNUMBER = 'JQLX000001Y' ";
  435. }
  436. IRowSet lastYearRowSet = DbUtil.executeQuery(ctx, lastYearSql);
  437. if (lastYearRowSet.next()) {
  438. HolidayLimitInfo lastYearHolidayLimitInfo = new HolidayLimitInfo();
  439. BigDecimal lastYearConvertedLimit = lastYearRowSet.getBigDecimal("CFConvertedLimit");
  440. BigDecimal lastYearInitializedLimit = lastYearRowSet.getBigDecimal("CFInitializedLimit");
  441. BigDecimal lastYearLastCarryforward = lastYearRowSet.getBigDecimal("CFLastCarryforward");
  442. BigDecimal lastYearCarryforward = BigDecimal.ZERO;
  443. BigDecimal lastYearStandardLimit = lastYearConvertedLimit.add(lastYearInitializedLimit).add(lastYearLastCarryforward).subtract(lastYearCarryforward);
  444. lastYearHolidayLimitInfo.setId(BOSUuid.read(lastYearRowSet.getString("limitId")));
  445. lastYearHolidayLimitInfo.setBigDecimal("Carryforward", lastYearCarryforward);
  446. lastYearHolidayLimitInfo.setLastUpdateUser(ContextUtil.getCurrentUserInfo(ctx));
  447. lastYearHolidayLimitInfo.setLastUpdateTime(new Timestamp(nowDate.getTime()));
  448. LeaveAllowanceFacadeFactory.getLocalInstance(ctx).carryForwardLeave(yearP, true, personNumP);
  449. }
  450. }
  451. }
  452. } catch (SQLException e) {
  453. throw new BOSException(e);
  454. } catch (ParseException e) {
  455. throw new BOSException(e);
  456. } catch (EASBizException e) {
  457. throw new BOSException(e);
  458. }
  459. }
  460. private void createNursingOrParentalLeave(Context ctx, int year, String personNum, String policyNumber, int initialLimit, String cnLeave) throws BOSException {
  461. try {
  462. this.initialGlobalParam(ctx);
  463. String personFamilyTempTable = this.createPersonFamilyTempTable(ctx, cnLeave);
  464. Date nowDate = new Date();
  465. Date currentDate = new Date();
  466. if (year != 0) {
  467. currentDate = DateTimeUtils.parseDate(year + "-12-31");
  468. } else {
  469. year = DateTimeUtils.getYear(currentDate);
  470. }
  471. String yearFirstDayStr = DateTimeUtils.getYear(currentDate) + "-01-01";
  472. Date yearFirstDay = DateTimeUtils.parseDate(yearFirstDayStr);
  473. String yearLastDayStr = DateTimeUtils.getYear(currentDate) + "-12-31";
  474. Date yearLastDay = DateTimeUtils.parseDate(yearLastDayStr);
  475. List<String> personNumberList = new ArrayList();
  476. CoreBaseCollection addList = new CoreBaseCollection();
  477. CoreBaseCollection updateList = new CoreBaseCollection();
  478. String personNumStr = "";
  479. if (StringUtils.isNotEmpty(personNum)) {
  480. String[] personNumArr = personNum.split(",");
  481. for(int i = 0; i < personNumArr.length; ++i) {
  482. personNumberList.add("'" + personNumArr[i] + "'");
  483. }
  484. personNumStr = String.join(",", personNumberList);
  485. }
  486. String clearQuotaSql = " update T_HR_ATS_HolidayLimit set FStandardLimit = 0, FRealLimit = FAddOrSubLimit,FRemainLimit = FAddOrSubLimit-FUsedLimit-FreezeLimit where fid in ( select l.fid from T_HR_ATS_HolidayLimit l left join T_HR_ATS_HolidayPolicy hp on hp.fid = l.FHOLIDAYPOLICYID left join T_HR_ATS_HolidayType ht on hp.FHOLIDAYTYPEID = ht.fid left join t_bd_person p on p.fid = l.FPROPOSERID where ht.FNUMBER = '" + policyNumber + "' and l.FYEAR = " + year + " and l.FCYCLEBEGINDATE >= p.fhiredate and l.FCYCLEBEGINDATE <= p.FLEFFDT ";
  487. if (StringUtils.isNotEmpty(personNumStr)) {
  488. clearQuotaSql = clearQuotaSql + " and p.fnumber in (" + personNumStr + ")) ";
  489. } else {
  490. clearQuotaSql = clearQuotaSql + " ) ";
  491. }
  492. DbUtil.execute(ctx, clearQuotaSql);
  493. String deleteZeroQuotaSql = "delete from T_HR_ATS_HolidayLimit where FHOLIDAYPOLICYID in (select hp.fid from T_HR_ATS_HolidayPolicy hp left join T_HR_ATS_HolidayType ht on hp.FHOLIDAYTYPEID = ht.fid where ht.FNUMBER = '" + policyNumber + "') and FYEAR = " + year + " and FStandardLimit = 0 and FRealLimit = 0 and FAddOrSubLimit = 0 and FRemainLimit = 0 and FUsedLimit = 0 and FreezeLimit = 0 ";
  494. if (StringUtils.isNotEmpty(personNumStr)) {
  495. deleteZeroQuotaSql = deleteZeroQuotaSql + " and FProposerID in (select fid from t_bd_person where fnumber in (" + personNumStr + ") ) ";
  496. }
  497. DbUtil.execute(ctx, deleteZeroQuotaSql);
  498. String sql = "/*dialect*/select f.FPERSONID,p.fnumber, case when to_char(f.CFStartTime,'yyyy') < " + year + " then to_date('" + year + "-01-01','yyyy-MM-dd') else f.CFStartTime end CFStartTime, case when f.CFEndTime is null or to_char(f.CFEndTime,'yyyy') > " + year + " then to_date('" + year + "-12-31','yyyy-MM-dd') else f.CFEndTime end CFEndTime , case when rbe.fid is null then null else rbe.FBIZDATE end leaveDate,p.fhiredate,hf.FADMINORGUNITID, hf.FHRORGUNITID ,hf.FPOSITIONID, l.fid limitId,ebe.FPROBATION, ebe.FPLANFORMALDATE,hp.fid holidayPolicyId,l.FADDORSUBLIMIT,l.FUSEDLIMIT,l.FREEZELIMIT,l.FCYCLEBEGINDATE,l.FCYCLEENDDATE from " + personFamilyTempTable + " f inner join t_bd_person p on p.fid = f.FPERSONID inner join T_HR_ATS_AtsHolidayFile hf on hf.fproposerid = f.FPERSONID inner join T_HR_ATS_HolidayPolicySet hps on hf.fholidaypolicysetid = hps.fid inner join T_HR_ATS_HolidayPolicy hp on hps.fid = hp.fholidaypolicysetid inner join T_HR_ATS_HolidayType ht on ht.FNUMBER = '" + policyNumber + "' and ht.fid = hp.FHOLIDAYTYPEID left join T_HR_ATS_HolidayLimit l on hp.fid = l.FHOLIDAYPOLICYID and l.FPROPOSERID = f.FPERSONID and l.FYEAR = " + year + " and l.FCYCLEBEGINDATE >= p.fhiredate and l.FCYCLEENDDATE >= p.fhiredate and (case when to_char(f.CFStartTime,'yyyy') < " + year + " then to_date('" + year + "-01-01','yyyy-MM-dd') else f.CFStartTime end) <= l.FCYCLEBEGINDATE and (case when f.CFEndTime is null or to_char(f.CFEndTime,'yyyy') > " + year + " then to_date('" + year + "-12-31','yyyy-MM-dd') else f.CFEndTime end) >=l.FCYCLEBEGINDATE left join ( select rownum rownumber,ebe.FPERSONID, ebe.FPROBATION,ebe.FPLANFORMALDATE, ebe.FBIZDATE from T_HR_EmpEnrollBizBillEntry ebe inner join (select re1.fpersonid,max(re1.fbizdate) fbizdate,count(fid) from T_HR_EmpEnrollBizBillEntry re1 group by re1.fpersonid) re1 on ebe.fpersonid=re1.fpersonid and re1.fbizdate=ebe.fbizdate left join T_HR_EmpEnrollBizBill eb on ebe.FBILLID = eb.FID and eb.FBILLSTATE = 3 order by ebe.fbizdate desc) ebe on ebe.FPERSONID = p.fid and ebe.FBIZDATE = p.fhiredate left join( select rownum rownumber,rbe.fid, rbe.FPERSONID, rbe.FENTERDATE, rbe.CFWcategoryID, rbe.FBIZDATE from T_HR_ResignBizBillEntry rbe inner join (select re1.fpersonid,max(re1.fbizdate) fbizdate,count(fid) from T_HR_ResignBizBillEntry re1 group by re1.fpersonid) re1 on rbe.fpersonid=re1.fpersonid and re1.fbizdate=rbe.fbizdate left join T_HR_ResignBizBill rb on rb.fid = rbe.FBILLID and rb.FBILLSTATE = 3 order by rbe.fbizdate desc ) rbe on rbe.FPERSONID = p.fid and p.fhiredate = rbe.FENTERDATE where ht.FNUMBER = '" + policyNumber + "' and hf.fattendfilestate = 1 and (case when to_char(f.CFStartTime,'yyyy') < " + year + " then to_date('" + year + "-01-01','yyyy-MM-dd') else f.CFStartTime end) <= to_date('" + yearLastDayStr + "','yyyy-MM-dd') and (case when f.CFEndTime is null or to_char(f.CFEndTime,'yyyy') > " + year + " then to_date('" + year + "-12-31','yyyy-MM-dd') else f.CFEndTime end) >= to_date('" + yearFirstDayStr + "','yyyy-MM-dd') and to_char(p.fhiredate,'yyyy')<=" + year + " and to_char(p.FLEFFDT,'yyyy')>=" + year;
  499. if (StringUtils.isNotEmpty(personNumStr)) {
  500. sql = sql + " and p.fnumber in (" + personNumStr + ") ";
  501. }
  502. IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
  503. while(iRowSet.next()) {
  504. String holidayPolicyId = iRowSet.getString("holidayPolicyId");
  505. if (!StringUtils.isEmpty(holidayPolicyId)) {
  506. BigDecimal standardLimit = BigDecimal.valueOf((long)initialLimit);
  507. String limitId = iRowSet.getString("limitId");
  508. java.sql.Date joinDate = iRowSet.getDate("fhiredate");
  509. java.sql.Date fplanformaldate = iRowSet.getDate("FPLANFORMALDATE");
  510. java.sql.Date leaveDate = iRowSet.getDate("leaveDate");
  511. java.sql.Date cfStartTime = iRowSet.getDate("CFStartTime");
  512. java.sql.Date effectDate = iRowSet.getDate("CFStartTime");
  513. java.sql.Date cfEndTime = iRowSet.getDate("CFEndTime");
  514. if (DateTimeUtils.getYear(joinDate) == DateTimeUtils.getYear(cfStartTime) && joinDate.getTime() > cfStartTime.getTime()) {
  515. cfStartTime = joinDate;
  516. effectDate = iRowSet.getDate("FPLANFORMALDATE") != null ? iRowSet.getDate("FPLANFORMALDATE") : joinDate;
  517. } else if (fplanformaldate != null && DateTimeUtils.getYear(fplanformaldate) == DateTimeUtils.getYear(cfStartTime) && fplanformaldate.getTime() > cfStartTime.getTime()) {
  518. effectDate = fplanformaldate;
  519. }
  520. if (leaveDate != null && DateTimeUtils.getYear(currentDate) == DateTimeUtils.getYear(leaveDate) && DateTimeUtils.getYear(leaveDate) == DateTimeUtils.getYear(cfEndTime) && cfEndTime.getTime() > leaveDate.getTime()) {
  521. cfEndTime = leaveDate;
  522. }
  523. if (cfStartTime.getTime() <= cfEndTime.getTime()) {
  524. standardLimit = standardLimit.multiply(BigDecimal.valueOf((long)(DateTimeUtils.getMonth(cfEndTime) - DateTimeUtils.getMonth(cfStartTime) + 1))).divide(BigDecimal.valueOf(12L), 10, 4);
  525. BigDecimal standardLimitInteger = standardLimit.setScale(0, RoundingMode.FLOOR);
  526. BigDecimal standardLimitDecimal = standardLimit.subtract(standardLimitInteger);
  527. if (Double.doubleToLongBits((double)0.5F) == Double.doubleToLongBits(nursingAndParentalLeaveIntegerPrecision)) {
  528. if (StringUtils.equals("U", nursingAndParentalLeaveIntegerMethod)) {
  529. if (standardLimitDecimal.compareTo(BigDecimal.valueOf((double)0.5F)) > 0) {
  530. standardLimit = standardLimit.setScale(0, RoundingMode.CEILING);
  531. } else if (standardLimitDecimal.compareTo(BigDecimal.ZERO) > 0) {
  532. standardLimit = standardLimitInteger.add(BigDecimal.valueOf((double)0.5F));
  533. } else {
  534. standardLimit = standardLimitInteger;
  535. }
  536. } else if (standardLimitDecimal.compareTo(BigDecimal.valueOf((double)0.5F)) > 0) {
  537. standardLimit = standardLimitInteger.add(BigDecimal.valueOf((double)0.5F));
  538. } else {
  539. standardLimit = standardLimit.setScale(0, RoundingMode.FLOOR);
  540. }
  541. } else if (StringUtils.equals("U", nursingAndParentalLeaveIntegerMethod)) {
  542. standardLimit = standardLimit.setScale(0, RoundingMode.CEILING);
  543. } else {
  544. standardLimit = standardLimit.setScale(0, RoundingMode.FLOOR);
  545. }
  546. if (StringUtils.isNotEmpty(limitId)) {
  547. HolidayLimitInfo holidayLimitInfo = new HolidayLimitInfo();
  548. holidayLimitInfo.setId(BOSUuid.read(limitId));
  549. holidayLimitInfo.setStandardLimit(standardLimit);
  550. holidayLimitInfo.setRealLimit(standardLimit.add(iRowSet.getBigDecimal("FADDORSUBLIMIT")));
  551. holidayLimitInfo.setRemainLimit(standardLimit.add(iRowSet.getBigDecimal("FADDORSUBLIMIT")).subtract(iRowSet.getBigDecimal("FUSEDLIMIT")).subtract(iRowSet.getBigDecimal("FreezeLimit")));
  552. holidayLimitInfo.setCycleBeginDate(cfStartTime);
  553. holidayLimitInfo.setCycleEndDate(cfEndTime);
  554. holidayLimitInfo.setEffectDate(effectDate);
  555. holidayLimitInfo.setDelayDate(yearLastDay);
  556. if (leaveDate != null && leaveDate.getTime() == cfEndTime.getTime()) {
  557. holidayLimitInfo.setDelayDate(cfEndTime);
  558. }
  559. if (StringUtils.isNotEmpty(iRowSet.getString("FADMINORGUNITID"))) {
  560. AdminOrgUnitInfo adminOrgUnitInfo = new AdminOrgUnitInfo();
  561. adminOrgUnitInfo.setId(BOSUuid.read(iRowSet.getString("FADMINORGUNITID")));
  562. holidayLimitInfo.setAdminOrgUnit(adminOrgUnitInfo);
  563. }
  564. if (StringUtils.isNotEmpty(iRowSet.getString("FHRORGUNITID"))) {
  565. HROrgUnitInfo hrOrgUnitInfo = new HROrgUnitInfo();
  566. hrOrgUnitInfo.setId(BOSUuid.read(iRowSet.getString("FHRORGUNITID")));
  567. holidayLimitInfo.setHrOrgUnit(hrOrgUnitInfo);
  568. }
  569. if (StringUtils.isNotEmpty(iRowSet.getString("FPOSITIONID"))) {
  570. PositionInfo positionInfo = new PositionInfo();
  571. positionInfo.setId(BOSUuid.read(iRowSet.getString("FPOSITIONID")));
  572. holidayLimitInfo.setPosition(positionInfo);
  573. }
  574. holidayLimitInfo.setLastUpdateUser(ContextUtil.getCurrentUserInfo(ctx));
  575. holidayLimitInfo.setLastUpdateTime(new Timestamp(nowDate.getTime()));
  576. updateList.add(holidayLimitInfo);
  577. } else {
  578. HolidayLimitInfo holidayLimitInfo = new HolidayLimitInfo();
  579. holidayLimitInfo.setStandardLimit(standardLimit);
  580. holidayLimitInfo.setRealLimit(standardLimit);
  581. holidayLimitInfo.setRemainLimit(standardLimit);
  582. holidayLimitInfo.setFreezeLimit(BigDecimal.ZERO);
  583. holidayLimitInfo.setUsedLimit(BigDecimal.ZERO);
  584. holidayLimitInfo.setAddOrSubLimit(BigDecimal.ZERO);
  585. holidayLimitInfo.setPreOverdraftLimit(BigDecimal.ZERO);
  586. holidayLimitInfo.setCycleBeginDate(cfStartTime);
  587. holidayLimitInfo.setCycleEndDate(cfEndTime);
  588. holidayLimitInfo.setEffectDate(effectDate);
  589. holidayLimitInfo.setDelayDate(yearLastDay);
  590. if (leaveDate != null && leaveDate.getTime() == cfEndTime.getTime()) {
  591. holidayLimitInfo.setDelayDate(cfEndTime);
  592. }
  593. holidayLimitInfo.setYear(DateTimeUtils.getYear(yearFirstDay));
  594. HolidayPolicyInfo holidayPolicyInfo = new HolidayPolicyInfo();
  595. holidayPolicyInfo.setId(BOSUuid.read(holidayPolicyId));
  596. holidayLimitInfo.setHolidayPolicy(holidayPolicyInfo);
  597. holidayLimitInfo.setHolidayUnit(HolidayTypeUnitEnum.day);
  598. holidayLimitInfo.setEnableCycle(true);
  599. PersonInfo personInfo = new PersonInfo();
  600. personInfo.setId(BOSUuid.read(iRowSet.getString("FPERSONID")));
  601. holidayLimitInfo.setProposer(personInfo);
  602. holidayLimitInfo.setStatus(HolidayLimitStatus.audited);
  603. if (StringUtils.isNotEmpty(iRowSet.getString("FADMINORGUNITID"))) {
  604. AdminOrgUnitInfo adminOrgUnitInfo = new AdminOrgUnitInfo();
  605. adminOrgUnitInfo.setId(BOSUuid.read(iRowSet.getString("FADMINORGUNITID")));
  606. holidayLimitInfo.setAdminOrgUnit(adminOrgUnitInfo);
  607. }
  608. if (StringUtils.isNotEmpty(iRowSet.getString("FHRORGUNITID"))) {
  609. HROrgUnitInfo hrOrgUnitInfo = new HROrgUnitInfo();
  610. hrOrgUnitInfo.setId(BOSUuid.read(iRowSet.getString("FHRORGUNITID")));
  611. holidayLimitInfo.setHrOrgUnit(hrOrgUnitInfo);
  612. }
  613. if (StringUtils.isNotEmpty(iRowSet.getString("FPOSITIONID"))) {
  614. PositionInfo positionInfo = new PositionInfo();
  615. positionInfo.setId(BOSUuid.read(iRowSet.getString("FPOSITIONID")));
  616. holidayLimitInfo.setPosition(positionInfo);
  617. }
  618. CtrlUnitInfo ctrlUnitInfo = new CtrlUnitInfo();
  619. ctrlUnitInfo.setId(BOSUuid.read("00000000-0000-0000-0000-000000000000CCE7AED4"));
  620. holidayLimitInfo.setCU(ctrlUnitInfo);
  621. holidayLimitInfo.setCycleDate(yearLastDay);
  622. holidayLimitInfo.setCreator(ContextUtil.getCurrentUserInfo(ctx));
  623. holidayLimitInfo.setCreateTime(new Timestamp(nowDate.getTime()));
  624. holidayLimitInfo.setLastUpdateUser(ContextUtil.getCurrentUserInfo(ctx));
  625. holidayLimitInfo.setLastUpdateTime(new Timestamp(nowDate.getTime()));
  626. addList.add(holidayLimitInfo);
  627. }
  628. }
  629. }
  630. }
  631. if (addList.size() > 0) {
  632. HolidayLimitFactory.getLocalInstance(ctx).addnewBatchData(addList);
  633. }
  634. if (updateList.size() > 0) {
  635. HolidayLimitFactory.getLocalInstance(ctx).updateBatchData(updateList);
  636. }
  637. } catch (SQLException | ParseException e) {
  638. throw new BOSException(e);
  639. } catch (EASBizException e) {
  640. throw new BOSException(e);
  641. }
  642. }
  643. private String createPersonFamilyTempTable(Context ctx, String cnLeave) throws BOSException {
  644. String dbType = ContextUtil.getDbType(ctx);
  645. String view_pf_PersonFamilyTempTable = "";
  646. if (StringUtils.equalsIgnoreCase(nursingAndParentalLeaveUpdateSql, "Y")) {
  647. if (StringUtils.equalsIgnoreCase("MS SQL Server", dbType)) {
  648. String dropView = " IF EXISTS (SELECT * FROM sys.views WHERE name = 'view_pf_DateRanges_" + cnLeave + "') DROP VIEW view_pf_DateRanges_" + cnLeave;
  649. DbUtil.execute(ctx, dropView);
  650. dropView = " IF EXISTS (SELECT * FROM sys.views WHERE name = 'view_pf_CTE_" + cnLeave + "') DROP VIEW view_pf_CTE_" + cnLeave;
  651. DbUtil.execute(ctx, dropView);
  652. dropView = " IF EXISTS (SELECT * FROM sys.views WHERE name = 'view_pf_MergedRanges_" + cnLeave + "') DROP VIEW view_pf_MergedRanges_" + cnLeave;
  653. DbUtil.execute(ctx, dropView);
  654. dropView = " IF EXISTS (SELECT * FROM sys.views WHERE name = 'view_pf_GroupedRanges_" + cnLeave + "') DROP VIEW view_pf_GroupedRanges_" + cnLeave;
  655. DbUtil.execute(ctx, dropView);
  656. }
  657. String createView = " /*dialect*/create or replace view view_pf_DateRanges_" + cnLeave + " as ( select CFStartTime StartDate,CFEndTime EndDate,FPERSONID PersonID from t_hr_personfamily where CFCnleave = '" + cnLeave + "' ) ";
  658. if (StringUtils.equalsIgnoreCase("MS SQL Server", dbType)) {
  659. createView = " /*dialect*/create view view_pf_DateRanges_" + cnLeave + " as ( select CFStartTime StartDate,CFEndTime EndDate,FPERSONID PersonID from t_hr_personfamily where CFCnleave = '" + cnLeave + "' ) ";
  660. }
  661. DbUtil.execute(ctx, createView);
  662. createView = " /*dialect*/create or replace view view_pf_CTE_" + cnLeave + " AS ( SELECT PersonID,StartDate, EndDate,LAG(EndDate) OVER (PARTITION BY PersonID ORDER BY StartDate) AS prev_end_date FROM view_pf_DateRanges_" + cnLeave + ") ";
  663. if (StringUtils.equalsIgnoreCase("MS SQL Server", dbType)) {
  664. createView = " /*dialect*/create view view_pf_CTE_" + cnLeave + " AS ( SELECT PersonID,StartDate, EndDate,LAG(EndDate) OVER (PARTITION BY PersonID ORDER BY StartDate) AS prev_end_date FROM view_pf_DateRanges_" + cnLeave + ") ";
  665. }
  666. DbUtil.execute(ctx, createView);
  667. createView = " /*dialect*/create or replace view view_pf_MergedRanges_" + cnLeave + " AS ( SELECT PersonID,StartDate,EndDate,CASE WHEN StartDate <= prev_end_date + INTERVAL '1 day' THEN 0 ELSE 1 END AS is_overlap FROM view_pf_CTE_" + cnLeave + ") ";
  668. if (StringUtils.equalsIgnoreCase("MS SQL Server", dbType)) {
  669. createView = " /*dialect*/create view view_pf_MergedRanges_" + cnLeave + " AS ( SELECT PersonID,StartDate,EndDate,CASE WHEN StartDate <= DATEADD(day, 1, prev_end_date) THEN 0 ELSE 1 END AS is_overlap FROM view_pf_CTE_" + cnLeave + ") ";
  670. }
  671. DbUtil.execute(ctx, createView);
  672. createView = " /*dialect*/create or replace view view_pf_GroupedRanges_" + cnLeave + " AS ( SELECT PersonID,StartDate,EndDate,SUM(is_overlap) OVER (PARTITION BY PersonID ORDER BY StartDate) AS grp FROM view_pf_MergedRanges_" + cnLeave + ") ";
  673. if (StringUtils.equalsIgnoreCase("MS SQL Server", dbType)) {
  674. createView = " /*dialect*/create view view_pf_GroupedRanges_" + cnLeave + " AS ( SELECT PersonID,StartDate,EndDate,SUM(is_overlap) OVER (PARTITION BY PersonID ORDER BY StartDate) AS grp FROM view_pf_MergedRanges_" + cnLeave + ") ";
  675. }
  676. DbUtil.execute(ctx, createView);
  677. }
  678. view_pf_PersonFamilyTempTable = " (SELECT PersonID fpersonid,MIN(StartDate) AS CFStartTime,MAX(EndDate) AS CFEndTime FROM view_pf_GroupedRanges_" + cnLeave + " GROUP BY PersonID, grp ORDER BY PersonID, CFStartTime) ";
  679. if (StringUtils.equalsIgnoreCase("MS SQL Server", dbType)) {
  680. view_pf_PersonFamilyTempTable = " (SELECT top 100 percent PersonID fpersonid,MIN(StartDate) AS CFStartTime,MAX(EndDate) AS CFEndTime FROM view_pf_GroupedRanges_" + cnLeave + " GROUP BY PersonID, grp ORDER BY PersonID, CFStartTime) ";
  681. }
  682. return view_pf_PersonFamilyTempTable;
  683. }
  684. }