export.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/xuri/excelize/v2"
  5. "go.uber.org/zap"
  6. utils "jygit.jydev.jianyu360.cn/data_processing/common_utils"
  7. "jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
  8. "os"
  9. "strconv"
  10. "time"
  11. )
  12. // exportData 导出专项债数据
  13. func exportData() {
  14. //查询条件
  15. area := "湖北省" //省份
  16. area_list := "湖北"
  17. start := "2025" // 发售时间
  18. //
  19. file := area + time.Now().Format("20060102") + "专项债数据.xlsx"
  20. currentPwd, _ := os.Getwd()
  21. exportFile := fmt.Sprintf("%s/%s", currentPwd, file)
  22. xlsx := excelize.NewFile(excelize.Options{ShortDatePattern: "yyyy/m/dd"})
  23. styleOne, _ := xlsx.NewStyle(
  24. &excelize.Style{
  25. Alignment: &excelize.Alignment{
  26. Horizontal: "left",
  27. Vertical: "left",
  28. },
  29. },
  30. )
  31. //1、处理项目数据
  32. line := 0
  33. sheet := "项目详情"
  34. xlsx.NewSheet(sheet)
  35. xlsx.DeleteSheet("Sheet1")
  36. projectIDS := make([]int, 0)
  37. var projects = make([]map[string]interface{}, 0)
  38. //1.导出项目数据
  39. err := MysqlDB.Model(&ProjectBaseInfo{}).Where("area = ? AND create_date >= ?", area, start).Find(&projects).Error
  40. if err != nil {
  41. log.Error("exportData;Error checking for existing project", zap.Error(err))
  42. }
  43. keys := []string{"project_name", "total_investment", "area", "city", "district", "capital", "apply_total_bonds", "other_debt_finacing", "special_debt_capital",
  44. "expected_return", "project_cost", "project_domain", "project_owner", "start_date", "end_date", "operation_start_date",
  45. "operation_end_date", "source_income", "construction_content", "remarks", "other_debt_finacing_source", "cost_income_percent", "coverage_multiple", "competent_department",
  46. "accounting_firm", "law_firm", "create_date", "update_date"}
  47. titles := []string{"项目名称", "总投资(万元)", "省份", "地市", "区县", "不含专项债资本金(万元)", "申请专项债总额(万元)", "其他债务融资(万元)", "专项债作资本金(万元)", "预期收入(万元)", "成本",
  48. "项目领域", "项目业主", "建设期开始", "建设期结束", "运营期开始", "运营期结束", "收入来源", "建设内容", "特殊情况备注", "其他债务融资来源", "成本/收入(%)", "覆盖倍数", "主管部门", "会计所", "律所", "入库时间", "更新时间"}
  49. line++
  50. //设置第一行title
  51. _ = xlsx.SetSheetRow(sheet, fmt.Sprintf("%s%d", "A", line), &titles)
  52. for _, v := range projects {
  53. projectIDS = append(projectIDS, utils.IntAll(v["id"]))
  54. //处理数据到文件
  55. line++
  56. val := []interface{}{}
  57. for _, vv := range keys {
  58. val = append(val, v[vv])
  59. }
  60. err := xlsx.SetSheetRow(sheet, fmt.Sprintf("%s%d", "A", line), &val)
  61. if err != nil {
  62. log.Error("exportData;Error ", zap.Error(err))
  63. return
  64. }
  65. _ = xlsx.SetCellStyle(sheet, fmt.Sprintf("%s%d", "A", line), "BA"+strconv.Itoa(line), styleOne)
  66. }
  67. //保存文件
  68. log.Info("exportData", zap.Any("项目数据处理完毕,总数是:", len(projects)))
  69. // 2、处理债券数据
  70. var bondIds = make([]int, 0)
  71. err = MysqlDB.Model(&ProjectBondRelation{}).Where("project_id in ? ", projectIDS).Select("bond_id").Find(&bondIds).Error
  72. if err != nil {
  73. log.Error("exportData;Error ", zap.Error(err))
  74. }
  75. bondIds = removeDuplicates(bondIds)
  76. //一次性查出所有债权
  77. var bonds = make([]map[string]interface{}, 0)
  78. err = MysqlDB.Debug().Model(&BondInfo{}).Where("id in ? ", bondIds).Find(&bonds).Error
  79. if err != nil {
  80. log.Error("exportData;Error ", zap.Error(err))
  81. }
  82. line2 := 0
  83. sheet2 := "债券详情"
  84. xlsx.NewSheet(sheet2)
  85. keys2 := []string{"bond_name", "bond_short_name", "bond_no", "area", "bond_nature", "bond_type", "official_project_type", "total_amount", "issue_date", "issue_place", "issue_term", "issue_interest_rate", "issue_phase", "way_of_pay_interest",
  86. "new_bond_amount", "counter_bond_amount", "refinancing_bond_amount", "redemption_method", "value_date", "expiry_date", "pay_interest_date", "late_pay_interest_date", "last_pay_interest", "cumulative_pay_interest"}
  87. titles2 := []string{"债券名称", "债券简称", "债券编码", "省份", "债券性质", "债券类型", "官方项目类型", "发行金额(万元)", "发行日期", "发行场所", "发行期限(年)", "发行利率(%)", "发行期数", "付息方式", "新增债券(亿元)", "置换债券(亿元)", "再融资债券(亿元)", "赎回方式",
  88. "起息日", "到息日", "付息日", "最近付息日", "上期已付息(亿元)", "累计付息(亿元)"}
  89. line2++
  90. //设置第一行title
  91. _ = xlsx.SetSheetRow(sheet2, fmt.Sprintf("%s%d", "A", line2), &titles2)
  92. for _, bondDatas := range bonds {
  93. line2++
  94. val := []interface{}{}
  95. for _, vv := range keys2 {
  96. val = append(val, bondDatas[vv])
  97. }
  98. err = xlsx.SetSheetRow(sheet2, fmt.Sprintf("%s%d", "A", line2), &val)
  99. if err != nil {
  100. log.Error("exportData;Error ", zap.Error(err))
  101. }
  102. _ = xlsx.SetCellStyle(sheet2, fmt.Sprintf("%s%d", "A", line2), "BA"+strconv.Itoa(line2), styleOne)
  103. }
  104. log.Info("exportData", zap.Any("债券数据处理完毕,总数是:", len(bonds)))
  105. //3.项目列表
  106. sheet3 := "项目列表"
  107. xlsx.NewSheet(sheet3)
  108. line3 := 0
  109. project_lists := make([]map[string]interface{}, 0)
  110. err = MysqlDB.Model(&ProjectListInfo{}).Where(" area = ? AND issue_date >= ? ", area_list, start).Find(&project_lists).Error
  111. if err != nil {
  112. log.Error("exportData;Error checking for existing project", zap.Error(err))
  113. }
  114. keys3 := []string{"project_name", "total_investment", "area", "city", "district", "present_issue_amount", "issue_term", "issue_interest_rate", "issue_date"}
  115. titles3 := []string{"项目名称", "总投资(万元)", "省份", "地市", "区县", "累计发行额(亿元)", "发行期限(年)", "发行利率(%)", "发行时间"}
  116. line3++
  117. //设置第一行title
  118. _ = xlsx.SetSheetRow(sheet3, fmt.Sprintf("%s%d", "A", line3), &titles3)
  119. //
  120. for _, v := range project_lists {
  121. //处理数据到文件
  122. line3++
  123. val := []interface{}{}
  124. for _, vv := range keys3 {
  125. val = append(val, v[vv])
  126. }
  127. err := xlsx.SetSheetRow(sheet3, fmt.Sprintf("%s%d", "A", line3), &val)
  128. if err != nil {
  129. log.Error("exportData;Error ", zap.Error(err))
  130. return
  131. }
  132. _ = xlsx.SetCellStyle(sheet3, fmt.Sprintf("%s%d", "A", line3), "BA"+strconv.Itoa(line3), styleOne)
  133. }
  134. log.Info("exportData", zap.Any("项目列表数据处理完毕,总数是:", len(project_lists)))
  135. //4. 项目债券关系
  136. /**
  137. SELECT d.*
  138. FROM zxz_project_issue_details d
  139. JOIN zxz_project_base_info p ON d.project_name = p.project_name
  140. WHERE p.area = '天津市';
  141. */
  142. sheet4 := "项目债券关系"
  143. xlsx.NewSheet(sheet4)
  144. line4 := 0
  145. keys4 := []string{"project_name", "project_bach_name", "bond_name", "first_publish_date", "batch_num", "present_issue_amount", "issue_interest_rate", "total_issue_amount"}
  146. titles4 := []string{"项目名称", "项目批次名称", "债券名称", "发布时间", "批次", "发行额", "发行利率", "累计发行金额"}
  147. line4++
  148. //设置第一行title
  149. _ = xlsx.SetSheetRow(sheet4, fmt.Sprintf("%s%d", "A", line4), &titles4)
  150. // 查询天津市的债券数据
  151. var issues = make([]map[string]interface{}, 0)
  152. err = MysqlDB.Table("zxz_project_issue_details d").
  153. Select("d.*").
  154. Joins("JOIN zxz_project_base_info p ON d.project_name = p.project_name ").
  155. Where("p.area = ? AND p.create_date >= ? ", area, start).
  156. Find(&issues).Error
  157. for _, v := range issues {
  158. //处理数据到文件
  159. line4++
  160. val := []interface{}{}
  161. for _, vv := range keys4 {
  162. val = append(val, v[vv])
  163. }
  164. err := xlsx.SetSheetRow(sheet4, fmt.Sprintf("%s%d", "A", line4), &val)
  165. if err != nil {
  166. log.Error("exportData;Error ", zap.Error(err))
  167. return
  168. }
  169. _ = xlsx.SetCellStyle(sheet4, fmt.Sprintf("%s%d", "A", line4), "BA"+strconv.Itoa(line4), styleOne)
  170. }
  171. //
  172. //保存文件
  173. xlsx.Path = exportFile
  174. xlsx.Save()
  175. log.Info("exportData", zap.Any("项目债券关系处理完毕,总数是:", len(issues)))
  176. }