mirror of
https://shylinux.com/x/community
synced 2025-05-03 04:37:01 +08:00
215 lines
7.3 KiB
Go
215 lines
7.3 KiB
Go
package yuehaoxitong
|
|
|
|
import (
|
|
"shylinux.com/x/ice"
|
|
"shylinux.com/x/icebergs/base/mdb"
|
|
kit "shylinux.com/x/toolkits"
|
|
|
|
"shylinux.com/x/community/src/yuehaoxitong/model"
|
|
)
|
|
|
|
type Schedule struct {
|
|
Table
|
|
userQueue userQueue
|
|
queue queue
|
|
reception reception
|
|
volume Volume
|
|
models string `data:"schedule"`
|
|
plan string `name:"plan begin_time@date end_time@date"`
|
|
}
|
|
|
|
func (s Schedule) Create(m *ice.Message, arg ...string) {
|
|
defer m.ToastProcess("约号中...")("约号成功")
|
|
s.Transaction(m, func() {
|
|
msg := m.Cmd(s.volume, s.SelectForUpdate, model.UID, m.Option(model.VOLUME_UID))
|
|
if m.Warn(kit.Int(msg.Append(model.COUNT)) >= kit.Int(msg.Append(model.AMOUNT)), "本服务已约满") {
|
|
return
|
|
}
|
|
s.addCount(m, mdb.COUNT, "1")
|
|
s.Table.Create(m, arg...)
|
|
})
|
|
s.SendMessage(m, m.Option(model.USER_UID), m.Option(model.USER_UID))
|
|
s.sendTemplate(m, "约号成功", m.Result())
|
|
Portal{}.DashboardUpdate(m)
|
|
m.ProcessRefresh()
|
|
}
|
|
func (s Schedule) Call(m *ice.Message, arg ...string) {
|
|
defer m.ToastProcess("叫号中...")("叫号成功")
|
|
user_uid := m.Option(model.USER_UID)
|
|
s.Orders(m, model.TAKE_TIME).Limit(m, 1)
|
|
if m.Option(model.RECEPTION_UID) != "" {
|
|
s.SelectByStatus(m, kit.Simple(m.Option(model.QUEUE_UID), kit.Format(ScheduleTake), m.OptionSimple(model.RECEPTION_UID))...).PushAction(s.Expire, s.Finish)
|
|
} else {
|
|
s.SelectByStatus(m, m.Option(model.QUEUE_UID), kit.Format(ScheduleTake)).PushAction(s.Expire, s.Finish)
|
|
}
|
|
if m.Length() == 0 {
|
|
m.ProcessRewrite(model.UID, "")
|
|
return
|
|
}
|
|
s.changeStatus(m, ScheduleTake, ScheduleCall, model.CALL_UID, user_uid)
|
|
s.SendMessage(m, user_uid, m.Append(model.USER_UID))
|
|
s.sendTemplate(m, "服务已叫号", m.Append(model.UID))
|
|
m.ProcessRewrite(model.UID, m.Append(model.UID))
|
|
}
|
|
func (s Schedule) List(m *ice.Message, arg ...string) *ice.Message {
|
|
role := UserQueueRole(s.UserPlaceRole(m))
|
|
s.Tables(m, s.volume).FieldsWithCreatedAT(m, s, model.SCHEDULE_STATUS, model.BEGIN_TIME, model.END_TIME,
|
|
model.CANCEL_TIME, model.TAKE_TIME, model.CALL_TIME, model.EXPIRE_TIME, model.FINISH_TIME,
|
|
s.Key(s, model.RECEPTION_UID), model.VOLUME_UID, s.Key(s, model.CALL_UID), model.USER_UID)
|
|
if role == UserQueueCreator || role == UserQueueLeader {
|
|
if len(arg) == 1 {
|
|
s.Select(m, s.Key(s, model.QUEUE_UID), arg[0])
|
|
} else if len(arg) == 2 {
|
|
s.SelectDetail(m, s.Key(s, model.QUEUE_UID), arg[0], s.Key(s, model.UID), arg[1])
|
|
}
|
|
m.Table(func(value ice.Maps) {
|
|
switch ScheduleStatus(kit.Int(value[model.SCHEDULE_STATUS])) {
|
|
case SchedulePlan:
|
|
m.PushButton(s.Cancel, s.Take)
|
|
case ScheduleCall:
|
|
m.PushButton(s.Expire, s.Finish)
|
|
default:
|
|
m.PushButton()
|
|
}
|
|
})
|
|
} else if role == UserQueueWorker {
|
|
if len(arg) == 1 {
|
|
s.Select(m, s.Key(s, model.QUEUE_UID), arg[0], model.CALL_UID, m.Option(model.USER_UID))
|
|
} else if len(arg) == 2 {
|
|
s.SelectDetail(m, s.Key(s, model.QUEUE_UID), arg[0], model.CALL_UID, m.Option(model.USER_UID), s.Key(s, model.UID), arg[1])
|
|
}
|
|
m.Table(func(value ice.Maps) {
|
|
switch ScheduleStatus(kit.Int(value[model.SCHEDULE_STATUS])) {
|
|
case ScheduleCall:
|
|
m.PushButton(s.Expire, s.Finish)
|
|
default:
|
|
m.PushButton()
|
|
}
|
|
})
|
|
} else {
|
|
if len(arg) == 1 {
|
|
s.Select(m, s.Key(s, model.QUEUE_UID), arg[0], model.USER_UID, m.Option(model.USER_UID))
|
|
} else if len(arg) == 2 {
|
|
s.SelectDetail(m, s.Key(s, model.QUEUE_UID), arg[0], model.USER_UID, m.Option(model.USER_UID), s.Key(s, model.UID), arg[1])
|
|
}
|
|
m.Table(func(value ice.Maps) {
|
|
switch ScheduleStatus(kit.Int(value[model.SCHEDULE_STATUS])) {
|
|
case SchedulePlan:
|
|
m.PushButton(s.Cancel, s.Take)
|
|
default:
|
|
m.PushButton()
|
|
}
|
|
})
|
|
}
|
|
if len(arg) == 2 {
|
|
status := ScheduleStatus(kit.Int(m.Append(model.SCHEDULE_STATUS)))
|
|
if status == ScheduleExpire || status == ScheduleFinish {
|
|
s.DoneMessage(m)
|
|
}
|
|
}
|
|
s.SelectJoin(m, s.reception)
|
|
s.SelectJoinUser(m)
|
|
m.Action().Display("")
|
|
return m
|
|
}
|
|
func (s Schedule) SelectByStatus(m *ice.Message, arg ...string) *ice.Message {
|
|
order := m.Option(mdb.ORDER)
|
|
s.Tables(m, s.volume).FieldsWithCreatedAT(m, s, model.SCHEDULE_STATUS, model.BEGIN_TIME, model.END_TIME,
|
|
model.CANCEL_TIME, model.TAKE_TIME, model.CALL_TIME, model.EXPIRE_TIME, model.FINISH_TIME,
|
|
s.Key(s, model.RECEPTION_UID), model.VOLUME_UID, s.Key(s, model.CALL_UID), model.USER_UID)
|
|
kit.If(order, func() { s.Orders(m, order) })
|
|
s.Select(m, kit.Simple(s.Key(s, model.QUEUE_UID), arg[0], model.STATUS, arg[1], arg[2:])...)
|
|
s.SelectJoin(m, s.reception)
|
|
s.SelectJoinUser(m)
|
|
m.Action().Display("")
|
|
return m
|
|
}
|
|
func (s Schedule) Cancel(m *ice.Message, arg ...string) {
|
|
defer m.ToastProcess("取消中...")("取消成功")
|
|
args := m.OptionSimple(model.USER_UID, model.UID)
|
|
if m.WarnNotFound(s.Select(m, args...).Length() == 0) {
|
|
return
|
|
}
|
|
s.Transaction(m, func() {
|
|
s.addCount(m, mdb.COUNT, "-1")
|
|
s.changeStatus(m, SchedulePlan, ScheduleCancel)
|
|
})
|
|
m.ProcessRefresh()
|
|
}
|
|
func (s Schedule) Take(m *ice.Message, arg ...string) {
|
|
defer m.ToastProcess("取号中...")("取号成功")
|
|
args := m.OptionSimple(model.USER_UID, model.UID)
|
|
if m.WarnNotFound(s.Select(m, args...).Length() == 0) {
|
|
return
|
|
}
|
|
s.changeStatus(m, SchedulePlan, ScheduleTake)
|
|
m.ProcessRefresh()
|
|
Portal{}.DashboardUpdate(m)
|
|
}
|
|
func (s Schedule) Expire(m *ice.Message, arg ...string) {
|
|
defer m.ToastProcess("过号中...")("过号成功")
|
|
args := kit.Simple(model.CALL_UID, m.Option(model.USER_UID), m.OptionSimple(model.UID))
|
|
if m.WarnNotFound(s.Select(m, args...).Length() == 0) {
|
|
return
|
|
}
|
|
s.Transaction(m, func() {
|
|
s.addCount(m, "", "1")
|
|
s.changeStatus(m, ScheduleCall, ScheduleExpire)
|
|
})
|
|
s.Select(m.FieldsSetDetail(), args...)
|
|
s.sendTemplate(m, "服务已过号")
|
|
}
|
|
func (s Schedule) Finish(m *ice.Message, arg ...string) {
|
|
defer m.ToastProcess("完成中...")("完成成功")
|
|
args := kit.Simple(model.CALL_UID, m.Option(model.USER_UID), m.OptionSimple(model.UID))
|
|
if m.WarnNotFound(s.Select(m, args...).Length() == 0) {
|
|
return
|
|
}
|
|
s.Transaction(m, func() {
|
|
s.addCount(m, "", "1")
|
|
s.changeStatus(m, ScheduleCall, ScheduleFinish)
|
|
})
|
|
s.Select(m.FieldsSetDetail(), args...)
|
|
s.sendTemplate(m, "服务已完成")
|
|
Portal{}.DashboardUpdate(m)
|
|
}
|
|
|
|
func init() { ice.TeamCtxCmd(Schedule{}) }
|
|
|
|
func (s Schedule) addCount(m *ice.Message, key, count string) {
|
|
m.Cmd(s.volume, s.AddCount, kit.Select(m.ActionKey(), key), count, m.Option(model.VOLUME_UID))
|
|
}
|
|
func (s Schedule) changeStatus(m *ice.Message, from, to ScheduleStatus, arg ...string) *ice.Message {
|
|
key := m.ActionKey() + "_time"
|
|
s.Table.ChangeStatus(m, m.Option(model.UID), int(from), int(to), append(arg, key, m.Time())...)
|
|
return m
|
|
}
|
|
func (s Schedule) sendTemplate(m *ice.Message, title string, arg ...string) *ice.Message {
|
|
reception := m.Cmd(s.reception, s.Select, model.UID, m.Option(model.RECEPTION_UID))
|
|
s.Table.SendTemplate(m, "", m.Append(model.USER_UID), kit.JoinWord(title, reception.Append(model.NAME)),
|
|
kit.JoinWord(m.Option(model.CITY_NAME), m.Option(model.STREET_NAME), m.Option(model.PLACE_NAME)), kit.Select("", arg, 0), m.Option(model.QUEUE_UID))
|
|
return m
|
|
}
|
|
|
|
type ScheduleStatus int
|
|
|
|
const (
|
|
SchedulePlan ScheduleStatus = iota
|
|
ScheduleCancel
|
|
ScheduleTake
|
|
ScheduleCall
|
|
ScheduleExpire
|
|
ScheduleFinish
|
|
)
|
|
|
|
var ScheduleStatusList = map[ScheduleStatus]string{
|
|
SchedulePlan: "plan",
|
|
ScheduleCancel: "cancel",
|
|
ScheduleTake: "take",
|
|
ScheduleCall: "call",
|
|
ScheduleExpire: "expire",
|
|
ScheduleFinish: "finish",
|
|
}
|
|
|
|
func (s ScheduleStatus) String() string { return ScheduleStatusList[s] }
|