Ver código fonte

业务招待制度、业务招待清单、业务招待申请单推送国资委

dingsixi 2 semanas atrás
pai
commit
eafe4f2926

+ 40 - 9
base/nckd-base-common/src/main/java/nckd/base/common/utils/GzwSyncBillUtils.java

@@ -12,6 +12,34 @@ import java.util.Map;
  * @create: 2025/12/22 23:04
  */
 public class GzwSyncBillUtils {
+    /**
+     * 设置国资委采集平台对应的表名(业务招待清单-基础信息)
+     */
+    public final static String BIZ_RECEPTION_LIST = "biz_reception_list";
+    /**
+     * 设置国资委采集平台对应的表名(业务招待清单子表-出席人列表)
+     */
+    public final static String BIZ_ATTEND = "biz_attend";
+    /**
+     * 设置国资委采集平台对应的表名(业务招待清单-用餐安排-宴请)
+     */
+    public final static String BIZ_ENTERTAIN = "biz_entertain";
+    /**
+     * 设置国资委采集平台对应的表名(业务招待清单-用餐安排- 日常用餐)
+     */
+    public final static String BIZ_MEAL = "biz_meal";
+    /**
+     * 设置国资委采集平台对应的表名(业务招待清单-住宿安排)
+     */
+    public final static String BIZ_STAY = "biz_stay";
+    /**
+     * 设置国资委采集平台对应的表名(业务招待清单-纪念品)
+     */
+    public final static String BIZ_SOUVENIR = "biz_souvenir";
+    /**
+     * 设置国资委采集平台对应的表名(业务招待申请单)
+     */
+    public final static String BIZ_RECEPTION_APPLY = "biz_reception_apply";
 
     /**
      * 设置国资委采集平台对应的表名(业务招待制度)
@@ -22,13 +50,16 @@ public class GzwSyncBillUtils {
      * 设置国资委采集平台对应的表名(业务招待附件表)
      */
     public final static String BIZ_FILE = "biz_file";
+    /**
+     * 设置国资委采集平台对应的表名(业务审批记录)
+     */
+    public final static String BIZ_APPROVE_RECORD = "biz_approve_record";
 
     /**
-     *
      * @param bizPolicy 业务招待制度
      * @return 将单据数据转换成XML动态参数内容
      */
-    public static LinkedHashMap<String,Object> getBizPolicyData(DynamicObject bizPolicy){
+    public static LinkedHashMap<String, Object> getBizPolicyData(DynamicObject bizPolicy) {
         String id = bizPolicy.getString(BaseFieldConst.ID);
         //业务单元
         DynamicObject org = bizPolicy.getDynamicObject("nckd_org");
@@ -39,15 +70,15 @@ public class GzwSyncBillUtils {
         //制度名称
         String regulationName = bizPolicy.getString("name");
         //印发时间
-        String issueTime = DateUtil.date2str(bizPolicy.getDate("nckd_issuetime"),DateUtil.DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS);
+        String issueTime = DateUtil.date2str(bizPolicy.getDate("nckd_issuetime"), DateUtil.DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS);
 
         //XML单据参数内容 保证XML生成顺序
-        LinkedHashMap<String,Object> dynamicData = new LinkedHashMap<>();
-        dynamicData.put("uuid",id);
-        dynamicData.put("enterprise_name",enterpriseName);
-        dynamicData.put("credit_code",creditCode);
-        dynamicData.put("regulation_name",regulationName);
-        dynamicData.put("issue_time",issueTime);
+        LinkedHashMap<String, Object> dynamicData = new LinkedHashMap<>();
+        dynamicData.put("uuid", id);
+        dynamicData.put("enterprise_name", enterpriseName);
+        dynamicData.put("credit_code", creditCode);
+        dynamicData.put("regulation_name", regulationName);
+        dynamicData.put("issue_time", issueTime);
 
         return dynamicData;
     }

+ 134 - 84
nckd-fi/src/main/java/nckd/fi/er/opplugin/BizPolicyPushOpPlugin.java

@@ -6,110 +6,160 @@ import kd.bos.entity.plugin.PreparePropertysEventArgs;
 import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
 import kd.bos.servicehelper.AttachmentServiceHelper;
 import nckd.base.common.utils.*;
+import nckd.fi.er.opplugin.config.DatasetConfig;
 
 import java.io.File;
 import java.util.*;
 import java.util.stream.Collectors;
 
 /**
- * @description:业务招待制度推送国资委
+ * @description:业务招待制度推送国资委,其他逻辑不要写在此处
  * @author: dingsixi
  * @create: 2025/12/22 18:14
  */
-public class BizPolicyPushOpPlugin extends AbstractOperationServicePlugIn {
-
+public class BizPolicyPushOpPlugin extends GzwPushOpPlugin {
 
     @Override
-    public void onPreparePropertys(PreparePropertysEventArgs e) {
-        super.onPreparePropertys(e);
-        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    protected List<DatasetConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter) {
+        List<DatasetConfig> configs = new ArrayList<>();
+        //所有资源代号信息
+        String resParam = (String) sysCtrlParameter.get("nckd_res");
+
+        // 基础信息
+        Map<String, String> mainResMap = GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_REGULATION, resParam);
+        configs.add(new DatasetConfig(GzwSyncBillUtils.BIZ_REGULATION, mainResMap));
+
+        return configs;
     }
 
     @Override
-    public void endOperationTransaction(EndOperationTransactionArgs e) {
-        super.endOperationTransaction(e);
-        DynamicObject[] dataEntities = e.getDataEntities();
-        //业务招待制度推送国资委
-        pushGzw(dataEntities, e);
+    protected LinkedHashMap<String, Object> convertMainBillData(DynamicObject bill) {
+        // 获取基础信息XML动态参数
+        return GzwSyncBillUtils.getBizPolicyData(bill);
     }
 
+    @Override
+    protected String getAttachmentPanelField() {
+        //单据附件面板标识
+        return "nckd_attachmentpanelap";
+    }
 
-    private void pushGzw(DynamicObject[] bizPolicys, EndOperationTransactionArgs e) {
-        //当前时间年月日时分秒
-        String cusDateStr = GzwCommonUtils.getCusDateStr();
-        //获取费控系统参数
-        Map<String, Object> sysCtrlParameter = ParamUtils.getSysCtrlParameter(ParamUtils.EM);
-        //获取资源代号信息 基础信息
-        Map<String, String> resMap = GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_REGULATION, (String) sysCtrlParameter.get("nckd_res"));
-        //获取资源代号信息 附件信息
-        Map<String, String> attrResMap = GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_FILE, (String) sysCtrlParameter.get("nckd_res"));
-
-        //获取版本号
-        String ver = (String) sysCtrlParameter.get("nckd_ver");
-        //接口代号
-        String apiCode = (String) sysCtrlParameter.get("nckd_apicode");
-        //基础信息资源代号
-        String resCode = resMap.get("nckd_rescode");
-        //附件信息资源代号
-        String attrResCode = attrResMap.get("nckd_rescode");
-
-
-        Object[] ids = Arrays.stream(bizPolicys).map(it -> it.getString("id")).toArray();
-        //获取所有单据附件面板信息
-        Map<String, List<Map<String, Object>>> bizPolicyAttrMap = AttachmentServiceHelper.getAttachments(this.billEntityType.getName(),
-                ids, "nckd_attachmentpanelap", Boolean.FALSE);
-
-
-        //业务单据根据业务单元统一社会信用代码分组
-        Map<String, List<DynamicObject>> bizPolicyByOrgCodeMap = Arrays.stream(bizPolicys).collect(Collectors.groupingBy(
-                it -> it.getString("nckd_code")
-        ));
-
-        for (Map.Entry<String, List<DynamicObject>> bizPolicyEntrySet : bizPolicyByOrgCodeMap.entrySet()) {
-            //统一社会信用代码
-            String orgCode = bizPolicyEntrySet.getKey();
-            List<DynamicObject> bizPolicyList = bizPolicyEntrySet.getValue();
-            //将所有单据数据转换成动态参数
-            List<LinkedHashMap<String, Object>> dataList = new ArrayList<>();
-            //将所有单据附件数据转换成动态参数
-            List<LinkedHashMap<String, Object>> attrDataList = new ArrayList<>();
-
-            //所有单据附件信息
-            List<File> billAttrFileList = new ArrayList<>();
-
-            //生成XMLRecords内容
-            for (DynamicObject bizPolicy : bizPolicyList) {
-                //业务单元
-                DynamicObject org = bizPolicy.getDynamicObject("nckd_org");
-                //获取数据标识
-                String dataFlag = GzwCommonUtils.getDataFlag(e.getOperationKey(), bizPolicy);
-
-                //将单据数据转换成XML动态参数内容
-                LinkedHashMap<String, Object> dynamicData = GzwSyncBillUtils.getBizPolicyData(bizPolicy);
-                //XML固定参数内容
-                Map<String, Object> fixedData = GzwCommonUtils.getFixedData(resMap, org, dataFlag);
-                dynamicData.putAll(fixedData);
-                dataList.add(dynamicData);
-
-                //获取单据附件信息
-                List<Map<String, Object>> bizPolicyAttr = bizPolicyAttrMap.getOrDefault(bizPolicy.getString("id"), Collections.emptyList());
-                //附件信息转File、附件信息生成动态参数
-                GzwCommonUtils.getBillAttrDataAndFile(bizPolicyAttr,billAttrFileList,attrDataList,fixedData);
-            }
-
-            Map<String,Object> xmlMap = new HashMap<>();
-            //基础信息
-            xmlMap.put(resCode,dataList);
-            //附件信息
-            xmlMap.put(attrResCode,attrDataList);
+    @Override
+    protected String getOrgCode(DynamicObject bill) {
+        //社会统一信用代码
+        return bill.getString("nckd_code");
+    }
 
-            //将单据数据动态参数生成XML文件,附件转为FIle文件,合并生成zip文件
-            File zipFile = GzwCommonUtils.createZipFile(orgCode, ver, cusDateStr, xmlMap, billAttrFileList, apiCode);
+    @Override
+    protected DynamicObject getBillOrg(DynamicObject bill) {
+        //单据组织字段
+        return bill.getDynamicObject("nckd_org");
+    }
 
-            //TODO 推送国资委数据采集平台接口,记录日志,单据信息记录是否推送成功
+    @Override
+    protected boolean isMainDataset(String resourceType) {
+        //设置基础信息资源代号
+        return GzwSyncBillUtils.BIZ_REGULATION.equals(resourceType);
+    }
 
-        }
+    @Override
+    protected List<LinkedHashMap<String, Object>> convertSubDatasetData(String resourceType, DynamicObject bill) {
+        //不需要推送单据明细,返回空
+        return Collections.emptyList();
+    }
 
 
-    }
+//    @Override
+//    public void onPreparePropertys(PreparePropertysEventArgs e) {
+//        super.onPreparePropertys(e);
+//        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+//    }
+//
+//    @Override
+//    public void endOperationTransaction(EndOperationTransactionArgs e) {
+//        super.endOperationTransaction(e);
+//        DynamicObject[] dataEntities = e.getDataEntities();
+//        //业务招待制度推送国资委
+//        pushGzw(dataEntities, e);
+//    }
+//
+//
+//    private void pushGzw(DynamicObject[] bizPolicys, EndOperationTransactionArgs e) {
+//        //当前时间年月日时分秒
+//        String cusDateStr = GzwCommonUtils.getCusDateStr();
+//        //获取费控系统参数
+//        Map<String, Object> sysCtrlParameter = ParamUtils.getSysCtrlParameter(ParamUtils.EM);
+//        //获取资源代号信息 基础信息
+//        Map<String, String> resMap = GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_REGULATION, (String) sysCtrlParameter.get("nckd_res"));
+//        //获取资源代号信息 附件信息
+//        Map<String, String> attrResMap = GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_FILE, (String) sysCtrlParameter.get("nckd_res"));
+//
+//        //获取版本号
+//        String ver = (String) sysCtrlParameter.get("nckd_ver");
+//        //接口代号
+//        String apiCode = (String) sysCtrlParameter.get("nckd_apicode");
+//        //基础信息资源代号
+//        String resCode = resMap.get("nckd_rescode");
+//        //附件信息资源代号
+//        String attrResCode = attrResMap.get("nckd_rescode");
+//
+//
+//        Object[] ids = Arrays.stream(bizPolicys).map(it -> it.getString("id")).toArray();
+//        //获取所有单据附件面板信息
+//        Map<String, List<Map<String, Object>>> bizPolicyAttrMap = AttachmentServiceHelper.getAttachments(this.billEntityType.getName(),
+//                ids, "nckd_attachmentpanelap", Boolean.FALSE);
+//
+//
+//        //业务单据根据业务单元统一社会信用代码分组
+//        Map<String, List<DynamicObject>> bizPolicyByOrgCodeMap = Arrays.stream(bizPolicys).collect(Collectors.groupingBy(
+//                it -> it.getString("nckd_code")
+//        ));
+//
+//        for (Map.Entry<String, List<DynamicObject>> bizPolicyEntrySet : bizPolicyByOrgCodeMap.entrySet()) {
+//            //统一社会信用代码
+//            String orgCode = bizPolicyEntrySet.getKey();
+//            List<DynamicObject> bizPolicyList = bizPolicyEntrySet.getValue();
+//            //将所有单据数据转换成动态参数
+//            List<LinkedHashMap<String, Object>> dataList = new ArrayList<>();
+//            //将所有单据附件数据转换成动态参数
+//            List<LinkedHashMap<String, Object>> attrDataList = new ArrayList<>();
+//
+//            //所有单据附件信息
+//            List<File> billAttrFileList = new ArrayList<>();
+//
+//            //生成XMLRecords内容
+//            for (DynamicObject bizPolicy : bizPolicyList) {
+//                //业务单元
+//                DynamicObject org = bizPolicy.getDynamicObject("nckd_org");
+//                //获取数据标识
+//                String dataFlag = GzwCommonUtils.getDataFlag(e.getOperationKey(), bizPolicy);
+//
+//                //将单据数据转换成XML动态参数内容
+//                LinkedHashMap<String, Object> dynamicData = GzwSyncBillUtils.getBizPolicyData(bizPolicy);
+//                //XML固定参数内容
+//                Map<String, Object> fixedData = GzwCommonUtils.getFixedData(resMap, org, dataFlag);
+//                dynamicData.putAll(fixedData);
+//                dataList.add(dynamicData);
+//
+//                //获取单据附件信息
+//                List<Map<String, Object>> bizPolicyAttr = bizPolicyAttrMap.getOrDefault(bizPolicy.getString("id"), Collections.emptyList());
+//                //附件信息转File、附件信息生成动态参数
+//                GzwCommonUtils.getBillAttrDataAndFile(bizPolicyAttr,billAttrFileList,attrDataList,fixedData);
+//            }
+//
+//            Map<String,Object> xmlMap = new HashMap<>();
+//            //基础信息
+//            xmlMap.put(resCode,dataList);
+//            //附件信息
+//            xmlMap.put(attrResCode,attrDataList);
+//
+//            //将单据数据动态参数生成XML文件,附件转为FIle文件,合并生成zip文件
+//            File zipFile = GzwCommonUtils.createZipFile(orgCode, ver, cusDateStr, xmlMap, billAttrFileList, apiCode);
+//
+//            //TODO 推送国资委数据采集平台接口,记录日志,单据信息记录是否推送成功
+//
+//        }
+//
+//
+//    }
 }

+ 64 - 0
nckd-fi/src/main/java/nckd/fi/er/opplugin/DailyApplyPushOpPlugin.java

@@ -0,0 +1,64 @@
+package nckd.fi.er.opplugin;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import nckd.base.common.utils.GzwCommonUtils;
+import nckd.base.common.utils.GzwSyncBillUtils;
+import nckd.fi.er.opplugin.config.DatasetConfig;
+
+import java.util.*;
+
+/**
+ * @description:业务招待申请单推送国资委,其他逻辑不要写在此处
+ * @author: dingsixi
+ * @create: 2025/12/24 18:13
+ */
+public class DailyApplyPushOpPlugin extends GzwPushOpPlugin{
+    @Override
+    protected List<DatasetConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter) {
+        List<DatasetConfig> configs = new ArrayList<>();
+        //所有资源代号信息
+        String resParam = (String) sysCtrlParameter.get("nckd_res");
+
+        // 业务招待申请单资源代号
+        Map<String, String> mainResMap = GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_RECEPTION_APPLY, resParam);
+        configs.add(new DatasetConfig(GzwSyncBillUtils.BIZ_RECEPTION_APPLY, mainResMap));
+
+        return configs;
+    }
+
+    @Override
+    protected LinkedHashMap<String, Object> convertMainBillData(DynamicObject bill) {
+        // 转换基础信息XML动态参数 TODO
+        return null;
+    }
+
+    @Override
+    protected String getAttachmentPanelField() {
+        //单据附件面板标识
+        return "attachmentpanel";
+    }
+
+    @Override
+    protected String getOrgCode(DynamicObject bill) {
+        //费用承担公司.社会统一信用代码
+        return bill.getString("costcompany.uniformsocialcreditcode");
+    }
+
+    @Override
+    protected DynamicObject getBillOrg(DynamicObject bill) {
+        //费用承担公司
+        return bill.getDynamicObject("costcompany");
+    }
+
+    @Override
+    protected boolean isMainDataset(String resourceType) {
+        //设置基础信息资源代号
+        return GzwSyncBillUtils.BIZ_RECEPTION_APPLY.equals(resourceType);
+    }
+
+    @Override
+    protected List<LinkedHashMap<String, Object>> convertSubDatasetData(String resourceType, DynamicObject bill) {
+        //不需要推送单据明细,返回空
+       return Collections.emptyList();
+    }
+}

