report_service.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package service
  2. import (
  3. "context"
  4. "encoding/csv"
  5. "fmt"
  6. "go-template/business/dto"
  7. "go-template/business/exception"
  8. "go-template/business/model"
  9. "go-template/business/util"
  10. "io"
  11. "gitea.ckfah.com/cjjy/gocommon/pkg/common"
  12. "gitea.ckfah.com/cjjy/gocommon/pkg/mq/rocketmq"
  13. "gitea.ckfah.com/cjjy/gocommon/pkg/net/engines"
  14. "github.com/google/uuid"
  15. "gitea.ckfah.com/cjjy/gocommon/pkg/cerror"
  16. )
  17. type reportService struct {
  18. }
  19. func NewReportService() *reportService {
  20. return new(reportService)
  21. }
  22. // 举报详情
  23. func (rs *reportService) ReportInfo(context context.Context, params *dto.ReportInfoParams) (*dto.ReportInfoResult, cerror.Cerror) {
  24. reportInfo, err := reportDao.GetById(context, params.Id)
  25. if err != nil {
  26. return nil, err
  27. }
  28. if reportInfo == nil {
  29. return nil, exception.ReportListError("举报详情为空")
  30. }
  31. cityInfo, err := cityService.CityInfo(context, &dto.CityInfoParams{
  32. CityId: reportInfo.CityID,
  33. })
  34. if err != nil {
  35. return nil, err
  36. }
  37. opInfo, err := factoryService.GetOpWorkerDetailById(context, reportInfo.OpWorkerID)
  38. if err != nil {
  39. return nil, err
  40. }
  41. return &dto.ReportInfoResult{Infos: []interface{}{cityInfo, reportInfo, opInfo}}, nil
  42. }
  43. func (rs *reportService) ReportList(context context.Context, params *dto.ReportListParams) (*dto.ReportListResult, cerror.Cerror) {
  44. page := params.GetPaginator()
  45. count, err := reportDao.GetCountByUserId(context, params.UserId)
  46. if err != nil {
  47. return nil, err
  48. }
  49. if count == 0 {
  50. return &dto.ReportListResult{
  51. Items: []model.ReportPeccancy{},
  52. PageResponse: page.GetPageResponse(count),
  53. }, nil
  54. }
  55. result, err := reportDao.GetByUserId(context, params.UserId, page)
  56. if err != nil {
  57. return nil, err
  58. }
  59. return &dto.ReportListResult{
  60. Items: result,
  61. PageResponse: page.GetPageResponse(count),
  62. }, nil
  63. }
  64. func (rs *reportService) SendMQ(ctx context.Context, params *dto.SendMQParams) (interface{}, cerror.Cerror) {
  65. if params.Topic == "" {
  66. params.Topic = "test_topic"
  67. }
  68. if params.Message == "" {
  69. params.Message = "hello, go-template"
  70. }
  71. if err := rocketmq.GetProducer().Send(ctx, params.Topic, []byte(params.Message)); err != nil {
  72. return nil, exception.DefaultError(err)
  73. }
  74. return map[string]string{"result": "发送成功"}, nil
  75. }
  76. func (rs *reportService) getDownLoadFileHeader(ctx context.Context, column int) []string {
  77. header := make([]string, 0, column)
  78. for x := 0; x < column; x++ {
  79. header = append(header, fmt.Sprintf("header-%d", x))
  80. }
  81. return header
  82. }
  83. func (rs *reportService) getDownLoadResult(ctx context.Context, row, column int) [][]string {
  84. generateList := func(length int) []string {
  85. list := make([]string, 0, length)
  86. for x := 0; x < length; x++ {
  87. list = append(list, uuid.New().String())
  88. }
  89. return list
  90. }
  91. list := make([][]string, row)
  92. for index := range list {
  93. list[index] = generateList(column)
  94. }
  95. return list
  96. }
  97. func (rs *reportService) DownLoadXlsxFile(ctx context.Context, writer engines.ResponseWriter, params *dto.DownLoadXlsxFileParams) cerror.Cerror {
  98. // 生成数据!
  99. list := rs.getDownLoadResult(ctx, params.Row, params.Column)
  100. // 生成header
  101. header := rs.getDownLoadFileHeader(ctx, params.Column)
  102. // 写excel
  103. excel := common.NewWriter360Excel()
  104. // 写sheet
  105. for x := 0; x < params.Sheet; x++ {
  106. // 写sheet
  107. if err := excel.WriteSheet(fmt.Sprintf("demo数据-%d", x), header, func(r common.Row) (hasNext bool) {
  108. if r.RowIndex() > len(list)-1 { // 如果当前写的index 超过了数组的index的最大值 就return false
  109. return false
  110. }
  111. row := list[r.RowIndex()]
  112. for _, elem := range row {
  113. r.Write(elem)
  114. }
  115. // 由于row_index是先写后加,所以当你写到最后一个的时候
  116. return true
  117. }); err != nil {
  118. return exception.DefaultError(err)
  119. }
  120. }
  121. // 先写响应头
  122. util.ResponseFileV2(writer, "输出文件.xlsx")
  123. // 后写body,顺序必须是这个
  124. if err := excel.FlushWrite(writer); err != nil {
  125. return exception.DefaultError(err)
  126. }
  127. return nil
  128. }
  129. func (rs *reportService) DownLoadCsvFile(ctx context.Context, writer engines.ResponseWriter, params *dto.DownLoadCsvFileParams) cerror.Cerror {
  130. // 生成数据!
  131. list := rs.getDownLoadResult(ctx, params.Row, params.Column)
  132. // 生成header
  133. header := rs.getDownLoadFileHeader(ctx, params.Column)
  134. // 先写响应头
  135. util.ResponseFileV2(writer, "输出文件.csv")
  136. // 再写csv (csv只能写一个sheet)
  137. csvFile := csv.NewWriter(writer)
  138. // 写header
  139. if err := csvFile.Write(header); err != nil {
  140. return exception.DefaultError(err)
  141. }
  142. // 写body
  143. if err := csvFile.WriteAll(list); err != nil {
  144. return exception.DefaultError(err)
  145. }
  146. // 最后记得flush一下,因为csv使用了buffer的原因
  147. csvFile.Flush()
  148. return nil
  149. }
  150. func (rs *reportService) UploadXlsxFile(ctx context.Context, file io.Reader, params *dto.UploadXlsxFileParams) (*dto.UploadXlsxFileResponse, cerror.Cerror) {
  151. excel, err := common.NewReader360Excel(file)
  152. if err != nil {
  153. return nil, exception.DefaultError(err)
  154. }
  155. // 读取sheet中的内容,第一行是header
  156. content, err := excel.ReadSheet(params.SheetName)
  157. if err != nil {
  158. return nil, exception.DefaultError(err)
  159. }
  160. // 为空返回数据
  161. if content == nil || len(content) == 0 {
  162. return &dto.UploadXlsxFileResponse{
  163. Header: []string{},
  164. }, nil
  165. }
  166. // todo 处理业务
  167. // 响应
  168. return &dto.UploadXlsxFileResponse{
  169. Rows: len(content),
  170. Columns: len(content[0]),
  171. Header: content[0],
  172. }, nil
  173. }