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": "开票状态"
          }
        }
      ]
    }
]

页面效果:

在插件中创建监听器类继承 ExportDataEventDefiner

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

注册监听器使用 @EventCallback 注解

java
@EventCallback("shop")

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

java
public class ShopExportDataListener extends ExportDataEventDefiner {
    private PayMapper payMapper;
    private MemberMapper memberMapper;
    private ShopStoreMapper shopStoreMapper;
    private ShopOrderMapper shopOrderMapper;
    private ShopInvoiceMapper shopInvoiceMapper;
    private ShopOrderGoodsMapper shopOrderGoodsMapper;
    private ShopOrderDeliveryMapper shopOrderDeliveryMapper;
    private ShopDeliveryCompanyMapper shopDeliveryCompanyMapper;

    @Override
    public ExportDataEventResult handleCallback(ExportDataEvent event) {
        ExportDataEventResult result = new ExportDataEventResult();
        if (!"shop_order_goods".equals(event.getType())) {
            return result;
        }
        QueryWrapper<ShopOrder> orderQueryWrapper = new QueryWrapper<>();
        orderQueryWrapper.eq("site_id", event.getSiteId())
                .orderByDesc("create_time");
        List<ShopOrder> shopOrders = shopOrderMapper.selectList(orderQueryWrapper);
        Set<Integer> orderIds = CollStreamUtil.toSet(shopOrders, ShopOrder::getOrderId);
        if (ObjectUtil.isEmpty(orderIds)) {
            return result;
        }
        QueryWrapper<ShopOrderGoods> goodsQueryWrapper = new QueryWrapper<>();
        goodsQueryWrapper.eq("site_id", event.getSiteId())
                .in("order_id", orderIds);
        Supplier<List<ShopOrderGoods>> supplier = () -> shopOrderGoodsMapper.selectList(goodsQueryWrapper);
        PageParam page = event.getPageParam();
        if (page.getPage() != null && page.getPage() > 0 && page.getLimit() != null && page.getLimit() > 0) {
            supplier = () -> shopOrderGoodsMapper.selectPage(new Page<>(page.getPage(), page.getLimit()), goodsQueryWrapper).getRecords();
        }
        return exportData(shopOrders, supplier);
    }

