|
|
@@ -0,0 +1,262 @@
|
|
|
+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<Object> sqlParams = new ArrayList<Object>();
|
|
|
+ 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";
|
|
|
+ }
|
|
|
+}
|