Просмотр исходного кода

更新订单回款逻辑,定时清空数据重跑

wcc 9 месяцев назад
Родитель
Сommit
52071ea588

+ 12 - 6
account_order/account_order_change.go

@@ -30,7 +30,7 @@ func allDataOrderSaleRecordForAccountOrderChange() {
 
 		log.Info("aaaaaaaaaaaa")
 	}()
-
+	now := time.Now()
 	var total int64
 	JianyuDB.Debug().Model(&OrderSaleRecord{}).Where("state IN  ?", []string{"1", "-1"}).Where("autoUpdate < ?", endTime).Count(&total)
 	log.Info("allDataOrderSaleRecordForAccountOrderChange", zap.Any("OrderSaleRecord 总数是", total))
@@ -248,8 +248,10 @@ func allDataOrderSaleRecordForAccountOrderChange() {
 				//
 				account_order_change.UserPhone = data_exOrder.UserPhone
 				account_order_change.UserID = data_exOrder.UserID
-				account_order_change.VipStarttime = data_exOrder.VipStarttime
-				account_order_change.VipEndtime = data_exOrder.VipEndtime
+				if data_exOrder.VipStarttime == nil || data_exOrder.VipStarttime.Year() > 1000 {
+					account_order_change.VipStarttime = data_exOrder.VipStarttime
+					account_order_change.VipEndtime = data_exOrder.VipEndtime
+				}
 				//合同
 				if contract.ContractStatus == 1 {
 					account_order_change.ContractStatus = "已签协议"
@@ -295,6 +297,7 @@ func allDataOrderSaleRecordForAccountOrderChange() {
 	}
 
 	log.Info("allDataOrderSaleRecordForAccountOrderChange 迭代结束", zap.Int64("数据总量", total))
+	log.Info("allDataOrderSaleRecordForAccountOrderChange", zap.Any("处理时长", time.Since(now).Minutes()))
 }
 
 // allDataRefundRecordForAccountOrderChange 退款表数据处理 -refund_record
@@ -306,7 +309,7 @@ func allDataRefundRecordForAccountOrderChange() {
 
 		log.Info("aaaaaaaaaaaa")
 	}()
-
+	now := time.Now()
 	var total int64
 	AnalysisDB.Debug().Model(&RefundRecord{}).Where("refund_time < ?", endTime).Count(&total)
 	log.Info("allDataRefundRecordForAccountOrderChange", zap.Any("RefundRecord 退款表 总数是", total))
@@ -528,8 +531,10 @@ func allDataRefundRecordForAccountOrderChange() {
 				//
 				account_order_change.UserPhone = data_exOrder.UserPhone
 				account_order_change.UserID = data_exOrder.UserID
-				account_order_change.VipStarttime = data_exOrder.VipStarttime
-				account_order_change.VipEndtime = data_exOrder.VipEndtime
+				if data_exOrder.VipStarttime == nil || data_exOrder.VipStarttime.Year() > 1000 {
+					account_order_change.VipStarttime = data_exOrder.VipStarttime
+					account_order_change.VipEndtime = data_exOrder.VipEndtime
+				}
 				//合同
 				if contract.ContractStatus == 1 {
 					account_order_change.ContractStatus = "已签协议"
@@ -576,5 +581,6 @@ func allDataRefundRecordForAccountOrderChange() {
 	}
 
 	log.Info("allDataRefundRecordForAccountOrderChange 迭代结束", zap.Int64("数据总量", total))
+	log.Info("allDataRefundRecordForAccountOrderChange", zap.Any("处理时长", time.Since(now).Minutes()))
 
 }

+ 6 - 1
account_order/account_return.go

@@ -24,7 +24,7 @@ func allDataReturnMoneyRecordForAccountReturn() {
 		}
 		log.Info("aaaaaaaaaaaa")
 	}()
-
+	now := time.Now()
 	var total int64
 	AnalysisDB.Debug().Model(&ReturnMoneyRecord{}).Where("state = ?", 1).Where("autoUpdate < ?", endTime).Count(&total)
 	log.Info("allDataReturnMoneyRecordForAccountReturn", zap.Any("RefundRecord 退款表 总数是", total))
@@ -211,6 +211,7 @@ func allDataReturnMoneyRecordForAccountReturn() {
 		}
 	}
 	log.Info("allDataReturnMoneyRecordForAccountReturn", zap.Any("return_money_record 退款表 迭代结束,总数是", total))
