package com.kingdee.eas.custom.compensation.osf; import com.kingdee.bos.BOSException; import com.kingdee.bos.Context; import com.kingdee.bos.bsf.service.app.IHRMsfService; import com.kingdee.bos.dao.ormapping.ObjectUuidPK; import com.kingdee.bos.util.BOSUuid; import com.kingdee.eas.basedata.org.AdminOrgUnitInfo; import com.kingdee.eas.basedata.person.PersonInfo; import com.kingdee.eas.common.EASBizException; import com.kingdee.eas.custom.compensation.*; import com.kingdee.eas.framework.CoreBaseCollection; import com.kingdee.eas.util.app.DbUtil; import com.kingdee.jdbc.rowset.IRowSet; import com.kingdee.shr.compensation.CalSchemeCollection; import com.kingdee.shr.compensation.CalSchemeFactory; import com.kingdee.shr.compensation.CalSchemeInfo; import com.kingdee.shr.compensation.ICalScheme; import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * 处理生成手机押金单据 */ public class HandMacDepositOSFService implements IHRMsfService { @Override public Object process(Context context, Map map) throws EASBizException, BOSException { IHandMacDeposit handMacDeposit = HandMacDepositFactory.getLocalInstance(context); String calSchemeID = (String) map.get("calSchemeID"); String beginDate = (String) map.get("beginDate"); String endDate = (String) map.get("endDate"); String calTime = (String) map.get("calTime"); String s204 = (String) map.get("s204"); String s205 = (String) map.get("s205"); try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); if(null==calSchemeID){ return "calSchemeID为空"; } if(null==s204){ return "s204为空"; } if(null==s205){ return "s205为空"; } String personIds = (String) map.get("personIds"); StringBuilder sql = new StringBuilder(); List sqlParams = new ArrayList(); sql.append(" select "); sql.append(" b.fid, "); sql.append(" b.fnumber, "); sql.append(" b.FAdminOrgUnitID, "); sql.append(" b.FCostBearOrgID, "); sql.append(" b.fpersonid, "); sql.append(" costBearOrg.Fname_l2 costBearOrgName, "); sql.append(" b.FBeginDate, "); sql.append(" b." + s204 + ", "); sql.append(" b." + s205 + " "); sql.append(" from T_HR_SCMPCALTABLE b "); sql.append(" left join t_org_admin costBearOrg on b.FCostBearOrgID = costBearOrg.FAdminOrgUnitID "); sql.append(" where b.FCalSchemeID=? and b.FCalState in(12,20) and (b." + s204 + " is not null or b." + s205 + " is not null) "); sqlParams.add(calSchemeID); // 修复3:personIds 改用参数化查询,防止SQL注入 if (StringUtils.isNotBlank(personIds)) { String[] ids = personIds.split(","); sql.append(" and b.fpersonid in ("); for (int i = 0; i < ids.length; i++) { if (i > 0) { sql.append(","); } sql.append("?"); sqlParams.add(ids[i].trim()); } sql.append(") "); } if(null==beginDate || null==endDate){ ICalScheme scheme = CalSchemeFactory.getLocalInstance(context); CalSchemeInfo calSchemeCon = scheme.getCalSchemeInfo(new ObjectUuidPK(calSchemeID)); beginDate= sdf.format(calSchemeCon.getBeginDate()); endDate = sdf.format(calSchemeCon.getEndDate()); } sql.append(" and b.FBeginDate >= ? "); sqlParams.add(beginDate); sql.append(" and b.FEndDate <= ? "); sqlParams.add(endDate); if(null!=calTime) { sql.append(" and b.FcalTime = ? "); sqlParams.add(calTime); } sql.append(" order by b.FPeriodYear,b.FPeriodMonth,b.FCalTime "); IRowSet rs = DbUtil.executeQuery(context, sql.toString(), sqlParams.toArray()); while (rs.next()) { String id = rs.getString("fid"); String fnumber = rs.getString("fnumber"); String FAdminOrgUnitID = rs.getString("FAdminOrgUnitID"); String FCostBearOrgID = rs.getString("FCostBearOrgID"); String costBearOrgName = rs.getString("costBearOrgName"); String personId = rs.getString("fpersonid"); Date FBeginDate = rs.getDate("FBeginDate"); BigDecimal Fs204 = rs.getBigDecimal(s204); BigDecimal Fs205 = rs.getBigDecimal(s205); // 查询该人员所有生效的押金单据 HandMacDepositCollection existingDocs = handMacDeposit.getHandMacDepositCollection( "where person.id ='" + personId + "' and isEffected=1 "); CoreBaseCollection docsToSave = new CoreBaseCollection(); HandMacDepositInfo oldDoc = null; if (existingDocs != null && !existingDocs.isEmpty()) { // 修复1:只取第一条作为有效历史单据,多余的置为失效(清理脏数据) oldDoc = existingDocs.get(0); for (int i = 1; i < existingDocs.size(); i++) { HandMacDepositInfo extraDoc = existingDocs.get(i); extraDoc.setIsEffected(false); docsToSave.add(extraDoc); } // 修复2:判断是否可以直接更新已有单据 // 收取押金场景:用 sourceBillId 匹配 // 仅退回押金场景:用 sourceFunction 匹配 boolean matched = false; if (null != Fs204 && id.equals(oldDoc.getSourceBillId())) { matched = true; } else if (null == Fs204 && null != Fs205 && id.equals(oldDoc.getSourceFunction())) { matched = true; } if (matched) { // 同一来源,直接更新已有单据 if (null != Fs204) { AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo(); CostBearOrg.setId(BOSUuid.read(FCostBearOrgID)); oldDoc.setCollectUnit(CostBearOrg); oldDoc.setDepositCollectUnit(costBearOrgName); oldDoc.setDepositCollectCycle(FBeginDate); oldDoc.setDepositAmount(Fs204); oldDoc.setSourceBillId(id); oldDoc.setIsEffected(true); } if (null != Fs205) { AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo(); CostBearOrg.setId(BOSUuid.read(FCostBearOrgID)); oldDoc.setRefundUnit(CostBearOrg); oldDoc.setDepositRefundUnit(costBearOrgName); oldDoc.setDepositRefundCycle(FBeginDate); oldDoc.setDepositRefundAmount(Fs205); oldDoc.setSourceFunction(id); } docsToSave.add(oldDoc); } else { // 来源不匹配:旧单据失效,创建新单据,合并旧数据防止丢失 oldDoc.setIsEffected(false); docsToSave.add(oldDoc); HandMacDepositInfo newDoc = new HandMacDepositInfo(); newDoc.setIsEffected(true); // 设置表头信息 AdminOrgUnitInfo adminOrgUnitInfo = new AdminOrgUnitInfo(); adminOrgUnitInfo.setId(BOSUuid.read(FAdminOrgUnitID)); newDoc.setAdminOrgUnit(adminOrgUnitInfo); newDoc.setAdminOrg(adminOrgUnitInfo); PersonInfo personInfo = new PersonInfo(); personInfo.setId(BOSUuid.read(personId)); newDoc.setPerson(personInfo); newDoc.setPersonNumber(fnumber); newDoc.setNumber(id); newDoc.setDescription(calSchemeID); // 设置收取押金字段 if (null != Fs204) { AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo(); CostBearOrg.setId(BOSUuid.read(FCostBearOrgID)); newDoc.setCollectUnit(CostBearOrg); newDoc.setDepositCollectUnit(costBearOrgName); newDoc.setDepositCollectCycle(FBeginDate); newDoc.setDepositAmount(Fs204); newDoc.setSourceBillId(id); } else { // 修复1:当前行没有收取押金,从旧单据继承,防止数据丢失 if (oldDoc.getDepositAmount() != null) { newDoc.setDepositAmount(oldDoc.getDepositAmount()); newDoc.setDepositCollectCycle(oldDoc.getDepositCollectCycle()); newDoc.setDepositCollectUnit(oldDoc.getDepositCollectUnit()); newDoc.setCollectUnit(oldDoc.getCollectUnit()); newDoc.setSourceBillId(oldDoc.getSourceBillId()); } } // 设置退回押金字段 if (null != Fs205) { AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo(); CostBearOrg.setId(BOSUuid.read(FCostBearOrgID)); newDoc.setRefundUnit(CostBearOrg); newDoc.setDepositRefundUnit(costBearOrgName); newDoc.setDepositRefundCycle(FBeginDate); newDoc.setDepositRefundAmount(Fs205); newDoc.setSourceFunction(id); } else { // 修复1:当前行没有退回押金,从旧单据继承,防止数据丢失 if (oldDoc.getDepositRefundAmount() != null) { newDoc.setDepositRefundAmount(oldDoc.getDepositRefundAmount()); newDoc.setDepositRefundCycle(oldDoc.getDepositRefundCycle()); newDoc.setDepositRefundUnit(oldDoc.getDepositRefundUnit()); newDoc.setRefundUnit(oldDoc.getRefundUnit()); newDoc.setSourceFunction(oldDoc.getSourceFunction()); } } docsToSave.add(newDoc); } } else { // 无历史单据:直接创建新单据 HandMacDepositInfo newDoc = new HandMacDepositInfo(); newDoc.setIsEffected(true); AdminOrgUnitInfo adminOrgUnitInfo = new AdminOrgUnitInfo(); adminOrgUnitInfo.setId(BOSUuid.read(FAdminOrgUnitID)); newDoc.setAdminOrgUnit(adminOrgUnitInfo); newDoc.setAdminOrg(adminOrgUnitInfo); PersonInfo personInfo = new PersonInfo(); personInfo.setId(BOSUuid.read(personId)); newDoc.setPerson(personInfo); newDoc.setPersonNumber(fnumber); newDoc.setNumber(id); newDoc.setDescription(calSchemeID); if (null != Fs204) { AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo(); CostBearOrg.setId(BOSUuid.read(FCostBearOrgID)); newDoc.setCollectUnit(CostBearOrg); newDoc.setDepositCollectUnit(costBearOrgName); newDoc.setDepositCollectCycle(FBeginDate); newDoc.setDepositAmount(Fs204); newDoc.setSourceBillId(id); } if (null != Fs205) { AdminOrgUnitInfo CostBearOrg = new AdminOrgUnitInfo(); CostBearOrg.setId(BOSUuid.read(FCostBearOrgID)); newDoc.setRefundUnit(CostBearOrg); newDoc.setDepositRefundUnit(costBearOrgName); newDoc.setDepositRefundCycle(FBeginDate); newDoc.setDepositRefundAmount(Fs205); newDoc.setSourceFunction(id); } docsToSave.add(newDoc); } handMacDeposit.save(docsToSave); } } catch (Exception e) { e.printStackTrace(); return "err"; } return "ok"; } }