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 }