+	log.Info("allDataReturnMoneyRecordForAccountReturn", zap.Any("处理时长", time.Since(now).Minutes()))
 }
 
 // allDataDataexportOrderForAccountReturn 订单表数据处理-dataexport_order
@@ -225,6 +226,7 @@ func allDataDataexportOrderForAccountReturn() {
 		}
 		log.Info("aaaaaaaaaaaa")
 	}()
+	now := time.Now()
 	var total int64
 	AnalysisDB.Debug().Model(&DataexportOrder{}).Where("order_status =? AND is_backstage_order =? AND NOT (pay_way =? AND product_type =?)", 1, 0, "transferAccounts", "VIP订阅").Where("autoUpdate < ?", endTime).Count(&total)
 	log.Info("allDataDataexportOrderForAccountReturn", zap.Any("dataexport_order 订单表 ,order_status=1 and is_backstage_order=0 ,\n\t并排除pay_way=’transferAccounts’ and product_type=’VIP订阅’,总数是", total))
@@ -387,4 +389,7 @@ func allDataDataexportOrderForAccountReturn() {
 
 	}
 
+	log.Info("allDataDataexportOrderForAccountReturn 迭代结束", zap.Int64("数据总量", total))
+	log.Info("allDataDataexportOrderForAccountReturn", zap.Any("处理时长", time.Since(now).Minutes()))
+
 }

+ 5 - 0
account_order/account_return_change.go

@@ -29,6 +29,7 @@ func allDataOrderSaleRecordForAccountReturnChange() {
 		}
 		log.Info("allDataOrderSaleRecordForAccountReturnChange,数据处理完毕")
 	}()
+	now := time.Now()
 	var total int64
 	JianyuDB.Debug().Model(&OrderSaleRecord{}).Where("autoUpdate < ?", endTime).Where("change_reason IN ? AND state IN ? ", []string{"业绩红冲", "销售撞单", "补录销售信息"}, []int{-1, 1}).Count(&total)
 	log.Info("allDataOrderSaleRecordForAccountReturnChange", zap.Any("业绩变更表中取变更类型change_reason是:业绩红冲、销售撞单、补录销售信息,且state in (-1,1),总数是", total))
@@ -209,6 +210,7 @@ func allDataOrderSaleRecordForAccountReturnChange() {
 	}
 
 	log.Info("allDataOrderSaleRecordForAccountReturnChange", zap.Any("数据处理完毕", total))
+	log.Info("allDataOrderSaleRecordForAccountReturnChange", zap.Any("处理时长", time.Since(now).Minutes()))
 }
 
 // allDataRefundRecordForAccountReturnChange 退款表数据处理-data_analysis.refund_record
@@ -219,6 +221,7 @@ func allDataRefundRecordForAccountReturnChange() {
 		}
 		log.Info("allDataRefundRecordForAccountReturnChange", zap.String("数据处理完毕", ""))
 	}()
+	now := time.Now()
 	var total int64
 	AnalysisDB.Debug().Model(&RefundRecord{}).Where("refund_time < ?", endTime).Count(&total)
 	log.Info("allDataRefundRecordForAccountReturnChange", zap.Any("总数是", total))
@@ -391,4 +394,6 @@ func allDataRefundRecordForAccountReturnChange() {
 	}
 
 	log.Info("allDataRefundRecordForAccountReturnChange", zap.Any("数据处理完毕", total))
+	log.Info("allDataRefundRecordForAccountReturnChange", zap.Any("处理时长", time.Since(now).Minutes()))
+
 }

+ 44 - 0
account_order/account_test.go

