Răsfoiți Sursa

feat(outdata): 增强导出导入功能支持二级单位处理

- 修改导出服务以支持二级单位下拉选项
- 新增获取二级组织选项的方法
- 更新数据验证逻辑以控制是否允许自定义输入
- 调整导入工具类处理所属二级单位字段
- 增加二级单位项目编号属性及访问方法
- 更新模板编辑界面填充默认项目编号
- 完善模板帮助类加载项目编号字段
- 新增外部项目选择树插件支持搜索功能
- 添加临时数据操作插件处理删除后的状态更新
- 扩展SWC助手类提供组织查询与节点处理方法
Tyx 1 zi în urmă
părinte
comite
7cf2a25d8c

+ 77 - 0
code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/swc/helper/SWCHelper.java

@@ -2,6 +2,7 @@ package nckd.jxccl.base.swc.helper;
 
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.tree.TreeNode;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
 
@@ -11,6 +12,7 @@ import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.QueryServiceHelper;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -217,4 +219,79 @@ public class SWCHelper {
         return null == list || list.size() == 0;
     }
 
+
+    /**
+     * 将嵌套的Map结构转换为List集合
+     * @param dataMap 包含嵌套Map结构的数据映射,键为String类型,值为Map<String, Object>类型
+     * @return 返回包含Map<String, Object>元素的List集合,如果输入为空则返回空列表
+     */
+    public static List<Map<String, Object>> mapToList(Map<String, Map<String, Object>> dataMap) {
+        // 检查输入参数是否为空或空集合
+        if (dataMap == null || dataMap.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        // 提取所有非空的value值并收集为List
+        return dataMap.values().stream()
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 根据唯一编码集合筛选节点列表中的叶子节点
+     *
+     * @param nodeList 节点列表,用于遍历查找匹配的节点
+     * @param uniqueCodeSet 唯一编码集合,用于匹配叶子节点的ID
+     * @return 符合条件的叶子节点列表,如果输入参数为空则返回空列表
+     */
+    public static List<TreeNode> getCheckTreeNodeList(List<TreeNode> nodeList, Set<String> uniqueCodeSet) {
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(uniqueCodeSet) ||
+                org.apache.commons.collections4.CollectionUtils.isEmpty(nodeList)) {
+            return Collections.emptyList();
+        }
+
+        // 使用队列进行广度优先遍历所有节点
+        Queue<TreeNode> nodeQueue = new LinkedList<>(nodeList);
+        List<TreeNode> checkNodeList = new ArrayList<>();
+
+        while (!nodeQueue.isEmpty()) {
+            TreeNode currentNode = nodeQueue.poll();
+            List<TreeNode> children = currentNode.getChildren();
+
+            // 如果当前节点有子节点,则将子节点加入队列继续遍历
+            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(children)) {
+                nodeQueue.addAll(children);
+                // 如果当前节点是叶子节点且其ID在唯一编码集合中,则加入结果列表
+            } else if (uniqueCodeSet.contains(currentNode.getId())) {
+                checkNodeList.add(currentNode);
+            }
+        }
+
+        return checkNodeList;
+    }
+
+    /**
+     * 获取所有二级组织
+     *
+     * @return
+     */
+    public static DynamicObjectCollection getAllSecondOrg() {
+        QFilter filter = QFilterCommonHelper.getCurrentVersionFilter();
+        filter.and(QFilterCommonHelper.getEnableFilter(true));
+        filter.and(QFilterCommonHelper.getDataStatusFilter());
+        filter.and("adminorgtype.number", QCP.equals, "1020_S");
+        HRBaseServiceHelper helper = new HRBaseServiceHelper("haos_adminorghr");
+        return helper.queryOriginalCollection("id,name,number", filter.toArray());
+    }
+
+    public static DynamicObject getOrgByName (String name) {
+        QFilter filter = QFilterCommonHelper.getCurrentVersionFilter();
+        filter.and(QFilterCommonHelper.getEnableFilter(true));
+        filter.and(QFilterCommonHelper.getDataStatusFilter());
+        filter.and("name", QCP.equals,  name);
+        HRBaseServiceHelper helper = new HRBaseServiceHelper("haos_adminorghr");
+        return helper.loadOne(filter.toArray());
+    }
+
+
 }

