Browse Source

system: userDepth update

Yi 6 days ago
parent
commit
ea657d4190

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20250526094651-0cef600addd0
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20250530090709-1e32a1ade71d
 	gitee.com/xuyiping_admin/pkg v0.0.0-20250514071642-f92d2ac9a85d
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/eclipse/paho.mqtt.golang v1.4.3

+ 6 - 0
go.sum

@@ -127,6 +127,12 @@ gitee.com/xuyiping_admin/go_proto v0.0.0-20250526091836-9e663a273679 h1:Ulh1ArxG
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250526091836-9e663a273679/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250526094651-0cef600addd0 h1:nGmhS9BKCMgCz9zEVmygDIPNrolI9lb9uLV6NfoTxWE=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20250526094651-0cef600addd0/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250530040106-85ff23fe88f6 h1:UjId/C6diIwgYo/gh5cqVNpa9TSYyAsi1H/zlMqy/vs=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250530040106-85ff23fe88f6/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250530051007-6ce1b83221af h1:3SBlTKUWyBz4l86klizGDt/xda/7j9PGsRiUyZb+yX8=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250530051007-6ce1b83221af/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250530090709-1e32a1ade71d h1:upETgWdn+raGyxXdP1S70Z4gMuGZep9RjcLsWLIWeF0=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20250530090709-1e32a1ade71d/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b h1:w05MxH7yqveRlaRbxHhbif5YjPrJFodRPfOjYhXn7Zk=
 gitee.com/xuyiping_admin/pkg v0.0.0-20241108060137-caea58c59f5b/go.mod h1:8tF25X6pE9WkFCczlNAC0K2mrjwKvhhp02I7o0HtDxY=
 gitee.com/xuyiping_admin/pkg v0.0.0-20250514071642-f92d2ac9a85d h1:vBXmMRggF7mZVPGRDgavZ87igJgkezwX0a3v1/XtIMQ=

+ 3 - 4
http/handler/config/config.go