@@ -0,0 +1,44 @@
+package main
+
+import (
+	"fmt"
+	"go.uber.org/zap"
+	"gorm.io/driver/mysql"
+	"gorm.io/gorm"
+	"gorm.io/gorm/logger"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
+	"testing"
+)
+
+func TestOrder(T *testing.T) {
+	username := "root"
+	password := "123"
+	host := "127.0.0.1:3306" // 本地
+	//host := "172.17.162.27:14000" //线上
+	database := "test"
+	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, database)
+	// 连接到数据库
+	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
+		Logger: logger.Default.LogMode(logger.Error), //不打印日志
+	})
+	if err != nil {
+		log.Info("dealAllDataAccountOrder, Rows Error", zap.Error(err))
+		return
+	}
+	rows, err := db.Debug().Model(&DataexportOrder{}).Where("autoUpdate < ?", endTime).
+		Order("id desc").Offset(0).Limit(100).Rows()
+	for rows.Next() {
+		var dataExOrder DataexportOrder //原来的订单表
+		// ScanRows 方法用于将一行记录扫描至结构体
+		err = db.ScanRows(rows, &dataExOrder)
+		if err != nil {
+			log.Info("dealAllDataAccountOrder,ScanRows err ", zap.Error(err))
+		}
+		if dataExOrder.OrderCode != "" {
+			year := dataExOrder.VipStarttime.Year()
+			log.Info("year", zap.Any("aa", year))
+			log.Info("aaa", zap.Any("viptime", dataExOrder.VipStarttime))
+		}
+
+	}
+}

+ 23 - 4
account_order/config.go

