HandMacDepositOSFService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. package com.kingdee.eas.custom.compensation.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.ormapping.ObjectUuidPK;
  6. import com.kingdee.bos.util.BOSUuid;
  7. import com.kingdee.eas.basedata.org.AdminOrgUnitInfo;
  8. import com.kingdee.eas.basedata.person.PersonInfo;
  9. import com.kingdee.eas.common.EASBizException;
  10. import com.kingdee.eas.custom.compensation.*;
  11. import com.kingdee.eas.framework.CoreBaseCollection;
  12. import com.kingdee.eas.util.app.DbUtil;
  13. import com.kingdee.jdbc.rowset.IRowSet;
  14. import com.kingdee.shr.compensation.CalSchemeCollection;
  15. import com.kingdee.shr.compensation.CalSchemeFactory;
  16. import com.kingdee.shr.compensation.CalSchemeInfo;
  17. import com.kingdee.shr.compensation.ICalScheme;
  18. import org.apache.commons.lang3.StringUtils;
  19. import java.math.BigDecimal;
  20. import java.text.SimpleDateFormat;
  21. import java.util.ArrayList;
  22. import java.util.Date;
  23. import java.util.List;
  24. import java.util.Map;
  25. /**
  26. * 处理生成手机押金单据
  27. */
  28. public class HandMacDepositOSFService implements IHRMsfService {
  29. @Override
  30. public Object process(Context context, Map map) throws EASBizException, BOSException {
  31. IHandMacDeposit handMacDeposit = HandMacDepositFactory.getLocalInstance(context);
  32. String calSchemeID = (String) map.get("calSchemeID");
  33. String beginDate = (String) map.get("beginDate");
  34. String endDate = (String) map.get("endDate");
  35. String calTime = (String) map.get("calTime");
  36. String s204 = (String) map.get("s204");
  37. String s205 = (String) map.get("s205");
  38. try {
  39. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  40. if(null==calSchemeID){
  41. return "calSchemeID为空";
  42. }
  43. if(null==s204){
  44. return "s204为空";
  45. }
  46. if(null==s205){
  47. return "s205为空";
  48. }
  49. String personIds = (String) map.get("personIds");
  50. StringBuilder sql = new StringBuilder();
  51. List<Object> sqlParams = new ArrayList<Object>();
  52. sql.append(" select ");
  53. sql.append(" b.fid, ");
  54. sql.append(" b.fnumber, ");
  55. sql.append(" b.FAdminOrgUnitID, ");
  56. sql.append(" b.FCostBearOrgID, ");
  57. sql.append(" b.fpersonid, ");
  58. sql.append(" costBearOrg.Fname_l2 costBearOrgName, ");
  59. sql.append(" b.FBeginDate, ");
  60. sql.append(" b." + s204 + ", ");
  61. sql.append(" b." + s205 + " ");
  62. sql.append(" from T_HR_SCMPCALTABLE b ");
  63. sql.append(" left join t_org_admin costBearOrg on b.FCostBearOrgID = costBearOrg.FAdminOrgUnitID ");
  64. sql.append(" where b.FCalSchemeID=? and b.FCalState in(12,20) and (b." + s204 + " is not null or b." + s205 + " is not null) ");
  65. sqlParams.add(calSchemeID);
  66. // 修复3:personIds 改用参数化查询,防止SQL注入
  67. if (StringUtils.isNotBlank(personIds)) {
  68. String[] ids = personIds.split(",");
  69. sql.append(" and b.fpersonid in (");
  70. for (int i = 0; i < ids.length; i++) {
  71. if (i > 0) {
  72. sql.append(",");
  73. }
  74. sql.append("?");
  75. sqlParams.add(ids[i].trim());
  76. }
  77. sql.append(") ");
  78. }
  79. if(null==beginDate || null==endDate){
  80. ICalScheme scheme = CalSchemeFactory.getLocalInstance(context);
  81. CalSchemeInfo calSchemeCon = scheme.getCalSchemeInfo(new ObjectUuidPK(calSchemeID));
  82. beginDate= sdf.format(calSchemeCon.getBeginDate());
  83. endDate = sdf.format(calSchemeCon.getEndDate());
  84. }
  85. sql.append(" and b.FBeginDate >= ? ");
  86. sqlParams.add(beginDate);
  87. sql.append(" and b.FEndDate <= ? ");
  88. sqlParams.add(endDate);
  89. if(null!=calTime) {
  90. sql.append(" and b.FcalTime = ? ");
  91. sqlParams.add(calTime);
  92. }
  93. sql.append(" order by b.FPeriodYear,b.FPeriodMonth,b.FCalTime ");
  94. IRowSet rs = DbUtil.executeQuery(context, sql.toString(), sqlParams.toArray());
  95. while (rs.next()) {
  96. String id = rs.getString("fid");
  97. String fnumber = rs.getString("fnumber");
  98. String FAdminOrgUnitID = rs.getString("FAdminOrgUnitID");
  99. String FCostBearOrgID = rs.getString("FCostBearOrgID");
  100. String costBearOrgName = rs.getString("costBearOrgName");
  101. String personId = rs.getString("fpersonid");
  102. Date FBeginDate = rs.getDate("FBeginDate");
  103. BigDecimal Fs204 = rs.getBigDecimal(s204);
  104. BigDecimal Fs205 = rs.getBigDecimal(s205);
  105. // 查询该人员所有生效的押金单据
  106. HandMacDepositCollection existingDocs = handMacDeposit.getHandMacDepositCollection(
  107. "where person.id ='" + personId + "' and isEffected=1 ");
  108. CoreBaseCollection docsToSave = new CoreBaseCollection();
  109. HandMacDepositInfo oldDoc = null;
  110. if (existingDocs != null && !existingDocs.isEmpty()) {
  111. // 修复1:只取第一条作为有效历史单据,多余的置为失效(清理脏数据)
  112. oldDoc = existingDocs.get(0);
  113. for (int i = 1; i < existingDocs.size(); i++) {
  114. HandMacDepositInfo extraDoc = existingDocs.get(i);
  115. extraDoc.setIsEffected(false);
  116. docsToSave.add(extraDoc);
  117. }
  118. // 修复2:判断是否可以直接更新已有单据
  119. // 收取押金场景:用 sourceBillId 匹配
  120. // 仅退回押金场景:用 sourceFunction 匹配
  121. boolean matched = false;
  122. if (null != Fs204 && id.equals(oldDoc.getSourceBillId())) {
  123. matched = true;
  124. } else if (null == Fs204 && null != Fs205 && id.equals(oldDoc.getSourceFunction())) {
  125. matched = true;
  126. }
  127. if (matched) {
  128. // 同一来源,直接更新已有单据
  129. if (null != Fs204) {
  130. AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo();
  131. CostBearOrg.setId(BOSUuid.read(FCostBearOrgID));
  132. oldDoc.setCollectUnit(CostBearOrg);
  133. oldDoc.setDepositCollectUnit(costBearOrgName);
  134. oldDoc.setDepositCollectCycle(FBeginDate);
  135. oldDoc.setDepositAmount(Fs204);
  136. oldDoc.setSourceBillId(id);
  137. oldDoc.setIsEffected(true);
  138. }
  139. if (null != Fs205) {
  140. AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo();
  141. CostBearOrg.setId(BOSUuid.read(FCostBearOrgID));
  142. oldDoc.setRefundUnit(CostBearOrg);
  143. oldDoc.setDepositRefundUnit(costBearOrgName);
  144. oldDoc.setDepositRefundCycle(FBeginDate);
  145. oldDoc.setDepositRefundAmount(Fs205);
  146. oldDoc.setSourceFunction(id);
  147. }
  148. docsToSave.add(oldDoc);
  149. } else {
  150. // 来源不匹配:旧单据失效,创建新单据,合并旧数据防止丢失
  151. oldDoc.setIsEffected(false);
  152. docsToSave.add(oldDoc);
  153. HandMacDepositInfo newDoc = new HandMacDepositInfo();
  154. newDoc.setIsEffected(true);
  155. // 设置表头信息
  156. AdminOrgUnitInfo adminOrgUnitInfo = new AdminOrgUnitInfo();
  157. adminOrgUnitInfo.setId(BOSUuid.read(FAdminOrgUnitID));
  158. newDoc.setAdminOrgUnit(adminOrgUnitInfo);
  159. newDoc.setAdminOrg(adminOrgUnitInfo);
  160. PersonInfo personInfo = new PersonInfo();
  161. personInfo.setId(BOSUuid.read(personId));
  162. newDoc.setPerson(personInfo);
  163. newDoc.setPersonNumber(fnumber);
  164. newDoc.setNumber(id);
  165. newDoc.setDescription(calSchemeID);
  166. // 设置收取押金字段
  167. if (null != Fs204) {
  168. AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo();
  169. CostBearOrg.setId(BOSUuid.read(FCostBearOrgID));
  170. newDoc.setCollectUnit(CostBearOrg);
  171. newDoc.setDepositCollectUnit(costBearOrgName);
  172. newDoc.setDepositCollectCycle(FBeginDate);
  173. newDoc.setDepositAmount(Fs204);
  174. newDoc.setSourceBillId(id);
  175. } else {
  176. // 修复1:当前行没有收取押金,从旧单据继承,防止数据丢失
  177. if (oldDoc.getDepositAmount() != null) {
  178. newDoc.setDepositAmount(oldDoc.getDepositAmount());
  179. newDoc.setDepositCollectCycle(oldDoc.getDepositCollectCycle());
  180. newDoc.setDepositCollectUnit(oldDoc.getDepositCollectUnit());
  181. newDoc.setCollectUnit(oldDoc.getCollectUnit());
  182. newDoc.setSourceBillId(oldDoc.getSourceBillId());
  183. }
  184. }
  185. // 设置退回押金字段
  186. if (null != Fs205) {
  187. AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo();
  188. CostBearOrg.setId(BOSUuid.read(FCostBearOrgID));
  189. newDoc.setRefundUnit(CostBearOrg);
  190. newDoc.setDepositRefundUnit(costBearOrgName);
  191. newDoc.setDepositRefundCycle(FBeginDate);
  192. newDoc.setDepositRefundAmount(Fs205);
  193. newDoc.setSourceFunction(id);
  194. } else {
  195. // 修复1:当前行没有退回押金,从旧单据继承,防止数据丢失
  196. if (oldDoc.getDepositRefundAmount() != null) {
  197. newDoc.setDepositRefundAmount(oldDoc.getDepositRefundAmount());
  198. newDoc.setDepositRefundCycle(oldDoc.getDepositRefundCycle());
  199. newDoc.setDepositRefundUnit(oldDoc.getDepositRefundUnit());
  200. newDoc.setRefundUnit(oldDoc.getRefundUnit());
  201. newDoc.setSourceFunction(oldDoc.getSourceFunction());
  202. }
  203. }
  204. docsToSave.add(newDoc);
  205. }
  206. }
  207. else {
  208. // 无历史单据:直接创建新单据
  209. HandMacDepositInfo newDoc = new HandMacDepositInfo();
  210. newDoc.setIsEffected(true);
  211. AdminOrgUnitInfo adminOrgUnitInfo = new AdminOrgUnitInfo();
  212. adminOrgUnitInfo.setId(BOSUuid.read(FAdminOrgUnitID));
  213. newDoc.setAdminOrgUnit(adminOrgUnitInfo);
  214. newDoc.setAdminOrg(adminOrgUnitInfo);
  215. PersonInfo personInfo = new PersonInfo();
  216. personInfo.setId(BOSUuid.read(personId));
  217. newDoc.setPerson(personInfo);
  218. newDoc.setPersonNumber(fnumber);
  219. newDoc.setNumber(id);
  220. newDoc.setDescription(calSchemeID);
  221. if (null != Fs204) {
  222. AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo();
  223. CostBearOrg.setId(BOSUuid.read(FCostBearOrgID));
  224. newDoc.setCollectUnit(CostBearOrg);
  225. newDoc.setDepositCollectUnit(costBearOrgName);
  226. newDoc.setDepositCollectCycle(FBeginDate);
  227. newDoc.setDepositAmount(Fs204);
  228. newDoc.setSourceBillId(id);
  229. }
  230. if (null != Fs205) {
  231. AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo();
  232. CostBearOrg.setId(BOSUuid.read(FCostBearOrgID));
  233. newDoc.setRefundUnit(CostBearOrg);
  234. newDoc.setDepositRefundUnit(costBearOrgName);
  235. newDoc.setDepositRefundCycle(FBeginDate);
  236. newDoc.setDepositRefundAmount(Fs205);
  237. newDoc.setSourceFunction(id);
  238. }
  239. docsToSave.add(newDoc);
  240. }
  241. handMacDeposit.save(docsToSave);
  242. }
  243. } catch (Exception e) {
  244. e.printStackTrace();
  245. return "err";
  246. }
  247. return "ok";
  248. }
  249. }