    private ExportDataEventResult exportData(List<ShopOrder> shopOrders, Supplier<List<ShopOrderGoods>> supplier) {
        QueryWrapper<Pay> payQueryWrapper = new QueryWrapper<>();
        Set<String> outTradeNos = CollStreamUtil.toSet(shopOrders, ShopOrder::getOutTradeNo);
        payQueryWrapper.in("out_trade_no", outTradeNos);
        Map<String, Pay> payMap = payMapper.selectList(payQueryWrapper).stream().collect(Collectors.toMap(Pay::getOutTradeNo, o -> o));
        Set<Integer> memberIds = CollStreamUtil.toSet(shopOrders, ShopOrder::getMemberId);
        Map<Integer, Member> memberMap = memberMapper.selectBatchIds(memberIds).stream().collect(Collectors.toMap(Member::getMemberId, o -> o));
        Set<Integer> takeStoreIds = CollStreamUtil.toSet(shopOrders, ShopOrder::getTakeStoreId);
        Map<Integer, ShopStore> storeMap = shopStoreMapper.selectBatchIds(takeStoreIds).stream().collect(Collectors.toMap(ShopStore::getStoreId, o -> o));
        Set<Integer> invoiceIds = CollStreamUtil.toSet(shopOrders, ShopOrder::getInvoiceId);
        Map<Integer, ShopInvoice> invoiceMap = Collections.emptyMap();
        if (ObjectUtil.isNotEmpty(invoiceIds)) {
            QueryWrapper<ShopInvoice> invoiceQueryWrapper = new QueryWrapper<>();
            invoiceQueryWrapper.in("id", invoiceIds)
                    .eq("status", InvoiceStatusEnum.OPEN.getStatus());
            invoiceMap = shopInvoiceMapper.selectList(invoiceQueryWrapper).stream().collect(Collectors.toMap(ShopInvoice::getId, o -> o));
        }
        Map<Integer, ShopOrder> orderMap = shopOrders.stream().collect(Collectors.toMap(ShopOrder::getOrderId, o -> o));
        Set<Integer> encountered = new HashSet<>();
        List<ShopOrderGoods> records = supplier.get();
        JSONArray result = new JSONArray(CollectionUtil.size(records));
        Map<Integer, ShopOrderDelivery> deliveryMap = Collections.emptyMap();
        Set<Integer> deliveryIds = CollStreamUtil.toSet(records, ShopOrderGoods::getDeliveryId);
        if (ObjectUtil.isEmpty(deliveryIds)) {
            deliveryMap = shopOrderDeliveryMapper.selectBatchIds(deliveryIds).stream().collect(Collectors.toMap(ShopOrderDelivery::getId, o -> o));
        }
        Map<Integer, ShopDeliveryCompany> deliveryCompanyMap = Collections.emptyMap();
        Set<Integer> deliveryCompanyIds = CollStreamUtil.toSet(deliveryMap.values(), ShopOrderDelivery::getExpressCompanyId);
        if (ObjectUtil.isNotEmpty(deliveryCompanyIds)) {
            deliveryCompanyMap = shopDeliveryCompanyMapper.selectBatchIds(deliveryCompanyIds).stream()
                    .collect(Collectors.toMap(ShopDeliveryCompany::getCompanyId, e -> e));
        }
        for (ShopOrderGoods record : records) {
            boolean isFirst = !encountered.contains(record.getOrderId());
            if (isFirst) {
                encountered.add(record.getOrderId());
            }
            ShopOrder order = orderMap.get(record.getOrderId());
            Member member = memberMap.get(record.getMemberId());
            Pay pay = payMap.get(order.getOutTradeNo());
            ShopStore store = storeMap.get(order.getTakeStoreId());
            ShopInvoice invoice = invoiceMap.get(order.getInvoiceId());

            JSONObject ret = new JSONObject();
            boolean memberFirst = isFirst && member != null;
            boolean invoiceFirst = isFirst && invoice != null;
            boolean storeFirst = isFirst && store != null;
            ret.set("order_no", isFirst ? order.getOrderNo() + "\t" : "");
            ret.set("order_goods_id", isFirst ? record.getOrderGoodsId() + "\t" : "");
            ret.set("goods_name", record.getGoodsName());
            ret.set("sku_name", record.getSkuName());
            ret.set("member_no", memberFirst ? member.getMemberNo() : "");
            ret.set("nickname", memberFirst ? member.getNickname() : "");
            ret.set("mobile", memberFirst ? member.getMobile() : "");
            ret.set("price", record.getPrice());
            ret.set("num", record.getNum());
            ret.set("goods_money", record.getGoodsMoney());
            //优惠金额
            ret.set("discount_money", isFirst ? order.getDiscountMoney() : "");
            //订单项实付金额
            ret.set("order_goods_money", isFirst ? order.getOrderMoney() : "");
            ret.set("order_from_name", isFirst ? ChannelEnum.getNameByCode(order.getOrderFrom()) : "");
            ret.set("goods_type_name", isFirst ? GoodsTypeEnum.getNameByType(record.getGoodsType()) : "");
            ret.set("taker_name", isFirst ? order.getTakerName() : "");
            ret.set("taker_mobile", isFirst ? order.getTakerMobile() + "\t" : "");
            ret.set("taker_full_address", isFirst ? order.getTakerFullAddress() : "");
           ret.set("delivery_type_name", isFirst ?
                    OrderDeliveryTypeEnum.getNameByType(order.getDeliveryType()) : "");
            //配送状态
            ShopOrderDelivery shopOrderDelivery = deliveryMap.get(record.getStatus());
            if (shopOrderDelivery!=null){
                ret.set("delivery_status_name", isFirst ? DeliveryStatusEnum.getNameByStatus(shopOrderDelivery.getStatus()) : "");
            }
            ret.set("delivery_money", isFirst ? order.getDeliveryMoney() : "");
            //订单状态
            ret.set("order_status_name", isFirst ? OrderStatusEnum.getNameByStatus(Integer.parseInt(order.getStatus())) : "");
            ret.set("create_time", isFirst ? DateUtils.timestampToString(order.getCreateTime()) : "");
            ret.set("pay_time", isFirst && order.getPayTime() != null ? DateUtils.timestampToString(order.getPayTime()) : "");
            ret.set("delivery_time", isFirst && order.getDeliveryTime() != null ? DateUtils.timestampToString(order.getDeliveryTime()) : "");
            ret.set("finish_time", isFirst && order.getFinishTime() != null ? DateUtils.timestampToString(order.getFinishTime()) : "");
            ret.set("member_remark", isFirst ? order.getMemberRemark() : "");
            ret.set("shop_remark", isFirst ? order.getShopRemark() : "");
            ret.set("out_trade_no", isFirst ? order.getOutTradeNo()+ "\t" : "");
            ret.set("pay_type", isFirst && pay != null ? PayTypeEnum.getType().getByPath(pay.getType() + ".name", String.class) : "");
            //退款单号
            ret.set("order_refund_no", isFirst ? record.getOrderRefundNo() + "\t": "");
            //退款状态
            ret.set("status_name", isFirst ? RefundSatusEnum.getNameByType(order.getRefundStatus()) : "");
            ShopOrderDelivery delivery = deliveryMap.get(record.getDeliveryId());
            if (delivery != null) {
                ret.set("express_number", isFirst ? delivery.getExpressNumber() + "\t" : "");
                ShopDeliveryCompany company = deliveryCompanyMap.get(delivery.getExpressCompanyId());
                ret.set("company_name", isFirst ? Optional.ofNullable(company).map(ShopDeliveryCompany::getCompanyName).orElse("") : "");
            } else {
                ret.set("express_number", "");
                ret.set("company_name", "");
            }
            result.add(ret);
        }

        ExportDataEventResult eventResult = new ExportDataEventResult();
        eventResult.setResultData(result);
        return eventResult;
    }

