package service import ( "context" "encoding/csv" "fmt" "go-template/business/dto" "go-template/business/exception" "go-template/business/model" "go-template/business/util" "io" "gitea.ckfah.com/cjjy/gocommon/pkg/common" "gitea.ckfah.com/cjjy/gocommon/pkg/mq/rocketmq" "gitea.ckfah.com/cjjy/gocommon/pkg/net/engines" "github.com/google/uuid" "gitea.ckfah.com/cjjy/gocommon/pkg/cerror" ) type reportService struct { } func NewReportService() *reportService { return new(reportService) } // 举报详情 func (rs *reportService) ReportInfo(context context.Context, params *dto.ReportInfoParams) (*dto.ReportInfoResult, cerror.Cerror) { reportInfo, err := reportDao.GetById(context, params.Id) if err != nil { return nil, err } if reportInfo == nil { return nil, exception.ReportListError("举报详情为空") } cityInfo, err := cityService.CityInfo(context, &dto.CityInfoParams{ CityId: reportInfo.CityID, }) if err != nil { return nil, err } opInfo, err := factoryService.GetOpWorkerDetailById(context, reportInfo.OpWorkerID) if err != nil { return nil, err } return &dto.ReportInfoResult{Infos: []interface{}{cityInfo, reportInfo, opInfo}}, nil } func (rs *reportService) ReportList(context context.Context, params *dto.ReportListParams) (*dto.ReportListResult, cerror.Cerror) { page := params.GetPaginator() count, err := reportDao.GetCountByUserId(context, params.UserId) if err != nil { return nil, err } if count == 0 { return &dto.ReportListResult{ Items: []model.ReportPeccancy{}, PageResponse: page.GetPageResponse(count), }, nil } result, err := reportDao.GetByUserId(context, params.UserId, page) if err != nil { return nil, err } return &dto.ReportListResult{ Items: result, PageResponse: page.GetPageResponse(count), }, nil } func (rs *reportService) SendMQ(ctx context.Context, params *dto.SendMQParams) (interface{}, cerror.Cerror) { if params.Topic == "" { params.Topic = "test_topic" } if params.Message == "" { params.Message = "hello, go-template" } if err := rocketmq.GetProducer().Send(ctx, params.Topic, []byte(params.Message)); err != nil { return nil, exception.DefaultError(err) } return map[string]string{"result": "发送成功"}, nil } func (rs *reportService) getDownLoadFileHeader(ctx context.Context, column int) []string { header := make([]string, 0, column) for x := 0; x < column; x++ { header = append(header, fmt.Sprintf("header-%d", x)) } return header } func (rs *reportService) getDownLoadResult(ctx context.Context, row, column int) [][]string { generateList := func(length int) []string { list := make([]string, 0, length) for x := 0; x < length; x++ { list = append(list, uuid.New().String()) } return list } list := make([][]string, row) for index := range list { list[index] = generateList(column) } return list } func (rs *reportService) DownLoadXlsxFile(ctx context.Context, writer engines.ResponseWriter, params *dto.DownLoadXlsxFileParams) cerror.Cerror { // 生成数据! list := rs.getDownLoadResult(ctx, params.Row, params.Column) // 生成header header := rs.getDownLoadFileHeader(ctx, params.Column) // 写excel excel := common.NewWriter360Excel() // 写sheet for x := 0; x < params.Sheet; x++ { // 写sheet if err := excel.WriteSheet(fmt.Sprintf("demo数据-%d", x), header, func(r common.Row) (hasNext bool) { if r.RowIndex() > len(list)-1 { // 如果当前写的index 超过了数组的index的最大值 就return false return false } row := list[r.RowIndex()] for _, elem := range row { r.Write(elem) } // 由于row_index是先写后加,所以当你写到最后一个的时候 return true }); err != nil { return exception.DefaultError(err) } } // 先写响应头 util.ResponseFileV2(writer, "输出文件.xlsx") // 后写body,顺序必须是这个 if err := excel.FlushWrite(writer); err != nil { return exception.DefaultError(err) } return nil } func (rs *reportService) DownLoadCsvFile(ctx context.Context, writer engines.ResponseWriter, params *dto.DownLoadCsvFileParams) cerror.Cerror { // 生成数据! list := rs.getDownLoadResult(ctx, params.Row, params.Column) // 生成header header := rs.getDownLoadFileHeader(ctx, params.Column) // 先写响应头 util.ResponseFileV2(writer, "输出文件.csv") // 再写csv (csv只能写一个sheet) csvFile := csv.NewWriter(writer) // 写header if err := csvFile.Write(header); err != nil { return exception.DefaultError(err) } // 写body if err := csvFile.WriteAll(list); err != nil { return exception.DefaultError(err) } // 最后记得flush一下,因为csv使用了buffer的原因 csvFile.Flush() return nil } func (rs *reportService) UploadXlsxFile(ctx context.Context, file io.Reader, params *dto.UploadXlsxFileParams) (*dto.UploadXlsxFileResponse, cerror.Cerror) { excel, err := common.NewReader360Excel(file) if err != nil { return nil, exception.DefaultError(err) } // 读取sheet中的内容,第一行是header content, err := excel.ReadSheet(params.SheetName) if err != nil { return nil, exception.DefaultError(err) } // 为空返回数据 if content == nil || len(content) == 0 { return &dto.UploadXlsxFileResponse{ Header: []string{}, }, nil } // todo 处理业务 // 响应 return &dto.UploadXlsxFileResponse{ Rows: len(content), Columns: len(content[0]), Header: content[0], }, nil }