Browse Source

提交税款计算业务代码

Heyuan 8 tháng trước cách đây
mục cha
commit
60549cfc3a

+ 124 - 0
deployed_metas/com/kingdee/eas/custom/shuiyou/taxCal/TaxCalFacade.facade

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<facade xmlns="com.kingdee.bos.metadata">
+  <package>com.kingdee.eas.custom.shuiyou.taxCal</package>
+  <name>TaxCalFacade</name>
+  <alias>facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].alias</alias>
+  <description>facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].description</description>
+  <userDefined>true</userDefined>
+  <bosType>74192D98</bosType>
+  <stereoType>false</stereoType>
+  <businessImplName>com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade</businessImplName>
+  <businessControllerName>com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacadeController</businessControllerName>
+  <accessLevel>public</accessLevel>
+  <subClassingMode>normal</subClassingMode>
+  <methods>
+    <method>
+      <name>submitInitData</name>
+      <isListenerMethod>false</isListenerMethod>
+      <alias>facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].alias</alias>
+      <description>facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].description</description>
+      <innerID>b5bdb7a3-eb2b-4971-ab4e-64586e308fc0</innerID>
+      <accessLevel>public</accessLevel>
+      <subClassingMode>normal</subClassingMode>
+      <returnValueType>String</returnValueType>
+      <metadataRef />
+      <transactionAttribute>Supports</transactionAttribute>
+      <userDefined>true</userDefined>
+      <userDefinedLogic />
+      <parameters>
+        <parameter>
+          <name>initIds</name>
+          <alias>facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[initIds].alias</alias>
+          <description>facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[initIds].description</description>
+          <direction>in</direction>
+          <dataType>String</dataType>
+          <metadataRef />
+          <userDefined>true</userDefined>
+        </parameter>
+        <parameter>
+          <name>relayTaskID</name>
+          <alias>facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[relayTaskID].alias</alias>
+          <description>facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[relayTaskID].description</description>
+          <direction>in</direction>
+          <dataType>String</dataType>
+          <metadataRef />
+          <userDefined>true</userDefined>
+        </parameter>
+        <parameter>
+          <name>taskCatalog</name>
+          <alias>facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[taskCatalog].alias</alias>
+          <description>facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[taskCatalog].description</description>
+          <direction>in</direction>
+          <dataType>com.kingdee.shr.compensation.app.taxCal.TaxCalTaskCatalogEnum</dataType>
+          <metadataRef />
+          <userDefined>true</userDefined>
+        </parameter>
+      </parameters>
+      <configured>false</configured>
+    </method>
+  </methods>
+  <resource>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].alias">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="算税Facade" />
+      <lang locale="zh_HK" value="算稅Facade" />
+      <lang locale="zh_TW" value="算稅Facade" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].description">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="null" />
+      <lang locale="zh_HK" value="null" />
+      <lang locale="zh_TW" value="null" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].extendedProperty.userDefined">
+      <lang locale="en_US" value="true" />
+      <lang locale="zh_CN" value="true" />
+      <lang locale="zh_TW" value="true" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].alias">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="拼装算税数据" />
+      <lang locale="zh_HK" value="拼裝算稅數據" />
+      <lang locale="zh_TW" value="拼裝算稅數據" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].description">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="null" />
+      <lang locale="zh_HK" value="null" />
+      <lang locale="zh_TW" value="null" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[initIds].alias">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="明细id" />
+      <lang locale="zh_HK" value="明細id" />
+      <lang locale="zh_TW" value="明細id" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[initIds].description">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="" />
+      <lang locale="zh_TW" value="null" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[relayTaskID].alias">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="前置任务id" />
+      <lang locale="zh_HK" value="前置任務id" />
+      <lang locale="zh_TW" value="前置任務id" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[relayTaskID].description">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="" />
+      <lang locale="zh_TW" value="null" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[taskCatalog].alias">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="taskCatalog" />
+      <lang locale="zh_HK" value="taskCatalog" />
+      <lang locale="zh_TW" value="taskCatalog" />
+    </rs>
+    <rs key="facade[com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade].methods.method[submitInitData].parameters.parameter[taskCatalog].description">
+      <lang locale="en_US" value="null" />
+      <lang locale="zh_CN" value="" />
+      <lang locale="zh_TW" value="null" />
+    </rs>
+  </resource>
+</facade>

+ 2 - 1
deployed_metas/facade_pkmapping.properties

@@ -4,4 +4,5 @@
 004655B1=com.kingdee.eas.custom.shuiyou.task.TaskExecuteFacade
 A069618E=com.kingdee.eas.custom.shuiyou.uitls.SYUtilsFacade
 7E4D44FA=com.kingdee.eas.custom.shuiyou.incomeTax.TaxDirectDeductionExFacade
-16E375A5=com.kingdee.eas.custom.shuiyou.incomeTax.TaxPersonReportExFacade
+16E375A5=com.kingdee.eas.custom.shuiyou.incomeTax.TaxPersonReportExFacade
+74192D98=com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacade

+ 61 - 0
src/com/kingdee/eas/custom/shuiyou/taxCal/AbstractTaxCalFacadeControllerBean.java

@@ -0,0 +1,61 @@
+package com.kingdee.eas.custom.shuiyou.taxCal;
+
+import javax.ejb.*;
+import java.rmi.RemoteException;
+import com.kingdee.bos.*;
+import com.kingdee.bos.util.BOSObjectType;
+import com.kingdee.bos.metadata.IMetaDataPK;
+import com.kingdee.bos.metadata.rule.RuleExecutor;
+import com.kingdee.bos.metadata.MetaDataPK;
+//import com.kingdee.bos.metadata.entity.EntityViewInfo;
+import com.kingdee.bos.framework.ejb.AbstractEntityControllerBean;
+import com.kingdee.bos.framework.ejb.AbstractBizControllerBean;
+//import com.kingdee.bos.dao.IObjectPK;
+import com.kingdee.bos.dao.IObjectValue;
+import com.kingdee.bos.dao.IObjectCollection;
+import com.kingdee.bos.service.ServiceContext;
+import com.kingdee.bos.service.IServiceContext;
+import com.kingdee.eas.framework.Result;
+import com.kingdee.eas.framework.LineResult;
+import com.kingdee.eas.framework.exception.EASMultiException;
+import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
+
+import com.kingdee.shr.compensation.app.taxCal.TaxCalTaskCatalogEnum;
+import java.lang.String;
+
+
+
+public abstract class AbstractTaxCalFacadeControllerBean extends AbstractBizControllerBean implements TaxCalFacadeController
+{
+    protected AbstractTaxCalFacadeControllerBean()
+    {
+    }
+
+    protected BOSObjectType getBOSType()
+    {
+        return new BOSObjectType("74192D98");
+    }
+
+    public String submitInitData(Context ctx, String initIds, String relayTaskID, TaxCalTaskCatalogEnum taskCatalog) throws BOSException
+    {
+        try {
+            ServiceContext svcCtx = createServiceContext(new MetaDataPK("b5bdb7a3-eb2b-4971-ab4e-64586e308fc0"), new Object[]{ctx, initIds, relayTaskID, taskCatalog});
+            invokeServiceBefore(svcCtx);
+            if(!svcCtx.invokeBreak()) {
+            String retValue = (String)_submitInitData(ctx, initIds, relayTaskID, taskCatalog);
+            svcCtx.setMethodReturnValue(retValue);
+            }
+            invokeServiceAfter(svcCtx);
+            return (String)svcCtx.getMethodReturnValue();
+        } catch (BOSException ex) {
+            throw ex;
+        } finally {
+            super.cleanUpServiceState();
+        }
+    }
+    protected String _submitInitData(Context ctx, String initIds, String relayTaskID, TaxCalTaskCatalogEnum taskCatalog) throws BOSException
+    {    	
+        return null;
+    }
+
+}

+ 19 - 0
src/com/kingdee/eas/custom/shuiyou/taxCal/ITaxCalFacade.java

@@ -0,0 +1,19 @@
+package com.kingdee.eas.custom.shuiyou.taxCal;
+
+import com.kingdee.bos.BOSException;
+//import com.kingdee.bos.metadata.*;
+import com.kingdee.bos.framework.*;
+import com.kingdee.bos.util.*;
+import com.kingdee.bos.Context;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.util.*;
+import com.kingdee.shr.compensation.app.taxCal.TaxCalTaskCatalogEnum;
+import java.lang.String;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.framework.*;
+
+public interface ITaxCalFacade extends IBizCtrl
+{
+    public String submitInitData(String initIds, String relayTaskID, TaxCalTaskCatalogEnum taskCatalog) throws BOSException;
+}

+ 53 - 0
src/com/kingdee/eas/custom/shuiyou/taxCal/TaxCalFacade.java

@@ -0,0 +1,53 @@
+package com.kingdee.eas.custom.shuiyou.taxCal;
+
+import com.kingdee.bos.framework.ejb.EJBRemoteException;
+import com.kingdee.bos.util.BOSObjectType;
+import java.rmi.RemoteException;
+import com.kingdee.bos.framework.AbstractBizCtrl;
+import com.kingdee.bos.orm.template.ORMObject;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.util.*;
+import com.kingdee.shr.compensation.app.taxCal.TaxCalTaskCatalogEnum;
+import com.kingdee.eas.custom.shuiyou.taxCal.*;
+import java.lang.String;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.framework.*;
+
+public class TaxCalFacade extends AbstractBizCtrl implements ITaxCalFacade
+{
+    public TaxCalFacade()
+    {
+        super();
+        registerInterface(ITaxCalFacade.class, this);
+    }
+    public TaxCalFacade(Context ctx)
+    {
+        super(ctx);
+        registerInterface(ITaxCalFacade.class, this);
+    }
+    public BOSObjectType getType()
+    {
+        return new BOSObjectType("74192D98");
+    }
+    private TaxCalFacadeController getController() throws BOSException
+    {
+        return (TaxCalFacadeController)getBizController();
+    }
+    /**
+     *拼装算税数据-User defined method
+     *@param initIds 明细id
+     *@param relayTaskID 前置任务id
+     *@param taskCatalog taskCatalog
+     *@return
+     */
+    public String submitInitData(String initIds, String relayTaskID, TaxCalTaskCatalogEnum taskCatalog) throws BOSException
+    {
+        try {
+            return getController().submitInitData(getContext(), initIds, relayTaskID, taskCatalog);
+        }
+        catch(RemoteException err) {
+            throw new EJBRemoteException(err);
+        }
+    }
+}

+ 22 - 0
src/com/kingdee/eas/custom/shuiyou/taxCal/TaxCalFacadeController.java

@@ -0,0 +1,22 @@
+package com.kingdee.eas.custom.shuiyou.taxCal;
+
+import com.kingdee.bos.BOSException;
+//import com.kingdee.bos.metadata.*;
+import com.kingdee.bos.framework.*;
+import com.kingdee.bos.util.*;
+import com.kingdee.bos.Context;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.util.*;
+import com.kingdee.shr.compensation.app.taxCal.TaxCalTaskCatalogEnum;
+import java.lang.String;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.framework.*;
+
+import java.rmi.RemoteException;
+import com.kingdee.bos.framework.ejb.BizController;
+
+public interface TaxCalFacadeController extends BizController
+{
+    public String submitInitData(Context ctx, String initIds, String relayTaskID, TaxCalTaskCatalogEnum taskCatalog) throws BOSException, RemoteException;
+}

+ 534 - 0
src/com/kingdee/eas/custom/shuiyou/taxCal/TaxCalFacadeControllerBean.java

