浏览代码

dashboard: add outNumber

Yi 1 周之前
父节点
当前提交
02e25545c1

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250701092651-bafe219af705
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250704015606-a7700f1dd25c
 	gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/eclipse/paho.mqtt.golang v1.4.3

+ 6 - 0
go.sum

@@ -46,6 +46,12 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250701061720-f959ee02ca30 h1:qjEGXhJo
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250701061720-f959ee02ca30/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250701092651-bafe219af705 h1:ky5tokV41P4Y/TnSVm/xL1UG7KJg1eM0V8mRA/LSrzU=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250701092651-bafe219af705/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250704014852-db24a1c55a68 h1:u4WFwXS1+Q6IgY3xdemTZPR8cw/D4Ta2WJteRBWRqIg=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250704014852-db24a1c55a68/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250704015326-28c85994e0d4 h1:2yZa/i6a1lu6uZ4z40ziOSR9/zpJnv1f173PfWhpnMI=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250704015326-28c85994e0d4/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250704015606-a7700f1dd25c h1:w4zzRgZmbMhK1blXsviwALgUK4bkjkE9ZXxxpjVK6NE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250704015606-a7700f1dd25c/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0 h1:ZCOqEAnGm6+DTAhACigzWKbwMKtleb8/7OzP2xfHG7g=
 gitee.com/xuyiping_admin/pkg v0.0.0-20250613101634-36c36a2d27d0/go.mod h1:8tF25X6pE9WkFCczlNAC0K2mrjwKvhhp02I7o0HtDxY=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=

+ 10 - 0
http/handler/dashboard/dashboard.go

@@ -124,3 +124,13 @@ func Equipment(c *gin.Context) {
 
 	ginutil.JSONResp(c, res)
 }
+
+func OutNumber(c *gin.Context) {
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.OutNumber(c)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	ginutil.JSONResp(c, res)
+}

+ 1 - 0
http/route/dashboard_api.go

@@ -21,5 +21,6 @@ func DashboardApi(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		dashboardRoute.POST("/data/warning/set", dashboard.DataWarningSet)
 		dashboardRoute.GET("/todo/count", dashboard.TodoCount)
 		dashboardRoute.GET("/equipment/list", dashboard.Equipment)
+		dashboardRoute.GET("/out/number", dashboard.OutNumber)
 	}
 }

+ 18 - 0
model/event_sale.go

@@ -2,6 +2,7 @@ package model
 
 import (
 	"strings"
+	"time"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 )
@@ -120,6 +121,23 @@ func (e EventSaleSlice) ToPB(eventSaleCarMap map[int64][]*EventSaleCar, eventSal
 	return res
 }
 
