|
|
@@ -3,6 +3,7 @@ package reservation
|
|
|
import (
|
|
|
"context"
|
|
|
"dashoo.cn/common_definition/admin/user_def"
|
|
|
+ "dashoo.cn/micro_libary/micro_srv"
|
|
|
"dashoo.cn/micro_libary/request"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
@@ -95,10 +96,14 @@ func (s Service) Add(userInfo request.UserInfo, req model.ReservationReq) error
|
|
|
entity.UserName = userInfo.RealName
|
|
|
entity.UserId = int(userInfo.Id)
|
|
|
entity.DepartmentId = gconv.Int(userInfo.DeptId)
|
|
|
- _, err = s.Dao.M.Insert(entity)
|
|
|
+ entity.RealEndTimeNode = req.EndTime
|
|
|
+ res, err := s.Dao.M.Insert(entity)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
+ id, _ := res.LastInsertId()
|
|
|
+ // 延迟消息
|
|
|
+ go AutoProcess(int(id), s.Tenant, req.EndTime.Sub(gtime.Now()))
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
@@ -161,6 +166,66 @@ func (s Service) ReserveInfo(ctx context.Context, req model.ReserveReq) (g.Map,
|
|
|
}, nil
|
|
|
}
|
|
|
|
|
|
+// Ending 结束会议
|
|
|
+func (s Service) Ending(ctx context.Context, req model.EndingReq) error {
|
|
|
+ // 先查询预约记录
|
|
|
+ entity, err := s.Dao.WherePri(req.Id).FindOne()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if entity == nil {
|
|
|
+ return errors.New("未找到当前预约信息")
|
|
|
+ }
|
|
|
+ if entity.SignOutTime.String() != "" {
|
|
|
+ return errors.New("当前预约已提前结束")
|
|
|
+ }
|
|
|
+ // 校验日期是不是同一天(24:00除外) 校验日期是不是在预约开始时间之后
|
|
|
+ if req.Date.Sub(entity.StartTime) <= 0 {
|
|
|
+ return errors.New("结束时间不能早于会议预约时间")
|
|
|
+ }
|
|
|
+ if req.Date.Format("Y-m-d") != entity.StartTime.Format("Y-m-d") &&
|
|
|
+ req.Date.Hour() != 0 && req.Date.Minute() != 0 {
|
|
|
+ return errors.New("结束时间必须为当天时间")
|
|
|
+ }
|
|
|
+ if (req.Date.Day()-1) != entity.StartTime.Day() && req.Date.Hour() == 0 && req.Date.Minute() == 0 {
|
|
|
+ return errors.New("当前结束时间错误,请重试")
|
|
|
+ }
|
|
|
+ if req.Date.Sub(entity.EndTime) > 0 {
|
|
|
+ return errors.New("预约时间正常结束的会议无需再次结束")
|
|
|
+ }
|
|
|
+ userInfo, err := micro_srv.GetUserInfo(ctx)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if userInfo.Id != int32(entity.UserId) {
|
|
|
+ return errors.New("当前预约只能由本人结束")
|
|
|
+ }
|
|
|
+ // 更新实际结束时间
|
|
|
+ updatedMap := service.SetUpdatedMap(&userInfo)
|
|
|
+ updatedMap[s.Dao.Columns.SignOutTime] = req.Date
|
|
|
+ updatedMap[s.Dao.Columns.RealEndTimeNode] = common.GetNextTimeNode(req.Date)
|
|
|
+ _, err = s.Dao.M.WherePri(req.Id).Update(updatedMap)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (s Service) AutoEnding(id int) error {
|
|
|
+ entity, err := s.Dao.WherePri(id).FindOne()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if entity.SignOutTime.String() != "" {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ _, err = s.Dao.WherePri(id).Update(g.Map{s.Dao.Columns.SignOutTime: entity.EndTime})
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
// Check 预约校验
|
|
|
func (s Service) check(req model.ReservationReq) error {
|
|
|
// 校验开始结束时间不能跨天
|
|
|
@@ -187,10 +252,12 @@ func (s Service) check(req model.ReservationReq) error {
|
|
|
Where(s.Dao.Columns.StartTime+">= ? AND "+s.Dao.Columns.StartTime+"< ?", req.StartTime, req.EndTime)
|
|
|
entityModel = entityModel.
|
|
|
WhereOr(s.Dao.Columns.EntityId+"= ? AND "+s.Dao.Columns.Status+" = 1 AND "+
|
|
|
- s.Dao.Columns.EndTime+"> ? AND "+s.Dao.Columns.EndTime+"<= ?", req.EntityId, req.StartTime, req.EndTime)
|
|
|
+ s.Dao.Columns.RealEndTimeNode+"> ? AND "+s.Dao.Columns.RealEndTimeNode+"<= ?",
|
|
|
+ req.EntityId, req.StartTime, req.EndTime)
|
|
|
entityModel = entityModel.
|
|
|
WhereOr(s.Dao.Columns.EntityId+"= ? AND "+s.Dao.Columns.Status+" = 1 AND "+
|
|
|
- s.Dao.Columns.EndTime+">= ? AND "+s.Dao.Columns.StartTime+"<= ?", req.EntityId, req.EndTime, req.StartTime)
|
|
|
+ s.Dao.Columns.RealEndTimeNode+">= ? AND "+s.Dao.Columns.StartTime+"<= ?",
|
|
|
+ req.EntityId, req.EndTime, req.StartTime)
|
|
|
exist, err := entityModel.Count()
|
|
|
if err != nil {
|
|
|
return err
|
|
|
@@ -234,6 +301,12 @@ func (s Service) shortList(date *gtime.Time) ([]model.ShortList, error) {
|
|
|
return nil, nil
|
|
|
}
|
|
|
res.Structs(&list)
|
|
|
+ for k, _ := range list {
|
|
|
+ // 当签退时间小于预约结束时间,使用签退时间
|
|
|
+ if list[k].SignOutTime.String() != "" && list[k].EndTime.Sub(list[k].SignOutTime) > 0 {
|
|
|
+ list[k].EndTime = common.GetNextTimeNode(list[k].SignOutTime)
|
|
|
+ }
|
|
|
+ }
|
|
|
return list, nil
|
|
|
}
|
|
|
|
|
|
@@ -302,6 +375,9 @@ func (s Service) getCurrentWeekReservation(ctx context.Context, req model.Reserv
|
|
|
resultList := make([]model.ReservationList, 0)
|
|
|
for _, v := range list {
|
|
|
timeLong := v.EndTime.Sub(v.StartTime).Hours()
|
|
|
+ if v.SignOutTime.String() != "" && v.EndTime.Sub(v.SignOutTime) > 0 {
|
|
|
+ timeLong = common.GetNextTimeNode(v.SignOutTime).Sub(v.StartTime).Hours()
|
|
|
+ }
|
|
|
grid := timeLong * 2
|
|
|
for i := 0; i < int(grid); i++ {
|
|
|
startAt := v.StartTime.Add(time.Duration(i) * 30 * time.Minute)
|