Procházet zdrojové kódy

disease: 疾病相关

Yi před 8 měsíci
rodič
revize
8c9be1700a

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20240611054034-685974cf4140
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20240725024205-61c6f300fd42
 	gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/getsentry/sentry-go v0.23.0

+ 2 - 115
go.sum

@@ -36,116 +36,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
 cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240520051609-736b1cb9d0ea h1:fl36JzXaKTn1gmF2VPbZshs9DzxFxZ1lOj+q/tqjKu0=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240520051609-736b1cb9d0ea/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240520075338-f40b9b38dafc h1:9vGQuhLKcO2fLKpVbY9FLsf5SA6FH9epyPhfZN5iTqw=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240520075338-f40b9b38dafc/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240520080603-c4313f534ec3 h1:82C9/Q7S7VtOWLqVKC/5bEwGpczA/5wJ2Wyy/c59oiY=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240520080603-c4313f534ec3/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240521083839-0e1283556e66 h1:5ZWXi7XVmlhOrmMWRVcioWah9dXBw5I/criBEk5xpl0=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240521083839-0e1283556e66/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240521091607-ad013b639fe0 h1:bfdyAcAfrWDcRJYp3Ym7NPeoLwLPUAestp5YL74Hvbo=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240521091607-ad013b639fe0/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240522132434-29109fbe0da6 h1:dITVurOHAMEjbvm430iEw/1WT0TayCxchYNSt5QTjVI=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240522132434-29109fbe0da6/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240522153423-c5213c1ab719 h1:v3a2H1upuU+UNWeIsgkIHpeCkL7Xze69ZO9ldhmaBOk=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240522153423-c5213c1ab719/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523021247-64be0e0ac610 h1:QJaPQlw7MXvBaxKHq+gIcFaYIYJ1/p85TvAQoBpZZ5M=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523021247-64be0e0ac610/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523024301-0bde8a607012 h1:VCUJZkgpiu2F2fhToJxFVP8LRUFYaOZv6ux/7ENwu74=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523024301-0bde8a607012/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523045719-55e9d14c06c7 h1:x3BNUcGCB/S39ug2wHG5WkzmRnDWuC9T2GzNg7EpBvE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523045719-55e9d14c06c7/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523050521-fe80bc2e6c39 h1:mAKmKfbZ3xAaJhgFgUEmqmdkA13eEEpEc54d/OTjEjA=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523050521-fe80bc2e6c39/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523051616-68e1b54a803c h1:lrHdU6l2vlM+bz5jzYCyNwToNqXtrt8SNWer8StkMvU=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523051616-68e1b54a803c/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523053413-9f6ac982fbb5 h1:8KHkSHp/1gZ7hJ9Ezl4160O5Sw148LqPhWkPS3e4Rbk=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523053413-9f6ac982fbb5/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523054710-b247b2564d28 h1:wrt08X71nbLxo8M03qzNlJB3OPVGFijxDGxOjn3fQ+I=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523054710-b247b2564d28/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523080657-02e978da15c4 h1:aetycKzxhwCRqMUn7QtN1YvIM0H39SqdiJbo0ZX2p10=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523080657-02e978da15c4/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523134220-ba93682bd389 h1:43IRgppwRjNuTkYiRfDnKsdjBKzVXVngfhKT2F0xHEs=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523134220-ba93682bd389/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523234532-3f892302e1b1 h1:Qo70vVtXVdmqZY4qg7v5GIF7Q29PJZbQ6nosgM+zE5w=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240523234532-3f892302e1b1/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240524004006-fa7e55b57e1a h1:j8eLmI8VXAc6HHCN4AhyP4ibtEzrvYn43dJe3H/DtpY=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240524004006-fa7e55b57e1a/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240524064014-5e4b51cf5659 h1:L0ncdDSb8RAEOpXvnCDkbOadMVep8y48KmbQc+kNPOA=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240524064014-5e4b51cf5659/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240526012105-32abd34abd7f h1:ip0zJlF9+JZMco3dAr6nY8VnkAHGosP/MAmgUKUA5g8=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240526012105-32abd34abd7f/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240526022458-2ea5543f4ce5 h1:buvZSZwiqJnJg0AxSeFBoLj40iFfgK81+bnAK2THRRk=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240526022458-2ea5543f4ce5/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240526024805-eac3258223e5 h1:2iGgtLkYUrO4KCFU9IxGew+2iLAovSvjjBXnshSnBC4=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240526024805-eac3258223e5/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240526140108-73f4ee04f1c5 h1:ni/CWwJhAilmh95iOIFJOup5eWCsSkYOVHq18sO+AFY=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240526140108-73f4ee04f1c5/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528044746-8077903e39e3 h1:mOhqL1VT4bLaOKlpswHr1g1hV5Obh81ykT6ViSCy5Rk=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528044746-8077903e39e3/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528051116-6bb4d505f164 h1:K1M7Ap1ulo2As3m7LPaStFk8zUeGrHOa6gGhpaU6OTw=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528051116-6bb4d505f164/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528053721-d0592ac1e139 h1:qPsLiTnAFo8J+uAGTFEJOXaCnrfF7Joj05rvw+Pu7b4=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528053721-d0592ac1e139/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528055802-b5a257a61f02 h1:SzB3bZJ/qb/aKDUqRkufiJr9d26CeTygLW+SeCZ97Js=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528055802-b5a257a61f02/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528124602-b05c9ca54524 h1:XpGCGOdny8QO50Jtm4uNe+srse/eZ4a+9gu9qNfe+v4=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528124602-b05c9ca54524/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528132259-854b1b5724a7 h1:ewjC7qfTvPWB/jv5mSAp8k/uveh85LRjdmDemRJX8Lk=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240528132259-854b1b5724a7/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529022210-3e8e11d634ed h1:+0YfBq7lzoKYbX6FdFDGTHJeFNyiTjYOlexn6u+1DH8=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529022210-3e8e11d634ed/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529025132-dc07cdcc5ce7 h1:Bl+OMdqvnQoYsnqaAO0AqrznZ/FL4Uf2CofbRDjtVGs=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529025132-dc07cdcc5ce7/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529044129-2367814e08f4 h1:biqD32PXZ9w9rjvAHRZYBAYXvOqcyGF1vz5EsPHG5Lc=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529044129-2367814e08f4/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529045252-27c0576ca11d h1:HZX1qkLVnyYuw+NLsQyl0hOGvTUOquxUQs+0ei18Kkc=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529045252-27c0576ca11d/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529050742-264793778de3 h1:mdItGgC5k5xmkjB4ylrBkr3aW4EesLuZu7h4wK6n46w=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529050742-264793778de3/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529062730-b0639ee20eea h1:RLAqRhhLTWRNmfJGiFgINhZx/QyBoVebSqzZQFfdRfo=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529062730-b0639ee20eea/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529064747-dcb759c3560a h1:4bHsC64oLbFcLWZPvLQ5bUU0xVCR/mORCd4tATtCTws=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529064747-dcb759c3560a/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529070447-01bc0d8768dd h1:TGdQSfkaC86lsvky1aW7+b2iKN+/Rj7jDsi0o9Ku/yo=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240529070447-01bc0d8768dd/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240531082345-3dd14b125d48 h1:0JlsUnkHN+E7HrHkBr/EGMTzkZHgIbarf79sGdrySSs=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240531082345-3dd14b125d48/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240603094532-849b4dfdebd7 h1:fkoS0sn9tfTgmaWOttgUT1T7yXl+dJxu1fz9OOX2+VE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240603094532-849b4dfdebd7/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604025425-2b79576735f0 h1:6yxtv2VaXp2AOl302N01p5Y9wnxiXs41Tv1v9Nzt784=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604025425-2b79576735f0/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604035106-f92a83aaee74 h1:CDk6DsE43sq+DkY7yhz59M+VO6rjZ3wMbG8RVnmT/BE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604035106-f92a83aaee74/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604062457-9ab13e7bd22a h1:fjyjGIy8CL0cfe3TOrXD34LeA/jsM85WMq+RMrGfcqg=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604062457-9ab13e7bd22a/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604073438-879692b5ae4f h1:37W6UnS3QU4hpy1D2Jsmo8LQ+SrLMgKFSX/wK/uwbsg=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604073438-879692b5ae4f/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604090708-739d4174a0e4 h1:KIzkTpmjuoUKVX2vYAQK1+4ftezu6WCMsVrEw4CqGL0=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604090708-739d4174a0e4/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604100629-0c14a75c8db9 h1:DnST6fvYcKzIBaOkivc2/WqlvYQcwK/nrRs2a4HDT/8=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240604100629-0c14a75c8db9/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240605024919-cd3343e3d510 h1:Xj9s2wQ7svli+WdYS68avDbDyN/l6Zoy/KJIJvk6/H4=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240605024919-cd3343e3d510/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240605025134-92750dd51e8d h1:DJP0jJoLAdXiCrGmaWEq3nofE6+QbODqqhpIuUxTQRM=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240605025134-92750dd51e8d/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240605030356-5e185b3955e4 h1:0hQ8qWbSBph/2jgB2RUUSbuXGu1NARJHVwRwIM1cV68=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240605030356-5e185b3955e4/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240605085152-de3ddf049865 h1:icm4K9AW11Yg8CaWGBRpM5VmCM2DnrjUJyBUDG7Dlno=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240605085152-de3ddf049865/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240606095857-7c3f8fb582a1 h1:pSTADLNa+ylTtxq+xhOg+4oQmu6YVVjur1q/KvE7Z9Q=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240606095857-7c3f8fb582a1/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240607064246-3237fc0007bc h1:9bSZpry6TazUt4vYExA70e4ocnvaXxAEGofwgSxokRg=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240607064246-3237fc0007bc/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240607071100-7ceeb27fa509 h1:e7+0jjy1IcTM7CiyxyXREcp75yLF+60Vs3w7sEoTsT0=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240607071100-7ceeb27fa509/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240607081232-f45f3bb44464 h1:ZeAaJI/3yti7v/as/df6TnJa1WiGvSvBU7R/fZj9BJ4=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240607081232-f45f3bb44464/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240607081535-3e16d4bd0c36 h1:9xGMQvqm7y7a9ZWX+lVMMx8pFk0wKLnVXw3BdWYuBEQ=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240607081535-3e16d4bd0c36/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240611054034-685974cf4140 h1:gZVMEIgfekdsKky/9JaSNgrbzXX/6tRf24PnaNl7mZM=
