Skip to content

export 数据导出开发

功能介绍

框架已经封装了数据导出功能,所有导出记录都会在这里展示

添加新的数据类型

在 niucloud-addon/插件名称/src/main/resources/插件名称/loader/export/ExportType.json 中添加新的数据类型

导出数据类型文件位置:

ExportType.json 关键代码:

json
[
    "shop_invoice": {
      "name": "发票列表",
      "column": [
        {
          "order_no": {
            "name": "订单号"
          }
        },
        {
          "nickname": {
            "name": "会员昵称"
          }
        },
        {
          "order_money": {
            "name": "订单金额"
          }
        },
        {
          "header_name": {
            "name": "发票抬头"
          }
        },
        {
          "header_type_name": {
            "name": "抬头类型"
          }
        },
        {
          "type_name": {
            "name": "发票类型"
          }
        },
        {
          "tax_number": {
            "name": "纳税人识别号"
          }
        },
        {
          "bank_name": {
            "name": "开户银行"
          }
        },
        {
          "bank_card_number": {
            "name": "银行账号"
          }
        },
        {
          "address": {
            "name": "注册地址"
          }
        },
        {
          "name": {
            "name": "发票内容"
          }
        },
        {
          "money": {
            "name": "开票金额"
          }
        },
        {
          "invoice_number": {
            "name": "发票代码"
          }
        },
        {
          "remark": {
            "name": "备注"
          }
        },
        {
          "create_time": {
            "name": "申请时间"
          }
        },
        {
          "invoice_time": {
            "name": "开票时间"
          }
        },
        {
          "is_invoice_name": {
            "name": "开票状态"
          }
        }
      ]
    }
]

页面效果:

在插件中创建监听器类

文件位置: niucloud-addon/插件名称/src/main/java/com/niu/插件名称/listener/export/MallInvoiceExportDataListener.java

注册监听器使用 @EventCallback 注解

java
@EventCallback("mall")

实现 handleCallback() 方法处理数据,关键参考代码

java
public class MallInvoiceExportDataListener extends ExportDataEventDefiner {
    private MemberMapper memberMapper;
    private MallOrderMapper mallOrderMapper;
    private InvoiceMapper invoiceMapper;

    @Override
    public ExportDataEventResult handleCallback(ExportDataEvent event) {
        if (!"mall_invoice".equals(event.getType())) {
            return new ExportDataEventResult();
        }

        QueryWrapper<Invoice> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("site_id", event.getSiteId())
                .eq("status", InvoiceStatusEnum.OPEN.getStatus())
                .orderByDesc("id");

        JSONObject where = event.getWhere();
        if (where != null) {
            Object headerName = where.get("header_name");
            if (ObjectUtil.isNotEmpty(headerName)) {
                queryWrapper.like("header_name", headerName);
            }

            if ((where.get("create_time") instanceof JSONArray createTimes) && ObjectUtil.isNotEmpty(createTimes)) {
                QueryMapperUtils.buildByTime(queryWrapper, "create_time", StringUtils.jsonArrayToStringArray(createTimes));
            }

            if ((where.get("invoice_time") instanceof JSONArray invoiceTimes) && ObjectUtil.isNotEmpty(invoiceTimes)) {
                QueryMapperUtils.buildByTime(queryWrapper, "invoice_time", StringUtils.jsonArrayToStringArray(invoiceTimes));
            }
        }

        List<Invoice> invoices;
        PageParam pageParam = event.getPageParam();
        if (pageParam.getPage() > 0 && pageParam.getLimit() > 0) {
            invoices = invoiceMapper.selectPage(new Page<>(pageParam.getPage(), pageParam.getLimit()), queryWrapper).getRecords();
        } else {
            invoices = invoiceMapper.selectList(queryWrapper);
        }

        return exportData(invoices);
    }

    private ExportDataEventResult exportData(List<Invoice> invoices) {
        ExportDataEventResult result = new ExportDataEventResult();
        if (ObjectUtil.isEmpty(invoices)) {
            return result;
        }

        Map<Integer, Member> memberMap = Collections.emptyMap();
        Set<Integer> memberIds = CollStreamUtil.toSet(invoices, Invoice::getMemberId);
        if (ObjectUtil.isNotEmpty(memberIds)) {
            memberMap = memberMapper.selectBatchIds(memberIds).stream().collect(Collectors.toMap(Member::getMemberId, o -> o));
        }

        Map<Integer, MallOrder> orderMap = Collections.emptyMap();
        Set<Integer> orderIds = CollStreamUtil.toSet(invoices, Invoice::getTradeId);
        if (ObjectUtil.isNotEmpty(orderIds)) {
            orderMap = mallOrderMapper.selectBatchIds(orderIds).stream().collect(Collectors.toMap(MallOrder::getOrderId, o -> o));
        }

        JSONArray jsonArray = new JSONArray();
        for (Invoice invoice : invoices) {
            JSONObject jsonObject = new JSONObject();
            MallOrder order = orderMap.get(invoice.getTradeId());
            Member member = memberMap.get(invoice.getMemberId());

            jsonObject.set("order_no", Optional.ofNullable(order).map(o -> o.getOrderNo() + "\t").orElse(""))
                    .set("nickname", Optional.ofNullable(member).map(Member::getNickname).orElse(""))
                    .set("order_money", Optional.ofNullable(order).map(MallOrder::getOrderMoney).map(BigDecimal::toString).orElse(""))
                    .set("header_name", invoice.getHeaderName() + "\t")
                    .set("header_type_name", InvoiceHeaderTypeEnum.getNameByType(invoice.getHeaderType()))
                    .set("type_name", InvoiceTypeEnum.getNameByType(invoice.getType()))
                    .set("tax_number", invoice.getTaxNumber() + "\t")
                    .set("bank_name", invoice.getBankName())
                    .set("bank_card_number", invoice.getBankCardNumber() + "\t")
                    .set("address", invoice.getAddress())
                    .set("name", invoice.getName())
                    .set("money", invoice.getMoney())
                    .set("invoice_number", invoice.getInvoiceNumber() + "\t")
                    .set("remark", invoice.getRemark())
                    .set("create_time", DateUtils.timestampToString(invoice.getCreateTime()))
                    .set("invoice_time", DateUtils.timestampToString(invoice.getInvoiceTime()))
                    .set("is_invoice_name", ObjectUtil.equal(invoice.getStatus(), 1) ? "已开票" : "未开票");

            jsonArray.add(jsonObject);
        }

        result.setResultData(jsonArray);
        return result;
    }

    @Autowired
    public void setMemberMapper(MemberMapper memberMapper) {
        this.memberMapper = memberMapper;
    }

    @Autowired
    public void setShopOrderMapper(MallOrderMapper mallOrderMapper) {
        this.mallOrderMapper = mallOrderMapper;
    }

    @Autowired
    public void setShopInvoiceMapper(InvoiceMapper mallInvoiceMapper) {
        this.invoiceMapper = mallInvoiceMapper;
    }
}

前端调用数据导出组件

以会员列表导出功能举例: 关键代码,引入数据导出组件:

show:控制显示隐藏

type:数据导出类型

searchParam:搜索条件

vue
<export-sure ref="exportSureDialog" :show="flag" type="member" :searchParam="memberTableData.searchParam" @close="handleClose" />

基于 MIT 协议发布