excel-export/biz/export/csv_exporter.go

293 lines
6.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package export
import (
"excel_export/biz/config"
"excel_export/pkg"
"fmt"
"math/big"
"sync"
"time"
)
type CsvExporter struct {
mFetcher DataFetcher
file FileAdapter
count int
wg *sync.WaitGroup
}
func NewCsvExporter(fetcher DataFetcher, file FileAdapter) DataExporter {
return &CsvExporter{
mFetcher: fetcher,
file: file,
}
}
func (ee *CsvExporter) Fetcher(fetcher DataFetcher) {
ee.mFetcher = fetcher
}
func (ee *CsvExporter) File(file FileAdapter) {
ee.file = file
}
func (ee *CsvExporter) WaitGroup(wg *sync.WaitGroup) {
ee.wg = wg
}
func (ee *CsvExporter) Export(sql string, t config.Task, extraData interface{}) error {
begin := time.Now()
data, err := ee.mFetcher.Fetch(sql)
if err != nil {
return fmt.Errorf("数据获取错误:%w", err)
}
duration := time.Now().Sub(begin)
if duration.Seconds() > 10 {
pkg.ProcessLog(fmt.Sprintf("数据获取耗时:%s \n", duration.String()))
}
ee.count = len(data.Data)
if ee.count > 0 {
//异步导出数据到csv文件中
go ee.exportToCsv(data, t.Excel, extraData)
} else {
ee.wg.Done()
}
return nil
}
func (ee *CsvExporter) exportToCsv(data *Data, excel []map[string]string, extraData interface{}) {
begin := time.Now()
var (
title []string
)
ee.file.Open()
keyMap := make(map[string]int)
for k, v := range excel {
title = append(title, v["name"])
keyMap[v["column"]] = k
}
ee.file.WriteTitle(title)
titleReflect := make([]int, len(data.Title))
for tk, tv := range data.Title {
if _, ok := keyMap[tv]; !ok {
titleReflect[tk] = -1
continue
}
titleReflect[tk] = keyMap[tv]
}
for key, rows := range data.Data {
row := make([]string, len(title))
for rowKey, rowValue := range rows {
if titleReflect[rowKey] != -1 {
row[titleReflect[rowKey]] = rowValue
}
}
for rk, rv := range row {
row = ee.handleData(excel, keyMap, rk, rv, row, data.DataMap[key], extraData)
}
ee.file.Write(row)
}
ee.file.Close()
ee.wg.Done()
duration := time.Now().Sub(begin)
if duration.Seconds() > 10 {
pkg.ProcessLog(fmt.Sprintf("csv输出耗时%s \n", duration.String()))
}
}
func (ee *CsvExporter) Count() int {
return ee.count
}
func (ee *CsvExporter) getPkIndex(titles []string, pk string) int {
for i, title := range titles {
if title == pk {
return i
}
}
return -1
}
func (ee *CsvExporter) handleData(excel []map[string]string, keyMap map[string]int, rk int, value string, row []string, dataMap map[string]string, extraData interface{}) []string {
key := excel[rk]["column"]
if key == "key" {
converter := pkg.NewConverter()
num := new(big.Int)
num, success := num.SetString(value, 10)
if !success {
pkg.ProcessLog(fmt.Sprintf("数据处理失败:%s ", key))
}
key = converter.EnBase(num, 16, 1)
value = pkg.HideStringMiddle(key, 4, 4)
}
//if key == "out_trade_no" {
// value = row[keyMap["order_number"]]
//
//}
if key == "type" {
typeMap := make(map[string]string)
typeMap["1"] = "兑换码"
typeMap["2"] = "立减金"
typeMap["3"] = "兑换码现金红包"
value = typeMap[value]
}
//if key == "account" {
// if row[keyMap["type"]] == "2" {
//
// value = dataMap["ordervoucher__channel_user_id"]
// }
// if row[keyMap["type"]] == "3" {
// value = dataMap["ordercash__receive_user_id"]
// }
//
//}
if key == "pay_type" {
typeMap := make(map[string]string)
typeMap["1"] = "支付宝"
typeMap["5"] = "微信"
typeMap["0"] = ""
value = typeMap[value]
}
if key == "pay_status" {
typeMap := make(map[string]string)
typeMap["1"] = "待支付"
typeMap["2"] = "已支付"
typeMap["3"] = "已退款"
value = typeMap[value]
}
if key == "status" {
typeMap := make(map[string]string)
if row[keyMap["type"]] == "1" {
typeMap["0"] = "待充值"
typeMap["1"] = "充值中"
typeMap["2"] = "已完成"
typeMap["3"] = "充值失败"
typeMap["4"] = "已取消"
typeMap["5"] = "已过期"
typeMap["6"] = "待支付"
} else if row[keyMap["type"]] == "2" {
typeMap["0"] = "待领取"
typeMap["1"] = "待领取"
typeMap["2"] = "已领取"
typeMap["3"] = "领取失败"
typeMap["4"] = "已取消"
typeMap["5"] = "已过期"
typeMap["6"] = "待支付"
} else {
typeMap["0"] = "待领取"
typeMap["1"] = "待领取"
typeMap["2"] = "已核销"
typeMap["3"] = "领取失败"
typeMap["4"] = "已取消"
typeMap["5"] = "已过期"
typeMap["6"] = "待支付"
}
value = typeMap[value]
}
if key == "ordervoucher__status" {
typeMap := make(map[string]string)
typeMap["1"] = "待核销"
typeMap["2"] = "已核销"
typeMap["3"] = "已过期"
typeMap["4"] = "已退款"
typeMap["5"] = "领取失败"
typeMap["6"] = "发放中"
typeMap["7"] = "部分退款"
typeMap["8"] = "已退回(全额退)"
typeMap["9"] = "发放失败"
value = typeMap[value]
}
if key == "use_coupon" {
typeMap := make(map[string]string)
typeMap["1"] = "使用"
typeMap["2"] = "未使用"
value = typeMap[value]
}
if key == "reseller_id" {
resellerData := extraData.(map[string]map[string]string)
if _, ok := resellerData[value]; ok {
if resellerData[value]["direct_reseller_id"] != "0" {
row[keyMap["map_time"]] = resellerData[value]["map_time"]
row[keyMap["direct_reseller_name"]] = resellerData[value]["name"]
value = "是"
} else {
value = "否"
}
}
}
if key == "codebatch__reduce" {
if row[keyMap["use_coupon"]] == "2" {
value = "0.00"
}
}
/*if key == "orderdetail__product" {
getProviderColumn := true
product := map[string]interface{}{}
err := json.Unmarshal([]byte(value), &product)
if err != nil {
getProviderColumn = false
} else {
if _, ok := product["entity"]; !ok {
getProviderColumn = false
} else {
entity := product["entity"].(map[string]interface{})
if _, ok := entity["provider"]; ok {
getProviderColumn = true
typeMap := make(map[string]string)
typeMap["voucher_wechat_lsxd"] = "蓝色兄弟"
typeMap["voucher_wechat_fjxw"] = "福建兴旺"
value = typeMap[entity["provider"].(string)]
}
}
}
if !getProviderColumn {
value = "蓝色兄弟"
}
}*/
if key == "direct_reseller_id" {
if row[keyMap["use_coupon"]] == "2" {
value = "0.00"
}
}
if key == "codebatch__reduce" {
if row[keyMap["use_coupon"]] == "2" {
value = "0.00"
}
}
if key == "orderCash__channel" {
typeMap := make(map[string]string)
typeMap["1"] = "支付宝"
typeMap["2"] = "微信"
typeMap["3"] = "云闪付"
value = typeMap[value]
}
if key == "orderCash__receive_status" {
typeMap := make(map[string]string)
typeMap["0"] = "待领取"
typeMap["1"] = "领取中"
typeMap["2"] = "领取成功"
typeMap["3"] = "领取失败"
value = typeMap[value]
}
row[rk] = value
return row
}