Browse Source

完成预约模块

guodj 4 năm trước cách đây
mục cha
commit
6b178e6058

+ 57 - 0
common/date.go

@@ -0,0 +1,57 @@
+package common
+
+import (
+	"fmt"
+	"github.com/gogf/gf/os/gtime"
+)
+
+/*
+	GetCNStartOfWeek
+	获取国内意义上一周的第一天(周一) 外国认为是周日
+*/
+func GetCNStartOfWeek(time *gtime.Time) *gtime.Time {
+	day := int(time.Weekday())
+	if day == 0 {
+		return time.AddDate(0, 0, -6)
+	} else {
+		return time.AddDate(0, 0, -day+1)
+	}
+}
+
+/*
+	GetCNEndOfWeek
+	获取国内意义上一周的第七天(周日) 外国认为是周六
+*/
+func GetCNEndOfWeek(time *gtime.Time) *gtime.Time {
+	day := int(time.Weekday())
+	if day == 0 {
+		return time.AddDate(0, 0, 0)
+	} else {
+		return time.AddDate(0, 0, 7-day)
+	}
+}
+
+// GetCNWeekday 返回数字类型的周信息(1,2,3,4,5,6,7)
+func GetCNWeekday(time *gtime.Time) int {
+	day := int(time.Weekday())
+	if day == 0 {
+		return 7
+	} else {
+		return day
+	}
+}
+
+// GetNextTimeNode 获取当前时间的下一个预约节点
+func GetNextTimeNode(signOutTime *gtime.Time) *gtime.Time {
+	currentMinute := signOutTime.Minute()
+	if currentMinute >= 30 {
+		nextTimeStr := fmt.Sprintf("%v-%.2v-%.2v %.2v:%.2v:%.2v",
+			signOutTime.Year(), int(signOutTime.Month()), signOutTime.Day(),
+			signOutTime.Hour()+1, 0, 0)
+		return gtime.NewFromStr(nextTimeStr)
+	}
+	nextTimeStr := fmt.Sprintf("%v-%.2v-%.2v %.2v:%.2v:%.2v",
+		signOutTime.Year(), int(signOutTime.Month()), signOutTime.Day(),
+		signOutTime.Hour(), 30, 0)
+	return gtime.NewFromStr(nextTimeStr)
+}

+ 10 - 1
config/config.toml

@@ -7,6 +7,13 @@
     srv-name = "dashoo.reservation.0.1-guodj"
     env = "dev"
 
+# 预约相关
+[reservation]
+    time_split = 30
+    begin_at = "00:00:00"
+    end_at = "23:30:00"
+    weekday = "1,2,3,4,5,6,7"
+
 [service_registry]
     registry = "consul"  # consul 或 peer2peer
 #    server-addr = "192.168.0.63:18090"
@@ -23,4 +30,6 @@
         link = "mysql:root:Dashoo#190801@ali@tcp(192.168.0.252:3306)/lims_dev"
 
 [micro_srv]
-    auth = "dashoo.labsop.auth-2.1"
+    auth = "dashoo.labsop.auth-2.1"
+#    admin = "dashoo.labsop.admin-2.1"
+    admin ="dashoo.labsop.admin-2.1-guodj"

+ 12 - 12
handler/meeting.go

@@ -8,14 +8,14 @@ import (
 	"github.com/gogf/gf/frame/g"
 	"github.com/gogf/gf/util/gvalid"
 	"lims_reservation/model"
-	"lims_reservation/service"
+	"lims_reservation/service/meeting"
 )
 
 // Meeting 会议室
 type Meeting struct{}
 
 // List 会议室列表