@@ -117,13 +117,12 @@ func CowTransferPenReasonOptions(c *gin.Context) {
 }
 
 func SystemUserOptions(c *gin.Context) {
-	depIdStr := c.Query("dept_id")
-	depId, _ := strconv.Atoi(depIdStr)
-	if err := valid.Validate(depId, valid.Required, valid.Min(-1)); err != nil {
+	depName := c.Query("dept_name")
+	if err := valid.Validate(depName, valid.Required); err != nil {
 		apierr.ClassifiedAbort(c, err)
 		return
 	}
-	res, err := middleware.Dependency(c).StoreEventHub.OpsService.SystemUserOptions(c, depId)
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.SystemUserOptions(c, depName)
 	if err != nil {
 		apierr.ClassifiedAbort(c, err)
 		return

+ 0 - 30
http/handler/system/menu.go

@@ -14,36 +14,6 @@ import (
 	"github.com/gin-gonic/gin"
 )
 
-// CreatedOrUpdateSystemMenu 添加或者更新系统菜单权限
-func CreatedOrUpdateSystemMenu(c *gin.Context) {
-	var req pasturePb.SearchMenuRequest
-	if err := ginutil.BindProto(c, &req); err != nil {
-		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-		return
-	}
-
-	if err := valid.ValidateStruct(&req,
-		valid.Field(&req.Name, valid.Required),
-		valid.Field(&req.Title, valid.Required),
-		valid.Field(&req.MenuType, valid.Required, valid.Min(0), valid.Max(2)),
-		valid.Field(&req.Path, valid.Required),
-	); err != nil {
-		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
-		return
-	}
-
-	if err := middleware.BackendOperation(c).OpsService.CreateOrUpdateSystemMenu(c, &req); err != nil {
-		apierr.ClassifiedAbort(c, err)
-		return
-	}
-
-	ginutil.JSONResp(c, &operationPb.CommonOK{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &operationPb.Success{Success: true},
-	})
-}
-
 // SearchSystemMenuList 菜单列表查询
 func SearchSystemMenuList(c *gin.Context) {
 	var req pasturePb.SearchMenuRequest

+ 1 - 1
http/handler/system/user.go

@@ -48,7 +48,7 @@ func UserCreateOrUpdate(c *gin.Context) {
 
 	if err := valid.ValidateStruct(&req,
 		valid.Field(&req.Name, valid.Required),
-		valid.Field(&req.DepthList, valid.Required),
+		valid.Field(&req.PastureDepthList, valid.Required),
 		valid.Field(&req.Mobile, valid.Required),
 		valid.Field(&req.Password, valid.Required),
 	); err != nil {

+ 1 - 3
http/route/system_api.go

@@ -37,13 +37,11 @@ func SystemAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		systemRoute.POST("/role/createOrUpdate", system.RoleCreateOrUpdate)
 		systemRoute.GET("/role/menu/:id", system.GetRoleMenu)
 		systemRoute.POST("/role/menu/save", system.RoleMenuSave)
-		//systemRoute.GET("/role/list", system.GetRoleList)
 
 		// 系统菜单权限
 		systemRoute.POST("/menu/list", system.SearchSystemMenuList)
-		systemRoute.DELETE("/menu/:id", system.DeleteSystemMenu)
-		systemRoute.POST("/menu/createOrUpdate", system.CreatedOrUpdateSystemMenu)
 		systemRoute.GET("/menu/tree", system.GetSystemMenuTree)
+		//systemRoute.DELETE("/menu/:id", system.DeleteSystemMenu)
 
 		// 系统部门
 		systemRoute.POST("/dept/list", system.DeptList)

+ 1 - 0
model/indicators_data.go

@@ -14,6 +14,7 @@ const (
 	OutputNumber                     = "output_number"        // 出栏量(销售)
 	InputNumber                      = "input_number"         // 入栏量(购入)
 	SalesVolume                      = "sales_volume"         // 销售额
+	FattenCattleNumber               = "fatten_cattle_number" // 育肥牛头数
 	CalvingNumber                    = "calving_number"       // 产犊事件总数
 	AdultAbortionRate                = "adult_abortion_rate"  //成母牛流产率(全)
 	YouthAbortionRate                = "youth_abortion_rate"  //青年年流产率(全)

+ 3 - 2
model/neck_ring.go

@@ -104,7 +104,8 @@ type NeckRingModel struct {
 }
 
 type NeckRingStats struct {
+	Status      pasturePb.IsShow_Kind
 	ErrorKind   pasturePb.NeckRingNumberError_Kind
-	ErrorReason string `json:"error_reason"`
-	Describe    string `json:"describe"`
+	ErrorReason string
+	Describe    string
 }

+ 50 - 6
model/system_dept.go

@@ -6,6 +6,11 @@ import (
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 )
 
+const (
+	BreedDepthName = "繁育部"
+	VetDepthName   = "兽医部"
+)
+
 type SystemDept struct {
 	Id        int64                 `json:"id"`
 	PastureId int64                 `json:"pastureId"`
@@ -17,6 +22,7 @@ type SystemDept struct {
 	Sort      int32                 `json:"sort"`
 	IsShow    pasturePb.IsShow_Kind `json:"isShow"`
 	IsDelete  pasturePb.IsShow_Kind `json:"isDelete"`
+	IsInit    pasturePb.IsShow_Kind `json:"isInit"`
 	CreatedAt int64                 `json:"createdAt"`
 	UpdatedAt int64                 `json:"updatedAt"`
 }
@@ -25,21 +31,30 @@ func (s *SystemDept) TableName() string {
 	return "system_dept"
 }
 
-func NewSystemDept(req *pasturePb.SearchDeptRequest) *SystemDept {
+func (s *SystemDept) DepthUpdate(req *pasturePb.SearchDeptRequest) {
+	s.Name = req.Name
+	s.ParentId = int64(req.ParentId)
+	s.Sort = req.Sort
+	s.Remarks = req.Remarks
+	s.IsShow = req.IsShow
+	s.IsDelete = req.IsDelete
+}
+
+func NewSystemDept(pastureId int64, req *pasturePb.SearchDeptRequest) *SystemDept {
 	return &SystemDept{
-		PastureId: int64(req.PastureId),
+		PastureId: pastureId,
 		Name:      req.Name,
 		Remarks:   req.Remarks,
 		DeptType:  pasturePb.Depth_Company,
 		LeaderId:  int64(req.LeaderId),
 		ParentId:  int64(req.ParentId),
-
-		IsShow:   pasturePb.IsShow_Ok,
-		IsDelete: pasturePb.IsShow_Ok,
+		IsShow:    pasturePb.IsShow_Ok,
+		IsDelete:  pasturePb.IsShow_Ok,
+		IsInit:    pasturePb.IsShow_No,
 	}
 }
 
-func NewSystemDeptInit(pasture *AppPastureList) *SystemDept {
+func NewSystemPastureDeptInit(pasture *AppPastureList) *SystemDept {
 	return &SystemDept{
 		PastureId: pasture.Id,
 		Name:      pasture.Name,
@@ -50,9 +65,38 @@ func NewSystemDeptInit(pasture *AppPastureList) *SystemDept {
 		Sort:      0,
 		IsShow:    pasturePb.IsShow_Ok,
 		IsDelete:  pasturePb.IsShow_Ok,
+		IsInit:    pasturePb.IsShow_Ok,
 	}
 }
 
+func NewSystemDeptInit(pastureId, parentId int64) []*SystemDept {
+	res := make([]*SystemDept, 0)
+	res = append(res, &SystemDept{
+		PastureId: pastureId,
+		Name:      BreedDepthName,
+		Remarks:   BreedDepthName,
+		DeptType:  pasturePb.Depth_Department,
+		LeaderId:  0,
+		ParentId:  parentId,
+		Sort:      1,
+		IsShow:    pasturePb.IsShow_Ok,
+		IsDelete:  pasturePb.IsShow_Ok,
+		IsInit:    pasturePb.IsShow_Ok,
+	}, &SystemDept{
+		PastureId: pastureId,
+		Name:      VetDepthName,
+		Remarks:   VetDepthName,
+		DeptType:  pasturePb.Depth_Department,
+		LeaderId:  0,
+		ParentId:  parentId,
+		Sort:      2,
+		IsShow:    pasturePb.IsShow_Ok,
+		IsDelete:  pasturePb.IsShow_Ok,
+		IsInit:    pasturePb.IsShow_Ok,
+	})
+	return res
+}
+
 type SystemDeptSlice []*SystemDept
 
 func (s SystemDeptSlice) ToPB(systemUserList []*SystemUser) []*pasturePb.SearchDeptRequest {

+ 63 - 26
model/system_menu.go

@@ -5,12 +5,11 @@ import (
 	"time"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
-
-	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 )
 
 type SystemMenu struct {
 	Id              int64                   `json:"id"`
+	PastureId       int64                   `json:"pastureId"`
 	Name            string                  `json:"name"`
 	Title           string                  `json:"title"`
 	Path            string                  `json:"path"`
@@ -18,39 +17,77 @@ type SystemMenu struct {
 	Component       string                  `json:"component"`
 	Redirect        string                  `json:"redirect"`
 	Auths           string                  `json:"auths"`
-	MenuType        pasturePb.MenuType_Kind `json:"menu_type"`
-	ParentId        int64                   `json:"parent_id"`
+	MenuType        pasturePb.MenuType_Kind `json:"menuType"`
+	ParentId        int64                   `json:"parentId"`
 	Rank            int32                   `json:"rank"`
-	ExtraIcon       string                  `json:"extra_icon"`
-	EnterTransition string                  `json:"enter_transition"`
-	ActivePath      string                  `json:"active_path"`
-	FrameSrc        string                  `json:"frame_src"`
-	FrameLoading    pasturePb.IsShow_Kind   `json:"frame_loading"`
+	ExtraIcon       string                  `json:"extraIcon"`
+	EnterTransition string                  `json:"enterTransition"`
+	ActivePath      string                  `json:"activePath"`
+	FrameSrc        string                  `json:"frameSrc"`
+	FrameLoading    pasturePb.IsShow_Kind   `json:"frameLoading"`
 	Keepalive       pasturePb.IsShow_Kind   `json:"keepalive"`
-	HiddenTag       pasturePb.IsShow_Kind   `json:"hidden_tag"`
-	ShowLink        pasturePb.IsShow_Kind   `json:"show_link"`
-	ShowParent      pasturePb.IsShow_Kind   `json:"show_parent"`
-	IsShow          pasturePb.IsShow_Kind   `json:"is_show"`
-	IsDelete        pasturePb.IsShow_Kind   `json:"is_delete"`
-	CreatedAt       int64                   `json:"created_at"`
-	UpdatedAt       int64                   `json:"updated_at"`
+	HiddenTag       pasturePb.IsShow_Kind   `json:"hiddenTag"`
+	ShowLink        pasturePb.IsShow_Kind   `json:"showLink"`
+	ShowParent      pasturePb.IsShow_Kind   `json:"showParent"`
+	IsShow          pasturePb.IsShow_Kind   `json:"isShow"`
+	IsDelete        pasturePb.IsShow_Kind   `json:"isDelete"`
+	CreatedAt       int64                   `json:"createdAt"`
+	UpdatedAt       int64                   `json:"updatedAt"`
 }
 
 func (s *SystemMenu) TableName() string {
 	return "system_menu"
 }
 
-func NewSystemMenu(req *operationPb.AddMenuRequest) *SystemMenu {
+func (s *SystemMenu) MenuUpdate(req *pasturePb.SearchMenuRequest) {
+	s.Name = req.Name
+	s.Path = req.Path
+	s.MenuType = req.MenuType
+	s.Title = req.Title
+	s.ParentId = int64(req.ParentId)
+	s.FrameSrc = req.FrameSrc
+	s.FrameLoading = BooleanToIsShow(req.FrameLoading)
+	s.Keepalive = BooleanToIsShow(req.Keepalive)
+	s.HiddenTag = BooleanToIsShow(req.HiddenTag)
+	s.ShowLink = BooleanToIsShow(req.ShowLink)
+	s.ShowParent = BooleanToIsShow(req.ShowParent)
+	s.Icon = req.Icon
+	s.Component = req.Component
+	s.Redirect = req.Redirect
+	s.Auths = req.Auths
+	s.Rank = req.Rank
+	s.ExtraIcon = req.ExtraIcon
+	s.EnterTransition = req.EnterTransition
+	s.ActivePath = req.ActivePath
+	s.IsShow = req.IsShow
+	s.IsDelete = req.IsDelete
+}
+
+// NewSystemMenu AddMenuRequest
+func NewSystemMenu(pastureId int64, req *pasturePb.SearchMenuRequest) *SystemMenu {
 	return &SystemMenu{
-		Name:      req.Name,
-		Title:     req.Title,
-		Path:      req.Path,
-		Component: req.Component,
-		Icon:      req.Icon,
-		Redirect:  req.Redirect,
-		ParentId:  int64(req.ParentId),
-		IsShow:    pasturePb.IsShow_Ok,
-		IsDelete:  pasturePb.IsShow_Ok,
+		PastureId:       pastureId,
+		Name:            req.Name,
+		Title:           req.Title,
+		Path:            req.Path,
+		Icon:            req.Icon,
+		Component:       req.Component,
+		Redirect:        req.Redirect,
+		Auths:           req.Auths,
+		MenuType:        req.MenuType,
+		ParentId:        int64(req.ParentId),
+		Rank:            req.Rank,
+		ExtraIcon:       req.ExtraIcon,
+		EnterTransition: req.EnterTransition,
+		ActivePath:      req.ActivePath,
+		FrameSrc:        req.FrameSrc,
+		FrameLoading:    BooleanToIsShow(req.FrameLoading),
+		Keepalive:       BooleanToIsShow(req.Keepalive),
+		HiddenTag:       BooleanToIsShow(req.HiddenTag),
+		ShowLink:        BooleanToIsShow(req.ShowLink),
+		ShowParent:      BooleanToIsShow(req.ShowParent),
+		IsShow:          pasturePb.IsShow_Ok,
+		IsDelete:        pasturePb.IsShow_Ok,
 	}
 }
 

+ 32 - 14
model/system_role.go

@@ -6,20 +6,6 @@ import (
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 )
 
-type SystemRole struct {
-	Id        int64                 `json:"id,omitempty"`
-	Name      string                `json:"name,omitempty"`
-	Remarks   string                `json:"remarks,omitempty"`
-	IsShow    pasturePb.IsShow_Kind `json:"is_show,omitempty"`
-	IsDelete  pasturePb.IsShow_Kind `json:"is_delete,omitempty"`
-	CreatedAt int64                 `json:"created_at,omitempty"`
-	UpdatedAt int64                 `json:"updated_at,omitempty"`
-}
-
-func (s *SystemRole) TableName() string {
-	return "system_role"
-}
-
 const (
 	LayoutTime   = "2006-01-02 15:04:05"
 	LayoutDate   = "20060102"
@@ -31,6 +17,38 @@ const (
 	LayoutTime2  = "2006/1/2 15:04:05"
 )
 
+type SystemRole struct {
+	Id        int64                 `json:"id"`
+	PastureId int64                 `json:"pastureId"`
+	Name      string                `json:"name"`
+	Remarks   string                `json:"remarks"`
+	IsShow    pasturePb.IsShow_Kind `json:"isShow"`
+	IsDelete  pasturePb.IsShow_Kind `json:"isDelete"`
+	CreatedAt int64                 `json:"createdAt"`
+	UpdatedAt int64                 `json:"updatedAt"`
+}
+
+func (s *SystemRole) TableName() string {
+	return "system_role"
+}
+
+func (s *SystemRole) RoleUpdate(req *pasturePb.SearchRoleRequest) {
+	s.Name = req.Name
+	s.Remarks = req.Remarks
+	s.IsShow = req.IsShow
+	s.IsDelete = req.IsDelete
+}
+
+func NewSystemRole(pastureId int64, req *pasturePb.SearchRoleRequest) *SystemRole {
+	return &SystemRole{
+		PastureId: pastureId,
+		Name:      req.Name,
+		Remarks:   req.Remarks,
+		IsShow:    pasturePb.IsShow_Ok,
+		IsDelete:  pasturePb.IsShow_Ok,
+	}
+}
+
 type SystemRoleSlice []*SystemRole
 
 func (s SystemRoleSlice) ToPB() []*pasturePb.SearchRoleRequest {

+ 93 - 76
model/system_user.go

@@ -1,31 +1,31 @@
 package model
 
 import (
+	"encoding/json"
 	"fmt"
-	"net/http"
 	"strconv"
 	"strings"
 	"time"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
-	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
 )
 
 type SystemUser struct {
 	Id              int64                  `json:"id"`
 	Name            string                 `json:"name"`
 	NickName        string                 `json:"nickName"`
+	Gender          pasturePb.Genders_Kind `json:"gender"`
 	Mobile          string                 `json:"mobile"`
 	Password        string                 `json:"password"`
 	Avatar          string                 `json:"avatar"`
 	RoleIds         string                 `json:"roleIds"`
 	DeptIds         string                 `json:"deptIds"`
 	IndicatorsKinds string                 `json:"indicatorsKinds"`
-	Gender          pasturePb.Genders_Kind `json:"gender"`
 	PastureIds      string                 `json:"pastureIds"`
 	IsShow          pasturePb.IsShow_Kind  `json:"isShow"`
 	IsDelete        pasturePb.IsShow_Kind  `json:"isDelete"`
 	Remarks         string                 `json:"remarks"`
+	Spare           string                 `json:"spare"`
 	CreatedAt       int64                  `json:"created_at"`
 	UpdatedAt       int64                  `json:"updated_at"`
 }
@@ -34,57 +34,72 @@ func (s *SystemUser) TableName() string {
 	return "system_user"
 }
 
-func (s *SystemUser) SystemUserFormat(userRoles []*SystemRole, pastures []*operationPb.UserPasture) *operationPb.UserAuth {
-	roles := make([]*operationPb.UserRole, len(userRoles))
-	for k, v := range userRoles {
-		roles[k] = &operationPb.UserRole{
-			Id:   int32(v.Id),
-			Name: v.Name,
-		}
-	}
+func (s *SystemUser) UserUpdate(req *pasturePb.SearchUserRequest, deptIds, pastureIds string) {
+	s.Name = req.Name
+	s.NickName = req.NickName
+	s.Mobile = req.Mobile
+	s.Gender = req.Gender
+	s.DeptIds = deptIds
+	s.Remarks = req.Remarks
+	s.IsShow = req.IsShow
+	s.PastureIds = pastureIds
+}
 
-	return &operationPb.UserAuth{
-		Code: http.StatusOK,
-		Msg:  "ok",
-		Data: &operationPb.UserAuthData{
-			UserName: s.Name,
-			Roles:    roles,
-			Pastures: pastures,
-		},
+func NewSystemUser(req *pasturePb.SearchUserRequest, deptIds, pastureIds string, pastureDepthList []*pasturePb.PastureDepthDetail) *SystemUser {
+	spare := ""
+	if len(pastureDepthList) > 0 {
+		bt, _ := json.Marshal(pastureDepthList)
+		spare = string(bt)
+	}
+	return &SystemUser{
+		Name:            req.Name,
+		NickName:        req.NickName,
+		Gender:          req.Gender,
+		Mobile:          req.Mobile,
+		Password:        req.Password,
+		Avatar:          "https://avatars.githubusercontent.com/u/9510375",
+		RoleIds:         "",
+		DeptIds:         deptIds,
+		IndicatorsKinds: fmt.Sprintf("%s,%s,%s,%s,%s,%s", AllCow, OutNumber, InputNumber, SalesVolume, FattenCattleNumber, AdultCow),
+		PastureIds:      pastureIds,
+		IsShow:          pasturePb.IsShow_Ok,
+		IsDelete:        pasturePb.IsShow_Ok,
+		Remarks:         req.Remarks,
+		Spare:           spare,
 	}
 }
 
-func (s *SystemUser) GetPastureIds() []int64 {
-	res := make([]int64, 0)
+func (s *SystemUser) GetPastureIds() []int32 {
+	res := make([]int32, 0)
 	if s.PastureIds != "" {
 		pastureIds := strings.Split(s.PastureIds, ",")
 		for _, idStr := range pastureIds {
 			id, _ := strconv.Atoi(idStr)
-			res = append(res, int64(id))
+			res = append(res, int32(id))
 		}
 	}
 	return res
 }
 
-func (s *SystemUser) GetRoleIds() []int64 {
-	res := make([]int64, 0)
+func (s *SystemUser) GetRoleIds() []int32 {
+	res := make([]int32, 0)
 	if s.RoleIds != "" {
 		roleIds := strings.Split(s.RoleIds, ",")
 		for _, idStr := range roleIds {
 			id, _ := strconv.Atoi(idStr)
-			res = append(res, int64(id))
+			res = append(res, int32(id))
 		}
 	}
 	return res
 }
 
-func (s *SystemUser) GetDepthIds() []int64 {
-	res := make([]int64, 0)
+func (s *SystemUser) GetDepthIds() []int32 {
+	res := make([]int32, 0)
 	if s.DeptIds != "" {
 		depthIds := strings.Split(s.DeptIds, ",")
 		for _, idStr := range depthIds {
 			id, _ := strconv.Atoi(idStr)
-			res = append(res, int64(id))
+			res = append(res, int32(id))
 		}
 	}
 	return res
@@ -97,74 +112,76 @@ type UserModel struct {
 
 type SystemUserSlice []*SystemUser
 
-func (s SystemUserSlice) ToPB(deptList []*SystemDept, roleList []*SystemRole) []*pasturePb.SearchUserRequest {
-	deptMap := make(map[string]*SystemDept)
+func (s SystemUserSlice) ToPB(deptList []*SystemDept, roleList []*SystemRole, appPastureList []*AppPastureList) []*pasturePb.SearchUserRequest {
+	deptMap := make(map[int32]*SystemDept)
 	for _, v := range deptList {
-		deptMap[fmt.Sprintf("%d", v.Id)] = v
+		deptMap[int32(v.Id)] = v
 	}
-	roleMap := make(map[string]*SystemRole)
+	roleMap := make(map[int32]*SystemRole)
 	for _, v := range roleList {
-		roleMap[fmt.Sprintf("%d", v.Id)] = v
+		roleMap[int32(v.Id)] = v
+	}
+
+	appPastureMap := make(map[int32]*AppPastureList)
+	for _, v := range appPastureList {
+		appPastureMap[int32(v.Id)] = v
 	}
 
 	res := make([]*pasturePb.SearchUserRequest, len(s))
 	for i, v := range s {
-		userDeptList := make([]*pasturePb.IdName, 0)
-		if v.DeptIds != "" {
-			deptIds := strings.Split(v.DeptIds, ",")
-			for _, d := range deptIds {
-				if de, ok := deptMap[d]; ok {
-					userDeptList = append(userDeptList, &pasturePb.IdName{
-						Id:   int32(de.Id),
-						Name: de.Name,
-					})
-				}
+		userDepthName := make([]string, 0)
+		deptIds := v.GetDepthIds()
+		for _, d := range deptIds {
+			if de, ok := deptMap[d]; ok {
+				userDepthName = append(userDepthName, de.Name)
+			}
+		}
 
+		userRoleName := make([]string, 0)
+		roleIds := v.GetRoleIds()
+		for _, r := range roleIds {
+			if ro, ok := roleMap[r]; ok {
+				userRoleName = append(userRoleName, ro.Name)
 			}
 		}
 
-		userRoleList := make([]*pasturePb.IdName, 0)
-		if v.RoleIds != "" {
-			roleIds := strings.Split(v.RoleIds, ",")
-			for _, r := range roleIds {
-				if ro, ok := roleMap[r]; ok {
-					userRoleList = append(userRoleList, &pasturePb.IdName{
-						Id:   int32(ro.Id),
-						Name: ro.Name,
-					})
-				}
+		pastureName := make([]string, 0)
+		for _, p := range v.GetPastureIds() {
+			if pa, ok := appPastureMap[p]; ok {
+				pastureName = append(pastureName, pa.Name)
 			}
 		}
 
+		pastureDepthList := make([]*pasturePb.PastureDepthDetail, 0)
+		if len(v.Spare) > 0 {
+			json.Unmarshal([]byte(v.Spare), &pastureDepthList)
+		}
+
 		res[i] = &pasturePb.SearchUserRequest{
-			Id:              int32(v.Id),
-			Name:            v.Name,
-			Mobile:          v.Mobile,
-			NickName:        v.NickName,
-			Avatar:          v.Avatar,
-			Gender:          v.Gender,
-			IsShow:          v.IsShow,
-			IsDelete:        v.IsDelete,
-			Remarks:         v.Remarks,
-			DepthList:       userDeptList,
-			RoleList:        userRoleList,
-			CreatedAtFormat: time.Unix(v.CreatedAt, 0).Local().Format(LayoutTime),
-			UpdatedAtFormat: time.Unix(v.UpdatedAt, 0).Local().Format(LayoutTime),
+			Id:               int32(v.Id),
+			Name:             v.Name,
+			NickName:         v.NickName,
+			Mobile:           v.Mobile,
+			Avatar:           v.Avatar,
+			Gender:           v.Gender,
+			IsShow:           v.IsShow,
+			IsDelete:         v.IsDelete,
+			Remarks:          v.Remarks,
+			PastureDepthList: pastureDepthList,
+			DepthId:          deptIds,
+			DeptName:         userDepthName,
+			RoleList:         nil,
+			RoleId:           v.GetRoleIds(),
+			RoleName:         userRoleName,
+			PastureId:        v.GetPastureIds(),
+			PastureName:      pastureName,
+			CreatedAtFormat:  time.Unix(v.CreatedAt, 0).Local().Format(LayoutTime),
+			UpdatedAtFormat:  time.Unix(v.UpdatedAt, 0).Local().Format(LayoutTime),
 		}
 	}
 	return res
 }
 
-func (s *SystemUser) ToPb() *operationPb.AddSystemUser {
-	return &operationPb.AddSystemUser{
-		Id:              int32(s.Id),
-		Name:            s.Name,
-		CreatedAt:       int32(s.CreatedAt),
-		CreatedAtFormat: time.Unix(s.CreatedAt, 0).Local().Format(LayoutTime),
-		RoleIds:         []int32{},
-	}
-}
-
 func (s SystemUserSlice) ToPB2() []*pasturePb.ConfigOptionsList {
 	res := make([]*pasturePb.ConfigOptionsList, len(s))
 	for i, d := range s {

+ 12 - 4
module/backend/app_pasture.go

@@ -3,7 +3,6 @@ package backend
 import (
 	"context"
 	"kpt-pasture/model"
-	"strings"
 
 	"gitee.com/xuyiping_admin/pkg/xerr"
 
@@ -21,11 +20,20 @@ func (s *StoreEntry) FindPastureByFarmId(ctx context.Context, farmId string) (*m
 	return res, nil
 }
 
-func (s *StoreEntry) FindPastureList(ctx context.Context, pastureIds string) ([]*model.AppPastureList, error) {
+func (s *StoreEntry) FindPastureListByIds(ctx context.Context, pastureIds []int32) ([]*model.AppPastureList, error) {
+	list := make([]*model.AppPastureList, 0)
+	if err := s.DB.Table(new(model.AppPastureList).TableName()).
+		Where("id IN (?)", pastureIds).
+		Where("is_show = ?", pasturePb.IsShow_Ok).
+		Find(&list).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return list, nil
+}
+
+func (s *StoreEntry) FindPastureList(ctx context.Context) ([]*model.AppPastureList, error) {
 	list := make([]*model.AppPastureList, 0)
-	pastureIntIds := strings.Split(pastureIds, ",")
 	if err := s.DB.Table(new(model.AppPastureList).TableName()).
-		Where("id IN (?)", pastureIntIds).
 		Where("is_show = ?", pasturePb.IsShow_Ok).
 		Find(&list).Error; err != nil {
 		return nil, xerr.WithStack(err)

+ 24 - 9
module/backend/enum_options.go

@@ -146,23 +146,38 @@ func (s *StoreEntry) CowTransferPenReasonOptions(ctx context.Context) (*pastureP
 	}, nil
 }
 
-func (s *StoreEntry) SystemUserOptions(ctx context.Context, depId int) (*pasturePb.ConfigOptionsListResponse, error) {
-	_, err := s.GetUserModel(ctx)
+// SystemUserOptions 系统用户下拉框
+func (s *StoreEntry) SystemUserOptions(ctx context.Context, depName string) (*pasturePb.ConfigOptionsListResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
 
-	systemUserList := make([]*model.SystemUser, 0)
-	pref := s.DB.Table(new(model.SystemUser).TableName()).
-		Where("is_delete = ?", pasturePb.IsShow_Ok).
-		Where("is_show =? ", pasturePb.IsShow_Ok)
-	if depId != -1 && depId > 0 {
-		pref = pref.Where("dept_id = ?", depId)
+	systemDepth := &model.SystemDept{}
+	if err = s.DB.Model(new(model.SystemDept)).
+		Where("name = ?", depName).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		First(systemDepth).Error; err != nil {
+		return nil, xerr.WithStack(err)
 	}
 
-	if err = pref.Find(&systemUserList).Error; err != nil {
+	if systemDepth.IsDelete == pasturePb.IsShow_No {
+		return nil, xerr.Custom("部门已经删除")
+	}
+
+	if systemDepth.IsShow == pasturePb.IsShow_No {
+		return nil, xerr.Custom("部门已经禁用")
+	}
+
+	systemUserList := make([]*model.SystemUser, 0)
+	if err = s.DB.Table(new(model.SystemUser).TableName()).
+		Where("FIND_IN_SET('?',dept_ids) > 0", systemDepth.Id).
+		Where("is_delete = ?", pasturePb.IsShow_Ok).
+		Where("is_show = ? ", pasturePb.IsShow_Ok).
+		Find(&systemUserList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
+
 	return &pasturePb.ConfigOptionsListResponse{
 		Code: http.StatusOK,
 		Msg:  "ok",

+ 1 - 2
module/backend/interface.go

@@ -86,7 +86,6 @@ type SystemService interface {
 	// SearchSystemMenuList 系统菜单权限
 	SearchSystemMenuList(ctx context.Context, req *pasturePb.SearchMenuRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchMenuResponse, error)
 	DeleteSystemMenu(ctx context.Context, menuId int64) error
-	CreateOrUpdateSystemMenu(ctx context.Context, req *pasturePb.SearchMenuRequest) error
 	SystemMenuTree(ctx context.Context) (*pasturePb.SystemMenuTreeResponse, error)
 
 	// SearchSystemDeptList 部门列表
@@ -153,7 +152,7 @@ type ConfigDataService interface {
 	CowSourceOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
 	CowTypeOptions(ctx context.Context, optionName, isAll string) (*pasturePb.ConfigOptionsListResponse, error)
 	CowTransferPenReasonOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
-	SystemUserOptions(ctx context.Context, depId int) (*pasturePb.ConfigOptionsListResponse, error)
+	SystemUserOptions(ctx context.Context, depName string) (*pasturePb.ConfigOptionsListResponse, error)
 	BullOptions(ctx context.Context) (*pasturePb.BullOptionsListResponse, error)
 	SystemBaseConfigOptions(ctx context.Context, optionName, isAll string) (*pasturePb.ConfigOptionsListResponse, error)
 	DiseaseTypeOptions(ctx context.Context, isChildren string) (*pasturePb.ConfigOptionsListResponse, error)

+ 12 - 5
module/backend/prescription.go

@@ -51,7 +51,9 @@ func (s *StoreEntry) SearchSameTimeList(ctx context.Context, req *pasturePb.Sear
 	}
 	semeTimeList := make([]*model.SameTime, 0)
 	var count int64 = 0
-	pref := s.DB.Model(new(model.SameTime)).Where("pasture_id = ?", userModel.AppPasture.Id)
+	pastureId := userModel.AppPasture.Id
+	pref := s.DB.Model(new(model.SameTime)).
+		Where("pasture_id = ?", pastureId)
 	if req.Name != "" {
 		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
 	}
@@ -66,7 +68,7 @@ func (s *StoreEntry) SearchSameTimeList(ctx context.Context, req *pasturePb.Sear
 
 	weekMap := s.WeekMap()
 	sameTimeCowTypeMap := s.SameTimeCowTypeMap()
-	systemUser, _ := s.SystemUserList(ctx)
+	systemUser, _ := s.SystemUserList(ctx, pastureId)
 	return &pasturePb.SameTimeResponse{
 		Code: http.StatusOK,
 		Msg:  "ok",
@@ -111,8 +113,10 @@ func (s *StoreEntry) SearchDiseaseList(ctx context.Context, req *pasturePb.Searc
 	}
 	diseaseList := make([]*model.Disease, 0)
 	var count int64 = 0
+	pastureId := userModel.AppPasture.Id
 
-	pref := s.DB.Model(new(model.Disease)).Where("pasture_id = ?", userModel.AppPasture.Id)
+	pref := s.DB.Model(new(model.Disease)).
+		Where("pasture_id = ?", pastureId)
 	if req.Name != "" {
 		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
 	}
@@ -121,12 +125,15 @@ func (s *StoreEntry) SearchDiseaseList(ctx context.Context, req *pasturePb.Searc
 		pref.Where("disease_type = ?", req.DiseaseTypeId)
 	}
 
-	if err = pref.Order("id desc").Count(&count).Limit(int(pagination.PageSize)).Offset(int(pagination.PageOffset)).
+	if err = pref.Order("id desc").
+		Count(&count).
+		Limit(int(pagination.PageSize)).
+		Offset(int(pagination.PageOffset)).
 		Find(&diseaseList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 
-	systemUserList, _ := s.SystemUserList(ctx)
+	systemUserList, _ := s.SystemUserList(ctx, pastureId)
 	diseaseTypeList, _ := s.DiseaseTypeList(ctx)
 
 	return &pasturePb.SearchDiseaseResponse{

+ 2 - 169
module/backend/sql.go

@@ -386,9 +386,10 @@ func (s *StoreEntry) GetEventCowSameTimeByCowId(ctx context.Context, pastureId,
 	return eventCowSameTime, nil
 }
 
-func (s *StoreEntry) SearchSystemDeptListByIds(ctx context.Context, ids []int64) ([]*model.SystemDept, error) {
+func (s *StoreEntry) SearchSystemDeptListByIds(ctx context.Context, pastureId int64, ids []int64) ([]*model.SystemDept, error) {
 	systemDeptList := make([]*model.SystemDept, 0)
 	if err := s.DB.Model(new(model.SystemDept)).
+		Where("pasture_id = ?", pastureId).
 		Where("is_show = ?", operationPb.IsShow_OK).
 		Find(&systemDeptList, ids).Error; err != nil {
 		return nil, xerr.WithStack(err)
@@ -414,171 +415,3 @@ func (s *StoreEntry) GetSystemBasicByName(ctx context.Context, pastureId int64,
 	}
 	return systemBasic, nil
 }
-
-// FindLastEventMatingByCowId 根据cowId获取最近一次配种表信息
-func (s *StoreEntry) FindLastEventMatingByCowId(ctx context.Context, pastureId, cowId int64) (*model.EventMating, error) {
-	newEventMating := &model.EventMating{}
-	if err := s.DB.Model(new(model.EventMating)).
-		Where("cow_id = ?", cowId).
-		Where("pasture_id = ?", pastureId).
-		Order("id desc").
-		First(newEventMating).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-	return newEventMating, nil
-}
-
-func (s *StoreEntry) FindEventEstrusByCowId(pastureId, cowId int64, startTime, endTime int64) bool {
-	var count int64
-	if err := s.DB.Model(new(model.EventEstrus)).
-		Where("cow_id = ?", cowId).
-		Where("pasture_id = ?", pastureId).
-		Where("reality_day BETWEEN ? AND ?", startTime, endTime).
-		Where("is_show = ? ", pasturePb.IsShow_Ok).
-		Count(&count).Error; err != nil {
-		return false
-	}
-	return count > 0
-}
-
-func (s *StoreEntry) FindEventMatingByCowId(pastureId, cowId int64) bool {
-	var count int64
-	if err := s.DB.Model(new(model.EventMating)).
-		Where("cow_id = ?", cowId).
-		Where("pasture_id = ?", pastureId).
-		Where("is_show = ? ", pasturePb.IsShow_Ok).
-		Count(&count).Error; err != nil {
-		return false
-	}
-	return count > 0
-}
-
-func (s *StoreEntry) GetOutboundById(ctx context.Context, pastureId, id int64) (*model.Outbound, error) {
-	res := &model.Outbound{}
-	if err := s.DB.Model(new(model.Outbound)).Where("pasture_id = ?", pastureId).
-		Where("id = ?", id).First(res).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-	return res, nil
-}
-
-func (s *StoreEntry) GetOutboundDetailByOutboundId(ctx context.Context, id int64) ([]*model.OutboundDetail, error) {
-	list := make([]*model.OutboundDetail, 0)
-	if err := s.DB.Model(new(model.OutboundDetail)).
-		Where("outbound_id = ?", id).
-		Where("is_delete = ?", pasturePb.IsShow_Ok).
-		Find(&list).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-	return list, nil
-}
-
-func (s *StoreEntry) FindEventPregnantCheckIsExIstByCowId(ctx context.Context, cow *model.Cow) (*model.EventPregnantCheck, error) {
-	newEventPregnantCheck := &model.EventPregnantCheck{}
-	if err := s.DB.Model(new(model.EventPregnantCheck)).
-		Where("cow_id = ?", cow.Id).
-		Where("lact = ?", cow.Lact).
-		Where("status = ?", pasturePb.IsShow_No).
-		Order("id desc").
-		First(newEventPregnantCheck).Error; err != nil {
-		if errors.Is(err, gorm.ErrRecordNotFound) {
-			return nil, xerr.Customf("该牛只: %d 孕检数据未找到", cow.Id)
-		} else {
-			return nil, xerr.WithStack(err)
-		}
-	}
-	return newEventPregnantCheck, nil
-}
-
-func (s *StoreEntry) DiseaseMaps(ctx context.Context) (map[int64]*model.Disease, error) {
-	res := make(map[int64]*model.Disease)
-	list := make([]*model.Disease, 0)
-	if err := s.DB.Model(new(model.Disease)).Where("is_show = ?", pasturePb.IsShow_Ok).Find(&list).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-	for _, v := range list {
-		res[v.Id] = v
-	}
-	return res, nil
-}
-
-// NeckRingIsExist 根据neckRingNumber判断该耳环是否存在
-func (s *StoreEntry) NeckRingIsExist(pastureId int64, number string) (*model.NeckRing, bool) {
-	neckRing := &model.NeckRing{}
-	if err := s.DB.Model(new(model.NeckRing)).
-		Where("neck_ring_number = ?", number).
-		Where("pasture_id = ?", pastureId).
-		First(neckRing).Error; err != nil {
-		if errors.Is(err, gorm.ErrRecordNotFound) {
-			return nil, false
-		} else {
-			return nil, false
-		}
-	}
-	return neckRing, true
-}
-
-func (s *StoreEntry) GetEventLogList(
-	cowId int64, lact int32,
-	eventCategoryId pasturePb.EventCategory_Kind,
-	paginationModel *pasturePb.PaginationModel,
-) ([]*model.EventCowLog, error) {
-	eventLogList := make([]*model.EventCowLog, 0)
-	newEventCowLog := &model.EventCowLog{CowId: cowId}
-	pref := s.DB.Table(newEventCowLog.TableName()).
-		Where("cow_id = ?", cowId)
-	if lact >= 0 {
-		pref.Where("lact = ?", lact)
-	}
-
-	if eventCategoryId > 0 {
-		pref.Where("event_category_id = ?", eventCategoryId)
-	}
-
-	if err := pref.Order("id desc").
-		Offset(int(paginationModel.PageOffset)).
-		Limit(int(paginationModel.PageSize)).
-		Find(&eventLogList).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-	return eventLogList, nil
-}
-
-func (s *StoreEntry) FindIndicatorsDetailsList(ctx context.Context) ([]*model.IndicatorsDetails, error) {
-	list := make([]*model.IndicatorsDetails, 0)
-	if err := s.DB.Model(new(model.IndicatorsDetails)).Find(&list).Error; err != nil {
-		return nil, xerr.WithStack(err)
-	}
-	return list, nil
-}
-
-func (s *StoreEntry) GetCowLastEvent(pastureId, cowId int64, eventCategoryId pasturePb.EventCategory_Kind) *model.EventCowLog {
-	newEventCowLog := &model.EventCowLog{CowId: cowId}
-	pref := s.DB.Table(newEventCowLog.TableName()).
-		Where("cow_id = ?", cowId).Where("pasture_id = ?", pastureId)
-	if eventCategoryId > 0 {
-		pref.Where("event_category_kind = ?", eventCategoryId)
-	}
-
-	if err := pref.Order("id desc").
-		First(newEventCowLog); err != nil {
-		return nil
-	}
-	return newEventCowLog
-}
-
-// IsExistCalvingCalf 根据cowId查询犊牛信息
-func (s *StoreEntry) IsExistCalvingCalf(pastureId, cowId int64) (*model.CalvingCalf, bool) {
-	calvingCalf := &model.CalvingCalf{}
-	if err := s.DB.Model(new(model.CalvingCalf)).
-		Where("cow_id = ?", cowId).
-		Where("pasture_id = ?", pastureId).
-		First(calvingCalf).Error; err != nil {
-		if errors.Is(err, gorm.ErrRecordNotFound) {
-			return nil, false
-		} else {
-			return nil, false
-		}
-	}
-	return calvingCalf, true
-}

+ 202 - 0
module/backend/sql_more.go

@@ -0,0 +1,202 @@
+package backend
+
+import (
+	"context"
+	"errors"
+	"kpt-pasture/model"
+
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+	"gitee.com/xuyiping_admin/pkg/xerr"
+	"gorm.io/gorm"
+)
+
+// FindLastEventMatingByCowId 根据cowId获取最近一次配种表信息
+func (s *StoreEntry) FindLastEventMatingByCowId(ctx context.Context, pastureId, cowId int64) (*model.EventMating, error) {
+	newEventMating := &model.EventMating{}
+	if err := s.DB.Model(new(model.EventMating)).
+		Where("cow_id = ?", cowId).
+		Where("pasture_id = ?", pastureId).
+		Order("id desc").
+		First(newEventMating).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return newEventMating, nil
+}
+
+func (s *StoreEntry) FindEventEstrusByCowId(pastureId, cowId int64, startTime, endTime int64) bool {
+	var count int64
+	if err := s.DB.Model(new(model.EventEstrus)).
+		Where("cow_id = ?", cowId).
+		Where("pasture_id = ?", pastureId).
+		Where("reality_day BETWEEN ? AND ?", startTime, endTime).
+		Where("is_show = ? ", pasturePb.IsShow_Ok).
+		Count(&count).Error; err != nil {
+		return false
+	}
+	return count > 0
+}
+
+func (s *StoreEntry) FindEventMatingByCowId(pastureId, cowId int64) bool {
+	var count int64
+	if err := s.DB.Model(new(model.EventMating)).
+		Where("cow_id = ?", cowId).
+		Where("pasture_id = ?", pastureId).
+		Where("is_show = ? ", pasturePb.IsShow_Ok).
+		Count(&count).Error; err != nil {
+		return false
+	}
+	return count > 0
+}
+
+func (s *StoreEntry) GetOutboundById(ctx context.Context, pastureId, id int64) (*model.Outbound, error) {
+	res := &model.Outbound{}
+	if err := s.DB.Model(new(model.Outbound)).Where("pasture_id = ?", pastureId).
+		Where("id = ?", id).First(res).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return res, nil
+}
+
+func (s *StoreEntry) GetOutboundDetailByOutboundId(ctx context.Context, id int64) ([]*model.OutboundDetail, error) {
+	list := make([]*model.OutboundDetail, 0)
+	if err := s.DB.Model(new(model.OutboundDetail)).
+		Where("outbound_id = ?", id).
+		Where("is_delete = ?", pasturePb.IsShow_Ok).
+		Find(&list).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return list, nil
+}
+
+func (s *StoreEntry) FindEventPregnantCheckIsExIstByCowId(ctx context.Context, cow *model.Cow) (*model.EventPregnantCheck, error) {
+	newEventPregnantCheck := &model.EventPregnantCheck{}
+	if err := s.DB.Model(new(model.EventPregnantCheck)).
+		Where("cow_id = ?", cow.Id).
+		Where("lact = ?", cow.Lact).
+		Where("status = ?", pasturePb.IsShow_No).
+		Order("id desc").
+		First(newEventPregnantCheck).Error; err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return nil, xerr.Customf("该牛只: %d 孕检数据未找到", cow.Id)
+		} else {
+			return nil, xerr.WithStack(err)
+		}
+	}
+	return newEventPregnantCheck, nil
+}
+
+func (s *StoreEntry) DiseaseMaps(ctx context.Context) (map[int64]*model.Disease, error) {
+	res := make(map[int64]*model.Disease)
+	list := make([]*model.Disease, 0)
+	if err := s.DB.Model(new(model.Disease)).Where("is_show = ?", pasturePb.IsShow_Ok).Find(&list).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	for _, v := range list {
+		res[v.Id] = v
+	}
+	return res, nil
+}
+
+// NeckRingIsExist 根据neckRingNumber判断该耳环是否存在
+func (s *StoreEntry) NeckRingIsExist(pastureId int64, number string) (*model.NeckRing, bool) {
+	neckRing := &model.NeckRing{}
+	if err := s.DB.Model(new(model.NeckRing)).
+		Where("neck_ring_number = ?", number).
+		Where("pasture_id = ?", pastureId).
+		First(neckRing).Error; err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return nil, false
+		} else {
+			return nil, false
+		}
+	}
+	return neckRing, true
+}
+
+func (s *StoreEntry) GetEventLogList(
+	cowId int64, lact int32,
+	eventCategoryId pasturePb.EventCategory_Kind,
+	paginationModel *pasturePb.PaginationModel,
+) ([]*model.EventCowLog, error) {
+	eventLogList := make([]*model.EventCowLog, 0)
+	newEventCowLog := &model.EventCowLog{CowId: cowId}
+	pref := s.DB.Table(newEventCowLog.TableName()).
+		Where("cow_id = ?", cowId)
+	if lact >= 0 {
+		pref.Where("lact = ?", lact)
+	}
+
+	if eventCategoryId > 0 {
+		pref.Where("event_category_id = ?", eventCategoryId)
+	}
+
+	if err := pref.Order("id desc").
+		Offset(int(paginationModel.PageOffset)).
+		Limit(int(paginationModel.PageSize)).
+		Find(&eventLogList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return eventLogList, nil
+}
+
+func (s *StoreEntry) FindIndicatorsDetailsList(ctx context.Context) ([]*model.IndicatorsDetails, error) {
+	list := make([]*model.IndicatorsDetails, 0)
+	if err := s.DB.Model(new(model.IndicatorsDetails)).Find(&list).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return list, nil
+}
+
+func (s *StoreEntry) GetCowLastEvent(pastureId, cowId int64, eventCategoryId pasturePb.EventCategory_Kind) *model.EventCowLog {
+	newEventCowLog := &model.EventCowLog{CowId: cowId}
+	pref := s.DB.Table(newEventCowLog.TableName()).
+		Where("cow_id = ?", cowId).Where("pasture_id = ?", pastureId)
+	if eventCategoryId > 0 {
+		pref.Where("event_category_kind = ?", eventCategoryId)
+	}
+
+	if err := pref.Order("id desc").
+		First(newEventCowLog); err != nil {
+		return nil
+	}
+	return newEventCowLog
+}
+
+// IsExistCalvingCalf 根据cowId查询犊牛信息
+func (s *StoreEntry) IsExistCalvingCalf(pastureId, cowId int64) (*model.CalvingCalf, bool) {
+	calvingCalf := &model.CalvingCalf{}
+	if err := s.DB.Model(new(model.CalvingCalf)).
+		Where("cow_id = ?", cowId).
+		Where("pasture_id = ?", pastureId).
+		First(calvingCalf).Error; err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return nil, false
+		} else {
+			return nil, false
+		}
+	}
+	return calvingCalf, true
+}
+
+func (s *StoreEntry) GetAppPastureListByFarmId(ctx context.Context, farmId string) (*model.AppPastureList, error) {
+	res := &model.AppPastureList{}
+	if err := s.DB.Model(new(model.AppPastureList)).
+		Where("farm_id = ?", farmId).
+		First(res).Error; err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return nil, xerr.Custom("请选择牧场信息")
+		} else {
+			return nil, xerr.WithStack(err)
+		}
+	}
+
+	if res.Id == 0 {
+		return nil, xerr.Custom("请选择牧场信息")
+	}
+
+	if res.IsShow != pasturePb.IsShow_Ok {
+		return nil, xerr.Custom("改牧场已禁用")
+	}
+
+	return res, nil
+}

+ 211 - 119
module/backend/system_service.go

@@ -7,7 +7,6 @@ import (
 	"kpt-pasture/model"
 	"kpt-pasture/util"
 	"net/http"
-	"strconv"
 	"strings"
 	"time"
 
@@ -46,7 +45,9 @@ func (s *StoreEntry) Login(ctx context.Context, req *pasturePb.SearchUserRequest
 		return nil, xerr.Customf("该账号已被删除,请联系管理员")
 	}
 
-	zaplog.Info("Login", zap.Any("systemUser", systemUser))
+	if len(systemUser.PastureIds) <= 0 {
+		return nil, xerr.Custom("当前用户未配置相关牧场数据,请联系管理员!")
+	}
 
 	systemRoleList := make([]*model.SystemRole, 0)
 	if err := s.DB.Model(new(model.SystemRole)).
@@ -71,7 +72,7 @@ func (s *StoreEntry) Login(ctx context.Context, req *pasturePb.SearchUserRequest
 	}
 
 	expires := time.Now().Local().Add(time.Duration(s.Cfg.JwtExpireTime) * time.Second).Format(util.LayoutTime)
-	farmList, err := s.FindPastureList(ctx, systemUser.PastureIds)
+	farmList, err := s.FindPastureListByIds(ctx, systemUser.GetPastureIds())
 	if err != nil || len(farmList) == 0 {
 		return nil, xerr.Custom("牧场信息错误")
 	}
@@ -100,10 +101,10 @@ func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *pasturePb.Se
 
 	systemUserList := make([]*model.SystemUser, 0)
 	var count int64 = 0
-
 	pref := s.DB.Model(new(model.SystemUser)).
 		Where("is_delete = ?", operationPb.IsShow_OK).
 		Where("FIND_IN_SET(?, pasture_ids) > ?", userModel.AppPasture.Id, 0)
+
 	if req.Name != "" {
 		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
 	}
@@ -112,18 +113,12 @@ func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *pasturePb.Se
 		pref.Where("mobile = ?", req.Mobile)
 	}
 
-	if req.DepthId > 0 {
-		systemDept := &model.SystemDept{}
-		if err = s.DB.Model(new(model.SystemDept)).Where("id = ?", req.DepthId).
-			Where("is_delete = ?", operationPb.IsShow_OK).
-			First(systemDept).Error; err != nil {
-			return nil, xerr.Custom("部门信息错误")
-		}
-
-		pref.Where("pasture_id = ?", systemDept.PastureId)
-		if systemDept.DeptType == pasturePb.Depth_Department {
-			pref.Where("dept_id = ?", req.DepthId)
+	if len(req.DepthId) > 0 {
+		depthIds := ""
+		for _, v := range req.DepthId {
+			depthIds += fmt.Sprintf("%d,", v)
 		}
+		pref.Where("dept_ids = ?", strings.TrimRight(depthIds, ","))
 	}
 
 	if req.IsShow > 0 {
@@ -138,12 +133,17 @@ func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *pasturePb.Se
 		return nil, xerr.WithStack(err)
 	}
 
-	roleList, err := s.SearchSystemRoleListByIds(ctx, []int64{})
+	roleList, err := s.SearchSystemRoleListByIds(ctx, userModel.AppPasture.Id, []int64{})
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	deptList, err := s.SearchSystemDeptListByIds(ctx, userModel.AppPasture.Id, []int64{})
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
 
-	deptList, err := s.SearchSystemDeptListByIds(ctx, []int64{})
+	appPastureList, err := s.FindPastureList(ctx)
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
@@ -152,7 +152,7 @@ func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *pasturePb.Se
 		Code: http.StatusOK,
 		Msg:  "ok",
 		Data: &pasturePb.SearchUserData{
-			List:     model.SystemUserSlice(systemUserList).ToPB(deptList, roleList),
+			List:     model.SystemUserSlice(systemUserList).ToPB(deptList, roleList, appPastureList),
 			Total:    int32(count),
 			PageSize: pagination.PageSize,
 			Page:     pagination.Page,
@@ -160,9 +160,11 @@ func (s *StoreEntry) SearchSystemUserList(ctx context.Context, req *pasturePb.Se
 	}, nil
 }
 
-func (s *StoreEntry) SystemUserList(ctx context.Context) ([]*model.SystemUser, error) {
+func (s *StoreEntry) SystemUserList(ctx context.Context, pastureId int64) ([]*model.SystemUser, error) {
 	systemUserList := make([]*model.SystemUser, 0)
-	if err := s.DB.Where("is_delete = ?", pasturePb.IsShow_Ok).
+	if err := s.DB.Model(new(model.SystemUser)).
+		Where("pasture_id = ?", pastureId).
+		Where("is_delete = ?", pasturePb.IsShow_Ok).
 		Where("is_show = ? ", pasturePb.IsShow_Ok).
 		Find(&systemUserList).Error; err != nil {
 		return nil, xerr.WithStack(err)
@@ -172,9 +174,7 @@ func (s *StoreEntry) SystemUserList(ctx context.Context) ([]*model.SystemUser, e
 
 // DeleteSystemUser 删除系统用户
 func (s *StoreEntry) DeleteSystemUser(ctx context.Context, userId int64) error {
-	systemUser := &model.SystemUser{
-		Id: userId,
-	}
+	systemUser := &model.SystemUser{Id: userId}
 	if err := s.DB.Model(new(model.SystemUser)).First(systemUser).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return xerr.Custom("该用户不存在")
@@ -203,7 +203,8 @@ func (s *StoreEntry) IsShowSystemUser(ctx context.Context, userId int64) error {
 		isShow = pasturePb.IsShow_Ok
 	}
 
-	if err := s.DB.Model(systemUser).Update("is_show", isShow).Error; err != nil {
+	if err := s.DB.Model(systemUser).
+		Update("is_show", isShow).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
@@ -211,67 +212,81 @@ func (s *StoreEntry) IsShowSystemUser(ctx context.Context, userId int64) error {
 
 // SystemUserCreateOrUpdate 创建或者更新系统用户
 func (s *StoreEntry) SystemUserCreateOrUpdate(ctx context.Context, req *pasturePb.SearchUserRequest) error {
+	deptIds, pastureIds := "", ""
+	for _, pasture := range req.PastureDepthList {
+		appPasture, err := s.GetAppPastureListByFarmId(ctx, pasture.FarmId)
+		if err != nil {
+			return xerr.WithStack(err)
+		}
+		pastureIds += fmt.Sprintf("%d,", appPasture.Id)
+		if len(pasture.DepthList) > 0 {
+			for _, dept := range pasture.DepthList {
+				deptIds += fmt.Sprintf("%d,", dept.Id)
+			}
+		}
+		if len(pastureIds) > 0 {
+			pastureIds = strings.TrimSuffix(pastureIds, ",")
+		}
+
+		if len(deptIds) > 0 {
+			deptIds = strings.TrimSuffix(deptIds, ",")
+		}
+	}
+
 	systemUser := &model.SystemUser{}
 	if req.Id > 0 {
 		systemUser.Id = int64(req.Id)
-		if err := s.DB.Model(new(model.SystemUser)).First(systemUser).Error; err != nil {
+		if err := s.DB.Model(new(model.SystemUser)).
+			First(systemUser).Error; err != nil {
 			return xerr.WithStack(err)
 		}
-		req.Password = systemUser.Password
+
+		systemUser.UserUpdate(req, deptIds, pastureIds)
+		if err := s.DB.Model(new(model.SystemUser)).
+			Select("name", "nick_name", "mobile", "gender", "dept_ids", "pasture_ids", "remarks", "is_show").
+			Where("id = ?", systemUser.Id).
+			Updates(systemUser).Error; err != nil {
+			return xerr.WithStack(err)
+		}
+
 	} else {
+		var count int64
 		if err := s.DB.Model(new(model.SystemUser)).
 			Where("name = ?", req.Name).
-			First(systemUser).Error; err != nil {
-			if !errors.Is(err, gorm.ErrRecordNotFound) {
-				return xerr.WithStack(err)
-			}
-		} else if systemUser.Id > 0 {
-			return xerr.Custom("该用户名称已经存在")
+			Where("mobile = ?", req.Mobile).
+			Where("is_show = ?", pasturePb.IsShow_Ok).
+			Count(&count).Error; err != nil {
+			return xerr.WithStack(err)
 		}
-	}
 
-	deptIds := ""
-	if len(req.DepthList) > 0 {
-		for _, dept := range req.DepthList {
-			deptIds += fmt.Sprintf("%d,", dept.Id)
+		if count > 0 {
+			return xerr.Customf("系统中该用户名称已经存在: %s_%s", req.Name, req.Mobile)
+		}
+
+		newSystemUser := model.NewSystemUser(req, deptIds, pastureIds, req.PastureDepthList)
+		if err := s.DB.Model(new(model.SystemUser)).
+			Create(newSystemUser).Error; err != nil {
+			return xerr.WithStack(err)
 		}
 	}
-	if len(deptIds) > 0 {
-		deptIds = strings.TrimRight(deptIds, ",")
-	}
-
-	if err := s.DB.Model(&model.SystemUser{}).
-		Where(map[string]interface{}{
-			"id": req.Id,
-		}).Assign(map[string]interface{}{
-		"name":      req.Name,
-		"nick_name": req.NickName,
-		"mobile":    req.Mobile,
-		"gender":    req.Gender,
-		"password":  req.Password,
-		"dept_ids":  deptIds,
-		"remarks":   req.Remarks,
-		"is_delete": operationPb.IsShow_OK,
-		"is_show":   req.IsShow,
-	}).FirstOrCreate(&model.SystemUser{}).Error; err != nil {
-		return xerr.WithStack(err)
-	}
+
 	return nil
 }
 
 // ResetPasswordSystemUser 重置系统用户密码
 func (s *StoreEntry) ResetPasswordSystemUser(ctx context.Context, req *pasturePb.ResetUserPasswordRequest) error {
-	systemUser := &model.SystemUser{
-		Id: int64(req.Id),
-	}
-	if err := s.DB.First(systemUser).Error; err != nil {
+	systemUser := &model.SystemUser{}
+	if err := s.DB.Model(new(model.SystemUser)).
+		Where("id = ?", req.Id).
+		First(systemUser).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return xerr.Custom("该用户不存在")
 		}
 		return xerr.WithStack(err)
 	}
 
-	if err := s.DB.Model(systemUser).Update("password", req.Password).Error; err != nil {
+	if err := s.DB.Model(systemUser).
+		Update("password", req.Password).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
@@ -279,50 +294,63 @@ func (s *StoreEntry) ResetPasswordSystemUser(ctx context.Context, req *pasturePb
 
 func (s *StoreEntry) SystemUserRole(ctx context.Context, userId int64) (*pasturePb.SystemUserRoleResponse, error) {
 	systemUser := &model.SystemUser{Id: userId}
-	if err := s.DB.First(systemUser).Error; err != nil {
+	if err := s.DB.Model(new(model.SystemUser)).
+		First(systemUser).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return nil, xerr.Custom("该用户不存在")
 		}
 		return nil, xerr.WithStack(err)
 	}
 
-	roleIds := make([]int32, 0)
-	if len(systemUser.RoleIds) > 0 {
-		roleIdsString := strings.Split(systemUser.RoleIds, ",")
-		for _, r := range roleIdsString {
-			r1, _ := strconv.Atoi(r)
-			roleIds = append(roleIds, int32(r1))
-		}
+	if systemUser.IsDelete == pasturePb.IsShow_No {
+		return nil, xerr.Custom("该用户已删除")
 	}
+
 	return &pasturePb.SystemUserRoleResponse{
 		Code: http.StatusOK,
 		Msg:  "ok",
 		Data: &pasturePb.UserRoleData{
-			RoleIds: roleIds,
+			RoleIds: systemUser.GetRoleIds(),
 		},
 	}, nil
 }
 
 func (s *StoreEntry) SystemUserRoleSave(ctx context.Context, req *pasturePb.SystemUserRoleRequest) error {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+
 	systemUser := &model.SystemUser{Id: int64(req.UserId)}
-	if err := s.DB.First(systemUser).Error; err != nil {
+	if err = s.DB.Model(new(model.SystemUser)).
+		First(systemUser).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return xerr.Custom("该用户不存在")
 		}
 		return xerr.WithStack(err)
 	}
 
+	if systemUser.IsDelete == pasturePb.IsShow_No {
+		return xerr.Custom("该用户已删除")
+	}
+
+	if systemUser.IsShow == pasturePb.IsShow_No {
+		return xerr.Custom("该用户已禁用")
+	}
+
 	systemRoleList := make([]*model.SystemRole, 0)
-	if err := s.DB.Model(new(model.SystemRole)).
+	if err = s.DB.Model(new(model.SystemRole)).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
 		Where("is_delete = ?", pasturePb.IsShow_Ok).
 		Where("id IN ?", req.RoleIds).
 		Find(&systemRoleList).Error; err != nil {
-		if errors.Is(err, gorm.ErrRecordNotFound) {
-			return xerr.Custom("该角色不存在")
-		}
 		return xerr.WithStack(err)
 	}
 
+	if len(systemRoleList) <= 0 {
+		return xerr.Custom("该用户没有角色")
+	}
+
 	roleIdsStr := ""
 	for _, systemRole := range systemRoleList {
 		roleIdsStr += fmt.Sprintf("%d,", systemRole.Id)
@@ -332,7 +360,7 @@ func (s *StoreEntry) SystemUserRoleSave(ctx context.Context, req *pasturePb.Syst
 		roleIdsStr = strings.TrimRight(roleIdsStr, ",")
 	}
 
-	if err := s.DB.Model(systemUser).
+	if err = s.DB.Model(systemUser).
 		Update("role_ids", roleIdsStr).Error; err != nil {
 		return xerr.WithStack(err)
 	}
@@ -350,10 +378,9 @@ func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUs
 		return nil, xerr.Custom("该用户没有角色")
 	}
 
-	roleIds := strings.Split(systemUser.RoleIds, ",")
 	// 获取用户角色数据
 	systemRoleList := make([]*model.SystemRole, 0)
-	if err = s.DB.Where("id IN ?", roleIds).
+	if err = s.DB.Where("id IN ?", systemUser.GetRoleIds()).
 		Find(&systemRoleList).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return nil, xerr.Custom("该用户角色不存在")
@@ -365,7 +392,7 @@ func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUs
 	if err = s.DB.Table(fmt.Sprintf("%s as a", new(model.SystemRoleMenu).TableName())).
 		Select("b.*").
 		Joins("LEFT JOIN system_menu AS b ON a.menu_id = b.id").
-		Where("a.role_id IN ? and b.is_delete = ?", roleIds, pasturePb.IsShow_Ok).
+		Where("a.role_id IN ? and b.is_delete = ?", systemUser.GetRoleIds(), pasturePb.IsShow_Ok).
 		Find(&systemMenuList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
@@ -380,37 +407,60 @@ func (s *StoreEntry) GetSystemUserMenu(ctx context.Context) (*pasturePb.SystemUs
 
 // SystemRoleCreateOrUpdate 添加角色
 func (s *StoreEntry) SystemRoleCreateOrUpdate(ctx context.Context, req *pasturePb.SearchRoleRequest) error {
-	isShow := pasturePb.IsShow_Ok
-	if req.Id > 0 {
-		isShow = req.IsShow
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return xerr.WithStack(err)
 	}
 
-	if err := s.DB.Model(&model.SystemRole{}).Where(map[string]interface{}{
-		"id": req.Id,
-	}).Assign(map[string]interface{}{
-		"name":      req.Name,
-		"remarks":   req.Remarks,
-		"is_delete": operationPb.IsShow_OK,
-		"is_show":   isShow,
-	}).FirstOrCreate(&model.SystemRole{}).Error; err != nil {
-		return xerr.WithStack(err)
+	if req.Id > 0 {
+		systemRole := &model.SystemRole{}
+		if err = s.DB.Model(systemRole).
+			Where("id = ?", req.Id).
+			Where("pasture_id = ?", userModel.AppPasture.Id).
+			First(systemRole).Error; err != nil {
+			return xerr.WithStack(err)
+		}
+
+		if systemRole.IsDelete == pasturePb.IsShow_No {
+			return xerr.Custom("角色已删除")
+		}
+
+		systemRole.RoleUpdate(req)
+		if err = s.DB.Model(systemRole).
+			Select("name", "remarks", "is_show", "is_delete").
+			Where("id = ?", req.Id).
+			Where("pasture_id = ?", userModel.AppPasture.Id).
+			Updates(systemRole).Error; err != nil {
+			return xerr.WithStack(err)
+		}
+
+	} else {
+		newSystemRole := model.NewSystemRole(userModel.AppPasture.Id, req)
+		if err = s.DB.Model(new(model.SystemRole)).Create(newSystemRole).Error; err != nil {
+			return xerr.WithStack(err)
+		}
 	}
+
 	return nil
 }
 
 // DeleteSystemRole 删除系统角色
 func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
-	systemRole := &model.SystemRole{
-		Id: roleId,
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return xerr.WithStack(err)
 	}
-	if err := s.DB.First(systemRole).Error; err != nil {
-		if errors.Is(err, gorm.ErrRecordNotFound) {
-			return xerr.Custom("该数据不存在")
-		}
+	systemRole := &model.SystemRole{}
+	if err = s.DB.Model(new(model.SystemRole)).
+		Where("id = ? ", roleId).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		Where("is_delete = ?", pasturePb.IsShow_Ok).
+		First(systemRole).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 
-	if err := s.DB.Model(systemRole).Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
+	if err = s.DB.Model(systemRole).
+		Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
@@ -418,21 +468,28 @@ func (s *StoreEntry) DeleteSystemRole(ctx context.Context, roleId int64) error {
 
 // IsShowSystemRole 角色是否启用
 func (s *StoreEntry) IsShowSystemRole(ctx context.Context, roleId int64) error {
-	systemRole := &model.SystemRole{
-		Id: roleId,
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return xerr.WithStack(err)
 	}
-	if err := s.DB.First(systemRole).Error; err != nil {
+	systemRole := &model.SystemRole{}
+	if err = s.DB.Model(new(model.SystemRole)).
+		Where("id = ?", roleId).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		Where("is_delete = ?", pasturePb.IsShow_Ok).
+		First(systemRole).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return xerr.Custom("该角色不存在")
 		}
 		return xerr.WithStack(err)
 	}
+
 	isShow := pasturePb.IsShow_No
 	if systemRole.IsShow == pasturePb.IsShow_No {
 		isShow = pasturePb.IsShow_Ok
 	}
 
-	if err := s.DB.Model(systemRole).Update("is_show", isShow).Error; err != nil {
+	if err = s.DB.Model(systemRole).Update("is_show", isShow).Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
@@ -440,10 +497,17 @@ func (s *StoreEntry) IsShowSystemRole(ctx context.Context, roleId int64) error {
 
 // SearchSystemRoleList 查询系统角色
 func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *pasturePb.SearchRoleRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchRoleResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
 	systemRoleList := make([]*model.SystemRole, 0)
 	var count int64 = 0
 
-	pref := s.DB.Model(new(model.SystemRole)).Where("is_delete = ?", operationPb.IsShow_OK)
+	pref := s.DB.Model(new(model.SystemRole)).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		Where("is_delete = ?", operationPb.IsShow_OK)
 	if req.Name != "" {
 		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
 	}
@@ -452,8 +516,11 @@ func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *pasturePb.Se
 		pref.Where("is_show = ?", req.IsShow)
 	}
 
-	if err := pref.Order("id desc").Count(&count).Limit(int(pagination.PageSize)).
-		Offset(int(pagination.PageOffset)).Find(&systemRoleList).Error; err != nil {
+	if err = pref.Order("is_show asc,id desc").
+		Count(&count).
+		Limit(int(pagination.PageSize)).
+		Offset(int(pagination.PageOffset)).
+		Find(&systemRoleList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 
@@ -470,9 +537,10 @@ func (s *StoreEntry) SearchSystemRoleList(ctx context.Context, req *pasturePb.Se
 }
 
 // SearchSystemRoleListByIds 根据id查询角色列表
-func (s *StoreEntry) SearchSystemRoleListByIds(ctx context.Context, ids []int64) ([]*model.SystemRole, error) {
+func (s *StoreEntry) SearchSystemRoleListByIds(ctx context.Context, pastureId int64, ids []int64) ([]*model.SystemRole, error) {
 	systemRoleList := make([]*model.SystemRole, 0)
 	if err := s.DB.Model(new(model.SystemRole)).
+		Where("pasture_id = ?", pastureId).
 		Where("is_show = ?", operationPb.IsShow_OK).
 		Find(&systemRoleList, ids).Error; err != nil {
 		return nil, xerr.WithStack(err)
@@ -511,29 +579,47 @@ func (s *StoreEntry) GetRoleMenuList(ctx context.Context, roleId int64) (*pastur
 
 // RoleMenuSave 保存系统角色对应的菜单数据
 func (s *StoreEntry) RoleMenuSave(ctx context.Context, res *pasturePb.SystemRoleMenuRequest) error {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+
 	if len(res.MenuIds) <= 0 {
 		return xerr.Custom("请选择菜单")
 	}
-	systemRole := &model.SystemRole{
-		Id: int64(res.RoleId),
-	}
 
-	if err := s.DB.First(systemRole).Error; err != nil {
+	systemRole := &model.SystemRole{}
+	if err = s.DB.Model(new(model.SystemRole)).
+		Where("id = ?", res.RoleId).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		First(systemRole).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return xerr.Custom("该数据不存在")
 		}
 		return xerr.WithStack(err)
 	}
 
-	if err := s.DB.Transaction(func(tx *gorm.DB) error {
-		if err := tx.Model(new(model.SystemRoleMenu)).Where("role_id = ?", systemRole.Id).Delete(&model.SystemRoleMenu{}).Error; err != nil {
+	if systemRole.IsDelete == pasturePb.IsShow_No {
+		return xerr.Custom("该数据已删除")
+	}
+
+	if systemRole.IsShow == pasturePb.IsShow_No {
+		return xerr.Custom("该数据已禁用")
+	}
+
+	if err = s.DB.Transaction(func(tx *gorm.DB) error {
+		if err = tx.Model(new(model.SystemRoleMenu)).
+			Where("role_id = ?", systemRole.Id).
+			Delete(&model.SystemRoleMenu{}).
+			Error; err != nil {
 			return xerr.WithStack(err)
 		}
 		for _, menuId := range res.MenuIds {
-			if err := tx.Create(&model.SystemRoleMenu{
-				RoleId: systemRole.Id,
-				MenuId: int64(menuId),
-			}).Error; err != nil {
+			if err = tx.Model(new(model.SystemRoleMenu)).
+				Create(&model.SystemRoleMenu{
+					RoleId: systemRole.Id,
+					MenuId: int64(menuId),
+				}).Error; err != nil {
 				return xerr.WithStack(err)
 			}
 		}
@@ -545,9 +631,15 @@ func (s *StoreEntry) RoleMenuSave(ctx context.Context, res *pasturePb.SystemRole
 }
 
 func (s *StoreEntry) SystemRoleList(ctx context.Context) (*pasturePb.GetRoleListResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
 	systemRoleList := make([]*model.SystemRole, 0)
-	if err := s.DB.Model(new(model.SystemRole)).
-		Where("is_delete = ? and is_show = ?", pasturePb.IsShow_Ok, pasturePb.IsShow_Ok).
+	if err = s.DB.Model(new(model.SystemRole)).
+		Where("is_delete = ?", pasturePb.IsShow_Ok).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
 		Find(&systemRoleList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}

+ 115 - 65
module/backend/system_service_more.go

@@ -19,50 +19,53 @@ import (
 
 // CreateOrUpdateSystemMenu 添加或者更新系统菜单权限
 func (s *StoreEntry) CreateOrUpdateSystemMenu(ctx context.Context, req *pasturePb.SearchMenuRequest) error {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+
 	if req.Id > 0 {
-		systemMenu := &model.SystemMenu{Id: int64(req.Id)}
-		if err := s.DB.Model(&model.SystemMenu{}).First(systemMenu).Error; err != nil {
-			if !errors.Is(err, gorm.ErrRecordNotFound) {
-				return xerr.WithStack(err)
-			}
+		systemMenu := &model.SystemMenu{}
+		if err = s.DB.Model(new(model.SystemMenu)).
+			Where("id = ?", req.Id).
+			Where("pasture_id = ?", userModel.AppPasture.Id).
+			First(systemMenu).Error; err != nil {
+			return xerr.WithStack(err)
 		}
-	}
 
-	if err := s.DB.Model(&model.SystemMenu{}).Where(map[string]interface{}{
-		"id": req.Id,
-	}).Assign(map[string]interface{}{
-		"name":             req.Name,
-		"path":             req.Path,
-		"title":            req.Title,
-		"menu_type":        req.MenuType,
-		"parent_id":        req.ParentId,
-		"frame_src":        req.FrameSrc,
-		"frame_loading":    model.BooleanToIsShow(req.FrameLoading),
-		"keepalive":        model.BooleanToIsShow(req.Keepalive),
-		"hidden_tag":       model.BooleanToIsShow(req.HiddenTag),
-		"show_link":        model.BooleanToIsShow(req.ShowLink),
-		"show_parent":      model.BooleanToIsShow(req.ShowParent),
-		"icon":             req.Icon,
-		"component":        req.Component,
-		"redirect":         req.Redirect,
-		"auths":            req.Auths,
-		"rank":             req.Rank,
-		"extra_icon":       req.ExtraIcon,
-		"enter_transition": req.EnterTransition,
-		"leave_transition": req.LeaveTransition,
-		"active_path":      req.ActivePath,
-		"is_delete":        pasturePb.IsShow_Ok,
-		"is_show":          pasturePb.IsShow_Ok,
-	}).FirstOrCreate(&model.SystemMenu{}).Error; err != nil {
-		return xerr.WithStack(err)
+		// 更新数据
+		systemMenu.MenuUpdate(req)
+		if err = s.DB.Model(new(model.SystemMenu)).
+			Select("name", "path", "title", "menu_type", "parent_id", "frame_src", "frame_loading",
+				"keepalive", "hidden_tag", "show_link", "show_parent", "icon", "component", "redirect", "auths",
+				"rank", "extra_icon", "enter_transition", "leave_transition", "active_path", "is_delete", "is_show").
+			Where("id = ?", req.Id).
+			Where("pasture_id = ?", userModel.AppPasture.Id).
+			Updates(systemMenu).
+			Error; err != nil {
+			return xerr.WithStack(err)
+		}
+	} else {
+		newSystemMenu := model.NewSystemMenu(userModel.AppPasture.Id, req)
+		if err = s.DB.Model(new(model.SystemMenu)).Create(newSystemMenu).Error; err != nil {
+			return xerr.WithStack(err)
+		}
 	}
+
 	return nil
 }
 
 func (s *StoreEntry) SystemMenuTree(ctx context.Context) (*pasturePb.SystemMenuTreeResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
 	systemMenuList := make([]*model.SystemMenu, 0)
-	if err := s.DB.Model(new(model.SystemMenu)).Where("is_delete = ?", pasturePb.IsShow_Ok).
-		Where("is_show = ?", pasturePb.IsShow_Ok).Find(&systemMenuList).Error; err != nil {
+	if err = s.DB.Model(new(model.SystemMenu)).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		Where("is_delete = ?", pasturePb.IsShow_Ok).
+		Where("is_show = ?", pasturePb.IsShow_Ok).
+		Find(&systemMenuList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 	return &pasturePb.SystemMenuTreeResponse{
@@ -74,12 +77,21 @@ func (s *StoreEntry) SystemMenuTree(ctx context.Context) (*pasturePb.SystemMenuT
 
 // SearchSystemMenuList 菜单列表查询
 func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *pasturePb.SearchMenuRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchMenuResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
 	systemMenuList := make([]*model.SystemMenu, 0)
 	var count int64 = 0
 
-	if err := s.DB.Model(new(model.SystemMenu)).
-		Where("is_delete = ? ", operationPb.IsShow_OK).
-		Order("parent_id").Count(&count).
+	pref := s.DB.Model(new(model.SystemMenu)).
+		Where("pasture_id = ? ", userModel.AppPasture.Id).
+		Where("is_delete = ? ", operationPb.IsShow_OK)
+	if req.Name != "" {
+		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
+	}
+
+	if err = pref.Order("parent_id").Count(&count).
 		Find(&systemMenuList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
@@ -98,25 +110,44 @@ func (s *StoreEntry) SearchSystemMenuList(ctx context.Context, req *pasturePb.Se
 
 // DeleteSystemMenu 删除系统菜单
 func (s *StoreEntry) DeleteSystemMenu(ctx context.Context, menuId int64) error {
-	systemMenu := &model.SystemMenu{Id: menuId}
-	if err := s.DB.First(systemMenu).Error; err != nil {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+
+	systemMenu := &model.SystemMenu{}
+	if err = s.DB.Model(new(model.SystemMenu)).
+		Where("id = ?", menuId).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		First(systemMenu).Error; err != nil {
 		if errors.Is(err, gorm.ErrRecordNotFound) {
 			return xerr.Custom("该数据不存在")
 		}
 		return xerr.WithStack(err)
 	}
 
-	if err := s.DB.Model(systemMenu).Update("is_delete", pasturePb.IsShow_No).Error; err != nil {
+	if err = s.DB.Model(new(model.SystemMenu)).
+		Where("id = ?", menuId).
+		Update("is_delete", pasturePb.IsShow_No).
+		Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
 }
 
 func (s *StoreEntry) SearchSystemDeptList(ctx context.Context, req *pasturePb.SearchDeptRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDeptResponse, error) {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
 	deptList := make([]*model.SystemDept, 0)
 	var count int64 = 0
+	pastureId := userModel.AppPasture.Id
 	pref := s.DB.Model(new(model.SystemDept)).
+		Where("pasture_id = ?", pastureId).
 		Where("is_delete = ?", operationPb.IsShow_OK)
+
 	if req.Name != "" {
 		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
 	}
@@ -125,7 +156,7 @@ func (s *StoreEntry) SearchSystemDeptList(ctx context.Context, req *pasturePb.Se
 		pref.Where("is_show = ?", req.IsShow)
 	}
 
-	if err := pref.Order("sort desc").
+	if err = pref.Order("sort desc").
 		Count(&count).
 		Limit(int(pagination.PageSize)).
 		Offset(int(pagination.PageOffset)).
@@ -133,7 +164,7 @@ func (s *StoreEntry) SearchSystemDeptList(ctx context.Context, req *pasturePb.Se
 		return nil, xerr.WithStack(err)
 	}
 
-	systemUserList, _ := s.SystemUserList(ctx)
+	systemUserList, _ := s.SystemUserList(ctx, pastureId)
 
 	return &pasturePb.SearchDeptResponse{
 		Code: http.StatusOK,
@@ -148,49 +179,68 @@ func (s *StoreEntry) SearchSystemDeptList(ctx context.Context, req *pasturePb.Se
 }
 
 func (s *StoreEntry) SystemDepDelete(ctx context.Context, id int64) error {
-	dept := &model.SystemDept{Id: id}
-	if err := s.DB.First(dept).Error; err != nil {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
 		return xerr.WithStack(err)
 	}
 
+	dept := &model.SystemDept{}
+	if err = s.DB.Model(new(model.SystemDept)).
+		Where("id = ?", id).
+		Where("pasture_id = ?", userModel.AppPasture.Id).
+		First(dept).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+
+	if dept.IsInit == pasturePb.IsShow_Ok {
+		return xerr.Custom("该部门不可删除")
+	}
+
 	if dept.IsShow == pasturePb.IsShow_No {
 		return nil
 	}
-	if err := s.DB.Model(dept).Update("is_delete", operationPb.IsShow_NO).Error; err != nil {
+	if err = s.DB.Model(new(model.SystemDept)).
+		Where("id = ?", id).
+		Update("is_delete", operationPb.IsShow_NO).
+		Error; err != nil {
 		return xerr.WithStack(err)
 	}
 	return nil
 }
 
 func (s *StoreEntry) SystemDeptCreateOrUpdate(ctx context.Context, req *pasturePb.SearchDeptRequest) error {
+	userModel, err := s.GetUserModel(ctx)
+	if err != nil {
+		return xerr.WithStack(err)
+	}
+	pastureId := userModel.AppPasture.Id
 	if req.Id > 0 {
 		systemDept := &model.SystemDept{}
-		if err := s.DB.Model(new(model.SystemDept)).
+		if err = s.DB.Model(new(model.SystemDept)).
 			Where("id = ?", req.Id).
-			Where("pasture_id = ?", req.PastureId).
+			Where("pasture_id = ?", pastureId).
+			Where("is_delete = ?", pasturePb.IsShow_Ok).
 			First(systemDept).Error; err != nil {
-			zaplog.Error("部门信息错误", zap.Any("req", req))
+			zaplog.Error("SystemDeptCreateOrUpdate", zap.Any("req", req), zap.Any("err", err))
+			return xerr.Customf("部门信息错误: %s", err.Error())
 		}
-		if err := s.DB.Model(systemDept).
-			Where("id = ?", req.Id).
-			Where("pasture_id = ?", req.PastureId).
-			Updates(map[string]interface{}{
-				"name":      req.Name,
-				"parent_id": req.ParentId,
-				"sort":      req.Sort,
-				"remarks":   req.Remarks,
-				"is_show":   req.IsShow,
-				"is_delete": req.IsDelete,
-			}).Error; err != nil {
+
+		// 更新部门信息
+		systemDept.DepthUpdate(req)
+		if err = s.DB.Model(new(model.SystemDept)).
+			Where("id = ?", systemDept.Id).
+			Where("pasture_id = ?", pastureId).
+			Select("name", "parent_id", "sort", "remarks", "is_show", "is_delete").
+			Updates(systemDept).Error; err != nil {
 			return xerr.WithStack(err)
 		}
 	} else {
-		newSystemDepth := model.NewSystemDept(req)
-		if err := s.DB.Model(&model.SystemDept{}).Create(newSystemDepth).Error; err != nil {
+		newSystemDepth := model.NewSystemDept(pastureId, req)
+		if err = s.DB.Model(new(model.SystemDept)).
+			Create(newSystemDepth).Error; err != nil {
 			return xerr.WithStack(err)
 		}
 	}
-
 	return nil
 }
 
@@ -200,7 +250,7 @@ func (s *StoreEntry) SearchUserPastureList(ctx context.Context) (*pasturePb.Syst
 		return nil, xerr.WithStack(err)
 	}
 
-	farmList, err := s.FindPastureList(ctx, currentUser.PastureIds)
+	farmList, err := s.FindPastureListByIds(ctx, currentUser.GetPastureIds())
 	if err != nil {
 		return nil, xerr.WithStack(err)
 	}
@@ -286,7 +336,7 @@ func (s *StoreEntry) SearchDepthPastureList(ctx context.Context) []*model.System
 }
 
 // findAllParentDepths 递归查找所有上级部门
-func (s *StoreEntry) findAllParentDepths(ctx context.Context, depths []*model.SystemDept, pastureIds []int64) ([]*model.SystemDept, error) {
+func (s *StoreEntry) findAllParentDepths(ctx context.Context, depths []*model.SystemDept, pastureIds []int32) ([]*model.SystemDept, error) {
 	var allDepths []*model.SystemDept
 	var parentIDs []int64
 	foundDepths := make(map[int64]bool)

+ 8 - 2
module/backend/test_service.go

@@ -171,8 +171,14 @@ func (s *StoreEntry) PastureInit(ctx context.Context, pastureId int64) error {
 			zaplog.Error("PastureInit-NeckRingConfigure", zap.Any("error", err))
 		}
 
-		// 初始化牧场部门数据
-		newSystemDept := model.NewSystemDeptInit(pasture)
+		// 初始化牧场和部门数据
+		newSystemPastureDept := model.NewSystemPastureDeptInit(pasture)
+		if err := tx.Model(new(model.SystemDept)).
+			Create(newSystemPastureDept).Error; err != nil {
+			zaplog.Error("PastureInit-SystemDept", zap.Any("error", err))
+		}
+
+		newSystemDept := model.NewSystemDeptInit(pasture.Id, newSystemPastureDept.Id)
 		if err := tx.Model(new(model.SystemDept)).
 			Create(newSystemDept).Error; err != nil {
 			zaplog.Error("PastureInit-SystemDept", zap.Any("error", err))

+ 1 - 1
module/backend/work.go

@@ -77,7 +77,7 @@ func (s *StoreEntry) OrderCreateOrUpdate(ctx context.Context, req *pasturePb.Wor
 		return xerr.WithStack(err)
 	}
 	workOrderCategoryMap := s.WorkOrderCategoryMap()
-	systemUserList, _ := s.SystemUserList(ctx)
+	systemUserList, _ := s.SystemUserList(ctx, userModel.AppPasture.Id)
 	newWorkOrderMaster := model.NewWorkOrderMaster(userModel.AppPasture.Id, req, userModel.SystemUser, systemUserList, workOrderCategoryMap)
 	if req.Id <= 0 {
 		if err := s.DB.Transaction(func(tx *gorm.DB) error {

+ 2 - 0
module/crontab/cow_cron.go

@@ -83,6 +83,8 @@ func (e *Entry) Indicators() error {
 			pastureIndicatorList = e.FindSalesVolume(pastureList, startTime, endTime)
 		case model.CalvingNumber:
 			pastureIndicatorList = e.FindCalvingNumber(pastureList, startTime, endTime)
+		case model.FattenCattleNumber:
+			pastureIndicatorList = e.FattenCattleNumber(pastureList, startTime, endTime)
 		case model.AdultAbortionRate:
 			pastureIndicatorList = e.FindAdultAbortionRate(pastureList, "adult", startTime, endTime)
 		case model.YouthAbortionRate:

+ 15 - 0
module/crontab/cow_indicators_base.go

@@ -143,6 +143,21 @@ func (e *Entry) FindSalesVolume(pastureList []*model.AppPastureList, startTime,
 	return res
 }
 
+func (e *Entry) FattenCattleNumber(pastureList []*model.AppPastureList, startTime, endTime int64) map[int64]string {
+	res := make(map[int64]string)
+	for _, pasture := range pastureList {
+		var fattenCattleNumber int64
+		if err := e.DB.Model(new(model.Cow)).
+			Select("COUNT(id) as fatten_cattle_number").
+			Where("pasture_id = ?", pasture.Id).
+			Where("purpose_kind = ?", pasturePb.Purpose_Fatten).
+			Count(&fattenCattleNumber).Error; err != nil {
+			zaplog.Error("FindFattenCattleNumber", zap.Any("err", err), zap.Any("pasture", pasture))
+		}
+	}
+	return res
+}
+
 // UpdatePastureIndicators 指标收集,不存在时创建,存在时更新
 func (e *Entry) UpdatePastureIndicators(pastureId int64, indicatorsDetails *model.IndicatorsDetails, dateTime int64, value string) {
 	date := time.Unix(dateTime, 0).Local().Format(model.LayoutMonth)

+ 19 - 1
module/crontab/cow_neck_ring_error.go

@@ -57,10 +57,12 @@ func (e *Entry) CowNeckRingError(pastureId int64) {
 	updateNeckRingMap := make(map[int64]*model.NeckRingStats)
 	errorMap := e.NeckRingErrorMap()
 	for _, neckRing := range neckRingList {
+		var info bool
 		// 佩戴后无信号
 		c1 := e.NeckRingErrorOfNoSignal(pastureId, neckRing, int64(habitMinId), yesterday)
 		if c1 > 0 {
 			updateNeckRingMap[neckRing.Id] = &model.NeckRingStats{
+				Status:      pasturePb.IsShow_No,
 				ErrorKind:   c1,
 				ErrorReason: errorMap[c1],
 				Describe:    "",
@@ -71,6 +73,7 @@ func (e *Entry) CowNeckRingError(pastureId int64) {
 		c2 := e.NeckRingErrorOfSuspectedFallOffAndLowBattery(pastureId, neckRing, int64(habitMinId), yesterday)
 		if c2 > 0 {
 			updateNeckRingMap[neckRing.Id] = &model.NeckRingStats{
+				Status:      pasturePb.IsShow_No,
 				ErrorKind:   c2,
 				ErrorReason: errorMap[c2],
 				Describe:    "",
@@ -81,6 +84,7 @@ func (e *Entry) CowNeckRingError(pastureId int64) {
 		c3 := e.NeckRingErrorOfReceivingLess(pastureId, neckRing, int64(habitMinId), int64(originalMinId), yesterday)
 		if c3 > 0 {
 			updateNeckRingMap[neckRing.Id] = &model.NeckRingStats{
+				Status:      pasturePb.IsShow_No,
 				ErrorKind:   c3,
 				ErrorReason: errorMap[c3],
 				Describe:    "",
@@ -91,11 +95,25 @@ func (e *Entry) CowNeckRingError(pastureId int64) {
 		c4 := e.NeckRingErrorOfDataLatency(pastureId, neckRing, int64(habitMinId), yesterday)
 		if c4 > 0 {
 			updateNeckRingMap[neckRing.Id] = &model.NeckRingStats{
+				Status:      pasturePb.IsShow_No,
 				ErrorKind:   c4,
 				ErrorReason: errorMap[c4],
 				Describe:    "",
 			}
 		}
+
+		if c1 > 0 || c2 > 0 || c3 > 0 || c4 > 0 {
+			info = true
+		}
+
+		if !info {
+			updateNeckRingMap[neckRing.Id] = &model.NeckRingStats{
+				Status:      pasturePb.IsShow_Ok,
+				ErrorKind:   0,
+				ErrorReason: "",
+				Describe:    "",
+			}
+		}
 	}
 
 	if len(updateNeckRingMap) > 0 {
@@ -103,7 +121,7 @@ func (e *Entry) CowNeckRingError(pastureId int64) {
 			if err := e.DB.Model(new(model.NeckRing)).
 				Where("id = ?", id).
 				Updates(map[string]interface{}{
-					"status":       pasturePb.IsShow_No,
+					"status":       v.Status,
 					"error_kind":   v.ErrorKind,
 					"error_reason": v.ErrorReason,
 					"describe":     v.Describe,

+ 0 - 6
util/util_test.go

@@ -535,11 +535,5 @@ type WeeklyActiveModel struct {
 }
 
 func Test_demo(t *testing.T) {
-	for _, frameId := range FrameIdSlice {
-		if frameId%10 == 8 {
-			continue
-		}
-		fmt.Println(GenerateRandomNumber(int(frameId)))
-	}
 
 }