广告平台(媒体使用)
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

220 líneas
7.5 KiB

  1. package hdl
  2. import (
  3. "applet/app/e"
  4. "applet/app/lib/validate"
  5. "applet/app/md"
  6. "applet/app/svc"
  7. "applet/app/utils"
  8. db "code.fnuoos.com/zhimeng/model.git/src"
  9. "code.fnuoos.com/zhimeng/model.git/src/super/implement"
  10. "fmt"
  11. "github.com/boombuler/barcode"
  12. "github.com/boombuler/barcode/code128"
  13. "github.com/gin-gonic/gin"
  14. "github.com/jung-kurt/gofpdf"
  15. "image/jpeg"
  16. "net/url"
  17. "os"
  18. "strings"
  19. "time"
  20. )
  21. // SettleCenterList
  22. // @Summary 结算报表
  23. // @Tags 结算中心------嘉俊
  24. // @Description 结算中心-结算报表
  25. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  26. // @Accept json
  27. // @Produce json
  28. // @Param args body md.SettleCenterDataReq true "请求参数"
  29. // @Success 200 {object} md.SettleCenterDataRes "具体看返回内容 这是data里面的数据"
  30. // @Failure 400 {object} md.Response "具体错误"
  31. // @Router /api/settleCenter/list [POST]
  32. func SettleCenterList(c *gin.Context) {
  33. var req md.SettleCenterDataReq
  34. err := c.ShouldBindJSON(&req)
  35. if err != nil {
  36. err = validate.HandleValidateErr(err)
  37. err1 := err.(e.E)
  38. e.OutErr(c, err1.Code, err1.Error())
  39. return
  40. }
  41. res := svc.SettleCenterList(c, req)
  42. e.OutSuc(c, res, nil)
  43. return
  44. }
  45. // SettleCenterDetail
  46. // @Summary 结算报表-详情
  47. // @Tags 结算中心------嘉俊
  48. // @Description 结算中心-结算报表-详情
  49. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  50. // @Accept json
  51. // @Produce json
  52. // @Param args body md.CommDetailReq true "请求参数"
  53. // @Success 200 {object} md.SettleCenterDataDetailRes "具体看返回内容 这是data里面的数据"
  54. // @Failure 400 {object} md.Response "具体错误"
  55. // @Router /api/settleCenter/detail [POST]
  56. func SettleCenterDetail(c *gin.Context) {
  57. var req md.CommDetailReq
  58. err := c.ShouldBindJSON(&req)
  59. if err != nil {
  60. err = validate.HandleValidateErr(err)
  61. err1 := err.(e.E)
  62. e.OutErr(c, err1.Code, err1.Error())
  63. return
  64. }
  65. res := svc.SettleCenterDetail(c, req)
  66. e.OutSuc(c, res, nil)
  67. return
  68. }
  69. // SettleCenterSettleFileSave
  70. // @Summary 媒体详情-结算单保存
  71. // @Tags 财务中心------嘉俊
  72. // @Description 财务中心-媒体详情-结算单保存
  73. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  74. // @Accept json
  75. // @Produce json
  76. // @Param args body md.SettleFileReq true "请求参数"
  77. // @Success 200 {string} "具体看返回内容 这是data里面的数据"
  78. // @Failure 400 {object} md.Response "具体错误"
  79. // @Router /api/settleCenter/settle/file/save [POST]
  80. func SettleCenterSettleFileSave(c *gin.Context) {
  81. var req md.SettleFileReq
  82. err := c.ShouldBindJSON(&req)
  83. if err != nil {
  84. err = validate.HandleValidateErr(err)
  85. err1 := err.(e.E)
  86. e.OutErr(c, err1.Code, err1.Error())
  87. return
  88. }
  89. svc.SettleCenterSettleFileSave(c, req)
  90. }
  91. // SettleCenterInvoiceSave
  92. // @Summary 媒体详情-发票上传
  93. // @Tags 财务中心------嘉俊
  94. // @Description 财务中心-媒体详情-发票上传
  95. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  96. // @Accept json
  97. // @Produce json
  98. // @Param args body md.InvoiceReq true "请求参数"
  99. // @Success 200 {string} "具体看返回内容 这是data里面的数据"
  100. // @Failure 400 {object} md.Response "具体错误"
  101. // @Router /api/settleCenter/invoice/save [POST]
  102. func SettleCenterInvoiceSave(c *gin.Context) {
  103. var req md.InvoiceReq
  104. err := c.ShouldBindJSON(&req)
  105. if err != nil {
  106. err = validate.HandleValidateErr(err)
  107. err1 := err.(e.E)
  108. e.OutErr(c, err1.Code, err1.Error())
  109. return
  110. }
  111. svc.SettleCenterInvoiceSave(c, req)
  112. }
  113. func SettleCenterSettleFileDown(c *gin.Context) {
  114. id := c.Query("id")
  115. engine := db.Db
  116. NewMediumSettlementDb := implement.NewMediumSettlementDb(engine)
  117. data, _ := NewMediumSettlementDb.GetMediumSettlementById(utils.StrToInt(id))
  118. NewMediumListDb := implement.NewMediumListDb(engine)
  119. medium, _ := NewMediumListDb.GetMediumList(data.MediumId)
  120. // 创建一个新的PDF文件
  121. pdf := gofpdf.New("P", "mm", "A4", "")
  122. // 添加一页
  123. pdf.AddPage()
  124. // 设置文本颜色(参数为RGB值)
  125. pdf.SetTextColor(0, 0, 0)
  126. // 换行
  127. pdf.Ln(-1)
  128. // 引入中文字体,需要相应的字体文件
  129. pdf.AddUTF8Font("SourceHanSansCN-Light", "", "./static/SourceHanSansCN-Light.ttf")
  130. // 引入中文字体后设置中文字体和字号
  131. left := 15.0
  132. pdf.Image("./static/图片1.png", left, 25, 50, 15, false, "PNG", 0, "")
  133. pdf.SetFont("SourceHanSansCN-Light", "", 10)
  134. pdf.Text(130, 40, "杭州激活鸟网络科技有限公司")
  135. //// 生成EAN-13条形码
  136. num := "jihuoniao-Ads-" + time.Now().Format("20060102") + "-" + utils.IntToStr(data.Id)
  137. cs, _ := code128.Encode(num)
  138. // 创建一个要输出数据的文件
  139. file, _ := os.Create("./static/" + num + ".jpg")
  140. defer file.Close()
  141. // 设置图片像素大小
  142. qrCode, _ := barcode.Scale(cs, 350, 100)
  143. // 将code128的条形码编码为png图片
  144. jpeg.Encode(file, qrCode, nil)
  145. pdf.Image("./static/"+num+".jpg", left, 50, 170, 30, false, "JPEG", 0, "")
  146. pdf.SetFont("SourceHanSansCN-Light", "", 28)
  147. pdf.Text(left, 95, "激活鸟 · 变现中心结算对账单")
  148. pdf.SetFont("SourceHanSansCN-Light", "", 12)
  149. pdf.Text(left, 105, "结 算 单 号 : "+num)
  150. pdf.Text(left, 115, "制 表 日 期 : "+time.Now().Format("2006/01/02"))
  151. date := ""
  152. if data.StartDate != "0000-00-00" && data.StartDate != "" {
  153. date = strings.ReplaceAll(data.StartDate, "-", ".")
  154. }
  155. if data.EndDate != "0000-00-00" && data.EndDate != "" {
  156. date += " - " + strings.ReplaceAll(data.EndDate, "-", ".")
  157. }
  158. pdf.Text(left, 125, "结 算 日 期 : "+date)
  159. pdf.Text(left, 135, "客 户 名 称 : "+medium.CompanyName)
  160. // 定义表格内容
  161. pdf.SetFont("SourceHanSansCN-Light", "", 12)
  162. table := []string{
  163. "业务类型", "基础收益(元)", "其他调整(元)", "实际结算总计(元)",
  164. "广告合作", utils.Float64ToStr(float64(data.BasicIncome) / 100), utils.Float64ToStr(float64(data.OtherIncome) / 100), utils.Float64ToStr(float64(data.BasicIncome+data.OtherIncome) / 100),
  165. }
  166. // 定义表格列数
  167. col := 4
  168. // 定义单元格位置
  169. cellWidth := 10.0 * 4
  170. cellHeight := 8.0
  171. x := left
  172. y := 140.0
  173. for i := 0; i < len(table); {
  174. pdf.SetXY(x, y)
  175. if i == col {
  176. cellHeight = 13
  177. }
  178. for j := 0; j < col; j++ {
  179. if i < len(table) {
  180. // 循环绘制单元格并输入内容
  181. pdf.CellFormat(cellWidth, cellHeight, table[i], "1", 0, "C", false, 0, "")
  182. }
  183. i++
  184. }
  185. y = y + cellHeight
  186. }
  187. pdf.SetFont("SourceHanSansCN-Light", "", 12)
  188. pdf.Text(100, 170, "实际结算总计(元):")
  189. pdf.Text(160, 170, utils.Float64ToStr(float64(data.BasicIncome+data.OtherIncome)/100))
  190. pdf.Text(210/2-20, 190, "数据确认回执栏")
  191. pdf.Line(left, 193, 180, 194)
  192. pdf.Text(left, 200, "数据确认")
  193. pdf.Text(left, 210, "公司(盖章或手印):")
  194. pdf.Text(left, 220, "授权人代表签字:")
  195. pdf.Text(left, 230, "日期:")
  196. // 保存PDF文件
  197. pdfName := num + ".pdf"
  198. err := pdf.OutputFileAndClose("./static/" + pdfName)
  199. if err != nil {
  200. fmt.Println(err)
  201. return
  202. }
  203. c.Header("Content-Type", "application/octet-stream")
  204. c.Header("Content-Disposition", "attachment; filename="+url.QueryEscape(pdfName))
  205. c.Header("Content-Transfer-Encoding", "binary")
  206. c.File("./static/" + pdfName)
  207. os.Remove("./static/" + pdfName)
  208. file.Close()
  209. err = os.Remove("./static/" + num + ".jpg")
  210. fmt.Println(err)
  211. return
  212. }