+ 38 - 10
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hsas/business/outdata/OutImportTaskGuideExportService.java

@@ -15,6 +15,7 @@ import kd.bos.logging.LogFactory;
 import kd.bos.orm.query.QFilter;
 import kd.bos.orm.util.CollectionUtils;
 import nckd.jxccl.base.sit.helper.SITExportDataHelper;
+import nckd.jxccl.base.swc.helper.SWCHelper;
 import nckd.jxccl.sit.hcsi.business.importtaskguide.utils.ImportTaskUtils;
 import nckd.jxccl.sit.hcsi.common.constant.enums.DataTypeEnum;
 import nckd.jxccl.sit.hcsi.common.constant.enums.SITShowType;
@@ -185,7 +186,16 @@ public class OutImportTaskGuideExportService {
                     if (options != null && options.length > 0) {
                         // 创建数据验证
                         int columnIndex = Integer.parseInt(columnHead.get("columnIndex"));
-                        setDataValidation(sheet, options, columnIndex, firstDataRowIndex);
+                        setDataValidation(sheet, options, columnIndex, firstDataRowIndex, true);
+                    }
+                }
+                // 特殊处理二级单位
+                else if (presetItem != null && presetItem.getItemNumber().equals("R1")) {
+                    String[] options = getOrgDropdownOptions();
+                    if (options != null && options.length > 0) {
+                        // 创建数据验证
+                        int columnIndex = Integer.parseInt(columnHead.get("columnIndex"));
+                        setDataValidation(sheet, options, columnIndex, firstDataRowIndex, false);
                     }
                 }
             }
@@ -219,9 +229,28 @@ public class OutImportTaskGuideExportService {
                 .toArray(String[]::new);
     }
 