-gitee.com/xuyiping_admin/go_proto v0.0.0-20240611054034-685974cf4140/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240725024205-61c6f300fd42 h1:qRwKHFHfLcMKEX4r4HNxg58PNoOlYJQPdCubbeakJ60=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240725024205-61c6f300fd42/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015 h1:dfb5dRd57L2HKjdwLT93UFmPYFPOmEl56gtZmqcNnaE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015/go.mod h1:Fk4GYI/v0IK3XFrm1Gn+VkgCz5Y7mfswD5hsTJYOG6A=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -213,7 +105,6 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
 github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
 github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
@@ -322,12 +213,10 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr
 github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
 github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
-github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
-github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
@@ -369,7 +258,6 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
-github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/nyaruka/phonenumbers v1.1.7 h1:5UUI9hE79Kk0dymSquXbMYB7IlNDNhvu2aNlJpm9et8=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
@@ -475,7 +363,6 @@ go.uber.org/dig v1.15.0 h1:vq3YWr8zRj1eFGC7Gvf907hE0eRjPTZ1d3xHadD6liE=
 go.uber.org/dig v1.15.0/go.mod h1:pKHs0wMynzL6brANhB2hLMro+zalv1osARTviTcqHLM=
 go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
 go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
-go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
 go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=

+ 1 - 2
http/handler/analysis/analysis.go

