equipment.go 13 KB

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