Просмотр исходного кода

feature(反馈报修): 添加反馈导出接口、报修导出接口

liuyaqi 3 лет назад
Родитель
Сommit
cb0e0dd8ea
5 измененных файлов с 378 добавлено и 0 удалено
  1. 24 0
      handler/feedback/feedback.go
  2. 24 0
      handler/repair/repair.go
  3. 119 0
      service/feedback/feedback.go
  4. 119 0
      service/repair/repair.go
  5. 92 0
      swaggerui/swagger.yml

+ 24 - 0
handler/feedback/feedback.go

@@ -2,6 +2,7 @@ package feedback
 
 import (
 	"context"
+	"encoding/base64"
 	"lims_adapter/model"
 	"lims_adapter/model/feedback"
 	feedbackSrv "lims_adapter/service/feedback"
@@ -135,3 +136,26 @@ func (c *Feedback) Processor(ctx context.Context, req *model.EmptyArgs, rsp *com
 	rsp.Data = ent
 	return nil
 }
+
+func (c *Feedback) Export(ctx context.Context, req *feedback.FeedbackListReq, rsp *comm_def.CommonMsg) error {
+	g.Log().Infof("Feedback.Export request %#v ", *req)
+	s, err := feedbackSrv.NewFeedbackService(ctx)
+	if err != nil {
+		return err
+	}
+	f, err := s.Export(ctx, req)
+	_, err, code, msg := myerrors.CheckError(err)
+	if code != 200 {
+		rsp.Code = code
+		rsp.Msg = msg
+		return err
+	}
+
+	buf, err := f.WriteToBuffer()
+	if err != nil {
+		return err
+	}
+	rsp.Code = 200
+	rsp.Data = base64.StdEncoding.EncodeToString(buf.Bytes())
+	return nil
+}

+ 24 - 0
handler/repair/repair.go

@@ -2,6 +2,7 @@ package repair
 
 import (
 	"context"
+	"encoding/base64"
 	"lims_adapter/model"
 	"lims_adapter/model/repair"
 	repairSrv "lims_adapter/service/repair"
@@ -135,3 +136,26 @@ func (c *Repair) Processor(ctx context.Context, req *model.EmptyArgs, rsp *comm_
 	rsp.Data = ent
 	return nil
 }
+
+func (c *Repair) Export(ctx context.Context, req *repair.RepairListReq, rsp *comm_def.CommonMsg) error {
+	g.Log().Infof("Feedback.Export request %#v ", *req)
+	s, err := repairSrv.NewRepairService(ctx)
+	if err != nil {
+		return err
+	}
+	f, err := s.Export(ctx, req)
+	_, err, code, msg := myerrors.CheckError(err)
+	if code != 200 {
+		rsp.Code = code
+		rsp.Msg = msg
+		return err
+	}
+
+	buf, err := f.WriteToBuffer()
+	if err != nil {
+		return err
+	}
+	rsp.Code = 200
+	rsp.Data = base64.StdEncoding.EncodeToString(buf.Bytes())
+	return nil
+}

+ 119 - 0
service/feedback/feedback.go

@@ -6,13 +6,16 @@ import (
 	"fmt"
 	dao "lims_adapter/dao/feedback"
 	"lims_adapter/model/feedback"
+	"strconv"
 
+	"dashoo.cn/common_definition/admin/dict_def"
 	"dashoo.cn/common_definition/admin/permission_def"
 	"dashoo.cn/micro_libary/micro_srv"
 	"dashoo.cn/micro_libary/myerrors"
 	"dashoo.cn/micro_libary/request"
 	"github.com/gogf/gf/os/gtime"
 	"github.com/gogf/gf/util/gvalid"
+	"github.com/xuri/excelize/v2"
 )
 
 const PermissionFeedbackProcess = "feedback:process"
@@ -344,6 +347,122 @@ func (s FeedbackService) Processor(ctx context.Context) ([]feedback.FeedbackProc
 	return rsp, err
 }
 
+func (s FeedbackService) Export(ctx context.Context, req *feedback.FeedbackListReq) (*excelize.File, error) {
+	_, data, err := s.List(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+
+	dictService := micro_srv.InitMicroSrvClient("Dict", "micro_srv.admin")
+	defer dictService.Close()
+	rsp := &dict_def.DictDataResp{}
+	err = dictService.Call(context.TODO(), "GetDictDataByType", &dict_def.DictReq{
+		Tenant:   s.Tenant,
+		DictCode: "OpinionsContent",
+	}, rsp)
+	if err != nil {
+		return nil, fmt.Errorf("获取反馈类型失败 %s", err.Error())
+	}
+
+	typeMap := map[string]string{}
+	for _, i := range rsp.List {
+		typeMap[i.Key] = i.Value
+	}
+	statusMap := map[int]string{
+		1: "未处理",
+		2: "已处理",
+	}
+
+	f := excelize.NewFile()
+	sheet := "Sheet1"
+	header := []string{
+		"反馈人姓名", "反馈时间", "反馈类型", "反馈内容", "处理状态", "处理人", "处理时间",
+	}
+	colWidth := []float64{
+		12, 20, 12, 40, 12, 12, 20,
+	}
+
+	colStyle, err := f.NewStyle(&excelize.Style{
+		Alignment: &excelize.Alignment{
+			Horizontal: "center",
+			Vertical:   "center",
+			WrapText:   true,
+		},
+		Font: &excelize.Font{
+			Size:   11,
+			Family: "宋体",
+		},
+	})
+	if err != nil {
+		return nil, err
+	}
+	headerStyle, err := f.NewStyle(&excelize.Style{
+		Alignment: &excelize.Alignment{
+			Horizontal: "center",
+		},
+		Fill: excelize.Fill{
+			Type:    "pattern",
+			Color:   []string{"#a6a6a6"},
+			Pattern: 1,
+		},
+		Border: []excelize.Border{
+			{Type: "left", Color: "#000000", Style: 1},
+			{Type: "top", Color: "#000000", Style: 1},
+			{Type: "bottom", Color: "#000000", Style: 1},
+			{Type: "right", Color: "#000000", Style: 1},
+		},
+	})
+	if err != nil {
+		return nil, err
+	}
+
+	lastcol, err := excelize.ColumnNumberToName(len(header))
+	if err != nil {
+		return nil, err
+	}
+	err = f.SetColStyle(sheet, "A:"+lastcol, colStyle)
+	if err != nil {
+		return nil, err
+	}
+	err = f.SetCellStyle(sheet, "A1", lastcol+"1", headerStyle)
+	if err != nil {
+		return nil, err
+	}
+	for i := range header {
+		n, err := excelize.ColumnNumberToName(i + 1)
+		if err != nil {
+			return nil, err
+		}
+		f.SetCellValue(sheet, n+"1", header[i])
+	}
+
+	for i, w := range colWidth {
+		n, err := excelize.ColumnNumberToName(i + 1)
+		if err != nil {
+			return nil, err
+		}
+		err = f.SetColWidth(sheet, n, n, w)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	for row, item := range data {
+		rowName := strconv.Itoa(row + 2)
+		f.SetCellValue(sheet, "A"+rowName, item.CreatedByName)
+		f.SetCellValue(sheet, "B"+rowName, item.CreatedAt)
+		f.SetCellValue(sheet, "C"+rowName, typeMap[item.Type])
+		f.SetCellValue(sheet, "D"+rowName, item.Content)
+		f.SetCellValue(sheet, "E"+rowName, statusMap[item.Status])
+		f.SetCellValue(sheet, "F"+rowName, item.CurrentProcessorName)
+		f.SetCellValue(sheet, "G"+rowName, item.ProcessedAt)
+	}
+
+	index := f.NewSheet(sheet)
+	f.SetActiveSheet(index)
+	return f, nil
+}
+
 func Allow(tenant, uuid, permission string) (bool, error) {
 	permissionSrv := micro_srv.InitMicroSrvClient("Permission", "micro_srv.admin")
 	defer permissionSrv.Close()

+ 119 - 0
service/repair/repair.go

@@ -6,13 +6,16 @@ import (
 	"fmt"
 	dao "lims_adapter/dao/repair"
 	"lims_adapter/model/repair"
+	"strconv"
 
+	"dashoo.cn/common_definition/admin/dict_def"
 	"dashoo.cn/common_definition/admin/permission_def"
 	"dashoo.cn/micro_libary/micro_srv"
 	"dashoo.cn/micro_libary/myerrors"
 	"dashoo.cn/micro_libary/request"
 	"github.com/gogf/gf/os/gtime"
 	"github.com/gogf/gf/util/gvalid"
+	"github.com/xuri/excelize/v2"
 )
 
 const PermissionRepairProcess = "repair:process"
@@ -344,6 +347,122 @@ func (s RepairService) Processor(ctx context.Context) ([]repair.RepairProcessorR
 	return rsp, err
 }
 
+func (s RepairService) Export(ctx context.Context, req *repair.RepairListReq) (*excelize.File, error) {
+	_, data, err := s.List(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+
+	dictService := micro_srv.InitMicroSrvClient("Dict", "micro_srv.admin")
+	defer dictService.Close()
+	rsp := &dict_def.DictDataResp{}
+	err = dictService.Call(context.TODO(), "GetDictDataByType", &dict_def.DictReq{
+		Tenant:   s.Tenant,
+		DictCode: "RepairType",
+	}, rsp)
+	if err != nil {
+		return nil, fmt.Errorf("获取报修类型失败 %s", err.Error())
+	}
+
+	typeMap := map[string]string{}
+	for _, i := range rsp.List {
+		typeMap[i.Key] = i.Value
+	}
+	statusMap := map[int]string{
+		1: "未处理",
+		2: "已处理",
+	}
+
+	f := excelize.NewFile()
+	sheet := "Sheet1"
+	header := []string{
+		"报修人姓名", "报修类型", "报修时间", "故障描述", "处理状态", "处理人", "处理时间",
+	}
+	colWidth := []float64{
+		12, 12, 20, 40, 12, 12, 20,
+	}
+
+	colStyle, err := f.NewStyle(&excelize.Style{
+		Alignment: &excelize.Alignment{
+			Horizontal: "center",
+			Vertical:   "center",
+			WrapText:   true,
+		},
+		Font: &excelize.Font{
+			Size:   11,
+			Family: "宋体",
+		},
+	})
+	if err != nil {
+		return nil, err
+	}
+	headerStyle, err := f.NewStyle(&excelize.Style{
+		Alignment: &excelize.Alignment{
+			Horizontal: "center",
+		},
+		Fill: excelize.Fill{
+			Type:    "pattern",
+			Color:   []string{"#a6a6a6"},
+			Pattern: 1,
+		},
+		Border: []excelize.Border{
+			{Type: "left", Color: "#000000", Style: 1},
+			{Type: "top", Color: "#000000", Style: 1},
+			{Type: "bottom", Color: "#000000", Style: 1},
+			{Type: "right", Color: "#000000", Style: 1},
+		},
+	})
+	if err != nil {
+		return nil, err
+	}
+
+	lastcol, err := excelize.ColumnNumberToName(len(header))
+	if err != nil {
+		return nil, err
+	}
+	err = f.SetColStyle(sheet, "A:"+lastcol, colStyle)
+	if err != nil {
+		return nil, err
+	}
+	err = f.SetCellStyle(sheet, "A1", lastcol+"1", headerStyle)
+	if err != nil {
+		return nil, err
+	}
+	for i := range header {
+		n, err := excelize.ColumnNumberToName(i + 1)
+		if err != nil {
+			return nil, err
+		}
+		f.SetCellValue(sheet, n+"1", header[i])
+	}
+
+	for i, w := range colWidth {
+		n, err := excelize.ColumnNumberToName(i + 1)
+		if err != nil {
+			return nil, err
+		}
+		err = f.SetColWidth(sheet, n, n, w)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	for row, item := range data {
+		rowName := strconv.Itoa(row + 2)
+		f.SetCellValue(sheet, "A"+rowName, item.CreatedByName)
+		f.SetCellValue(sheet, "B"+rowName, typeMap[item.Type])
+		f.SetCellValue(sheet, "C"+rowName, item.CreatedAt)
+		f.SetCellValue(sheet, "D"+rowName, item.Content)
+		f.SetCellValue(sheet, "E"+rowName, statusMap[item.Status])
+		f.SetCellValue(sheet, "F"+rowName, item.CurrentProcessorName)
+		f.SetCellValue(sheet, "G"+rowName, item.ProcessedAt)
+	}
+
+	index := f.NewSheet(sheet)
+	f.SetActiveSheet(index)
+	return f, nil
+}
+
 func Allow(tenant, uuid, permission string) (bool, error) {
 	permissionSrv := micro_srv.InitMicroSrvClient("Permission", "micro_srv.admin")
 	defer permissionSrv.Close()

+ 92 - 0
swaggerui/swagger.yml

@@ -980,6 +980,31 @@ paths:
                   success:
                     $ref: "#/components/examples/success"
 
+    /Feedback.Export:
+      post:
+        tags:
+          - 反馈
+        operationId: FeedbackExport
+        summary: 导出反馈
+        requestBody:
+          required: true
+          content:
+            application/json:
+              schema:
+                oneOf:
+                  - $ref: '#/components/schemas/FeedbackExport'
+              examples:
+                FeedbackExport:
+                  $ref: '#/components/examples/FeedbackExport'
+        responses:
+          200:
+            description: 请求成功
+            content:
+              application/json:
+                examples:
+                  success:
+                    $ref: "#/components/examples/success"
+
     /Feedback.Processor:
       post:
         tags:
@@ -1155,6 +1180,31 @@ paths:
                   success:
                     $ref: "#/components/examples/success"
 
+    /Repair.Export:
+      post:
+        tags:
+          - 反馈
+        operationId: RepairExport
+        summary: 导出反馈
+        requestBody:
+          required: true
+          content:
+            application/json:
+              schema:
+                oneOf:
+                  - $ref: '#/components/schemas/RepairExport'
+              examples:
+                RepairExport:
+                  $ref: '#/components/examples/RepairExport'
+        responses:
+          200:
+            description: 请求成功
+            content:
+              application/json:
+                examples:
+                  success:
+                    $ref: "#/components/examples/success"
+
     /Repair.Processor:
       post:
         tags:
@@ -1920,6 +1970,24 @@ components:
         note:
           type: string
           description: 描述
+    FeedbackExport:
+      type: object
+      properties:
+        type:
+          type: string
+          description: 反馈类型
+        status:
+          type: integer
+          description: 反馈状态 1 未处理 2 已处理
+        createdByName:
+          type: string
+          description: 创建者用户名
+        createdAtStart:
+          type: string
+          description: 创建时间
+        createdAtEnd:
+          type: string
+          description: 创建时间
     RepairList:
       type: object
       properties:
@@ -2012,6 +2080,24 @@ components:
         note:
           type: string
           description: 描述
+    RepairExport:
+      type: object
+      properties:
+        type:
+          type: string
+          description: 报修类型
+        status:
+          type: integer
+          description: 处理状态 1 未处理 2 已处理
+        createdByName:
+          type: string
+          description: 创建者用户名
+        createdAtStart:
+          type: string
+          description: 创建时间
+        createdAtEnd:
+          type: string
+          description: 创建时间
 
   examples:
     success:
@@ -2247,6 +2333,9 @@ components:
       value:
         id: 2
         note: 测试重新激活
+    FeedbackExport:
+      value:
+        createdAtStart: "2022-04-29 11:00:00"
     RepairList:
       value:
         createdAtStart: "2022-04-29 11:00:00"
@@ -2273,3 +2362,6 @@ components:
       value:
         id: 2
         note: 测试重新激活
+    RepairExport:
+      value:
+        createdAtStart: "2022-04-29 11:00:00"