293 lines
6.7 KiB
Go
293 lines
6.7 KiB
Go
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
|
||
}
|