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" />