@@ -0,0 +1,534 @@
+package com.kingdee.eas.custom.shuiyou.taxCal;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.kingdee.bos.dao.IObjectPK;
+import com.kingdee.bos.util.BOSUuid;
+import com.kingdee.bos.util.EASResource;
+import com.kingdee.eas.custom.shuiyou.incomeTax.TaxPersonReportExFacadeFactory;
+import com.kingdee.eas.custom.shuiyou.incomeTax.TaxSpeAddDedReportExFacadeFactory;
+import com.kingdee.eas.custom.shuiyou.task.TaskCatalogEnum;
+import com.kingdee.eas.custom.shuiyou.uitls.SYUtilsFacadeFactory;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.base.syssetting.app.filter.HRFilterUtils;
+import com.kingdee.shr.compensation.app.tax.base.TaxItemCollection;
+import com.kingdee.shr.compensation.app.tax.base.TaxItemInfo;
+import com.kingdee.shr.compensation.app.taxCal.*;
+import com.kingdee.shr.compensation.app.taxCal.vo.TaxCalBasicVO;
+import com.kingdee.shr.compensation.taxCal.util.TaxItemUtil;
+import com.kingdee.shr.compensation.util.CmpDateUtil;
+import com.kingdee.util.StringUtils;
+import org.apache.log4j.Logger;
+import com.kingdee.bos.*;
+
+import java.math.BigDecimal;
+import java.lang.String;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.*;
+
+/**
+ * 算税Facade
+ */
+public class TaxCalFacadeControllerBean extends AbstractTaxCalFacadeControllerBean {
+    private static Logger logger = Logger.getLogger(TaxCalFacadeControllerBean.class);
+    private static final long serialVersionUID = 1L;
+    private Map<String, String> taskMap;
+    private Map<String, Map<String, Object>> dataMap = new HashMap();
+    private List<String> sumTaxList;//计税累加项目表字段
+    private List<String> allTaxItemList;//全部个税项目表字段
+    private static final int FIXED_PARA_COUNT = 15;
+    private String userId;
+    private boolean isDelete = false;
+    //是否附表提交
+    private boolean isFbSubmit;
+
+    /**
+     * 拼装算税数据
+     *
+     * @param ctx
+     * @param initIds     明细id
+     * @param relayTaskID 前置任务id
+     * @param taskCatalog 任务分类
+     * @return
+     * @throws BOSException
+     */
+    @Override
+    protected String _submitInitData(Context ctx,
+                                     String initIds,
+                                     String relayTaskID,
+                                     TaxCalTaskCatalogEnum taskCatalog) throws BOSException {
+        if (!StringUtils.isEmpty(initIds) && !"''".equals(initIds)) {
+            //附表提交
+            this.isFbSubmit = taskCatalog == TaxCalTaskCatalogEnum.FB_UPLOAD;
+            //当前用户为管理员或user时,查询任务表创建人id
+            this.initUserID(ctx, relayTaskID);
+            //更新受理id
+            //this.updateAcceptId(ctx, initIds);
+            //创建任务
+            String taskId = this.createTask(ctx, initIds, taskCatalog);
+            //获取个税项目
+            this.initTaxItem(ctx);
+            //更新数据状态为已废弃
+            //this.updateLastTaskDetail(ctx, initIds);
+            //获取写入 税款计算提交算税任务数据记录表 sql
+//            String insertSql = this.getInsertTaskDetailSql();
+//            List<Object[]> paramsList = this.getParamListData(ctx, initIds);
+//            DbUtil.executeBatch(ctx, insertSql, paramsList);
+            if (!this.isFbSubmit) {//不是附表提交
+                //更新个税应用+税款计算初算明细表 处理中
+                this.updateTaxCalInitData(ctx, initIds);
+            }
+            return taskId;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 初始化用户id
+     * 当前用户为管理员或user时,查询任务表创建人id
+     *
+     * @param ctx
+     * @param relayTaskId 前置任务id
+     */
+    private void initUserID(Context ctx, String relayTaskId) {
+        this.userId = HRFilterUtils.getCurrentUserId(ctx);
+        //等于管理员或user 并且 前置任务id不等于空
+        if (
+                ("00000000-0000-0000-0000-00000000000013B7DE7F".equals(this.userId)
+                        || "256c221a-0106-1000-e000-10d7c0a813f413B7DE7F".equals(this.userId)
+                ) && !StringUtils.isEmpty(relayTaskId)) {
+            String getCreatorSQL = " select top 1 FCreatorID from T_HR_STAXCALTASK where fid = '" + relayTaskId + "'";
+            try {
+                IRowSet rowSet = DbUtil.executeQuery(ctx, getCreatorSQL);
+                if (rowSet.next()) {
+                    this.userId = rowSet.getString("FCreatorID");
+                }
+            } catch (Exception var5) {
+                var5.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 更新受理id
+     *
+     * @param ctx
+     * @param initIds 明细id
+     * @throws BOSException
+     */
+    private void updateAcceptId(Context ctx, String initIds) throws BOSException {
+        String str = " update T_HR_STAXCALINITDETAIL detail set FAcceptId = ( select FAcceptId from T_HR_STaxPersonRecordEntry entry  where detail.FTaxUnitId = entry.FTaxUnitId and detail.FPersonId = entry.FPersonId)  where fid in (" + initIds + ") ";
+        DbUtil.execute(ctx, str);
+    }
+
+    /**
+     * 创建任务
+     *
+     * @param ctx
+     * @param initIds 明细id
+     * @param catalog 任务分类
+     * @return
+     * @throws BOSException
+     */
+    private String createTask(Context ctx,
+                              String initIds,
+                              TaxCalTaskCatalogEnum catalog) throws BOSException {
+        this.taskMap = new HashMap();
+        //个税应用+税款计算初算明细表
+        //任职受雇从业信息分录
+        String str = " SELECT t.fTaxUnitId," +
+                " t.fPeriodBegin, " +
+                " t.fIncomeItemId, " +
+                " e.FAcceptId, " +
+                " e.fid entryId," +
+                " e.FSubmitStatus, " +
+                " t.fid initId " +
+                " from T_HR_STaxCalInitDetail t " +
+                " left join T_HR_STaxPersonRecordEntry e  on t.fPersonId = e.fPersonId and t.fTaxUnitId = e.fTaxUnitId " +
+                " where t.fid IN (" + initIds + ")";
+        IRowSet rowSet = DbUtil.executeQuery(ctx, str);
+        if (rowSet.size() < 1) {
+            //未获取到需要算税的人员信息
+            throw new BOSException(EASResource.getString("com.kingdee.shr.compensation.resource.TaxCalBaseResource", "label31", ctx.getLocale()));
+        } else {
+            //纳税单位分组
+            HashMap<String, List<TaxCalBasicVO>> taxUnitGroups = new HashMap<String, List<TaxCalBasicVO>>();
+            try {
+                while (rowSet.next()) {
+                    //纳税单位
+                    String taxUnitId = rowSet.getString("fTaxUnitId");
+                    List<TaxCalBasicVO> calcList = taxUnitGroups.get(taxUnitId);
+                    if (null == calcList) {
+                        calcList = new ArrayList();
+                        taxUnitGroups.put(taxUnitId, calcList);
+                    }
+                    //算税对象
+                    TaxCalBasicVO vo = new TaxCalBasicVO();
+                    vo.setPeriodBegin(rowSet.getDate("fPeriodBegin"));//所属周期开始时间
+                    vo.setTaxUnitId(rowSet.getString("fTaxUnitId"));//纳税单位
+                    vo.setIncomeItemId(rowSet.getString("fIncomeItemId"));//所得项目
+                    vo.setAcceptId(rowSet.getString("initId"));//初始id
+                    vo.setSubmitStatus(rowSet.getString("FSubmitStatus"));//提交状态
+                    vo.setEntryId(rowSet.getString("entryId"));//分录id
+                    calcList.add(vo);
+                }
+            } catch (SQLException e) {
+                logger.error(e.getMessage(), e);
+                throw new BOSException(e.getMessage());
+            }
+            Iterator<Map.Entry<String, List<TaxCalBasicVO>>> iterator = taxUnitGroups.entrySet().iterator();
+            ObjectMapper objectMapper = new ObjectMapper();
+            for (Iterator i$ = iterator; i$.hasNext(); ) {
+                Map.Entry<String, List<TaxCalBasicVO>> group = (Map.Entry) i$.next();
+                Map<String, Object> paramMap = new HashMap();
+                //纳税单位id
+                String taxUnitId = group.getKey();
+                List<TaxCalBasicVO> list = group.getValue();
+                String yearMonth = CmpDateUtil.getDateStr((list.get(0)).getPeriodBegin(), "yyyy-MM");
+                paramMap.put("TAXUNITID", taxUnitId);//纳税单位id
+                paramMap.put("PERIOD", yearMonth);//周期yyyy-MM
+                paramMap.put("initIds", initIds);//
+                paramMap.put("creator", this.userId);//创建人id
+                //1.人员报送
+                //未报送成功人员id
+                String notReportedPersonIds = getNotReportedPersonIds(list);
+                if (StringUtils.isEmpty(notReportedPersonIds)) {
+                    paramMap.put("accept_id", (list.get(0)).getAcceptId());
+                } else if (!this.isFbSubmit) {//不是附表提交
+                    try {
+                        //人员报税信息报送_人员信息报送
+                        List relayTaskIDList = TaxPersonReportExFacadeFactory.getLocalInstance(ctx)
+                                .report(notReportedPersonIds, yearMonth, (String) null);
+                        if (null != relayTaskIDList && relayTaskIDList.size() == 1) {
+                            IObjectPK relayTaskID = (IObjectPK) relayTaskIDList.get(0);
+                            paramMap.put("RELAYTASK", relayTaskID.toString());//前置任务id
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        throw new BOSException("人员报税信息报送_人员信息报送报错: " + e.getMessage());
+                    }
+                }
+                //获取所得项目等于正常薪金工资的分录id
+                String taxSpeAddDedEntryIds = this.getTaxSpeAddDedEntryIds(list);
+                String reportTaskId = null;
+                //2.专项附加扣除申报_申报
+                if (TaxCalTaskCatalogEnum.CAL == catalog && taxSpeAddDedEntryIds.length() > 0) {
+                    paramMap.put("TaxPersonRecordEntryIDS", taxSpeAddDedEntryIds);
+                    try {
+                        //专项附加扣除申报_申报
+                        String jsonString = objectMapper.writeValueAsString(paramMap);
+                        logger.info("专项附加扣除申报_申报 参数: " + jsonString);
+                        List relayTaskIDList = TaxSpeAddDedReportExFacadeFactory.getLocalInstance(ctx).report(paramMap);
+                        if (null != relayTaskIDList && relayTaskIDList.size() == 1) {
+                            reportTaskId = (String) relayTaskIDList.get(0);
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        throw new BOSException("专项附加扣除申报_申报提交任务报错: " + e.getMessage());
+                    }
+                }
+                //3.税款计算
+                String calTaxTaskId = null;
+                try {
+                    String jsonString = objectMapper.writeValueAsString(paramMap);
+                    logger.info("税款计算 参数: " + jsonString);
+                    calTaxTaskId = SYUtilsFacadeFactory.getLocalInstance(ctx).addTask(
+                            "calTaxService",
+                            jsonString,
+                            TaskCatalogEnum.CAL,
+                            reportTaskId);
+                } catch (JsonProcessingException e) {
+                    e.printStackTrace();
+                    throw new BOSException("税款计算提交任务报错: " + e.getMessage());
+                }
+            }
+            return null;
+        }
+    }
+
+    /**
+     * 获取所得项目等于正常薪金工资的分录id
+     *
+     * @param list
+     * @return
+     */
+    private String getTaxSpeAddDedEntryIds(List<TaxCalBasicVO> list) {
+        StringBuilder entryIds = new StringBuilder();
+        for (TaxCalBasicVO vo : list) {
+            //所得项目等于正常薪金工资
+            if ("8r0AAABCg2PDiOoP".equals(vo.getIncomeItemId())) {
+                if (entryIds.length() > 0) {
+                    entryIds.append(",");
+                }
+                entryIds.append("'").append(vo.getEntryId()).append("'");
+            }
+        }
+        return entryIds.toString();
+    }
+
+    /**
+     * 获取个税项目
+     *
+     * @param ctx
+     */
+    private void initTaxItem(Context ctx) {
+        this.allTaxItemList = new ArrayList();
+        this.sumTaxList = new ArrayList();
+        //获取所有个税项目
+        TaxItemCollection itemColl = TaxItemUtil.getAllTaxItem(ctx, false);
+        for (int i = 0; i < itemColl.size(); ++i) {
+            TaxItemInfo info = itemColl.get(i);
+            this.allTaxItemList.add("T" + info.getFieldSn());
+            boolean isSum = info.isIsSum();
+            if (isSum) {
+                this.sumTaxList.add("T" + info.getFieldSn());
+            }
+        }
+    }
+
+    /**
+     * 更新数据状态为已废弃
+     *
+     * @param ctx
+     * @param initIds
+     * @throws BOSException
+     */
+    private void updateLastTaskDetail(Context ctx, String initIds) throws BOSException {
+        //税款计算提交算税任务数据记录表 更新数据状态为已废弃
+        String str = " UPDATE T_HR_STAXCALTASKDETAIL A01 SET FDATASTATE = 30 " +
+                "WHERE EXISTS (" +
+                "SELECT 1 FROM T_HR_STAXCALINITDETAIL A02  WHERE FID IN (" + initIds + ") " +
+                "AND A01.FCMPCALTABLEID = A02.FCMPCALTABLEID AND A01.fIncomeItemId = A02.fIncomeItemId) " + "   AND A01.FDATASTATE = " + 10;
+        DbUtil.execute(ctx, str);
+    }
+
+    private String getInsertTaskDetailSql() {
+        StringBuilder str = new StringBuilder();
+        StringBuilder itemStr = new StringBuilder();
+        Iterator i$ = this.allTaxItemList.iterator();
+
+        while (i$.hasNext()) {
+            String s = (String) i$.next();
+            str.append(s).append(",");
+            itemStr.append(",?");
+        }
+
+        String taxItems = str.substring(0, str.length() - 1);
+        str = new StringBuilder();
+        str.append(" INSERT INTO T_HR_STAXCALTASKDETAIL(FID, FCALTASKID, FRELAYID, FCMPCALTABLEID, FPERSONID, ");
+        str.append(" FTAXUNITID, FPERIODBEGIN, FPERIODEND, FINCOMEITEMID, FACCEPTID, ");
+        str.append(" FCREATORID, FCREATETIME, FLASTUPDATEUSERID, FLASTUPDATETIME,FDataState, ").append(taxItems);
+        str.append(" )");
+        str.append(" values(?, ?, ?, ?, ?, ");
+        str.append(" ?, ?, ?, ?, ?, ");
+        str.append(" ?, ?, ?, ?, ? ");
+        str.append(itemStr);
+        str.append(")");
+        return str.toString();
+    }
+
+    private List<Object[]> getParamListData(Context ctx, String initIds) throws BOSException {
+        List<Object[]> paramsList = new ArrayList();
+        StringBuilder str = new StringBuilder();
+        Iterator i$ = this.allTaxItemList.iterator();
+
+        while (i$.hasNext()) {
+            String s = (String) i$.next();
+            str.append(",").append(s);
+        }
+
+        String taxItem = str.toString();
+        if (!this.isDelete) {
+            this.getSubmittedData(ctx, initIds);
+        }
+
+        Set<String> personSet = new HashSet();
+        str = new StringBuilder();
+        str.append(" SELECT FCMPCALTABLEID, FPERSONID, FTAXUNITID, FPERIODBEGIN, FPERIODEND, ");
+        str.append(" FINCOMEITEMID,FID,fAcceptId ").append(taxItem);
+        str.append(" FROM T_HR_STAXCALINITDETAIL ");
+        str.append(" WHERE FID IN (").append(initIds).append(")");
+        str.append(" ORDER BY FTAXUNITID, FINCOMEITEMID, FPERSONID, FCREATETIME ");
+        IRowSet rowSet = DbUtil.executeQuery(ctx, str.toString());
+
+        try {
+            while (rowSet.next()) {
+                String taxUnitId = rowSet.getString("FTAXUNITID");
+                String incomeItemId = rowSet.getString("FINCOMEITEMID");
+                String personId = rowSet.getString("FPERSONID");
+                String personKey = this.getPersonKey(taxUnitId, incomeItemId, personId);
+                if (!personSet.contains(personKey)) {
+                    personSet.add(personKey);
+                    String taskId = (String) this.taskMap.get(taxUnitId);
+                    Object[] param = this.sumLastData(rowSet, personKey, taskId);
+                    paramsList.add(param);
+                }
+            }
+        } catch (SQLException var14) {
+            logger.error(var14);
+        }
+
+        return paramsList;
+    }
+
+    /**
+     * @param ctx
+     * @param initIds
+     * @throws BOSException
+     */
+    private void updateTaxCalInitData(Context ctx, String initIds) throws BOSException {
+        //个税应用+税款计算初算明细表 处理中
+        String sql = "UPDATE T_HR_STAXCALINITDETAIL SET FSTATE = 30 WHERE FID IN (" + initIds + ")  ";
+        DbUtil.execute(ctx, sql);
+    }
+
+    private Object[] sumLastData(IRowSet rowSet, String personKey, String taskId) throws SQLException {
+        Timestamp createTime = new Timestamp(System.currentTimeMillis());
+        Map<String, Object> rowMap = new HashMap();
+        if (this.dataMap.containsKey(personKey)) {
+            rowMap = (Map) this.dataMap.get(personKey);
+            Iterator i$ = this.sumTaxList.iterator();
+
+            while (i$.hasNext()) {
+                String taxItem = (String) i$.next();
+                BigDecimal detail = null == rowSet.getBigDecimal(taxItem) ? BigDecimal.ZERO : rowSet.getBigDecimal(taxItem);
+                BigDecimal sum = null == ((Map) rowMap).get(taxItem) ? BigDecimal.ZERO : (BigDecimal) ((Map) rowMap).get(taxItem);
+                ((Map) rowMap).put(taxItem, detail.add(sum));
+            }
+        }
+
+        Object[] param = new Object[15 + this.allTaxItemList.size()];
+        param[0] = BOSUuid.create("01CB8082").toString();
+        param[1] = taskId;
+        param[2] = ((Map) rowMap).get("FCMPCALTABLEID");
+        param[3] = rowSet.getString("FCMPCALTABLEID");
+        param[4] = rowSet.getString("FPERSONID");
+        param[5] = rowSet.getString("FTAXUNITID");
+        param[6] = rowSet.getDate("FPERIODBEGIN");
+        param[7] = rowSet.getDate("FPERIODEND");
+        param[8] = rowSet.getString("FINCOMEITEMID");
+        param[9] = rowSet.getString("fAcceptId");
+        param[10] = this.userId;
+        param[11] = createTime;
+        param[12] = this.userId;
+        param[13] = createTime;
+        param[14] = this.isDelete ? 20 : 10;
+
+        String item;
+        int index;
+        for (Iterator i$ = this.allTaxItemList.iterator(); i$.hasNext(); param[15 + index] = ((Map) rowMap).containsKey(item) ? ((Map) rowMap).get(item) : rowSet.getObject(item)) {
+            item = (String) i$.next();
+            index = this.allTaxItemList.indexOf(item);
+        }
+        return param;
+    }
+
+    /**
+     * @param ctx
+     * @param initIds 明细id
+     * @throws BOSException
+     */
+    private void getSubmittedData(Context ctx, String initIds) throws BOSException {
+        if (null != this.sumTaxList && !this.sumTaxList.isEmpty()) {
+            StringBuilder str = new StringBuilder();
+
+            String taxItem;
+            for (Iterator i$ = this.sumTaxList.iterator(); i$.hasNext(); str.append("SUMDATA.").append(taxItem)) {
+                taxItem = (String) i$.next();
+                if (str.length() > 0) {
+                    str.append(",");
+                }
+            }
+
+            String sumItems = str.toString();
+            str = new StringBuilder();
+            str.append(" SELECT SUMDATA.FPERSONID, SUMDATA.FTAXUNITID, SUMDATA.FINCOMEITEMID,SUMDATA.FCMPCALTABLEID, ").append(sumItems);
+            //税款计算提交算税任务数据记录表
+            str.append(" FROM T_HR_STAXCALTASKDETAIL SUMDATA ");
+            //个税应用+税款计算初算明细表
+            str.append(" INNER JOIN T_HR_STAXCALINITDETAIL INIT ON SUMDATA.FCMPCALTABLEID = INIT.FCMPCALTABLEID and SUMDATA.fIncomeItemId = INIT.fIncomeItemId AND INIT.FSTATE = ");
+            str.append(40);
+            //个税所得项目
+            str.append(" INNER JOIN T_HR_STAXINCOMEITEM INCOMEITEM ON SUMDATA.FINCOMEITEMID =  INCOMEITEM.FID ");
+            str.append(" WHERE EXISTS( ");
+            //个税应用+税款计算初算明细表
+            str.append(" SELECT 1 FROM T_HR_STAXCALINITDETAIL DETAIL ");
+            str.append(" WHERE DETAIL.FID IN (").append(initIds).append(") ");
+            str.append(" AND INIT.FPERSONID = DETAIL.FPERSONID AND INIT.FTAXUNITID = DETAIL.FTAXUNITID ");
+            str.append(" AND INIT.FINCOMEITEMID = DETAIL.FINCOMEITEMID AND INIT.FPERIODBEGIN = DETAIL.FPERIODBEGIN) ");
+            str.append(" AND SUMDATA.FDATASTATE = ").append(10);
+            str.append(" AND INCOMEITEM.FTAXCALMETHOD = ").append(10);
+            str.append(" ORDER BY SUMDATA.FPERSONID, SUMDATA.FTAXUNITID, SUMDATA.FINCOMEITEMID, SUMDATA.FCREATETIME DESC ");
+            IRowSet rowSet = DbUtil.executeQuery(ctx, str.toString());
+
+            try {
+                while (rowSet.next()) {
+                    this.combineRowData(rowSet);
+                }
+            } catch (SQLException var7) {
+                var7.printStackTrace();
+            }
+
+        }
+    }
+
+    /**
+     * 获取未报送或报送失败人员的分录id字符串
+     *
+     * @param list
+     */
+    private String getNotReportedPersonIds(List<TaxCalBasicVO> list) {
+        StringBuilder notReported = new StringBuilder();
+        for (TaxCalBasicVO vo : list) {
+            //人员报送状态
+            String submitStatus = vo.getSubmitStatus();
+            //未报送或报送失败
+            if ("0".equals(submitStatus) || "3".equals(submitStatus)) {
+                if (notReported.length() > 0) {
+                    notReported.append(",");
+                }
+                notReported.append("'").append(vo.getEntryId()).append("'");
+            }
+        }
+        return notReported.toString();
+    }
+
+    private String getPersonKey(String taxUnitId, String incomeItemId, String personId) {
+        return taxUnitId + "_" + incomeItemId + "_" + personId;
+    }
+
+
+    /**
+     * 组装数据
+     *
+     * @param rowSet
+     */
+    private void combineRowData(IRowSet rowSet) {
+        Map<String, Object> rowMap = new HashMap();
+        String key = null;
+
+        try {
+            //纳税单位id-个税所得项目id-人员id
+            key = this.getPersonKey(rowSet.getString("FTAXUNITID"), rowSet.getString("FINCOMEITEMID"), rowSet.getString("FPERSONID"));
+            if (this.dataMap.containsKey(key)) {
+                return;
+            }
+
+            Iterator i$ = this.sumTaxList.iterator();
+
+            while (i$.hasNext()) {
+                String taxItem = (String) i$.next();
+                rowMap.put(taxItem, rowSet.getBigDecimal(taxItem));
+            }
+
+            rowMap.put("FCMPCALTABLEID", rowSet.getString("FCMPCALTABLEID"));
+        } catch (SQLException var6) {
+            var6.printStackTrace();
+        }
+
+        this.dataMap.put(key, rowMap);
+    }
+}

+ 30 - 0
src/com/kingdee/eas/custom/shuiyou/taxCal/TaxCalFacadeFactory.java

@@ -0,0 +1,30 @@
+package com.kingdee.eas.custom.shuiyou.taxCal;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.BOSObjectFactory;
+import com.kingdee.bos.util.BOSObjectType;
+import com.kingdee.bos.Context;
+
+public class TaxCalFacadeFactory
+{
+    private TaxCalFacadeFactory()
+    {
+    }
+    public static com.kingdee.eas.custom.shuiyou.taxCal.ITaxCalFacade getRemoteInstance() throws BOSException
+    {
+        return (com.kingdee.eas.custom.shuiyou.taxCal.ITaxCalFacade)BOSObjectFactory.createRemoteBOSObject(new BOSObjectType("74192D98") ,com.kingdee.eas.custom.shuiyou.taxCal.ITaxCalFacade.class);
+    }
+    
+    public static com.kingdee.eas.custom.shuiyou.taxCal.ITaxCalFacade getRemoteInstanceWithObjectContext(Context objectCtx) throws BOSException
+    {
+        return (com.kingdee.eas.custom.shuiyou.taxCal.ITaxCalFacade)BOSObjectFactory.createRemoteBOSObjectWithObjectContext(new BOSObjectType("74192D98") ,com.kingdee.eas.custom.shuiyou.taxCal.ITaxCalFacade.class, objectCtx);
+    }
+    public static com.kingdee.eas.custom.shuiyou.taxCal.ITaxCalFacade getLocalInstance(Context ctx) throws BOSException
+    {
+        return (com.kingdee.eas.custom.shuiyou.taxCal.ITaxCalFacade)BOSObjectFactory.createBOSObject(ctx, new BOSObjectType("74192D98"));
+    }
+    public static com.kingdee.eas.custom.shuiyou.taxCal.ITaxCalFacade getLocalInstance(String sessionID) throws BOSException
+    {
+        return (com.kingdee.eas.custom.shuiyou.taxCal.ITaxCalFacade)BOSObjectFactory.createBOSObject(sessionID, new BOSObjectType("74192D98"));
+    }
+}

+ 188 - 0
websrc/com/kingdee/eas/custom/shuiyou/taxCal/inter/InterInitDynamicListHandlerEx.java

@@ -0,0 +1,188 @@
+package com.kingdee.eas.custom.shuiyou.taxCal.inter;
+
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.util.EASResource;
+import com.kingdee.eas.custom.shuiyou.taxCal.TaxCalFacadeFactory;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsBody;
+import com.kingdee.shr.base.syssetting.api.bean.BatchMessageTipsHeader;
+import com.kingdee.shr.base.syssetting.context.SHRContext;
+import com.kingdee.shr.base.syssetting.exception.SHRWebException;
+import com.kingdee.shr.base.syssetting.exception.ShrWebBizException;
+import com.kingdee.shr.compensation.app.tax.IsAllowedQuoted;
+import com.kingdee.shr.compensation.app.tax.TaxUnitCollection;
+import com.kingdee.shr.compensation.app.tax.TaxUnitFactory;
+import com.kingdee.shr.compensation.app.tax.TaxUnitInfo;
+import com.kingdee.shr.compensation.app.taxCal.TaxCalInitDetailStateEnum;
+import com.kingdee.shr.compensation.app.taxCal.TaxCalTaskCatalogEnum;
+import com.kingdee.shr.compensation.exception.ExceptionHandle;
+import com.kingdee.shr.compensation.util.CmpStrUtil;
+import com.kingdee.shr.compensation.web.handler.taxCal.inter.InterInitDynamicListHandler;
+import com.kingdee.util.StringUtils;
+import org.springframework.ui.ModelMap;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;;
+import java.text.MessageFormat;
+import java.util.*;
+
+/**
+ * @Description 税款计算_初算数据ListHandler扩展
+ * @Date 2024/8/30 13:59
+ * @Created by Heyuan
+ */
+public class InterInitDynamicListHandlerEx extends InterInitDynamicListHandler {
+    /**
+     * 接口算税
+     *
+     * @param request
+     * @param response
+     * @param modelMap
+     * @throws SHRWebException
+     */
+    public void calTaxAction(HttpServletRequest request,
+                             HttpServletResponse response,
+                             ModelMap modelMap) throws SHRWebException {
+        Context ctx = SHRContext.getInstance().getContext();
+        String filterSql = this.getFilterSql(request, response, modelMap);
+        List<String> allIdList = new ArrayList();
+        BatchMessageTipsHeader header = new BatchMessageTipsHeader();
+        int sucsess = 0;
+        int fail = 0;
+        int count = 0;
+        java.sql.Date periodBegin = null;
+        StringBuilder str = new StringBuilder();
+        str.append(" SELECT DETAIL.FID ID,detail.FTaxUnitID, DETAIL.FSTATE, DETAIL.FPERIODEND, DETAIL.FINCOMEITEMID,RECORD.FID RECORDID, ENTRY.FID ENTRYID,ENTRY.FACCEPTID FACCEPTID,ENTRY.FSUBMITSTATUS, ENTRY.FEMPLOYEDDATE, ");
+        str.append(" PERSON.FNAME_L2 NAME, PERSON.FNUMBER PERNUMBER, DETAIL.FPERIODBEGIN, ti.fName_l2 incomeItemName, detail.fPersonId, config.fState confirmState, config.fIsLast ");
+        //个税应用+税款计算初算明细表
+        str.append(" FROM t_hr_sTaxCalInitDetail DETAIL ");
+        //个税应用+税款计算最终拆分明细表
+        str.append(" left join t_hr_sTaxCalConfigDetail config ON DETAIL.fCmpCalTableId = config.fCmpCalTableId and DETAIL.fIncomeItemId = config.fIncomeItemId ");
+        //人员
+        str.append(" INNER JOIN T_BD_PERSON PERSON ON DETAIL.FPERSONID = PERSON.FID ");
+        //人员报税
+        str.append(" LEFT JOIN T_HR_STAXPERSONRECORD RECORD ON RECORD.FPERSONID = PERSON.FID ");
+        //个税所得项目
+        str.append(" LEFT JOIN t_hr_sTaxIncomeItem ti ON DETAIL.fIncomeItemId = ti.fid ");
+        //任职受雇从业信息分录
+        str.append(" LEFT JOIN T_HR_STAXPERSONRECORDENTRY ENTRY ON DETAIL.FPERSONID = ENTRY.FPERSONID ");
+        str.append(" AND detail.FTaxUnitID = entry.FTaxUnitID ");
+        str.append(" WHERE DETAIL.FID IN (").append(filterSql).append(")");
+        Map<String, Set<String>> personMap = new HashMap();
+        ArrayList speAddParams = new ArrayList();
+        try {
+            String sql = "select id,isAutoDeduct where id in(select FTaxUnitID from T_HR_STAXCALINITDETAIL where fid in (" + filterSql + "))";
+            TaxUnitCollection taxUnitCollection = TaxUnitFactory.getLocalInstance(ctx).getTaxUnitCollection(sql);
+            Set<String> autoDeductTaxUnit = new HashSet();
+            if (null != taxUnitCollection && taxUnitCollection.size() > 0) {
+                int i = 0;
+                for (int size = taxUnitCollection.size(); i < size; ++i) {
+                    TaxUnitInfo taxUnitInfo = taxUnitCollection.get(i);
+                    IsAllowedQuoted isAutoDeduct = taxUnitInfo.getIsAutoDeduct();
+                    if (1 == isAutoDeduct.getValue()) {
+                        autoDeductTaxUnit.add(taxUnitInfo.getId().toString());
+                    }
+                }
+            }
+            IRowSet rowSet1 = DbUtil.executeQuery(ctx, str.toString());
+            while (rowSet1.next()) {
+                if (count == 0) {
+                    //周期开始
+                    periodBegin = rowSet1.getDate("FPERIODBEGIN");
+                }
+                ++count;
+                if (null != periodBegin && !periodBegin.equals(rowSet1.getDate("FPERIODBEGIN"))) {
+                    throw new ShrWebBizException(EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label69", ctx.getLocale()));
+                }
+                boolean isSuccess = true;
+                boolean isAutoDeductBoolean = autoDeductTaxUnit.contains(rowSet1.getString("FTaxUnitID"));
+                String incomeItemID = rowSet1.getString("FINCOMEITEMID");
+                String personId = rowSet1.getString("fPersonId");
+                String taxUnitId = rowSet1.getString("fTaxUnitId");
+                String msg = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label70", ctx.getLocale());
+                BatchMessageTipsBody body = new BatchMessageTipsBody();
+                body.setId(rowSet1.getString("ID"));
+                if (StringUtils.isEmpty(rowSet1.getString("RECORDID"))) {
+                    isSuccess = false;
+                    msg = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label71", ctx.getLocale());
+                } else if (StringUtils.isEmpty(rowSet1.getString("ENTRYID"))) {
+                    isSuccess = false;
+                    msg = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label72", ctx.getLocale());
+                } else if (30 == rowSet1.getInt("FSTATE")) {
+                    isSuccess = false;
+                    msg = MessageFormat.format(EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label73", ctx.getLocale()), TaxCalInitDetailStateEnum.getEnum(rowSet1.getInt("FSTATE")).getAlias());
+                } else if (20 == rowSet1.getInt("confirmState")) {
+                    isSuccess = false;
+                    msg = "计算失败,该员工税款计算-结果数据已确认,不能重复计算";
+                } else if (rowSet1.getInt("fIsLast") == 0 && rowSet1.getInt("confirmState") != 0) {
+                    isSuccess = false;
+                    msg = "计算失败,该核算数据之后产生了新的算税任务,请先依次删除算税数据后再重算或者选择最后一条数据进行计算";
+                } else if (rowSet1.getDate("FPERIODEND").before(rowSet1.getDate("FEMPLOYEDDATE"))) {
+                    isSuccess = false;
+                    msg = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label77", ctx.getLocale());
+                } else if ("1".equals(rowSet1.getString("FSubmitStatus")) && StringUtils.isEmpty(rowSet1.getString("FAcceptId"))) {
+                    isSuccess = false;
+                    msg = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label75", ctx.getLocale());
+                } else if (null == rowSet1.getDate("FEMPLOYEDDATE")) {
+                    isSuccess = false;
+                    msg = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label76", ctx.getLocale());
+                } else if ("0".equals(rowSet1.getString("FSubmitStatus")) || "3".equals(rowSet1.getString("FSubmitStatus"))) {
+                    if (isAutoDeductBoolean && "8r0AAABCg2PDiOoP".equals(incomeItemID)) {
+                        msg = "该员工未进行人员报送,已同时生成人员报送任务、专项附加扣除申报任务和税款计算任务到税友系统,需要等待几分钟,可在任务执行监控中查看运行进度";
+                    } else {
+                        msg = EASResource.getString("com.kingdee.shr.compensation.resource.CommonResource", "label74", ctx.getLocale());
+                    }
+                }
+                if (isSuccess) {
+                    ++sucsess;
+                    String key = taxUnitId + "_" + personId + "_" + incomeItemID;
+                    //个税应用+税款计算初算明细表id
+                    String initId = rowSet1.getString("ID");
+                    //添加map数据
+                    this.addPersonMap(key, personMap, initId);
+                    Object[] param = new Object[]{taxUnitId, personId};
+                    speAddParams.add(param);
+                } else {
+                    ++fail;
+                }
+                body.setMuitTipsState(isSuccess);
+                body.setMuitTipsMessage(msg);
+                List<Object> messageListExt = new ArrayList();
+                messageListExt.add(rowSet1.getString("NAME"));
+                messageListExt.add(rowSet1.getString("PERNUMBER"));
+                messageListExt.add(rowSet1.getString("incomeItemName"));
+                body.addMessageListExt(messageListExt);
+                header.addResult(body);
+                allIdList.add(rowSet1.getString("ID"));
+            }
+        } catch (Exception var30) {
+            ExceptionHandle.handleException(var30);
+        }
+        header.setBillId(CmpStrUtil.convertListToString(allIdList));
+        header.setFailureCount(fail);
+        header.setSuccessCount(sucsess);
+        try {
+            //
+            this.removeSpecialAdditionalDeduction(ctx, modelMap, speAddParams, periodBegin);
+            Set<String> initIds = new HashSet();
+            Map.Entry entry;
+            for (Iterator i$ = personMap.entrySet().iterator(); i$.hasNext(); initIds.addAll((Collection) entry.getValue())) {
+                entry = (Map.Entry) i$.next();
+                if (initIds.size() >= 600) {
+                    //算税数据拼装facade,提交初始数据
+                    TaxCalFacadeFactory.getLocalInstance(ctx).submitInitData(CmpStrUtil.converCollectionToSql(initIds), (String) null, TaxCalTaskCatalogEnum.CAL);
+                    //SYUtilsFacadeFactory.getLocalInstance(ctx).post()
+                    initIds = new HashSet();
+                }
+            }
+            if (!initIds.isEmpty()) {
+                TaxCalFacadeFactory.getLocalInstance(ctx).submitInitData(CmpStrUtil.converCollectionToSql(initIds), (String) null, TaxCalTaskCatalogEnum.CAL);
+            }
+        } catch (BOSException var29) {
+            ExceptionHandle.handleException(var29);
+        }
+        this.writeSuccessData(header);
+    }
+}

+ 889 - 0
websrc/com/kingdee/eas/custom/shuiyou/taxCal/service/CalTaxService.java

@@ -0,0 +1,889 @@
+package com.kingdee.eas.custom.shuiyou.taxCal.service;
+
+import cn.com.servyou.dto.ApiResponse;
+import cn.com.servyou.dto.AsyncResult;
+import cn.com.servyou.dto.tax.*;
+import cn.com.servyou.rmi.client.ClientProxyFactory;
+import cn.com.servyou.service.TaxRequest;
+import com.fasterxml.jackson.databind.ObjectMapper;
+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.eas.common.EASBizException;
+import com.kingdee.eas.custom.shuiyou.interfacelog.ILogInfo;
+import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoFactory;
+import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoInfo;
+import com.kingdee.eas.custom.shuiyou.task.MessageResult;
+import com.kingdee.eas.custom.shuiyou.task.TaskCatalogEnum;
+import com.kingdee.eas.custom.shuiyou.uitls.SYUtilsFacadeFactory;
+import com.kingdee.eas.custom.shuiyou.utils.ClientProxyFactoryUtils;
+import com.kingdee.eas.hr.base.PositionTypeEnum;
+import com.kingdee.eas.hr.rec.GenderEnum;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.compensation.CardTypeEnum;
+import com.kingdee.shr.compensation.EmployedTypeEnum;
+import com.kingdee.shr.compensation.PersonStatusEnum;
+import com.kingdee.shr.compensation.app.incomeTax.EmploymentSituationEnum;
+import com.kingdee.shr.compensation.app.tax.TaxUnitFactory;
+import com.kingdee.shr.compensation.app.tax.TaxUnitInfo;
+import com.kingdee.shr.compensation.util.Base64Utils;
+import com.kingdee.util.StringUtils;
+import org.apache.log4j.Logger;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @Description 税款计算
+ * @Date 2024/9/2 14:30
+ * @Created by Heyuan
+ */
+public class CalTaxService implements IHRMsfService {
+    private static Logger logger = Logger.getLogger(CalTaxService.class);
+
+    @Override
+    public MessageResult process(Context ctx, Map paramMap) throws EASBizException, BOSException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        String taskId = null;
+        ILogInfo iLogInfo = LogInfoFactory.getLocalInstance(ctx);
+        //接口日志实体
+        LogInfoInfo logInfo = new LogInfoInfo();
+        //入口
+        logInfo.setEntrance(this.getClass().getName());
+        logInfo.setBizDate(new Date());
+        try {
+            logger.info("调用 CalTaxService, 参数 " + objectMapper.writeValueAsString(paramMap));
+            MessageResult messageResult = null;
+            String this_taskId = (String) paramMap.get("this_taskId");//任务id
+            String paramData = (String) paramMap.get("paramData");
+            Map<String, String> paramDataMap = objectMapper.readValue(paramData, Map.class);
+            String taxUnitId = paramDataMap.get("TAXUNITID");//纳税单位id
+            String period = paramDataMap.get("PERIOD");//周期yyyy-MM
+            String creator = paramDataMap.get("creator");//创建人id
+            StringBuilder errorMsg = new StringBuilder();
+            if (StringUtils.isEmpty(taxUnitId)) {
+                errorMsg.append("纳税单位id不能为空!\n");
+            }
+            if (StringUtils.isEmpty(period)) {
+                errorMsg.append("周期yyyy-MM不能为空!\n");
+            }
+            if (errorMsg.length() > 0) {
+                throw new BOSException(errorMsg.toString());
+            }
+            //客户端代理工厂
+            ClientProxyFactory clientProxyFactory = ClientProxyFactoryUtils.getClientProxyFactory();
+            TaxUnitInfo taxUnitInfo = TaxUnitFactory.getLocalInstance(ctx).getTaxUnitInfo(new ObjectUuidPK(taxUnitId));
+            //获取待计算数据
+            Map<String, List<Map<String, Object>>> caluDataMap = getCaluData(ctx, paramDataMap);
+            //算税请求接口
+            TaxRequest taxRequest = clientProxyFactory.getTaxRequest();
+            //获取请求参数
+            CalculateIndividualIncomeTaxRequest taxRequestPara = getTaxRequestParameter(taxUnitInfo, caluDataMap, period);
+            //调用异步算税接口
+            ApiResponse<AsyncResult> asyncResultApiResponse = taxRequest.calculateASynIndividualIncomeTax(taxRequestPara);
+            String status = asyncResultApiResponse.getHead().getStatus();
+            logInfo.setInterfaceAddress("/gateway/iit/calculateTax/calculateASynIndividualIncomeTax");//接口地址
+            logInfo.setInterfaceName("calculateASynIndividualIncomeTax");//接口名
+            ObjectMapper mapper = new ObjectMapper();
+            logInfo.setInParameter(mapper.writeValueAsString(taxRequestPara));//入参
+            logInfo.setOutParameter(mapper.writeValueAsString(asyncResultApiResponse));//回参
+            if ("N".equals(status)) {
+                //请求失败响应
+                String msg = asyncResultApiResponse.getHead().getMsg();
+                messageResult = MessageResult.FAILED(msg);
+                logInfo.setErrorInfo(msg);//错误信息
+                logInfo.setStatus("失败");
+            } else {
+                //调用成功
+                //请求id
+                String requestId = asyncResultApiResponse.getBody().getRequestId();
+                logInfo.setStatus("成功");
+                paramDataMap.put("requestId", requestId);
+                String backParam = mapper.writeValueAsString(paramDataMap);
+                // 创建轮询请求任务
+                taskId = SYUtilsFacadeFactory.getLocalInstance(ctx).addTask(
+                        "getASynIndividualIncomeTaxFeedback",
+                        backParam,
+                        TaskCatalogEnum.CAL_GET,
+                        "");
+                messageResult = MessageResult.SUCCESS();
+                Map map = new HashMap();
+                messageResult.setData(map);
+                map.put("taskId", taskId);
+                map.put("requestId", requestId);
+            }
+            iLogInfo.addnew(logInfo);
+            return messageResult;
+        } catch (Exception e) {
+            e.printStackTrace();
+            logInfo.setErrorInfo(e.getMessage());//错误信息
+            iLogInfo.addnew(logInfo);
+            return MessageResult.ERROR(e.getMessage());
+        }
+    }
+
+    /**
+     * 获取待计算数据
+     */
+    private Map<String, List<Map<String, Object>>> getCaluData(Context ctx, Map<String, String> paramDataMap) throws BOSException {
+        try {
+            String taxUnitId = paramDataMap.get("TAXUNITID");//纳税单位id
+            String period = paramDataMap.get("PERIOD");//周期yyyy-MM
+            String creator = paramDataMap.get("creator");//创建人id
+            String initIds = paramDataMap.get("initIds");//初算数据id
+            StringBuilder sql = new StringBuilder();
+            sql.append("SELECT ").append("\n")
+                    .append("item.fnumber AS itemNumber,").append("\n")
+                    .append("personRe.FCARDNUMBER,").append("\n")
+                    .append("personRe.FCARDTYPE,").append("\n")
+                    .append("(CASE WHEN personRe.FREPORTNAME IS NOT NULL THEN personRe.FREPORTNAME ELSE person.fname_l2 END) AS personName,").append("\n")
+                    .append("person.fnumber AS personNumber,").append("\n")
+                    .append("personRe.FPHONENUMBER,").append("\n")  // 手机号
+                    .append("personRe.FISOVERSEA,").append("\n")  // 是否境外人员
+                    .append("personRe.FGENDER,").append("\n")  // 性别
+                    .append("personRe.FBIRTHDAY,").append("\n")  // 出生日期
+                    .append("personRe.FISDISABILITY,").append("\n")  // 是否残疾
+                    .append("personRe.FDISCARDNUMBER,").append("\n")  // 残疾证号
+                    .append("personRe.FHEROCARDNUMBER,").append("\n")  // 烈属证号
+                    .append("personRe.FEMAIL,").append("\n")  // 电子邮箱
+                    .append("personRe.FCHINESENAME,").append("\n")  // 中文名
+                    .append("personRe.FISHERO,").append("\n")  // 是否烈属
+                    .append("personRe.FISOLD,").append("\n")  // 是否孤老
+                    .append("personRe.FADDRESS,").append("\n")  // 居住地省
+                    .append("personRe.FADDRESSCITY,").append("\n")  // 居住城市
+                    .append("personRe.FADDRESSCOUNTY,").append("\n")  // 居住区县
+                    .append("personRe.FADDRESSSTREET,").append("\n")  // 居住街道
+                    .append("personRe.FDESC,").append("\n")  // 备注
+                    .append("personRe.FHOMETOWN,").append("\n")  // 户籍省份
+                    .append("personRe.FHOMETOWNCITY,").append("\n")  // 户籍城市
+                    .append("personRe.FHOMETOWNCOUNTRY,").append("\n")  // 户籍区县
+                    .append("personRe.FHOMETOWNSTREET,").append("\n")  // 户籍街道
+                    .append("personRe.FHOMETOWNDETAILED,").append("\n")  // 户籍详细地址
+                    .append("personRe.FACCOUNT,").append("\n")  // 银行账号
+                    .append("personRe.FOTHERCARDTYPE,").append("\n")  // 其他证件类型
+                    .append("personRe.FOTHERCARDNUMBER,").append("\n")  // 其他证件号码
+                    .append("personRe.FTAXREASON,").append("\n")  // 涉税事项
+                    .append("personRe.FBANKCARDPROVINCE,").append("\n")  // 开户银行省份
+                    .append("bank.fname_l2 AS bankName,").append("\n")  // 开户银行
+                    .append("personRe.FCONTACTADDRESS,").append("\n")  // 联系地址_省
+                    .append("personRe.FCONTACTCITY,").append("\n")  // 联系地城市
+                    .append("personRe.FCONTACTCOUNTRY,").append("\n")  // 联系地区县
+                    .append("personRe.FCONTACTSTREET,").append("\n")  // 联系地街道
+                    .append("personRe.FCONTACTDETAILED,").append("\n")  // 联系地详细地址
+                    .append("personRe.FENTRYDATE,").append("\n")  // 首次入境时间
+                    .append("personRe.FLEAVEDATE,").append("\n")  // 预计离境时间
+                    .append("personRe.FPOSITION,").append("\n")  // 职务
+                    .append("personRe.FINVESTMENTTOTAL,").append("\n")  // 个人投资总额
+                    .append("personRe.FINVESTMENTRATE,").append("\n")  // 个人投资比例
+                    .append("birthplace.FNAME_L2 AS birthplaceName,").append("\n")  // 出生地
+                    .append("nationality.FNAME_L2 AS nationalityName,").append("\n")  // 国籍
+                    .append("diploma.fnumber AS diplomaNumber,").append("\n")  // 学历编码
+                    .append("personReEntry.FPERSONSTATUS,").append("\n")  // 人员状态
+                    .append("personReEntry.FEMPLOYEDDATE,").append("\n")  // 受雇日期
+                    .append("personReEntry.FDEPARTUREDATE,").append("\n")  // 离职日期
+                    .append("personReEntry.FEMPLOYEDTYPE,").append("\n")  // 任职受雇从业类型
+                    .append("personReEntry.FSITUATION,").append("\n")  // 就业情况
+                    .append("personReEntry.FDEDUCTFEES,").append("\n")  // 是否扣除减除费用
+                    .append("scid.t1,").append("\n")  // 当期收入额
+                    .append("scid.t2,").append("\n")  // 免税收入
+                    .append("scid.t3,").append("\n")  // 基本养老保险
+                    .append("scid.t4,").append("\n")  // 基本医疗保险
+                    .append("scid.t5,").append("\n")  // 失业保险
+                    .append("scid.t6,").append("\n")  // 住房公积金
+                    .append("scid.t12,").append("\n")  // 企业年金
+                    .append("scid.t13,").append("\n")  // 商业健康保险
+                    .append("scid.t14,").append("\n")  // 税延养老保险
+                    .append("scid.t16,").append("\n")  // 准予扣除的捐赠额
+                    .append("scid.t17,").append("\n")  // 减免税额
+                    .append("scid.t18,").append("\n")  // 允许扣除的税费
+                    .append("scid.t39,").append("\n")  // 一次性补偿
+                    .append("scid.t64,").append("\n")  // 子女教育支出
+                    .append("scid.t65,").append("\n")  // 赡养老人支出
+                    .append("scid.t66,").append("\n")  // 房屋贷款支出
+                    .append("scid.t67,").append("\n")  // 住房租金支出
+                    .append("scid.t68,").append("\n")  // 继续教育支出
+                    .append("scid.t70 ").append("\n")  // 婴幼儿照护支出
+                    .append("FROM T_HR_STaxCalInitDetail scid ").append("\n")
+                    .append("LEFT JOIN T_HR_STaxIncomeItem item ON item.fid = scid.FINCOMEITEMID ").append("\n")
+                    .append("LEFT JOIN T_HR_STaxPersonRecordentry personReEntry ON personReEntry.fPersonId = scid.fPersonId AND scid.fTaxUnitId = personReEntry.fTaxUnitId ").append("\n")
+                    .append("LEFT JOIN T_HR_STaxPersonRecord personRe ON personReEntry.FBILLID = personRe.fid ").append("\n")
+                    .append("LEFT JOIN T_BD_Person person ON person.fid = personRe.FPERSONID ").append("\n")
+                    .append("LEFT JOIN T_BD_Nationality birthplace ON birthplace.fid = personRe.FBIRTHPLACEID ").append("\n")
+                    .append("LEFT JOIN T_BD_HRDiploma diploma ON diploma.fid = personRe.FEDULEVELID ").append("\n")
+                    .append("LEFT JOIN T_HR_PBank bank ON bank.fid = personRe.FHRBANKID ").append("\n")
+                    .append("LEFT JOIN T_BD_Nationality nationality ON nationality.fid = personRe.FNATIONALITYID ").append("\n")
+                    .append("WHERE scid.FTAXUNITID = '").append(taxUnitId).append("'").append("\n")
+                    .append("AND scid.FSTATE = '30' ").append("\n")
+                    .append("AND scid.fid in(").append(initIds).append(")").append("\n");
+            logger.info("getCaluData.sql:\n" + sql);
+            IRowSet iRowSet = DbUtil.executeQuery(ctx, sql.toString());
+            Map<String, List<Map<String, Object>>> dataMap = new HashMap<>();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            while (iRowSet.next()) {
+                List<Map<String, Object>> list;
+                //所得项目编码
+                String itemNumber = iRowSet.getString("itemNumber");
+                if (dataMap.containsKey(itemNumber)) {
+                    list = dataMap.get(itemNumber);
+                } else {
+                    list = new ArrayList<>();
+                    dataMap.put(itemNumber, list);
+                }
+                Map map = new HashMap();
+                //姓名
+                map.put("personName", iRowSet.getString("personName"));
+                //工号
+                map.put("personNumber", iRowSet.getString("personNumber"));
+                //证件号码
+                map.put("cardNumber", iRowSet.getString("FCARDNUMBER"));
+                //证件类型
+                String cardType = iRowSet.getString("FCARDTYPE");
+                if (!StringUtils.isEmpty(cardType)) {
+                    CardTypeEnum anEnum = CardTypeEnum.getEnum(cardType);
+                    if (anEnum != null) {
+                        map.put("cardType", anEnum.getAlias());
+                    }
+                }
+                //人员状态
+                String personstatus = iRowSet.getString("FPERSONSTATUS");
+                if (personstatus != null) {
+                    PersonStatusEnum anEnum = PersonStatusEnum.getEnum(personstatus);
+                    if (anEnum != null) {
+                        map.put("personstatusName", anEnum.getAlias());
+                    }
+                }
+                //任职受雇从业类型
+                String employedtype = iRowSet.getString("FEMPLOYEDTYPE");
+                if (!StringUtils.isEmpty(employedtype)) {
+                    EmployedTypeEnum anEnum = EmployedTypeEnum.getEnum(employedtype);
+                    if (anEnum != null) {
+                        map.put("employedtypeName", anEnum.getAlias());
+                    }
+                }
+                //手机号码
+                map.put("phoneNumber", iRowSet.getString("FPHONENUMBER"));
+                //就业情况
+                Integer situation = iRowSet.getInt("FSITUATION");
+                if (situation != null) {
+                    EmploymentSituationEnum anEnum = EmploymentSituationEnum.getEnum(situation);
+                    if (anEnum != null) {
+                        map.put("situationName", anEnum.getAlias());
+                    }
+                }
+                //性别
+                String gender = iRowSet.getString("FGENDER");
+                if (!StringUtils.isEmpty(gender)) {
+                    GenderEnum anEnum = GenderEnum.getEnum(gender);
+                    if (anEnum != null) {
+                        map.put("gender", anEnum.getAlias());
+                    }
+                }
+                //否境外人员
+                String isoversea = iRowSet.getString("FISOVERSEA");
+                if ("1".equals(isoversea)) {
+                    map.put("isoversea", "境外");
+                } else if ("0".equals(isoversea)) {
+                    map.put("isoversea", "境内");
+                }
+                //是否残疾
+                String isdisability = iRowSet.getString("FISDISABILITY");
+                if ("1".equals(isdisability)) {
+                    map.put("isdisability", "是");
+                } else {
+                    map.put("isdisability", "否");
+                }
+                //残疾证号
+                map.put("discardnumber", iRowSet.getString("FDISCARDNUMBER"));
+                //是否烈属
+                String ishero = iRowSet.getString("FISHERO");
+                if ("1".equals(ishero)) {
+                    map.put("ishero", "是");
+                } else {
+                    map.put("ishero", "否");
+                }
+                //烈属证号
+                map.put("herocardnumber", iRowSet.getString("FHEROCARDNUMBER"));
+                //是否孤老
+                String isold = iRowSet.getString("FISOLD");
+                if ("1".equals(isold)) {
+                    map.put("isold", "是");
+                } else {
+                    map.put("isold", "否");
+                }
+                //是否扣除减除费用
+                String deductfees = iRowSet.getString("FDEDUCTFEES");
+                if ("0".equals(deductfees)) {
+                    map.put("deductfees", "是");
+                } else {
+                    map.put("deductfees", "否");
+                }
+                //职务
+                String position = iRowSet.getString("FPOSITION");
+                if (!StringUtils.isEmpty(position)) {
+                    PositionTypeEnum anEnum = PositionTypeEnum.getEnum(position);
+                    if (anEnum != null) {
+                        map.put("positionName", anEnum.getAlias());
+                    }
+                }
+                //电子邮箱
+                map.put("email", iRowSet.getString("FEMAIL"));
+                //个人投资总额
+                map.put("investmenttotal", iRowSet.getBigDecimal("FINVESTMENTTOTAL"));
+                //个人投资比例
+                map.put("investmentrate", iRowSet.getBigDecimal("FINVESTMENTRATE"));
+                //中文名
+                map.put("chinesename", iRowSet.getString("FCHINESENAME"));
+                //出生日期
+                Date birthday = iRowSet.getDate("FBIRTHDAY");
+                if (birthday != null) {
+                    map.put("birthday", sdf.format(birthday));
+                }
+                //受雇日期
+                Date employeddate = iRowSet.getDate("FEMPLOYEDDATE");
+                if (employeddate != null) {
+                    map.put("employeddate", sdf.format(employeddate));
+                }
+                //离职日期
+                Date departuredate = iRowSet.getDate("FDEPARTUREDATE");
+                if (departuredate != null) {
+                    map.put("departuredate", sdf.format(departuredate));
+                }
+                //出生地
+                map.put("birthplaceName", iRowSet.getString("birthplaceName"));
+                //学历
+                int diplomaNumber = iRowSet.getInt("diplomaNumber");
+                //todo 大学本科以下 大学本科 研究生
+                if (diplomaNumber < 6) {
+                    map.put("diploma", "大学本科以下");
+                } else if (diplomaNumber == 6) {
+                    map.put("diploma", "大学本科");
+                } else if (diplomaNumber > 6) {
+                    map.put("diploma", "研究生");
+                }
+                //开户银行省份
+                map.put("bankcardprovince", iRowSet.getString("FBANKCARDPROVINCE"));
+                //开户银行
+                map.put("bankName", iRowSet.getString("bankName"));
+                //银行账号
+                map.put("account", iRowSet.getString("FACCOUNT"));
+                //其他证件类型
+                map.put("othercardtype", iRowSet.getString("FOTHERCARDTYPE"));
+                //其他证件号码
+                map.put("othercardnumber", iRowSet.getString("FOTHERCARDNUMBER"));
+                //居住地省
+                map.put("address", iRowSet.getString("FADDRESS"));
+                //居住城市
+                map.put("addresscity", iRowSet.getString("FADDRESSCITY"));
+                //居住区县
+                map.put("addresscounty", iRowSet.getString("FADDRESSCOUNTY"));
+                //居住街道
+                map.put("addressstreet", iRowSet.getString("FADDRESSSTREET"));
+                //户籍省份
+                map.put("hometown", iRowSet.getString("FHOMETOWN"));
+                //户籍城市
+                map.put("hometowncity", iRowSet.getString("FHOMETOWNCITY"));
+                //户籍城市
+                map.put("hometowncountry", iRowSet.getString("FHOMETOWNCOUNTRY"));
+                //户籍街道
+                map.put("hometownstreet", iRowSet.getString("FHOMETOWNSTREET"));
+                //户籍详细地址
+                map.put("hometowndetailed", iRowSet.getString("FHOMETOWNDETAILED"));
+                //国籍
+                map.put("nationalityName", iRowSet.getString("nationalityName"));
+                //涉税事项
+                map.put("taxreason", iRowSet.getString("FTAXREASON"));
+                //首次入境时间
+                Date entrydate = iRowSet.getDate("FENTRYDATE");
+                if (entrydate != null) {
+                    map.put("entrydate", sdf.format(entrydate));
+                }
+                //预计离境时间
+                Date leavedate = iRowSet.getDate("FLEAVEDATE");
+                if (leavedate != null) {
+                    map.put("leavedate", sdf.format(leavedate));
+                }
+                //联系地址_省
+                map.put("contactaddress", iRowSet.getString("FCONTACTADDRESS"));
+                //联系地城市
+                map.put("contactcity", iRowSet.getString("FCONTACTCITY"));
+                //联系地区县
+                map.put("contactcountry", iRowSet.getString("FCONTACTCOUNTRY"));
+                //联系地街道
+                map.put("contactstreet", iRowSet.getString("FCONTACTSTREET"));
+                //联系地详细地址
+                map.put("contactdetailed", iRowSet.getString("FCONTACTDETAILED"));
+                //备注
+                map.put("desc", iRowSet.getString("FDESC"));
+                //本期收入
+                map.put("t1", iRowSet.getBigDecimal("t1"));
+                //本期免税收入
+                map.put("t2", iRowSet.getBigDecimal("t2"));
+                //基本养老保险
+                map.put("t3", iRowSet.getBigDecimal("t3"));
+                //基本医疗保险
+                map.put("t4", iRowSet.getBigDecimal("t4"));
+                //失业保险
+                map.put("t5", iRowSet.getBigDecimal("t5"));
+                //住房公积金
+                map.put("t6", iRowSet.getBigDecimal("t6"));
+                //企业年金
+                map.put("t12", iRowSet.getBigDecimal("t12"));
+                //商业健康保险
+                map.put("t13", iRowSet.getBigDecimal("t13"));
+                //税延养老保险
+                map.put("t14", iRowSet.getBigDecimal("t14"));
+                //准予扣除的捐赠额
+                map.put("t16", iRowSet.getBigDecimal("t16"));
+                //允许扣除的税费
+                map.put("t18", iRowSet.getBigDecimal("t18"));
+                //一次性补偿
+                map.put("t39", iRowSet.getBigDecimal("t39"));
+                //子女教育支出
+                map.put("t64", iRowSet.getBigDecimal("t64"));
+                //赡养老人支出
+                map.put("t65", iRowSet.getBigDecimal("t65"));
+                //房屋贷款支出
+                map.put("t66", iRowSet.getBigDecimal("t66"));
+                //住房租金支出
+                map.put("t67", iRowSet.getBigDecimal("t67"));
+                //继续教育支出
+                map.put("t68", iRowSet.getBigDecimal("t68"));
+                //婴幼儿照护支出
+                map.put("t70", iRowSet.getBigDecimal("t70"));
+                list.add(map);
+            }
+            return dataMap;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new BOSException("获取待计算数据报错:" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 获取请求参数
+     *
+     * @param taxUnitInfo
+     * @param caluDataMap
+     * @param period
+     * @return
+     * @throws BOSException
+     */
+    private CalculateIndividualIncomeTaxRequest getTaxRequestParameter(
+            TaxUnitInfo taxUnitInfo,
+            Map<String, List<Map<String, Object>>> caluDataMap,
+            String period) throws BOSException {
+        //异步算税参数对象
+        CalculateIndividualIncomeTaxRequest taxRequestPara = new CalculateIndividualIncomeTaxRequest();
+        //随机id
+        String bizNo = UUID.randomUUID().toString();
+        //外部业务订单号*
+        taxRequestPara.setBizNo(bizNo);
+        //企业名称*
+        taxRequestPara.setName(taxUnitInfo.getName());
+        //taxRequestPara.setName("荆州九州通医药有限公司00");
+        //税号*
+        taxRequestPara.setTaxNo(taxUnitInfo.getTaxNumber());
+        //taxRequestPara.setTaxNo("91310124834931897I");
+        //行政区划代码*
+        taxRequestPara.setArea(taxUnitInfo.getAreaCode());
+        //taxRequestPara.setArea("310101");
+        //登记序号
+        taxRequestPara.setRegistrationNumber(taxUnitInfo.getRegNumber());
+        //taxRequestPara.setRegistrationNumber("10117310124834931897");
+        //部门编号
+        //taxRequestPara.setDeptNo("");
+        //部门名称
+        //taxRequestPara.setDeptName("");
+        //税款所属期YYYYMM*
+        taxRequestPara.setMonth(period.replace("-", ""));
+        //实名账号
+        //taxRequestPara.setRealNameAccount();
+        //实名密码
+        //taxRequestPara.setRealNamePassword();
+        //加密实名密码
+        //taxRequestPara.setEncryptedRealNamePassword();
+        //申报密码
+        //taxRequestPara.setDeclarePassword("Aa123456");
+        String declPassword = taxUnitInfo.getDeclPassword();
+        if (StringUtils.isEmpty(declPassword)) {
+            throw new BOSException("申报密码不能为空!");
+        }
+        taxRequestPara.setDeclarePassword(Base64Utils.decode(declPassword));
+        //加密申报密码
+        //taxRequestPara.setEncryptedDeclarePassword();
+        //密码类型*
+        taxRequestPara.setPasswordType("0");
+        //综合所得
+        //综合所得对象
+        ComplexIncomeRequest complexIncomeRequest = new ComplexIncomeRequest();
+        taxRequestPara.setComplexIncomeRequest(complexIncomeRequest);
+        //是否离线算薪
+        //complexIncomeRequest.setIsOffLineCalculateTax();
+        //减免方式
+        //complexIncomeRequest.setDeductionMode();
+        //减免比例
+        //complexIncomeRequest.setRatio();
+        //减免限额
+        //complexIncomeRequest.setLimitAmount();
+        //正常工资薪金对象
+        NormalSalarySpecIncome normalSalarySpecIncome = getNormalSalarySpecIncome(caluDataMap);
+        complexIncomeRequest.setNormalSalarySpecIncome(normalSalarySpecIncome);
+        //全年一次性奖金收入列表
+        List<ComplexIncome> annualOneTimeBonusIncomeList = getAnnualOneTimeBonusIncomeList(caluDataMap);
+        complexIncomeRequest.setAnnualOneTimeBonusIncome(annualOneTimeBonusIncomeList);
+        //一般劳务报酬所得列表
+        List<ComplexIncome> laborRemunerationIncome = getLaborRemunerationIncome(caluDataMap);
+        complexIncomeRequest.setLaborRemunerationIncome(laborRemunerationIncome);
+        //解除劳动合同一次性补偿金列表
+        List<ComplexIncome> compensateIncome = getCompensateIncome(caluDataMap);
+        complexIncomeRequest.setCompensateIncome(compensateIncome);
+        return taxRequestPara;
+    }
+
+    /**
+     * 解除劳动合同一次性补偿金列表
+     *
+     * @param caluDataMap
+     * @return
+     */
+    private List<ComplexIncome> getCompensateIncome(
+            Map<String, List<Map<String, Object>>> caluDataMap) {
+        List<ComplexIncome> compensateIncome = new ArrayList<ComplexIncome>();
+        List<Map<String, Object>> list = caluDataMap.get("jcldhtlb");
+        for (int i = 0; list != null && i < list.size(); i++) {
+            //个税应用+税款计算初算明细表
+            Map<String, Object> map = list.get(i);
+            ComplexIncome complexIncome = new ComplexIncome();
+            //姓名*
+            complexIncome.setName((String) map.get("personName"));
+            //证件类型名称*
+            complexIncome.setLicenseType((String) map.get("cardType"));
+            //证件号码*
+            complexIncome.setLicenseNumber((String) map.get("cardNumber"));
+            //当期收入额*  一次性补偿
+            complexIncome.setIncome((BigDecimal) map.get("t39"));
+            //免税收入
+            complexIncome.setExemptIncome((BigDecimal) map.get("t2"));
+            //其他
+            //complexIncome.setOther(BigDecimal.ZERO);
+            //减免税额      无
+            complexIncome.setTaxDeduction((BigDecimal) map.get("t17"));
+            //备注
+            //complexIncome.setRemark("");
+            //所得项目名称*
+            complexIncome.setIncomeItemName("一般劳务报酬所得");
+            //准予扣除的捐赠额      无
+            complexIncome.setDeductibleDonation((BigDecimal) map.get("t16"));
+            compensateIncome.add(complexIncome);
+        }
+        return compensateIncome;
+    }
+
+    /**
+     * 一般劳务报酬所得列表
+     *
+     * @param caluDataMap
+     * @return
+     */
+    private List<ComplexIncome> getLaborRemunerationIncome(Map<String, List<Map<String, Object>>> caluDataMap) {
+        List<ComplexIncome> laborRemunerationIncome = new ArrayList<>();
+        List<Map<String, Object>> list = caluDataMap.get("lwbclb");
+        for (int i = 0; list != null && i < list.size(); i++) {
+            Map<String, Object> map = list.get(i);
+            ComplexIncome complexIncome = new ComplexIncome();
+            //姓名*
+            complexIncome.setName((String) map.get("personName"));
+            //证件类型名称*
+            complexIncome.setLicenseType((String) map.get("cardType"));
+            //证件号码*
+            complexIncome.setLicenseNumber((String) map.get("cardNumber"));
+            //是否明细申报
+            //complexIncome.setIsDetailedDeclaration("");
+            //当期收入额*
+            complexIncome.setIncome((BigDecimal) map.get("t1"));
+            //免税收入
+            complexIncome.setExemptIncome((BigDecimal) map.get("t2"));
+            //商业健康保险
+            complexIncome.setCommercialHealthInsurance((BigDecimal) map.get("t13"));
+            //税延养老保险
+            complexIncome.setExtensionEndowmentInsurance((BigDecimal) map.get("t14"));
+            //其他
+            //complexIncome.setOther(BigDecimal.ZERO);
+            //减免税额
+            complexIncome.setTaxDeduction((BigDecimal) map.get("t17"));
+            //备注
+            //complexIncome.setRemark("");
+            //减除费用
+            // complexIncome.setDeductionAmount(BigDecimal.ZERO);
+            //应纳税额
+            //complexIncome.setPayableAmount(BigDecimal.ZERO);
+            //税率
+            //complexIncome.setTaxRate(BigDecimal.ZERO);
+            //所得项目名称*
+            complexIncome.setIncomeItemName("一般劳务报酬所得");
+            //允许扣除的税费
+            complexIncome.setTaxDeductible((BigDecimal) map.get("t18"));
+            laborRemunerationIncome.add(complexIncome);
+        }
+        return laborRemunerationIncome;
+    }
+
+
+    /**
+     * 全年一次性奖金收入列表
+     *
+     * @return
+     */
+    private List<ComplexIncome> getAnnualOneTimeBonusIncomeList(
+            Map<String, List<Map<String, Object>>> caluDataMap) {
+        List<ComplexIncome> annualOneTimeBonusIncome = new ArrayList<>();
+        List<Map<String, Object>> list = caluDataMap.get("qnycxjjsslb");
+        for (int i = 0; list != null && i < list.size(); i++) {
+            Map<String, Object> map = list.get(i);
+            ComplexIncome complexIncome = new ComplexIncome();
+            //姓名*
+            complexIncome.setName((String) map.get("personName"));
+            //证件类型名称*
+            complexIncome.setLicenseType((String) map.get("cardType"));
+            //证件号码*
+            complexIncome.setLicenseNumber((String) map.get("cardNumber"));
+            //批次号(一月多次发薪)
+            //complexIncome.setBatchNo(0);
+            //当期收入额*
+            complexIncome.setIncome((BigDecimal) map.get("t1"));
+            //免税收入
+            complexIncome.setExemptIncome((BigDecimal) map.get("t2"));
+            //其他
+            //complexIncome.setOther(BigDecimal.ZERO);
+            //减免税额
+            complexIncome.setTaxDeduction((BigDecimal) map.get("t17"));
+            //备注
+            //complexIncome.setRemark("");
+            //所得项目名称*
+            complexIncome.setIncomeItemName("全年一次性奖金收入");
+            //准予扣除的捐赠额
+            complexIncome.setDeductibleDonation((BigDecimal) map.get("t16"));
+            annualOneTimeBonusIncome.add(complexIncome);
+        }
+        return annualOneTimeBonusIncome;
+    }
+
+    /**
+     * 获取正常工资薪金参数
+     *
+     * @return
+     */
+    private NormalSalarySpecIncome getNormalSalarySpecIncome
+    (Map<String, List<Map<String, Object>>> caluDataMap) {
+        //正常工资薪金对象
+        NormalSalarySpecIncome normalSalarySpecIncome = new NormalSalarySpecIncome();
+        //企业人员列表*
+        List<DetailCompanyEmployee> companyEmployeeList = getCompanyEmployeeList(caluDataMap);
+        normalSalarySpecIncome.setCompanyEmployeeList(companyEmployeeList);
+        //正常工资薪金是否需要专项*
+        //normalSalarySpecIncome.setZcgzxjsfxyzx("");
+        //正常工资薪金是否传入累计(申报/单月计算时使用)
+        //normalSalarySpecIncome.setZcgzxjsfcrlj("");
+        //支持上月传专项或者累计专项金额(仅对两月算税上月薪金列表算税数据生效)
+        //normalSalarySpecIncome.setZcgzxjsfcrzx("");
+        //是否已申报上月正常工资薪金(两个月算税场景)
+        //normalSalarySpecIncome.setDeclaredLastMonth("");
+        //批次号(一月多次发薪)
+        //normalSalarySpecIncome.setBatchNo(0);
+        //导入上月正常工资薪金(一月多次发薪)
+        normalSalarySpecIncome.setImportLastMonthSalaryOption("");
+        //是否需要人员申报
+        normalSalarySpecIncome.setDeclareEmployeeOption("");
+        //年金算税上限选项
+        normalSalarySpecIncome.setAnnuityAndHouseProvidentFundOption("");
+        //是否使用上月传入的应补退税额
+        normalSalarySpecIncome.setMultiCalculateTaxUseRefundTax("");
+        //个人养老金策略
+        normalSalarySpecIncome.setPersonalPensionOption("");
+        //上月个人养老金策略
+        normalSalarySpecIncome.setLastMonthPersonalPensionOption("");
+        //离职日期处理策略
+        normalSalarySpecIncome.setResignDateStrategy("");
+        //是否使用已报送人员信息进行补全
+        //normalSalarySpecIncome.setSfsybsrybq();
+        //上月正常工资薪金(带专项)列表
+        //normalSalarySpecIncome.setLastMonthNormalSalary();
+        List<ComplexIncome> normalSalarySpec = new ArrayList<>();
+        //正常工资薪金(带专项)列表*
+        normalSalarySpecIncome.setNormalSalarySpec(normalSalarySpec);
+        List<Map<String, Object>> list = caluDataMap.get("zcgzxjlb");
+        for (int i = 0; list != null && i < list.size(); i++) {
+            Map<String, Object> map = list.get(i);
+            ComplexIncome complexIncome = new ComplexIncome();
+            //姓名*
+            complexIncome.setName((String) map.get("personName"));
+            //证件类型名称*
+            complexIncome.setLicenseType((String) map.get("cardType"));
+            //证件号码*
+            complexIncome.setLicenseNumber((String) map.get("cardNumber"));
+            //是否明细申报
+            //complexIncome.setIsDetailedDeclaration("");
+            //当期收入额*
+            complexIncome.setIncome((BigDecimal) map.get("t1"));
+            //免税收入
+            complexIncome.setExemptIncome((BigDecimal) map.get("t2"));
+            //基本养老保险
+            complexIncome.setEndowmentInsurance((BigDecimal) map.get("t3"));
+            //基本医疗保险
+            complexIncome.setMedicalInsurance((BigDecimal) map.get("t4"));
+            //失业保险
+            complexIncome.setUnemploymentInsurance((BigDecimal) map.get("t5"));
+            //住房公积金
+            complexIncome.setHouseProvidentFund((BigDecimal) map.get("t6"));
+            //子女教育支出
+            complexIncome.setChildEducationExpenditure((BigDecimal) map.get("t64"));
+            //赡养老人支出
+            complexIncome.setSupportElderExpenditure((BigDecimal) map.get("t65"));
+            //住房租金支出
+            complexIncome.setHouseRentExpenditure((BigDecimal) map.get("t67"));
+            //房屋贷款支出
+            complexIncome.setHouseLoanExpenditure((BigDecimal) map.get("t66"));
+            //继续教育支出
+            complexIncome.setContinueEducationExpenditure((BigDecimal) map.get("t68"));
+            //婴幼儿照护支出
+            complexIncome.setBabyCareExpenditure((BigDecimal) map.get("t70"));
+            // 企业年金/职业年金
+            complexIncome.setAnnuity((BigDecimal) map.get("t12"));
+            //商业健康保险
+            complexIncome.setCommercialHealthInsurance((BigDecimal) map.get("t13"));
+            //税延养老保险
+            complexIncome.setExtensionEndowmentInsurance((BigDecimal) map.get("t14"));
+            //其他
+            //complexIncome.setOther(BigDecimal.ZERO);
+            normalSalarySpec.add(complexIncome);
+        }
+        return normalSalarySpecIncome;
+    }
+
+    /**
+     * 获取企业人员列表
+     */
+    private List<DetailCompanyEmployee> getCompanyEmployeeList(Map<String, List<Map<String, Object>>> caluDataMap) {
+        List<DetailCompanyEmployee> companyEmployeeList = new ArrayList<>();
+        List<Map<String, Object>> list = caluDataMap.get("zcgzxjlb");
+        for (int i = 0; list != null && i < list.size(); i++) {
+            Map<String, Object> map = list.get(i);
+            DetailCompanyEmployee employee = new DetailCompanyEmployee();
+            //姓名*
+            employee.setName((String) map.get("personName"));
+            //证件类型名称*
+            employee.setLicenseType((String) map.get("cardType"));
+            //证件号码*
+            employee.setLicenseNumber((String) map.get("cardNumber"));
+            //部门编号
+            //employee.setDeptNo("");
+            //工号
+            employee.setEmployeeNumber((String) map.get("personNumber"));
+            //所属期
+            //employee.setPeriod("");
+            //手机号码  中国籍必填;非中国籍首次入境时间超过一个月必填;
+            employee.setPhone((String) map.get("phoneNumber"));
+            //人员状态* 默认为正常,可选择正常/非正常
+            employee.setState((String) map.get("personstatusName"));
+            //是否雇员* 可选择雇员、保险营销员、证券经纪人、其他、实习学生(全日制学历教育)
+            employee.setIsEmployee((String) map.get("employedtypeName"));
+            //入职年度就业情况  当雇员保险营销员、证券经纪人时可选择:当年首次入职学生、当年首次入职其他人员。其他情况下填写默认为空
+            employee.setFirstEmploymentSituation((String) map.get("situationName"));
+            //受雇日期
+            employee.setEmployedDate((String) map.get("employeddate"));
+            //性别*   男/女
+            employee.setGender((String) map.get("gender"));
+            //出生日期* YYYY-MM-DD 需要和身份证上保持一致
+            employee.setBirthday((String) map.get("birthday"));
+            //国籍*
+            employee.setNationality((String) map.get("nationalityName"));
+            //人员地区* 境内/境外
+            employee.setArea((String) map.get("isoversea"));
+            //离职日期
+            employee.setResignDate((String) map.get("departuredate"));
+            //个人投资总额
+            employee.setPersonInvestment((BigDecimal) map.get("investmenttotal"));
+            //个人投资比例
+            employee.setPersonInvestmentRatio((BigDecimal) map.get("investmentrate"));
+            //是否残疾
+            String isdisability = (String) map.get("isdisability");
+            employee.setIsDisabled(isdisability);
+            if ("是".equals(isdisability)) {
+                //todo 残疾证件类型
+                employee.setDisableCardTypeName("残疾证");
+            }
+            //是否烈属
+            employee.setIsMartyr((String) map.get("ishero"));
+            //是否孤老
+            employee.setIsBereavedGaffer((String) map.get("isold"));
+            //残疾证号
+            employee.setDisableCardNumber((String) map.get("discardnumber"));
+            //烈属证号
+            employee.setMartyrCardNumber((String) map.get("herocardnumber"));
+            //电子邮箱
+            employee.setEmail((String) map.get("email"));
+            //学历
+            employee.setEducation((String) map.get("diploma"));
+            //职务
+            employee.setPosition((String) map.get("positionName"));
+            //开户银行省份(名字)
+            employee.setDepositBankProvinceName((String) map.get("bankcardprovince"));
+            //开户银行
+            employee.setDepositBank((String) map.get("bankcardprovince"));
+            //银行账号
+            employee.setBankAccount((String) map.get("account"));
+            //居住省份
+            employee.setResidentProvince((String) map.get("address"));
+            //居住城市
+            employee.setResidentCity((String) map.get("addresscity"));
+            //居住区县
+            employee.setResidentDistrict((String) map.get("addresscounty"));
+            //居住街道
+            employee.setResidentStreet((String) map.get("addressstreet"));
+            //户籍省份
+            employee.setCensusProvince((String) map.get("hometown"));
+            //户籍城市
+            employee.setCensusCity((String) map.get("hometowncity"));
+            //户籍区县
+            employee.setCensusDistrict((String) map.get("hometowncountry"));
+            //户籍街道
+            employee.setCensusStreet((String) map.get("hometownstreet"));
+            //户籍详细地址
+            employee.setCensusAddress((String) map.get("hometowndetailed"));
+            //备注
+            employee.setEmpRemark((String) map.get("desc"));
+            //出生地
+            employee.setBirthplace((String) map.get("birthplaceName"));
+            //首次入境时间
+            employee.setFirstEntryDate((String) map.get("entrydate"));
+            //预计离境时间
+            employee.setEstimatedDepartureDate((String) map.get("leavedate"));
+            //联系地省份
+            employee.setContactProvince((String) map.get("contactaddress"));
+            //联系地城市
+            employee.setContactCity((String) map.get("contactcity"));
+            //联系地区县
+            employee.setContactDistrict((String) map.get("contactcountry"));
+            //联系地街道
+            employee.setContactStreet((String) map.get("contactstreet"));
+            //联系地详细地址
+            employee.setContactStreet((String) map.get("contactdetailed"));
+            //中文名
+            employee.setChineseName((String) map.get("chinesename"));
+            //涉税事项
+            employee.setTaxRelatedReason((String) map.get("taxreason"));
+            //其他证件号码
+            employee.setOtherLicenseNumber((String) map.get("othercardnumber"));
+            //其他证件类型    其他证件类型为:外国人永久居留身份证(外国人永久居留证),外国护照,中华人民共和国外国人工作许可证(A类),中华人民共和国外国人工作许可证(B类),中华人民共和国外国人工作许可证(C类),中华人民共和国港澳居民居住证,中华人民共和国台湾居民居住证,中国护照,港澳居民来往内地通行证,台湾居民来往大陆通行证,其他证件号码必填
+            employee.setOtherLicenseType((String) map.get("othercardtype"));
+            //是否扣除减除费用(原是否主单位)
+            employee.setIsMainUnits((String) map.get("deductfees"));
+            companyEmployeeList.add(employee);
+        }
+        return companyEmployeeList;
+    }
+}

+ 1039 - 0
websrc/com/kingdee/eas/custom/shuiyou/taxCal/service/GetASynIndividualIncomeTaxFeedback.java

@@ -0,0 +1,1039 @@
+package com.kingdee.eas.custom.shuiyou.taxCal.service;
+
+import cn.com.servyou.dto.ApiResponse;
+import cn.com.servyou.dto.Head;
+import cn.com.servyou.dto.employee.EmployeeDeclareFeedback;
+import cn.com.servyou.dto.tax.*;
+import cn.com.servyou.rmi.client.ClientProxyFactory;
+import cn.com.servyou.service.TaxRequest;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.kingdee.bos.BOSException;
+import com.kingdee.bos.Context;
+import com.kingdee.bos.bsf.service.app.IHRMsfService;
+import com.kingdee.bos.metadata.entity.*;
+import com.kingdee.bos.metadata.query.util.CompareType;
+import com.kingdee.eas.common.EASBizException;
+import com.kingdee.eas.custom.shuiyou.interfacelog.ILogInfo;
+import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoFactory;
+import com.kingdee.eas.custom.shuiyou.interfacelog.LogInfoInfo;
+import com.kingdee.eas.custom.shuiyou.task.MessageResult;
+import com.kingdee.eas.custom.shuiyou.utils.ClientProxyFactoryUtils;
+import com.kingdee.eas.hr.ats.AtsUtil;
+import com.kingdee.eas.hr.ats.util.AtsDateUtils;
+import com.kingdee.eas.util.app.DbUtil;
+import com.kingdee.jdbc.rowset.IRowSet;
+import com.kingdee.shr.compensation.app.incomeTax.TaxPersonRecordCollection;
+import com.kingdee.shr.compensation.app.incomeTax.TaxPersonRecordFactory;
+import com.kingdee.shr.compensation.app.incomeTax.TaxPersonRecordInfo;
+import com.kingdee.shr.compensation.app.tax.base.*;
+import com.kingdee.shr.compensation.app.taxCal.*;
+import com.kingdee.util.StringUtils;
+import org.apache.log4j.Logger;
+
+import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * @Description 查询算税反馈结果
+ * @Date 2024/9/10 15:26
+ * @Created by Heyuan
+ */
+public class GetASynIndividualIncomeTaxFeedback implements IHRMsfService {
+    private static Logger logger = Logger.getLogger(GetASynIndividualIncomeTaxFeedback.class);
+    private String taxUnitId = null;//纳税单位id
+    private String period = null;//税款所属期 yyyy-MM
+    private String creator = null;//创建人id
+    private String periodBegin = null;//税款所属期起 yyyy-MM-dd
+    private String periodEnd = null;//税款所属期止 yyyy-MM-dd
+    private ObjectMapper objectMapper = new ObjectMapper();
+
+    //证件类型map
+    //private static Map<String, String> cardTypeEnumMap = null;
+    private Map<String, String> incomeItemMap = null;//所有启用的所得项目
+    private Map<String, String> taxItemInitMap = null;//初算个税项目
+    private Map<String, String> taxItemConfigMap = null;//明细个税项目
+    private Map<String, String> taxPersonRecordMap = null;//报送人员信息 key:证件号码+证件类型,value:员工id
+
+    @Override
+    public MessageResult process(Context ctx, Map paramMap) throws EASBizException, BOSException {
+        ILogInfo iLogInfo = LogInfoFactory.getLocalInstance(ctx);
+        //接口日志实体
+        LogInfoInfo logInfo = new LogInfoInfo();
+        //入口
+        logInfo.setEntrance(this.getClass().getName());
+        logInfo.setBizDate(new Date());
+        try {
+            logger.info("调用 GetASynIndividualIncomeTaxFeedback, 参数 " + objectMapper.writeValueAsString(paramMap));
+            MessageResult messageResult = null;
+            String this_taskId = (String) paramMap.get("this_taskId");//任务id
+            String paramData = (String) paramMap.get("paramData");
+            Map<String, String> paramDataMap = objectMapper.readValue(paramData, Map.class);
+            taxUnitId = paramDataMap.get("TAXUNITID");//纳税单位id
+            period = paramDataMap.get("PERIOD");//周期yyyy-MM
+            creator = paramDataMap.get("creator");//创建人id
+            String requestId = paramDataMap.get("requestId");
+            StringBuilder errorMsg = new StringBuilder();
+            if (StringUtils.isEmpty(taxUnitId)) {
+                errorMsg.append("纳税单位id不能为空!\n");
+            }
+            if (StringUtils.isEmpty(period)) {
+                errorMsg.append("周期yyyy-MM不能为空!\n");
+            }
+            if (StringUtils.isEmpty(requestId)) {
+                errorMsg.append("requestId不能为空!\n");
+            }
+            if (errorMsg.length() > 0) {
+                throw new BOSException(errorMsg.toString());
+            }
+            SimpleDateFormat shortsdf = new SimpleDateFormat("yyyy-MM");
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            Date parse = shortsdf.parse(period);
+            periodBegin = sdf.format(AtsDateUtils.getMonthFirstDay(parse));
+            periodEnd = sdf.format(AtsDateUtils.getMonthLastDay(parse));
+            //客户端代理工厂
+            ClientProxyFactory clientProxyFactory = ClientProxyFactoryUtils.getClientProxyFactory();
+            logInfo.setInterfaceAddress("/gateway/iit/calculateTax/getASynIndividualIncomeTaxFeedback");//接口地址
+            logInfo.setInterfaceName("getASynIndividualIncomeTaxFeedback");//接口名
+            logInfo.setInParameter("{\"requestId\":\"" + requestId + "\"}");//入参
+            //算税请求接口
+            TaxRequest taxRequest = clientProxyFactory.getTaxRequest();
+            //调用异步算税接口
+            ApiResponse<CalculateTaxResultRequest> apiResponse = taxRequest.getASynIndividualIncomeTaxFeedback(requestId);
+            ObjectMapper mapper = new ObjectMapper();
+            logInfo.setOutParameter(mapper.writeValueAsString(apiResponse));//回参
+            LogInfoFactory.getLocalInstance(ctx).save(logInfo);
+            Head head = apiResponse.getHead();
+            String status = head.getStatus();
+            String code = head.getCode();
+            if ("100004".equals(code)) {
+                //请求处理中
+                messageResult = MessageResult.AGAIN(head.getMsg());
+                logInfo.setErrorInfo(head.getMsg());//错误信息
+                logInfo.setStatus("处理中");
+            } else if ("000004".equals(code)) {
+                //请求失败
+                messageResult = MessageResult.FAILED(head.getMsg());
+                logInfo.setErrorInfo(head.getMsg());//错误信息
+                logInfo.setStatus("失败");
+            } else if ("00000000".equals(code)) {
+                logger.info("成功");
+                //获取所有启用的所得项目
+                incomeItemMap = getIncomeItemMap(ctx);
+                logger.info("objectMapper.writeValueAsString(incomeItemMap)  " + objectMapper.writeValueAsString(incomeItemMap));
+                //获取个税项目
+                getTaxItemMap(ctx);
+                logger.info("objectMapper.writeValueAsString(taxItemInitMap)  " + objectMapper.writeValueAsString(taxItemInitMap));
+                logger.info("objectMapper.writeValueAsString(taxItemConfigMap)  " + objectMapper.writeValueAsString(taxItemConfigMap));
+                //获取报送人员信息
+                getTaxPersonRecordMap(ctx);
+                //请求成功
+                CalculateTaxResultRequest body = apiResponse.getBody();
+                //企业名称
+//                String qymc = body.getName();
+//                //税号
+//                String nsrsbh = body.getTaxNo();
+//                //部门编号
+//                String bmbh = body.getDeptNo();
+//                //部门名称
+//                String bmmc = body.getDeptName();
+//                //行政区划代码
+//                String areaid = body.getArea();
+//                //税款所属期
+//                String skssq = body.getMonth();
+//                //外部业务订单号
+//                String bizNo = body.getBizNo();
+                //综合所得
+                ComplexIncomeResultRequest complexIncomeResult = body.getComplexIncomeResultRequest();
+                //人员申报失败列表
+                List<EmployeeDeclareFeedback> employeeDeclareFeedbacks = complexIncomeResult.getEmployeeDeclareFeedbacks();
+                for (int i = 0; employeeDeclareFeedbacks != null && i < employeeDeclareFeedbacks.size(); i++) {
+                    EmployeeDeclareFeedback employeeDeclareFeedback = employeeDeclareFeedbacks.get(i);
+                    //姓名
+                    String name = employeeDeclareFeedback.getName();
+                    //证件类型名称
+                    String licenseType = employeeDeclareFeedback.getLicenseType();
+                    //证件号码
+                    String licenseNumber = employeeDeclareFeedback.getLicenseNumber();
+                    //报送状态 1 待报送 2 代报中 3 代报失败 4 代报成功
+                    String submissionState = employeeDeclareFeedback.getSubmissionState();
+                    //人员验证状态 0 若是身份证,状态为验证中;其他证件为暂不验证 1 验证通过 2 验证不通过 4 待验证 9 同代码0处理
+                    String authenticationState = employeeDeclareFeedback.getAuthenticationState();
+                    //失败原因
+                    String message = employeeDeclareFeedback.getMessage();
+                    //专项报送状态 2 代报成功 3 代报失败
+                    String deductionSubmissionState = employeeDeclareFeedback.getDeductionSubmissionState();
+                    //专项报送结果原因
+                    String deductionMessage = employeeDeclareFeedback.getDeductionMessage();
+                }
+                logger.info("正常工资薪金算税结果对象");
+                //正常工资薪金算税结果对象
+                ComplexTaxCalculateResult normalSalarySpecIncome = complexIncomeResult.getNormalSalarySpecIncome();
+                handleComplexTaxCalculateResult(ctx, normalSalarySpecIncome);
+                logger.info("全年一次性奖金收入算税结果对象");
+                //全年一次性奖金收入算税结果对象
+                ComplexTaxCalculateResult annualOneTimeBonusIncome = complexIncomeResult.getAnnualOneTimeBonusIncome();
+                handleComplexTaxCalculateResult(ctx, annualOneTimeBonusIncome);
+                logger.info("一般劳务报酬算税结果对象");
+                //一般劳务报酬算税结果对象
+                ComplexTaxCalculateResult laborRemunerationIncome = complexIncomeResult.getLaborRemunerationIncome();
+                handleComplexTaxCalculateResult(ctx, laborRemunerationIncome);
+                logger.info("解除劳动合同一次性补偿金算税结果对象");
+                //解除劳动合同一次性补偿金算税结果对象
+                ComplexTaxCalculateResult compensateIncome = complexIncomeResult.getCompensateIncome();
+                handleComplexTaxCalculateResult(ctx, compensateIncome);
+                messageResult = MessageResult.SUCCESS();
+            }
+            logger.info("保存日志对象");
+            iLogInfo.addnew(logInfo);
+            logger.info("返回结果");
+            return messageResult;
+        } catch (Exception e) {
+            e.printStackTrace();
+            logInfo.setErrorInfo(e.getMessage());//错误信息
+            iLogInfo.addnew(logInfo);
+            return MessageResult.ERROR(e.getMessage());
+        }
+    }
+
+    /**
+     * 处理所得项目算税结果
+     *
+     * @param ctx
+     * @param normalSalarySpecIncome
+     * @throws BOSException
+     */
+    private void handleComplexTaxCalculateResult(
+            Context ctx,
+            ComplexTaxCalculateResult normalSalarySpecIncome)
+            throws BOSException, JsonProcessingException {
+        logger.info("handleComplexTaxCalculateResult:" + objectMapper.writeValueAsString(normalSalarySpecIncome));
+        if (normalSalarySpecIncome != null) {
+            //算税总人数
+            Integer totalPeople = normalSalarySpecIncome.getTotalPeople();
+            //算税失败人数
+            Integer failedPeople = normalSalarySpecIncome.getFailedPeople();
+            //年金上限
+            BigDecimal annuityLimit = normalSalarySpecIncome.getAnnuityLimit();
+            //公积金上限
+            BigDecimal houseProvidentFundLimit = normalSalarySpecIncome.getHouseProvidentFundLimit();
+            //年平均工资
+            BigDecimal averageAnnual = normalSalarySpecIncome.getAverageAnnual();
+            //企业在电子税务局上月是否已申报(仅正常工资薪金有效) 0:上月未申报 1:上月已申报 2:上上月未申报
+            String etaxDeclaredLastMonth = normalSalarySpecIncome.getEtaxDeclaredLastMonth();
+            //综合算税成功列表
+            List<ComplexIncome> successComplexIncomes = normalSalarySpecIncome.getSuccessComplexIncomes();
+            handleSuccessComplexIncome(ctx, successComplexIncomes);
+            //综合算税失败薪资列表
+            List<ComplexIncome> failedComplexIncomes = normalSalarySpecIncome.getFailedComplexIncomes();
+            handleFailedComplexIncome(failedComplexIncomes);
+            //失败算税原因列表
+            List<CheckTaxCalResult> failedCheckTaxCalResult = normalSalarySpecIncome.getFailedCheckTaxCalResult();
+            handleFailedCheckTaxCalResult(ctx, failedCheckTaxCalResult);
+        }
+    }
+
+    /**
+     * 处理综合算税成功列表
+     */
+    private void handleSuccessComplexIncome(Context ctx, List<ComplexIncome> successComplexIncomes) throws BOSException {
+        if (successComplexIncomes != null) {
+            //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            StringBuilder updateSql = new StringBuilder();
+            updateSql.append("/*dialect*/update T_HR_STaxCalInitDetail set FSTATE = '40', ");
+            for (String key : taxItemInitMap.keySet()) {
+                String tableField = taxItemInitMap.get(key);
+                updateSql.append(tableField).append("=?, ");
+            }
+            //updateSql.deleteCharAt(updateSql.length() - 1);
+            updateSql.deleteCharAt(updateSql.lastIndexOf(","));
+            updateSql.append("  where fpersonId = ? ");
+            updateSql.append("  and FTAXUNITID=? and to_char(FPERIODBEGIN,'yyyy-mm-dd') >= ? and to_char(FPERIODEND,'yyyy-mm-dd') <= ? and FINCOMEITEMID=? and FSTATE =30");
+            List<Object[]> sqlParams = new ArrayList<>();
+            List<Object[]> insertParams = new ArrayList<>();
+            Set<String> personIds = new HashSet<>();
+            Set<String> incomeitemIds = new HashSet<>();
+            for (int i = 0; successComplexIncomes != null && i < successComplexIncomes.size(); i++) {
+                ComplexIncome complexIncome = successComplexIncomes.get(i);
+                Map incomeDataMap = new HashMap();
+                List updateList = new ArrayList();
+                List insertList = new ArrayList();
+                //姓名
+                String name = complexIncome.getName();
+                //证件类型名称
+                String licenseType = complexIncome.getLicenseType();
+                //String cardTypeValue = cardTypeEnumMap.get(licenseType);
+                //证件号码
+                String licenseNumber = complexIncome.getLicenseNumber();
+                //员工id
+                String personId = taxPersonRecordMap.get(licenseNumber + licenseType);
+                if (StringUtils.isEmpty(personId)) {
+                    logger.error("未匹配到人员 证件号: " + licenseNumber + " 证件类型: " + licenseType);
+                    continue;
+                }
+                //受雇日期
+                String employedDate = complexIncome.getEmployedDate();
+                //离职日期
+                String resignDate = complexIncome.getResignDate();
+                //是否明细申报
+                String isDetailedDeclaration = complexIncome.getIsDetailedDeclaration();
+                //当期收入额
+                BigDecimal income = complexIncome.getIncome();
+                incomeDataMap.put("sre", income);
+                //免税收入
+                BigDecimal exemptIncome = complexIncome.getExemptIncome();
+                incomeDataMap.put("mssd", exemptIncome);
+                //基本养老保险
+                BigDecimal endowmentInsurance = complexIncome.getEndowmentInsurance();
+                incomeDataMap.put("jbylaobxf", endowmentInsurance);
+                //基本医疗保险
+                BigDecimal medicalInsurance = complexIncome.getMedicalInsurance();
+                incomeDataMap.put("jbylbxf", medicalInsurance);
+                //失业保险
+                BigDecimal unemploymentInsurance = complexIncome.getUnemploymentInsurance();
+                incomeDataMap.put("sybxf", unemploymentInsurance);
+                //住房公积金
+                BigDecimal houseProvidentFund = complexIncome.getHouseProvidentFund();
+                incomeDataMap.put("zfgjj", houseProvidentFund);
+                //原始住房公积金
+                BigDecimal originalHouseProvidentFund = complexIncome.getOriginalHouseProvidentFund();
+                //子女教育支出
+                BigDecimal childEducationExpenditure = complexIncome.getChildEducationExpenditure();
+                incomeDataMap.put("znjyzc_ex", childEducationExpenditure);
+                //赡养老人支出
+                BigDecimal supportElderExpenditure = complexIncome.getSupportElderExpenditure();
+                incomeDataMap.put("sylrzc_ex", supportElderExpenditure);
+                //住房租金支出
+                BigDecimal houseRentExpenditure = complexIncome.getHouseRentExpenditure();
+                incomeDataMap.put("zfzjzc_ex", houseRentExpenditure);
+                //房屋贷款支出
+                BigDecimal houseLoanExpenditure = complexIncome.getHouseLoanExpenditure();
+                incomeDataMap.put("zfdklxzc_ex", houseLoanExpenditure);
+                //继续教育支出
+                BigDecimal continueEducationExpenditure = complexIncome.getContinueEducationExpenditure();
+                incomeDataMap.put("jxjyzc_ex", continueEducationExpenditure);
+                //非学历继续教育支出
+                BigDecimal unDegreeContinueEducationExpenditure = complexIncome.getUnDegreeContinueEducationExpenditure();
+                incomeDataMap.put("fxljxjyzc_ex", unDegreeContinueEducationExpenditure);
+                //婴幼儿照护支出
+                BigDecimal babyCareExpenditure = complexIncome.getBabyCareExpenditure();
+                incomeDataMap.put("yyezhzc_ex", babyCareExpenditure);
+                //企业年金/职业年金
+                BigDecimal annuity = complexIncome.getAnnuity();
+                incomeDataMap.put("nj", annuity);
+                //商业健康保险
+                BigDecimal commercialHealthInsurance = complexIncome.getCommercialHealthInsurance();
+                incomeDataMap.put("syjkbx", commercialHealthInsurance);
+                //税延养老保险
+                BigDecimal extensionEndowmentInsurance = complexIncome.getExtensionEndowmentInsurance();
+                incomeDataMap.put("syylbx", extensionEndowmentInsurance);
+                //其他
+                BigDecimal other = complexIncome.getOther();
+                incomeDataMap.put("qt", other);
+                //减免税额
+                BigDecimal taxDeduction = complexIncome.getTaxDeduction();
+                incomeDataMap.put("jmse", taxDeduction);
+                //备注 根据政策要求,填写【其他】项,一定在备注中写明具体扣除项目名称
+                String remark = complexIncome.getRemark();
+                incomeDataMap.put("bz", remark);
+                //减除费用
+                BigDecimal deductionAmount = complexIncome.getDeductionAmount();
+                incomeDataMap.put("qzd", deductionAmount);
+                //其他扣除合计
+                BigDecimal otherDeductionSum = complexIncome.getOtherDeductionSum();
+                incomeDataMap.put("qtckhj", otherDeductionSum);
+                //应纳税所得额
+                BigDecimal taxableIncome = complexIncome.getTaxableIncome();
+                incomeDataMap.put("ynssde", taxableIncome);
+                //应纳税额
+                BigDecimal payableAmount = complexIncome.getPayableAmount();
+                //已缴税额
+                BigDecimal paidAmount = complexIncome.getPaidAmount();
+                //应扣缴税额
+                BigDecimal withholdingAmount = complexIncome.getWithholdingAmount();
+                //税率
+                BigDecimal taxRate = complexIncome.getTaxRate();
+                incomeDataMap.put("sl", taxRate);
+                //速算扣除数
+                BigDecimal quickDeduction = complexIncome.getQuickDeduction();
+                incomeDataMap.put("sskcs", quickDeduction);
+                //所得项目名称
+                String incomeItemName = complexIncome.getIncomeItemName();
+                if (!incomeItemMap.containsKey(incomeItemName)) {
+                    logger.error("未匹配到所得项目 名称为: " + incomeItemName);
+                    continue;
+                }
+                String incomeItemId = incomeItemMap.get(incomeItemName);
+                incomeDataMap.put("sdxm", incomeItemId);
+                //应补退税额 累计应扣缴税额-累计已缴税额
+                BigDecimal refundTax = complexIncome.getRefundTax();
+                incomeDataMap.put("bqybtse", refundTax);
+                //累计收入额 本年累计收入=本期所有的工资薪金所得收入之和+往期工资薪金所得收入之和(见税款计算)
+                BigDecimal accumulatedIncome = complexIncome.getAccumulatedIncome();
+                incomeDataMap.put("bqljsre", accumulatedIncome);
+                //累计免税收入额
+                BigDecimal accumulatedExemptIncome = complexIncome.getAccumulatedExemptIncome();
+                incomeDataMap.put("bqljmssr", accumulatedExemptIncome);
+                //累计专项扣除额
+                BigDecimal accumulatedSpecDeduction = complexIncome.getAccumulatedSpecDeduction();
+                incomeDataMap.put("zxkchj", accumulatedSpecDeduction);
+                //累计专项(附加)扣除额
+                BigDecimal accumulatedSpecAttachDeduction = complexIncome.getAccumulatedSpecAttachDeduction();
+                incomeDataMap.put("zxfjkchj", accumulatedSpecAttachDeduction);
+                //累计其他扣除额
+                BigDecimal accumulatedOtherDeduction = complexIncome.getAccumulatedOtherDeduction();
+                incomeDataMap.put("qtckhj", accumulatedOtherDeduction);
+                //累计减免税额
+                BigDecimal accumulatedTaxDeduction = complexIncome.getAccumulatedTaxDeduction();
+                incomeDataMap.put("ljjmse", accumulatedTaxDeduction);
+                //累计减除费用额
+                BigDecimal accumulatedDeductionAmount = complexIncome.getAccumulatedDeductionAmount();
+                incomeDataMap.put("jcfy", accumulatedDeductionAmount);
+                //todo 累计月减除费用
+                BigDecimal accumulatedMonthDeduction = complexIncome.getAccumulatedMonthDeduction();
+                //累计应纳税所得额
+                BigDecimal accumulatedTaxableIncome = complexIncome.getAccumulatedTaxableIncome();
+                incomeDataMap.put("ljynssde", accumulatedTaxableIncome);
+                //累计应纳税额
+                BigDecimal accumulatedPayableAmount = complexIncome.getAccumulatedPayableAmount();
+                incomeDataMap.put("ljynse", accumulatedPayableAmount);
+                //累计应扣缴税额 累计应纳税额 - 累计减免税额
+                BigDecimal accumulatedWithholdingAmount = complexIncome.getAccumulatedWithholdingAmount();
+                incomeDataMap.put("ljyingkjse", accumulatedWithholdingAmount);
+                //累计子女教育支出
+                BigDecimal accumulatedChildEducation = complexIncome.getAccumulatedChildEducation();
+                incomeDataMap.put("znjyzc", accumulatedChildEducation);
+                //累计继续教育支出
+                BigDecimal accumulatedContinueEducation = complexIncome.getAccumulatedContinueEducation();
+                incomeDataMap.put("jxjyzc", accumulatedContinueEducation);
+                //累计学历继续教育支出
+                BigDecimal accumulatedDegreeContinueEducationLimit = complexIncome.getAccumulatedDegreeContinueEducationLimit();
+                incomeDataMap.put("ljxljxjyzc_ex", accumulatedDegreeContinueEducationLimit);
+                //累计非学历继续教育支出
+                BigDecimal accumulatedUnDegreeContinueEducationLimit = complexIncome.getAccumulatedUnDegreeContinueEducationLimit();
+                incomeDataMap.put("ljfxljxjyzc_ex", accumulatedUnDegreeContinueEducationLimit);
+                //累计住房租金支出
+                BigDecimal accumulatedHouseRent = complexIncome.getAccumulatedHouseRent();
+                incomeDataMap.put("zfzjzc", accumulatedHouseRent);
+                //累计房屋贷款支出
+                BigDecimal accumulatedHouseLoan = complexIncome.getAccumulatedHouseLoan();
+                incomeDataMap.put("zfdklxzc", accumulatedHouseLoan);
+                //累计赡养老人支出
+                BigDecimal accumulatedSupportElder = complexIncome.getAccumulatedSupportElder();
+                incomeDataMap.put("sylrzc", accumulatedSupportElder);
+                //todo 累计3岁以下婴幼儿照护支出
+                BigDecimal accumulatedBabyCare = complexIncome.getAccumulatedBabyCare();
+                incomeDataMap.put("ljyyezhzc_ex", accumulatedBabyCare);
+                //累计准予扣除的捐赠额
+                BigDecimal accumulatedDeductibleDonation = complexIncome.getAccumulatedDeductibleDonation();
+                incomeDataMap.put("ljzykcdjze", accumulatedDeductibleDonation);
+                //累计个人养老金
+                BigDecimal accumulatedPersonalPension = complexIncome.getAccumulatedPersonalPension();
+                incomeDataMap.put("grylj", accumulatedPersonalPension);
+                //todo 累计个人养老金校验码
+                String accumulatedPersonalPensionCheckCode = complexIncome.getAccumulatedPersonalPensionCheckCode();
+                //准予扣除的捐赠额
+                BigDecimal deductibleDonation = complexIncome.getDeductibleDonation();
+                incomeDataMap.put("zykcjze", deductibleDonation);
+                //累计已缴税额
+                BigDecimal accumulatedPaidAmount = complexIncome.getAccumulatedPaidAmount();
+                //incomeDataMap.put("ykjse", accumulatedPaidAmount);
+                //企业上月是否已申报
+                String etaxDeclaredLastMonth = complexIncome.getEtaxDeclaredLastMonth();
+                //员工在税局累计已扣缴的税额
+                BigDecimal etaxAccumulatedPaidAmount = complexIncome.getEtaxAccumulatedPaidAmount();
+                //incomeDataMap.put("ykjse", etaxAccumulatedPaidAmount);
+                //本月已累计扣除税额
+                BigDecimal monthAccumulatedWithholdingAmount = complexIncome.getMonthAccumulatedWithholdingAmount();
+                incomeDataMap.put("ykjse", etaxAccumulatedPaidAmount);
+                //本次应扣缴税额
+                BigDecimal currentWithholdingAmount = complexIncome.getCurrentWithholdingAmount();
+                incomeDataMap.put("ykjse", etaxAccumulatedPaidAmount);
+                //允许扣除的税费
+                BigDecimal taxDeductible = complexIncome.getTaxDeductible();
+                incomeDataMap.put("yxkcsf", taxDeductible);
+                //展业成本
+                BigDecimal exhibitionCost = complexIncome.getExhibitionCost();
+                incomeDataMap.put("zycb", exhibitionCost);
+                //月减除费用
+                BigDecimal monthDeduction = complexIncome.getMonthDeduction();
+                incomeDataMap.put("qzd", monthDeduction);
+                //分摊年度数
+                Integer apportionYears = complexIncome.getApportionYears();
+                //年减除费用 默认为60000
+                BigDecimal yearDeduction = complexIncome.getYearDeduction();
+                //封装更新参数
+                for (String key : taxItemInitMap.keySet()) {
+                    updateList.add(incomeDataMap.get(key));
+                }
+                updateList.add(personId);
+                updateList.add(taxUnitId);
+                updateList.add(periodBegin);
+                updateList.add(periodEnd);
+                updateList.add(incomeItemId);
+                sqlParams.add(updateList.toArray());
+                if (!personIds.contains(personId)) {
+                    personIds.add(personId);
+                }
+                if (!incomeitemIds.contains(incomeItemId)) {
+                    incomeitemIds.add(incomeItemId);
+                }
+            }
+            try {
+                logger.info("updateSql: " + updateSql);
+                logger.info("处理综合算税成功列表 sqlParams  " + objectMapper.writeValueAsString(sqlParams));
+                if (!sqlParams.isEmpty()) {
+                    DbUtil.executeBatch(ctx, updateSql.toString(), sqlParams);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw new BOSException("处理处理综合算税成功列表,更新初算数据报错:" + e.getMessage());
+            }
+            //生成个税应用+税款计算最终拆分明细表
+            try {
+                logger.info("处理综合算税成功列表 personIds  " + objectMapper.writeValueAsString(personIds));
+                logger.info("处理综合算税成功列表 incomeitemIds  " + objectMapper.writeValueAsString(incomeitemIds));
+                if (!personIds.isEmpty() && !incomeitemIds.isEmpty()) {
+                    generateOrUpdateTaxCalConfigDetail(ctx, personIds, incomeitemIds);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                throw new BOSException("处理处理综合算税成功列表,生成个税应用+税款计算最终拆分明细表报错:" + e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * 处理综合算税失败薪资列表
+     *
+     * @param failedComplexIncomes
+     */
+    private void handleFailedComplexIncome(List<ComplexIncome> failedComplexIncomes) {
+        for (int i = 0; failedComplexIncomes != null && i < failedComplexIncomes.size(); i++) {
+            ComplexIncome complexIncome = failedComplexIncomes.get(i);
+            //姓名
+            String name = complexIncome.getName();
+            //证件类型名称
+            String licenseType = complexIncome.getLicenseType();
+            //证件号码
+            String licenseNumber = complexIncome.getLicenseNumber();
+            //受雇日期
+            String employedDate = complexIncome.getEmployedDate();
+            //离职日期
+            String resignDate = complexIncome.getResignDate();
+            //是否明细申报
+            String isDetailedDeclaration = complexIncome.getIsDetailedDeclaration();
+            //当期收入额
+            BigDecimal income = complexIncome.getIncome();
+            //免税收入
+            BigDecimal exemptIncome = complexIncome.getExemptIncome();
+            //基本养老保险
+            BigDecimal endowmentInsurance = complexIncome.getEndowmentInsurance();
+            //基本医疗保险
+            BigDecimal medicalInsurance = complexIncome.getMedicalInsurance();
+            //失业保险
+            BigDecimal unemploymentInsurance = complexIncome.getUnemploymentInsurance();
+            //住房公积金
+            BigDecimal houseProvidentFund = complexIncome.getHouseProvidentFund();
+            //原始住房公积金
+            //BigDecimal originalHouseProvidentFund = complexIncome.getOriginalHouseProvidentFund();
+            //子女教育支出
+            BigDecimal childEducationExpenditure = complexIncome.getChildEducationExpenditure();
+            //赡养老人支出
+            BigDecimal supportElderExpenditure = complexIncome.getSupportElderExpenditure();
+            //住房租金支出
+            BigDecimal houseRentExpenditure = complexIncome.getHouseRentExpenditure();
+            //房屋贷款支出
+            BigDecimal houseLoanExpenditure = complexIncome.getHouseLoanExpenditure();
+            //继续教育支出
+            BigDecimal continueEducationExpenditure = complexIncome.getContinueEducationExpenditure();
+            //非学历继续教育支出
+            BigDecimal unDegreeContinueEducationExpenditure = complexIncome.getUnDegreeContinueEducationExpenditure();
+            //婴幼儿照护支出
+            BigDecimal babyCareExpenditure = complexIncome.getBabyCareExpenditure();
+            //企业年金/职业年金
+            BigDecimal annuity = complexIncome.getAnnuity();
+            //商业健康保险
+            BigDecimal commercialHealthInsurance = complexIncome.getCommercialHealthInsurance();
+            //税延养老保险
+            BigDecimal extensionEndowmentInsurance = complexIncome.getExtensionEndowmentInsurance();
+            //其他
+            BigDecimal other = complexIncome.getOther();
+            //减免税额
+            BigDecimal taxDeduction = complexIncome.getTaxDeduction();
+            //备注
+            String remark = complexIncome.getRemark();
+            //减除费用
+            BigDecimal deductionAmount = complexIncome.getDeductionAmount();
+            //其他扣除合计
+            BigDecimal otherDeductionSum = complexIncome.getOtherDeductionSum();
+            //应纳税所得额
+            BigDecimal taxableIncome = complexIncome.getTaxableIncome();
+            //应纳税额
+            BigDecimal payableAmount = complexIncome.getPayableAmount();
+            //已缴税额
+            BigDecimal paidAmount = complexIncome.getPaidAmount();
+            //应扣缴税额
+            BigDecimal withholdingAmount = complexIncome.getWithholdingAmount();
+            //税率
+            BigDecimal taxRate = complexIncome.getTaxRate();
+            //速算扣除数
+            BigDecimal quickDeduction = complexIncome.getQuickDeduction();
+            //所得项目名称
+            String incomeItemName = complexIncome.getIncomeItemName();
+            //应补退税额
+            BigDecimal refundTax = complexIncome.getRefundTax();
+            //累计收入额
+            BigDecimal accumulatedIncome = complexIncome.getAccumulatedIncome();
+            //累计免税收入额
+            BigDecimal accumulatedExemptIncome = complexIncome.getAccumulatedExemptIncome();
+            //累计专项扣除额
+            BigDecimal accumulatedSpecDeduction = complexIncome.getAccumulatedSpecDeduction();
+            //累计专项(附加)扣除额
+            BigDecimal accumulatedSpecAttachDeduction = complexIncome.getAccumulatedSpecAttachDeduction();
+            //累计其他扣除额
+            BigDecimal accumulatedOtherDeduction = complexIncome.getAccumulatedOtherDeduction();
+            //累计减免税额
+            BigDecimal accumulatedTaxDeduction = complexIncome.getAccumulatedTaxDeduction();
+            //累计减除费用额
+            BigDecimal accumulatedDeductionAmount = complexIncome.getAccumulatedDeductionAmount();
+            //累计月减除费用
+            BigDecimal accumulatedMonthDeduction = complexIncome.getAccumulatedMonthDeduction();
+            //累计应纳税所得额
+            BigDecimal accumulatedTaxableIncome = complexIncome.getAccumulatedTaxableIncome();
+            //累计应纳税额
+            BigDecimal accumulatedPayableAmount = complexIncome.getAccumulatedPayableAmount();
+            //累计应扣缴税额
+            BigDecimal accumulatedWithholdingAmount = complexIncome.getAccumulatedWithholdingAmount();
+            //累计子女教育支出
+            BigDecimal accumulatedChildEducation = complexIncome.getAccumulatedChildEducation();
+            //累计继续教育支出
+            BigDecimal accumulatedContinueEducation = complexIncome.getAccumulatedContinueEducation();
+            //累计学历继续教育支出
+            BigDecimal accumulatedDegreeContinueEducationLimit = complexIncome.getAccumulatedDegreeContinueEducationLimit();
+            //累计非学历继续教育支出
+            BigDecimal accumulatedUnDegreeContinueEducationLimit = complexIncome.getAccumulatedUnDegreeContinueEducationLimit();
+            //累计住房租金支出
+            BigDecimal accumulatedHouseRent = complexIncome.getAccumulatedHouseRent();
+            //累计房屋贷款支出
+            BigDecimal accumulatedHouseLoan = complexIncome.getAccumulatedHouseLoan();
+            //累计赡养老人支出
+            BigDecimal accumulatedSupportElder = complexIncome.getAccumulatedSupportElder();
+            //累计3岁以下婴幼儿照护支出
+            BigDecimal accumulatedBabyCare = complexIncome.getAccumulatedBabyCare();
+            //累计准予扣除的捐赠额
+            BigDecimal accumulatedDeductibleDonation = complexIncome.getAccumulatedDeductibleDonation();
+            //累计个人养老金
+            BigDecimal accumulatedPersonalPension = complexIncome.getAccumulatedPersonalPension();
+            //累计个人养老金校验码
+            String accumulatedPersonalPensionCheckCode = complexIncome.getAccumulatedPersonalPensionCheckCode();
+            //准予扣除的捐赠额
+            BigDecimal deductibleDonation = complexIncome.getDeductibleDonation();
+            //累计已缴税额
+            BigDecimal accumulatedPaidAmount = complexIncome.getAccumulatedPaidAmount();
+            //企业上月是否已申报:
+            String etaxDeclaredLastMonth = complexIncome.getEtaxDeclaredLastMonth();
+            //员工在税局累计已扣缴的税额
+            BigDecimal etaxAccumulatedPaidAmount = complexIncome.getEtaxAccumulatedPaidAmount();
+            //本月已累计扣除税额
+            BigDecimal monthAccumulatedWithholdingAmount = complexIncome.getMonthAccumulatedWithholdingAmount();
+            //本次应扣缴税额
+            BigDecimal currentWithholdingAmount = complexIncome.getCurrentWithholdingAmount();
+            //允许扣除的税费
+            BigDecimal taxDeductible = complexIncome.getTaxDeductible();
+            //展业成本
+            BigDecimal exhibitionCost = complexIncome.getExhibitionCost();
+            //月减除费用
+            BigDecimal monthDeduction = complexIncome.getMonthDeduction();
+            //分摊年度数
+            Integer apportionYears = complexIncome.getApportionYears();
+            //年减除费用 默认为60000
+            BigDecimal yearDeduction = complexIncome.getYearDeduction();
+        }
+    }
+
+    /**
+     * 处理失败算税原因列表
+     *
+     * @param failedCheckTaxCalResult
+     */
+    private void handleFailedCheckTaxCalResult(
+            Context ctx,
+            List<CheckTaxCalResult> failedCheckTaxCalResult)
+            throws BOSException, JsonProcessingException {
+        logger.info("handleFailedCheckTaxCalResult:" + objectMapper.writeValueAsString(failedCheckTaxCalResult));
+        if (failedCheckTaxCalResult != null) {
+            String updateSql = "/*dialect*/update T_HR_STaxCalInitDetail set FERRORINFO = ?,FSTATE = '50' " +
+                    "where fpersonId = ? " +
+                    "and FTAXUNITID=? and to_char(FPERIODBEGIN,'yyyy-mm-dd') >= ? and to_char(FPERIODEND,'yyyy-mm-dd') <= ? and FINCOMEITEMID=? and FSTATE =30";
+            List<Object[]> udpateParameter = new ArrayList<>();
+            for (int i = 0; failedCheckTaxCalResult != null && i < failedCheckTaxCalResult.size(); i++) {
+                List list = new ArrayList();
+                CheckTaxCalResult checkTaxCalResult = failedCheckTaxCalResult.get(i);
+                //证件类型名称
+                String licenseType = checkTaxCalResult.getLicenseType();
+                //String cardTypeValue = cardTypeEnumMap.get(licenseType);
+                //证件号码
+                String licenseNumber = checkTaxCalResult.getLicenseNumber();
+                //员工id
+                String personId = taxPersonRecordMap.get(licenseNumber + licenseType);
+                if (StringUtils.isEmpty(personId)) {
+                    logger.error("未匹配到人员 证件号: " + licenseNumber + " 证件类型: " + licenseType);
+                    continue;
+                }
+                //人员id
+                Long employeeId = checkTaxCalResult.getEmployeeId();
+                //人员名称
+                String employeeName = checkTaxCalResult.getEmployeeName();
+                //错误码
+                String errorCode = checkTaxCalResult.getErrorCode();
+                //错误信息
+                String errorMessage = checkTaxCalResult.getErrorMessage();
+                //所得税表的code
+                String incomeItemCode = checkTaxCalResult.getIncomeItemCode();
+                //所得税表的name
+                String incomeItemName = checkTaxCalResult.getIncomeItemName();
+                if (!incomeItemMap.containsKey(incomeItemName)) {
+                    logger.error("未匹配到所得项目 名称为: " + incomeItemName);
+                    continue;
+                }
+                String incomeItemId = incomeItemMap.get(incomeItemName);
+                list.add(errorMessage);
+                list.add(personId);
+                list.add(taxUnitId);
+                list.add(periodBegin);
+                list.add(periodEnd);
+                list.add(incomeItemId);
+                udpateParameter.add(list.toArray());
+            }
+            try {
+                logger.error("处理失败算税原因列表  updateSql  " + updateSql);
+                logger.error("处理失败算税原因列表 udpateParameter  " + objectMapper.writeValueAsString(udpateParameter));
+                if (!udpateParameter.isEmpty()) {
+                    DbUtil.executeBatch(ctx, updateSql, udpateParameter);
+                }
+            } catch (BOSException e) {
+                e.printStackTrace();
+                throw new BOSException("更新处理失败算税原因列表报错: " + e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * 生成个税应用+税款计算最终拆分明细表
+     * 先新增再更新
+     */
+    private void generateOrUpdateTaxCalConfigDetail(Context ctx,
+                                                    Set<String> personIds,
+                                                    Set<String> incomeitemIds) throws BOSException, SQLException, ParseException, JsonProcessingException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date periodBeginDate = sdf.parse(periodBegin);
+        Date periodEndDate = sdf.parse(periodEnd);
+        //先查出计算成功的初算数据(人员、纳税单位id、周期、所得项目、状态=成功)
+        ITaxCalConfigDetail iTaxCalConfigDetail = TaxCalConfigDetailFactory.getLocalInstance(ctx);
+        StringBuilder querySql = new StringBuilder();
+        querySql.append("SELECT fid,fpersonId,fincomeitemid,FCALSCHEMEID,FCMPCALTABLEID,FTAXUNITID from T_HR_STaxCalInitDetail where").append("\n");
+        querySql.append("   fpersonId in(").append(AtsUtil.convertSetToString(personIds)).append(")").append("\n");
+        querySql.append("   and to_char(FPERIODBEGIN, 'yyyy-mm-dd') >= '").append(periodBegin).append("'").append("\n");
+        querySql.append("   and to_char(FPERIODEND, 'yyyy-mm-dd') <= '").append(periodEnd).append("'").append("\n");
+        querySql.append("   and FINCOMEITEMID in(").append(AtsUtil.convertSetToString(incomeitemIds)).append(")").append("\n");
+        querySql.append("   and FTAXUNITID = '").append(taxUnitId).append("'").append("\n");
+        querySql.append("   and FSTATE = '40'").append("\n");
+        logger.info("generateOrUpdateTaxCalConfigDetail.sql: " + querySql);
+        IRowSet iRowSet = DbUtil.executeQuery(ctx, querySql.toString());
+        List<Map<String, String>> list = new ArrayList<>();
+        while (iRowSet.next()) {
+            Map<String, String> map = new HashMap<>();
+            map.put("initId", iRowSet.getString("fid"));
+            map.put("personId", iRowSet.getString("fpersonId"));
+            map.put("incomeitemid", iRowSet.getString("FINCOMEITEMID"));
+            map.put("calSchemeId", iRowSet.getString("FCALSCHEMEID"));
+            map.put("cmpCalTableId", iRowSet.getString("FCMPCALTABLEID"));
+            map.put("taxUnitId", iRowSet.getString("FTAXUNITID"));
+            list.add(map);
+        }
+        //用初算数据生成明细表(需要判断明细表数据是否已经生成过)
+        Set<String> initIds = new HashSet<>();
+        Set<String> configIds = new HashSet<>();
+        for (int i = 0; i < list.size(); i++) {
+            try {
+                String detailId = null;
+                Map<String, String> map = list.get(i);
+                String initId = map.get("initId");//初算id
+                String personId = map.get("personId");
+                String taxUnitId = map.get("taxUnitId");
+                String incomeitemid = map.get("incomeitemid");
+                String calSchemeId = map.get("calSchemeId");
+                String cmpCalTableId = map.get("cmpCalTableId");
+                FilterInfo filterInfo = new FilterInfo();
+                FilterItemCollection filterItems = filterInfo.getFilterItems();
+                filterItems.add(new FilterItemInfo("person", personId));
+                filterItems.add(new FilterItemInfo("taxUnit", taxUnitId));
+                filterItems.add(new FilterItemInfo("periodBegin", periodBeginDate, CompareType.GREATER));
+                filterItems.add(new FilterItemInfo("periodEnd", periodEndDate, CompareType.LESS_EQUALS));
+                filterItems.add(new FilterItemInfo("incomeItem", incomeitemid));
+                filterItems.add(new FilterItemInfo("calScheme", calSchemeId));
+                filterItems.add(new FilterItemInfo("cmpCalTable", cmpCalTableId));
+                SelectorItemCollection sic = new SelectorItemCollection();
+                sic.add("state");
+                EntityViewInfo instance = EntityViewInfo.getInstance(filterInfo, sic, null);
+                TaxCalConfigDetailCollection taxCalConfigDetailCol = iTaxCalConfigDetail.getTaxCalConfigDetailCollection(instance);
+                if (taxCalConfigDetailCol.size() > 0) {
+                    TaxCalConfigDetailInfo taxCalConfigDetailInfo = taxCalConfigDetailCol.get(0);
+                    if (TaxResultStateEnum.UN_CONFIRM.equals(taxCalConfigDetailInfo.getState())) {
+                        //未确认,更新数据
+                        detailId = taxCalConfigDetailInfo.getId().toString();
+                        configIds.add(detailId);
+                    } else {
+                        //已确认,不能更新
+                        logger.error("更新明细表数据  已确认,不能更新");
+                        continue;
+                    }
+                } else {
+                    //没有找到明细数据,创建数据
+                    //个税应用+税款计算最终拆分明细表
+                    TaxCalConfigDetailInfo taxCalConfigDetailInfo = new TaxCalConfigDetailInfo();
+                    //计算规则
+                    taxCalConfigDetailInfo.put("calScheme", map.get("calSchemeId"));
+                    //核算表id
+                    taxCalConfigDetailInfo.put("cmpCalTable", map.get("cmpCalTableId"));
+                    //状态
+                    taxCalConfigDetailInfo.setState(TaxResultStateEnum.UN_CONFIRM);
+                    //依赖id
+                    //taxCalConfigDetailInfo.setRelay();
+                    //是否最后一条
+                    //taxCalConfigDetailInfo.setIsLast();
+                    //是否生成个税申报
+                    taxCalConfigDetailInfo.setIsGenerateTaxDeclare(false);
+                    //申报批次号
+                    //taxCalConfigDetailInfo.setBatchNo();
+                    //员工
+                    taxCalConfigDetailInfo.put("person", map.get("personId"));
+                    //纳税单位
+                    taxCalConfigDetailInfo.put("taxUnit", map.get("taxUnitId"));
+                    //税款所属期间起
+                    taxCalConfigDetailInfo.setPeriodBegin(periodBeginDate);
+                    //税款所属期间止
+                    taxCalConfigDetailInfo.setPeriodEnd(periodEndDate);
+                    //所得项目
+                    taxCalConfigDetailInfo.put("incomeItem", map.get("incomeitemid"));
+                    detailId = iTaxCalConfigDetail.addnew(taxCalConfigDetailInfo).toString();
+                    configIds.add(detailId);
+                }
+                initIds.add(initId);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        logger.info("configIds: " + objectMapper.writeValueAsString(configIds));
+        logger.info("initIds " + objectMapper.writeValueAsString(initIds));
+        if (!configIds.isEmpty() && !initIds.isEmpty()) {
+            //更新明细表数据
+            StringBuilder updateSql = new StringBuilder();
+            updateSql.append("update T_HR_STaxCalConfigDetail config set ").append("\n");
+            for (String key : taxItemConfigMap.keySet()) {
+                updateSql.append("config.").append(taxItemConfigMap.get(key))
+                        .append(" = init.").append(taxItemConfigMap.get(key)).append(",").append("\n");
+            }
+            updateSql.deleteCharAt(updateSql.lastIndexOf(","));
+            updateSql.append("from( select * from T_HR_STaxCalInitDetail where fid in( ");
+            updateSql.append(AtsUtil.convertSetToString(initIds)).append(")) init").append("\n");
+            updateSql.append("where config.fpersonId = init.fpersonId").append("\n");
+            updateSql.append(" and config.fCmpCalTableId = init.fCmpCalTableId").append("\n");
+            updateSql.append(" and config.fIncomeItemId = init.fIncomeItemId").append("\n");
+            updateSql.append(" and config.FPERIODBEGIN = init.FPERIODBEGIN").append("\n");
+            updateSql.append(" and config.FPERIODEND = init.FPERIODEND").append("\n");
+            updateSql.append(" and config.fstate = '10'").append("\n");
+            updateSql.append(" and config.fid in(").append(AtsUtil.convertSetToString(configIds)).append(")").append("\n");
+            logger.info("更新明细表sql: " + updateSql);
+            DbUtil.execute(ctx, updateSql.toString());
+        }
+    }
+
+    /**
+     * 获取证件map
+     *
+     * @return
+     */
+//    private static Map<String, String> getCardTypeEnumMap() {
+//        Map<String, String> cardTypeEnumMap = new HashMap<>();
+//        List<Map<String, String>> enumList = CardTypeEnum.getEnumList();
+//        for (int i = 0; i < enumList.size(); i++) {
+//            CardTypeEnum cardTypeEnum = (CardTypeEnum) enumList.get(i);
+//            String value = cardTypeEnum.getValue();
+//            String alias = cardTypeEnum.getAlias();
+//            cardTypeEnumMap.put(alias, value);
+//        }
+//        return cardTypeEnumMap;
+//    }
+
+    /**
+     * 获取所得项目
+     *
+     * @param ctx
+     * @return
+     * @throws BOSException
+     */
+    private Map<String, String> getIncomeItemMap(Context ctx) throws BOSException {
+        Map<String, String> incomeItemMap = new HashMap<>();
+        try {
+            TaxIncomeItemCollection taxIncomeItemCollection = TaxIncomeItemFactory.getLocalInstance(ctx).getTaxIncomeItemCollection("where state = 1");
+            for (int i = 0; i < taxIncomeItemCollection.size(); i++) {
+                TaxIncomeItemInfo taxIncomeItemInfo = taxIncomeItemCollection.get(i);
+                String taxIncomeItemId = taxIncomeItemInfo.getId().toString();
+                String name = taxIncomeItemInfo.getName();
+                incomeItemMap.put(name, taxIncomeItemId);
+            }
+            return incomeItemMap;
+        } catch (BOSException e) {
+            e.printStackTrace();
+            throw new BOSException("获取所得项目数据报错: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 获取报送人员信息
+     *
+     * @param ctx
+     * @throws BOSException
+     */
+    private void getTaxPersonRecordMap(Context ctx) throws BOSException {
+        if (taxPersonRecordMap == null) {
+            taxPersonRecordMap = new HashMap<>();
+        }
+        TaxPersonRecordCollection taxPersonRecordCollection = TaxPersonRecordFactory
+                .getLocalInstance(ctx).getTaxPersonRecordCollection();
+        for (int i = 0; i < taxPersonRecordCollection.size(); i++) {
+            TaxPersonRecordInfo taxPersonRecordInfo = taxPersonRecordCollection.get(i);
+            String personId = taxPersonRecordInfo.getPerson().getId().toString();
+            String cardTypeName = taxPersonRecordInfo.getCardType().getAlias();
+            String cardNumber = taxPersonRecordInfo.getCardNumber();
+            taxPersonRecordMap.put(cardNumber + cardTypeName, personId);
+        }
+    }
+
+    /**
+     * 获取个税项目
+     *
+     * @param ctx
+     * @return
+     * @throws BOSException
+     */
+    private void getTaxItemMap(Context ctx) throws BOSException {
+        if (taxItemInitMap == null) {
+            taxItemInitMap = new HashMap<>();
+        }
+        if (taxItemConfigMap == null) {
+            taxItemConfigMap = new HashMap<>();
+        }
+        //获取所有个税项目
+        Set initSet = new HashSet();
+        initSet.add("jmse");//减免税额
+        initSet.add("qzd");//减除费用
+        initSet.add("ynssde");//应纳税所得额
+        initSet.add("sl");//税率
+        initSet.add("sskcs");//速算扣除数
+        initSet.add("bqybtse");//应补退税额
+        initSet.add("bqljsre");//累计收入额
+        initSet.add("bqljmssr");///累计免税收入额
+        initSet.add("zxkchj");//累计专项扣除额
+        initSet.add("zxfjkchj");//累计专项(附加)扣除额
+        initSet.add("qtckhj");//累计其他扣除额
+        initSet.add("ljjmse");//累计减免税额
+        initSet.add("jcfy");//累计减除费用额
+        initSet.add("ljynssde");//累计应纳税所得额
+        initSet.add("ljynse");//累计应纳税额
+        initSet.add("ljyingkjse");//累计应扣缴税额
+        initSet.add("znjyzc");//累计子女教育支出
+        initSet.add("jxjyzc");//累计继续教育支出
+        initSet.add("ljxljxjyzc_ex");//累计学历继续教育支出
+        initSet.add("ljfxljxjyzc_ex");//累计非学历继续教育支出
+        initSet.add("zfzjzc");//累计住房租金支出
+        initSet.add("zfdklxzc");//累计房屋贷款支出
+        initSet.add("sylrzc");//累计赡养老人支出
+        initSet.add("ljzykcdjze");//累计准予扣除的捐赠额
+        initSet.add("grylj"); //累计个人养老金
+        initSet.add("zykcjze");//准予扣除的捐赠额
+        initSet.add("ykjse");//本月已累计扣除税额
+        initSet.add("yxkcsf");//允许扣除的税费
+        initSet.add("zycb");//展业成本
+        initSet.add("qzd");//月减除费用
+        //最终拆分明细表个税项目
+        Set configSet = new HashSet();
+        configSet.add("sre");//本期收入
+        configSet.add("mssd // 本期免税收入");
+        configSet.add("jbylaobxf");//  基本养老保险费
+        configSet.add("jbylbxf");//  基本医疗保险费
+        configSet.add("sybxf");//  失业保险费
+        configSet.add("zfgjj");//  住房公积金
+        configSet.add("znjyzc");//  累计子女教育
+        configSet.add("jxjyzc");//  累计继续教育
+        configSet.add("zfdklxzc");//  累计住房贷款利息");
+        configSet.add("zfzjzc");//  累计住房租金");
+        configSet.add("nj");//  企业(职业)年金");
+        configSet.add("syjkbx");//  商业健康保险");
+        configSet.add("syylbx");//  税延养老保险");
+        configSet.add("qt");//  其他");
+        configSet.add("zykcjze");//  准予扣除的捐赠额");
+        configSet.add("jmse");//  减免税额");
+        configSet.add("yxkcsf");//  允许扣除的税费");
+        configSet.add("ljsre");//  上期累计收入");
+        configSet.add("bqljsre");//  本期累计收入");
+        configSet.add("ljmssd");//  上期累计免税收入");
+        configSet.add("bqljmssr");//  本期累计免税收入");
+        configSet.add("qzd");//  减除费用");
+        configSet.add("jcfy");//  累计减除费用");
+        configSet.add("fy");//  本期费用");
+        configSet.add("zxkchj");//  累计专项扣除");
+        configSet.add("zxfjkchj");//  累计专项附加扣除合计");
+        configSet.add("qtckhj");//  累计其他扣除");
+        configSet.add("ljzykcdjze");//  累计准予扣除的捐赠
+        configSet.add("ljynssde");//  累计应纳税所得额
+        configSet.add("sl");//  税率
+        configSet.add("sskcs");//  速算扣除数
+        configSet.add("ljynse");//  累计应纳税额
+        configSet.add("ljjmse");//  累计减免税额
+        configSet.add("ljyingkjse");//  累计应扣缴税额
+        configSet.add("ykjse");//  累计已预缴税额
+        configSet.add("ybtse");//  累计应补(退)税额
+        configSet.add("ycxbc");//  一次性补偿
+        configSet.add("zycb");//  展业成本
+        configSet.add("bz");//  备注
+        configSet.add("ccyz");//  财产原值
+        configSet.add("jsbl");//  减按计税比例
+        configSet.add("ynssde");//  应纳税所得额
+        configSet.add("bqybtse");//  本期应补(退)税额
+        configSet.add("sylrzc");//  累计赡养老人
+        configSet.add("yyezhfzc");//  累计婴幼儿照护费用
+        configSet.add("grylj");//  累计个人养老金
+        configSet.add("ljfxljxjyzc_ex");//  累计非学历继续教育支出
+        configSet.add("ljxljxjyzc_ex");//  累计学历继续教育支出
+        configSet.add("znjyzc_ex");//  子女教育支出
+        configSet.add("sylrzc_ex");//  赡养老人支出
+        configSet.add("zfdklxzc_ex");//  住房贷款利息支出
+        configSet.add("zfzjzc_ex");//  住房租金支出
+        configSet.add("jxjyzc_ex");//  继续教育支出
+        configSet.add("fxljxjyzc_ex");//  非学历继续教育支出
+        configSet.add("yyezhzc_ex");//  婴幼儿照护支出
+        try {
+            TaxItemCollection itemColl = TaxItemFactory.getLocalInstance(ctx)
+                    .getTaxItemCollection("where state = 1");
+            for (int i = 0; i < itemColl.size(); ++i) {
+                TaxItemInfo info = itemColl.get(i);
+                String number = info.getNumber();
+                if (initSet.contains(number)) {
+                    taxItemInitMap.put(number, "T" + info.getFieldSn());
+                }
+                if (configSet.contains(number)) {
+                    taxItemConfigMap.put(number, "T" + info.getFieldSn());
+                }
+            }
+        } catch (BOSException var5) {
+            var5.printStackTrace();
+            throw new BOSException("获取个税项目报错: " + var5.getMessage());
+        }
+    }
+}

+ 46 - 0
websrc/com/kingdee/eas/custom/shuiyou/utils/ClientProxyFactoryUtils.java

@@ -0,0 +1,46 @@
+package com.kingdee.eas.custom.shuiyou.utils;
+
+import cn.com.servyou.rmi.client.ClientProxyFactory;
+import com.kingdee.bos.BOSException;
+import com.kingdee.util.StringUtils;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+/**
+ * @Description TODO
+ * @Date 2024/9/11 16:38
+ * @Created by Heyuan
+ */
+public class ClientProxyFactoryUtils {
+    /**
+     * 获取客户端代理工厂
+     *
+     * @return
+     * @throws IOException
+     * @throws BOSException
+     */
+    public static ClientProxyFactory getClientProxyFactory() throws IOException, BOSException {
+        StringBuilder errorMsg = new StringBuilder();
+        Properties properties = new Properties();
+        properties.load(new FileInputStream(System.getProperty("EAS_HOME") + "/server/properties/sy/syConfig.properties"));
+        String ip = properties.getProperty("ip");
+        if (StringUtils.isEmpty(ip)) {
+            errorMsg.append("接口ip不能为空,请检查配置文件/server/properties/sy/syConfig.properties\n");
+        }
+        String appKey = properties.getProperty("appKey");
+        if (StringUtils.isEmpty(appKey)) {
+            errorMsg.append("接口appKey不能为空,请检查配置文件/server/properties/sy/syConfig.properties\n");
+        }
+        String appSecret = properties.getProperty("appSecret");
+        if (StringUtils.isEmpty(appSecret)) {
+            errorMsg.append("接口appSecret不能为空,请检查配置文件/server/properties/sy/syConfig.properties\n");
+        }
+        if (errorMsg.length() > 0) {
+            throw new BOSException(errorMsg.toString());
+        }
+        //客户端代理工厂
+        return new ClientProxyFactory(appKey, appSecret, ip);
+    }
+}