-func (m *Meeting) List(ctx context.Context, req model.ListReq, rsp comm_def.CommonMsg) error {
+func (m *Meeting) List(ctx context.Context, req *model.ListReq, rsp *comm_def.CommonMsg) error {
 	tenant, err := micro_srv.GetTenant(ctx)
 	if err != nil {
 		return err
@@ -27,7 +27,7 @@ func (m *Meeting) List(ctx context.Context, req model.ListReq, rsp comm_def.Comm
 	if req.Current < 0 {
 		req.Current = DefaultPageCurrent
 	}
-	list, err := service.NewSrv(tenant).List(req)
+	list, total, err := meeting.NewSrv(tenant).List(*req)
 	_, err, code, msg := myerrors.CheckError(err)
 	if err != nil {
 		return err
@@ -35,11 +35,11 @@ func (m *Meeting) List(ctx context.Context, req model.ListReq, rsp comm_def.Comm
 
 	rsp.Code = code
 	rsp.Msg = msg
-	rsp.Data = list
+	rsp.Data = g.Map{"total": total, "list": list}
 	return nil
 }
 
-func (m *Meeting) Add(ctx context.Context, req model.MeetingReq, rsp comm_def.CommonMsg) error {
+func (m *Meeting) Add(ctx context.Context, req *model.MeetingReq, rsp *comm_def.CommonMsg) error {
 	tenant, err := micro_srv.GetTenant(ctx)
 	if err != nil {
 		return err
@@ -56,7 +56,7 @@ func (m *Meeting) Add(ctx context.Context, req model.MeetingReq, rsp comm_def.Co
 		return err
 	}
 
-	err = service.NewSrv(tenant).Add(userInfo, req)
+	err = meeting.NewSrv(tenant).Add(userInfo, *req)
 	_, err, code, msg := myerrors.CheckError(err)
 	if err != nil {
 		return err
@@ -66,7 +66,7 @@ func (m *Meeting) Add(ctx context.Context, req model.MeetingReq, rsp comm_def.Co
 	return nil
 }
 
-func (m *Meeting) Update(ctx context.Context, req model.MeetingReq, rsp comm_def.CommonMsg) error {
+func (m *Meeting) Update(ctx context.Context, req *model.MeetingReq, rsp *comm_def.CommonMsg) error {
 	tenant, err := micro_srv.GetTenant(ctx)
 	if err != nil {
 		return err
@@ -85,7 +85,7 @@ func (m *Meeting) Update(ctx context.Context, req model.MeetingReq, rsp comm_def
 	if err != nil {
 		return err
 	}
-	err = service.NewSrv(tenant).Update(userInfo, req)
+	err = meeting.NewSrv(tenant).Update(userInfo, *req)
 	_, err, code, msg := myerrors.CheckError(err)
 	if err != nil {
 		return err
@@ -95,7 +95,7 @@ func (m *Meeting) Update(ctx context.Context, req model.MeetingReq, rsp comm_def
 	return nil
 }
 
-func (m *Meeting) Get(ctx context.Context, req model.MeetingReq, rsp comm_def.CommonMsg) error {
+func (m *Meeting) Get(ctx context.Context, req *model.MeetingReq, rsp *comm_def.CommonMsg) error {
 	tenant, err := micro_srv.GetTenant(ctx)
 	if err != nil {
 		return err
@@ -105,7 +105,7 @@ func (m *Meeting) Get(ctx context.Context, req model.MeetingReq, rsp comm_def.Co
 	if req.Id == 0 {
 		return NoParamsErr
 	}
-	entity, err := service.NewSrv(tenant).Get(req.Id)
+	entity, err := meeting.NewSrv(tenant).Get(req.Id)
 	_, err, code, msg := myerrors.CheckError(err)
 	if err != nil {
 		return err
@@ -117,7 +117,7 @@ func (m *Meeting) Get(ctx context.Context, req model.MeetingReq, rsp comm_def.Co
 	return nil
 }
 
-func (m *Meeting) Delete(ctx context.Context, req model.MeetingReq, rsp comm_def.CommonMsg) error {
+func (m *Meeting) Delete(ctx context.Context, req *model.MeetingReq, rsp *comm_def.CommonMsg) error {
 	tenant, err := micro_srv.GetTenant(ctx)
 	if err != nil {
 		return err
@@ -127,7 +127,7 @@ func (m *Meeting) Delete(ctx context.Context, req model.MeetingReq, rsp comm_def
 	if req.Id == 0 {
 		return NoParamsErr
 	}
-	err = service.NewSrv(tenant).Delete(req.Id)
+	err = meeting.NewSrv(tenant).Delete(req.Id)
 	_, err, code, msg := myerrors.CheckError(err)
 	if err != nil {
 		return err

+ 142 - 0
handler/reservation.go

@@ -1 +1,143 @@
 package handler
+
+import (
+	"context"
+	"dashoo.cn/common_definition/comm_def"
+	"dashoo.cn/micro_libary/micro_srv"
+	"dashoo.cn/micro_libary/myerrors"
+	"github.com/gogf/gf/frame/g"
+	"github.com/gogf/gf/util/gvalid"
+	"lims_reservation/model"
+	"lims_reservation/service/reservation"
+)
+
+// Reservation 预约
+type Reservation struct{}
+
+// List 预约列表
+func (r *Reservation) List(ctx context.Context, req *model.ListReq, rsp *comm_def.CommonMsg) error {
+	tenant, err := micro_srv.GetTenant(ctx)
+	if err != nil {
+		return err
+	}
+	g.Log().Info("Received Reservation.List request @ " + tenant)
+	if req.Size == 0 {
+		req.Size = DefaultPageNum
+	}
+	if req.Current < 0 {
+		req.Current = DefaultPageCurrent
+	}
+	list, total, err := reservation.NewSrv(tenant).List(*req)
+	_, err, code, msg := myerrors.CheckError(err)
+	if err != nil {
+		return err
+	}
+
+	rsp.Code = code
+	rsp.Msg = msg
+	rsp.Data = g.Map{"total": total, "list": list}
+	return nil
+}
+
+// Add 添加预约
+func (r *Reservation) Add(ctx context.Context, req *model.ReservationReq, rsp *comm_def.CommonMsg) error {
+	tenant, err := micro_srv.GetTenant(ctx)
+	if err != nil {
+		return err
+	}
+	g.Log().Info("Received Reservation.Add request @ " + tenant)
+	// 校验
+	validErr := gvalid.CheckStruct(ctx, req, nil)
+	if err != nil {
+		return validErr.Current()
+	}
+	// 赋值
+	req.Status = 1
+	// 获取用户信息
+	userInfo, err := micro_srv.GetUserInfo(ctx)
+	if err != nil {
+		return err
+	}
+	err = reservation.NewSrv(tenant).Add(userInfo, *req)
+	_, err, code, msg := myerrors.CheckError(err)
+	if err != nil {
+		return err
+	}
+
+	rsp.Code = code
+	rsp.Msg = msg
+	return nil
+}
+
+// Cancel 取消预约
+func (r *Reservation) Cancel(ctx context.Context, req *model.ReservationReq, rsp *comm_def.CommonMsg) error {
+	tenant, err := micro_srv.GetTenant(ctx)
+	if err != nil {
+		return err
+	}
+	g.Log().Info("Received Reservation.Cancel request @ " + tenant)
+	if req.Id == 0 {
+		return NoParamsErr
+	}
+	// 获取用户信息
+	userInfo, err := micro_srv.GetUserInfo(ctx)
+	if err != nil {
+		return err
+	}
+	err = reservation.NewSrv(tenant).Cancel(userInfo, req.Id)
+	_, err, code, msg := myerrors.CheckError(err)
+	if err != nil {
+		return err
+	}
+
+	rsp.Code = code
+	rsp.Msg = msg
+	return nil
+}
+
+// OverviewList 预约概况
+func (r *Reservation) OverviewList(ctx context.Context, req *model.OverviewReq, rsp *comm_def.CommonMsg) error {
+	tenant, err := micro_srv.GetTenant(ctx)
+	if err != nil {
+		return err
+	}
+	g.Log().Info("Received Reservation.OverviewList request @ " + tenant)
+	// 校验
+	if req.Date.String() == "" {
+		return NoParamsErr
+	}
+	data, err := reservation.NewSrv(tenant).OverviewList(*req)
+	_, err, code, msg := myerrors.CheckError(err)
+	if err != nil {
+		return err
+	}
+	rsp.Data = data
+	rsp.Code = code
+	rsp.Msg = msg
+	return nil
+}
+
+// ReserveInfo 预约信息
+func (r *Reservation) ReserveInfo(ctx context.Context, req *model.ReserveReq, rsp *comm_def.CommonMsg) error {
+	tenant, err := micro_srv.GetTenant(ctx)
+	if err != nil {
+		return err
+	}
+	g.Log().Info("Received Reservation.ReserveInfo request @ " + tenant)
+	// 校验
+	if req.Date.String() == "" {
+		return NoParamsErr
+	}
+	if req.EntityId == 0 {
+		return NoParamsErr
+	}
+	data, err := reservation.NewSrv(tenant).ReserveInfo(ctx, *req)
+	_, err, code, msg := myerrors.CheckError(err)
+	if err != nil {
+		return err
+	}
+	rsp.Data = data
+	rsp.Code = code
+	rsp.Msg = msg
+	return nil
+}

+ 3 - 2
main.go

@@ -17,6 +17,7 @@ func main() {
 
 	// 注册服务对象
 	s.RegisterName("Meeting", new(handler.Meeting), "")
+	s.RegisterName("Reservation", new(handler.Reservation), "")
 
 	// 注册auth处理
 	s.AuthFunc = handleAuth
@@ -27,9 +28,9 @@ func main() {
 }
 
 // AuthExcludePaths 设定不需要认证的路径
-var AuthExcludePaths = []string{}
+//var AuthExcludePaths = []string{}
 
 // 处理Auth
 func handleAuth(ctx context.Context, req *protocol.Message, token string) error {
-	return micro_srv.HandleAuth(ctx, req, token, AuthExcludePaths)
+	return micro_srv.HandleAuth(ctx, req, token, nil)
 }

+ 15 - 15
model/internal/meeting.go

@@ -10,19 +10,19 @@ import (
 
 // Meeting is the golang structure for table meeting.
 type Meeting struct {
-	Id          int         `orm:"Id,primary"  json:"id"`          //
-	CreatedBy   string      `orm:"CreatedBy"   json:"createdBy"`   // 创建人姓名
-	CreatedAt   *gtime.Time `orm:"CreatedAt"   json:"createdAt"`   // 创建时间
-	UpdatedAt   *gtime.Time `orm:"UpdatedAt"   json:"updatedAt"`   // 更新时间
-	UpdatedBy   string      `orm:"UpdatedBy"   json:"updatedBy"`   // 更新人姓名
-	DeletedAt   *gtime.Time `orm:"DeletedAt"   json:"deletedAt"`   // 删除时间
-	UpdatedById int         `orm:"UpdatedById" json:"updatedById"` // 更新人ID
-	CreatedById int         `orm:"CreatedById" json:"createdById"` // 创建人ID
-	Code        string      `orm:"Code"        json:"code"`        // 会议室编码
-	Name        string      `orm:"Name"        json:"name"`        // 会议室名称
-	ImgUrl      string      `orm:"ImgUrl"      json:"imgUrl"`      // 图片Url
-	Sort        int         `orm:"Sort"        json:"sort"`        // 排序
-	Scale       int         `orm:"Scale"       json:"scale"`       // 规模/可容纳人数
-	Remark      string      `orm:"Remark"      json:"remark"`      // 备注/说明
-	Location    string      `orm:"Location"    json:"location"`    // 位置
+	Id          int         `orm:"Id,primary"  json:"id"`            //
+	CreatedBy   string      `orm:"CreatedBy"   json:"created_by"`    // 创建人姓名
+	CreatedAt   *gtime.Time `orm:"CreatedAt"   json:"created_at"`    // 创建时间
+	UpdatedAt   *gtime.Time `orm:"UpdatedAt"   json:"updated_at"`    // 更新时间
+	UpdatedBy   string      `orm:"UpdatedBy"   json:"updated_by"`    // 更新人姓名
+	DeletedAt   *gtime.Time `orm:"DeletedAt"   json:"deleted_at"`    // 删除时间
+	UpdatedById int         `orm:"UpdatedById" json:"updated_by_id"` // 更新人ID
+	CreatedById int         `orm:"CreatedById" json:"created_by_id"` // 创建人ID
+	Code        string      `orm:"Code"        json:"code"`          // 会议室编码
+	Name        string      `orm:"Name"        json:"name"`          // 会议室名称
+	ImgUrl      string      `orm:"ImgUrl"      json:"img_url"`       // 图片Url
+	Sort        int         `orm:"Sort"        json:"sort"`          // 排序
+	Scale       int         `orm:"Scale"       json:"scale"`         // 规模/可容纳人数
+	Remark      string      `orm:"Remark"      json:"remark"`        // 备注/说明
+	Location    string      `orm:"Location"    json:"location"`      // 位置
 }

+ 20 - 20
model/internal/meeting_reservation.go

@@ -10,24 +10,24 @@ import (
 
 // MeetingReservation is the golang structure for table meeting_reservation.
 type MeetingReservation struct {
-	Id                 uint        `orm:"Id,primary"         json:"id"`                 // 主键ID
-	CreatedBy          string      `orm:"CreatedBy"          json:"createdBy"`          // 创建人姓名
-	CreatedAt          *gtime.Time `orm:"CreatedAt"          json:"createdAt"`          // 创建时间
-	UpdatedAt          *gtime.Time `orm:"UpdatedAt"          json:"updatedAt"`          // 更新时间
-	UpdatedBy          string      `orm:"UpdatedBy"          json:"updatedBy"`          // 更新人姓名
-	DeletedAt          *gtime.Time `orm:"DeletedAt"          json:"deletedAt"`          // 删除时间
-	UpdatedById        int         `orm:"UpdatedById"        json:"updatedById"`        // 更新人ID
-	CreatedById        int         `orm:"CreatedById"        json:"createdById"`        // 创建人ID
-	Title              string      `orm:"Title"              json:"title"`              // 标题
-	StartTime          *gtime.Time `orm:"StartTime"          json:"startTime"`          // 开始时间
-	EndTime            *gtime.Time `orm:"EndTime"            json:"endTime"`            // 结束时间
-	UserId             int         `orm:"UserId"             json:"userId"`             // 预约人
-	DepartmentId       int         `orm:"DepartmentId"       json:"departmentId"`       // 部门
-	Remark             string      `orm:"Remark"             json:"remark"`             // 备注
-	EntityId           int         `orm:"EntityId"           json:"entityId"`           // 关联ID
-	SignInTime         *gtime.Time `orm:"SignInTime"         json:"signInTime"`         // 签到时间
-	SignOutTime        *gtime.Time `orm:"SignOutTime"        json:"signOutTime"`        // 签退时间
-	RealityUseDuration float64     `orm:"RealityUseDuration" json:"realityUseDuration"` // 实际使用时长
-	UserName           string      `orm:"UserName"           json:"userName"`           // 预约人姓名
-	Status             int         `orm:"Status"             json:"status"`             // 预约状态(1:预定   2:取消)
+	Id                 uint        `orm:"Id,primary"         json:"id"`                   // 主键ID
+	CreatedBy          string      `orm:"CreatedBy"          json:"created_by"`           // 创建人姓名
+	CreatedAt          *gtime.Time `orm:"CreatedAt"          json:"created_at"`           // 创建时间
+	UpdatedAt          *gtime.Time `orm:"UpdatedAt"          json:"updated_at"`           // 更新时间
+	UpdatedBy          string      `orm:"UpdatedBy"          json:"updated_by"`           // 更新人姓名
+	DeletedAt          *gtime.Time `orm:"DeletedAt"          json:"deleted_at"`           // 删除时间
+	UpdatedById        int         `orm:"UpdatedById"        json:"updated_by_id"`        // 更新人ID
+	CreatedById        int         `orm:"CreatedById"        json:"created_by_id"`        // 创建人ID
+	Title              string      `orm:"Title"              json:"title"`                // 标题
+	StartTime          *gtime.Time `orm:"StartTime"          json:"start_time"`           // 开始时间
+	EndTime            *gtime.Time `orm:"EndTime"            json:"end_time"`             // 结束时间
+	UserId             int         `orm:"UserId"             json:"user_id"`              // 预约人
+	DepartmentId       int         `orm:"DepartmentId"       json:"department_id"`        // 部门
+	Remark             string      `orm:"Remark"             json:"remark"`               // 备注
+	EntityId           int         `orm:"EntityId"           json:"entity_id"`            // 关联ID
+	SignInTime         *gtime.Time `orm:"SignInTime"         json:"sign_in_time"`         // 签到时间
+	SignOutTime        *gtime.Time `orm:"SignOutTime"        json:"sign_out_time"`        // 签退时间
+	RealityUseDuration float64     `orm:"RealityUseDuration" json:"reality_use_duration"` // 实际使用时长
+	UserName           string      `orm:"UserName"           json:"user_name"`            // 预约人姓名
+	Status             int         `orm:"Status"             json:"status"`               // 预约状态(1:预定   2:取消)
 }

+ 8 - 1
model/meeting.go

@@ -20,6 +20,13 @@ type MeetingReq struct {
 	Scale    int    `orm:"Scale"       json:"scale"`                         // 规模/可容纳人数
 	Remark   string `orm:"Remark"      json:"remark"`                        // 备注/说明
 	Location string `orm:"Location"    json:"location"`                      // 位置
-	ImgUrl   string `orm:"ImgUrl"      json:"imgUrl"`                        // 图片Url
+	ImgUrl   string `orm:"ImgUrl"      json:"img_url"`                       // 图片Url
 	Sort     int    `orm:"Sort"        json:"sort"`                          // 排序
 }
+
+type ShortMeeting struct {
+	Id     int    `orm:"Id,primary"  json:"id"`      //
+	Code   string `orm:"Code"        json:"code"`    // 会议室编码
+	Name   string `orm:"Name"        json:"name"`    // 会议室名称
+	ImgUrl string `orm:"ImgUrl"      json:"img_url"` // 图片Url
+}

+ 80 - 0
model/meeting_reservation.go

@@ -5,6 +5,7 @@
 package model
 
 import (
+	"github.com/gogf/gf/os/gtime"
 	"lims_reservation/model/internal"
 )
 
@@ -12,3 +13,82 @@ import (
 type MeetingReservation internal.MeetingReservation
 
 // Fill with you ideas below.
+
+type ReservationReq struct {
+	Id                 int         `orm:"Id,primary"         json:"id"`                                  // 主键ID
+	Title              string      `orm:"Title"              json:"title"  v:"required#会议名称不能为空"`        // 标题/会议名称
+	StartTime          *gtime.Time `orm:"StartTime"          json:"start_time"  v:"required#会议开始时间不能为空"` // 开始时间
+	EndTime            *gtime.Time `orm:"EndTime"            json:"end_time"  v:"required#会议结束时间不能为空"`   // 结束时间
+	UserId             int         `orm:"UserId"             json:"user_id"`                             // 预约人
+	DepartmentId       int         `orm:"DepartmentId"       json:"department_id"`                       // 部门
+	Remark             string      `orm:"Remark"             json:"remark"`                              // 备注
+	EntityId           int         `orm:"EntityId"           json:"entity_id"`                           // 关联ID
+	SignInTime         *gtime.Time `orm:"SignInTime"         json:"sign_in_time"`                        // 签到时间
+	SignOutTime        *gtime.Time `orm:"SignOutTime"        json:"sign_out_time"`                       // 签退时间
+	RealityUseDuration float64     `orm:"RealityUseDuration" json:"reality_use_duration"`                // 实际使用时长
+	UserName           string      `orm:"UserName"           json:"user_name"`                           // 预约人姓名
+	Status             int         `orm:"Status"             json:"status"`                              // 预约状态(1:预定   2:取消)
+	TimeSplit          []string    `json:"time_split"`                                                   // 预约时间
+}
+
+type List struct {
+	Id                 uint        `orm:"Id,primary"         json:"id"`                   // 主键ID
+	CreatedBy          string      `orm:"CreatedBy"          json:"created_by"`           // 创建人姓名
+	CreatedAt          *gtime.Time `orm:"CreatedAt"          json:"created_at"`           // 创建时间
+	UpdatedAt          *gtime.Time `orm:"UpdatedAt"          json:"updated_at"`           // 更新时间
+	UpdatedBy          string      `orm:"UpdatedBy"          json:"updated_by"`           // 更新人姓名
+	DeletedAt          *gtime.Time `orm:"DeletedAt"          json:"deleted_at"`           // 删除时间
+	UpdatedById        int         `orm:"UpdatedById"        json:"updated_by_id"`        // 更新人ID
+	CreatedById        int         `orm:"CreatedById"        json:"created_by_id"`        // 创建人ID
+	Title              string      `orm:"Title"              json:"title"`                // 标题
+	StartTime          *gtime.Time `orm:"StartTime"          json:"start_time"`           // 开始时间
+	EndTime            *gtime.Time `orm:"EndTime"            json:"end_time"`             // 结束时间
+	UserId             int         `orm:"UserId"             json:"user_id"`              // 预约人
+	DepartmentId       int         `orm:"DepartmentId"       json:"department_id"`        // 部门
+	Remark             string      `orm:"Remark"             json:"remark"`               // 备注
+	EntityId           int         `orm:"EntityId"           json:"entity_id"`            // 关联ID
+	SignInTime         *gtime.Time `orm:"SignInTime"         json:"sign_in_time"`         // 签到时间
+	SignOutTime        *gtime.Time `orm:"SignOutTime"        json:"sign_out_time"`        // 签退时间
+	RealityUseDuration float64     `orm:"RealityUseDuration" json:"reality_use_duration"` // 实际使用时长
+	UserName           string      `orm:"UserName"           json:"user_name"`            // 预约人姓名
+	Status             int         `orm:"Status"             json:"status"`               // 预约状态(1:预定   2:取消)
+	Name               string      `json:"name"`                                          // 会议室名称
+	DepartmentName     string      `json:"department_name"`                               // 部门名称
+}
+
+// CurrentDate 周时间信息
+type CurrentDate struct {
+	Date string `json:"date"`
+	Day  int    `json:"day"`
+}
+
+// OverviewReq 概况请求
+type OverviewReq struct {
+	Date *gtime.Time `json:"date"`
+}
+
+type ShortList struct {
+	Id        int         `orm:"Id,primary"         json:"id"`        // 主键ID
+	Title     string      `orm:"Title"              json:"title"`     // 标题/会议名称
+	StartTime *gtime.Time `orm:"StartTime"          json:"startTime"` // 开始时间
+	EndTime   *gtime.Time `orm:"EndTime"            json:"endTime"`   // 结束时间
+	UserId    int         `orm:"UserId"             json:"user_id"`   // 预约人
+	EntityId  int         `orm:"EntityId"           json:"entity_id"` // 关联ID
+}
+
+// ReserveReq 预约请求
+type ReserveReq struct {
+	EntityId int         `json:"entity_id"` // 实体Id
+	Date     *gtime.Time `json:"date"`      // 当前时间
+}
+
+// ReservationList 预约详情
+type ReservationList struct {
+	Day       int    `json:"day"`        // 日期
+	Dept      string `json:"dept"`       // 部门
+	StartTime string `json:"start_time"` // 预约开始时间
+	Tel       string `json:"tel"`        // 手机号
+	Uid       int    `json:"uid"`        // 用户ID
+	Uname     string `json:"uname"`      // 用户名称
+	Week      int    `json:"week"`       // 本周时间
+}

+ 0 - 126
service/meeting.go

@@ -1,126 +0,0 @@
-package service
-
-import (
-	"dashoo.cn/micro_libary/request"
-	"github.com/gogf/gf/util/gconv"
-	"lims_reservation/dao"
-	"lims_reservation/model"
-)
-
-// MeetingService 会议室服务
-type MeetingService struct {
-	Dao *dao.MeetingDao
-}
-
-// NewSrv 服务初始化
-func NewSrv(tenant string) MeetingService {
-	return MeetingService{dao.NewMeetingDao(tenant)}
-}
-
-// List 会议室列表
-func (m MeetingService) List(req model.ListReq) ([]model.Meeting, error) {
-	entityModel := m.Dao.M
-
-	if req.Entity != nil {
-		if entity, ok := req.Entity.(model.MeetingReq); ok {
-			if entity.Name != "" {
-				entityModel = entityModel.WhereLike(m.Dao.Columns.Name, "%"+entity.Name+"%")
-			}
-			if entity.Code != "" {
-				entityModel = entityModel.WhereLike(m.Dao.Columns.Code, "%"+entity.Code+"%")
-			}
-			if entity.Scale != 0 {
-				entityModel = entityModel.Where(m.Dao.Columns.Scale, entity.Scale)
-			}
-			if entity.Location != "" {
-				entityModel = entityModel.WhereLike(m.Dao.Columns.Location, "%"+entity.Location+"%")
-			}
-		}
-	}
-
-	if req.Value != "" {
-		entityModel = entityModel.Order(req.Value, req.Type)
-	}
-	res, err := entityModel.Page(req.Current, req.Size).FindAll()
-	if err != nil {
-		return nil, err
-	}
-	if res.IsEmpty() {
-		return nil, nil
-	}
-	list := make([]model.Meeting, 0)
-	res.Structs(&list)
-	return list, nil
-}
-
-func (m MeetingService) Add(userInfo request.UserInfo, req model.MeetingReq) error {
-	entity := new(model.Meeting)
-	// 唯一校验
-	count, err := m.Dao.M.Fields(m.Dao.Columns.Id).Where(m.Dao.Columns.Name, req.Name).FindCount()
-	if err != nil {
-		return err
-	}
-	if count > 0 {
-		return NameExistsErr
-	}
-	count, err = m.Dao.M.Fields(m.Dao.Columns.Id).Where(m.Dao.Columns.Code, req.Code).FindCount()
-	if err != nil {
-		return err
-	}
-	if count > 0 {
-		return CodeExistsErr
-	}
-	gconv.Struct(req, entity)
-
-	SetCreate(&userInfo, entity)
-
-	_, err = m.Dao.M.Insert(entity)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func (m MeetingService) Update(userInfo request.UserInfo, req model.MeetingReq) error {
-	entity := new(model.Meeting)
-	// 唯一校验
-	count, err := m.Dao.M.Fields(m.Dao.Columns.Id).
-		Where(m.Dao.Columns.Name, req.Name).WhereNot(m.Dao.Columns.Id, req.Id).
-		FindCount()
-	if err != nil {
-		return err
-	}
-	if count > 0 {
-		return NameExistsErr
-	}
-	count, err = m.Dao.M.Fields(m.Dao.Columns.Id).
-		Where(m.Dao.Columns.Code, req.Code).WhereNot(m.Dao.Columns.Id, req.Id).
-		FindCount()
-	if err != nil {
-		return err
-	}
-	if count > 0 {
-		return CodeExistsErr
-	}
-	gconv.Struct(req, entity)
-
-	SetCreate(&userInfo, entity)
-
-	_, err = m.Dao.M.WherePri(req.Id).Update(entity)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func (m MeetingService) Get(id int) (*model.Meeting, error) {
-	return m.Dao.WherePri(id).FindOne()
-}
-
-func (m MeetingService) Delete(id int) error {
-	_, err := m.Dao.WherePri(id).Delete()
-	if err != nil {
-		return err
-	}
-	return nil
-}

+ 161 - 0
service/meeting/meeting.go

@@ -0,0 +1,161 @@
+package meeting
+
+import (
+	"dashoo.cn/micro_libary/request"
+	"errors"
+	"github.com/gogf/gf/util/gconv"
+	"lims_reservation/dao"
+	"lims_reservation/model"
+	"lims_reservation/service"
+)
+
+// Service 会议室服务
+type Service struct {
+	Dao    *dao.MeetingDao
+	Tenant string
+}
+
+// NewSrv 服务初始化
+func NewSrv(tenant string) Service {
+	return Service{Dao: dao.NewMeetingDao(tenant), Tenant: tenant}
+}
+
+// List 会议室列表
+func (m Service) List(req model.ListReq) ([]model.Meeting, int, error) {
+	entityModel := m.Dao.M
+
+	if req.Entity != nil {
+		entity := new(model.MeetingReq)
+		gconv.Struct(req.Entity, entity)
+		if entity.Name != "" {
+			entityModel = entityModel.WhereLike(m.Dao.Columns.Name, "%"+entity.Name+"%")
+		}
+		if entity.Code != "" {
+			entityModel = entityModel.WhereLike(m.Dao.Columns.Code, "%"+entity.Code+"%")
+		}
+		if entity.Scale != 0 {
+			entityModel = entityModel.Where(m.Dao.Columns.Scale, entity.Scale)
+		}
+		if entity.Location != "" {
+			entityModel = entityModel.WhereLike(m.Dao.Columns.Location, "%"+entity.Location+"%")
+		}
+	}
+	total, err := entityModel.Count()
+	if err != nil {
+		return nil, 0, err
+	}
+	if total == 0 {
+		return nil, 0, nil
+	}
+
+	if req.Value != "" {
+		entityModel = entityModel.Order(req.Value, req.Type)
+	}
+	res, err := entityModel.Page(req.Current, req.Size).FindAll()
+	if err != nil {
+		return nil, 0, err
+	}
+	if res.IsEmpty() {
+		return nil, 0, nil
+	}
+	list := make([]model.Meeting, 0)
+	res.Structs(&list)
+	return list, total, nil
+}
+
+func (m Service) Add(userInfo request.UserInfo, req model.MeetingReq) error {
+	entity := new(model.Meeting)
+	// 唯一校验
+	count, err := m.Dao.M.Fields(m.Dao.Columns.Id).Where(m.Dao.Columns.Name, req.Name).FindCount()
+	if err != nil {
+		return err
+	}
+	if count > 0 {
+		return service.NameExistsErr
+	}
+	count, err = m.Dao.M.Fields(m.Dao.Columns.Id).Where(m.Dao.Columns.Code, req.Code).FindCount()
+	if err != nil {
+		return err
+	}
+	if count > 0 {
+		return service.CodeExistsErr
+	}
+	gconv.Struct(req, entity)
+
+	service.SetCreate(&userInfo, entity)
+
+	_, err = m.Dao.M.Insert(entity)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m Service) Update(userInfo request.UserInfo, req model.MeetingReq) error {
+	entity := new(model.Meeting)
+	// 唯一校验
+	count, err := m.Dao.M.Fields(m.Dao.Columns.Id).
+		Where(m.Dao.Columns.Name, req.Name).WhereNot(m.Dao.Columns.Id, req.Id).
+		FindCount()
+	if err != nil {
+		return err
+	}
+	if count > 0 {
+		return service.NameExistsErr
+	}
+	count, err = m.Dao.M.Fields(m.Dao.Columns.Id).
+		Where(m.Dao.Columns.Code, req.Code).WhereNot(m.Dao.Columns.Id, req.Id).
+		FindCount()
+	if err != nil {
+		return err
+	}
+	if count > 0 {
+		return service.CodeExistsErr
+	}
+	gconv.Struct(req, entity)
+
+	service.SetCreate(&userInfo, entity)
+
+	_, err = m.Dao.M.WherePri(req.Id).Update(entity)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m Service) Get(id int) (*model.Meeting, error) {
+	return m.Dao.WherePri(id).FindOne()
+}
+
+func (m Service) Delete(id int) error {
+	_, err := m.Dao.WherePri(id).Delete()
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// Exists 校验是否存在
+func (m Service) Exists(id int) error {
+	exist, err := m.Dao.M.WherePri(m.Dao.Columns.Id, id).Count()
+	if err != nil {
+		return err
+	}
+	if exist <= 0 {
+		return errors.New("当前会议室不存在,请刷新后重试")
+	}
+	return nil
+}
+
+func (m Service) ShortList() ([]model.ShortMeeting, error) {
+	list := make([]model.ShortMeeting, 0)
+	res, err := m.Dao.M.FindAll()
+	if err != nil {
+		return nil, err
+	}
+	if res.IsEmpty() {
+		return nil, nil
+	}
+	res.Structs(&list)
+	return list, nil
+}

+ 302 - 0
service/reservation/reservation.go

@@ -0,0 +1,302 @@
+package reservation
+
+import (
+	"context"
+	"dashoo.cn/common_definition/admin/user_def"
+	"dashoo.cn/micro_libary/request"
+	"errors"
+	"fmt"
+	"github.com/gogf/gf/frame/g"
+	"github.com/gogf/gf/os/gtime"
+	"github.com/gogf/gf/util/gconv"
+	"lims_reservation/common"
+	"lims_reservation/dao"
+	"lims_reservation/model"
+	"lims_reservation/service"
+	"lims_reservation/service/meeting"
+	"lims_reservation/service/srv"
+	"time"
+)
+
+// Service ReservationService 预约
+type Service struct {
+	Dao    *dao.MeetingReservationDao
+	Tenant string
+}
+
+// NewSrv 服务初始化
+func NewSrv(tenant string) Service {
+	return Service{Dao: dao.NewMeetingReservationDao(tenant), Tenant: tenant}
+}
+
+// List 预约列表
+func (s Service) List(req model.ListReq) ([]model.List, int, error) {
+	entityModel := s.Dao.M
+
+	if req.Entity != nil {
+		entity := new(model.ReservationReq)
+		gconv.Struct(req.Entity, entity)
+		if entity.Title != "" {
+			entityModel = entityModel.WhereLike(s.Dao.Columns.Title, "%"+entity.Title+"%")
+		}
+		if entity.EntityId != 0 {
+			entityModel = entityModel.Where(s.Dao.Columns.EntityId, entity.EntityId)
+		}
+		if entity.UserId != 0 {
+			entityModel = entityModel.Where(s.Dao.Columns.UserId, entity.UserId)
+		}
+		// 预约状态(1:预定   2:取消)
+		if entity.Status != 0 {
+			entityModel = entityModel.Where(s.Dao.Columns.Status, entity.Status)
+		}
+		// 预约时间
+		if len(entity.TimeSplit) == 2 {
+			entityModel = entityModel.WhereBetween(s.Dao.Columns.Status, entity.TimeSplit[0], entity.TimeSplit[1])
+		}
+	}
+	total, err := entityModel.Count()
+	if err != nil {
+		return nil, 0, err
+	}
+	if total == 0 {
+		return nil, 0, nil
+	}
+	if req.Value != "" {
+		entityModel = entityModel.Order(req.Value, req.Type)
+	}
+	res, err := entityModel.Page(req.Current, req.Size).
+		Fields("meeting_reservation.*", "meeting.Name", "base_user.DepartmentName").
+		LeftJoin("meeting", "meeting.Id = meeting_reservation.EntityId").
+		LeftJoin("base_user", "base_user.Id = meeting_reservation.UserId").
+		FindAll()
+	if err != nil {
+		return nil, 0, err
+	}
+	if res.IsEmpty() {
+		return nil, 0, nil
+	}
+	list := make([]model.List, 0)
+	res.Structs(&list)
+	return list, total, nil
+}
+
+// Add 添加预约
+func (s Service) Add(userInfo request.UserInfo, req model.ReservationReq) error {
+	entity := new(model.MeetingReservation)
+	err := s.check(req)
+	if err != nil {
+		return err
+	}
+	gconv.Struct(req, entity)
+	service.SetCreate(&userInfo, entity)
+	entity.UserName = userInfo.RealName
+	entity.UserId = int(userInfo.Id)
+	entity.DepartmentId = gconv.Int(userInfo.DeptId)
+	_, err = s.Dao.M.Insert(entity)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// Cancel 取消预约  预约状态(1:预定   2:取消)
+func (s Service) Cancel(userInfo request.UserInfo, id int) error {
+	// 判断当前用户是否是预约人
+	entity, err := s.Dao.WherePri(id).FindOne()
+	if err != nil {
+		return err
+	}
+	if int32(entity.UserId) != userInfo.Id {
+		return errors.New("当前预约只能由预约人取消")
+	}
+	updatedMap := service.SetUpdatedMap(&userInfo)
+	updatedMap["Status"] = 2
+	_, err = s.Dao.M.Data(updatedMap).WherePri(id).Update()
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// OverviewList 预约概况
+func (s Service) OverviewList(req model.OverviewReq) (g.Map, error) {
+	dates := s.getCurrentWeekDay(req.Date)
+	meetingList, err := meeting.NewSrv(s.Tenant).ShortList()
+	if err != nil {
+		return nil, err
+	}
+	reservationList, err := s.shortList(req.Date)
+	if err != nil {
+		return nil, err
+	}
+	return g.Map{
+		"dates":       dates,
+		"meeting":     meetingList,
+		"reservation": reservationList,
+	}, nil
+
+}
+
+// ReserveInfo 预约信息
+func (s Service) ReserveInfo(ctx context.Context, req model.ReserveReq) (g.Map, error) {
+	// 常规信息
+	beginAt := g.Cfg().GetString("reservation.begin_at")
+	endAt := g.Cfg().GetString("reservation.end_at")
+	period := s.getCurrentPeriod(beginAt, endAt)
+	dates := s.getCurrentWeekDay(req.Date)
+	weekday := g.Cfg().GetString("reservation.weekday")
+	// 预约信息
+	list, err := s.getCurrentWeekReservation(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+	return g.Map{
+		"period":      period,
+		"dates":       dates,
+		"weekday":     weekday,
+		"reservation": list,
+	}, nil
+}
+
+// Check 预约校验
+func (s Service) check(req model.ReservationReq) error {
+	// 校验开始结束时间不能跨天
+	if req.StartTime.Format("Y-m-d") != req.EndTime.Format("Y-m-d") {
+		return errors.New("预约时间必须是同一天")
+	}
+	// 校验开始时间是否小于结束时间
+	if req.EndTime.Sub(req.StartTime) <= 0 {
+		return errors.New("预约结束时候必须大于开始时间")
+	}
+	// 时间间隔不能小于30分钟 todo:可以加到配置参数中
+	if req.EndTime.Sub(req.StartTime).Minutes() < 30 {
+		return errors.New("预约时间最小为30分钟")
+	}
+	// 校验是否是过期时间
+	if req.StartTime.Sub(gtime.Now()) < 0 {
+		return errors.New("当前预约时间已过期")
+	}
+	// 校验时间内是否有 预约
+	exist, err := s.Dao.M.WhereBetween(s.Dao.Columns.StartTime, req.StartTime, req.EndTime).
+		WhereBetween(s.Dao.Columns.EndTime, req.StartTime, req.EndTime).
+		Where(s.Dao.Columns.Status, 1).Count()
+	if err != nil {
+		return err
+	}
+	if exist > 0 {
+		return errors.New("当前时间段内已有预约记录,请刷新后重试")
+	}
+	// 校验会议室是否存在
+	err = meeting.NewSrv(s.Tenant).Exists(req.EntityId)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// getCurrentWeekDay 返回当前日期的周信息
+func (s Service) getCurrentWeekDay(current *gtime.Time) []model.CurrentDate {
+	startOfWeek := common.GetCNStartOfWeek(current)
+	dates := make([]model.CurrentDate, 0)
+	for i := 0; i <= 6; i++ {
+		times := startOfWeek.AddDate(0, 0, 1*i)
+		dates = append(dates, model.CurrentDate{
+			Date: times.Format("Y-m-d"),
+			Day:  times.Day(),
+		})
+	}
+	return dates
+}
+
+func (s Service) shortList(date *gtime.Time) ([]model.ShortList, error) {
+	sTime := common.GetCNStartOfWeek(date)
+	eTime := common.GetCNEndOfWeek(date)
+
+	list := make([]model.ShortList, 0)
+	res, err := s.Dao.M.WhereBetween(s.Dao.Columns.StartTime, sTime, eTime).FindAll()
+	if err != nil {
+		return nil, err
+	}
+	if res.IsEmpty() {
+		return nil, nil
+	}
+	res.Structs(&list)
+	return list, nil
+}
+
+// getCurrentDayTimeQuantum 获取当前的时间段
+func (s Service) getCurrentPeriod(entityBeginAt, entityEndAt string) [][]string {
+	now := gtime.Now()
+	startTime, _ := gtime.StrToTime(entityBeginAt)
+	endTime, _ := gtime.StrToTime(entityEndAt)
+	startAtStr := fmt.Sprintf("%v-%.2v-%.2v %.2v:%.2v:%.2v",
+		now.Year(), int(now.Month()), now.Day(),
+		startTime.Hour(), startTime.Minute(), startTime.Second())
+	startAt, _ := gtime.StrToTime(startAtStr)
+
+	endAtStr := fmt.Sprintf("%v-%.2v-%.2v %.2v:%.2v:%.2v",
+		now.Year(), int(now.Month()), now.Day(),
+		endTime.Hour(), endTime.Minute(), endTime.Second())
+	endAt, _ := gtime.StrToTime(endAtStr)
+
+	timeLong := endAt.Sub(startAt).Hours()
+	grids := int(timeLong * 2)
+	var timeQuantum [][]string
+	for i := 0; i < grids; i++ {
+		times := make([]string, 0)
+		timeSplit := g.Cfg().GetInt("reservation.time_split")
+		// 开始时间
+		startAt := startAt.Add(time.Duration(i*timeSplit) * time.Minute)
+		startTime := startAt.Format("H:i")
+		// 结束时间
+		endAt := startAt.Add(time.Duration(timeSplit) * time.Minute).Format("H:i")
+		times = append(times, startTime, endAt)
+		timeQuantum = append(timeQuantum, times)
+	}
+	return timeQuantum
+}
+
+// getCurrentWeekReservation 返回本周预约信息
+func (s Service) getCurrentWeekReservation(ctx context.Context, req model.ReserveReq) ([]model.ReservationList, error) {
+	// 获取符合条件的预约信息
+	list, err := s.Dao.Where(s.Dao.Columns.EntityId, req.EntityId).
+		Where(s.Dao.Columns.Status, 1).
+		Where(s.Dao.Columns.StartTime+">=", common.GetCNStartOfWeek(req.Date)).
+		Where(s.Dao.Columns.StartTime+"<=", common.GetCNEndOfWeek(req.Date)).
+		FindAll()
+	if err != nil {
+		return nil, err
+	}
+	uIds := make([]int64, 0)
+	uMap := make(map[int]struct{})
+	for _, v := range list {
+		if _, ok := uMap[v.UserId]; !ok {
+			uIds = append(uIds, int64(v.UserId))
+			uMap[v.UserId] = struct{}{}
+		}
+	}
+	// 获取用户信息
+	userList, err := srv.GetUserList(ctx, uIds, s.Tenant)
+	usersMap := make(map[int]user_def.UserInfoList)
+	for _, v := range userList {
+		usersMap[v.Id] = v
+	}
+	resultList := make([]model.ReservationList, 0)
+	for _, v := range list {
+		timeLong := v.EndTime.Sub(v.StartTime).Hours()
+		grids := int(timeLong * 2)
+		for i := 0; i <= grids; i++ {
+			startAt := v.StartTime.Add(time.Duration(i) * 30 * time.Minute)
+			resultList = append(resultList, model.ReservationList{
+				Day:       v.StartTime.Day(),
+				Dept:      usersMap[v.UserId].DepartmentName,
+				StartTime: fmt.Sprintf("%.2v:%.2v", startAt.Hour(), startAt.Minute()),
+				Tel:       usersMap[v.UserId].Mobile,
+				Uid:       v.UserId,
+				Uname:     v.UserName,
+				Week:      common.GetCNWeekday(v.StartTime),
+			})
+		}
+	}
+	return resultList, nil
+}

+ 26 - 0
service/srv/user.go

@@ -0,0 +1,26 @@
+package srv
+
+import (
+	"context"
+	"dashoo.cn/common_definition/admin/user_def"
+	"dashoo.cn/common_definition/comm_def"
+	"dashoo.cn/micro_libary/micro_srv"
+	"github.com/gogf/gf/util/gconv"
+)
+
+// GetUserList 返回用户列表
+func GetUserList(ctx context.Context, ids []int64, tenant string) ([]user_def.UserInfoList, error) {
+	userService := micro_srv.InitMicroSrvClient("User", "micro_srv.admin")
+	rsp := &comm_def.CommonMsg{}
+	err := userService.Call(context.TODO(), "GetUserInfoById", &comm_def.IdsReq{
+		Tenant: tenant,
+		Ids:    ids,
+	}, rsp)
+	if err != nil {
+		return nil, err
+	}
+	list := make([]user_def.UserInfoList, 0)
+
+	gconv.Structs(rsp.Data, &list)
+	return list, nil
+}

+ 43 - 0
service/srv/user_test.go

@@ -0,0 +1,43 @@
+package srv
+
+import (
+	"context"
+	"dashoo.cn/common_definition/admin/user_def"
+	"testing"
+)
+
+func TestGetUserList(t *testing.T) {
+	type args struct {
+		ctx    context.Context
+		ids    []int64
+		tenant string
+	}
+	want01 := make([]user_def.UserInfoList, 1)
+	tests := []struct {
+		name    string
+		args    args
+		want    []user_def.UserInfoList
+		wantErr bool
+	}{
+		{"微服务调用-用户列表测试", args{
+			ctx:    context.TODO(),
+			ids:    []int64{1},
+			tenant: "CU7zm9WhZm",
+		}, want01, false},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			got, err := GetUserList(tt.args.ctx, tt.args.ids, tt.args.tenant)
+			if (err != nil) != tt.wantErr {
+				t.Errorf("GetUserList() error = %v, wantErr %v", err, tt.wantErr)
+				return
+			}
+			//if !reflect.DeepEqual(got, tt.want) {
+			//	t.Errorf("GetUserList() got = %v, want %v", got, tt.want)
+			//}
+			if len(got) != len(tt.want) {
+				t.Errorf("GetUserList() got = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}