+func (e EventSaleSlice) ToPB2(monthRang []string) *pasturePb.OutNumber {
+	res := &pasturePb.OutNumber{
+		Month:  monthRang,
+		Number: make([]int32, 0),
+		Name:   "近6个月的出栏量 ",
+	}
+	for i, m := range monthRang {
+		for _, v := range e {
+			month := time.Unix(v.SaleAt, 0).Format(LayoutMonth)
+			if month == m {
+				res.Number[i] += v.SaleCowCount
+			}
+		}
+	}
+	return res
+}
+
 type EventSaleModel struct {
 	CowList          []*Cow
 	SalesType        pasturePb.SalesType_Kind

+ 15 - 8
module/backend/calendar.go

@@ -45,27 +45,34 @@ func (s *StoreEntry) CalendarToDoHistoryList(ctx context.Context, pastureId int6
 		DATE_FORMAT(FROM_UNIXTIME(a.plan_day), '%Y-%m-%d') AS plan_day,
 		IF(a.end_day <= 0, '', DATE_FORMAT(FROM_UNIXTIME(a.end_day), '%Y-%m-%d')) AS end_day,
 		IF(a.reality_day <= 0, '', DATE_FORMAT(FROM_UNIXTIME(a.reality_day), '%Y-%m-%d')) AS reality_day,
-		a.remaining_days,b.lact,b.ear_number,a.status as is_finish,a.remarks
+		a.remaining_days,b.lact,b.ear_number,a.status as is_finish,a.remarks,a.operation_name AS operator_name
 		FROM (
-			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,'免疫' as calendar_type_name,1 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
+			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,operation_name,'免疫' as calendar_type_name,
+				1 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
 			FROM event_immunization_plan WHERE ` + whereSql1 + `
 			  UNION ALL
-			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,'同期' as calendar_type_name,2 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
+			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,operation_name,'同期' as calendar_type_name,
+				2 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
 			FROM event_cow_same_time WHERE ` + whereSql1 + `
 			  UNION ALL
-			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,'孕检' as calendar_type_name,4 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
+			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,operation_name,'孕检' as calendar_type_name,
+				4 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
 			FROM event_pregnant_check WHERE ` + whereSql1 + `
 			  UNION ALL
-			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,'断奶' as calendar_type_name,6 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
+			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,operation_name,'断奶' as calendar_type_name,
+				6 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
 			FROM event_weaning WHERE ` + whereSql1 + `
 			  UNION ALL
-			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,'配种' as calendar_type_name,8 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
+			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,operation_name,'配种' as calendar_type_name,
+				8 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
 			FROM event_mating WHERE ` + whereSql1 + `
 			  UNION ALL
-			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,'产犊' as calendar_type_name,9 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
+			SELECT cow_id,plan_day,end_day,reality_day,status,remarks,operation_name,'产犊' as calendar_type_name,
+				9 as calendar_type_kind,TIMESTAMPDIFF(DAY, NOW(), FROM_UNIXTIME(end_day)) AS remaining_days 
 			FROM event_calving WHERE ` + whereSql1 + `
 			  UNION ALL
-			SELECT cow_id,disease_at as plan_day,curable_at as end_day,curable_at as reality_day,health_status as status,remarks,'疾病' as calendar_type_name,7 as calendar_type_kind,0 AS remaining_days 
+			SELECT cow_id,disease_at as plan_day,curable_at as end_day,curable_at as reality_day,health_status as status,
+				remarks,'' as operation_name,'疾病' as calendar_type_name,7 as calendar_type_kind,0 AS remaining_days
 			FROM event_cow_disease WHERE health_status IN (2,3) AND ` + whereSql + `
 		) as a 
 	JOIN cow b ON a.cow_id = b.id `

+ 38 - 0
module/backend/dashboard_more.go

@@ -299,3 +299,41 @@ func (s *StoreEntry) Equipment(ctx context.Context) (*pasturePb.EquipmentRespons
 		Data: &pasturePb.EquipmentData{EquipmentList: equipmentList},
 	}, nil
 }
+
+func (s *StoreEntry) OutNumber(ctx context.Context) (*pasturePb.OutNumberResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	nowTime := time.Now().Local()
+	currentMonth := nowTime.Format(model.LayoutMonth)
+	startMonth := nowTime.AddDate(0, -5, 0).Format(model.LayoutMonth)
+
+	monthRang, err := util.GetMonthsBetween(startMonth, currentMonth)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	if len(monthRang) != 6 {
+		return nil, xerr.Customf("错误的日期范围")
+	}
+
+	startAt := util.TimeParseLocalUnix(fmt.Sprintf("%s-01", monthRang[0]))
+	endDate, _ := util.GetLastDayOfMonth(monthRang[len(monthRang)-1])
+	endAt := util.TimeParseLocalEndUnix(endDate)
+
+	eventSaleList := make([]*model.EventSale, 0)
+	if err = s.DB.Model(new(model.EventSale)).
+		Select("sale_at, sale_cow_count").
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		Where("sale_at BETWEEN ? AND ?", startAt, endAt).
+		Find(&eventSaleList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	return &pasturePb.OutNumberResponse{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: model.EventSaleSlice(eventSaleList).ToPB2(monthRang),
+	}, nil
+}

+ 1 - 0
module/backend/interface.go

@@ -319,6 +319,7 @@ type DashboardService interface {
 	DataWarningPop(ctx context.Context, req *pasturePb.WarningDataListRequest, pagination *pasturePb.PaginationModel) (*model.WarningDataPopResponse, error)
 	CalendarToDoCount(ctx context.Context) (*pasturePb.TodoCountResponse, error)
 	Equipment(ctx context.Context) (*pasturePb.EquipmentResponse, error)
+	OutNumber(ctx context.Context) (*pasturePb.OutNumberResponse, error)
 }
 
 //go:generate mockgen -destination mock/WorkService.go -package kptservicemock kpt-pasture/module/backend WorkService

+ 6 - 2
util/util_test.go

@@ -557,6 +557,10 @@ func Test_demo(t *testing.T) {
 		fmt.Println("2")
 	}*/
 
-	num := 0.0334345466563453467868989087765434213344544345678
-	fmt.Println(RoundToTwoDecimals(num))
+	nowTime := time.Now().Local()
+	currentMonth := nowTime.Format("2006-01")
+	startMonth := nowTime.AddDate(0, -5, 0).Format("2006-01")
+
+	monthRang, err := GetMonthsBetween(startMonth, currentMonth)
+	fmt.Println(monthRang, err)
 }