+ 97 - 0
nckd-fi/src/main/java/nckd/fi/er/opplugin/EntertainmentPushOpPlugin.java

@@ -0,0 +1,97 @@
+package nckd.fi.er.opplugin;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import nckd.base.common.utils.GzwCommonUtils;
+import nckd.base.common.utils.GzwSyncBillUtils;
+import nckd.fi.er.opplugin.config.DatasetConfig;
+
+import java.util.*;
+
+/**
+ * @description:业务招待清单推送国资委,其他逻辑不要写在此处
+ * @author: dingsixi
+ * @create: 2025/12/24 18:39
+ */
+public class EntertainmentPushOpPlugin extends GzwPushOpPlugin {
+    @Override
+    protected List<DatasetConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter) {
+        List<DatasetConfig> configs = new ArrayList<>();
+        //所有资源代号信息
+        String resParam = (String) sysCtrlParameter.get("nckd_res");
+
+        // 业务招待清单-基础信息
+        configs.add(new DatasetConfig(GzwSyncBillUtils.BIZ_RECEPTION_LIST, GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_RECEPTION_LIST, resParam)));
+        // 业务招待清单子表-出席人列表
+        configs.add(new DatasetConfig(GzwSyncBillUtils.BIZ_ATTEND, GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_ATTEND, resParam)));
+        // 业务招待清单-用餐安排-宴请
+        configs.add(new DatasetConfig(GzwSyncBillUtils.BIZ_ENTERTAIN, GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_ENTERTAIN, resParam)));
+        // 业务招待清单-用餐安排- 日常用餐
+        configs.add(new DatasetConfig(GzwSyncBillUtils.BIZ_MEAL, GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_MEAL, resParam)));
+        // 业务招待清单-住宿安排
+        configs.add(new DatasetConfig(GzwSyncBillUtils.BIZ_STAY, GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_STAY, resParam)));
+        // 业务招待清单-纪念品
+        configs.add(new DatasetConfig(GzwSyncBillUtils.BIZ_SOUVENIR, GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_SOUVENIR, resParam)));
+
+        return configs;
+    }
+
+    @Override
+    protected LinkedHashMap<String, Object> convertMainBillData(DynamicObject bill) {
+        // 转换基础信息XML动态参数 TODO
+        return null;
+    }
+
+    @Override
+    protected List<LinkedHashMap<String, Object>> convertSubDatasetData(String resourceType, DynamicObject bill) {
+        List<LinkedHashMap<String, Object>> result = new ArrayList<>();
+        //不需要,可不是实现此方法
+        switch (resourceType) {
+            case GzwSyncBillUtils.BIZ_ATTEND:
+                // 业务招待清单子表-出席人列表
+                break;
+            case GzwSyncBillUtils.BIZ_ENTERTAIN:
+                // 业务招待清单-用餐安排-宴请
+                break;
+            case GzwSyncBillUtils.BIZ_MEAL:
+                // 业务招待清单-用餐安排- 日常用餐
+                break;
+            case GzwSyncBillUtils.BIZ_STAY:
+                // 业务招待清单-住宿安排
+                break;
+            case GzwSyncBillUtils.BIZ_SOUVENIR:
+                // 业务招待清单-纪念品
+                break;
+            default:
+                break;
+        }
+
+        return result;
+    }
+
+    @Override
+    protected String getAttachmentPanelField() {
+        //单据附件面板标识
+        return "nckd_attachmentpanelap";
+    }
+
+    @Override
+    protected String getOrgCode(DynamicObject bill) {
+        //公司.社会统一信用代码
+        return bill.getString("company.uniformsocialcreditcode");
+    }
+
+
+    @Override
+    protected DynamicObject getBillOrg(DynamicObject bill) {
+        //公司
+        return bill.getDynamicObject("company");
+    }
+
+    @Override
+    protected boolean isMainDataset(String resourceType) {
+        //设置基础信息资源代号
+        return GzwSyncBillUtils.BIZ_RECEPTION_LIST.equals(resourceType);
+    }
+
+
+}

