equipment.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. package equipment
  2. import (
  3. "dashoo.cn/micro_libary/request"
  4. "errors"
  5. "fmt"
  6. "github.com/gogf/gf/frame/g"
  7. "github.com/gogf/gf/os/gtime"
  8. "github.com/gogf/gf/util/gconv"
  9. "lims_adapter/dao"
  10. "lims_adapter/model"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. // Service 设备
  16. type Service struct {
  17. Dao *dao.BaseEquipmentQualificationDao
  18. Tenant string
  19. }
  20. // NewSrv 服务初始化
  21. func NewSrv(tenant string) Service {
  22. return Service{Dao: dao.NewBaseEquipmentQualificationDao(tenant), Tenant: tenant}
  23. }
  24. // AppointmentQualificationList 预约资格分页查询
  25. func (s Service) AppointmentQualificationList(req *model.QualificationListReq) ([]model.UserQualification, int, error) {
  26. var current = req.Current
  27. var size = req.Size
  28. var enabled = req.Enabled
  29. var instrumentId = req.InstrumentId
  30. var reqType = req.Type
  31. entity := s.Dao.DB.Model("base_user a")
  32. var userInfo []model.UserQualification
  33. where := "a.Enabled = " + strconv.Itoa(enabled) + " and b.EquipmentId = " + strconv.Itoa(instrumentId)
  34. if reqType == 1 { // 预约资格查询条件
  35. where += " and (b.Qualification = 1 or b.Qualification = 2)"
  36. } else if reqType == 2 { // 优先预约权查询条件
  37. where += " and b.Qualification = 3"
  38. }
  39. entity.LeftJoin("base_equipment_qualification b", "a.id = b.UserId").
  40. Where(where)
  41. count, _:= entity.Count()
  42. err := entity.Fields("a.Id, a.UserName, a.RealName, a.Mobile, b.Qualification, b.AuthorizeTime").
  43. Page(current, size).Scan(&userInfo)
  44. if err != nil {
  45. return nil, 0, err
  46. }
  47. return userInfo, count, nil
  48. }
  49. // AdvanceList 优先预约权资格列表查询
  50. func (s Service) AdvanceList(req *model.QualificationListReq) ([]model.UserQualification, int, error) {
  51. var current = req.Current
  52. var size = req.Size
  53. var enabled = req.Enabled
  54. var instrumentId = req.InstrumentId
  55. entity := s.Dao.DB.Model("base_user a")
  56. var userInfo []model.UserQualification
  57. entity.LeftJoin("base_equipment_qualification b", "a.id = b.UserId").
  58. Where("a.Enabled = " + strconv.Itoa(enabled) + " and b.EquipmentId = " + strconv.Itoa(instrumentId))
  59. count, _ := entity.Count()
  60. err := entity.Fields("a.Id, a.UserName, a.RealName, a.Mobile, b.AuthorizeTime").
  61. Page(current, size).Scan(&userInfo)
  62. if err != nil {
  63. return nil, 0, err
  64. }
  65. return userInfo, count, nil
  66. }
  67. // AddOrUpdateQualification 新增、修改预约资格名单;新增优先预约权名单
  68. func (s Service) AddOrUpdateQualification(req *model.AddOrUpdateQualification, userInfo request.UserInfo) (err error) {
  69. entity := s.Dao.M
  70. var instrumentId = req.InstrumentId
  71. var ids = req.Ids
  72. var qualification = 1
  73. if req.QualificationType == "normal" {
  74. qualification = 1
  75. } else if req.QualificationType == "senior" {
  76. qualification = 2
  77. } else if req.QualificationType == "advance" {
  78. qualification = 3
  79. }
  80. //if qualification == 1 || qualification == 2 { // 预约资格
  81. for _, v := range ids {
  82. where := "EquipmentId = " + strconv.Itoa(instrumentId) + " and UserId = " +
  83. strconv.Itoa(v)
  84. if qualification == 1 || qualification == 2 { // 预约资格
  85. where += " and Qualification != 3"
  86. } else if qualification ==3 { // 优先预约权
  87. // 先判断是否有预约资格,没有则不更新操作
  88. count, _ := s.Dao.DB.Model("base_equipment_qualification").Where("EquipmentId = " +
  89. strconv.Itoa(instrumentId) + " and Qualification != 0" + " and UserId = " +
  90. strconv.Itoa(v)).Count()
  91. if count == 0 {
  92. continue
  93. }
  94. where += " and Qualification = 3"
  95. }
  96. var qualificationInfo model.BaseEquipmentQualification
  97. entity.Where(where).Scan(&qualificationInfo)
  98. entity.Data(g.Map{"Id": qualificationInfo.Id,"EquipmentId": instrumentId, "UserId": v, "Qualification": qualification, "CreateOn": gtime.Now(),
  99. "AuthorizeTime": gtime.Now(), "CreateUserId": userInfo.Id, "CreateBy": userInfo.RealName}).Save()
  100. }
  101. //} else if qualification ==3 { // 优先预约权
  102. // for _, v := range ids {
  103. // var qualificationInfo model.BaseEquipmentQualification
  104. // entity.Where("EquipmentId = " + strconv.Itoa(instrumentId) + " and UserId = " +
  105. // strconv.Itoa(v) ).Scan(&qualificationInfo)
  106. // entity.Data(g.Map{"Id": qualificationInfo.Id,"EquipmentId": instrumentId, "UserId": v, "CreateOn": gtime.Now(),
  107. // "AuthorizeTime": gtime.Now(), "CreateUserId": userInfo.Id, "CreateBy": userInfo.RealName}).Save()
  108. // }
  109. //}
  110. return err
  111. }
  112. // DeleteQualification 删除预约资格
  113. func (s Service) DeleteQualification(req *model.IdReq, info request.UserInfo) error {
  114. _, err := s.Dao.M.Update(g.Map{"Qualification": 0, "ModifiedOn": gtime.Now(),
  115. "ModifiedUserId": info.Id, "ModifiedBy": info.RealName}, "UserId = " + strconv.Itoa(req.UserId) +
  116. " and EquipmentId = " + strconv.Itoa(req.EquipmentId) + " and Qualification != 3")
  117. if err != nil {
  118. return err
  119. }
  120. return nil
  121. }
  122. // DeleteAdvance 删除优先预约权人员
  123. func (s Service) DeleteAdvance(req *model.IdReq) error {
  124. _, err := s.Dao.M.Delete("UserId = " + strconv.Itoa(req.UserId) +
  125. " and EquipmentId = " + strconv.Itoa(req.EquipmentId) + " and Qualification = 3")
  126. if err != nil {
  127. return err
  128. }
  129. return nil
  130. }
  131. // SearchAdvanceTime 查看设备优先预约时间段
  132. func (s Service) SearchAdvanceTime(req *model.QualificationListReq) (advanceTime []model.BaseEquipmentAdvanceTime, count int, err error) {
  133. entity := s.Dao.DB.Model("base_equipment_advance_time")
  134. err = entity.Where("EquipmentId = " + strconv.Itoa(req.InstrumentId)).Scan(&advanceTime)
  135. count, _ = entity.CountColumn("1")
  136. err = entity.Fields("Week, StartTime,EndTime").Order("Week").Page(req.Current, req.Size).Scan(&advanceTime)
  137. if err != nil {
  138. return advanceTime, count, err
  139. }
  140. return advanceTime, count, nil
  141. }
  142. // AddAdvanceTime 添加设备优先预约时间段
  143. func (s Service) AddAdvanceTime(req *model.AdvanceTimeReq, info request.UserInfo) error {
  144. //for _, v := range domains {
  145. // count, err := s.Dao.DB.Model("base_equipment_advance_time").Where("Week = '" + v.Week +
  146. // "' and StartTime = '" + v.StartTime + "' and EndTime = '" + v.EndTime + "'").Count()
  147. // if err != nil{
  148. // return err
  149. // }
  150. // if count == 0 {
  151. // week, _ := strconv.Atoi(v.Week)
  152. // saveEntity := model.BaseEquipmentAdvanceTime{
  153. // EquipmentId: equipmentId,
  154. // Week: week,
  155. // StartTime: v.StartTime,
  156. // EndTime: v.EndTime,
  157. // CreateOn: gtime.Now(),
  158. // CreateUserId: gconv.Int(info.Id),
  159. // CreateBy: info.RealName,
  160. // }
  161. // s.Dao.DB.Model("base_equipment_advance_time").Insert(saveEntity)
  162. // }
  163. //}
  164. count, err := s.Dao.DB.Model("base_equipment_advance_time").Where("EquipmentId = " +
  165. strconv.Itoa(req.EquipmentId) + " and Week = " + req.Week +
  166. " and StartTime = '" + req.StartTime + "' and EndTime = '" + req.EndTime + "'").Count()
  167. if err != nil{
  168. return err
  169. }
  170. if count > 0 {
  171. return errors.New("该时间段已存在,请重新输入!")
  172. }
  173. week, _ := strconv.Atoi(req.Week)
  174. saveEntity := model.BaseEquipmentAdvanceTime{
  175. EquipmentId: req.EquipmentId,
  176. Week: week,
  177. StartTime: req.StartTime,
  178. EndTime: req.EndTime,
  179. CreateOn: gtime.Now(),
  180. CreateUserId: gconv.Int(info.Id),
  181. CreateBy: info.RealName,
  182. }
  183. _, err = s.Dao.DB.Model("base_equipment_advance_time").Insert(saveEntity)
  184. if err != nil{
  185. return err
  186. }
  187. return nil
  188. }
  189. // DeleteAdvanceTime 删除设备预约时间段
  190. func (s Service) DeleteAdvanceTime(id int) error {
  191. _, err := s.Dao.DB.Model("base_equipment_advance_time").Delete("Id = " + strconv.Itoa(id))
  192. if err != nil {
  193. return err
  194. }
  195. return nil
  196. }
  197. // AppointmentTime 设备预约时间段
  198. func (s Service) AppointmentTime(req *model.IdReq) error{
  199. // 先查该人员的预约资格、优先使用权
  200. var qualificationInfo []model.BaseEquipmentQualification
  201. s.Dao.DB.Model("base_equipment_qualification").Where("EquipmentId = " +
  202. strconv.Itoa(req.EquipmentId)).Order("Qualification").Scan(&qualificationInfo)
  203. // 如果是普通预约资格,筛选出周末时间段
  204. if qualificationInfo[0].Qualification == "1" {
  205. // TODO 时间获取
  206. }
  207. // 如果有预约资格但没有优先使用权,查询优先使用权时间段
  208. if len(qualificationInfo) ==2 && qualificationInfo[1].Qualification == "3"{
  209. var appointmentInfo []model.BaseEquipmentAdvanceTime
  210. s.Dao.DB.Model("base_equipment_advance_time").Where("EquipmentId = " +
  211. strconv.Itoa(req.EquipmentId) + " and UserId").Scan(&appointmentInfo)
  212. }
  213. return nil
  214. }
  215. // SearchNoAppointment 查看不能预约时间段信息
  216. func (s Service) SearchNoAppointment(req *model.IdReq, info request.UserInfo) ([]model.NoReservationInfo, error) {
  217. // 普通资格限制周末时间
  218. var qualificationInfo []model.BaseEquipmentQualification
  219. var noAppointmentInfos []model.NoReservationInfo
  220. s.Dao.DB.Model("base_equipment_qualification").Where("EquipmentId = " +
  221. strconv.Itoa(req.EquipmentId) + " and UserId = " +
  222. strconv.Itoa(gconv.Int(info.Id))).Order("Qualification").Scan(&qualificationInfo)
  223. if len(qualificationInfo) >= 1 && qualificationInfo[0].Qualification == "1" { // 只有普通预约资格,限制周末预约时间段
  224. // 查询设备可预约时间段
  225. var equipmentInfo model.Instrument
  226. s.Dao.DB.Model("instrument").Fields("BeginAt, EndAt").
  227. Where("Id = " + strconv.Itoa(req.EquipmentId)).Scan(&equipmentInfo)
  228. startTime := equipmentInfo.BeginAt
  229. endTime := equipmentInfo.EndAt
  230. // 设备当天预约时间总长度h
  231. timeLong := endTime.Sub(startTime).Hours()
  232. saturdayTime := noReservationInfo(startTime, timeLong, req.Date, 6)
  233. sundayTime := noReservationInfo(startTime, timeLong, req.Date, 7)
  234. noAppointmentInfos = append(saturdayTime, sundayTime...)
  235. }
  236. if len(qualificationInfo) == 1 && qualificationInfo[0].Qualification != "3" { // 没有优先预约权,限制优先预约时间段
  237. var advanceTimeList []model.BaseEquipmentAdvanceTime
  238. s.Dao.DB.Model("base_equipment_advance_time").
  239. Where("EquipmentId = " + strconv.Itoa(req.EquipmentId)).Scan(&advanceTimeList)
  240. for _, v := range advanceTimeList {
  241. // TODO 遍历获取不能预约时间段
  242. startTime, _ := gtime.StrToTime(strings.Trim(v.StartTime, " "), "H:i")
  243. endTime, _ := gtime.StrToTime(strings.Trim(v.EndTime, " "), "H:i")
  244. timeLong := endTime.Sub(startTime).Hours()
  245. saturdayTime := noReservationInfo(startTime, timeLong, req.Date, v.Week)
  246. noAppointmentInfos = append(noAppointmentInfos, saturdayTime...)
  247. }
  248. }
  249. return noAppointmentInfos, nil
  250. }
  251. // ChangeInstrStauts 修改设备所属
  252. func (s Service) ChangeBelongs(req *model.IdReq) error{
  253. _, err := s.Dao.DB.Model("Instrument").
  254. Update("Belongs = " + req.Belongs, "Id = "+strconv.Itoa(req.EquipmentId))
  255. if err != nil {
  256. return err
  257. }
  258. return nil
  259. }
  260. // noReservationInfo 不可预约时间段处理 startTime开始时间 timeLong 时间间隔 Date 前端传入日期 week 星期几
  261. func noReservationInfo(startTime *gtime.Time, timeLong float64, Date string, week int) (noAppointmentInfo []model.NoReservationInfo) {
  262. date, _ := gtime.StrToTime(Date, "Y-m-d")
  263. // 获取当前星期对应的日期
  264. day := GetDate(date, week)
  265. grids := int(timeLong * 2)
  266. for i := 0; i < grids; i++ {
  267. // 开始时间
  268. start_time := startTime.Add(time.Duration(i) * 30 * time.Minute)
  269. //fmt.Println("day:", day, "week:", week, "start_time", fmt.Sprintf("%02d", start_time.Hour()) + ":"+fmt.Sprintf("%02d", start_time.Minute()), "status:", status)
  270. noAppointmentInfo = append(noAppointmentInfo, model.NoReservationInfo{
  271. Day : day,
  272. Week : week,
  273. StartTime : fmt.Sprintf("%02d", start_time.Hour()) + ":"+fmt.Sprintf("%02d", start_time.Minute()),
  274. Status : 3,
  275. })
  276. }
  277. return noAppointmentInfo
  278. }
  279. // 获取当前星期对应的日期
  280. func GetDate(Date *gtime.Time, week int) int{
  281. weekday := Date.Weekday().String()
  282. var targetDay *gtime.Time
  283. switch weekday {
  284. case "Monday": targetDay = Date.AddDate(0, 0, week - 1)
  285. case "Tuesday": targetDay = Date.AddDate(0, 0, week - 2)
  286. case "Wednesday": targetDay = Date.AddDate(0, 0, week - 3)
  287. case "Thursday": targetDay = Date.AddDate(0, 0, week - 4)
  288. case "Friday": targetDay = Date.AddDate(0, 0, week - 5)
  289. case "Saturday": targetDay = Date.AddDate(0, 0, week - 6)
  290. case "Sunday": targetDay = Date.AddDate(0, 0, week - 7)
  291. }
  292. _, _, day := targetDay.Date()
  293. return day
  294. }