浏览代码

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

dingsixi 2 周之前
父节点
当前提交
2f00b3a6e4

+ 3 - 3
nckd-fi/src/main/java/nckd/fi/er/opplugin/config/DatasetConfig.java → base/nckd-base-common/src/main/java/nckd/base/common/config/ResCodeConfig.java

@@ -1,4 +1,4 @@
-package nckd.fi.er.opplugin.config;
+package nckd.base.common.config;
 
 import java.util.Map;
 
@@ -7,13 +7,13 @@ import java.util.Map;
  * @author: dingsixi
  * @create: 2025/12/24 17:28
  */
-public class DatasetConfig {
+public class ResCodeConfig {
     private String resourceType;  // 资源类型,如:BIZ_REGULATION, BIZ_DETAIL等
     private Map<String, String> resMap;  // 资源映射
     private String resCode;       // 资源代号
 
     // 构造函数
-    public DatasetConfig(String resourceType,
+    public ResCodeConfig(String resourceType,
                          Map<String, String> resMap) {
         this.resourceType = resourceType;
         this.resMap = resMap;

+ 207 - 0
base/nckd-base-common/src/main/java/nckd/base/common/utils/GzwCommonUtils.java

@@ -1,11 +1,22 @@
 package nckd.base.common.utils;
 
 import com.alibaba.fastjson.JSONObject;
+import kd.bos.bos.servicehelper.ServiceFactory;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.exception.KDBizException;
 import kd.bos.fileservice.FileService;
 import kd.bos.fileservice.FileServiceFactory;
+import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
+import kd.bos.workflow.component.approvalrecord.IApprovalRecordGroup;
+import kd.bos.workflow.component.approvalrecord.IApprovalRecordItem;
+import kd.bos.workflow.engine.TaskService;
+import kd.bos.workflow.engine.WfUtils;
+import kd.bos.workflow.engine.impl.persistence.entity.task.component.ApprovalRecordItem;
+import kd.bos.workflow.service.WorkflowService;
+import nckd.base.common.config.ResCodeConfig;
+import nckd.base.common.constant.BaseFieldConst;
 import nckd.base.common.constant.OperationKeyConst;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.*;
@@ -37,6 +48,10 @@ public class GzwCommonUtils {
      */
     public static File createZipFile(String orgCode, String ver, String cusDateStr, Map<String, Object> xmlMap,
                                      List<File> billAttrFileList, String apiCode) {
+        //单据XMl参数为空
+        if (xmlMap.isEmpty()) {
+            return null;
+        }
         List<File> xmlFileList = new ArrayList<>();
         //生成单据数据XML文件
         for (Map.Entry<String, Object> entry : xmlMap.entrySet()) {
@@ -73,6 +88,106 @@ public class GzwCommonUtils {
         return GzwCommonUtils.saveXmlToFile(GzwXmlUtils.generateXml(dataList), xmlFileName);
     }
 
+    /**
+     * 设置资源代号XML参数
+     *
+     * @param config      资源代号配置信息
+     * @param xmlMap      当前组织下所有的xml文件
+     * @param datasetData 当前资源代号XML参数
+     */
+    public static void setResCodeData(ResCodeConfig 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);
+    }
+
+    /**
+     *
+     * @param bill 单据
+     * @param auditResMap 业务审批记录资源代号信息
+     * @param dataFlag 数据标识
+     * @param org 单据组织
+     * @param auditResCode 业务审批记录资源代号
+     * @param xmlMap 单据XML参数
+     */
+    public static void getBillApprovalRecordsData(DynamicObject bill, Map<String, String> auditResMap, String dataFlag,
+                                                  DynamicObject org, String auditResCode, Map<String, Object> xmlMap) {
+
+        //获取单据审批记录
+        List<IApprovalRecordGroup> approvalRecords = WorkflowServiceHelper.getApprovalRecords(bill.getDynamicObjectType().getName(), bill.getPkValue().toString(), false);
+        if(ObjectUtils.isEmpty(approvalRecords)){
+            return;
+        }
+
+        //将审批记录格式化为map对象
+        List<Map<String, Object>> approvalRecordForFormat = getApprovalRecordForFormat(approvalRecords);
+
+        Map<String, Object> fixedData = GzwCommonUtils.getFixedData(auditResMap, org, dataFlag);
+
+        //当前附件表资源代号对应的XMl参数信息
+        List<LinkedHashMap<String, Object>> existingAttachData =
+                (List<LinkedHashMap<String, Object>>) xmlMap.getOrDefault(auditResCode, new ArrayList<>());
+
+        for (int i = 0; i < approvalRecordForFormat.size(); i++) {
+            Map<String, Object> map = approvalRecordForFormat.get(i);
+
+            LinkedHashMap<String, Object> data = new LinkedHashMap<>();
+            data.put("uuid",map.get("activityid"));
+            data.put("biz_uuid",bill.getString(BaseFieldConst.ID));
+            data.put("node_name",map.get("activityname"));
+            data.put("handler",map.get("assignee"));
+            data.put("handle_status",map.get("result"));
+            data.put("handle_time",map.get("formatstrtime"));
+            data.put("handle_opinion",map.get("message"));
+            data.putAll(fixedData);
+            existingAttachData.add(data);
+        }
+
+        //更新审批记录XML参数
+        xmlMap.put(auditResCode, existingAttachData);
+    }
+
+    /**
+     * 将单据附件信息转成动态参数及File文件
+     *
+     * @param billAttrMap    所有单据附件信息
+     * @param bill           当前单据
+     * @param attrResMap     业务招待附件表资源代号信息
+     * @param dataFlag       数据标识
+     * @param org            单据组织
+     * @param allAttachFiles 当前组织下所有的附件信息
+     * @param attrResCode    附件表资源代号
+     * @param xmlMap         当前组织下所有的xml文件
+     */
+    public static 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);
+    }
+
     /**
      * @param attachments      单据附件信息
      * @param billAttrFileList 单据附件File文件
@@ -335,4 +450,96 @@ public class GzwCommonUtils {
         }
     }
 
+
+    /**
+     * 获取审批记录格式化  参考按钮查看审批记录的实现
+     */
+    public static List<Map<String, Object>> getApprovalRecordForFormat(List<IApprovalRecordGroup> approvalRecordGroups) {
+        if (null != approvalRecordGroups && !approvalRecordGroups.isEmpty()) {
+            List<Map<String, Object>> approvalRecordList = new ArrayList<>(approvalRecordGroups.size() * 2);
+            Map<String, Object> approvalRecordMap = null;
+            List<IApprovalRecordItem> items = null;
+            String activityName = null;
+            List<IApprovalRecordGroup> approvalRecordItemsForCallActivities = null;
+            List<Map<String, Object>> approvalRecordItemsForCallActivityList = null;
+            String message = null;
+            String messageForAddSign = null;
+            ApprovalRecordItem recordItem = null;
+            Iterator<IApprovalRecordGroup> parentIterator = approvalRecordGroups.iterator();
+
+            label120:
+            while (true) {
+                IApprovalRecordGroup group;
+                do {
+                    do {
+                        do {
+                            if (!parentIterator.hasNext()) {
+                                return approvalRecordList;
+                            }
+
+                            group = (IApprovalRecordGroup) parentIterator.next();
+                        } while (null == group);
+                        items = group.getChildren();
+                    } while (null == items);
+                } while (items.isEmpty());
+
+                Iterator<IApprovalRecordItem> childrenIterator = items.iterator();
+
+                while (true) {
+                    while (true) {
+                        IApprovalRecordItem item;
+                        do {
+                            if (!childrenIterator.hasNext()) {
+                                continue label120;
+                            }
+
+                            item = (IApprovalRecordItem) childrenIterator.next();
+                        } while (null == item);
+
+                        recordItem = (ApprovalRecordItem) item;
+                        if (recordItem.isCallActivity()) {
+                            approvalRecordItemsForCallActivities = getTaskService().queryApprovalRecord(Long.valueOf(recordItem.getProcInstId()), (String) null);
+                            approvalRecordItemsForCallActivityList = getApprovalRecordForFormat(approvalRecordItemsForCallActivities);
+                            if (null != approvalRecordItemsForCallActivityList && !approvalRecordItemsForCallActivityList.isEmpty()) {
+                                approvalRecordList.addAll(approvalRecordItemsForCallActivityList);
+                            }
+                        } else {
+                            approvalRecordMap = new HashMap<>(9);
+                            activityName = item.getSubactivityname();
+                            String activityId = item.getActivityId();
+                            if (WfUtils.isEmpty(activityName)) {
+                                activityName = item.getActivityName();
+                            }
+
+                            if (WfUtils.isEmpty(activityName)) {
+                                activityName = group.getActivityName();
+                            }
+
+                            approvalRecordMap.put("activityname", activityName);
+                            approvalRecordMap.put("activityid", activityId);
+                            approvalRecordMap.put("assignee", item.getAssignee());
+                            approvalRecordMap.put("result", item.getResult());
+                            message = item.getMessage();
+                            messageForAddSign = item.getAddSignMsg();
+                            if (WfUtils.isNotEmpty(messageForAddSign)) {
+                                message = WfUtils.isEmpty(message) ? messageForAddSign : message + "\r\n" + messageForAddSign;
+                            }
+
+                            approvalRecordMap.put("message", null == message ? "" : message.replaceAll("\\<.*?>", ""));
+                            approvalRecordMap.put("formatstrtime", "willApproval".equals(recordItem.getHandleState()) ? "" : item.getTime());
+                            approvalRecordList.add(approvalRecordMap);
+                        }
+                    }
+                }
+            }
+        } else {
+            return null;
+        }
+    }
+
+    public static TaskService getTaskService() {
+        WorkflowService wfService = (WorkflowService) ServiceFactory.getService(WorkflowService.class);
+        return wfService.getTaskService();
+    }
+
 }

+ 79 - 0
base/nckd-base-common/src/main/java/nckd/base/common/utils/GzwSyncBillUtils.java

@@ -1,8 +1,11 @@
 package nckd.base.common.utils;
 
 import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
 import nckd.base.common.constant.BaseFieldConst;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
@@ -82,4 +85,80 @@ public class GzwSyncBillUtils {
 
         return dynamicData;
     }
+
+    public static LinkedHashMap<String, Object> getDailyApplyData(DynamicObject dailyApply) {
+        //费用承担公司
+        DynamicObject costCompany = dailyApply.getDynamicObject("costcompany");
+        String orgName = costCompany.getString(BaseFieldConst.NAME);
+        //统一社会信用代码
+        String orgCode = costCompany.getString("uniformsocialcreditcode");
+        //申请人
+        DynamicObject applier = dailyApply.getDynamicObject("applier");
+        //费用承担部门
+        DynamicObject costDept = dailyApply.getDynamicObject("costdept");
+        //申请时间
+        Date bizDate = dailyApply.getDate("bizdate");
+        //招待类型
+        String treatType = dailyApply.getString("treattype_bill");
+        //招待事由
+        String description = dailyApply.getString("description");
+        //来访单位
+        String visitingUnit = dailyApply.getString("nckd_lbdw");
+        //来访联系人
+        String visitingContact = dailyApply.getString("nckd_lxr");
+        //来访联系电话
+        String visitingPhone = dailyApply.getString("nckd_lxdh");
+        //预计来访时间
+        Date expectedVisitTime = dailyApply.getDate("nckd_lfsj");
+        //预计来访人数
+        int expectedVisitorCount = dailyApply.getInt("treatnum_bill");
+        //来访主宾姓名
+        String chiefGuestName = dailyApply.getString("nckd_lfzbxm");
+        //来访主宾职务
+        String chiefGuestTitle = dailyApply.getString("nckd_zw");
+
+        //费用明细
+        DynamicObjectCollection entryEntity = dailyApply.getDynamicObjectCollection("expenseentryentity");
+        //宴请人均标准  TODO 6 = 其他 ,系统内没有宴请的招待项目
+        DynamicObject yqEntry = entryEntity.stream().filter(it -> it.getString("treatway").equals("6")).findAny().orElse(null);
+        BigDecimal yqPerAvgStd = yqEntry.getBigDecimal("nckd_decimalfield");
+        //日常用餐人均标准
+        DynamicObject rcycEntry = entryEntity.stream().filter(it -> it.getString("treatway").equals("1")).findAny().orElse(null);
+        BigDecimal rcycPerAvgStd = rcycEntry.getBigDecimal("nckd_decimalfield");
+        //住宿人均标准
+        DynamicObject zsEntry = entryEntity.stream().filter(it -> it.getString("treatway").equals("2")).findAny().orElse(null);
+        BigDecimal zsPerAvgStd = zsEntry.getBigDecimal("nckd_decimalfield");
+
+        //纪念品人均标准
+        DynamicObject jnpEntry = entryEntity.stream().filter(it -> it.getString("treatway").equals("4")).findAny().orElse(null);
+        BigDecimal jnpPerAvgStd = jnpEntry.getBigDecimal("nckd_decimalfield");
+        //用车数量
+        DynamicObject ycEntry = entryEntity.stream().filter(it -> it.getString("treatway").equals("5")).findAny().orElse(null);
+        BigDecimal ycQty = ycEntry.getBigDecimal("nckd_integerfield");
+
+
+        LinkedHashMap<String, Object> dynamicData = new LinkedHashMap<>();
+        dynamicData.put("uuid",dailyApply.getString(BaseFieldConst.ID));
+        dynamicData.put("enterprise_name",orgName);
+        dynamicData.put("credit_code",orgCode);
+        dynamicData.put("handler",applier.getString(BaseFieldConst.NAME));
+        dynamicData.put("dept",costDept.getString(BaseFieldConst.NAME));
+        dynamicData.put("apply_time",DateUtil.date2str(bizDate,DateUtil.DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS));
+        dynamicData.put("reception_type",treatType);
+        dynamicData.put("reception_reason",description);
+        dynamicData.put("visit_organization",visitingUnit);
+        dynamicData.put("visit_contact",visitingContact);
+        dynamicData.put("visit_contact_phone",visitingPhone);
+        dynamicData.put("expect_visit_time",DateUtil.date2str(expectedVisitTime,DateUtil.DATE_FORMAT_YYYY_MM_DD));
+        dynamicData.put("expect_visitors",expectedVisitorCount);
+        dynamicData.put("visitor_main_name",chiefGuestName);
+        dynamicData.put("visitor_main_post",chiefGuestTitle);
+        dynamicData.put("entertain_per_standard",yqPerAvgStd);
+        dynamicData.put("meal_per_standard",rcycPerAvgStd);
+        dynamicData.put("stay_per_standard",zsPerAvgStd);
+        dynamicData.put("souvenir_per_standard",jnpPerAvgStd);
+        dynamicData.put("use_cars",ycQty);
+
+        return dynamicData;
+    }
 }

+ 4 - 10
nckd-fi/src/main/java/nckd/fi/er/opplugin/BizPolicyPushOpPlugin.java

@@ -1,16 +1,10 @@
 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.*;
-import nckd.fi.er.opplugin.config.DatasetConfig;
+import nckd.base.common.config.ResCodeConfig;
 
-import java.io.File;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @description:业务招待制度推送国资委,其他逻辑不要写在此处
@@ -20,14 +14,14 @@ import java.util.stream.Collectors;
 public class BizPolicyPushOpPlugin extends GzwPushOpPlugin {
 
     @Override
-    protected List<DatasetConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter) {
-        List<DatasetConfig> configs = new ArrayList<>();
+    protected List<ResCodeConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter) {
+        List<ResCodeConfig> 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));
+        configs.add(new ResCodeConfig(GzwSyncBillUtils.BIZ_REGULATION, mainResMap));
 
         return configs;
     }

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

