Przeglądaj źródła

excel: 数据导出 && 获取班次

Yi 1 rok temu
rodzic
commit
0bb8d30f45

+ 19 - 0
backend/operation/statistic.proto

@@ -6,6 +6,7 @@ option go_package = ".;operationPb";
 
 import "backend/operation/pagination.proto";
 import "backend/operation/enum.proto";
+import "backend/operation/pasture.proto";
 
 // SearchFormulaEstimateRequest 配方评估
 message SearchFormulaEstimateRequest {
@@ -176,6 +177,24 @@ message ProcessAnalysisRequest {
   PaginationModel pagination = 18;   // 分页
 }
 
+message TrainNumberRequest {
+  string api_name = 1;               // 牧场端接口标识名称
+  int32 pasture_id = 2;              // 牧场id
+  string info_name = 3;
+  PaginationModel pagination = 4;   // 分页
+}
+
+message TrainNumberResponse {
+  int32 code = 1;
+  string msg = 2;
+  TrainNumberData data = 3;
+}
+
+message TrainNumberData {
+  repeated FormulaOptionEnum list = 1;
+}
+
+
 // 首页 dashboard 准确性分析
 message SearchAnalysisAccuracyRequest {
   CattleCategoryParent.Kind cattle_parent_category_id = 1;   // 牧畜分类id 泌乳牛

+ 31 - 0
http/handler/statistic/analysis.go

@@ -435,6 +435,37 @@ func SearchProcessAnalysis(c *gin.Context) {
 	c.JSON(http.StatusOK, res)
 }
 
+// TrainNumber 班次
+func TrainNumber(c *gin.Context) {
+	var req operationPb.TrainNumberRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.ApiName, valid.Required, valid.Length(1, 100)),
+		valid.Field(&req.PastureId, valid.Required),
+		valid.Field(&req.InfoName, valid.Required, valid.Length(1, 30)),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	req.Pagination = &operationPb.PaginationModel{
+		Page:       int32(c.GetInt(middleware.Page)),
+		PageSize:   int32(c.GetInt(middleware.PageSize)),
+		PageOffset: int32(c.GetInt(middleware.PageOffset)),
+	}
+
+	res, err := middleware.BackendOperation(c).OpsService.GetTrainNumber(c, &req)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}
+
 // AnalysisAccuracy 首页仪表盘-准确性分析
 func AnalysisAccuracy(c *gin.Context) {
 	var req operationPb.SearchAnalysisAccuracyRequest

+ 1 - 0
http/route/app_api.go

@@ -117,6 +117,7 @@ func AppAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		opsRoute.POST("/accuracy/mixed_statistics", statistic.SearchMixFeedStatistics)
 		opsRoute.POST("/accuracy/sprinkle_statistics", statistic.SearchSprinkleStatistics)
 		opsRoute.POST("/process/analysis", statistic.SearchProcessAnalysis)
+		opsRoute.POST("/statistics/train_number", statistic.TrainNumber)
 
 		// 首页仪表盘
 		opsRoute.GET("/analysis/accuracy", statistic.AnalysisAccuracy)

+ 12 - 0
model/formula_estimate.go

@@ -193,4 +193,16 @@ type AccuracyAggParams struct {
 	Error     bool   `json:"error,omitempty"`
 }
 
+// TrainNumberParams 班次
+type TrainNumberParams struct {
+	PastureId string `json:"pastureid"`
+	InfoRName string `json:"inforname"`
+}
+
+// TrainNumberList 班次
+type TrainNumberList struct {
+	InfoName  string `json:"inforname"`
+	InfoValue string `json:"inforvalue"`
+}
+
 var DefaultSheetName = "Sheet1"

+ 3 - 0
module/backend/interface.go

@@ -132,17 +132,20 @@ type StatisticService interface {
 	SearchFormulaEstimateList(ctx context.Context, req *operationPb.SearchFormulaEstimateRequest) (*model.PastureCommonResponse, error)
 	SearchInventoryStatistics(ctx context.Context, req *operationPb.SearchInventoryStatisticsRequest) (*model.PastureCommonResponse, error)
 	InventoryStatisticsExcelExport(ctx context.Context, req *operationPb.SearchInventoryStatisticsRequest) (*bytes.Buffer, error)
+
 	SearchUserMaterialsStatistics(ctx context.Context, req *operationPb.SearchUserMaterialsStatisticsRequest) (*model.PastureCommonResponse, error)
 	UserMaterialsStatisticsExcelExport(ctx context.Context, req *operationPb.SearchUserMaterialsStatisticsRequest) (*bytes.Buffer, error)
 	SearchPriceStatistics(ctx context.Context, req *operationPb.SearchPriceStatisticsRequest) (*model.PastureCommonResponse, error)
 	SearchFeedStatistics(ctx context.Context, req *operationPb.SearchFeedStatisticsRequest) (*model.PastureCommonResponse, error)
 	FeedChartStatistics(ctx context.Context, req *operationPb.FeedChartStatisticsRequest) (*model.PastureCommonResponse, error)
 	CowsAnalysis(ctx context.Context, req *operationPb.CowsAnalysisRequest) (*model.PastureCommonResponse, error)
+
 	SearchAccuracyAggStatistics(ctx context.Context, req *operationPb.AccuracyAggStatisticsRequest) (*model.PastureCommonResponse, error)
 	SearchMixFeedStatistics(ctx context.Context, req *operationPb.MixFeedStatisticsRequest) (*model.PastureCommonResponse, error)
 	SearchSprinkleStatistics(ctx context.Context, req *operationPb.SprinkleStatisticsRequest) (*model.PastureCommonResponse, error)
 	SearchProcessAnalysis(ctx context.Context, req *operationPb.ProcessAnalysisRequest) (*model.PastureCommonResponse, error)
 
+	GetTrainNumber(ctx context.Context, req *operationPb.TrainNumberRequest) (*operationPb.TrainNumberResponse, error)
 	SearchAnalysisAccuracy(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.SearchAnalysisAccuracyResponse, error)
 }
 

+ 107 - 41
module/backend/statistic_service.go

@@ -10,6 +10,7 @@ import (
 	"kpt-tmr-group/pkg/xerr"
 	operationPb "kpt-tmr-group/proto/go/backend/operation"
 	"net/http"
+	"sort"
 	"strconv"
 	"strings"
 
@@ -237,60 +238,57 @@ func (s *StoreEntry) UserMaterialsStatisticsExcelExport(ctx context.Context, req
 		return nil, xerr.WithStack(err)
 	}
 
-	// 表头
-	excelValuesList := map[string][]interface{}{}
-	/*"A1": {
-		"饲料名称", "需加料", nil, "Y国产燕麦草55", nil, "自制高产Ⅱ精补料1#", nil, "Y苜蓿M150", nil, "自制酵贮康1#", nil,
-		"Y麸皮^大片", nil, "Y甜菜粕颗粒", nil, "3Y青贮玉米", nil, "围产牛补充预混合饲料1#", nil, "5Y青贮玉米", nil, "Y羊草", nil,
-		"Y国产燕麦草60", nil, "Y苜蓿M170", nil, "Y苜蓿Z130", nil, "1Y青贮玉米", nil, "水", nil, "自制干奶精补料1#", nil,
-		"自制初产精补料1#", nil, "自制高产精补料1#", nil, "自制低产精补料1#", nil, "Y青贮玉米^棒子", nil, "Y压片玉米", nil,
-		"自制围产精补料1#", nil, "自制青年精补料1#", nil, "合计",
-	},*/
+	// 表数据
+	excelValuesList := map[int][]interface{}{}
 
+	cProp := make([]string, 0)
 	for _, data2 := range userMaterialsList.Data2 {
-		excelValuesList["A1"] = append(excelValuesList["A1"], data2.Label)
+		excelValuesList[1] = append(excelValuesList[1], data2.Label)
 		for _, c := range data2.Children {
-			excelValuesList["A2"] = append(excelValuesList["A2"], c.Label)
+			excelValuesList[2] = append(excelValuesList[2], c.Label)
+			cProp = append(cProp, c.Prop)
 		}
 	}
-	for _, data2 := range userMaterialsList.Data2 {
-		for i, data1 := range userMaterialsList.Data1 {
-			index := fmt.Sprintf("A%d", i+3)
-			//value := tool.GetTargetByValueForTag(data1, c.Prop, "json")
-			data1Map, ok := data1.(map[string]interface{})
-			fmt.Println("======excelValuesList======", ok, data1Map, index, data2)
 
-			// excelValuesList[index] = append(excelValuesList[index], data1Map[c.Prop])
-		}
-	}
-	vv, _ := json.Marshal(excelValuesList)
-	fmt.Println("======excelValuesList======", string(vv))
-	/*for cell, values := range excelValuesList {
-		if err = streamWriter.SetRow(cell, values); err != nil {
+	for cell, values := range excelValuesList {
+		if err = streamWriter.SetRow(fmt.Sprintf("A%d", cell), values); err != nil {
 			return nil, xerr.WithStack(err)
 		}
+		delete(excelValuesList, cell)
+	}
+
+	for i, data1 := range userMaterialsList.Data1 {
+		data1Map, ok := data1.(map[string]interface{})
+		if ok {
+			for _, prop := range cProp {
+				newValue := ""
+				if value, yes := data1Map[prop]; yes {
+					if value != nil {
+						switch v := value.(type) {
+						case string:
+							newValue = v
+						case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
+							newValue = fmt.Sprintf("%d", v)
+						default:
+							newValue = fmt.Sprintf("%v", v)
+						}
+					}
+					excelValuesList[i+3] = append(excelValuesList[i+3], newValue)
+				}
+			}
+		}
 	}
 
-	hvCell := map[string]string{
-		"B1": "C1",
-		"D1": "E1",
-		"F1": "G1",
-		"H1": "R1",
-		"J1": "K1",
-		"L1": "M1",
-		"N1": "O1",
-		"P1": "Q1",
-		"R1": "S1",
-		"T1": "U1",
-		"V1": "W1",
-		"Z1": "AA1",
+	excelValuesKeys := make([]int, 0)
+	for k, _ := range excelValuesList {
+		excelValuesKeys = append(excelValuesKeys, k)
 	}
-	// 合并单元格
-	for h, v := range hvCell {
-		if err = streamWriter.MergeCell(h, v); err != nil {
+	sort.Ints(excelValuesKeys)
+	for _, v := range excelValuesKeys {
+		if err = streamWriter.SetRow(fmt.Sprintf("A%d", v), excelValuesList[v]); err != nil {
 			return nil, xerr.WithStack(err)
 		}
-	}*/
+	}
 
 	if err = streamWriter.Flush(); err != nil {
 		return nil, xerr.WithStack(err)
@@ -535,6 +533,74 @@ func (s *StoreEntry) SearchProcessAnalysis(ctx context.Context, req *operationPb
 	return response, nil
 }
 
+// GetTrainNumber 获取班次
+func (s *StoreEntry) GetTrainNumber(ctx context.Context, req *operationPb.TrainNumberRequest) (*operationPb.TrainNumberResponse, error) {
+	body := &model.PastureCommonRequest{
+		Name:       req.ApiName,
+		Page:       req.Pagination.Page,
+		Offset:     req.Pagination.PageOffset,
+		PageCount:  req.Pagination.PageSize,
+		ReturnType: "Map",
+		ParamMaps: &model.TrainNumberParams{
+			PastureId: fmt.Sprintf("%d", req.PastureId),
+			InfoRName: req.InfoName,
+		},
+	}
+	response := &model.PastureCommonResponse{Data: &model.PastureCommonData{}}
+	if err := s.PastureHttpClient(ctx, model.UrlDataByName, int64(req.PastureId), body, response); err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	result := &operationPb.TrainNumberResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &operationPb.TrainNumberData{List: make([]*operationPb.FormulaOptionEnum, 0)},
+	}
+
+	if response.Data.List == nil {
+		return result, nil
+	}
+	b, _ := json.Marshal(response.Data.List)
+	trainNumberList := make([]*model.TrainNumberList, 0)
+	if err := json.Unmarshal(b, &trainNumberList); err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	formulaOption := make([]*operationPb.FormulaOptionEnum, 0)
+	if len(trainNumberList) > 0 {
+		infoValue := trainNumberList[0].InfoValue
+		switch infoValue {
+		case "1":
+			formulaOption = append(formulaOption, &operationPb.FormulaOptionEnum{
+				Value: 1,
+				Label: "第一班",
+			})
+		case "2":
+			formulaOption = append(formulaOption, &operationPb.FormulaOptionEnum{
+				Value: 1,
+				Label: "第一班",
+			}, &operationPb.FormulaOptionEnum{
+				Value: 2,
+				Label: "第二班",
+			})
+		case "3":
+			formulaOption = append(formulaOption, &operationPb.FormulaOptionEnum{
+				Value: 1,
+				Label: "第一班",
+			}, &operationPb.FormulaOptionEnum{
+				Value: 2,
+				Label: "第二班",
+			}, &operationPb.FormulaOptionEnum{
+				Value: 3,
+				Label: "第三班",
+			})
+		}
+	}
+
+	result.Data.List = formulaOption
+	return result, nil
+}
+
 func (s *StoreEntry) SearchAnalysisAccuracy(ctx context.Context, req *operationPb.SearchAnalysisAccuracyRequest) (*model.SearchAnalysisAccuracyResponse, error) {
 
 	dataList := &model.CommonValueRatio{

Plik diff jest za duży
+ 560 - 364
proto/go/backend/operation/statistic.pb.go


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików