SalaryBagEditHandler.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. package com.kingdee.customer.salary.handler;
  2. import java.math.BigDecimal;
  3. import java.sql.SQLException;
  4. import java.text.ParseException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Locale;
  12. import java.util.Map;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15. import org.apache.commons.lang3.StringUtils;
  16. import org.apache.log4j.Logger;
  17. import org.springframework.ui.ModelMap;
  18. import com.kingdee.bos.BOSException;
  19. import com.kingdee.bos.Context;
  20. import com.kingdee.bos.dao.IObjectPK;
  21. import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
  22. import com.kingdee.eas.common.EASBizException;
  23. import com.kingdee.eas.custom.bill.salary.ISalaryBag;
  24. import com.kingdee.eas.custom.bill.salary.SalaryBagEntryCollection;
  25. import com.kingdee.eas.custom.bill.salary.SalaryBagEntryInfo;
  26. import com.kingdee.eas.custom.bill.salary.SalaryBagFactory;
  27. import com.kingdee.eas.custom.bill.salary.SalaryBagInfo;
  28. import com.kingdee.eas.framework.CoreBaseInfo;
  29. import com.kingdee.eas.hr.affair.EmpEnrollBizBillEntryInfo;
  30. import com.kingdee.eas.hr.base.HRBillStateEnum;
  31. import com.kingdee.eas.util.app.DbUtil;
  32. import com.kingdee.jdbc.rowset.IRowSet;
  33. import com.kingdee.shr.base.syssetting.app.io.fileImport.ImportException;
  34. import com.kingdee.shr.base.syssetting.context.SHRContext;
  35. import com.kingdee.shr.base.syssetting.exception.SHRWebException;
  36. import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
  37. import com.kingdee.shr.base.syssetting.util.MetaDataUtil;
  38. import com.kingdee.shr.base.syssetting.web.handler.EditHandler;
  39. import com.kingdee.shr.base.syssetting.web.json.JSONUtils;
  40. import com.kingdee.shr.compensation.CmpItemInfo;
  41. /**
  42. * 工资包
  43. * @author issuser
  44. *
  45. */
  46. public class SalaryBagEditHandler extends EditHandler{
  47. private static Logger logger =
  48. Logger.getLogger("com.kingdee.customer.salary.handler.SalaryBagEditHandler");
  49. /**
  50. * 数据初始化
  51. * @param request
  52. * @param response
  53. * @param modelMap
  54. */
  55. public void getSoureBillDataAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) {
  56. String billId = request.getParameter("billId");
  57. System.out.print("工资包变更来源billId========="+billId);
  58. Context ctx = SHRContext.getInstance().getContext();
  59. Map<String, Object> resultMap = new HashMap<String, Object>();
  60. try {
  61. String selectSql = "SELECT b.fid as personId,b.FNAME_l2 as personName,"
  62. + " c.FID as cmpItemId ,c.FNAME_l2 as cmpItemName,a.CFPaycurrency "
  63. + " FROM CT_SAL_SalaryBag a "
  64. + " left join t_bd_person b on a.CFPersonID = b.FID "
  65. + " left join T_HR_SCmpItem c on a.CFCmpItemID = c.fid "
  66. + " where a.fid = '" + billId + "'";
  67. System.out.print("工资包变更sql========="+selectSql);
  68. IRowSet rs = DbUtil.executeQuery(ctx, selectSql.toString());
  69. String cmpItemId = null;
  70. String cmpItemName = null;
  71. if(rs.next()){
  72. cmpItemId = rs.getString("cmpItemId");
  73. cmpItemName = rs.getString("cmpItemName");
  74. resultMap.put("personId",rs.getString("personId"));
  75. resultMap.put("personName",rs.getString("personName"));
  76. resultMap.put("paycurrency", rs.getString("CFPaycurrency"));
  77. resultMap.put("cmpItemId",cmpItemId);
  78. resultMap.put("cmpItemName",cmpItemName);
  79. }
  80. SalaryBagInfo salaryBagInfo = SalaryBagFactory.getLocalInstance(ctx).getSalaryBagInfo(new ObjectUuidPK(billId));
  81. resultMap.put("money", salaryBagInfo.getMoney());
  82. resultMap.put("startDate", salaryBagInfo.getStartDate());
  83. resultMap.put("endDate", salaryBagInfo.getEndDate());
  84. SalaryBagEntryCollection entryCollection = salaryBagInfo.getEntrys();
  85. List<Map<String,Object>> entryList = new ArrayList<Map<String,Object>>();
  86. if ((null != entryCollection) && (entryCollection.size() > 0)) {
  87. int i = 0;
  88. for (int size = entryCollection.size(); i < size; ++i) {
  89. SalaryBagEntryInfo info = entryCollection.get(i);
  90. Map<String,Object> entryMap = new HashMap<String, Object>();
  91. entryMap.put("months", info.getMonths());
  92. entryMap.put("paycurrency", salaryBagInfo.get("paycurrency"));
  93. entryMap.put("cmpItemId", cmpItemId);
  94. entryMap.put("cmpItemName", cmpItemName);
  95. entryMap.put("moneys", info.getMoneys());
  96. entryMap.put("beforeAmount", info.getMoneys());
  97. entryMap.put("amountPayable", 0);
  98. entryMap.put("reissueAmount", 0);
  99. entryList.add(entryMap);
  100. }
  101. }
  102. resultMap.put("entry", entryList);
  103. System.out.print("工资包resultMap========="+resultMap);
  104. JSONUtils.writeJson(response, resultMap);
  105. } catch (EASBizException e) {
  106. e.printStackTrace();
  107. } catch (BOSException e) {
  108. e.printStackTrace();
  109. } catch (SHRWebException e) {
  110. e.printStackTrace();
  111. } catch (SQLException e) {
  112. e.printStackTrace();
  113. }
  114. }
  115. /**
  116. * 生成数据明细
  117. * @param request
  118. * @param response
  119. * @param modelMap
  120. */
  121. public void createEntryDetailAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) {
  122. String startDateStr = request.getParameter("startDate");
  123. String endDateStr = request.getParameter("endDate");
  124. String reissueDateStr = request.getParameter("reissueDate");
  125. String money = request.getParameter("money");
  126. String billId = request.getParameter("billId");
  127. Context ctx = SHRContext.getInstance().getContext();
  128. try {
  129. String selectSql = "SELECT b.fid as personId,b.FNAME_l2 as personName,"
  130. + " c.FID as cmpItemId ,c.FNAME_l2 as cmpItemName,a.CFPaycurrency,a.CFendDate "
  131. + " FROM CT_SAL_SalaryBag a "
  132. + " left join t_bd_person b on a.CFPersonID = b.FID "
  133. + " left join T_HR_SCmpItem c on a.CFCmpItemID = c.fid "
  134. + " where a.fid = '" + billId + "'";
  135. System.out.print("工资包变更sql========="+selectSql);
  136. IRowSet rs = DbUtil.executeQuery(ctx, selectSql.toString());
  137. String cmpItemId = null;
  138. String cmpItemName = null;
  139. String paycurrency = null;
  140. Date soureEndDate = null;
  141. if(rs.next()){
  142. cmpItemId = rs.getString("cmpItemId");
  143. cmpItemName = rs.getString("cmpItemName");
  144. paycurrency = rs.getString("CFPaycurrency");
  145. soureEndDate = rs.getDate("CFendDate");
  146. }
  147. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  148. //更新后的最后日期
  149. Date endDate = sdf.parse(endDateStr);
  150. Date reissueDate = sdf.parse(reissueDateStr);
  151. if(soureEndDate.after(endDate)){
  152. throw new ImportException("The expiration date cannot be earlier than the expiration date of the original document");
  153. }
  154. //月份拆分
  155. List<Date> monthList = getMonthDetail(startDateStr,endDateStr);
  156. System.out.print("月份========="+monthList.size());
  157. List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();
  158. //总金额
  159. BigDecimal moneyAmount = new BigDecimal(money);
  160. //金额
  161. BigDecimal avgAmount = moneyAmount.divide(BigDecimal.valueOf(monthList.size()), 0, BigDecimal.ROUND_HALF_UP);
  162. //已生成额度的金额
  163. BigDecimal remainder = new BigDecimal(0);
  164. //补发月应发金额
  165. BigDecimal amountPayable = new BigDecimal(0);
  166. for(int i = 0 ; i < monthList.size() ; i ++) {
  167. Map<String,Object> entryMap = new HashMap<String, Object>();
  168. Date months = monthList.get(i);
  169. entryMap.put("months", months);
  170. entryMap.put("paycurrency", paycurrency);
  171. entryMap.put("cmpItemId",cmpItemId);
  172. entryMap.put("cmpItemName",cmpItemName);
  173. if(monthList.size() - i > 1) {
  174. //已经生成额度的金额
  175. remainder = remainder.add(avgAmount);
  176. }else {
  177. //最后一个月的金额
  178. avgAmount = moneyAmount.subtract(remainder);
  179. }
  180. //金额
  181. entryMap.put("moneys", avgAmount);
  182. BigDecimal beforeAmount = getBeforeAmount(billId,sdf.format(months));
  183. //变更前金额
  184. entryMap.put("beforeAmount", beforeAmount);
  185. //应发金额
  186. if(monthList.get(i).equals(reissueDate)) {
  187. //补发金额
  188. entryMap.put("reissueAmount", 0);
  189. //应发金额
  190. entryMap.put("amountPayable", amountPayable.add(avgAmount));
  191. }else if(monthList.get(i).after(reissueDate)) {
  192. //应发金额
  193. entryMap.put("amountPayable", avgAmount);
  194. //补发金额
  195. entryMap.put("reissueAmount", 0);
  196. }else {
  197. entryMap.put("amountPayable", 0);
  198. //补发金额
  199. entryMap.put("reissueAmount", avgAmount.subtract(beforeAmount));
  200. //总应发差额
  201. amountPayable = amountPayable.add(avgAmount.subtract(beforeAmount));
  202. }
  203. System.out.print("月份result========="+entryMap);
  204. resultList.add(entryMap);
  205. }
  206. JSONUtils.writeJson(response, resultList);
  207. } catch (BOSException e) {
  208. e.printStackTrace();
  209. } catch (ParseException e) {
  210. e.printStackTrace();
  211. } catch (SHRWebException e) {
  212. e.printStackTrace();
  213. } catch (SQLException e) {
  214. e.printStackTrace();
  215. }
  216. }
  217. private BigDecimal getBeforeAmount(String billId,String months ) throws BOSException, SQLException {
  218. Context ctx = SHRContext.getInstance().getContext();
  219. BigDecimal beforeAmount = new BigDecimal(0);
  220. String selectSql = "SELECT CFMoneys FROM CT_SAL_SalaryBagEntry where FBillID = '" + billId + "' and to_char(CFMonths,'yyyy-MM-dd') = '" + months + "'";
  221. System.out.print("查找变更前金额========="+selectSql);
  222. IRowSet rs = DbUtil.executeQuery(ctx, selectSql.toString());
  223. if(rs.next()) {
  224. beforeAmount = rs.getBigDecimal("CFMoneys");
  225. }
  226. return beforeAmount;
  227. }
  228. /**
  229. * 月份拆分
  230. * @param startDateStr
  231. * @param endDateStr
  232. * @return
  233. * @throws ParseException
  234. */
  235. private List<Date> getMonthDetail(String startDateStr,String endDateStr) throws ParseException{
  236. SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM");
  237. Date startDate = sdfMonth.parse(startDateStr);
  238. Date endDate = sdfMonth.parse( endDateStr);
  239. Date currentDate = startDate;
  240. List<Date> monthList = new ArrayList<Date>();
  241. Calendar calendar = Calendar.getInstance();
  242. while (endDate.after(currentDate) || currentDate.equals(endDate)) {
  243. monthList.add(currentDate);
  244. calendar.setTime(currentDate);
  245. calendar.add(Calendar.MONTH, 1);
  246. currentDate = calendar.getTime();
  247. }
  248. return monthList;
  249. }
  250. @Override
  251. protected void verifyModel(HttpServletRequest request, HttpServletResponse response, CoreBaseInfo model)
  252. throws SHRWebException {
  253. SalaryBagInfo billInfo = (SalaryBagInfo) model;
  254. BigDecimal billAmount = billInfo.getMoney();
  255. BigDecimal entryAmount = BigDecimal.ZERO;
  256. SalaryBagEntryCollection entryColl = billInfo.getEntrys();
  257. if(entryColl != null) {
  258. for(int i=0 ;i<entryColl.size(); i++) {
  259. SalaryBagEntryInfo entry = entryColl.get(i);
  260. entryAmount = entryAmount.add(entry.getMoneys());
  261. }
  262. }
  263. logger.error("单头金额:"+billAmount+",分录金额总和:"+entryAmount);
  264. //金额是否相同校验
  265. if( billAmount.compareTo(entryAmount) != 0 ) {
  266. throw new ShrWebBizException("The amount split does not equal the total amount, please check !");
  267. }
  268. super.verifyModel(request, response, model);
  269. }
  270. /**
  271. * 员工工资包时间唯一校验
  272. * @param request
  273. * @param response
  274. * @param modelMap
  275. * @throws BOSException
  276. * @throws SQLException
  277. * @throws SHRWebException
  278. */
  279. public void checkDateAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws BOSException, SQLException, SHRWebException {
  280. boolean flag = true;
  281. String fid = request.getParameter("fid");
  282. String personId = request.getParameter("personId");
  283. String sourceBillId = request.getParameter("sourceBillId");
  284. String startDate = request.getParameter("startDate");
  285. String endDate = request.getParameter("endDate");
  286. String cmpitemId = request.getParameter("cmpitemId");
  287. System.out.print("sourceBillId========"+sourceBillId);
  288. System.out.print("cmpitemId========"+cmpitemId);
  289. Context ctx = SHRContext.getInstance().getContext();
  290. //员工工资包时间唯一校验
  291. StringBuffer dateSql = new StringBuffer();
  292. dateSql.append(" SELECT fnumber FROM CT_SAL_SalaryBag where FBillState = '3' ");
  293. dateSql.append(" and CFPersonID = '" + personId + "'" );
  294. dateSql.append(" and (CFStartDate between '" + startDate + "' and '" + endDate + "'" );
  295. dateSql.append(" or CFEndDate between '" + startDate + "' and '"+endDate + "')" );
  296. dateSql.append(" and CFCmpItemID = '" + cmpitemId + "'" );
  297. if(StringUtils.isNotBlank(fid) && StringUtils.isNotBlank(sourceBillId)) {
  298. dateSql.append(" and fid not in ('" + fid + "' , '"+ sourceBillId + "')");
  299. }else if(StringUtils.isNotBlank(fid)) {
  300. dateSql.append(" and fid != '" + fid + "' ");
  301. }else if(StringUtils.isNotBlank(sourceBillId)) {
  302. dateSql.append(" and fid != '" + sourceBillId + "'" );
  303. }
  304. IRowSet rs = DbUtil.executeQuery(ctx, dateSql.toString());
  305. if(rs.next()){
  306. flag = false;
  307. }
  308. JSONUtils.writeJson(response, flag);
  309. }
  310. /**
  311. * 提交生效
  312. * @param request
  313. * @param response
  314. * @param modelMap
  315. * @throws EASBizException
  316. * @throws BOSException
  317. * @throws SHRWebException
  318. * @throws SQLException
  319. */
  320. public void submitEffectAction(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws EASBizException, BOSException, SHRWebException, SQLException {
  321. System.out.println("工资包提交生效====" + modelMap);
  322. CoreBaseInfo model = (CoreBaseInfo)request.getAttribute("dynamic_model");
  323. Context ctx = SHRContext.getInstance().getContext();
  324. String currentid = model.getString("id");
  325. SalaryBagInfo demoInfo = null;
  326. if(StringUtils.isNotEmpty(currentid)) {
  327. demoInfo = SalaryBagFactory.getLocalInstance(ctx).getSalaryBagInfo((IObjectPK)new ObjectUuidPK(currentid));
  328. HRBillStateEnum status = demoInfo.getBillState();
  329. if (status.getValue() != 0) {
  330. //处于审核流程中或已经被审核过得单据不能提交
  331. throw new SHRWebException("Documents that are in the process of being audited or have already been audited cannot be submitted !");
  332. }
  333. }else {
  334. demoInfo = (SalaryBagInfo) model;
  335. }
  336. beforeSave(request, response, model);
  337. try {
  338. ISalaryBag idemo = (ISalaryBag)MetaDataUtil.getBizInterface("com.kingdee.eas.custom.bill.salary.app.SalaryBag");
  339. idemo.submitEffect(model);
  340. } catch (Exception e) {
  341. JSONUtils.ERROR("Submission validation failure !");
  342. }
  343. afterSave(request, response, model);
  344. System.out.println("工资单已提交生效 : " + demoInfo.toString());
  345. System.out.println("源单据编码:" + demoInfo.getSourceBillId());
  346. if(StringUtils.isNotBlank(demoInfo.getSourceBillId())){
  347. String updateSql = "update CT_SAL_SalaryBag set FBillState = '1' where fid = '"+ demoInfo.getSourceBillId() +"'";
  348. System.out.print("变更单据状态更新========="+updateSql);
  349. DbUtil.execute(ctx, updateSql);
  350. String deleteSql = "delete from CT_SAL_SalaryBag where fid = '"+ demoInfo.getSourceBillId() +"'";
  351. System.out.print("删除工资包SQL========="+deleteSql);
  352. DbUtil.execute(ctx, deleteSql);
  353. }
  354. String id = model.getId().toString();
  355. writeSuccessData(id);
  356. }
  357. }