|
|
@@ -2,14 +2,9 @@ package reservation
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
- "dashoo.cn/common_definition/admin/user_def"
|
|
|
- "dashoo.cn/micro_libary/micro_srv"
|
|
|
- "dashoo.cn/micro_libary/request"
|
|
|
+ "database/sql"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
- "github.com/gogf/gf/frame/g"
|
|
|
- "github.com/gogf/gf/os/gtime"
|
|
|
- "github.com/gogf/gf/util/gconv"
|
|
|
"lims_adapter/common"
|
|
|
meeting2 "lims_adapter/dao/meeting"
|
|
|
"lims_adapter/model"
|
|
|
@@ -17,7 +12,17 @@ import (
|
|
|
"lims_adapter/service"
|
|
|
"lims_adapter/service/meeting"
|
|
|
"lims_adapter/service/srv"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
"time"
|
|
|
+
|
|
|
+ "dashoo.cn/common_definition/admin/user_def"
|
|
|
+ "dashoo.cn/micro_libary/micro_srv"
|
|
|
+ "dashoo.cn/micro_libary/myerrors"
|
|
|
+ "dashoo.cn/micro_libary/request"
|
|
|
+ "github.com/gogf/gf/frame/g"
|
|
|
+ "github.com/gogf/gf/os/gtime"
|
|
|
+ "github.com/gogf/gf/util/gconv"
|
|
|
)
|
|
|
|
|
|
// Service ReservationService 预约
|
|
|
@@ -167,11 +172,147 @@ func (s Service) OverviewList(req meeting3.OverviewReq) (g.Map, error) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+func (s Service) AppointTimeSplit() int {
|
|
|
+ return g.Cfg().GetInt("reservation.time_split", 30)
|
|
|
+}
|
|
|
+
|
|
|
+type AppointTimeInfoAppoint struct {
|
|
|
+ Id int `json:"id"`
|
|
|
+ Title string `json:"title"`
|
|
|
+ Start string `json:"start"`
|
|
|
+ End string `json:"end"`
|
|
|
+ Status int `json:"status"`
|
|
|
+ Uid int `json:"uid"`
|
|
|
+ Uname string `json:"uname"`
|
|
|
+ Tel string `json:"tel"`
|
|
|
+ Dept string `json:"dept"`
|
|
|
+}
|
|
|
+
|
|
|
+type AppointTimeInfoInstrument struct {
|
|
|
+ Id int
|
|
|
+ Weekday string
|
|
|
+ BeginAt *gtime.Time
|
|
|
+ EndAt *gtime.Time
|
|
|
+ IsAppointAvailable int // 是否默认可预约 1是 2否
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+type TimeSpan struct {
|
|
|
+ Start *gtime.Time `json:"start"`
|
|
|
+ End *gtime.Time `json:"end"`
|
|
|
+}
|
|
|
+
|
|
|
+// 获取指定仪器预约信息
|
|
|
+func (s Service) AppointTimeInfo(req *meeting3.AppointTimeInfoReq, userinfo request.UserInfo) (map[string]interface{}, error) {
|
|
|
+ if req.MeetingId == 0 {
|
|
|
+ return nil, myerrors.NewMsgError(nil, "会议室 Id 不能为空")
|
|
|
+ }
|
|
|
+ if req.Date == nil {
|
|
|
+ return nil, myerrors.NewMsgError(nil, "日期不能为空")
|
|
|
+ }
|
|
|
+
|
|
|
+ timesplit := s.AppointTimeSplit()
|
|
|
+ days := common.Weekday(req.Date.Time)
|
|
|
+
|
|
|
+ mettingSrv := meeting.NewSrv(s.Tenant)
|
|
|
+ m, err := mettingSrv.Dao.Where("Id = ?", req.MeetingId).One()
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ var appointInfo []AppointTimeInfoAppoint
|
|
|
+ err = s.Dao.DB.Table("meeting_reservation a").LeftJoin("base_user b", "a.UserId=b.Id").Unscoped().
|
|
|
+ Where("a.DeletedAt IS NULL").
|
|
|
+ Where("a.EntityId", req.MeetingId).
|
|
|
+ WherePri("a.Status", 1).
|
|
|
+ Where("a.EndTime > ?", days[0]).
|
|
|
+ Where("a.EndTime <= ?", days[6].Add(time.Hour*24)).
|
|
|
+ Fields("a.Id, a.Title, a.StartTime as Start, a.EndTime as End, a.Status, a.UserId as Uid, b.Realname as Uname, b.Mobile as Tel, b.DepartmentName as Dept").
|
|
|
+ Structs(&appointInfo)
|
|
|
+ if err == sql.ErrNoRows {
|
|
|
+ err = nil
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ reservationBeginStr := g.Cfg().GetString("reservation.begin", 30)
|
|
|
+ reservationEndStr := g.Cfg().GetString("reservation.end", 30)
|
|
|
+ reservationWeekdayStr := g.Cfg().GetString("reservation.weekday", 30)
|
|
|
+ instrWeekStr := strings.Split(reservationWeekdayStr, ",")
|
|
|
+ instrWeek := []int{}
|
|
|
+ for _, i := range instrWeekStr {
|
|
|
+ d, err := strconv.Atoi(i)
|
|
|
+ if err != nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ instrWeek = append(instrWeek, d)
|
|
|
+ }
|
|
|
+ toRemoveDay := []int{}
|
|
|
+ for i := 1; i <= 7; i++ {
|
|
|
+ if !common.SliceIntcontains(instrWeek, i) {
|
|
|
+ toRemoveDay = append(toRemoveDay, i)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ reservationBegin, err := time.Parse("15:04:05", reservationBeginStr)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ reservationEnd, err := time.Parse("15:04:05", reservationEndStr)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ if m.BeginAt == nil {
|
|
|
+ m.BeginAt = gtime.NewFromTime(reservationBegin)
|
|
|
+ }
|
|
|
+ if m.EndAt == nil {
|
|
|
+ m.EndAt = gtime.NewFromTime(reservationEnd)
|
|
|
+ }
|
|
|
+
|
|
|
+ unavailable := []TimeSpan{}
|
|
|
+ // 仪器设置的可预约范围外
|
|
|
+ for i, d := range days {
|
|
|
+ if common.SliceIntcontains(toRemoveDay, i+1) {
|
|
|
+ unavailable = append(unavailable, TimeSpan{
|
|
|
+ Start: gtime.NewFromTime(d),
|
|
|
+ End: gtime.NewFromTime(d.Add(24 * time.Hour)),
|
|
|
+ })
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if m.BeginAt.Hour() != 0 || m.BeginAt.Minute() != 0 {
|
|
|
+ end := d.Add(
|
|
|
+ time.Hour*time.Duration(m.BeginAt.Hour()) +
|
|
|
+ time.Minute*time.Duration(m.BeginAt.Minute()))
|
|
|
+ unavailable = append(unavailable, TimeSpan{
|
|
|
+ Start: gtime.NewFromTime(d),
|
|
|
+ End: gtime.NewFromTime(end),
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ endat := m.EndAt.Add(time.Minute * time.Duration(timesplit))
|
|
|
+ if endat.Hour() != 0 || endat.Minute() != 0 {
|
|
|
+ start := d.Add(
|
|
|
+ time.Hour*time.Duration(endat.Hour()) +
|
|
|
+ time.Minute*time.Duration(endat.Minute()))
|
|
|
+ unavailable = append(unavailable, TimeSpan{
|
|
|
+ Start: gtime.NewFromTime(start),
|
|
|
+ End: gtime.NewFromTime(d.Add(time.Hour * 24)),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return map[string]interface{}{
|
|
|
+ "time_split": timesplit,
|
|
|
+ "unavailable": unavailable,
|
|
|
+ "appoint": appointInfo,
|
|
|
+ }, nil
|
|
|
+}
|
|
|
+
|
|
|
// OverviewListByDay 按天预约概况
|
|
|
func (s Service) OverviewListByDay(ctx context.Context, req meeting3.OverviewReq) (g.Map, error) {
|
|
|
beginAt := g.Cfg().GetString("reservation.begin")
|
|
|
endAt := g.Cfg().GetString("reservation.end")
|
|
|
- period := s.getCurrentPeriod(beginAt, endAt)
|
|
|
+ defaultPeriod := s.getCurrentPeriod(beginAt, endAt)
|
|
|
dates := getCurrentWeekDay(req.Date)
|
|
|
meetingList, err := meeting.NewSrv(s.Tenant).ShortList()
|
|
|
if err != nil {
|
|
|
@@ -181,8 +322,20 @@ func (s Service) OverviewListByDay(ctx context.Context, req meeting3.OverviewReq
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
+
|
|
|
+ // for i := range meetingList {
|
|
|
+ // begin, end := beginAt, endAt
|
|
|
+ // if meetingList[i].BeginAt != nil && meetingList[i].EndAt != nil {
|
|
|
+ // begin = meetingList[i].BeginAt.Time.Format("15:04:05")
|
|
|
+ // end = meetingList[i].EndAt.Time.Format("15:04:05")
|
|
|
+ // }
|
|
|
+ // fmt.Println(meetingList[i].Id, meetingList[i].Name)
|
|
|
+ // period := s.getCurrentPeriod(begin, end)
|
|
|
+ // meetingList[i].Period = period
|
|
|
+ // }
|
|
|
+
|
|
|
return g.Map{
|
|
|
- "period": period,
|
|
|
+ "period": defaultPeriod,
|
|
|
"dates": dates,
|
|
|
"meeting": meetingList,
|
|
|
"reservation": reservationList,
|
|
|
@@ -374,6 +527,7 @@ func (s Service) getCurrentPeriod(entityBeginAt, entityEndAt string) [][]string
|
|
|
|
|
|
timeLong := endAt.Sub(startAt).Hours()
|
|
|
grids := int(timeLong * 2)
|
|
|
+ fmt.Println(startAt, endAt)
|
|
|
var timeQuantum [][]string
|
|
|
for i := 0; i < grids; i++ {
|
|
|
times := make([]string, 0)
|
|
|
@@ -484,16 +638,18 @@ func (s Service) getCurrentDayReservation(ctx context.Context, meetingList []mee
|
|
|
for i := 0; i < int(grid); i++ {
|
|
|
startAt := v.StartTime.Add(time.Duration(i) * 30 * time.Minute)
|
|
|
resultList = append(resultList, meeting3.ReservationList{
|
|
|
- EntityId: value.Id,
|
|
|
- ReservationId: int(v.Id),
|
|
|
- Title: v.Title,
|
|
|
- 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: usersMap[v.UserId].Realname,
|
|
|
- Week: common.GetCNWeekday(v.StartTime),
|
|
|
+ EntityId: value.Id,
|
|
|
+ ReservationId: int(v.Id),
|
|
|
+ Title: v.Title,
|
|
|
+ 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: usersMap[v.UserId].Realname,
|
|
|
+ Week: common.GetCNWeekday(v.StartTime),
|
|
|
+ ReservationStartTime: v.StartTime.String(),
|
|
|
+ ReservationEndTime: v.EndTime.String(),
|
|
|
})
|
|
|
}
|
|
|
}
|