-    private void setDataValidation(SXSSFSheet sheet, String[] options, int columnIndex, int firstDataRowIndex) {
+    /**
+     * 针对二级单位特殊处理,获取系统内所有二级组织
+     * @return
+     */
+    private String[] getOrgDropdownOptions() {
+        DynamicObjectCollection cols = SWCHelper.getAllSecondOrg();
+        String[] orgNames = cols.stream().map(col -> col.getString("name")).toArray(String[]::new);
+        return orgNames;
+    }
+
 
-        // 检查选项总长度是否超过限制
+    /**
+     * 为Excel工作表的指定列设置数据验证(下拉列表)约束
+     *
+     * @param sheet Excel工作表对象
+     * @param options 下拉列表的选项数组
+     * @param columnIndex 要设置下拉列表的列索引(从0开始)
+     * @param firstDataRowIndex 数据起始行索引
+     * @param isAllowOutRange 是否允许输入列表外的值,true表示允许输入自定义值,false表示只能选择列表项
+     */
+    private void setDataValidation(SXSSFSheet sheet, String[] options, int columnIndex, int firstDataRowIndex, boolean isAllowOutRange) {
+        // 检查选项总长度是否超过Excel的255字符限制
         String optionsString = String.join(",", options);
         if (optionsString.length() > 255) {
             // 如果超过255字符限制,则不创建下拉列表或采用其他方式处理
@@ -241,13 +270,12 @@ public class OutImportTaskGuideExportService {
         DataValidation validation = validationHelper.createValidation(constraint, addressList);
 
         // 允许输入列表外的文本
-        validation.setShowErrorBox(false);  // 不显示错误框
-        validation.setEmptyCellAllowed(true); // 允许空值
-
-        // 可选:添加输入提示
-        validation.setShowPromptBox(true);
-        validation.createPromptBox("输入提示", "可选择下拉选项或输入自定义值");
-
+        if(isAllowOutRange) {
+            validation.setShowErrorBox(false);  // 不显示错误框
+            validation.setEmptyCellAllowed(true); // 允许空值
+            validation.setShowPromptBox(true); // 可选:添加输入提示
+            validation.createPromptBox("输入提示", "可选择下拉选项或输入自定义值");
+        }
         // 添加到工作表
         sheet.addValidationData(validation);
     }

+ 1 - 1
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hsas/business/outdata/OutImportTaskGuideImportService.java

@@ -213,7 +213,7 @@ public class OutImportTaskGuideImportService {
                 temporary.set("modifier", RequestContext.get().getCurrUserId());
                 temporary.set("modifytime", new Date());
                 temporary.set("billstatus", "A");
-                temporary.set("entryentity", OutImportTaskUtils.getItemEntryList(rowMap, columnIndexMap, commonColumnIndexMap, entryType));
+                temporary.set("entryentity", OutImportTaskUtils.getItemEntryList(temporary, rowMap, columnIndexMap, commonColumnIndexMap, entryType));
                 result.add(temporary);
             }
             HRBaseServiceHelper helper = new HRBaseServiceHelper("nckd_outtempdata");

+ 28 - 5
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hsas/business/utils/OutImportTaskUtils.java

@@ -11,7 +11,8 @@ import kd.hr.hbp.business.bgtask.HRBackgroundTaskHelper;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hbp.common.cache.HRAppCache;
 import kd.hr.hbp.common.cache.IHRAppCache;
-import nckd.jxccl.sit.hcsi.formplugin.web.tp.enums.SinsurPresetItemEnum;
+import nckd.jxccl.base.swc.helper.SWCHelper;
+import nckd.jxccl.swc.constants.SwcConstant;
 import nckd.jxccl.swc.hsas.common.OutImpPresetItem;
 import nckd.jxccl.swc.hsas.formplugin.web.outdata.helper.OutImpTemplateHelper;
 
@@ -21,7 +22,7 @@ public class OutImportTaskUtils {
 
     private static final String TPL_ENTITY = "nckd_outimptpl";
     private static final String SALARYITEM_ENTITY = "hsbs_salaryitem";
-
+    private static final String SECONDORG_NUMBER = "R1";
 
     public static DynamicObject getTplData(Long sinsurTplId, String fields, QFilter qFilter) {
         HRBaseServiceHelper helper = new HRBaseServiceHelper(TPL_ENTITY);
@@ -214,7 +215,7 @@ public class OutImportTaskUtils {
 
     }
 
-    public static DynamicObjectCollection getItemEntryList(Map<Integer, Object> rowMap, Map<Integer, List<Map<String, String>>> columnIndexMap, Map<Integer, List<Map<String, String>>> commonColumnIndexMap, EntityType entryType) {
+    public static DynamicObjectCollection getItemEntryList(DynamicObject temporary, Map<Integer, Object> rowMap, Map<Integer, List<Map<String, String>>> columnIndexMap, Map<Integer, List<Map<String, String>>> commonColumnIndexMap, EntityType entryType) {
         DynamicObjectCollection itemEntryList = new DynamicObjectCollection();
         int sequence = 0;
         for (Map.Entry<Integer, List<Map<String, String>>> entry : columnIndexMap.entrySet()) {
@@ -248,20 +249,33 @@ public class OutImportTaskUtils {
                 }
             }
         }
+
+        //获取二级单位这个项目的内码
+        DynamicObject secondOrgItemDyn = getSecondOrgItemId();
+        Long secondOrgItemId = secondOrgItemDyn.getLong("id");
+
         for (Map.Entry<Integer, List<Map<String, String>>> entry : commonColumnIndexMap.entrySet()) {
             Object itemValue = rowMap.get(entry.getKey());
             if (itemValue == null) {
                 continue;
             }
+
             for (Map<String, String> itemMap : entry.getValue()) {
                 try {
                     DynamicObject item = (DynamicObject) entryType.createInstance();
-
                     item.set("nckd_itemvalue", itemValue);
+                    // 所属二级单位单独处理,获取到内码写到表头,方便后续获取
+                    Long itemId = Long.valueOf(itemMap.get("id"));
+                    if(secondOrgItemId.equals(itemId)) {
+                        temporary.set("nckd_secondorg", SWCHelper.getOrgByName(String.valueOf(itemValue)));
+                    }
+
                     item.set("nckd_itemtype", itemMap.get("itemType"));
                     item.set("nckd_itemname", itemMap.get("name"));
                     item.set("seq", sequence);
 
+
+
                     String id = itemMap.get("id");
                     if (id != null) {
                         item.set("nckd_itemid", Long.valueOf(id));
@@ -293,7 +307,7 @@ public class OutImportTaskUtils {
     }
 
     public static void updateImportTaskStatus(Long importTaskId) {
-        HRBaseServiceHelper temporaryHelper = new HRBaseServiceHelper("nckd_sinsurtempdata");
+        HRBaseServiceHelper temporaryHelper = new HRBaseServiceHelper("nckd_outtempdata");
         QFilter filter = new QFilter("nckd_importtask", "=", importTaskId);
         int count = temporaryHelper.count(temporaryHelper.getEntityName(), new QFilter[]{filter});
         if (count == 0) {
@@ -423,4 +437,13 @@ public class OutImportTaskUtils {
         }
     }
 
+    /**
+     * @return
+     */
+    public static DynamicObject getSecondOrgItemId() {
+       QFilter filter = new QFilter("number", "=", SECONDORG_NUMBER);
+       return SwcConstant.OUTIMPORTITEM_ENTITY.queryOriginalOne(filter);
+    }
+
+
 }

+ 9 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hsas/common/OutImpPresetItem.java

@@ -6,6 +6,7 @@ public class OutImpPresetItem {
     private String itemName;
     private Long dataTypeId;
     private String comment;
+    private String itemNumber;
 
     public String getMatchColumn() {
         return this.matchColumn;
@@ -23,6 +24,14 @@ public class OutImpPresetItem {
         this.itemId = itemId;
     }
 
+    public String getItemNumber() {
+        return this.itemNumber;
+    }
+
+    public void setItemNumber(String itemNumber) {
+        this.itemNumber = itemNumber;
+    }
+
     public String getItemName() {
         return this.itemName;
     }

+ 1 - 1
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hsas/formplugin/web/outdata/basedata/OutImpTemplateEdit.java

@@ -355,7 +355,7 @@ public class OutImpTemplateEdit extends AbstractFormPlugin implements Plugin {
         List<OutImpPresetItem> presetItemEnumsList = OutImpTemplateHelper.getPresetItemEnumList();
         if (!CollectionUtils.isEmpty(presetItemEnumsList)) {
             for(OutImpPresetItem presetItemEnum : presetItemEnumsList) {
-                tableValueSetter.addRow(new Object[]{presetItemEnum.getMatchColumn(), "0", presetItemEnum.getItemId(), 0L, 0L, 0L, 0L, '-', presetItemEnum.getItemName(), presetItemEnum.getDataTypeId(), presetItemEnum.getComment(), ""});
+                tableValueSetter.addRow(new Object[]{presetItemEnum.getMatchColumn(), "2", presetItemEnum.getItemId(), 0L, 0L, 0L, 0L, presetItemEnum.getItemNumber(), presetItemEnum.getItemName(), presetItemEnum.getDataTypeId(), presetItemEnum.getComment(), ""});
             }
         }
         model.beginInit();

+ 173 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hsas/formplugin/web/outdata/basedata/OutItemSelectTreePlugin.java

@@ -0,0 +1,173 @@
+package nckd.jxccl.swc.hsas.formplugin.web.outdata.basedata;
+
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.tree.TreeNode;
+import kd.bos.form.control.Search;
+import kd.bos.form.control.TreeView;
+import kd.bos.form.control.events.SearchEnterEvent;
+import kd.bos.form.control.events.SearchEnterListener;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.hr.hbp.common.cache.HRPageCache;
+import nckd.jxccl.base.swc.helper.SWCHelper;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Tyx 2025-12-22
+ * 外单位项目选择界面右表格搜索插件 【hsas_calitemselect】
+ */
+public class OutItemSelectTreePlugin extends AbstractFormPlugin implements SearchEnterListener {
+
+    // 常量定义
+    private static final String TREE_SEARCH_CONTROL = "nckd_treesearchap";
+    private static final String TREE_VIEW_CONTROL = "nckd_treeviewap";
+    private static final String ITEM_SELECT_ENTRY = "nckd_itemselectentry";
+    private static final String SALARY_ITEM_KEY = "salaryitemkey";
+    private static final String NO_SEARCH_RESULT_MSG = "搜索已完成,未找到搜索项。";
+
+    public OutItemSelectTreePlugin() {
+    }
+
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        Search search = (Search)this.getView().getControl(TREE_SEARCH_CONTROL);
+        search.addEnterListener(this);
+    }
+
+    @Override
+    public void search(SearchEnterEvent arg) {
+        String searchText = arg.getText();
+        HRPageCache pageCache = new HRPageCache(this.getView());
+        Map<String, Map<String, Map<String, Object>>> dataMap =
+                (Map<String, Map<String, Map<String, Object>>>) pageCache.get("allItemData", Map.class);
+        boolean isExpend = StringUtils.isNotEmpty(searchText);
+
+        List<TreeNode> nodeItemList = new ArrayList<>();
+        nodeItemList.addAll(loadSLItemChildNode(searchText, isExpend, dataMap));
+        nodeItemList.addAll(loadBSItemChildNode(searchText, isExpend, dataMap));
+
+        if (nodeItemList.isEmpty()) {
+            showNoResultNotification();
+        } else {
+            updateTreeView(nodeItemList);
+        }
+    }
+
+    private void showNoResultNotification() {
+        this.getView().showTipNotification(
+                ResManager.loadKDString(NO_SEARCH_RESULT_MSG, "CalResultTplItemTreePlugin_0",
+                        "swc-hsas-formplugin", new Object[0]));
+    }
+
+    private void updateTreeView(List<TreeNode> nodeItemList) {
+        TreeView treeView = (TreeView) this.getView().getControl(TREE_VIEW_CONTROL);
+        treeView.deleteAllNodes();
+        treeView.addNodes(nodeItemList);
+        checkSelectedTreeNode(treeView, nodeItemList);
+    }
+
+    private void checkSelectedTreeNode(TreeView treeView, List<TreeNode> nodeList) {
+        DynamicObjectCollection selectDatas = this.getView().getModel().getEntryEntity(ITEM_SELECT_ENTRY);
+        Set<String> uniqueCodeSet = (Set)selectDatas.stream().map((selectData) -> {
+            return selectData.getString("nckd_itemunicodeid");
+        }).collect(Collectors.toSet());
+        List<TreeNode> checkNodeList = SWCHelper.getCheckTreeNodeList(nodeList, uniqueCodeSet);
+        if (CollectionUtils.isNotEmpty(checkNodeList)) {
+            treeView.checkNodes(checkNodeList);
+        }
+    }
+
+    private List<TreeNode> loadSLItemChildNode(String name, boolean isExpend, Map<String, Map<String, Map<String, Object>>> dataMap) {
+        List<TreeNode> childNodes = new ArrayList<>(10);
+        List<Map<String, Object>> salaryItemList;
+        if (StringUtils.isEmpty(name)) {
+            salaryItemList = SWCHelper.mapToList(dataMap.get("salaryitemkey"));
+        } else {
+            salaryItemList = this.findItemByName(name, "salaryitemkey", dataMap);
+        }
+
+        if (salaryItemList == null || salaryItemList.isEmpty()) {
+            return childNodes;
+        }
+        // 构建项目类型节点映射和项目节点列表映射
+        Map<String, TreeNode> itemTypeNodeMap = new LinkedHashMap<>(salaryItemList.size());
+        Map<String, List<TreeNode>> salaryItemNodeMap = new HashMap<>(16);
+        // 遍历薪酬项目列表,构建树节点
+        for (Map<String, Object> itemMap : salaryItemList) {
+            String itemTypeNum = (String) itemMap.get("group_number");
+            String itemTypeName = (String) itemMap.get("group_name");
+
+            // 获取或创建该项目类型的节点列表
+            List<TreeNode> itemNodes = salaryItemNodeMap.computeIfAbsent(itemTypeNum, k -> new ArrayList<>(10));
+
+            // 添加项目节点
+            String groupId = "SI" + itemTypeNum + "_@_";
+            String nodeId = String.valueOf(itemMap.get("id"));
+            String uniqueCode = String.valueOf(itemMap.get("uniquecode"));
+            String itemName = (String) itemMap.get("name");
+            itemNodes.add(new TreeNode(groupId, nodeId, itemName));
+
+            // 如果还没有该项目类型的父节点,则创建
+            if (!itemTypeNodeMap.containsKey(itemTypeNum)) {
+                TreeNode itemTypeNode = new TreeNode("SI", groupId, itemTypeName);
+                itemTypeNode.setExpend(isExpend);
+                itemTypeNode.setIsOpened(isExpend);
+                itemTypeNodeMap.put(itemTypeNum, itemTypeNode);
+            }
+        }
+
+        // 关联子节点到父节点
+        List<TreeNode> finalTreeNodes = new ArrayList<>(itemTypeNodeMap.size());
+        for (Map.Entry<String, TreeNode> entry : itemTypeNodeMap.entrySet()) {
+            TreeNode parentNode = entry.getValue();
+            List<TreeNode> children = salaryItemNodeMap.get(entry.getKey());
+            parentNode.setChildren(children);
+            finalTreeNodes.add(parentNode);
+        }
+
+        // 添加根节点
+        if (!finalTreeNodes.isEmpty()) {
+            TreeNode root = new TreeNode("", "SI",
+                    ResManager.loadKDString("薪酬项目-SI", "FormulaItemOrFuncTreeHelper_1",
+                            "swc-hsas-business", new Object[0]));
+            root.setChildren(finalTreeNodes);
+            root.setExpend(isExpend);
+            root.setIsOpened(isExpend);
+            childNodes.add(root);
+        }
+
+        return childNodes;
+    }
+
+    private List<TreeNode> loadBSItemChildNode(String name, boolean isExpend, Map<String, Map<String, Map<String, Object>>> dataMap) {
+        List<TreeNode> childNodes = new ArrayList<>(10);
+        return childNodes;
+    }
+
+
+    private List<Map<String, Object>> findItemByName(String name, String itemName, Map<String, Map<String, Map<String, Object>>> dataMap) {
+        Map<String, Map<String, Object>> result = dataMap.get(itemName);
+        if (result == null) {
+            return new ArrayList<>(0);
+        }
+
+        return result.entrySet().stream()
+                .filter(entry -> {
+                    Map<String, Object> itemMap = entry.getValue();
+                    if (itemMap == null || itemMap.isEmpty()) {
+                        return entry.getKey().contains(name);
+                    }
+
+                    String number = (String) itemMap.get("number");
+                    return (StringUtils.isNotEmpty(number) && number.contains(name)) ||
+                            entry.getKey().contains(name);
+                })
+                .map(Map.Entry::getValue)
+                .collect(Collectors.toList());
+    }
+
+}

+ 1 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hsas/formplugin/web/outdata/helper/OutImpTemplateHelper.java

@@ -225,6 +225,7 @@ public class OutImpTemplateHelper {
             item.setItemName(dyn.getString("name"));
             item.setComment(dyn.getString("nckd_presetcomment"));
             item.setDataTypeId(dyn.getLong("nckd_datatype.id"));
+            item.setItemNumber(dyn.getString("number"));
             //item.setMatchColumn(dyn.);
             outImpPresetItemEnumList.add(item);
         }

+ 53 - 0
code/swc/nckd-jxccl-swc/src/main/java/nckd/jxccl/swc/hsas/opplugin/web/OutTempDataOpPlugin.java

@@ -0,0 +1,53 @@
+package nckd.jxccl.swc.hsas.opplugin.web;
+
+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.sdk.plugin.Plugin;
+import nckd.jxccl.swc.hsas.business.utils.OutImportTaskUtils;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 单据操作插件
+ */
+public class OutTempDataOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        e.getFieldKeys().add("nckd_importtask.id");
+    }
+
+    @Override
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        super.endOperationTransaction(e);
+        String opKey = e.getOperationKey();
+        switch(opKey) {
+            case "delete":
+                doAfterDelete(e);
+                break;
+        }
+    }
+
+    /**
+     * 删除成功后反写任务的导入数量
+     * @param e
+     */
+    public void doAfterDelete(EndOperationTransactionArgs e) {
+        DynamicObject[] temporaryDatas = e.getDataEntities();
+        Set<Long> importTaskIdSet = (Set) Arrays.stream(temporaryDatas).map((temporaryData) -> {
+            return temporaryData.getLong("nckd_importtask.id");
+        }).collect(Collectors.toSet());
+        Iterator it = importTaskIdSet.iterator();
+
+        while(it.hasNext()) {
+            Long importTaskId = (Long)it.next();
+            OutImportTaskUtils.updateImportTaskStatus(importTaskId);
+        }
+    }
+}