    @Autowired
    public void setPayMapper(PayMapper payMapper) {
        this.payMapper = payMapper;
    }

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

    @Autowired
    public void setShopStoreMapper(ShopStoreMapper shopStoreMapper) {
        this.shopStoreMapper = shopStoreMapper;
    }

    @Autowired
    public void setShopOrderMapper(ShopOrderMapper shopOrderMapper) {
        this.shopOrderMapper = shopOrderMapper;
    }

    @Autowired
    public void setShopInvoiceMapper(ShopInvoiceMapper shopInvoiceMapper) {
        this.shopInvoiceMapper = shopInvoiceMapper;
    }

    @Autowired
    public void setShopOrderGoodsMapper(ShopOrderGoodsMapper shopOrderGoodsMapper) {
        this.shopOrderGoodsMapper = shopOrderGoodsMapper;
    }

    @Autowired
    public void setShopOrderDeliveryMapper(ShopOrderDeliveryMapper shopOrderDeliveryMapper) {
        this.shopOrderDeliveryMapper = shopOrderDeliveryMapper;
    }

    @Autowired
    public void setShopDeliveryCompanyMapper(ShopDeliveryCompanyMapper shopDeliveryCompanyMapper) {
        this.shopDeliveryCompanyMapper = shopDeliveryCompanyMapper;
    }
}

前端调用数据导出组件

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

show:控制显示隐藏

type:数据导出类型

searchParam:搜索条件

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

基于 MIT 协议发布