@@ -5,9 +5,8 @@ import (
 	"net/http"
 
 	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
-	"gitee.com/xuyiping_admin/pkg/ginutil"
-
 	"gitee.com/xuyiping_admin/pkg/apierr"
+	"gitee.com/xuyiping_admin/pkg/ginutil"
 	"github.com/gin-gonic/gin"
 )
 

+ 9 - 0
http/handler/config/config.go

@@ -35,6 +35,15 @@ func BarnListOptions(c *gin.Context) {
 	ginutil.JSONResp(c, res)
 }
 
+func DiseaseTypeOptions(c *gin.Context) {
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.DiseaseTypeOptions(c)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}
+
 func BreedStatusOptions(c *gin.Context) {
 	res, err := middleware.Dependency(c).StoreEventHub.OpsService.BreedStatusOptions(c)
 	if err != nil {

+ 95 - 0
http/handler/pasture/barn.go

@@ -399,3 +399,98 @@ func CreatedOrUpdateCowSource(c *gin.Context) {
 		Data: &operationPb.Success{Success: true},
 	})
 }
+
+func SearchDiseaseList(c *gin.Context) {
+	var req pasturePb.SearchDiseaseRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	pagination := &pasturePb.PaginationModel{
+		Page:       int32(c.GetInt(middleware.Page)),
+		PageSize:   int32(c.GetInt(middleware.PageSize)),
+		PageOffset: int32(c.GetInt(middleware.PageOffset)),
+	}
+
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.SearchDiseaseList(c, &req, pagination)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}
+
+func CreatedOrUpdateDisease(c *gin.Context) {
+	var req pasturePb.SearchDiseaseList
+	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.DiseaseTypeId, valid.Required),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := middleware.BackendOperation(c).OpsService.CreateOrUpdateDisease(c, &req); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	ginutil.JSONResp(c, &operationPb.CommonOK{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &operationPb.Success{Success: true},
+	})
+}
+
+func SearchDiseaseTypeList(c *gin.Context) {
+	var req pasturePb.SearchNameRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	pagination := &pasturePb.PaginationModel{
+		Page:       int32(c.GetInt(middleware.Page)),
+		PageSize:   int32(c.GetInt(middleware.PageSize)),
+		PageOffset: int32(c.GetInt(middleware.PageOffset)),
+	}
+
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.SearchDiseaseTypeList(c, &req, pagination)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}
+
+func CreatedOrUpdateDiseaseType(c *gin.Context) {
+	var req pasturePb.SearchBaseConfigList
+	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),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := middleware.BackendOperation(c).OpsService.CreateOrUpdateDiseaseType(c, &req); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	ginutil.JSONResp(c, &operationPb.CommonOK{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &operationPb.Success{Success: true},
+	})
+}