@@ -3,7 +3,7 @@ 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 nckd.base.common.config.ResCodeConfig;
 
 import java.util.*;
 
@@ -14,22 +14,22 @@ import java.util.*;
  */
 public class DailyApplyPushOpPlugin extends GzwPushOpPlugin{
     @Override
-    protected List<DatasetConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter) {
-        List<DatasetConfig> configs = new ArrayList<>();
+    protected List<ResCodeConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter) {
+        List<ResCodeConfig> 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));
+        configs.add(new ResCodeConfig(GzwSyncBillUtils.BIZ_RECEPTION_APPLY, mainResMap));
 
         return configs;
     }
 
     @Override
     protected LinkedHashMap<String, Object> convertMainBillData(DynamicObject bill) {
-        // 转换基础信息XML动态参数 TODO
-        return null;
+        // 转换基础信息XML动态参数
+        return GzwSyncBillUtils.getDailyApplyData(bill);
     }
 
     @Override
@@ -40,7 +40,7 @@ public class DailyApplyPushOpPlugin extends GzwPushOpPlugin{
 
     @Override
     protected String getOrgCode(DynamicObject bill) {
-        //费用承担公司.社会统一信用代码
+        //费用承担公司.社会统一信用代码 TODO 保存提交校验费用承担公司统一社会信息代码不允许为空
         return bill.getString("costcompany.uniformsocialcreditcode");
     }
 

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

@@ -3,7 +3,7 @@ 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 nckd.base.common.config.ResCodeConfig;
 
 import java.util.*;
 
@@ -14,23 +14,23 @@ import java.util.*;
  */
 public class EntertainmentPushOpPlugin extends GzwPushOpPlugin {
     @Override
-    protected List<DatasetConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter) {
-        List<DatasetConfig> configs = new ArrayList<>();
+    protected List<ResCodeConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter) {
+        List<ResCodeConfig> 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 ResCodeConfig(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 ResCodeConfig(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 ResCodeConfig(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 ResCodeConfig(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 ResCodeConfig(GzwSyncBillUtils.BIZ_STAY, GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_STAY, resParam)));
         // 业务招待清单-纪念品
-        configs.add(new DatasetConfig(GzwSyncBillUtils.BIZ_SOUVENIR, GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_SOUVENIR, resParam)));
+        configs.add(new ResCodeConfig(GzwSyncBillUtils.BIZ_SOUVENIR, GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_SOUVENIR, resParam)));
 
         return configs;
     }

+ 18 - 67
nckd-fi/src/main/java/nckd/fi/er/opplugin/GzwPushOpPlugin.java

@@ -5,10 +5,12 @@ 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 kd.bos.servicehelper.workflow.WorkflowServiceHelper;
+import kd.bos.workflow.component.approvalrecord.IApprovalRecordGroup;
 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 nckd.base.common.config.ResCodeConfig;
 
 import java.io.File;
 import java.util.*;
@@ -49,11 +51,15 @@ public abstract class GzwPushOpPlugin extends AbstractOperationServicePlugIn {
         String apiCode = getApiCode(sysCtrlParameter);
 
         // 获取单据对应的所有资源代号信息
-        List<DatasetConfig> datasetConfigs = getDatasetConfigs(sysCtrlParameter);
+        List<ResCodeConfig> datasetConfigs = getDatasetConfigs(sysCtrlParameter);
         //获取资源代号信息 附件信息
         Map<String, String> attrResMap = GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_FILE, (String) sysCtrlParameter.get("nckd_res"));
         //附件信息资源代号
         String attrResCode = attrResMap.get("nckd_rescode");
+        //获取资源代号信息 业务审批记录
+        Map<String, String> auditResMap = GzwCommonUtils.getResMap(GzwSyncBillUtils.BIZ_APPROVE_RECORD, (String) sysCtrlParameter.get("nckd_res"));
+        //业务审批记录资源代号
+        String auditResCode = auditResMap.get("nckd_rescode");
 
         // 获取所有单据附件
         Object[] ids = Arrays.stream(bills).map(it -> it.getString("id")).toArray();
@@ -84,7 +90,7 @@ public abstract class GzwPushOpPlugin extends AbstractOperationServicePlugIn {
                 String dataFlag = GzwCommonUtils.getDataFlag(e.getOperationKey(), bill);
 
                 // 处理每个资源代号
-                for (DatasetConfig config : datasetConfigs) {
+                for (ResCodeConfig config : datasetConfigs) {
 
                     // 获取该数据集的数据
                     List<LinkedHashMap<String, Object>> datasetData = convertDatasetData(
@@ -96,19 +102,21 @@ public abstract class GzwPushOpPlugin extends AbstractOperationServicePlugIn {
                     );
 
                     //设置资源代号XML参数
-                    setResCodeData(config,xmlMap,datasetData);
+                    GzwCommonUtils.setResCodeData(config, xmlMap, datasetData);
                 }
 
-                //将单据附件信息转成动态参数及File文件
-                getBillAttrDataAndFile(billAttrMap,bill,attrResMap,dataFlag,org,allAttachFiles,attrResCode,xmlMap);
-
-                //TODO 审批记录
+                //将单据附件信息转成XML参数及File文件
+                GzwCommonUtils.getBillAttrDataAndFile(billAttrMap, bill, attrResMap, dataFlag, org, allAttachFiles, attrResCode, xmlMap);
 
+                //将单据审批记录转成XML参数
+                GzwCommonUtils.getBillApprovalRecordsData(bill,auditResMap,dataFlag,org,auditResCode,xmlMap);
             }
 
             // 生成ZIP文件
             File zipFile = GzwCommonUtils.createZipFile(orgCode, ver, cusDateStr, xmlMap, allAttachFiles, apiCode);
-
+            if (zipFile == null) {
+                return;
+            }
             // TODO 相同组织内的数据一起推送 推送并记录日志
         }
     }
@@ -143,69 +151,12 @@ public abstract class GzwPushOpPlugin extends AbstractOperationServicePlugIn {
         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 List<ResCodeConfig> getDatasetConfigs(Map<String, Object> sysCtrlParameter);
 
     /**
      * 获取附件面板字段名