@@ -52,6 +52,9 @@ type MysqlConf struct {
 	Table5   string
 	Table6   string
 	Table7   string
+	Stime    string
+	Etime    string
+	Test     bool
 }
 
 type Log struct {
@@ -188,7 +191,11 @@ type DwdFAccountOrder struct {
 }
 
 func (DwdFAccountOrder) TableName() string {
-	return "dwd_f_account_order"
+	if GF.Mysql.Test {
+		return "dwd_f_account_order_test"
+	} else {
+		return "dwd_f_account_order"
+	}
 }
 
 // OrderSaleRecord  原来的业绩变更表
@@ -375,7 +382,11 @@ type DwdFAccountOrderChange struct {
 }
 
 func (DwdFAccountOrderChange) TableName() string {
-	return "dwd_f_account_order_change"
+	if GF.Mysql.Test {
+		return "dwd_f_account_order_change_test"
+	} else {
+		return "dwd_f_account_order_change"
+	}
 }
 
 // RefundRecord 退款表结构体
@@ -425,7 +436,11 @@ type DwdFAccountReturn struct {
 }
 
 func (DwdFAccountReturn) TableName() string {
-	return "dwd_f_account_return"
+	if GF.Mysql.Test {
+		return "dwd_f_account_return_test"
+	} else {
+		return "dwd_f_account_return"
+	}
 }
 
 // AliPay 结构体表示支付宝支付记录表
@@ -498,5 +513,9 @@ type DwdFAccountReturnChange struct {
 
 // TableName 返回表名
 func (DwdFAccountReturnChange) TableName() string {
-	return "dwd_f_account_return_change"
+	if GF.Mysql.Test {
+		return "dwd_f_account_return_change_test"
+	} else {
+		return "dwd_f_account_return_change"
+	}
 }

+ 10 - 4
account_order/config.toml

@@ -20,10 +20,10 @@
 
 [cron] ## 定时任务
 #    spec = "0 */1 * * * *"  ## 5分钟执行一次
-    spec = "0 00 20 * * *"   ## 每天20点执行
-    start = -1               ## 表示开始时间昨天凌晨
-    end = 0                  ## 表示截止时间到今天凌晨
-    delete = -30              ## 删除30天之前的数据
+    spec = "0 00 23 * * *"   ## 每天23点执行
+#    start = -1               ## 表示开始时间昨天凌晨
+#    end = 0                  ## 表示截止时间到今天凌晨
+#    delete = -30             ## 删除30天之前的数据
 
 
 [mysql]
@@ -41,6 +41,8 @@
     table5 = "order_sale_record" ## 业绩变更表
     table6 = "dwd_f_userbase_baseinfo" ## 用户归集表
     table7 = "dwd_f_userbase_id_mapping" ## 用户归集表
+    etime = ""  ## 数据截止时间,"2024-11-02"
+    test = true
 
 
 
@@ -51,6 +53,10 @@
 #    password= "=PDT49#80Z!RVv52_z"
 #    table = "ods_datamonitoring_bidding"    ## 存储结果数据表
 
+[env]
+
+    spec = "0 00 01 * * *"  ## 定时任务,每天凌晨1点执行
+
 [email]
     api = "http://172.17.162.36:19281/_send/_mail"
     to = "wangchengcheng@topnet.net.cn"

+ 1 - 0
account_order/go.mod

@@ -26,6 +26,7 @@ require (
 	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
 	github.com/pelletier/go-toml/v2 v2.2.2 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
+	github.com/robfig/cron/v3 v3.0.1 // indirect
 	github.com/sagikazarmark/locafero v0.4.0 // indirect
 	github.com/sagikazarmark/slog-shim v0.1.0 // indirect
 	github.com/sourcegraph/conc v0.3.0 // indirect

+ 2 - 0
account_order/go.sum

@@ -96,6 +96,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
+github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
 github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=

+ 386 - 35
account_order/main.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"github.com/robfig/cron/v3"
 	"go.uber.org/zap"
 	"gorm.io/gorm"
 	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
@@ -14,46 +15,46 @@ import (
 )
 
 var (
-	Mgo             *mongodb.MongodbSim
-	MgoP            *mongodb.MongodbSim
-	MgoSpider       *mongodb.MongodbSim
-	AnalysisDB      *gorm.DB
-	JianyuDB        *gorm.DB
-	JianyuSubjectDB *gorm.DB
+	Mgo              *mongodb.MongodbSim
+	MgoP             *mongodb.MongodbSim
+	MgoSpider        *mongodb.MongodbSim
+	AnalysisDB       *gorm.DB
+	JianyuDB         *gorm.DB
+	JianyuSubjectDB  *gorm.DB
+	endTime          string //取数据,时间范围的截止时间;如果为空,就取当前时间
+	accountOrderPool = make(chan DwdFAccountOrder, 5000)
 )
 
-var endTime = "2024-11-02"
+// var endTime = "2024-11-02"
 
 func main() {
-	var wg sync.WaitGroup
-	wg.Add(4)
-	go func() {
-		defer wg.Done()
-		dealAllDataAccountOrder() // 1.处理归集后-存量剑鱼订单表-dwd_f_account_order
-	}()
+	local, _ := time.LoadLocation("Asia/Shanghai")
+	c := cron.New(cron.WithLocation(local), cron.WithSeconds())
+	eid, err := c.AddFunc(GF.Cron.Spec, dealData)
+	if err != nil {
+		log.Info("main", zap.Any("AddFunc err", err))
+	}
+	log.Info("main", zap.Any("eid", eid))
 
-	go func() {
-		defer wg.Done()
-		dealAllDataAccountOrderChangeRecord() //2.处理归集后-存量业绩表更表-dwd_f_account_order_change
-	}()
+	c.Start()
+	defer c.Stop()
 
-	go func() {
-		defer wg.Done()
-		dealAllDataAccountReturn() //3.处理归集后-存量剑鱼回款表-dwd_f_account_return
-	}()
+	select {}
+}
 
-	go func() {
-		defer wg.Done()
-		dealAllDataAccountReturnChange() //4.处理归集后-剑鱼回款变更表-dwd_f_account_return_change
-	}()
+// dealData 处理订单相关数据
+func dealData() {
+	//1.清空数据表
+	truncateTables() //清空数据表
+	endTime = time.Now().Format("2006-01-02 15:04:05")
+	log.Info("配置取值时间范围为空", zap.String("默认取值截止时间为:", endTime))
 
-	wg.Wait()
-	log.Info("所有数据处理完毕")
-	//
-	//dealAllDataAccountOrder()             // 1.处理归集后-存量剑鱼订单表-dwd_f_account_order
-	//dealAllDataAccountOrderChangeRecord() //2.处理归集后-存量业绩表更表-dwd_f_account_order_change
-	//dealAllDataAccountReturn()            //3.处理归集后-存量剑鱼回款表-dwd_f_account_return
-	//dealAllDataAccountReturnChange()      //4.处理归集后-剑鱼回款变更表-dwd_f_account_return_change
+	go saveAccountOrder() //保存订单数据
+	go dealAllDataAccountOrder2()
+	//dealAllDataAccountOrder()              //1.处理归集后-存量剑鱼订单表-dwd_f_account_order
+	go dealAllDataAccountOrderChangeRecord() //2.处理归集后-存量业绩表更表-dwd_f_account_order_change
+	go dealAllDataAccountReturn()            //3.处理归集后-存量剑鱼回款表-dwd_f_account_return
+	go dealAllDataAccountReturnChange()      //4.处理归集后-剑鱼回款变更表-dwd_f_account_return_change
 }
 
 // dealAllDataAccountOrder 处理归集后-存量剑鱼订单表-dwd_f_account_order
@@ -64,7 +65,7 @@ func dealAllDataAccountOrder() {
 		}
 		log.Info("aaaaaaaaaaaa")
 	}()
-
+	now := time.Now()
 	var total int64
 	AnalysisDB.Debug().Model(&DataexportOrder{}).Where("autoUpdate < ?", endTime).Count(&total)
 	log.Info("dealAllDataAccountOrder", zap.Any("总数是", total))
@@ -262,8 +263,10 @@ func dealAllDataAccountOrder() {
 				//
 				accountOrder.UserPhone = dataExOrder.UserPhone
 				accountOrder.UserID = dataExOrder.UserID
-				accountOrder.VipStarttime = dataExOrder.VipStarttime
-				accountOrder.VipEndtime = dataExOrder.VipEndtime
+				if dataExOrder.VipStarttime == nil || dataExOrder.VipStarttime.Year() > 1000 {
+					accountOrder.VipStarttime = dataExOrder.VipStarttime
+					accountOrder.VipEndtime = dataExOrder.VipEndtime
+				}
 				// 合同状态
 				err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Find(&contract).Error
 				if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
@@ -309,5 +312,353 @@ func dealAllDataAccountOrder() {
 	}
 
 	log.Info("dealAllDataAccountOrder 迭代结束", zap.Int64("数据总量", total))
+	log.Info("dealAllDataAccountOrder", zap.Any("处理时长", time.Since(now).Minutes()))
+
+}
+
+func dealAllDataAccountOrder2() {
+	defer func() {
+		if r := recover(); r != nil {
+			log.Info("dealAllDataAccountOrder2 Panic recovered", zap.Any("reason", r))
+		}
+		log.Info("dealAllDataAccountOrder2 over")
+	}()
+	now := time.Now()
+	var total int64
+	AnalysisDB.Debug().Model(&DataexportOrder{}).Where("autoUpdate < ?", endTime).Count(&total)
+	log.Info("dealAllDataAccountOrder", zap.Any("总数是", total))
+
+	rowsPerPage := 100                           // 每页的数量
+	totalPages := (int(total) / rowsPerPage) + 1 //总页数
+
+	// 控制并发数的 channel,限制最大并发数量为 10
+	concurrencyLimit := 5
+	sem := make(chan struct{}, concurrencyLimit)
+	var wg sync.WaitGroup // 等待所有协程完成
+
+	// 启动多协程处理
+	for i := 0; i < totalPages; i++ {
+		wg.Add(1) // 增加一个 WaitGroup 计数
+		go func(page int) {
+			defer wg.Done() // 完成时减去一个计数
+			// 获取并发信号,限制同时处理的协程数
+			sem <- struct{}{}        // 向 channel 中发送一个空结构体,占用一个槽位
+			defer func() { <-sem }() // 在协程结束时从 channel 中取出,释放一个槽位
+
+			offset := page * rowsPerPage
+			rows, err := AnalysisDB.Debug().Model(&DataexportOrder{}).Where("autoUpdate < ?", endTime).
+				Order("id desc").Offset(offset).Limit(rowsPerPage).Rows()
+			if err != nil {
+				log.Info("dealAllDataAccountOrder, Rows Error", zap.Error(err))
+				return
+			}
+			defer func() {
+				err = rows.Close()
+				if err != nil {
+					log.Info("Err rows.Close", zap.Error(err))
+				}
+			}()
+
+			log.Info("dealAllDataAccountOrder ", zap.Int("current page", page))
+
+			// 处理每一行数据
+			for rows.Next() {
+				var dataExOrder DataexportOrder       //原来的订单表
+				var accountOrder DwdFAccountOrder     //归集后的订单表
+				var user1 DwdFUserbaseBaseinfo        //个人用户表
+				var returnRecord ReturnMoneyRecord    //原来的回款表
+				var returnRecords []ReturnMoneyRecord //原来的回款表
+				var contract Contract                 //合同表
+				// ScanRows 方法用于将一行记录扫描至结构体
+				err = AnalysisDB.ScanRows(rows, &dataExOrder)
+				if err != nil {
+					log.Info("dealAllDataAccountOrder,ScanRows err ", zap.Error(err))
+				}
+
+				filter := dataExOrder.Filter
+				filterMap := make(map[string]interface{})
+				err := json.Unmarshal([]byte(filter), &filterMap)
+				if err != nil {
+					log.Info("dealAllDataAccountOrder, filter.json.Unmarshal", zap.Error(err))
+				}
+				//订单编号不为空
+				if dataExOrder.OrderCode != "" {
+					// 业务逻辑...
+					accountOrder.OrderCode = dataExOrder.OrderCode
+					var osr OrderSaleRecord //原来的业绩变更表
+					err = JianyuDB.Order("id asc").Where("ordercode = ? ", dataExOrder.OrderCode).First(&osr).Error
+					if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
+						log.Info("dealAllDataAccountOrder", zap.Error(err))
+					}
+					//有业绩表更表记录
+					if osr.ID > 0 {
+						if osr.SalerName == "-" {
+							accountOrder.SalerName = "运营"
+						} else {
+							accountOrder.SalerName = osr.SalerName
+						}
+						accountOrder.SalerDept = osr.SalerDept
+					}
+					accountOrder.CompanyName = dataExOrder.CompanyName
+					if len(dataExOrder.UserID) > 20 { //个人身份
+						err = JianyuSubjectDB.Where("userid = ? ", dataExOrder.UserID).First(&user1).Error
+						if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
+							log.Info("dealAllDataAccountOrder", zap.Error(err))
+						}
+						accountOrder.UserRegtime = user1.LRegistedate
+					} else {
+						//企业身份
+						rs := new(struct {
+							PositionId   int        `gorm:"column:position_id"`
+							LRegistedate *time.Time `gorm:"column:l_registedate"`
+						})
+						if dataExOrder.UserID != "" {
+							sql := fmt.Sprintf(`SELECT im.position_id,ub.l_registedate FROM
+				(SELECT userid,position_id FROM Jianyu_subjectdb.dwd_f_userbase_id_mapping WHERE position_id = %s) im
+				LEFT JOIN Jianyu_subjectdb.dwd_f_userbase_baseinfo ub
+					ON im.userid=ub.userid`, dataExOrder.UserID)
+							err = JianyuSubjectDB.Raw(sql).Scan(&rs).Error
+							if err != nil {
+								log.Info("处理用户订单表数据", zap.String("查询企业用户注册时间失败", dataExOrder.UserID))
+							}
+							accountOrder.UserRegtime = rs.LRegistedate
+						}
+					}
+
+					accountOrder.CreateTime = dataExOrder.CreateTime
+					if dataExOrder.IsBackstageOrder == 0 {
+						accountOrder.ReturnTime = dataExOrder.PayTime
+						accountOrder.TotalReceived = util.IntAll(filterMap["originalAmount"]) //累计已收
+					} else if dataExOrder.IsBackstageOrder == 1 {
+						err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Where("state = 1").Order("return_time asc").First(&returnRecord).Error
+						if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
+							log.Info("dealAllDataAccountOrder", zap.Error(err))
+						}
+						accountOrder.ReturnTime = returnRecord.ReturnTime
+						err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Find(&returnRecords).Error
+						if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
+							log.Info("dealAllDataAccountOrder", zap.Error(err))
+						}
+						totalMoney := 0
+						if len(returnRecords) > 0 {
+							for _, v := range returnRecords {
+								totalMoney += v.ReturnMoney
+							}
+						}
+						accountOrder.TotalReceived = totalMoney
+					}
+					accountOrder.SaleTime = dataExOrder.SaleTime
+					accountOrder.OriginalPrice = dataExOrder.OriginalPrice
+					accountOrder.ContractMoney = util.IntAll(filterMap["originalAmount"])
+					accountOrder.Commission = dataExOrder.Commission
+					accountOrder.ProceduresMoney = dataExOrder.ProceduresMoney
+					accountOrder.ReceivableAmount = accountOrder.ContractMoney - accountOrder.Commission - accountOrder.ProceduresMoney
+					accountOrder.ProductType = dataExOrder.ProductType
+					if dataExOrder.ProductType == "大会员" || dataExOrder.ProductType == "大会员-子账号" || dataExOrder.ProductType == "大会员-补充包" {
+						switch util.IntAll(filterMap["level"]) {
+						case 1:
+							accountOrder.DataSpec = "专家版"
+						case 2:
+							accountOrder.DataSpec = "智慧版"
+						case 3:
+							accountOrder.DataSpec = "商机版"
+						case 4:
+							accountOrder.DataSpec = "试用版"
+						case 5:
+							accountOrder.DataSpec = "定制版"
+						case 6:
+							accountOrder.DataSpec = "商机版2.0"
+						case 7:
+							accountOrder.DataSpec = "专家版2.0"
+						}
+						//付费类型  VipType
+						switch util.IntAll(filterMap["recordPayType"]) {
+						case 1:
+							accountOrder.VipType = "购买"
+						case 2:
+							accountOrder.VipType = "续费"
+						case 3:
+							accountOrder.VipType = "升级"
+						case 4:
+							accountOrder.VipType = "试用"
+						}
+					} else {
+						accountOrder.DataSpec = dataExOrder.DataSpec
+						////付费类型  VipType
+						switch dataExOrder.VipType {
+						case 0:
+							accountOrder.VipType = "购买"
+						case 1:
+							accountOrder.VipType = "续费"
+						case 2:
+							accountOrder.VipType = "升级"
+						case 3:
+							accountOrder.VipType = "试用"
+						}
+					}
+					//OrderStatus 订单状态
+					if dataExOrder.RefundStatus == 1 || dataExOrder.RefundStatus == 2 {
+						accountOrder.OrderStatus = "已完成"
+					} else {
+						switch dataExOrder.OrderStatus {
+						case 1:
+							accountOrder.OrderStatus = "已完成"
+						case -1:
+							accountOrder.OrderStatus = "逻辑删除"
+						case -2:
+							accountOrder.OrderStatus = "已取消"
+						case -3:
+							accountOrder.OrderStatus = "已取消"
+						case 0:
+							accountOrder.OrderStatus = "未完成"
+						}
+					}
+					//回款状态
+					if dataExOrder.IsBackstageOrder == 0 {
+						if accountOrder.OrderStatus == "已支付" {
+							accountOrder.ReturnStatus = "全额回款"
+						} else {
+							accountOrder.ReturnStatus = "未支付"
+						}
+					} else if dataExOrder.IsBackstageOrder == 1 {
+						switch dataExOrder.ReturnStatus {
+						case 1:
+							accountOrder.ReturnStatus = "全额回款"
+						case 2:
+							accountOrder.ReturnStatus = "部分回款"
+						case 0:
+							accountOrder.ReturnStatus = "未回款"
+						}
+					}
+					//refund_status 回款状态
+					switch dataExOrder.RefundStatus {
+					case 0:
+						accountOrder.RefundStatus = "未退款"
+					case 1:
+						accountOrder.RefundStatus = "全额退款"
+					case 2:
+						accountOrder.RefundStatus = "部分退款"
+					}
+					//
+					accountOrder.UserPhone = dataExOrder.UserPhone
+					accountOrder.UserID = dataExOrder.UserID
+					if dataExOrder.VipStarttime == nil || dataExOrder.VipStarttime.Year() > 1000 {
+						accountOrder.VipStarttime = dataExOrder.VipStarttime
+						accountOrder.VipEndtime = dataExOrder.VipEndtime
+					}
+					// 合同状态
+					err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Find(&contract).Error
+					if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
+						log.Info("dealAllDataAccountOrder", zap.Error(err))
+					}
+					if contract.ContractStatus == 1 {
+						accountOrder.ContractStatus = "已签协议"
+					} else if contract.ContractStatus == 0 {
+						accountOrder.ContractStatus = "未签协议"
+					}
+					accountOrder.ContractCode = contract.ContractCode
+					accountOrder.ContractTime = contract.ContractTime
+					if dataExOrder.SigningSubject == "h01" {
+						accountOrder.SigningSubject = "北京剑鱼信息技术有限公司"
+					} else if dataExOrder.SigningSubject == "h02" {
+						accountOrder.SigningSubject = "北京拓普丰联信息科技股份有限公司"
+					}
+					accountOrder.OrderChannel = dataExOrder.OrderChannel
+					accountOrder.DistributionChannel = dataExOrder.DistributionChannel
+					if dataExOrder.IsBackstageOrder == 1 {
+						accountOrder.IsBackstageOrder = "是"
+					} else {
+						accountOrder.IsBackstageOrder = "否"
+					}
+					switch dataExOrder.PayWay {
+					case "ali", "ali_app", "ali_pc": //ali、ali_app、ali_pc 处理为“支付宝”
+						accountOrder.PayWay = "支付宝"
+					case "wx", "wx_app", "wx_js", "wx_pc": // wx、wx_app、wx_js、wx_pc 处理为“微信”
+						accountOrder.PayWay = "微信"
+					case "transferAccounts":
+						accountOrder.PayWay = "对公转账"
+					default:
+						accountOrder.PayWay = dataExOrder.PayWay
+					}
+					//生成订单数据
+					accountOrderPool <- accountOrder
+					//err = AnalysisDB.Create(&accountOrder).Error
+					//if err != nil {
+					//	log.Info("dealAllDataAccountOrder Create ", zap.Error(err))
+					//}
+				}
+			}
+		}(i)
+	}
+
+	// 等待所有协程处理完成
+	wg.Wait()
+
+	log.Info("dealAllDataAccountOrder 迭代结束", zap.Int64("数据总量", total))
+	log.Info("dealAllDataAccountOrder", zap.Any("处理时长", time.Since(now).Minutes()))
+}
+
+// saveAccountOrder 保存归集订单表
+func saveAccountOrder() {
+	defer func() {
+		if r := recover(); r != nil {
+			log.Info("saveAccountOrder Panic recovered", zap.Any("reason", r))
+		}
+		log.Info("saveAccountOrder over")
+	}()
+
+	for {
+		select {
+		case accountOrder, ok := <-accountOrderPool:
+			if !ok {
+				// 通道已关闭,退出循环
+				return
+			}
+			err := AnalysisDB.Create(&accountOrder).Error
+			if err != nil {
+				log.Info("dealAllDataAccountOrder Create ", zap.Error(err), zap.String("order_code", accountOrder.OrderCode))
+			}
+		}
+	}
+}
+
+// truncateTables 清空订单相关数据表
+func truncateTables() {
+	var (
+		account_order         DwdFAccountOrder
+		account_order_change  DwdFAccountOrderChange
+		account_return        DwdFAccountReturn
+		account_return_change DwdFAccountReturnChange
+	)
+
+	table1 := account_order.TableName()
+	table2 := account_order_change.TableName()
+	table3 := account_return.TableName()
+	table4 := account_return_change.TableName()
+
+	// 清空表 1
+	db, err := AnalysisDB.DB()
+	if err != nil {
+		panic("获取数据库连接对象失败:" + err.Error())
+	}
+	_, err = db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table1))
+	if err != nil {
+		log.Info("清空失败", zap.String("数据表", table1))
+	}
+	_, err = db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table2))
+	if err != nil {
+		log.Info("清空失败", zap.String("数据表", table2))
+	}
+
+	_, err = db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table3))
+	if err != nil {
+		log.Info("清空失败", zap.String("数据表", table3))
+	}
+
+	_, err = db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table4))
+	if err != nil {
+		log.Info("清空失败", zap.String("数据表", table4))
+	}
 
+	log.Info("所有数据表清空完毕", zap.String("数据表是:", fmt.Sprintf("%s,%s,%s,%s", table1, table2, table3, table4)))
 }

+ 3 - 1
account_order/readme.md

@@ -21,7 +21,9 @@
 
 
 ##  _存量数据_ 范围
-autoUpdate < 2024-10-16 
+autoUpdate < etime;大部分数据表取数据,都是按照 该字段取值,部分如:退款表,取值是按照`refund_time` 字段取值。
+如果配置文件没有配置 `etime`或者为空,就取程序运行时间为截止时间。
+
 
 
 

BIN
account_order/剑鱼订单-回款-业绩变更表需求梳理20241016.xlsx