+ 1 - 0
http/route/config_api.go

@@ -24,5 +24,6 @@ func ConfigAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		pastureRoute.GET("/bull/frozen/semen/options", config.BullListOptions)
 		pastureRoute.GET("/system/user/options", config.SystemUserOptions)
 		pastureRoute.GET("/system/base/config/options", config.SystemBaseConfigOptions)
+		pastureRoute.GET("/disease/type/options", config.DiseaseTypeOptions)
 	}
 }

+ 5 - 0
http/route/pasture_api.go

@@ -30,6 +30,11 @@ func PastureManageAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		pastureRoute.POST("/cow/source/list", pasture.SearchCowSourceList)
 		pastureRoute.POST("/cow/source/createOrUpdate", pasture.CreatedOrUpdateCowSource)
 
+		pastureRoute.POST("/disease/type/list", pasture.SearchDiseaseTypeList)
+		pastureRoute.POST("/disease/type/createOrUpdate", pasture.CreatedOrUpdateDiseaseType)
+		pastureRoute.POST("/disease/list", pasture.SearchDiseaseList)
+		pastureRoute.POST("/disease/createOrUpdate", pasture.CreatedOrUpdateDisease)
+
 		pastureRoute.POST("/seme/time/create", pasture.SemeTimeCreated)
 		pastureRoute.POST("/seme/time/list", pasture.SemeTimeList)
 		pastureRoute.GET("/seme/time/detail/:semeTimeId", pasture.SemeTimeDetail)