+ 247 - 0
nckd-fi/src/main/java/nckd/fi/er/opplugin/GzwPushOpPlugin.java

@@ -0,0 +1,247 @@
+package nckd.fi.er.opplugin;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
+import kd.bos.servicehelper.AttachmentServiceHelper;
+import nckd.base.common.utils.GzwCommonUtils;
+import nckd.base.common.utils.GzwSyncBillUtils;
+import nckd.base.common.utils.ParamUtils;
+import nckd.fi.er.opplugin.config.DatasetConfig;
+
+import java.io.File;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @description:业务招待推送国资委数据采集平台父类
+ * @author: dingsixi
+ * @create: 2025/12/24 17:24
+ */
+public abstract class GzwPushOpPlugin extends AbstractOperationServicePlugIn {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        e.getFieldKeys().addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        super.endOperationTransaction(e);
+        DynamicObject[] dataEntities = e.getDataEntities();
+        pushGzw(dataEntities, e);
+    }
+
+    /**
+     * 推送国资委数据采集平台统一方法
+     */
+    protected void pushGzw(DynamicObject[] bills, EndOperationTransactionArgs e) {
+        // 获取当前时间
+        String cusDateStr = GzwCommonUtils.getCusDateStr();
+
+        // 获取费控系统参数
+        Map<String, Object> sysCtrlParameter = ParamUtils.getSysCtrlParameter(ParamUtils.EM);
+
+        // 获取接口代号和版本号
+        String ver = (String) sysCtrlParameter.get("nckd_ver");
+        String apiCode = getApiCode(sysCtrlParameter);
+
+        // 获取单据对应的所有资源代号信息
+        List<DatasetConfig> datasetConfigs = getDatasetConfigs(sysCtrlParameter);
+        //获取资源代号信息 附件信息
+        Map<String, String> attrResMap = GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_FILE, (String) sysCtrlParameter.get("nckd_res"));
+        //附件信息资源代号
+        String attrResCode = attrResMap.get("nckd_rescode");
+
+        // 获取所有单据附件
+        Object[] ids = Arrays.stream(bills).map(it -> it.getString("id")).toArray();
+        Map<String, List<Map<String, Object>>> billAttrMap = AttachmentServiceHelper.getAttachments(
+                this.billEntityType.getName(),
+                ids,
+                getAttachmentPanelField(),
+                Boolean.FALSE
+        );
+
+        // 根据组织统一社会信息代码分组
+        Map<String, List<DynamicObject>> billsByOrgCode = Arrays.stream(bills)
+                .collect(Collectors.groupingBy(this::getOrgCode));
+
+        for (Map.Entry<String, List<DynamicObject>> entry : billsByOrgCode.entrySet()) {
+            //统一社会信用代码
+            String orgCode = entry.getKey();
+            List<DynamicObject> billList = entry.getValue();
+
+            // 构建所有数据集的数据
+            Map<String, Object> xmlMap = new HashMap<>();
+            //单据所有附件
+            List<File> allAttachFiles = new ArrayList<>();
+
+            // 处理每张单据
+            for (DynamicObject bill : billList) {
+                DynamicObject org = getBillOrg(bill);
+                String dataFlag = GzwCommonUtils.getDataFlag(e.getOperationKey(), bill);
+
+                // 处理每个数据集
+                for (DatasetConfig config : datasetConfigs) {
+
+                    // 获取该数据集的数据
+                    List<LinkedHashMap<String, Object>> datasetData = convertDatasetData(
+                            config.getResourceType(),
+                            bill,
+                            dataFlag,
+                            config.getResMap(),
+                            org
+                    );
+
+                    //设置资源代号XML参数
+                    setResCodeData(config,xmlMap,datasetData);
+                }
+
+                //将单据附件信息转成动态参数及File文件
+                getBillAttrDataAndFile(billAttrMap,bill,attrResMap,dataFlag,org,allAttachFiles,attrResCode,xmlMap);
+
+                //TODO 审批记录
+
+            }
+
+            // 生成ZIP文件
+            File zipFile = GzwCommonUtils.createZipFile(orgCode, ver, cusDateStr, xmlMap, allAttachFiles, apiCode);
+
+            // 推送并记录日志
+//            pushToGzwPlatform(zipFile, billList, e);
+        }
+    }
+
+    /**
+     * 转换指定数据集的数据
+     */
+    protected List<LinkedHashMap<String, Object>> convertDatasetData(
+            String resourceType,
+            DynamicObject bill,
+            String dataFlag,
+            Map<String, String> resMap,
+            DynamicObject org) {
+
+        Map<String, Object> fixedData = GzwCommonUtils.getFixedData(resMap, org, dataFlag);
+        List<LinkedHashMap<String, Object>> result = new ArrayList<>();
+
+        if (isMainDataset(resourceType)) {
+            // 单据基础信息
+            LinkedHashMap<String, Object> billData = convertMainBillData(bill);
+            billData.putAll(fixedData);
+            result.add(billData);
+        } else {
+            // 单据明细
+            List<LinkedHashMap<String, Object>> subDataList = convertSubDatasetData(resourceType, bill);
+            for (LinkedHashMap<String, Object> subData : subDataList) {
+                subData.putAll(fixedData);
+                result.add(subData);
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     *
+     * 设置资源代号XML参数
+     *
+     * @param config 资源代号配置信息
+     * @param xmlMap  当前组织下所有的xml文件
+     * @param datasetData 当前资源代号XML参数
+     */
+    private void setResCodeData(DatasetConfig config,Map<String, Object> xmlMap,List<LinkedHashMap<String, Object>> datasetData){
+        // 资源代号
+        String resCode = config.getResCode();
+        //获取XMLMap已生成的动态参数
+        List<LinkedHashMap<String, Object>> existingData =
+                (List<LinkedHashMap<String, Object>>) xmlMap.getOrDefault(resCode, new ArrayList<>());
+        //单据数据资源代号相同数据XML合并至一起
+        existingData.addAll(datasetData);
+        xmlMap.put(resCode, existingData);
+    }
+
+    /**
+     *
+     * 将单据附件信息转成动态参数及File文件
+     *
+     * @param billAttrMap 所有单据附件信息
+     * @param bill 当前单据
+     * @param attrResMap 业务招待附件表资源代号信息
+     * @param dataFlag 数据标识
+     * @param org 单据组织
+     * @param allAttachFiles 当前组织下所有的附件信息
+     * @param attrResCode 附件表资源代号
+     * @param xmlMap 当前组织下所有的xml文件
+     */
+    private void getBillAttrDataAndFile(Map<String, List<Map<String, Object>>> billAttrMap,DynamicObject bill,
+                     Map<String, String> attrResMap,String dataFlag,DynamicObject org,
+                     List<File> allAttachFiles,String attrResCode,Map<String, Object> xmlMap){
+        // 获取当前单据附件信息
+        List<Map<String, Object>> billAttachments = billAttrMap.getOrDefault(
+                bill.getString("id"),
+                Collections.emptyList()
+        );
+        if(billAttachments.isEmpty()){
+            return;
+        }
+
+        //当前附件表资源代号对应的XMl参数信息
+        List<LinkedHashMap<String, Object>> existingAttachData =
+                (List<LinkedHashMap<String, Object>>) xmlMap.getOrDefault(attrResCode, new ArrayList<>());
+
+        //将单据附件信息转成动态参数及File文件
+        GzwCommonUtils.getBillAttrDataAndFile(billAttachments, allAttachFiles, existingAttachData,
+                GzwCommonUtils.getFixedData(attrResMap, org, dataFlag));
+
+        //更新附件XML参数
+        xmlMap.put(attrResCode, existingAttachData);
+    }
+
+
+    /**
+     * 获取所有数据集配置
+     *
+     * @return 数据集配置列表
+     */
+    protected abstract List<DatasetConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter);
+
+    /**
+     * 获取附件面板字段名
+     */
+    protected abstract String getAttachmentPanelField();
+
+    /**
+     * 获取组织代码(分组依据)
+     */
+    protected abstract String getOrgCode(DynamicObject bill);
+
+    /**
+     * 获取单据对应的组织
+     */
+    protected abstract DynamicObject getBillOrg(DynamicObject bill);
+
+    /**
+     * 判断是否是单据基础信息
+     */
+    protected abstract boolean isMainDataset(String resourceType);
+
+    /**
+     * 转换单据基础信息
+     */
+    protected abstract LinkedHashMap<String, Object> convertMainBillData(DynamicObject bill);
+
+    /**
+     * 转换单据明细数据、审批数据
+     */
+    protected abstract List<LinkedHashMap<String, Object>> convertSubDatasetData(String resourceType, DynamicObject bill);
+
+    /**
+     * 获取接口代号
+     */
+    protected String getApiCode(Map<String, Object> sysCtrlParameter) {
+        return (String) sysCtrlParameter.get("nckd_apicode");
+    }
+}

+ 35 - 0
nckd-fi/src/main/java/nckd/fi/er/opplugin/config/DatasetConfig.java

@@ -0,0 +1,35 @@
+package nckd.fi.er.opplugin.config;
+
+import java.util.Map;
+
+/**
+ * @description:资源代号配置类
+ * @author: dingsixi
+ * @create: 2025/12/24 17:28
+ */
+public class DatasetConfig {
+    private String resourceType;  // 资源类型,如:BIZ_REGULATION, BIZ_DETAIL等
+    private Map<String, String> resMap;  // 资源映射
+    private String resCode;       // 资源代号
+
+    // 构造函数
+    public DatasetConfig(String resourceType,
+                         Map<String, String> resMap) {
+        this.resourceType = resourceType;
+        this.resMap = resMap;
+        this.resCode = resMap.get("nckd_rescode");
+    }
+
+    // getter和setter方法
+    public String getResourceType() { return resourceType; }
+    public void setResourceType(String resourceType) { this.resourceType = resourceType; }
+
+    public Map<String, String> getResMap() { return resMap; }
+    public void setResMap(Map<String, String> resMap) {
+        this.resMap = resMap;
+        this.resCode = resMap.get("nckd_rescode");
+    }
+
+    public String getResCode() { return resCode; }
+
+}