6
0

equipment.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. package equipment
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. "lims_adapter/common"
  7. "lims_adapter/dao/equipment"
  8. equipment2 "lims_adapter/model/equipment"
  9. "lims_adapter/model/user"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "dashoo.cn/micro_libary/myerrors"
  14. "dashoo.cn/micro_libary/request"
  15. "github.com/gogf/gf/frame/g"
  16. "github.com/gogf/gf/os/gtime"
  17. "github.com/gogf/gf/util/gconv"
  18. )
  19. // Service 设备
  20. type Service struct {
  21. Dao *equipment.BaseEquipmentQualificationDao
  22. Tenant string
  23. }
  24. // NewSrv 服务初始化
  25. func NewSrv(tenant string) Service {
  26. return Service{Dao: equipment.NewBaseEquipmentQualificationDao(tenant), Tenant: tenant}
  27. }
  28. // AppointmentQualificationList 预约资格分页查询
  29. func (s Service) AppointmentQualificationList(req *equipment2.QualificationListReq) ([]user.UserQualification, int, error) {
  30. var current = req.Current
  31. var size = req.Size
  32. var enabled = req.Enabled
  33. var instrumentId = req.InstrumentId
  34. var reqType = req.Type
  35. entity := s.Dao.DB.Model("base_user a")
  36. var userInfo []user.UserQualification
  37. where := "a.Enabled = " + strconv.Itoa(enabled) + " and b.EquipmentId = " + strconv.Itoa(instrumentId)
  38. if reqType == 1 { // 预约资格查询条件
  39. where += " and (b.Qualification = 1 or b.Qualification = 2)"
  40. } else if reqType == 2 { // 优先预约权查询条件
  41. where += " and b.Qualification = 3"
  42. }
  43. entity.LeftJoin("base_equipment_qualification b", "a.id = b.UserId").
  44. Where(where)
  45. count, _ := entity.Count()
  46. err := entity.Fields("a.Id, a.UserName, a.RealName, a.Mobile, b.Qualification, b.AuthorizeTime").
  47. Page(current, size).Scan(&userInfo)
  48. if err != nil {
  49. return nil, 0, err
  50. }
  51. return userInfo, count, nil
  52. }
  53. // AdvanceList 优先预约权资格列表查询
  54. func (s Service) AdvanceList(req *equipment2.QualificationListReq) ([]user.UserQualification, int, error) {
  55. var current = req.Current
  56. var size = req.Size
  57. var enabled = req.Enabled
  58. var instrumentId = req.InstrumentId
  59. entity := s.Dao.DB.Model("base_user a")
  60. var userInfo []user.UserQualification
  61. entity.LeftJoin("base_equipment_qualification b", "a.id = b.UserId").
  62. Where("a.Enabled = " + strconv.Itoa(enabled) + " and b.EquipmentId = " + strconv.Itoa(instrumentId))
  63. count, _ := entity.Count()
  64. err := entity.Fields("a.Id, a.UserName, a.RealName, a.Mobile, b.AuthorizeTime").
  65. Page(current, size).Scan(&userInfo)
  66. if err != nil {
  67. return nil, 0, err
  68. }
  69. return userInfo, count, nil
  70. }
  71. // AddOrUpdateQualification 新增、修改预约资格名单;新增优先预约权名单
  72. func (s Service) AddOrUpdateQualification(req *equipment2.AddOrUpdateQualification, userInfo request.UserInfo) (err error) {
  73. entity := s.Dao.M
  74. var instrumentId = req.InstrumentId
  75. var ids = req.Ids
  76. var qualification = 1
  77. if req.QualificationType == "normal" {
  78. qualification = 1
  79. } else if req.QualificationType == "senior" {
  80. qualification = 2
  81. } else if req.QualificationType == "advance" {
  82. qualification = 3
  83. }
  84. //if qualification == 1 || qualification == 2 { // 预约资格
  85. for _, v := range ids {
  86. where := "EquipmentId = " + strconv.Itoa(instrumentId) + " and UserId = " +
  87. strconv.Itoa(v)
  88. if qualification == 1 || qualification == 2 { // 预约资格
  89. where += " and Qualification != 3"
  90. } else if qualification == 3 { // 优先预约权
  91. // 先判断是否有预约资格,没有则不更新操作
  92. count, _ := s.Dao.DB.Model("base_equipment_qualification").Where("EquipmentId = " +
  93. strconv.Itoa(instrumentId) + " and Qualification != 0" + " and UserId = " +
  94. strconv.Itoa(v)).Count()
  95. if count == 0 {
  96. continue
  97. }
  98. where += " and Qualification = 3"
  99. }
  100. var qualificationInfo equipment2.BaseEquipmentQualification
  101. entity.Where(where).Scan(&qualificationInfo)
  102. entity.Data(g.Map{"Id": qualificationInfo.Id, "EquipmentId": instrumentId, "UserId": v, "Qualification": qualification, "CreateOn": gtime.Now(),
  103. "AuthorizeTime": gtime.Now(), "CreateUserId": userInfo.Id, "CreateBy": userInfo.RealName}).Save()
  104. }
  105. //} else if qualification ==3 { // 优先预约权
  106. // for _, v := range ids {
  107. // var qualificationInfo model.BaseEquipmentQualification
  108. // entity.Where("EquipmentId = " + strconv.Itoa(instrumentId) + " and UserId = " +
  109. // strconv.Itoa(v) ).Scan(&qualificationInfo)
  110. // entity.Data(g.Map{"Id": qualificationInfo.Id,"EquipmentId": instrumentId, "UserId": v, "CreateOn": gtime.Now(),
  111. // "AuthorizeTime": gtime.Now(), "CreateUserId": userInfo.Id, "CreateBy": userInfo.RealName}).Save()
  112. // }
  113. //}
  114. return err
  115. }
  116. // DeleteQualification 删除预约资格
  117. func (s Service) DeleteQualification(req *equipment2.IdReq, info request.UserInfo) error {
  118. _, err := s.Dao.M.Update(g.Map{"Qualification": 0, "ModifiedOn": gtime.Now(),
  119. "ModifiedUserId": info.Id, "ModifiedBy": info.RealName}, "UserId = "+strconv.Itoa(req.UserId)+
  120. " and EquipmentId = "+strconv.Itoa(req.EquipmentId)+" and Qualification != 3")
  121. if err != nil {
  122. return err
  123. }
  124. return nil
  125. }
  126. // DeleteAdvance 删除优先预约权人员
  127. func (s Service) DeleteAdvance(req *equipment2.IdReq) error {
  128. _, err := s.Dao.M.Delete("UserId = " + strconv.Itoa(req.UserId) +
  129. " and EquipmentId = " + strconv.Itoa(req.EquipmentId) + " and Qualification = 3")
  130. if err != nil {
  131. return err
  132. }
  133. return nil
  134. }
  135. // SearchAdvanceTime 查看设备优先预约时间段
  136. func (s Service) SearchAdvanceTime(req *equipment2.QualificationListReq) (advanceTime []equipment2.BaseEquipmentAdvanceTime, count int, err error) {
  137. entity := s.Dao.DB.Model("base_equipment_advance_time")
  138. err = entity.Where("EquipmentId = " + strconv.Itoa(req.InstrumentId)).Scan(&advanceTime)
  139. count, _ = entity.CountColumn("1")
  140. err = entity.Fields("Week, StartTime,EndTime").Order("Week").Page(req.Current, req.Size).Scan(&advanceTime)
  141. if err != nil {
  142. return advanceTime, count, err
  143. }
  144. return advanceTime, count, nil
  145. }
  146. // AddAdvanceTime 添加设备优先预约时间段
  147. func (s Service) AddAdvanceTime(req *equipment2.AdvanceTimeReq, info request.UserInfo) error {
  148. //for _, v := range domains {
  149. // count, err := s.Dao.DB.Model("base_equipment_advance_time").Where("Week = '" + v.Week +
  150. // "' and StartTime = '" + v.StartTime + "' and EndTime = '" + v.EndTime + "'").Count()
  151. // if err != nil{
  152. // return err
  153. // }
  154. // if count == 0 {
  155. // week, _ := strconv.Atoi(v.Week)
  156. // saveEntity := model.BaseEquipmentAdvanceTime{
  157. // EquipmentId: equipmentId,
  158. // Week: week,
  159. // StartTime: v.StartTime,
  160. // EndTime: v.EndTime,
  161. // CreateOn: gtime.Now(),
  162. // CreateUserId: gconv.Int(info.Id),
  163. // CreateBy: info.RealName,
  164. // }
  165. // s.Dao.DB.Model("base_equipment_advance_time").Insert(saveEntity)
  166. // }
  167. //}
  168. count, err := s.Dao.DB.Model("base_equipment_advance_time").Where("EquipmentId = " +
  169. strconv.Itoa(req.EquipmentId) + " and Week = " + req.Week +
  170. " and StartTime = '" + req.StartTime + "' and EndTime = '" + req.EndTime + "'").Count()
  171. if err != nil {
  172. return err
  173. }
  174. if count > 0 {
  175. return errors.New("该时间段已存在,请重新输入!")
  176. }
  177. week, _ := strconv.Atoi(req.Week)
  178. saveEntity := equipment2.BaseEquipmentAdvanceTime{
  179. EquipmentId: req.EquipmentId,
  180. Week: week,
  181. StartTime: req.StartTime,
  182. EndTime: req.EndTime,
  183. CreateOn: gtime.Now(),
  184. CreateUserId: gconv.Int(info.Id),
  185. CreateBy: info.RealName,
  186. }
  187. _, err = s.Dao.DB.Model("base_equipment_advance_time").Insert(saveEntity)
  188. if err != nil {
  189. return err
  190. }
  191. return nil
  192. }
  193. // DeleteAdvanceTime 删除设备预约时间段
  194. func (s Service) DeleteAdvanceTime(id int) error {
  195. _, err := s.Dao.DB.Model("base_equipment_advance_time").Delete("Id = " + strconv.Itoa(id))
  196. if err != nil {
  197. return err
  198. }
  199. return nil
  200. }
  201. // AppointmentTime 设备预约时间段
  202. func (s Service) AppointmentTime(req *equipment2.IdReq) error {
  203. // 先查该人员的预约资格、优先使用权
  204. var qualificationInfo []equipment2.BaseEquipmentQualification
  205. s.Dao.DB.Model("base_equipment_qualification").Where("EquipmentId = " +
  206. strconv.Itoa(req.EquipmentId)).Order("Qualification").Scan(&qualificationInfo)
  207. // 如果是普通预约资格,筛选出周末时间段
  208. if qualificationInfo[0].Qualification == "1" {
  209. // TODO 时间获取
  210. }
  211. // 如果有预约资格但没有优先使用权,查询优先使用权时间段
  212. if len(qualificationInfo) == 2 && qualificationInfo[1].Qualification == "3" {
  213. var appointmentInfo []equipment2.BaseEquipmentAdvanceTime
  214. s.Dao.DB.Model("base_equipment_advance_time").Where("EquipmentId = " +
  215. strconv.Itoa(req.EquipmentId) + " and UserId").Scan(&appointmentInfo)
  216. }
  217. return nil
  218. }
  219. func (s Service) AppointTimeSplit() int {
  220. return g.Cfg().GetInt("appointment.time_split", 30)
  221. }
  222. type AppointTimeInfoAppoint struct {
  223. Id int `json:"id"`
  224. Start string `json:"start"`
  225. End string `json:"end"`
  226. Status int `json:"status"`
  227. Uid int `json:"uid"`
  228. Uname string `json:"uname"`
  229. Tel string `json:"tel"`
  230. Dept string `json:"dept"`
  231. }
  232. type AppointTimeInfoInstrument struct {
  233. Id int
  234. Weekday string
  235. BeginAt *gtime.Time
  236. EndAt *gtime.Time
  237. IsAppointAvailable int // 是否默认可预约 1是 2否
  238. InAdvance int // 需要提前预约时间 单位小时
  239. FurtherRange int // 未来可预约范围 单位周
  240. }
  241. type TimeSpan struct {
  242. Start *gtime.Time `json:"start"`
  243. End *gtime.Time `json:"end"`
  244. }
  245. // 获取指定仪器预约信息
  246. func (s Service) AppointTimeInfo(req *equipment2.AppointTimeInfoReq, userinfo request.UserInfo) (map[string]interface{}, error) {
  247. if req.InstrumentId == 0 {
  248. return nil, myerrors.NewMsgError(nil, "仪器 Id 不能为空")
  249. }
  250. if req.Date == nil {
  251. return nil, myerrors.NewMsgError(nil, "日期不能为空")
  252. }
  253. timesplit := s.AppointTimeSplit()
  254. days := common.Weekday(req.Date.Time)
  255. var instr AppointTimeInfoInstrument
  256. err := s.Dao.DB.Table("instrument").
  257. Where("Id", req.InstrumentId).
  258. Fields("Id, BeginAt, EndAt, Weekday, IsAppointAvailable, InAdvance, FurtherRange").
  259. Struct(&instr)
  260. if err != nil {
  261. return nil, err
  262. }
  263. // 需要包含超时未上机的预约
  264. appointStatus := g.Slice{1, 2, 10}
  265. var appointInfo []AppointTimeInfoAppoint
  266. err = s.Dao.DB.Table("appointment a").LeftJoin("base_user b", "a.UserId=b.Id").Unscoped().
  267. Where("a.DeletedAt IS NULL").
  268. Where("a.RelevanceId", req.InstrumentId).
  269. WherePri("a.Status", appointStatus).
  270. Where("a.EndTime > ?", days[0]).
  271. Where("a.EndTime <= ?", days[6].Add(time.Hour*24)).
  272. Fields("a.Id, 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").
  273. Structs(&appointInfo)
  274. if err == sql.ErrNoRows {
  275. err = nil
  276. }
  277. if err != nil {
  278. return nil, err
  279. }
  280. instrWeekStr := strings.Split(instr.Weekday, ",")
  281. instrWeek := []int{}
  282. for _, i := range instrWeekStr {
  283. d, err := strconv.Atoi(i)
  284. if err != nil {
  285. continue
  286. }
  287. instrWeek = append(instrWeek, d)
  288. }
  289. toRemoveDay := []int{}
  290. for i := 1; i <= 7; i++ {
  291. if !common.SliceIntcontains(instrWeek, i) {
  292. toRemoveDay = append(toRemoveDay, i)
  293. }
  294. }
  295. // 普通资格不可以预约周六周日的时间
  296. if instr.IsAppointAvailable != 1 {
  297. count, err := s.Dao.DB.Model("base_equipment_qualification").
  298. Where("EquipmentId = ?", req.InstrumentId).
  299. Where("UserId = ?", userinfo.Id).
  300. Where("Qualification = 1").Count()
  301. if err != nil {
  302. return nil, err
  303. }
  304. if count != 0 {
  305. if !common.SliceIntcontains(toRemoveDay, 6) {
  306. toRemoveDay = append(toRemoveDay, 6)
  307. }
  308. if !common.SliceIntcontains(toRemoveDay, 7) {
  309. toRemoveDay = append(toRemoveDay, 7)
  310. }
  311. }
  312. }
  313. // 优先预约权
  314. advanceTimeList := []equipment2.BaseEquipmentAdvanceTime{}
  315. qualificationCount, err := s.Dao.DB.Model("base_equipment_qualification").
  316. Where("EquipmentId = ?", req.InstrumentId).
  317. Where("UserId = ?", userinfo.Id).
  318. Where("Qualification = 3").Count()
  319. if err != nil {
  320. return nil, err
  321. }
  322. if qualificationCount == 0 {
  323. err := s.Dao.DB.Model("base_equipment_advance_time").
  324. Where("EquipmentId = ?", req.InstrumentId).
  325. Structs(&advanceTimeList)
  326. if err == sql.ErrNoRows {
  327. err = nil
  328. }
  329. if err != nil {
  330. return nil, err
  331. }
  332. }
  333. unavailable := []TimeSpan{}
  334. // 仪器设置的可预约范围外
  335. for i, d := range days {
  336. if common.SliceIntcontains(toRemoveDay, i+1) {
  337. unavailable = append(unavailable, TimeSpan{
  338. Start: gtime.NewFromTime(d),
  339. End: gtime.NewFromTime(d.Add(24 * time.Hour)),
  340. })
  341. continue
  342. }
  343. if instr.BeginAt.Hour() != 0 || instr.BeginAt.Minute() != 0 {
  344. end := d.Add(
  345. time.Hour*time.Duration(instr.BeginAt.Hour()) +
  346. time.Minute*time.Duration(instr.BeginAt.Minute()))
  347. unavailable = append(unavailable, TimeSpan{
  348. Start: gtime.NewFromTime(d),
  349. End: gtime.NewFromTime(end),
  350. })
  351. }
  352. endat := instr.EndAt.Add(time.Minute * time.Duration(timesplit))
  353. if endat.Hour() != 0 || endat.Minute() != 0 {
  354. start := d.Add(
  355. time.Hour*time.Duration(endat.Hour()) +
  356. time.Minute*time.Duration(endat.Minute()))
  357. unavailable = append(unavailable, TimeSpan{
  358. Start: gtime.NewFromTime(start),
  359. End: gtime.NewFromTime(d.Add(time.Hour * 24)),
  360. })
  361. }
  362. }
  363. // 优先预约时间段
  364. for _, i := range advanceTimeList {
  365. if i.Week == 0 {
  366. continue
  367. }
  368. startTime, err := time.Parse("15:04", i.StartTime)
  369. if err != nil {
  370. continue
  371. }
  372. endTime, err := time.Parse("15:04", i.EndTime)
  373. if err != nil {
  374. continue
  375. }
  376. d := days[i.Week-1]
  377. start := d.Add(
  378. time.Hour*time.Duration(startTime.Hour()) +
  379. time.Minute*time.Duration(startTime.Minute()))
  380. end := d.Add(
  381. time.Hour*time.Duration(endTime.Hour()) +
  382. time.Minute*time.Duration(endTime.Minute()))
  383. unavailable = append(unavailable, TimeSpan{
  384. Start: gtime.NewFromTime(start),
  385. End: gtime.NewFromTime(end),
  386. })
  387. }
  388. if instr.InAdvance != 0 {
  389. start := time.Now()
  390. var toNextSpan time.Duration
  391. if start.Minute()%timesplit != 0 {
  392. toNextSpan = time.Duration(timesplit - start.Minute()%timesplit) * time.Minute
  393. }
  394. start = time.Date(start.Year(), start.Month(), start.Day(), start.Hour(), start.Minute(), 0, 0, time.Local)
  395. start = start.Add(toNextSpan)
  396. end := start.Add(time.Duration(instr.InAdvance) * time.Hour)
  397. unavailable = append(unavailable, TimeSpan{
  398. Start: gtime.NewFromTime(start),
  399. End: gtime.NewFromTime(end),
  400. })
  401. }
  402. return map[string]interface{}{
  403. "further_range": instr.FurtherRange,
  404. "time_split": timesplit,
  405. "begin_at": instr.BeginAt.Time.Format("15:04:05"),
  406. "ent_at": instr.EndAt.Time.Format("15:04:05"),
  407. "unavailable": unavailable,
  408. "appoint": appointInfo,
  409. }, nil
  410. }
  411. // 默认可预约: 否表示只有加入预约资格设置可以预约,是表示预约资格设置失效,都可以预约
  412. // 普通资格不可以预约周六周日的时间,资深资格无限制
  413. // 优先预约权设置: 优先预约时段内只有添加到优先预约人员的用户才能预约
  414. // SearchNoAppointment 查看不能预约时间段信息
  415. func (s Service) SearchNoAppointment(req *equipment2.IdReq, info request.UserInfo) ([]equipment2.NoReservationInfo, error) {
  416. // 普通资格限制周末时间
  417. var qualificationInfo []equipment2.BaseEquipmentQualification
  418. var noAppointmentInfos []equipment2.NoReservationInfo
  419. // 查询设备可预约时间段 和是否开启了默认可预约
  420. var equipmentInfo equipment2.Instrument
  421. s.Dao.DB.Model("instrument").Fields("IsAppointAvailable,BeginAt, EndAt").
  422. Where("Id = " + strconv.Itoa(req.EquipmentId)).Scan(&equipmentInfo)
  423. s.Dao.DB.Model("base_equipment_qualification").Where("EquipmentId = " +
  424. strconv.Itoa(req.EquipmentId) + " and UserId = " +
  425. strconv.Itoa(gconv.Int(info.Id))).Order("Qualification").Scan(&qualificationInfo)
  426. if len(qualificationInfo) >= 1 && qualificationInfo[0].Qualification == "1" && equipmentInfo.IsAppointAvailable != 1 { // 只有普通预约资格,限制周末预约时间段// 如果没有开启默认可预约 则进行时间段限制
  427. startTime := equipmentInfo.BeginAt
  428. endTime := equipmentInfo.EndAt
  429. // 设备当天预约时间总长度h
  430. timeLong := endTime.Sub(startTime).Hours()
  431. saturdayTime := noReservationInfo(startTime, timeLong, req.Date, 6)
  432. sundayTime := noReservationInfo(startTime, timeLong, req.Date, 7)
  433. noAppointmentInfos = append(saturdayTime, sundayTime...)
  434. }
  435. if len(qualificationInfo) == 1 && qualificationInfo[0].Qualification != "3" { // 没有优先预约权,限制优先预约时间段
  436. var advanceTimeList []equipment2.BaseEquipmentAdvanceTime
  437. s.Dao.DB.Model("base_equipment_advance_time").
  438. Where("EquipmentId = " + strconv.Itoa(req.EquipmentId)).Scan(&advanceTimeList)
  439. for _, v := range advanceTimeList {
  440. // TODO 遍历获取不能预约时间段
  441. startTime, _ := gtime.StrToTime(strings.Trim(v.StartTime, " "), "H:i")
  442. endTime, _ := gtime.StrToTime(strings.Trim(v.EndTime, " "), "H:i")
  443. timeLong := endTime.Sub(startTime).Hours()
  444. saturdayTime := noReservationInfo(startTime, timeLong, req.Date, v.Week)
  445. noAppointmentInfos = append(noAppointmentInfos, saturdayTime...)
  446. }
  447. }
  448. return noAppointmentInfos, nil
  449. }
  450. // ChangeInstrStauts 修改设备所属
  451. func (s Service) ChangeBelongs(req *equipment2.IdReq) error {
  452. _, err := s.Dao.DB.Model("Instrument").
  453. Update("Belongs = "+req.Belongs, "Id = "+strconv.Itoa(req.EquipmentId))
  454. if err != nil {
  455. return err
  456. }
  457. return nil
  458. }
  459. // GetUnitCount 查询设备计费
  460. func (s Service) GetUnitCount(instrumentId int) (rspInfo []equipment2.Instrument, err error) {
  461. err = s.Dao.DB.Model("Instrument").Where("Id = ?", instrumentId).Scan(&rspInfo)
  462. if err != nil {
  463. return rspInfo, err
  464. }
  465. return rspInfo, nil
  466. }
  467. // UpdateUnifPrice 更新计费价格
  468. func (s Service) UpdateUnitPrice(instrumentId int, unitCount float64) error {
  469. _, err := s.Dao.DB.Model("Instrument").Update(fmt.Sprintf("unitCount=%v", unitCount), "Id = "+
  470. strconv.Itoa(instrumentId))
  471. if err != nil {
  472. return err
  473. }
  474. return nil
  475. }
  476. // RateChange 优惠比例更新
  477. func (s Service) RateChange(InstrumentId, rate int) error {
  478. _, err := s.Dao.DB.Model("Instrument").Update("Rate = "+strconv.Itoa(rate), "Id = "+
  479. strconv.Itoa(InstrumentId))
  480. if err != nil {
  481. return err
  482. }
  483. return nil
  484. }
  485. // IsAdvance 是否有优先预约资格
  486. func (s Service) IsAdvance(id int32, instrumentId int) (isAdvance int, err error) {
  487. equipmentQualification := equipment2.BaseEquipmentQualification{}
  488. err = s.Dao.DB.Model("base_equipment_qualification").Where("UserId", id).
  489. Where("Qualification", "3").Where("EquipmentId", instrumentId).Scan(&equipmentQualification)
  490. if err == sql.ErrNoRows {
  491. return 0, nil
  492. }
  493. return 1, nil
  494. }
  495. // noReservationInfo 不可预约时间段处理 startTime开始时间 timeLong 时间间隔 Date 前端传入日期 week 星期几
  496. func noReservationInfo(startTime *gtime.Time, timeLong float64, Date string, week int) (noAppointmentInfo []equipment2.NoReservationInfo) {
  497. date, _ := gtime.StrToTime(Date, "Y-m-d")
  498. // 获取当前星期对应的日期
  499. day := GetDate(date, week)
  500. grids := int(timeLong*2) + 1
  501. for i := 0; i < grids; i++ {
  502. // 开始时间
  503. start_time := startTime.Add(time.Duration(i) * 30 * time.Minute)
  504. //fmt.Println("day:", day, "week:", week, "start_time", fmt.Sprintf("%02d", start_time.Hour()) + ":"+fmt.Sprintf("%02d", start_time.Minute()), "status:", status)
  505. noAppointmentInfo = append(noAppointmentInfo, equipment2.NoReservationInfo{
  506. Day: day,
  507. Week: week,
  508. StartTime: fmt.Sprintf("%02d", start_time.Hour()) + ":" + fmt.Sprintf("%02d", start_time.Minute()),
  509. Status: 3,
  510. })
  511. }
  512. return noAppointmentInfo
  513. }
  514. // 获取当前星期对应的日期
  515. func GetDate(Date *gtime.Time, week int) int {
  516. weekday := Date.Weekday().String()
  517. var targetDay *gtime.Time
  518. switch weekday {
  519. case "Monday":
  520. targetDay = Date.AddDate(0, 0, week-1)
  521. case "Tuesday":
  522. targetDay = Date.AddDate(0, 0, week-2)
  523. case "Wednesday":
  524. targetDay = Date.AddDate(0, 0, week-3)
  525. case "Thursday":
  526. targetDay = Date.AddDate(0, 0, week-4)
  527. case "Friday":
  528. targetDay = Date.AddDate(0, 0, week-5)
  529. case "Saturday":
  530. targetDay = Date.AddDate(0, 0, week-6)
  531. case "Sunday":
  532. targetDay = Date.AddDate(0, 0, week-7)
  533. }
  534. _, _, day := targetDay.Date()
  535. return day
  536. }