main.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. package main
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/robfig/cron/v3"
  7. "go.uber.org/zap"
  8. "gorm.io/gorm"
  9. util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  10. "jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
  11. "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
  12. "sync"
  13. "time"
  14. )
  15. var (
  16. Mgo *mongodb.MongodbSim
  17. MgoP *mongodb.MongodbSim
  18. MgoSpider *mongodb.MongodbSim
  19. AnalysisDB *gorm.DB
  20. JianyuDB *gorm.DB
  21. JianyuSubjectDB *gorm.DB
  22. endTime string //取数据,时间范围的截止时间;如果为空,就取当前时间
  23. accountOrderPool = make(chan DwdFAccountOrder, 5000)
  24. )
  25. // var endTime = "2024-11-02"
  26. func main() {
  27. local, _ := time.LoadLocation("Asia/Shanghai")
  28. c := cron.New(cron.WithLocation(local), cron.WithSeconds())
  29. eid, err := c.AddFunc(GF.Cron.Spec, dealData)
  30. if err != nil {
  31. log.Info("main", zap.Any("AddFunc err", err))
  32. }
  33. log.Info("main", zap.Any("eid", eid))
  34. c.Start()
  35. defer c.Stop()
  36. select {}
  37. }
  38. // dealData 处理订单相关数据
  39. func dealData() {
  40. //1.清空数据表
  41. truncateTables() //清空数据表
  42. endTime = time.Now().Format("2006-01-02 15:04:05")
  43. log.Info("配置取值时间范围为空", zap.String("默认取值截止时间为:", endTime))
  44. go saveAccountOrder() //保存订单数据
  45. go dealAllDataAccountOrder2()
  46. //dealAllDataAccountOrder() //1.处理归集后-存量剑鱼订单表-dwd_f_account_order
  47. go dealAllDataAccountOrderChangeRecord() //2.处理归集后-存量业绩表更表-dwd_f_account_order_change
  48. go dealAllDataAccountReturn() //3.处理归集后-存量剑鱼回款表-dwd_f_account_return
  49. go dealAllDataAccountReturnChange() //4.处理归集后-剑鱼回款变更表-dwd_f_account_return_change
  50. }
  51. // dealAllDataAccountOrder 处理归集后-存量剑鱼订单表-dwd_f_account_order
  52. func dealAllDataAccountOrder() {
  53. defer func() {
  54. if r := recover(); r != nil {
  55. log.Info("Panic recovered", zap.Any("reason", r))
  56. }
  57. log.Info("aaaaaaaaaaaa")
  58. }()
  59. now := time.Now()
  60. var total int64
  61. AnalysisDB.Debug().Model(&DataexportOrder{}).Where("autoUpdate < ?", endTime).Count(&total)
  62. log.Info("dealAllDataAccountOrder", zap.Any("总数是", total))
  63. rowsPerPage := 100 // 每页的数量
  64. totalPages := (int(total) / rowsPerPage) + 1 //总页数
  65. for page := 0; page < totalPages; page++ {
  66. offset := page * rowsPerPage
  67. rows, err := AnalysisDB.Debug().Model(&DataexportOrder{}).Where("autoUpdate < ?", endTime).Order("id desc").Offset(offset).Limit(rowsPerPage).Rows()
  68. defer func() {
  69. err = rows.Close()
  70. if err != nil {
  71. log.Info("Err rows.Close", zap.Error(err))
  72. }
  73. }()
  74. log.Info("dealAllDataAccountOrder", zap.Any("current page ", page))
  75. for rows.Next() {
  76. var dataExOrder DataexportOrder //原来的订单表
  77. var accountOrder DwdFAccountOrder //归集后的订单表
  78. var user1 DwdFUserbaseBaseinfo //个人用户表
  79. var returnRecord ReturnMoneyRecord //原来的回款表
  80. var returnRecords []ReturnMoneyRecord //原来的回款表
  81. var contract Contract //合同表
  82. // ScanRows 方法用于将一行记录扫描至结构体
  83. err = AnalysisDB.ScanRows(rows, &dataExOrder)
  84. if err != nil {
  85. log.Info("dealAllDataAccountOrder,ScanRows err ", zap.Error(err))
  86. }
  87. filter := dataExOrder.Filter
  88. filterMap := make(map[string]interface{})
  89. err := json.Unmarshal([]byte(filter), &filterMap)
  90. if err != nil {
  91. log.Info("dealAllDataAccountOrder, filter.json.Unmarshal", zap.Error(err))
  92. }
  93. //订单编号不为空
  94. if dataExOrder.OrderCode != "" {
  95. // 业务逻辑...
  96. accountOrder.OrderCode = dataExOrder.OrderCode
  97. var osr OrderSaleRecord //原来的业绩变更表
  98. err = JianyuDB.Order("id asc").Where("ordercode = ? ", dataExOrder.OrderCode).First(&osr).Error
  99. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  100. log.Info("dealAllDataAccountOrder", zap.Error(err))
  101. }
  102. //有业绩表更表记录
  103. if osr.ID > 0 {
  104. if osr.SalerName == "-" {
  105. accountOrder.SalerName = "运营"
  106. } else {
  107. accountOrder.SalerName = osr.SalerName
  108. }
  109. accountOrder.SalerDept = osr.SalerDept
  110. }
  111. accountOrder.CompanyName = dataExOrder.CompanyName
  112. if len(dataExOrder.UserID) > 20 { //个人身份
  113. err = JianyuSubjectDB.Where("userid = ? ", dataExOrder.UserID).First(&user1).Error
  114. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  115. log.Info("dealAllDataAccountOrder", zap.Error(err))
  116. }
  117. accountOrder.UserRegtime = user1.LRegistedate
  118. } else {
  119. //企业身份
  120. rs := new(struct {
  121. PositionId int `gorm:"column:position_id"`
  122. LRegistedate *time.Time `gorm:"column:l_registedate"`
  123. })
  124. if dataExOrder.UserID != "" {
  125. sql := fmt.Sprintf(`SELECT im.position_id,ub.l_registedate FROM
  126. (SELECT userid,position_id FROM Jianyu_subjectdb.dwd_f_userbase_id_mapping WHERE position_id = %s) im
  127. LEFT JOIN Jianyu_subjectdb.dwd_f_userbase_baseinfo ub
  128. ON im.userid=ub.userid`, dataExOrder.UserID)
  129. err = JianyuSubjectDB.Raw(sql).Scan(&rs).Error
  130. if err != nil {
  131. log.Info("处理用户订单表数据", zap.String("查询企业用户注册时间失败", dataExOrder.UserID))
  132. }
  133. accountOrder.UserRegtime = rs.LRegistedate
  134. }
  135. }
  136. accountOrder.CreateTime = dataExOrder.CreateTime
  137. if dataExOrder.IsBackstageOrder == 0 {
  138. accountOrder.ReturnTime = dataExOrder.PayTime
  139. accountOrder.TotalReceived = util.IntAll(filterMap["originalAmount"]) //累计已收
  140. } else if dataExOrder.IsBackstageOrder == 1 {
  141. err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Where("state = 1").Order("return_time asc").First(&returnRecord).Error
  142. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  143. log.Info("dealAllDataAccountOrder", zap.Error(err))
  144. }
  145. accountOrder.ReturnTime = returnRecord.ReturnTime
  146. err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Find(&returnRecords).Error
  147. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  148. log.Info("dealAllDataAccountOrder", zap.Error(err))
  149. }
  150. totalMoney := 0
  151. if len(returnRecords) > 0 {
  152. for _, v := range returnRecords {
  153. totalMoney += v.ReturnMoney
  154. }
  155. }
  156. accountOrder.TotalReceived = totalMoney
  157. }
  158. accountOrder.SaleTime = dataExOrder.SaleTime
  159. accountOrder.OriginalPrice = dataExOrder.OriginalPrice
  160. accountOrder.ContractMoney = util.IntAll(filterMap["originalAmount"])
  161. accountOrder.Commission = dataExOrder.Commission
  162. accountOrder.ProceduresMoney = dataExOrder.ProceduresMoney
  163. accountOrder.ReceivableAmount = accountOrder.ContractMoney - accountOrder.Commission - accountOrder.ProceduresMoney
  164. accountOrder.ProductType = dataExOrder.ProductType
  165. if dataExOrder.ProductType == "大会员" || dataExOrder.ProductType == "大会员-子账号" || dataExOrder.ProductType == "大会员-补充包" {
  166. switch util.IntAll(filterMap["level"]) {
  167. case 1:
  168. accountOrder.DataSpec = "专家版"
  169. case 2:
  170. accountOrder.DataSpec = "智慧版"
  171. case 3:
  172. accountOrder.DataSpec = "商机版"
  173. case 4:
  174. accountOrder.DataSpec = "试用版"
  175. case 5:
  176. accountOrder.DataSpec = "定制版"
  177. case 6:
  178. accountOrder.DataSpec = "商机版2.0"
  179. case 7:
  180. accountOrder.DataSpec = "专家版2.0"
  181. }
  182. //付费类型 VipType
  183. switch util.IntAll(filterMap["recordPayType"]) {
  184. case 1:
  185. accountOrder.VipType = "购买"
  186. case 2:
  187. accountOrder.VipType = "续费"
  188. case 3:
  189. accountOrder.VipType = "升级"
  190. case 4:
  191. accountOrder.VipType = "试用"
  192. }
  193. } else {
  194. accountOrder.DataSpec = dataExOrder.DataSpec
  195. ////付费类型 VipType
  196. switch dataExOrder.VipType {
  197. case 0:
  198. accountOrder.VipType = "购买"
  199. case 1:
  200. accountOrder.VipType = "续费"
  201. case 2:
  202. accountOrder.VipType = "升级"
  203. case 3:
  204. accountOrder.VipType = "试用"
  205. }
  206. }
  207. //OrderStatus 订单状态
  208. if dataExOrder.RefundStatus == 1 || dataExOrder.RefundStatus == 2 {
  209. accountOrder.OrderStatus = "已完成"
  210. } else {
  211. switch dataExOrder.OrderStatus {
  212. case 1:
  213. accountOrder.OrderStatus = "已完成"
  214. case -1:
  215. accountOrder.OrderStatus = "逻辑删除"
  216. case -2:
  217. accountOrder.OrderStatus = "已取消"
  218. case -3:
  219. accountOrder.OrderStatus = "已取消"
  220. case 0:
  221. accountOrder.OrderStatus = "未完成"
  222. }
  223. }
  224. //回款状态
  225. if dataExOrder.IsBackstageOrder == 0 {
  226. if accountOrder.OrderStatus == "已支付" {
  227. accountOrder.ReturnStatus = "全额回款"
  228. } else {
  229. accountOrder.ReturnStatus = "未支付"
  230. }
  231. } else if dataExOrder.IsBackstageOrder == 1 {
  232. switch dataExOrder.ReturnStatus {
  233. case 1:
  234. accountOrder.ReturnStatus = "全额回款"
  235. case 2:
  236. accountOrder.ReturnStatus = "部分回款"
  237. case 0:
  238. accountOrder.ReturnStatus = "未回款"
  239. }
  240. }
  241. //refund_status 回款状态
  242. switch dataExOrder.RefundStatus {
  243. case 0:
  244. accountOrder.RefundStatus = "未退款"
  245. case 1:
  246. accountOrder.RefundStatus = "全额退款"
  247. case 2:
  248. accountOrder.RefundStatus = "部分退款"
  249. }
  250. //
  251. accountOrder.UserPhone = dataExOrder.UserPhone
  252. accountOrder.UserID = dataExOrder.UserID
  253. if dataExOrder.VipStarttime == nil || dataExOrder.VipStarttime.Year() > 1000 {
  254. accountOrder.VipStarttime = dataExOrder.VipStarttime
  255. accountOrder.VipEndtime = dataExOrder.VipEndtime
  256. }
  257. // 合同状态
  258. err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Find(&contract).Error
  259. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  260. log.Info("dealAllDataAccountOrder", zap.Error(err))
  261. }
  262. if contract.ContractStatus == 1 {
  263. accountOrder.ContractStatus = "已签协议"
  264. } else if contract.ContractStatus == 0 {
  265. accountOrder.ContractStatus = "未签协议"
  266. }
  267. accountOrder.ContractCode = contract.ContractCode
  268. accountOrder.ContractTime = contract.ContractTime
  269. if dataExOrder.SigningSubject == "h01" {
  270. accountOrder.SigningSubject = "北京剑鱼信息技术有限公司"
  271. } else if dataExOrder.SigningSubject == "h02" {
  272. accountOrder.SigningSubject = "北京拓普丰联信息科技股份有限公司"
  273. }
  274. accountOrder.OrderChannel = dataExOrder.OrderChannel
  275. accountOrder.DistributionChannel = dataExOrder.DistributionChannel
  276. if dataExOrder.IsBackstageOrder == 1 {
  277. accountOrder.IsBackstageOrder = "是"
  278. } else {
  279. accountOrder.IsBackstageOrder = "否"
  280. }
  281. switch dataExOrder.PayWay {
  282. case "ali", "ali_app", "ali_pc": //ali、ali_app、ali_pc 处理为“支付宝”
  283. accountOrder.PayWay = "支付宝"
  284. case "wx", "wx_app", "wx_js", "wx_pc": // wx、wx_app、wx_js、wx_pc 处理为“微信”
  285. accountOrder.PayWay = "微信"
  286. case "transferAccounts":
  287. accountOrder.PayWay = "对公转账"
  288. default:
  289. accountOrder.PayWay = dataExOrder.PayWay
  290. }
  291. //生成订单数据
  292. err = AnalysisDB.Create(&accountOrder).Error
  293. if err != nil {
  294. log.Info("dealAllDataAccountOrder Create ", zap.Error(err))
  295. }
  296. }
  297. }
  298. }
  299. log.Info("dealAllDataAccountOrder 迭代结束", zap.Int64("数据总量", total))
  300. log.Info("dealAllDataAccountOrder", zap.Any("处理时长", time.Since(now).Minutes()))
  301. }
  302. func dealAllDataAccountOrder2() {
  303. defer func() {
  304. if r := recover(); r != nil {
  305. log.Info("dealAllDataAccountOrder2 Panic recovered", zap.Any("reason", r))
  306. }
  307. log.Info("dealAllDataAccountOrder2 over")
  308. }()
  309. now := time.Now()
  310. var total int64
  311. AnalysisDB.Debug().Model(&DataexportOrder{}).Where("autoUpdate < ?", endTime).Count(&total)
  312. log.Info("dealAllDataAccountOrder", zap.Any("总数是", total))
  313. rowsPerPage := 100 // 每页的数量
  314. totalPages := (int(total) / rowsPerPage) + 1 //总页数
  315. // 控制并发数的 channel,限制最大并发数量为 10
  316. concurrencyLimit := 5
  317. sem := make(chan struct{}, concurrencyLimit)
  318. var wg sync.WaitGroup // 等待所有协程完成
  319. // 启动多协程处理
  320. for i := 0; i < totalPages; i++ {
  321. wg.Add(1) // 增加一个 WaitGroup 计数
  322. go func(page int) {
  323. defer wg.Done() // 完成时减去一个计数
  324. // 获取并发信号,限制同时处理的协程数
  325. sem <- struct{}{} // 向 channel 中发送一个空结构体,占用一个槽位
  326. defer func() { <-sem }() // 在协程结束时从 channel 中取出,释放一个槽位
  327. offset := page * rowsPerPage
  328. rows, err := AnalysisDB.Debug().Model(&DataexportOrder{}).Where("autoUpdate < ?", endTime).
  329. Order("id desc").Offset(offset).Limit(rowsPerPage).Rows()
  330. if err != nil {
  331. log.Info("dealAllDataAccountOrder, Rows Error", zap.Error(err))
  332. return
  333. }
  334. defer func() {
  335. err = rows.Close()
  336. if err != nil {
  337. log.Info("Err rows.Close", zap.Error(err))
  338. }
  339. }()
  340. log.Info("dealAllDataAccountOrder ", zap.Int("current page", page))
  341. // 处理每一行数据
  342. for rows.Next() {
  343. var dataExOrder DataexportOrder //原来的订单表
  344. var accountOrder DwdFAccountOrder //归集后的订单表
  345. var user1 DwdFUserbaseBaseinfo //个人用户表
  346. var returnRecord ReturnMoneyRecord //原来的回款表
  347. var returnRecords []ReturnMoneyRecord //原来的回款表
  348. var contract Contract //合同表
  349. // ScanRows 方法用于将一行记录扫描至结构体
  350. err = AnalysisDB.ScanRows(rows, &dataExOrder)
  351. if err != nil {
  352. log.Info("dealAllDataAccountOrder,ScanRows err ", zap.Error(err))
  353. }
  354. filter := dataExOrder.Filter
  355. filterMap := make(map[string]interface{})
  356. err := json.Unmarshal([]byte(filter), &filterMap)
  357. if err != nil {
  358. log.Info("dealAllDataAccountOrder, filter.json.Unmarshal", zap.Error(err))
  359. }
  360. //订单编号不为空
  361. if dataExOrder.OrderCode != "" {
  362. // 业务逻辑...
  363. accountOrder.OrderCode = dataExOrder.OrderCode
  364. var osr OrderSaleRecord //原来的业绩变更表
  365. err = JianyuDB.Order("id asc").Where("ordercode = ? ", dataExOrder.OrderCode).First(&osr).Error
  366. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  367. log.Info("dealAllDataAccountOrder", zap.Error(err))
  368. }
  369. //有业绩表更表记录
  370. if osr.ID > 0 {
  371. if osr.SalerName == "-" {
  372. accountOrder.SalerName = "运营"
  373. } else {
  374. accountOrder.SalerName = osr.SalerName
  375. }
  376. accountOrder.SalerDept = osr.SalerDept
  377. }
  378. accountOrder.CompanyName = dataExOrder.CompanyName
  379. if len(dataExOrder.UserID) > 20 { //个人身份
  380. err = JianyuSubjectDB.Where("userid = ? ", dataExOrder.UserID).First(&user1).Error
  381. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  382. log.Info("dealAllDataAccountOrder", zap.Error(err))
  383. }
  384. accountOrder.UserRegtime = user1.LRegistedate
  385. } else {
  386. //企业身份
  387. rs := new(struct {
  388. PositionId int `gorm:"column:position_id"`
  389. LRegistedate *time.Time `gorm:"column:l_registedate"`
  390. })
  391. if dataExOrder.UserID != "" {
  392. sql := fmt.Sprintf(`SELECT im.position_id,ub.l_registedate FROM
  393. (SELECT userid,position_id FROM Jianyu_subjectdb.dwd_f_userbase_id_mapping WHERE position_id = %s) im
  394. LEFT JOIN Jianyu_subjectdb.dwd_f_userbase_baseinfo ub
  395. ON im.userid=ub.userid`, dataExOrder.UserID)
  396. err = JianyuSubjectDB.Raw(sql).Scan(&rs).Error
  397. if err != nil {
  398. log.Info("处理用户订单表数据", zap.String("查询企业用户注册时间失败", dataExOrder.UserID))
  399. }
  400. accountOrder.UserRegtime = rs.LRegistedate
  401. }
  402. }
  403. accountOrder.CreateTime = dataExOrder.CreateTime
  404. if dataExOrder.IsBackstageOrder == 0 {
  405. accountOrder.ReturnTime = dataExOrder.PayTime
  406. accountOrder.TotalReceived = util.IntAll(filterMap["originalAmount"]) //累计已收
  407. } else if dataExOrder.IsBackstageOrder == 1 {
  408. err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Where("state = 1").Order("return_time asc").First(&returnRecord).Error
  409. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  410. log.Info("dealAllDataAccountOrder", zap.Error(err))
  411. }
  412. accountOrder.ReturnTime = returnRecord.ReturnTime
  413. err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Find(&returnRecords).Error
  414. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  415. log.Info("dealAllDataAccountOrder", zap.Error(err))
  416. }
  417. totalMoney := 0
  418. if len(returnRecords) > 0 {
  419. for _, v := range returnRecords {
  420. totalMoney += v.ReturnMoney
  421. }
  422. }
  423. accountOrder.TotalReceived = totalMoney
  424. }
  425. accountOrder.SaleTime = dataExOrder.SaleTime
  426. accountOrder.OriginalPrice = dataExOrder.OriginalPrice
  427. accountOrder.ContractMoney = util.IntAll(filterMap["originalAmount"])
  428. accountOrder.Commission = dataExOrder.Commission
  429. accountOrder.ProceduresMoney = dataExOrder.ProceduresMoney
  430. accountOrder.ReceivableAmount = accountOrder.ContractMoney - accountOrder.Commission - accountOrder.ProceduresMoney
  431. accountOrder.ProductType = dataExOrder.ProductType
  432. if dataExOrder.ProductType == "大会员" || dataExOrder.ProductType == "大会员-子账号" || dataExOrder.ProductType == "大会员-补充包" {
  433. switch util.IntAll(filterMap["level"]) {
  434. case 1:
  435. accountOrder.DataSpec = "专家版"
  436. case 2:
  437. accountOrder.DataSpec = "智慧版"
  438. case 3:
  439. accountOrder.DataSpec = "商机版"
  440. case 4:
  441. accountOrder.DataSpec = "试用版"
  442. case 5:
  443. accountOrder.DataSpec = "定制版"
  444. case 6:
  445. accountOrder.DataSpec = "商机版2.0"
  446. case 7:
  447. accountOrder.DataSpec = "专家版2.0"
  448. }
  449. //付费类型 VipType
  450. switch util.IntAll(filterMap["recordPayType"]) {
  451. case 1:
  452. accountOrder.VipType = "购买"
  453. case 2:
  454. accountOrder.VipType = "续费"
  455. case 3:
  456. accountOrder.VipType = "升级"
  457. case 4:
  458. accountOrder.VipType = "试用"
  459. }
  460. } else {
  461. accountOrder.DataSpec = dataExOrder.DataSpec
  462. ////付费类型 VipType
  463. switch dataExOrder.VipType {
  464. case 0:
  465. accountOrder.VipType = "购买"
  466. case 1:
  467. accountOrder.VipType = "续费"
  468. case 2:
  469. accountOrder.VipType = "升级"
  470. case 3:
  471. accountOrder.VipType = "试用"
  472. }
  473. }
  474. //OrderStatus 订单状态
  475. if dataExOrder.RefundStatus == 1 || dataExOrder.RefundStatus == 2 {
  476. accountOrder.OrderStatus = "已完成"
  477. } else {
  478. switch dataExOrder.OrderStatus {
  479. case 1:
  480. accountOrder.OrderStatus = "已完成"
  481. case -1:
  482. accountOrder.OrderStatus = "逻辑删除"
  483. case -2:
  484. accountOrder.OrderStatus = "已取消"
  485. case -3:
  486. accountOrder.OrderStatus = "已取消"
  487. case 0:
  488. accountOrder.OrderStatus = "未完成"
  489. }
  490. }
  491. //回款状态
  492. if dataExOrder.IsBackstageOrder == 0 {
  493. if accountOrder.OrderStatus == "已支付" {
  494. accountOrder.ReturnStatus = "全额回款"
  495. } else {
  496. accountOrder.ReturnStatus = "未支付"
  497. }
  498. } else if dataExOrder.IsBackstageOrder == 1 {
  499. switch dataExOrder.ReturnStatus {
  500. case 1:
  501. accountOrder.ReturnStatus = "全额回款"
  502. case 2:
  503. accountOrder.ReturnStatus = "部分回款"
  504. case 0:
  505. accountOrder.ReturnStatus = "未回款"
  506. }
  507. }
  508. //refund_status 回款状态
  509. switch dataExOrder.RefundStatus {
  510. case 0:
  511. accountOrder.RefundStatus = "未退款"
  512. case 1:
  513. accountOrder.RefundStatus = "全额退款"
  514. case 2:
  515. accountOrder.RefundStatus = "部分退款"
  516. }
  517. //
  518. accountOrder.UserPhone = dataExOrder.UserPhone
  519. accountOrder.UserID = dataExOrder.UserID
  520. if dataExOrder.VipStarttime == nil || dataExOrder.VipStarttime.Year() > 1000 {
  521. accountOrder.VipStarttime = dataExOrder.VipStarttime
  522. accountOrder.VipEndtime = dataExOrder.VipEndtime
  523. }
  524. // 合同状态
  525. err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Find(&contract).Error
  526. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  527. log.Info("dealAllDataAccountOrder", zap.Error(err))
  528. }
  529. if contract.ContractStatus == 1 {
  530. accountOrder.ContractStatus = "已签协议"
  531. } else if contract.ContractStatus == 0 {
  532. accountOrder.ContractStatus = "未签协议"
  533. }
  534. accountOrder.ContractCode = contract.ContractCode
  535. accountOrder.ContractTime = contract.ContractTime
  536. if dataExOrder.SigningSubject == "h01" {
  537. accountOrder.SigningSubject = "北京剑鱼信息技术有限公司"
  538. } else if dataExOrder.SigningSubject == "h02" {
  539. accountOrder.SigningSubject = "北京拓普丰联信息科技股份有限公司"
  540. }
  541. accountOrder.OrderChannel = dataExOrder.OrderChannel
  542. accountOrder.DistributionChannel = dataExOrder.DistributionChannel
  543. if dataExOrder.IsBackstageOrder == 1 {
  544. accountOrder.IsBackstageOrder = "是"
  545. } else {
  546. accountOrder.IsBackstageOrder = "否"
  547. }
  548. switch dataExOrder.PayWay {
  549. case "ali", "ali_app", "ali_pc": //ali、ali_app、ali_pc 处理为“支付宝”
  550. accountOrder.PayWay = "支付宝"
  551. case "wx", "wx_app", "wx_js", "wx_pc": // wx、wx_app、wx_js、wx_pc 处理为“微信”
  552. accountOrder.PayWay = "微信"
  553. case "transferAccounts":
  554. accountOrder.PayWay = "对公转账"
  555. default:
  556. accountOrder.PayWay = dataExOrder.PayWay
  557. }
  558. //生成订单数据
  559. accountOrderPool <- accountOrder
  560. //err = AnalysisDB.Create(&accountOrder).Error
  561. //if err != nil {
  562. // log.Info("dealAllDataAccountOrder Create ", zap.Error(err))
  563. //}
  564. }
  565. }
  566. }(i)
  567. }
  568. // 等待所有协程处理完成
  569. wg.Wait()
  570. log.Info("dealAllDataAccountOrder 迭代结束", zap.Int64("数据总量", total))
  571. log.Info("dealAllDataAccountOrder", zap.Any("处理时长", time.Since(now).Minutes()))
  572. }
  573. // saveAccountOrder 保存归集订单表
  574. func saveAccountOrder() {
  575. defer func() {
  576. if r := recover(); r != nil {
  577. log.Info("saveAccountOrder Panic recovered", zap.Any("reason", r))
  578. }
  579. log.Info("saveAccountOrder over")
  580. }()
  581. for {
  582. select {
  583. case accountOrder, ok := <-accountOrderPool:
  584. if !ok {
  585. // 通道已关闭,退出循环
  586. return
  587. }
  588. err := AnalysisDB.Create(&accountOrder).Error
  589. if err != nil {
  590. log.Info("dealAllDataAccountOrder Create ", zap.Error(err), zap.String("order_code", accountOrder.OrderCode))
  591. }
  592. }
  593. }
  594. }
  595. // truncateTables 清空订单相关数据表
  596. func truncateTables() {
  597. var (
  598. account_order DwdFAccountOrder
  599. account_order_change DwdFAccountOrderChange
  600. account_return DwdFAccountReturn
  601. account_return_change DwdFAccountReturnChange
  602. )
  603. table1 := account_order.TableName()
  604. table2 := account_order_change.TableName()
  605. table3 := account_return.TableName()
  606. table4 := account_return_change.TableName()
  607. // 清空表 1
  608. db, err := AnalysisDB.DB()
  609. if err != nil {
  610. panic("获取数据库连接对象失败:" + err.Error())
  611. }
  612. _, err = db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table1))
  613. if err != nil {
  614. log.Info("清空失败", zap.String("数据表", table1))
  615. }
  616. _, err = db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table2))
  617. if err != nil {
  618. log.Info("清空失败", zap.String("数据表", table2))
  619. }
  620. _, err = db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table3))
  621. if err != nil {
  622. log.Info("清空失败", zap.String("数据表", table3))
  623. }
  624. _, err = db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table4))
  625. if err != nil {
  626. log.Info("清空失败", zap.String("数据表", table4))
  627. }
  628. log.Info("所有数据表清空完毕", zap.String("数据表是:", fmt.Sprintf("%s,%s,%s,%s", table1, table2, table3, table4)))
  629. }