diff --git a/rpc/equipment/equipment.pb b/rpc/equipment/equipment.pb index 82a8a69..79e8cbe 100644 Binary files a/rpc/equipment/equipment.pb and b/rpc/equipment/equipment.pb differ diff --git a/rpc/equipment/equipment.proto b/rpc/equipment/equipment.proto index 426a85a..1381831 100644 --- a/rpc/equipment/equipment.proto +++ b/rpc/equipment/equipment.proto @@ -134,7 +134,7 @@ message ApiBeansAddRequest { int64 id = 2; } message ApiMaskAddRequest { - string face_mask_id = 1; + string facial_mask_id = 1; string produce_time = 2; int64 quality_guarantee_period= 3; int32 is_on_trial = 4; @@ -158,7 +158,8 @@ message ApiMaskUseRequest { string efficiency = 7; string resistance = 8; string score = 9; - int32 store_id = 10; + int64 store_id = 10; + int64 user_id = 11; } message ApiMaskUsedItemsRequest { string facial_mask_id = 1; diff --git a/rpc/equipment/pb/equipment.pb.go b/rpc/equipment/pb/equipment.pb.go index fb5983e..ccc6810 100644 --- a/rpc/equipment/pb/equipment.pb.go +++ b/rpc/equipment/pb/equipment.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v3.19.4 +// protoc v4.25.8 // source: equipment/equipment.proto package equipment @@ -1300,7 +1300,7 @@ func (x *ApiBeansAddRequest) GetId() int64 { type ApiMaskAddRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - FaceMaskId string `protobuf:"bytes,1,opt,name=face_mask_id,json=faceMaskId,proto3" json:"face_mask_id,omitempty"` + FacialMaskId string `protobuf:"bytes,1,opt,name=facial_mask_id,json=facialMaskId,proto3" json:"facial_mask_id,omitempty"` ProduceTime string `protobuf:"bytes,2,opt,name=produce_time,json=produceTime,proto3" json:"produce_time,omitempty"` QualityGuaranteePeriod int64 `protobuf:"varint,3,opt,name=quality_guarantee_period,json=qualityGuaranteePeriod,proto3" json:"quality_guarantee_period,omitempty"` IsOnTrial int32 `protobuf:"varint,4,opt,name=is_on_trial,json=isOnTrial,proto3" json:"is_on_trial,omitempty"` @@ -1346,9 +1346,9 @@ func (*ApiMaskAddRequest) Descriptor() ([]byte, []int) { return file_equipment_equipment_proto_rawDescGZIP(), []int{19} } -func (x *ApiMaskAddRequest) GetFaceMaskId() string { +func (x *ApiMaskAddRequest) GetFacialMaskId() string { if x != nil { - return x.FaceMaskId + return x.FacialMaskId } return "" } @@ -1441,7 +1441,8 @@ type ApiMaskUseRequest struct { Efficiency string `protobuf:"bytes,7,opt,name=efficiency,proto3" json:"efficiency,omitempty"` Resistance string `protobuf:"bytes,8,opt,name=resistance,proto3" json:"resistance,omitempty"` Score string `protobuf:"bytes,9,opt,name=score,proto3" json:"score,omitempty"` - StoreId int32 `protobuf:"varint,10,opt,name=store_id,json=storeId,proto3" json:"store_id,omitempty"` + StoreId int64 `protobuf:"varint,10,opt,name=store_id,json=storeId,proto3" json:"store_id,omitempty"` + UserId int64 `protobuf:"varint,11,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1539,13 +1540,20 @@ func (x *ApiMaskUseRequest) GetScore() string { return "" } -func (x *ApiMaskUseRequest) GetStoreId() int32 { +func (x *ApiMaskUseRequest) GetStoreId() int64 { if x != nil { return x.StoreId } return 0 } +func (x *ApiMaskUseRequest) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + type ApiMaskUsedItemsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` FacialMaskId string `protobuf:"bytes,1,opt,name=facial_mask_id,json=facialMaskId,proto3" json:"facial_mask_id,omitempty"` @@ -1922,10 +1930,9 @@ const file_equipment_equipment_proto_rawDesc = "" + "\x04size\x18\x02 \x01(\x05R\x04size\":\n" + "\x12ApiBeansAddRequest\x12\x14\n" + "\x05image\x18\x01 \x01(\tR\x05image\x12\x0e\n" + - "\x02id\x18\x02 \x01(\x03R\x02id\"\x94\x03\n" + - "\x11ApiMaskAddRequest\x12 \n" + - "\fface_mask_id\x18\x01 \x01(\tR\n" + - "faceMaskId\x12!\n" + + "\x02id\x18\x02 \x01(\x03R\x02id\"\x98\x03\n" + + "\x11ApiMaskAddRequest\x12$\n" + + "\x0efacial_mask_id\x18\x01 \x01(\tR\ffacialMaskId\x12!\n" + "\fproduce_time\x18\x02 \x01(\tR\vproduceTime\x128\n" + "\x18quality_guarantee_period\x18\x03 \x01(\x03R\x16qualityGuaranteePeriod\x12\x1e\n" + "\vis_on_trial\x18\x04 \x01(\x05R\tisOnTrial\x12\x14\n" + @@ -1937,7 +1944,7 @@ const file_equipment_equipment_proto_rawDesc = "" + "\fuse_scenario\x18\n" + " \x01(\x05R\vuseScenario\x12\x16\n" + "\x06effect\x18\v \x01(\x03R\x06effect\x12&\n" + - "\x0fworker_group_id\x18\f \x01(\x03R\rworkerGroupId\"\xcc\x02\n" + + "\x0fworker_group_id\x18\f \x01(\x03R\rworkerGroupId\"\xe5\x02\n" + "\x11ApiMaskUseRequest\x12$\n" + "\x0efacial_mask_id\x18\x01 \x01(\tR\ffacialMaskId\x12\x19\n" + "\buse_time\x18\x02 \x01(\tR\auseTime\x12\x1b\n" + @@ -1953,7 +1960,8 @@ const file_equipment_equipment_proto_rawDesc = "" + "resistance\x12\x14\n" + "\x05score\x18\t \x01(\tR\x05score\x12\x19\n" + "\bstore_id\x18\n" + - " \x01(\x05R\astoreId\"w\n" + + " \x01(\x03R\astoreId\x12\x17\n" + + "\auser_id\x18\v \x01(\x03R\x06userId\"w\n" + "\x17ApiMaskUsedItemsRequest\x12$\n" + "\x0efacial_mask_id\x18\x01 \x01(\tR\ffacialMaskId\x12\x19\n" + "\buse_time\x18\x02 \x01(\tR\auseTime\x12\x1b\n" + @@ -1970,7 +1978,7 @@ const file_equipment_equipment_proto_rawDesc = "" + "\x02id\x18\x01 \x01(\x03R\x02id\"A\n" + "\x11ApiVersionRequest\x12\x12\n" + "\x04type\x18\x01 \x01(\x05R\x04type\x12\x18\n" + - "\aversion\x18\x02 \x01(\tR\aversion2\xc9\x14\n" + + "\aversion\x18\x02 \x01(\tR\aversion2\xd3\x14\n" + "\tEquipment\x12Y\n" + "\x05Items\x12\x17.equipment.ItemsRequest\x1a\x13.equipment.Response\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\x12\x17/admin/v3/version/items\x12T\n" + "\x04Info\x12\x14.equipment.IdRequest\x1a\x13.equipment.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\x12\x16/admin/v3/version/info\x12\\\n" + @@ -1998,9 +2006,9 @@ const file_equipment_equipment_proto_rawDesc = "" + "ApiMaskUse\x12\x1c.equipment.ApiMaskUseRequest\x1a\x13.equipment.Response\"\x1b\x82\xd3\xe4\x93\x02\x15:\x01*\"\x10/api/v3/mask/use\x12o\n" + "\x10ApiMaskUsedItems\x12\".equipment.ApiMaskUsedItemsRequest\x1a\x13.equipment.Response\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\"\x17/api/v3/mask/used/items\x12g\n" + "\x0fApiMaskStoreUse\x12\x1c.equipment.ApiMaskUseRequest\x1a\x13.equipment.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\"\x16/api/v3/mask/store/use\x12y\n" + - "\x14ApiMaskStoreUseItems\x12\".equipment.ApiMaskUsedItemsRequest\x1a\x13.equipment.Response\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/api/v3/mask/store/used/items\x12[\n" + + "\x14ApiMaskStoreUseItems\x12\".equipment.ApiMaskUsedItemsRequest\x1a\x13.equipment.Response\"(\x82\xd3\xe4\x93\x02\":\x01*\"\x1d/api/v3/mask/store/used/items\x12e\n" + "\n" + - "ApiVersion\x12\x1c.equipment.ApiVersionRequest\x1a\x13.equipment.Response\"\x1a\x82\xd3\xe4\x93\x02\x14:\x01*\x12\x0f/api/v3/version\x12a\n" + + "ApiVersion\x12\x1c.equipment.ApiVersionRequest\x1a\x13.equipment.Response\"$\x82\xd3\xe4\x93\x02\x1e:\x01*\x12\x19/api/v3/equipment/version\x12a\n" + "\vApiBindInfo\x12\x1d.equipment.ApiBindInfoRequest\x1a\x13.equipment.Response\"\x1e\x82\xd3\xe4\x93\x02\x18:\x01*\"\x13/api/v3/device/info\x12g\n" + "\rApiBindUpdate\x12\x1f.equipment.ApiBindUpdateRequest\x1a\x13.equipment.Response\" \x82\xd3\xe4\x93\x02\x1a:\x01*\"\x15/api/v3/device/update\x12I\n" + "\x0fInternalBindAdd\x12!.equipment.InternalBindAddRequest\x1a\x13.equipment.Response\x12K\n" + diff --git a/rpc/equipment/pb/equipment_grpc.pb.go b/rpc/equipment/pb/equipment_grpc.pb.go index 5b14578..7f42583 100644 --- a/rpc/equipment/pb/equipment_grpc.pb.go +++ b/rpc/equipment/pb/equipment_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.6.2 -// - protoc v3.19.4 +// - protoc v4.25.8 // source: equipment/equipment.proto package equipment diff --git a/services/chore/internal/dao/answerUser.go b/services/chore/internal/dao/answerUser.go index 1d669e2..13cd28a 100644 --- a/services/chore/internal/dao/answerUser.go +++ b/services/chore/internal/dao/answerUser.go @@ -1,6 +1,7 @@ package dao type UserAnswer struct { - Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT" json:"id"` + Id int64 `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT" json:"id"` Answer uint8 `gorm:"column:answer;type:tinyint(1);default:2;comment:答题状态,1为答完, 2为未答" json:"answer"` + UserId int64 `gorm:"column:user_id;type:int(11);comment:用户ID" json:"user_id"` } diff --git a/services/chore/internal/logic/apiAnswerIProgressLogic.go b/services/chore/internal/logic/apiAnswerIProgressLogic.go index 4f1c4ac..8855048 100644 --- a/services/chore/internal/logic/apiAnswerIProgressLogic.go +++ b/services/chore/internal/logic/apiAnswerIProgressLogic.go @@ -34,7 +34,7 @@ func (l *ApiAnswerIProgressLogic) ApiAnswerIProgress(in *chore.EmptyReq) (*chore return l.fail(utils.ErrorNoLoginInfo) } var info dao.UserAnswer - w := modelbase.Params{Eq: map[string]string{"id": strconv.FormatInt(adminInfo.ID, utils.NumberTen)}} + w := modelbase.Params{Eq: map[string]string{"user_id": strconv.FormatInt(adminInfo.ID, utils.NumberTen)}} err := model.AnswerUserModel{}.Init().GetOne(w, &info) if err != nil { diff --git a/services/chore/internal/logic/apiAnswerSaveLogic.go b/services/chore/internal/logic/apiAnswerSaveLogic.go index 58b09af..9f59f45 100644 --- a/services/chore/internal/logic/apiAnswerSaveLogic.go +++ b/services/chore/internal/logic/apiAnswerSaveLogic.go @@ -43,7 +43,14 @@ func (l *ApiAnswerSaveLogic) ApiAnswerSave(in *chore.EmptyReq) (*chore.Response, return l.fail(utils.Fail) } if info.Id < utils.NumberOne { - return l.fail(utils.SetError(utils.ErrorNotFund, "用户不存在")) + info.Answer = utils.StatusOk + info.UserId = adminInfo.ID + err = model.AnswerUserModel{}.Init().Create(&info) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + return l.ok(info.Id) } info.Answer = utils.StatusOk diff --git a/services/equipment/equipmentclient/equipment.go b/services/equipment/equipmentclient/equipment.go index 4b83c29..e061ec2 100644 --- a/services/equipment/equipmentclient/equipment.go +++ b/services/equipment/equipmentclient/equipment.go @@ -1,5 +1,5 @@ // Code generated by goctl. DO NOT EDIT. -// goctl 1.10.1 +// goctl 1.10.2 // Source: equipment.proto package equipmentClient diff --git a/services/equipment/internal/dao/bind.go b/services/equipment/internal/dao/bind.go index 492db06..bf18312 100644 --- a/services/equipment/internal/dao/bind.go +++ b/services/equipment/internal/dao/bind.go @@ -10,7 +10,7 @@ type BindCreate struct { HostNickname string `gorm:"column:host_nickname;type:varchar(128);comment:主机昵称;NOT NULL" json:"host_nickname"` UserId int64 `gorm:"column:user_id;type:int(11);comment:用户ID;NOT NULL" json:"user_id"` UserNickname string `gorm:"column:user_nickname;type:varchar(128);comment:用户昵称;NOT NULL" json:"user_nickname"` - Type int32 `json:"type" gorm:"type"` // 类型。1为圆屏,2为卵型屏,3为皮肤分析仪,4为经皮湿水仪,5为AI化妆盒,6为软水机,7为制氧机 + Type int32 `json:"type" gorm:"type"` // 类型。1为圆屏,2为卵型屏,3为皮肤分析仪,4为经皮湿水仪,5为AI化妆盒,6为软水机,7为制氧机,8老圆屏,9祛痘,10老圆屏 SkinType int32 `gorm:"column:skin_type" json:"skin_type"` // 1用户 2门店 Image string `gorm:"column:image;type:varchar(128);comment:图片地址;NOT NULL" json:"image"` IsSpeciality int32 `gorm:"column:is_speciality;type:tinyint(1);default:0;comment:1是专业版;NOT NULL" json:"is_speciality"` diff --git a/services/equipment/internal/dao/mask.go b/services/equipment/internal/dao/mask.go index 195ac82..d6a1e94 100644 --- a/services/equipment/internal/dao/mask.go +++ b/services/equipment/internal/dao/mask.go @@ -98,3 +98,11 @@ type MaskUsedInfo struct { UseTime string `gorm:"column:use_time;type:varchar(64);comment:使用的时间;NOT NULL" json:"use_time"` SecondUseTime string `gorm:"column:second_use_time;type:varchar(64);comment:第二次使用的时间,与第一次不能超过半小时" json:"second_use_time"` } + +type UserInfo struct { + Id int64 ` json:"id"` +} + +type StoreInfo struct { + Id int64 ` json:"id"` +} diff --git a/services/equipment/internal/dao/maskUsageRecord.go b/services/equipment/internal/dao/maskUsageRecord.go new file mode 100644 index 0000000..7a3def4 --- /dev/null +++ b/services/equipment/internal/dao/maskUsageRecord.go @@ -0,0 +1,18 @@ +package dao + +import "lone-services/pkg/utils" + +type MaskUsageRecordInfo struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT" json:"id"` + Userid int `gorm:"column:userid;type:int(11);comment:用户ID;NOT NULL" json:"userid"` + StoreId int `gorm:"column:store_id;type:int(11);comment:美容院ID;NOT NULL" json:"store_id"` + FacialMaskId string `gorm:"column:facial_mask_id;type:varchar(255);comment:面膜ID;NOT NULL" json:"facial_mask_id"` + CreatedAt utils.CustomTime `gorm:"column:created_at;type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at"` +} + +type MaskUsageRecordCreate struct { + Id int `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT" json:"id"` + Userid int `gorm:"column:userid;type:int(11);comment:用户ID;NOT NULL" json:"userid"` + StoreId int `gorm:"column:store_id;type:int(11);comment:美容院ID;NOT NULL" json:"store_id"` + FacialMaskId string `gorm:"column:facial_mask_id;type:varchar(255);comment:面膜ID;NOT NULL" json:"facial_mask_id"` +} diff --git a/services/equipment/internal/logic/apiBindItemsLogic.go b/services/equipment/internal/logic/apiBindItemsLogic.go index e631c31..3f2369d 100644 --- a/services/equipment/internal/logic/apiBindItemsLogic.go +++ b/services/equipment/internal/logic/apiBindItemsLogic.go @@ -2,7 +2,11 @@ package logic import ( "context" + "lone-services/pkg/modelbase" "lone-services/pkg/utils" + "lone-services/services/equipment/internal/dao" + "lone-services/services/equipment/internal/model" + "strconv" "lone-services/rpc/equipment/pb" "lone-services/services/equipment/internal/svc" @@ -30,6 +34,18 @@ func (l *ApiBindItemsLogic) ApiBindItems(in *equipment.EmptyRequest) (*equipment if adminInfo.ID < utils.NumberOne { return l.fail(utils.ErrorNoLoginInfo) } + w := modelbase.Params{ + Eq: map[string]string{ + "user_id": strconv.FormatInt(adminInfo.ID, utils.NumberTen), + "status": utils.StringStatusOk}, + Order: "id desc", + } + var info []dao.BindInfo + err := model.BindModel{}.Init().Items(w, &info) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } - return &equipment.Response{}, nil + return l.ok(info) } diff --git a/services/equipment/internal/logic/apiMaskAddLogic.go b/services/equipment/internal/logic/apiMaskAddLogic.go index 33eff7e..ff1415e 100644 --- a/services/equipment/internal/logic/apiMaskAddLogic.go +++ b/services/equipment/internal/logic/apiMaskAddLogic.go @@ -2,10 +2,13 @@ package logic import ( "context" + "lone-services/pkg/modelbase" "lone-services/pkg/utils" - equipment "lone-services/rpc/equipment/pb" + "lone-services/services/equipment/internal/dao" + "lone-services/services/equipment/internal/model" "lone-services/services/equipment/internal/svc" + "lone-services/services/equipment/validator" "github.com/zeromicro/go-zero/core/logx" ) @@ -25,12 +28,55 @@ func NewApiMaskAddLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiMas } } -// API +// ApiMaskAdd API func (l *ApiMaskAddLogic) ApiMaskAdd(in *equipment.ApiMaskAddRequest) (*equipment.Response, error) { + var v validator.MaskAddValidator + if fail := l.checkParams(in, &v); fail != nil { + return fail, nil + } + adminInfo := utils.GetUserFromCtx(l.ctx) if adminInfo.ID < utils.NumberOne { return l.fail(utils.ErrorNoLoginInfo) } - return &equipment.Response{}, nil + var status dao.MaskStatus + w := modelbase.Params{Eq: map[string]string{"facial_mask_id": in.FacialMaskId}} + modelObj := model.MaskModel{}.Init() + err := modelObj.GetOne(w, &status) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + if status.Id > utils.NumberZero { + if status.Status == utils.StatusFail { + status.Status = utils.StatusOk + _, err = modelObj.Edit(w, &status) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.SetError(utils.Fail, "更新状态出错")) + } + } + return l.ok(status.Id) + } + data := dao.MaskCreate{ + FacialMaskId: in.FacialMaskId, + ProduceTime: in.ProduceTime, + QualityGuaranteePeriod: in.QualityGuaranteePeriod, + IsOnTrial: in.IsOnTrial, + IsOnline: in.IsOnline, + WorkerGroupId: adminInfo.ID, + ModelId: in.ModelId, + Model: in.Model, + IsStore: in.IsStore, + UseScenario: in.UseScenario, + Batch: in.Batch, + Effect: int32(in.Effect), + } + err = modelObj.Create(&data) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.SetError(utils.Fail, "添加出错")) + } + return l.ok(data.Id) } diff --git a/services/equipment/internal/logic/apiMaskStoreUseItemsLogic.go b/services/equipment/internal/logic/apiMaskStoreUseItemsLogic.go index a74a747..e731143 100644 --- a/services/equipment/internal/logic/apiMaskStoreUseItemsLogic.go +++ b/services/equipment/internal/logic/apiMaskStoreUseItemsLogic.go @@ -2,6 +2,12 @@ package logic import ( "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/equipment/internal/dao" + "lone-services/services/equipment/internal/model" + "lone-services/services/equipment/validator" + "strconv" "lone-services/rpc/equipment/pb" "lone-services/services/equipment/internal/svc" @@ -13,6 +19,7 @@ type ApiMaskStoreUseItemsLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewApiMaskStoreUseItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiMaskStoreUseItemsLogic { @@ -24,7 +31,36 @@ func NewApiMaskStoreUseItemsLogic(ctx context.Context, svcCtx *svc.ServiceContex } func (l *ApiMaskStoreUseItemsLogic) ApiMaskStoreUseItems(in *equipment.ApiMaskUsedItemsRequest) (*equipment.Response, error) { - // todo: add your logic here and delete this line + var v validator.MaskUsedItemsValidator + if fail := l.checkParams(in, &v); fail != nil { + return fail, nil + } - return &equipment.Response{}, nil + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + + var info []dao.MaskUsedInfo + w := modelbase.Params{Eq: map[string]string{ + "is_use": strconv.Itoa(int(utils.StatusDone)), + "store_id": strconv.Itoa(int(adminInfo.ID)), + }, + Order: "id desc"} + if v.FacialMaskId != utils.StringEmpty { + w.Eq["facial_mask_id"] = v.FacialMaskId + } + if v.UseTime != utils.StringEmpty { + w.Like["use_time LIKE ? "] = "%%" + v.UseTime + "%%" + } + if v.HostCode != utils.StringEmpty { + w.Eq["host_code"] = v.HostCode + } + + err := model.MaskModel{}.Init().Items(w, &info) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + return l.ok(info) } diff --git a/services/equipment/internal/logic/apiMaskStoreUseLogic.go b/services/equipment/internal/logic/apiMaskStoreUseLogic.go index bf11b90..4f225aa 100644 --- a/services/equipment/internal/logic/apiMaskStoreUseLogic.go +++ b/services/equipment/internal/logic/apiMaskStoreUseLogic.go @@ -2,6 +2,12 @@ package logic import ( "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/equipment/internal/dao" + "lone-services/services/equipment/internal/model" + "lone-services/services/equipment/validator" + "strconv" "lone-services/rpc/equipment/pb" "lone-services/services/equipment/internal/svc" @@ -13,6 +19,7 @@ type ApiMaskStoreUseLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewApiMaskStoreUseLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiMaskStoreUseLogic { @@ -24,7 +31,111 @@ func NewApiMaskStoreUseLogic(ctx context.Context, svcCtx *svc.ServiceContext) *A } func (l *ApiMaskStoreUseLogic) ApiMaskStoreUse(in *equipment.ApiMaskUseRequest) (*equipment.Response, error) { - // todo: add your logic here and delete this line + var v validator.MaskUseValidator - return &equipment.Response{}, nil + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + + maskInfo, storeInfo, cErr := l.checkStoreUse(in, adminInfo) + if cErr != utils.Ok { + return l.fail(cErr) + } + + two := true + if len(maskInfo.UseTime) < utils.NumberEight { + maskInfo.IsUse = utils.StatusDone + maskInfo.UseTime = in.UseTime + maskInfo.HostCode = in.HostCode + maskInfo.UserId = in.UserId + maskInfo.StoreId = storeInfo.Id + maskInfo.GearPosition = in.GearPosition + maskInfo.Voltage = in.Voltage + maskInfo.ElectricCurrent = in.ElectricCurrent + maskInfo.Efficiency = in.Efficiency + maskInfo.Resistance = in.Resistance + maskInfo.Score = in.Score + two = false + } else { + maskInfo.SecondUseTime = v.UseTime + } + + modelObj := model.MaskModel{}.Init() + modelObj.Begin() + if !two { + record := dao.MaskUsageRecordCreate{ + StoreId: int(storeInfo.Id), + FacialMaskId: maskInfo.FacialMaskId, + } + err := model.MaskUsageRecordModel{}.Init().Create(&record) + if err != nil { + l.Logger.Error(err) + modelObj.Rollback() + return l.fail(utils.SetError(utils.Fail, "添加使用记录失败")) + } + } + + w := modelbase.Params{Eq: map[string]string{"id": strconv.FormatInt(maskInfo.Id, 10)}} + _, err2 := modelObj.Edit(w, &maskInfo) + if err2 != nil { + l.Logger.Error(err2) + modelObj.Rollback() + return l.fail(utils.SetError(utils.Fail, "更新数据失败")) + } + + modelObj.Commit() + + return l.ok(utils.NumberOne) +} + +func (l *ApiMaskStoreUseLogic) checkStoreUse(v *equipment.ApiMaskUseRequest, u utils.UserInfo) (dao.MaskUseInfo, dao.StoreInfo, utils.Status) { + var maskInfo dao.MaskUseInfo + var storeInfo dao.StoreInfo + + maskInfo, err := l.checkMaskUse(v) + if err != utils.Ok { + return maskInfo, storeInfo, err + } + + //校验门店信息(门店登录 token 中 ObjId 为门店ID) + storeInfo = svc.GetStore(v.StoreId, l.svcCtx.StoreSvcName) + if storeInfo.Id < utils.NumberOne { + return maskInfo, storeInfo, utils.SetError(utils.ErrorNotFund, "没有找到门店信息") + } + + return maskInfo, storeInfo, utils.Ok +} + +func (l *ApiMaskStoreUseLogic) checkMaskUse(v *equipment.ApiMaskUseRequest) (dao.MaskUseInfo, utils.Status) { + var maskInfo dao.MaskUseInfo + + //面膜信息校验信息 + maskW := modelbase.Params{Eq: map[string]string{"facial_mask_id": v.FacialMaskId}} + err := model.MaskModel{}.Init().GetOne(maskW, &maskInfo) + if err != nil || maskInfo.Id < utils.NumberOne { + l.Logger.Error(err) + return maskInfo, utils.SetError(utils.ErrorNotFund, "没有找到面膜信息") + } + + //如果使用过 + if maskInfo.IsUse == utils.StatusDone { + //试用与一次性直接返回 + if maskInfo.IsOnTrial == dao.FacialTypeTry || + maskInfo.IsOnTrial == dao.FacialTypeOnce { + return maskInfo, utils.SetError(utils.Fail, "产品已使用过") + } + //普通与通过做过两次返回 + if len(maskInfo.SecondUseTime) > utils.NumberEight { + return maskInfo, utils.SetError(utils.Fail, "产品已使用过二次") + } + //两次间隔不能超过30分 + userTime, err := utils.TimeToUnix(maskInfo.UseTime, "2006-1-2 15:4") + if err != nil && userTime+30*60 < utils.Now().Unix() { + utils.Logger.Error(err) + return maskInfo, utils.SetError(utils.Fail, "超过30分不能继续使用") + } + } + + return maskInfo, utils.Ok } diff --git a/services/equipment/internal/logic/apiMaskUseLogic.go b/services/equipment/internal/logic/apiMaskUseLogic.go index 58d3b1c..f8942f7 100644 --- a/services/equipment/internal/logic/apiMaskUseLogic.go +++ b/services/equipment/internal/logic/apiMaskUseLogic.go @@ -2,6 +2,12 @@ package logic import ( "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/equipment/internal/dao" + "lone-services/services/equipment/internal/model" + "lone-services/services/equipment/validator" + "strconv" "lone-services/rpc/equipment/pb" "lone-services/services/equipment/internal/svc" @@ -13,6 +19,7 @@ type ApiMaskUseLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewApiMaskUseLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiMaskUseLogic { @@ -24,7 +31,124 @@ func NewApiMaskUseLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiMas } func (l *ApiMaskUseLogic) ApiMaskUse(in *equipment.ApiMaskUseRequest) (*equipment.Response, error) { - // todo: add your logic here and delete this line + var v validator.MaskUseValidator + if fail := l.checkParams(in, &v); fail != nil { + return fail, nil + } - return &equipment.Response{}, nil + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + + maskInfo, userInfo, err := l.checkUse(in, adminInfo) + if err != utils.Ok { + return l.fail(err) + } + + two := true + if len(maskInfo.UseTime) < utils.NumberEight { + maskInfo.IsUse = utils.StatusDone + maskInfo.UseTime = in.UseTime + maskInfo.HostCode = in.HostCode + maskInfo.UserId = userInfo.Id + maskInfo.GearPosition = in.GearPosition + maskInfo.Voltage = in.Voltage + maskInfo.ElectricCurrent = in.ElectricCurrent + maskInfo.Efficiency = in.Efficiency + maskInfo.Resistance = in.Resistance + maskInfo.Score = in.Score + two = false + } else { + maskInfo.SecondUseTime = v.UseTime + } + + modelObj := model.MaskModel{}.Init() + modelObj.Begin() + if v.StoreId > utils.NumberZero && !two { + maskInfo.StoreId = in.StoreId + record := dao.MaskUsageRecordCreate{ + Userid: int(userInfo.Id), + StoreId: v.StoreId, + FacialMaskId: maskInfo.FacialMaskId, + } + aErr := model.MaskUsageRecordModel{}.Init().Create(&record) + if aErr != nil { + l.Logger.Error(err) + modelObj.Rollback() + return l.fail(utils.SetError(utils.Fail, "添加使用记录失败")) + } + } + + w := modelbase.Params{Eq: map[string]string{"id": strconv.FormatInt(maskInfo.Id, 10)}} + _, err2 := modelObj.Edit(w, &maskInfo) + if err2 != nil { + l.Logger.Error(err2) + modelObj.Rollback() + return l.fail(utils.SetError(utils.Fail, "更新数据失败")) + } + + modelObj.Commit() + + return l.ok(utils.NumberOne) +} + +func (l *ApiMaskUseLogic) checkUse(v *equipment.ApiMaskUseRequest, u utils.UserInfo) (dao.MaskUseInfo, dao.UserInfo, utils.Status) { + var maskInfo dao.MaskUseInfo + var userInfo dao.UserInfo + + maskInfo, err := l.checkMaskUse(v) + if err != utils.Ok { + return maskInfo, userInfo, err + } + + //校验用户信息 + userInfo = svc.GetUser(u.ID, l.svcCtx.UserSvcName) + if userInfo.Id < utils.NumberOne { + return maskInfo, userInfo, utils.SetError(utils.ErrorNotFund, "没有找到用户信息") + } + + //如果有门店信息校验信息 + if v.StoreId > utils.NumberZero { + var storeInfo dao.StoreInfo + storeInfo = svc.GetStore(v.StoreId, l.svcCtx.StoreSvcName) + if storeInfo.Id < utils.NumberOne { + return maskInfo, userInfo, utils.SetError(utils.ErrorNotFund, "没有找到门店信息") + } + } + + return maskInfo, userInfo, utils.Ok +} + +func (l *ApiMaskUseLogic) checkMaskUse(v *equipment.ApiMaskUseRequest) (dao.MaskUseInfo, utils.Status) { + var maskInfo dao.MaskUseInfo + + //面膜信息校验信息 + maskW := modelbase.Params{Eq: map[string]string{"facial_mask_id": v.FacialMaskId}} + err := model.MaskModel{}.Init().GetOne(maskW, &maskInfo) + if err != nil || maskInfo.Id < utils.NumberOne { + l.Logger.Error(err) + return maskInfo, utils.SetError(utils.ErrorNotFund, "没有找到面膜信息") + } + + //如果使用过 + if maskInfo.IsUse == utils.StatusDone { + //试用与一次性直接返回 + if maskInfo.IsOnTrial == dao.FacialTypeTry || + maskInfo.IsOnTrial == dao.FacialTypeOnce { + return maskInfo, utils.SetError(utils.Fail, "产品已使用过") + } + //普通与通过做过两次返回 + if len(maskInfo.SecondUseTime) > utils.NumberEight { + return maskInfo, utils.SetError(utils.Fail, "产品已使用过二次") + } + //两次间隔不能超过30分 + userTime, err := utils.TimeToUnix(maskInfo.UseTime, "2006-1-2 15:4") + if err != nil && userTime+30*60 < utils.Now().Unix() { + l.Logger.Error(err) + return maskInfo, utils.SetError(utils.Fail, "超过30分不能继续使用") + } + } + + return maskInfo, utils.Ok } diff --git a/services/equipment/internal/logic/apiMaskUsedItemsLogic.go b/services/equipment/internal/logic/apiMaskUsedItemsLogic.go index 812a71a..6a6c2b0 100644 --- a/services/equipment/internal/logic/apiMaskUsedItemsLogic.go +++ b/services/equipment/internal/logic/apiMaskUsedItemsLogic.go @@ -2,6 +2,12 @@ package logic import ( "context" + "lone-services/pkg/modelbase" + "lone-services/pkg/utils" + "lone-services/services/equipment/internal/dao" + "lone-services/services/equipment/internal/model" + "lone-services/services/equipment/validator" + "strconv" "lone-services/rpc/equipment/pb" "lone-services/services/equipment/internal/svc" @@ -13,6 +19,7 @@ type ApiMaskUsedItemsLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger + BaseLogic } func NewApiMaskUsedItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApiMaskUsedItemsLogic { @@ -24,7 +31,35 @@ func NewApiMaskUsedItemsLogic(ctx context.Context, svcCtx *svc.ServiceContext) * } func (l *ApiMaskUsedItemsLogic) ApiMaskUsedItems(in *equipment.ApiMaskUsedItemsRequest) (*equipment.Response, error) { - // todo: add your logic here and delete this line + var v validator.MaskUsedItemsValidator + if fail := l.checkParams(in, &v); fail != nil { + return fail, nil + } - return &equipment.Response{}, nil + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + + var info []dao.MaskUsedInfo + w := modelbase.Params{Eq: map[string]string{ + "is_use": strconv.Itoa(utils.StatusDone), "user_id": strconv.Itoa(int(adminInfo.ID))}, + Order: "id desc"} + if v.FacialMaskId != utils.StringEmpty { + w.Eq["facial_mask_id"] = v.FacialMaskId + } + if v.UseTime != utils.StringEmpty { + w.Like["use_time LIKE ? "] = "%%" + v.UseTime + "%%" + } + if v.HostCode != utils.StringEmpty { + w.Eq["host_code"] = v.HostCode + } + + err := model.MaskModel{}.Init().Items(w, &info) + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + + return l.ok(info) } diff --git a/services/equipment/internal/model/mask.go b/services/equipment/internal/model/mask.go index 2abeb9e..f85aeb8 100644 --- a/services/equipment/internal/model/mask.go +++ b/services/equipment/internal/model/mask.go @@ -10,7 +10,7 @@ type MaskModel struct { } func (m MaskModel) TableName() string { - return modelbase.Prefix() + "version" + return modelbase.Prefix() + "mask" } func (m MaskModel) Init() MaskModel { diff --git a/services/equipment/internal/model/maskUsageRecord.go b/services/equipment/internal/model/maskUsageRecord.go new file mode 100644 index 0000000..00b483a --- /dev/null +++ b/services/equipment/internal/model/maskUsageRecord.go @@ -0,0 +1,23 @@ +package model + +import ( + "lone-services/pkg/modelbase" + "lone-services/services/equipment/internal/dao" +) + +type MaskUsageRecordModel struct { + modelbase.Base +} + +func (m MaskUsageRecordModel) TableName() string { + return modelbase.Prefix() + "mask_usage_record" +} + +func (m MaskUsageRecordModel) Init() MaskUsageRecordModel { + m.Table = m.TableName() + return m +} + +func (m MaskUsageRecordModel) Create(data *dao.MaskUsageRecordCreate) error { + return m.Base.Create(data) +} diff --git a/services/equipment/internal/server/equipmentServer.go b/services/equipment/internal/server/equipmentServer.go index 8a09307..b0045c3 100644 --- a/services/equipment/internal/server/equipmentServer.go +++ b/services/equipment/internal/server/equipmentServer.go @@ -1,5 +1,5 @@ // Code generated by goctl. DO NOT EDIT. -// goctl 1.10.1 +// goctl 1.10.2 // Source: equipment.proto package server diff --git a/services/equipment/internal/svc/grpcService.go b/services/equipment/internal/svc/grpcService.go new file mode 100644 index 0000000..1e1f32f --- /dev/null +++ b/services/equipment/internal/svc/grpcService.go @@ -0,0 +1,50 @@ +package svc + +import ( + "context" + store "lone-services/rpc/store/pb" + user "lone-services/rpc/user/pb" + "lone-services/services/equipment/internal/dao" + + "github.com/zeromicro/go-zero/core/logx" +) + +func GetUser(id int64, name string) dao.UserInfo { + var userInfo dao.UserInfo + cli, err := GetRpcClient(name) + if err != nil { + logx.Error(err) + return userInfo + } + + client := user.NewUserClient(cli.Conn()) + info, err := client.InternalGetUserInfo(context.Background(), &user.InternalGetUserInfoReq{UserId: id}) + if err != nil { + logx.Errorf("get user err: %v", err) + return userInfo + } + + userInfo.Id = info.Id + + return userInfo +} + +func GetStore(id int64, name string) dao.StoreInfo { + var storeInfo dao.StoreInfo + cli, err := GetRpcClient(name) + if err != nil { + logx.Error(err) + return storeInfo + } + + client := store.NewStoreClient(cli.Conn()) + info, err := client.GetInfoById(context.Background(), &store.IdRequest{Id: id}) + if err != nil { + logx.Errorf("get store err: %v", err) + return storeInfo + } + + storeInfo.Id = info.Id + + return storeInfo +} diff --git a/services/equipment/internal/svc/servicecontext.go b/services/equipment/internal/svc/servicecontext.go index d51e45b..5b2e8d9 100644 --- a/services/equipment/internal/svc/servicecontext.go +++ b/services/equipment/internal/svc/servicecontext.go @@ -1,23 +1,98 @@ package svc import ( + "fmt" + "lone-services/pkg/discovery" "lone-services/pkg/utils" "lone-services/services/equipment/internal/config" + "net" + "strconv" + "sync" + "time" + "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/zrpc" "gorm.io/gorm" ) +type rpcClientCacheEntry struct { + cli zrpc.Client + target string + expireAt time.Time +} + +const rpcClientCacheTTL = 30 * time.Second //缓存过期时间 + +var ( + rpcCacheLock sync.Mutex + rpcCache = make(map[string]*rpcClientCacheEntry) +) + +func GetRpcClient(serviceName string) (zrpc.Client, error) { + if serviceName == utils.StringEmpty { + err := fmt.Errorf("rpc serviceName is empty") + logx.Error(err) + return nil, err + } + + cacheKey := serviceName + + rpcCacheLock.Lock() + entry, ok := rpcCache[cacheKey] + if ok && time.Now().Before(entry.expireAt) { + rpcCacheLock.Unlock() + return entry.cli, nil + } + delete(rpcCache, cacheKey) + rpcCacheLock.Unlock() + + inst, err := discovery.Pick(serviceName) + if err != nil { + err = fmt.Errorf("discovery pick %s failed: %w", serviceName, err) + logx.Error(err) + return nil, err + } + + target := net.JoinHostPort(inst.IP, strconv.FormatUint(inst.Port, utils.NumberTen)) + + cli := zrpc.MustNewClient(zrpc.RpcClientConf{ + Target: target, + Timeout: utils.RpcTimeOut, //rpc调用超时5s + }) + + rpcCacheLock.Lock() + rpcCache[cacheKey] = &rpcClientCacheEntry{ + cli: cli, + target: target, + expireAt: time.Now().Add(rpcClientCacheTTL), + } + rpcCacheLock.Unlock() + + return cli, nil +} + type ServiceContext struct { - Config config.Config - DB *gorm.DB - Prefix string + Config config.Config + DB *gorm.DB + Prefix string + StoreSvcName string + UserSvcName string } func NewServiceContext(c config.Config, db *gorm.DB) *ServiceContext { - + storeSvc := utils.GetConfigString("services.store") + if storeSvc == utils.StringEmpty { + logx.Error("config services.store empty") + } + userSvc := utils.GetConfigString("services.user") + if userSvc == utils.StringEmpty { + logx.Error("config services.user empty") + } return &ServiceContext{ - Config: c, - DB: db, - Prefix: utils.GetConfigString("mysql.prefix"), + Config: c, + DB: db, + Prefix: utils.GetConfigString("mysql.prefix"), + StoreSvcName: storeSvc, + UserSvcName: userSvc, } } diff --git a/services/equipment/validator/bind.go b/services/equipment/validator/bind.go index 7ebf7a8..a4f892e 100644 --- a/services/equipment/validator/bind.go +++ b/services/equipment/validator/bind.go @@ -109,12 +109,14 @@ func (p BindValidator) GetMessage() validate.ValidatorMessages { type BindUnbindValidator struct { HostCode string `form:"host_code" json:"host_code" validate:"required"` + Type int32 `form:"type" json:"type" validate:"required"` } // GetMessage 提示消息 func (p BindUnbindValidator) GetMessage() validate.ValidatorMessages { return validate.ValidatorMessages{ "HostCode.required": "缺少设备编码", + "Type.required": "缺少类型", } }