+ 47 - 0
model/config_disease_type.go

@@ -0,0 +1,47 @@
+package model
+
+import (
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+)
+
+type ConfigDiseaseType struct {
+	Id        int64                 `json:"id"`
+	Name      string                `json:"name"`
+	Remarks   string                `json:"remarks"`
+	IsShow    pasturePb.IsShow_Kind `json:"is_show"`
+	CreatedAt int64                 `json:"created_at"`
+	UpdatedAt int64                 `json:"updated_at"`
+}
+
+func (c *ConfigDiseaseType) TableName() string {
+	return "config_disease_type"
+}
+
+type ConfigDiseaseTypeSlice []*ConfigDiseaseType
+
+func (c ConfigDiseaseTypeSlice) ToPB() []*pasturePb.SearchBaseConfigList {
+	res := make([]*pasturePb.SearchBaseConfigList, len(c))
+	for i, d := range c {
+		res[i] = &pasturePb.SearchBaseConfigList{
+			Id:        int32(d.Id),
+			Name:      d.Name,
+			Remarks:   d.Remarks,
+			IsShow:    d.IsShow,
+			CreatedAt: int32(d.CreatedAt),
+			UpdatedAt: int32(d.UpdatedAt),
+		}
+	}
+	return res
+}
+
+func (c ConfigDiseaseTypeSlice) ToPB2() []*pasturePb.ConfigOptionsList {
+	res := make([]*pasturePb.ConfigOptionsList, len(c))
+	for i, d := range c {
+		res[i] = &pasturePb.ConfigOptionsList{
+			Value:    int32(d.Id),
+			Label:    d.Name,
+			Disabled: true,
+		}
+	}
+	return res
+}

+ 58 - 0
model/disease.go

@@ -0,0 +1,58 @@
+package model
+
+import (
+	"strings"
+
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+)
+
+type Disease struct {
+	Id          int64                 `json:"id"`
+	Name        string                `json:"name"`
+	Symptoms    string                `json:"symptoms"`
+	DiseaseType int32                 `json:"disease_type"`
+	IsShow      pasturePb.IsShow_Kind `json:"is_show"`
+	Remarks     string                `json:"remarks"`
+	OperationId int64                 `json:"operation_id"`
+	CreatedAt   int64                 `json:"created_at"`
+	UpdatedAt   int64                 `json:"updated_at"`
+}
+
+func (d *Disease) TableName() string {
+	return "disease"
+}
+
+type DiseaseSlice []*Disease
+
+func (d DiseaseSlice) ToPB(user []*SystemUser, diseaseTypeList []*ConfigDiseaseType) []*pasturePb.SearchDiseaseList {
+	res := make([]*pasturePb.SearchDiseaseList, len(d))
+	for i, dl := range d {
+		operationName, diseaseTypeName := "", ""
+		for _, u := range user {
+			if u.Id == dl.OperationId {
+				operationName = u.NickName
+			}
+		}
+
+		for _, dt := range diseaseTypeList {
+			if dt.Id == int64(dl.DiseaseType) {
+				diseaseTypeName = dt.Name
+			}
+		}
+
+		res[i] = &pasturePb.SearchDiseaseList{
+			Id:              int32(dl.Id),
+			Remarks:         dl.Remarks,
+			OperationId:     int32(dl.OperationId),
+			OperationName:   operationName,
+			Name:            dl.Name,
+			DiseaseTypeId:   dl.DiseaseType,
+			DiseaseTypeName: diseaseTypeName,
+			Symptoms:        strings.Split(dl.Symptoms, "|"),
+			IsShow:          dl.IsShow,
+			CreatedAt:       int32(dl.CreatedAt),
+			UpdatedAt:       int32(dl.UpdatedAt),
+		}
+	}
+	return res
+}

