Excel导入扩展点-整体导入

1、【导入】在有些场景,需要校验Excel导入的整体数据
可以通过实现导入扩展点的方式实现,入参data是导入Excel的数据列表;业务可以根据实际情况进行数据校验

1)Excel模板定义,需要设置setEachImport(false)
Excel导入扩展点-整体导入

2)扩展点API定义

pro.shushi.pamirs.file.api.extpoint.ExcelImportDataExtPoint#importData

3)示例代码参考:
pro.shushi.pamirs.translate.extpoint.ResourceTranslationImportExtPoint#importData

@Slf4j
@Component
@Ext(ExcelImportTask.class)
public class ResourceTranslationImportExtPoint extends AbstractExcelImportDataExtPointImpl<List<ResourceTranslationItem>> {

    @Autowired
    private TranslateRedisManager         translateRedisManager;
    @Autowired
    private ResourceTranslationImportTask resourceTranslationImportTask;

    @Override
    @ExtPoint.Implement(expression = "importContext.definitionContext.model==\"" + ResourceTranslation.MODEL_MODEL + "\"")
    public Boolean importData(ExcelImportContext importContext, List<ResourceTranslationItem> data) {
        ExcelImportTask importTask = importContext.getImportTask();
        try {
            if (!translateRedisManager.canLockImportKey()) {
                importTask.addTaskMessage(TaskMessageLevelEnum.ERROR, "有导入任务正在执行,请过5分钟后再试");
                throw PamirsException.construct(TranslateEnumerate.CURRENT_HAS_IMPORT_TASK_EXECUTE_ERROR).errThrow();
            }
            translateRedisManager.putExcelSnapshot(importTask.getId(), data);
            resourceTranslationImportTask.createStatusCheckTask(importTask.getId());

            log.info("翻译项导入完成");
            importTask.setState(ExcelTaskStateEnum.PROCESSING);
            return true;
        } catch (PamirsException e) {
            log.error("翻译项导入失败", e);
            importTask.addTaskMessage(TaskMessageLevelEnum.ERROR, e.getMessage());
            return true;
        } catch (Exception e) {
            log.error("翻译项导入失败", e);
            importTask.addTaskMessage(TaskMessageLevelEnum.ERROR, "翻译项导入失败");
            return true;
        }
    }
}

2、【导入】逐行导入的时候做事务控制
在模板中定义中增加事务的定义,并设置异常后回滚。参加示例代码:

excel模板定义

@Component
public class DemoItemImportTemplate implements ExcelTemplateInit {

    public static final String TEMPLATE_NAME = "商品导入模板";

    @Override
    public List<ExcelWorkbookDefinition> generator() {
        //定义事务(导入处理中,只操作单个表的不需要事务定义。)
        //是否定义事务根据实际业务逻辑确定。比如:有些场景在导入前需要删除数据后在进行导入就需要定义事务
        InitializationUtil.addTxConfig(DemoItem.MODEL_MODEL, ExcelDefinitionContext.EXCEL_TX_CONFIG_PREFIX + TEMPLATE_NAME);

        return Collections.singletonList(
                ExcelHelper.fixedHeader(DemoItem.MODEL_MODEL, TEMPLATE_NAME)
                        .setType(ExcelTemplateTypeEnum.IMPORT)
                        .createSheet("商品导入-sheet1")
                        .createBlock(DemoItem.MODEL_MODEL)
                        .addUnique(DemoItem.MODEL_MODEL,"name")
                        .addColumn("name","名称")
                        .addColumn("description","描述")
                        .addColumn("itemPrice","单价")
                        .addColumn("inventoryQuantity","库存")
                        .build().setEachImport(true)
                        // 设置异常后回滚的标识
                        .setHasErrorRollback(true)
                        .setExcelImportMode(ExcelImportModeEnum.SINGLE_MODEL)
        );

    }
}

导入逻辑处理

@Slf4j
@Component
@Ext(ExcelImportTask.class)
public class DemoItemImportExtPoint extends AbstractExcelImportDataExtPointImpl<DemoItem> implements ExcelImportDataExtPoint<DemoItem> {

    @Autowired
    private DemoItemService demoItemService;

    @Override
    @ExtPoint.Implement(expression = "importContext.definitionContext.model == \"" + DemoItem.MODEL_MODEL + "\"")
    public Boolean importData(ExcelImportContext importContext, DemoItem data) {
        ExcelImportTask importTask = importContext.getImportTask();
        try {
            DemoItemImportTask hrExcelImportTask = new DemoItemImportTask().queryById(importTask.getId());

            String publishUserName = Optional.ofNullable(hrExcelImportTask).map(DemoItemImportTask::getPublishUserName).orElse(null);
            data.setPublishUserName(publishUserName);

            demoItemService.create(data);
        } catch(PamirsException e) {
            log.error("导入异常", e);
        } catch (Exception e) {
            log.error("导入异常", e);
        }
        return Boolean.TRUE;
    }
}

Oinone社区 作者:望闲原创文章,如若转载,请注明出处:https://doc.oinone.top/backend/4856.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

(0)
望闲的头像望闲数式员工
上一篇 2023年12月5日 下午6:17
下一篇 2023年12月18日 上午9:59

相关推荐

  • Oinone平台可视化调试工具        前端

    Oinone平台可视化调试工具

    为方便开发者定位问题,我们提供了可视化的调试工具。
    该文档将介绍可视化调试工具的基本使用方法。

    2024年4月13日
    00
  • DsHint和BatchSizeHint的使用

    概述和使用场景 DsHintApi ,强制指定数据源, BatchSizeHintApi ,强制指定查询批量数量 API定义 DsHintApi public static DsHintApi model(String model/**模型编码*/) { // 具体实现 } public DsHintApi(Object dsKey/***数据源名称*/) …

    后端 4小时前
    00
  • 协同开发支持        后端

    协同开发支持

    协同开发概述 在使用Oinone进行业务开发中,目前开发方式为: 开发各个本地启动项目 与 设计器环境共库共redis的方式进行。 在多个开发人员同时修改一个模型,或者没有及时更新其他同学提交的代码时,存在业务模型创建的数据表字段被删除的情况,协同开发模式正式为解决这个问题而生。 版本支持 4.7.x版本 已经包含分布式支持。 使用步骤 1、业务后端boot…

    2023年12月4日
    00
  • 如何使用位运算的数据字典

    场景 位运算的数据字典定义示例 package pro.shushi.pamirs.demo.api.enumeration; import pro.shushi.pamirs.meta.annotation.Dict; import pro.shushi.pamirs.meta.annotation.sys.Base; import pro.shushi….

    后端 2023年11月24日
    00
  • Oinone登录扩展:对接SSO(适应于4.7.8及之后的版本)        代码实践

    Oinone登录扩展:对接SSO(适应于4.7.8及之后的版本)

    适配版本 4.7.8及其之后的版本 概述 在企业内部,对于已有一套完整的登录系统(SSO)的情况下,通常会要求把所有的系统都对接到SSO中;本文主要讲解用Oinone开发的项目对接SSO的具体实现。 对接步骤 1、项目自定义实现UserCookieLogin,可参考示例说明:pro.shushi.pamirs.user.api.login.UserCooki…

    2024年4月2日
    00

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注