main.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. package main
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "go.uber.org/zap"
  7. "gorm.io/gorm"
  8. util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  9. "jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
  10. "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
  11. "sync"
  12. "time"
  13. )
  14. var (
  15. Mgo *mongodb.MongodbSim
  16. MgoP *mongodb.MongodbSim
  17. MgoSpider *mongodb.MongodbSim
  18. AnalysisDB *gorm.DB
  19. JianyuDB *gorm.DB
  20. JianyuSubjectDB *gorm.DB
  21. )
  22. var endTime = "2024-11-02"
  23. func main() {
  24. var wg sync.WaitGroup
  25. wg.Add(4)
  26. go func() {
  27. defer wg.Done()
  28. dealAllDataAccountOrder() // 1.处理归集后-存量剑鱼订单表-dwd_f_account_order
  29. }()
  30. go func() {
  31. defer wg.Done()
  32. dealAllDataAccountOrderChangeRecord() //2.处理归集后-存量业绩表更表-dwd_f_account_order_change
  33. }()
  34. go func() {
  35. defer wg.Done()
  36. dealAllDataAccountReturn() //3.处理归集后-存量剑鱼回款表-dwd_f_account_return
  37. }()
  38. go func() {
  39. defer wg.Done()
  40. dealAllDataAccountReturnChange() //4.处理归集后-剑鱼回款变更表-dwd_f_account_return_change
  41. }()
  42. wg.Wait()
  43. log.Info("所有数据处理完毕")
  44. //
  45. //dealAllDataAccountOrder() // 1.处理归集后-存量剑鱼订单表-dwd_f_account_order
  46. //dealAllDataAccountOrderChangeRecord() //2.处理归集后-存量业绩表更表-dwd_f_account_order_change
  47. //dealAllDataAccountReturn() //3.处理归集后-存量剑鱼回款表-dwd_f_account_return
  48. //dealAllDataAccountReturnChange() //4.处理归集后-剑鱼回款变更表-dwd_f_account_return_change
  49. }
  50. // dealAllDataAccountOrder 处理归集后-存量剑鱼订单表-dwd_f_account_order
  51. func dealAllDataAccountOrder() {
  52. defer func() {
  53. if r := recover(); r != nil {
  54. log.Info("Panic recovered", zap.Any("reason", r))
  55. }
  56. log.Info("aaaaaaaaaaaa")
  57. }()
  58. var total int64
  59. AnalysisDB.Debug().Model(&DataexportOrder{}).Where("autoUpdate < ?", endTime).Count(&total)
  60. log.Info("dealAllDataAccountOrder", zap.Any("总数是", total))
  61. rowsPerPage := 100 // 每页的数量
  62. totalPages := (int(total) / rowsPerPage) + 1 //总页数
  63. for page := 0; page < totalPages; page++ {
  64. offset := page * rowsPerPage
  65. rows, err := AnalysisDB.Debug().Model(&DataexportOrder{}).Where("autoUpdate < ?", endTime).Order("id desc").Offset(offset).Limit(rowsPerPage).Rows()
  66. defer func() {
  67. err = rows.Close()
  68. if err != nil {
  69. log.Info("Err rows.Close", zap.Error(err))
  70. }
  71. }()
  72. log.Info("dealAllDataAccountOrder", zap.Any("current page ", page))
  73. for rows.Next() {
  74. var dataExOrder DataexportOrder //原来的订单表
  75. var accountOrder DwdFAccountOrder //归集后的订单表
  76. var user1 DwdFUserbaseBaseinfo //个人用户表
  77. var returnRecord ReturnMoneyRecord //原来的回款表
  78. var returnRecords []ReturnMoneyRecord //原来的回款表
  79. var contract Contract //合同表
  80. // ScanRows 方法用于将一行记录扫描至结构体
  81. err = AnalysisDB.ScanRows(rows, &dataExOrder)
  82. if err != nil {
  83. log.Info("dealAllDataAccountOrder,ScanRows err ", zap.Error(err))
  84. }
  85. filter := dataExOrder.Filter
  86. filterMap := make(map[string]interface{})
  87. err := json.Unmarshal([]byte(filter), &filterMap)
  88. if err != nil {
  89. log.Info("dealAllDataAccountOrder, filter.json.Unmarshal", zap.Error(err))
  90. }
  91. //订单编号不为空
  92. if dataExOrder.OrderCode != "" {
  93. // 业务逻辑...
  94. accountOrder.OrderCode = dataExOrder.OrderCode
  95. var osr OrderSaleRecord //原来的业绩变更表
  96. err = JianyuDB.Order("id asc").Where("ordercode = ? ", dataExOrder.OrderCode).First(&osr).Error
  97. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  98. log.Info("dealAllDataAccountOrder", zap.Error(err))
  99. }
  100. //有业绩表更表记录
  101. if osr.ID > 0 {
  102. if osr.SalerName == "-" {
  103. accountOrder.SalerName = "运营"
  104. } else {
  105. accountOrder.SalerName = osr.SalerName
  106. }
  107. accountOrder.SalerDept = osr.SalerDept
  108. }
  109. accountOrder.CompanyName = dataExOrder.CompanyName
  110. if len(dataExOrder.UserID) > 20 { //个人身份
  111. err = JianyuSubjectDB.Where("userid = ? ", dataExOrder.UserID).First(&user1).Error
  112. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  113. log.Info("dealAllDataAccountOrder", zap.Error(err))
  114. }
  115. accountOrder.UserRegtime = user1.LRegistedate
  116. } else {
  117. //企业身份
  118. rs := new(struct {
  119. PositionId int `gorm:"column:position_id"`
  120. LRegistedate *time.Time `gorm:"column:l_registedate"`
  121. })
  122. if dataExOrder.UserID != "" {
  123. sql := fmt.Sprintf(`SELECT im.position_id,ub.l_registedate FROM
  124. (SELECT userid,position_id FROM Jianyu_subjectdb.dwd_f_userbase_id_mapping WHERE position_id = %s) im
  125. LEFT JOIN Jianyu_subjectdb.dwd_f_userbase_baseinfo ub
  126. ON im.userid=ub.userid`, dataExOrder.UserID)
  127. err = JianyuSubjectDB.Raw(sql).Scan(&rs).Error
  128. if err != nil {
  129. log.Info("处理用户订单表数据", zap.String("查询企业用户注册时间失败", dataExOrder.UserID))
  130. }
  131. accountOrder.UserRegtime = rs.LRegistedate
  132. }
  133. }
  134. accountOrder.CreateTime = dataExOrder.CreateTime
  135. if dataExOrder.IsBackstageOrder == 0 {
  136. accountOrder.ReturnTime = dataExOrder.PayTime
  137. accountOrder.TotalReceived = util.IntAll(filterMap["originalAmount"]) //累计已收
  138. } else if dataExOrder.IsBackstageOrder == 1 {
  139. err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Where("state = 1").Order("return_time asc").First(&returnRecord).Error
  140. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  141. log.Info("dealAllDataAccountOrder", zap.Error(err))
  142. }
  143. accountOrder.ReturnTime = returnRecord.ReturnTime
  144. err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Find(&returnRecords).Error
  145. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  146. log.Info("dealAllDataAccountOrder", zap.Error(err))
  147. }
  148. totalMoney := 0
  149. if len(returnRecords) > 0 {
  150. for _, v := range returnRecords {
  151. totalMoney += v.ReturnMoney
  152. }
  153. }
  154. accountOrder.TotalReceived = totalMoney
  155. }
  156. accountOrder.SaleTime = dataExOrder.SaleTime
  157. accountOrder.OriginalPrice = dataExOrder.OriginalPrice
  158. accountOrder.ContractMoney = util.IntAll(filterMap["originalAmount"])
  159. accountOrder.Commission = dataExOrder.Commission
  160. accountOrder.ProceduresMoney = dataExOrder.ProceduresMoney
  161. accountOrder.ReceivableAmount = accountOrder.ContractMoney - accountOrder.Commission - accountOrder.ProceduresMoney
  162. accountOrder.ProductType = dataExOrder.ProductType
  163. if dataExOrder.ProductType == "大会员" || dataExOrder.ProductType == "大会员-子账号" || dataExOrder.ProductType == "大会员-补充包" {
  164. switch util.IntAll(filterMap["level"]) {
  165. case 1:
  166. accountOrder.DataSpec = "专家版"
  167. case 2:
  168. accountOrder.DataSpec = "智慧版"
  169. case 3:
  170. accountOrder.DataSpec = "商机版"
  171. case 4:
  172. accountOrder.DataSpec = "试用版"
  173. case 5:
  174. accountOrder.DataSpec = "定制版"
  175. case 6:
  176. accountOrder.DataSpec = "商机版2.0"
  177. case 7:
  178. accountOrder.DataSpec = "专家版2.0"
  179. }
  180. //付费类型 VipType
  181. switch util.IntAll(filterMap["recordPayType"]) {
  182. case 1:
  183. accountOrder.VipType = "购买"
  184. case 2:
  185. accountOrder.VipType = "续费"
  186. case 3:
  187. accountOrder.VipType = "升级"
  188. case 4:
  189. accountOrder.VipType = "试用"
  190. }
  191. } else {
  192. accountOrder.DataSpec = dataExOrder.DataSpec
  193. ////付费类型 VipType
  194. switch dataExOrder.VipType {
  195. case 0:
  196. accountOrder.VipType = "购买"
  197. case 1:
  198. accountOrder.VipType = "续费"
  199. case 2:
  200. accountOrder.VipType = "升级"
  201. case 3:
  202. accountOrder.VipType = "试用"
  203. }
  204. }
  205. //OrderStatus 订单状态
  206. if dataExOrder.RefundStatus == 1 || dataExOrder.RefundStatus == 2 {
  207. accountOrder.OrderStatus = "已完成"
  208. } else {
  209. switch dataExOrder.OrderStatus {
  210. case 1:
  211. accountOrder.OrderStatus = "已完成"
  212. case -1:
  213. accountOrder.OrderStatus = "逻辑删除"
  214. case -2:
  215. accountOrder.OrderStatus = "已取消"
  216. case -3:
  217. accountOrder.OrderStatus = "已取消"
  218. case 0:
  219. accountOrder.OrderStatus = "未完成"
  220. }
  221. }
  222. //回款状态
  223. if dataExOrder.IsBackstageOrder == 0 {
  224. if accountOrder.OrderStatus == "已支付" {
  225. accountOrder.ReturnStatus = "全额回款"
  226. } else {
  227. accountOrder.ReturnStatus = "未支付"
  228. }
  229. } else if dataExOrder.IsBackstageOrder == 1 {
  230. switch dataExOrder.ReturnStatus {
  231. case 1:
  232. accountOrder.ReturnStatus = "全额回款"
  233. case 2:
  234. accountOrder.ReturnStatus = "部分回款"
  235. case 0:
  236. accountOrder.ReturnStatus = "未回款"
  237. }
  238. }
  239. //refund_status 回款状态
  240. switch dataExOrder.RefundStatus {
  241. case 0:
  242. accountOrder.RefundStatus = "未退款"
  243. case 1:
  244. accountOrder.RefundStatus = "全额退款"
  245. case 2:
  246. accountOrder.RefundStatus = "部分退款"
  247. }
  248. //
  249. accountOrder.UserPhone = dataExOrder.UserPhone
  250. accountOrder.UserID = dataExOrder.UserID
  251. accountOrder.VipStarttime = dataExOrder.VipStarttime
  252. accountOrder.VipEndtime = dataExOrder.VipEndtime
  253. // 合同状态
  254. err = AnalysisDB.Where("order_code = ? ", dataExOrder.OrderCode).Find(&contract).Error
  255. if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
  256. log.Info("dealAllDataAccountOrder", zap.Error(err))
  257. }
  258. if contract.ContractStatus == 1 {
  259. accountOrder.ContractStatus = "已签协议"
  260. } else if contract.ContractStatus == 0 {
  261. accountOrder.ContractStatus = "未签协议"
  262. }
  263. accountOrder.ContractCode = contract.ContractCode
  264. accountOrder.ContractTime = contract.ContractTime
  265. if dataExOrder.SigningSubject == "h01" {
  266. accountOrder.SigningSubject = "北京剑鱼信息技术有限公司"
  267. } else if dataExOrder.SigningSubject == "h02" {
  268. accountOrder.SigningSubject = "北京拓普丰联信息科技股份有限公司"
  269. }
  270. accountOrder.OrderChannel = dataExOrder.OrderChannel
  271. accountOrder.DistributionChannel = dataExOrder.DistributionChannel
  272. if dataExOrder.IsBackstageOrder == 1 {
  273. accountOrder.IsBackstageOrder = "是"
  274. } else {
  275. accountOrder.IsBackstageOrder = "否"
  276. }
  277. switch dataExOrder.PayWay {
  278. case "ali", "ali_app", "ali_pc": //ali、ali_app、ali_pc 处理为“支付宝”
  279. accountOrder.PayWay = "支付宝"
  280. case "wx", "wx_app", "wx_js", "wx_pc": // wx、wx_app、wx_js、wx_pc 处理为“微信”
  281. accountOrder.PayWay = "微信"
  282. case "transferAccounts":
  283. accountOrder.PayWay = "对公转账"
  284. default:
  285. accountOrder.PayWay = dataExOrder.PayWay
  286. }
  287. //生成订单数据
  288. err = AnalysisDB.Create(&accountOrder).Error
  289. if err != nil {
  290. log.Info("dealAllDataAccountOrder Create ", zap.Error(err))
  291. }
  292. }
  293. }
  294. }
  295. log.Info("dealAllDataAccountOrder 迭代结束", zap.Int64("数据总量", total))
  296. }