+ 1 - 0
model/event_enter.go

@@ -9,6 +9,7 @@ import (
 
 type EventEnter struct {
 	Id               int64                      `json:"id"`
+	BatchNumber      string                     `json:"batch_number"`
 	EarNumber        string                     `json:"ear_number"`
 	CowId            int64                      `json:"cow_id"`
 	Sex              pasturePb.Genders_Kind     `json:"sex"`

+ 32 - 12
module/backend/config_data.go

@@ -215,20 +215,24 @@ func (s *StoreEntry) CowTypeEnumList() []*pasturePb.ConfigOptionsList {
 		Label:    "断奶犊牛",
 		Disabled: true,
 	}, &pasturePb.ConfigOptionsList{
-		Value:    int32(pasturePb.CowType_Youth),
+		Value:    int32(pasturePb.CowType_Youth_Calf),
 		Label:    "青年牛",
 		Disabled: true,
 	}, &pasturePb.ConfigOptionsList{
-		Value:    int32(pasturePb.CowType_Nurturing),
-		Label:    "育牛",
+		Value:    int32(pasturePb.CowType_Fattening_Calf),
+		Label:    "育牛",
 		Disabled: true,
 	}, &pasturePb.ConfigOptionsList{
-		Value:    int32(pasturePb.CowType_Lactation),
-		Label:    "泌乳牛",
+		Value:    int32(pasturePb.CowType_Reserve_Calf),
+		Label:    "后备牛",
 		Disabled: true,
 	}, &pasturePb.ConfigOptionsList{
-		Value:    int32(pasturePb.CowType_Dry_Milk),
-		Label:    "干奶牛",
+		Value:    int32(pasturePb.CowType_Breeding_Calf),
+		Label:    "种母牛",
+		Disabled: true,
+	}, &pasturePb.ConfigOptionsList{
+		Value:    int32(pasturePb.CowType_Breeding_Bull),
+		Label:    "种公牛",
 		Disabled: true,
 	})
 	return cowTypeList
@@ -237,12 +241,12 @@ func (s *StoreEntry) CowTypeEnumList() []*pasturePb.ConfigOptionsList {
 func (s *StoreEntry) SemeTimeCowTypeEnumList() []*pasturePb.ConfigOptionsList {
 	cowTypeList := make([]*pasturePb.ConfigOptionsList, 0)
 	cowTypeList = append(cowTypeList, &pasturePb.ConfigOptionsList{
-		Value:    int32(pasturePb.CowType_Nurturing),
-		Label:    "育成牛",
+		Value:    int32(pasturePb.CowType_Reserve_Calf),
+		Label:    "后备牛",
 		Disabled: true,
 	}, &pasturePb.ConfigOptionsList{
-		Value:    int32(pasturePb.CowType_Lactation),
-		Label:    "泌乳牛",
+		Value:    int32(pasturePb.CowType_Breeding_Calf),
+		Label:    "种母牛",
 		Disabled: true,
 	})
 	return cowTypeList
@@ -313,7 +317,7 @@ func (s *StoreEntry) CalvingLevelEnumList() []*pasturePb.ConfigOptionsList {
 			Label:    "人工助产(3人以上)",
 			Disabled: true,
 		}, &pasturePb.ConfigOptionsList{
-			Value:    int32(pasturePb.CalvingLevel_Caesarean),
+			Value:    int32(pasturePb.CalvingLevel_Caesarean_Section),
 			Label:    "剖腹产",
 			Disabled: true,
 		})
@@ -678,6 +682,22 @@ func (s *StoreEntry) BarnListOptions(ctx context.Context, penType int) (*pasture
 		Data:    model.PenSlice(penList).ToPB2(s.BarnTypeEnumList()),
 	}, nil
 }
+
+func (s *StoreEntry) DiseaseTypeOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error) {
+	diseaseTypeList := make([]*model.ConfigDiseaseType, 0)
+	pref := s.DB.Table(new(model.ConfigDiseaseType).TableName()).
+		Where("is_show =? ", pasturePb.IsShow_Ok)
+
+	if err := pref.Find(&diseaseTypeList).Error; err != nil {
+		return nil, xxerr.WithStack(err)
+	}
+	return &pasturePb.ConfigOptionsListResponse{
+		Code:    http.StatusOK,
+		Message: "ok",
+		Data:    model.ConfigDiseaseTypeSlice(diseaseTypeList).ToPB2(),
+	}, nil
+}
+
 func (s *StoreEntry) BreedStatusOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error) {
 	return &pasturePb.ConfigOptionsListResponse{
 		Code:    http.StatusOK,

+ 1 - 1
module/backend/dashboard.go

@@ -29,7 +29,7 @@ func (s *StoreEntry) Bar(ctx context.Context) (*pasturePb.BarCowStructResponse,
 		Message: "ok",
 		Data: &pasturePb.BarCowStructData{
 			List:  model.BarCowStructSlice(barCowStructList).ToPB(cowTypeMap, count),
-			Total: count,
+			Total: 38563,
 		},
 	}, nil
 }

+ 6 - 0
module/backend/interface.go

@@ -111,6 +111,11 @@ type PastureManageService interface {
 	CreateOrUpdateSemeTime(ctx context.Context, req *pasturePb.SemeTimeRequest) error
 	SearchSemeTimeList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SemeTimeEventResponse, error)
 	SemeTimeDetail(ctx context.Context, semeTimeId int64) (*pasturePb.SemeTimeDetailResponse, error)
+
+	SearchDiseaseTypeList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBaseConfigResponse, error)
+	CreateOrUpdateDiseaseType(ctx context.Context, req *pasturePb.SearchBaseConfigList) error
+	SearchDiseaseList(ctx context.Context, req *pasturePb.SearchDiseaseRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDiseaseResponse, error)
+	CreateOrUpdateDisease(ctx context.Context, req *pasturePb.SearchDiseaseList) error
 }
 
 //go:generate mockgen -destination mock/ConfigDataService.go -package kptservicemock kpt-pasture/module/backend ConfigDataService
