FixAdjustSalaryHandlerEx.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package com.kingdee.shr.customer.gtiit.handler;
  2. import java.math.BigDecimal;
  3. import java.sql.SQLException;
  4. import java.text.ParseException;
  5. import java.text.SimpleDateFormat;
  6. import java.time.LocalDate;
  7. import java.time.YearMonth;
  8. import java.time.temporal.ChronoUnit;
  9. import java.util.Calendar;
  10. import java.util.Date;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15. import org.springframework.ui.ModelMap;
  16. import com.kingdee.bos.BOSException;
  17. import com.kingdee.bos.Context;
  18. import com.kingdee.eas.base.param.IParamControl;
  19. import com.kingdee.eas.base.param.ParamControlFactory;
  20. import com.kingdee.eas.common.EASBizException;
  21. import com.kingdee.eas.util.app.DbUtil;
  22. import com.kingdee.jdbc.rowset.IRowSet;
  23. import com.kingdee.shr.base.syssetting.context.SHRContext;
  24. import com.kingdee.shr.base.syssetting.exception.SHRWebException;
  25. import com.kingdee.shr.cmpdesign.web.handler.fix.FixAdjustSalaryHandler;
  26. /**
  27. * 员工定调薪档案扩展handler
  28. * @author xiaoxin
  29. *
  30. */
  31. public class FixAdjustSalaryHandlerEx extends FixAdjustSalaryHandler{
  32. /**
  33. * 添加员工薪酬追溯信息
  34. * @param request
  35. * @param response
  36. * @param modelMap
  37. * @return
  38. * @throws SHRWebException
  39. */
  40. public String addReviewDataAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap)
  41. throws SHRWebException {
  42. Context ctx = SHRContext.getInstance().getContext();
  43. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  44. //生效日期
  45. String effectDay = request.getParameter("effectDay");
  46. //追溯发放月份
  47. String retroactiveDate = request.getParameter("retroactiveDate");
  48. //人员id
  49. String personId = request.getParameter("personId");
  50. //金额
  51. String money = request.getParameter("money");
  52. try {
  53. //追溯发放日期
  54. Date formMonthDate = sdf.parse(retroactiveDate);
  55. effectDay = effectDay.substring(0, 7);
  56. retroactiveDate = retroactiveDate.substring(0, 7);
  57. int endYear = Integer.valueOf(retroactiveDate.substring(0,4));
  58. int endMonth = Integer.valueOf(retroactiveDate.substring(5,7));
  59. Date startDate = sdf.parse(effectDay+"-01");
  60. Date endDate = sdf.parse(YearMonth.of(endYear, endMonth).atEndOfMonth().toString());
  61. Calendar startCalendar = Calendar.getInstance();
  62. Calendar endCalendar = Calendar.getInstance();
  63. startCalendar.setTime(startDate);
  64. endCalendar.setTime(endDate);
  65. LocalDate startLocal = new java.sql.Date(startDate.getTime()).toLocalDate();
  66. LocalDate endLocal = new java.sql.Date(endDate.getTime()).toLocalDate();
  67. long monthsDiff = ChronoUnit.MONTHS.between(startLocal.withDayOfMonth(1), endLocal.withDayOfMonth(1));
  68. //调整后月薪
  69. BigDecimal monthlyPay = new BigDecimal(money).divide(BigDecimal.valueOf(monthsDiff+1),0,BigDecimal.ROUND_HALF_DOWN);
  70. //当月月薪
  71. String monthPayField = this.getPayFieldSn(ctx, "monthPayField");
  72. //当月平时加班费
  73. String overPayField = this.getPayFieldSn(ctx, "overPayField");
  74. //平时加班小时
  75. String overHourField = this.getPayFieldSn(ctx, "overHourField");
  76. //当月休息日加班费
  77. String restOverPayField = this.getPayFieldSn(ctx, "restOverPayField");
  78. //休息日加班小时
  79. String restHourField = this.getPayFieldSn(ctx, "restHourField");
  80. //法定节假日加班费
  81. String holidaysPayField = this.getPayFieldSn(ctx, "holidaysPayField");
  82. //法定节假日加班小时
  83. String holidaysHourField = this.getPayFieldSn(ctx, "holidaysHourField");
  84. //当月无薪假扣款
  85. String unLeavePayField = this.getPayFieldSn(ctx, "unLeavePayField");
  86. //当月无薪假小时
  87. String unLeaveHourField = this.getPayFieldSn(ctx, "unLeaveHourField");
  88. String feilds = monthPayField+","+overPayField+","+overHourField+","+restOverPayField+","+restHourField+","+holidaysPayField+","+holidaysHourField+","+unLeavePayField+","+unLeaveHourField;
  89. String sql = "SELECT fid,fpersonid,fperiodyear,fperiodmonth,fisgive,"+feilds+" FROM T_HR_SCMPCALTABLE where FPERSONID = '"+personId+"' and FBEGINDATE >='"+sdf.format(startDate)+"' and FENDDATE <= '"+sdf.format(endDate)+"'";
  90. IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
  91. Map<String, Map<String,Object>> map = new HashMap<>();
  92. while (iRowSet.next()){
  93. Map<String,Object> valueMap = new HashMap<>();
  94. valueMap.put("fisgive", iRowSet.getObject("fisgive").equals("Y")?"1":"0");
  95. valueMap.put(monthPayField, iRowSet.getObject(monthPayField));
  96. valueMap.put(overPayField, iRowSet.getObject(overPayField));
  97. valueMap.put(overHourField, iRowSet.getObject(overHourField));
  98. valueMap.put(restOverPayField, iRowSet.getObject(restOverPayField));
  99. valueMap.put(restHourField, iRowSet.getObject(restHourField));
  100. valueMap.put(holidaysPayField, iRowSet.getObject(holidaysPayField));
  101. valueMap.put(holidaysHourField, iRowSet.getObject(holidaysHourField));
  102. valueMap.put(unLeavePayField, iRowSet.getObject(unLeavePayField));
  103. valueMap.put(unLeaveHourField, iRowSet.getObject(unLeaveHourField));
  104. map.put(iRowSet.getString("fperiodyear")+iRowSet.getString("fperiodmonth"), valueMap);
  105. }
  106. StringBuffer insertBuffer = new StringBuffer();
  107. for(int i = 0; i <= monthsDiff; i++) {
  108. BigDecimal zero = BigDecimal.ZERO;
  109. //当月月薪
  110. BigDecimal thatMonthPay = zero;
  111. //当月平时加班费
  112. BigDecimal thatOvertimePay = zero;
  113. //平时加班小时
  114. BigDecimal thatOvertimeHour = zero;
  115. //当月休息日加班费
  116. BigDecimal thatRestOverPay = zero;
  117. //休息日加班小时
  118. BigDecimal restOverHour = zero;
  119. //当月节假日加班费
  120. BigDecimal thatHolidaysOverPay = zero;
  121. //法定节假日加班小时
  122. BigDecimal holidaysOverHour = zero;
  123. //当月无薪假扣款
  124. BigDecimal thatUnpaidDeduction = zero;
  125. //当月无薪假小时
  126. BigDecimal thatUnLeaveHour = zero;
  127. //补发月薪
  128. BigDecimal reissueMonthPay = zero;
  129. //补发平时加班费
  130. BigDecimal reissueOverPay = zero;
  131. //补发休息日加班费
  132. BigDecimal reissueRestOverPay = zero;
  133. //补发节假日加班费
  134. BigDecimal reissueHolidaysOverPay = zero;
  135. //补发无薪假扣款
  136. BigDecimal reissueUnLeaveDeduction = zero;
  137. //补发合计
  138. BigDecimal reissueTotal = zero;
  139. //是否已发薪
  140. String isGive = "";
  141. if(i!=0) {
  142. startCalendar.add(Calendar.MONTH, 1);
  143. }
  144. if(i == monthsDiff) {
  145. monthlyPay = new BigDecimal(money).subtract(monthlyPay.multiply(BigDecimal.valueOf(monthsDiff)));
  146. }
  147. Map<String, Object> valueMap = map.get(startCalendar.get(Calendar.YEAR)+""+(startCalendar.get(Calendar.MONTH)+1));
  148. if(valueMap != null) {
  149. isGive = (String) valueMap.get("fisgive");
  150. thatMonthPay = valueMap.get(monthPayField)==null?zero:((BigDecimal) valueMap.get(monthPayField)).setScale(2);
  151. thatOvertimePay = valueMap.get(overPayField)==null?zero:((BigDecimal) valueMap.get(overPayField)).setScale(2);
  152. thatOvertimeHour = valueMap.get(overHourField)==null?zero:((BigDecimal) valueMap.get(overHourField)).setScale(2);
  153. thatRestOverPay = valueMap.get(restOverPayField)==null?zero:((BigDecimal) valueMap.get(restOverPayField)).setScale(2);
  154. restOverHour = valueMap.get(restHourField)==null?zero:((BigDecimal) valueMap.get(restHourField)).setScale(2);
  155. thatHolidaysOverPay = valueMap.get(holidaysPayField)==null?zero:((BigDecimal) valueMap.get(holidaysPayField)).setScale(2);
  156. holidaysOverHour = valueMap.get(holidaysHourField)==null?zero:((BigDecimal) valueMap.get(holidaysHourField)).setScale(2);
  157. thatUnpaidDeduction = valueMap.get(unLeavePayField)==null?zero:((BigDecimal) valueMap.get(unLeavePayField)).setScale(2);
  158. thatUnLeaveHour = valueMap.get(unLeaveHourField)==null?zero:((BigDecimal) valueMap.get(unLeaveHourField)).setScale(2);
  159. reissueMonthPay = monthlyPay.subtract(thatMonthPay).setScale(2);
  160. reissueOverPay = monthlyPay.divide(BigDecimal.valueOf(174), 2, BigDecimal.ROUND_HALF_UP).multiply(thatOvertimeHour).subtract(thatOvertimePay).setScale(2);
  161. reissueRestOverPay = monthlyPay.divide(BigDecimal.valueOf(174), 2, BigDecimal.ROUND_HALF_UP).multiply(restOverHour).subtract(thatRestOverPay).setScale(2);
  162. reissueHolidaysOverPay = monthlyPay.divide(BigDecimal.valueOf(174), 2, BigDecimal.ROUND_HALF_UP).multiply(holidaysOverHour).subtract(thatHolidaysOverPay).setScale(2);
  163. if(thatUnLeaveHour.remainder(BigDecimal.valueOf(7.5)).compareTo(zero) == 0) {
  164. reissueUnLeaveDeduction = monthlyPay.divide(BigDecimal.valueOf(21.75), 2, BigDecimal.ROUND_HALF_UP).multiply(thatUnLeaveHour.divide(BigDecimal.valueOf(7.5), 2, BigDecimal.ROUND_HALF_UP)).subtract(thatUnpaidDeduction).setScale(2);
  165. }else {
  166. reissueUnLeaveDeduction = monthlyPay.divide(BigDecimal.valueOf(174), 2, BigDecimal.ROUND_HALF_UP).multiply(thatUnLeaveHour).subtract(thatHolidaysOverPay).subtract(thatUnpaidDeduction).setScale(2);
  167. }
  168. reissueTotal = reissueMonthPay.add(reissueOverPay).add(reissueRestOverPay).add(reissueHolidaysOverPay).add(reissueUnLeaveDeduction).setScale(2);
  169. }
  170. String insertSql = "INSERT INTO CT_CUS_PersonPayForm(fid,CFPersonID,CFMonth,CFPayroll,CFThatMonthPay,CFThatOvertimePay,CFThatOvertimeHour,"
  171. + "CFThatRestOverPay,CFRestOverHour,CFThatHolidaysOverPay,CFHolidaysOverHour,CFThatUnpaidDeduction,CFThatUnLeaveHour,"
  172. + "CFReissueMonthPay,CFReissueOverPay,CFReissueRestOverPay,CFReissueHolidaysOverPay,CFReissueUnLeaveDeduction,CFReissueTotal,CFFormMonth )"
  173. + " VALUES (newbosid('5FB9A7AC'),'"+personId+"','"+sdf.format(startCalendar.getTime())+"','"+isGive+"',"+thatMonthPay.toPlainString()+","
  174. + thatOvertimePay.toPlainString()+","+thatOvertimeHour.toPlainString()+","+thatRestOverPay.toPlainString()+","+restOverHour.toPlainString()+","
  175. +thatHolidaysOverPay.toPlainString()+","+holidaysOverHour.toPlainString()+","+thatUnpaidDeduction.toPlainString()+","
  176. +thatUnLeaveHour.toPlainString()+","+reissueMonthPay.toPlainString()+","+reissueOverPay.toPlainString()+","
  177. +reissueRestOverPay.toPlainString()+","+reissueHolidaysOverPay.toPlainString()+","+reissueUnLeaveDeduction.toPlainString()+","
  178. +reissueTotal.toPlainString()+",'"+sdf.format(formMonthDate)+"' );";
  179. insertBuffer.append(insertSql);
  180. }
  181. String delteSql = "delete from CT_CUS_PersonPayForm where cfpersonid='"+personId+"' and cfmonth>='"+sdf.format(startDate)+"' and cfmonth<='"+sdf.format(endDate)+"'";
  182. DbUtil.execute(ctx, delteSql);
  183. if(insertBuffer.length()>0) {
  184. DbUtil.execute(ctx, insertBuffer.toString());
  185. }
  186. } catch (ParseException e) {
  187. e.printStackTrace();
  188. } catch (BOSException e) {
  189. e.printStackTrace();
  190. } catch (SQLException e) {
  191. e.printStackTrace();
  192. }
  193. return null;
  194. }
  195. /**
  196. * 根据薪酬项目编码获取薪酬项目字段
  197. * @param ctx
  198. * @param param
  199. * @return
  200. */
  201. public String getPayFieldSn(Context ctx, String param) {
  202. try {
  203. IParamControl ipc = ParamControlFactory.getLocalInstance(ctx);
  204. String projectNumber = ipc.getParamValue(null, param);
  205. String sql = "select FieldSn from T_HR_SCmpItem where fnumber = '"+projectNumber+"'";
  206. IRowSet iRowSet = DbUtil.executeQuery(ctx, sql);
  207. while(iRowSet.next()) {
  208. String fieldSn = iRowSet.getObject("FieldSn")==null?"":iRowSet.getString("FieldSn");
  209. return "s" + fieldSn;
  210. }
  211. } catch (BOSException e) {
  212. e.printStackTrace();
  213. } catch (EASBizException e) {
  214. e.printStackTrace();
  215. } catch (SQLException e) {
  216. e.printStackTrace();
  217. }
  218. return "";
  219. }
  220. }