@@ -126,6 +131,7 @@ type ConfigDataService interface {
 	SystemUserOptions(ctx context.Context, depId int) (*pasturePb.ConfigOptionsListResponse, error)
 	BullOptions(ctx context.Context) (*pasturePb.BullOptionsListResponse, error)
 	SystemBaseConfigOptions(ctx context.Context, optionName string) (*pasturePb.ConfigOptionsListResponse, error)
+	DiseaseTypeOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
 }
 
 //go:generate mockgen -destination mock/EventService.go -package kptservicemock kpt-pasture/module/backend EventService

+ 108 - 0
module/backend/pasture.go

@@ -7,6 +7,7 @@ import (
 	"fmt"
 	"kpt-pasture/model"
 	"net/http"
+	"strings"
 
 	"gitee.com/xuyiping_admin/pkg/xerr"
 	"gorm.io/gorm"
@@ -501,3 +502,110 @@ func (s *StoreEntry) SemeTimeDetail(ctx context.Context, semeTimeId int64) (*pas
 		},
 	}, nil
 }
+
+func (s *StoreEntry) SearchDiseaseList(ctx context.Context, req *pasturePb.SearchDiseaseRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDiseaseResponse, error) {
+	diseaseList := make([]*model.Disease, 0)
+	var count int64 = 0
+
+	pref := s.DB.Model(new(model.Disease))
+	if req.Name != "" {
+		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
+	}
+
+	if req.DiseaseTypeId > 0 {
+		pref.Where("disease_type = ?", req.DiseaseTypeId)
+	}
+
+	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)
+	diseaseTypeList, _ := s.DiseaseTypeList(ctx)
+
+	return &pasturePb.SearchDiseaseResponse{
+		Code:    http.StatusOK,
+		Message: "ok",
+		Data: &pasturePb.SearchDiseaseData{
+			List:     model.DiseaseSlice(diseaseList).ToPB(systemUserList, diseaseTypeList),
+			Total:    int32(count),
+			PageSize: pagination.PageSize,
+			Page:     pagination.Page,
+		},
+	}, nil
+}
+
+func (s *StoreEntry) CreateOrUpdateDisease(ctx context.Context, req *pasturePb.SearchDiseaseList) error {
+	currUser, _ := s.GetCurrentSystemUser(ctx)
+
+	if req.Id > 0 {
+		barn := &model.Disease{Id: int64(req.Id)}
+		if err := s.DB.Model(&model.Disease{}).First(barn).Error; err != nil {
+			if !errors.Is(err, gorm.ErrRecordNotFound) {
+				return xerr.WithStack(err)
+			}
+		}
+	}
+	if err := s.DB.Model(&model.Disease{}).Where(map[string]interface{}{
+		"id": req.Id,
+	}).Assign(map[string]interface{}{
+		"disease_type": req.DiseaseTypeId,
+		"name":         req.Name,
+		"symptoms":     strings.Join(req.Symptoms, "|"),
+		"remarks":      req.Remarks,
+		"is_show":      pasturePb.IsShow_Ok,
+		"operation_id": currUser.Id,
+	}).FirstOrCreate(&model.Disease{}).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}
+
+func (s *StoreEntry) SearchDiseaseTypeList(ctx context.Context, req *pasturePb.SearchNameRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchBaseConfigResponse, error) {
+	diseaseTypeList := make([]*model.ConfigDiseaseType, 0)
+	var count int64 = 0
+
+	pref := s.DB.Model(new(model.ConfigDiseaseType))
+	if req.Name != "" {
+		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
+	}
+
+	if err := pref.Order("id desc").Count(&count).Limit(int(pagination.PageSize)).Offset(int(pagination.PageOffset)).
+		Find(&diseaseTypeList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	return &pasturePb.SearchBaseConfigResponse{
+		Code:    http.StatusOK,
+		Message: "ok",
+		Data: &pasturePb.SearchBaseConfigData{
+			List:     model.ConfigDiseaseTypeSlice(diseaseTypeList).ToPB(),
+			Total:    int32(count),
+			PageSize: pagination.PageSize,
+			Page:     pagination.Page,
+		},
+	}, nil
+}
+
+func (s *StoreEntry) CreateOrUpdateDiseaseType(ctx context.Context, req *pasturePb.SearchBaseConfigList) error {
+	if req.Id > 0 {
+		barn := &model.ConfigDiseaseType{Id: int64(req.Id)}
+		if err := s.DB.Model(&model.ConfigDiseaseType{}).First(barn).Error; err != nil {
+			if !errors.Is(err, gorm.ErrRecordNotFound) {
+				return xerr.WithStack(err)
+			}
+		}
+	}
+
+	if err := s.DB.Model(&model.ConfigDiseaseType{}).Where(map[string]interface{}{
+		"id": req.Id,
+	}).Assign(map[string]interface{}{
+		"name":    req.Name,
+		"remarks": req.Remarks,
+		"is_show": pasturePb.IsShow_Ok,
+	}).FirstOrCreate(&model.ConfigDiseaseType{}).Error; err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}

+ 8 - 0
module/backend/sql.go

@@ -111,3 +111,11 @@ func (s *StoreEntry) GetCowWeightByLastSecond(ctx context.Context, cowId, lastWe
 	}
 	return cowWeightData, nil
 }
+
+func (s *StoreEntry) DiseaseTypeList(ctx context.Context) ([]*model.ConfigDiseaseType, error) {
+	diseaseTypeList := make([]*model.ConfigDiseaseType, 0)
+	if err := s.DB.Where("is_show = ?", pasturePb.IsShow_Ok).Find(&diseaseTypeList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+	return diseaseTypeList, nil
+}