report.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. package service
  2. import (
  3. "fmt"
  4. "github.com/astaxie/beego/logs"
  5. "github.com/pkg/errors"
  6. "kpt.xdmy/apiserver/model"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. //
  12. func MaintainList(pastureName, eqClassIdStr string, startTime, endTime time.Time, offset, pagecount int) (int, []map[string]interface{}, error) {
  13. //eqClassIdList := []string{}
  14. var total int64
  15. eqList := make([]*model.EqClassAndPasture, 0)
  16. //if eqClassIdStr == "" {
  17. //eqList := make([]*model.EqClass, 0)
  18. //s.d.DB.Raw()
  19. s.d.DB.Raw("select e.id,p.id,e.typeName,p.name from eqclass e join pasture p where section = 3 "+
  20. "and (p.name = ? or ? = '现代牧业' or ?= '') and p.IsEnergy = 0 and p.name != '现代牧业' and (e.id = ? or ?= '') limit ?,?",
  21. pastureName, pastureName, pastureName, eqClassIdStr, eqClassIdStr, offset-1, pagecount).Find(&eqList)
  22. s.d.DB.Raw("select count(1) from eqclass e join pasture p where section = 3 "+
  23. "and (p.name = ? or ? = '现代牧业' or ?= '') and p.IsEnergy = 0 and p.name != '现代牧业' and (e.id = ? or ?= '') ",
  24. pastureName, pastureName, pastureName, eqClassIdStr, eqClassIdStr).Count(&total)
  25. //} else {
  26. // eqClassIdList = append(eqClassIdList, eqClassIdStr)
  27. // total = 1
  28. //}
  29. //pasture := new(model.Pasture)
  30. //s.d.DB.Where("name = ?", pastureName).First(&pasture)
  31. respMap := make([]map[string]interface{}, 0)
  32. for _, eq := range eqList {
  33. pastureMaintainList := make([]*model.Maintain, 0)
  34. err := s.d.DB.Raw(` SELECT m.* FROM maintain m JOIN equipment e on e.id = m.eqId WHERE e.eqClassId = ?
  35. and m.stopTime is not null and (m.pastureid = (select id from pasture where name = ? and name != '现代牧业') or ? = '现代牧业' )
  36. and m.stopTime between ? and ? and TIMESTAMPDIFF(hour, m.orderTime, m.stopTime) < 1000 order by requestTime,m.pastureid `,
  37. eq.EqClass.ID, eq.Pasture.Name, eq.Pasture.Name, startTime, endTime).Find(&pastureMaintainList).Error
  38. if err != nil {
  39. return 0, nil, errors.New(fmt.Sprintf("查看维修信息出错 error:%s", err.Error()))
  40. }
  41. maintainMap := make(map[string][]*model.Maintain)
  42. pastureIDList := []string{}
  43. for _, pasture := range pastureMaintainList {
  44. pastureIDList = append(pastureIDList, pasture.PastureId)
  45. maintainMap[pasture.PastureId] = append(maintainMap[pasture.PastureId], pasture)
  46. }
  47. eqClass := model.EqClass{}
  48. err = s.d.DB.Where("id = ? ", eq.EqClass.ID).First(&eqClass).Error
  49. if err != nil {
  50. return 0, nil, errors.New("查询设备类别出错!!!")
  51. }
  52. pastureIDList = RemoveRepeatElement(pastureIDList)
  53. for _, pastureId := range pastureIDList {
  54. maintainList := maintainMap[pastureId]
  55. count := float64(len(maintainList))
  56. var t2, t3 float64
  57. data := make(map[string]interface{}, 0)
  58. mainMap := make(map[int64][]*model.Maintain, 0)
  59. //将每个不同的资产分类放进map
  60. eqIdList := []int64{}
  61. for _, main := range maintainList {
  62. eqIdList = append(eqIdList, main.EqId)
  63. mainMap[main.EqId] = append(mainMap[main.EqId], main)
  64. }
  65. //var stopTime, orderTime, requestTime time.Time
  66. eqIdList = uniqueArr(eqIdList)
  67. for _, k := range eqIdList {
  68. var stopTime, orderTime, requestTime time.Time
  69. mainList := mainMap[k]
  70. for i, main := range mainList {
  71. if i == 0 {
  72. //记录下维修结束时间方便下次计算t1
  73. stopTime = main.StopTime
  74. orderTime = main.OrderTime
  75. requestTime = main.RequestTime
  76. //每个资产第一次都根据筛选开始时间计算出t1
  77. t2 += main.OrderTime.Sub(main.RequestTime).Hours()
  78. t3 += main.StopTime.Sub(main.OrderTime).Hours()
  79. //fmt.Println(main.StopTime, main.OrderTime, "111111")
  80. //t1 += main.RequestTime.Sub(startTime).Minutes()
  81. } else {
  82. //t1 += main.RequestTime.Sub(stopTime).Minutes()
  83. t2 += main.OrderTime.Sub(main.RequestTime).Hours()
  84. t3 += main.StopTime.Sub(main.OrderTime).Hours()
  85. //fmt.Println(main.StopTime, main.OrderTime, "22222222")
  86. //记录下维修结束时间方便下次计算t1
  87. stopTime = main.StopTime
  88. orderTime = main.OrderTime
  89. requestTime = main.RequestTime
  90. }
  91. }
  92. if stopTime.Format("2006") == "0001" {
  93. //如果还没有结束获取当前时间计算t1
  94. if orderTime.Format("2006") == "0001" {
  95. t2 += requestTime.Sub(time.Now()).Hours()
  96. } else {
  97. if time.Now().Unix() < endTime.Unix() {
  98. t3 += time.Now().Sub(orderTime).Hours()
  99. } else {
  100. t3 += endTime.Sub(orderTime).Hours()
  101. }
  102. }
  103. }
  104. }
  105. equipmentList := make([]*model.Equipment, 0)
  106. err = s.d.DB.Where("id not in(?) ", eqIdList).
  107. Where(" entranceDate < ? and ( blockTime is null or blockTime = '' or blockTime > ? or blockTime = '0000-00-00 00:00:00' ) "+
  108. "and pastureid = ? and eqClassId = ? ",
  109. endTime, startTime, pastureId, eq.EqClass.ID).Find(&equipmentList).Error
  110. if err != nil {
  111. return 0, nil, errors.New(fmt.Sprintf("查询资产信息出错 error:%v", err))
  112. }
  113. day := ((endTime.Unix() - startTime.Unix()) / 60 / 60 / 24)
  114. count1 := float64(len(mainMap))
  115. allCount := (24 * (count1 + float64(len(equipmentList)))) * float64(day)
  116. data["mtbf"] = FloatRound(allCount/count, 2)
  117. data["mttr"] = FloatRound((t2+t3)/count, 2)
  118. data["mttf"] = FloatRound((allCount-t2-t3)/count, 2)
  119. data["count"] = count
  120. data["eqClassId"] = eqClass.ID
  121. pasture := model.Pasture{}
  122. err := s.d.DB.Where("id = ? ", pastureId).First(&pasture).Error
  123. if err != nil {
  124. return 0, nil, errors.New("查询牧场信息出错!!!")
  125. }
  126. data["pastureId"] = pasture.ID
  127. data["pastureName"] = pasture.Name
  128. data["eqClassName"] = eqClass.TypeName
  129. respMap = append(respMap, data)
  130. }
  131. exist := false
  132. for _, p := range respMap {
  133. if p["eqClassId"] != nil {
  134. //str := strconv.Itoa(p["eqClassId"].(int))
  135. if p["eqClassId"].(int) == eq.EqClass.ID && p["pastureId"].(int) == eq.Pasture.ID {
  136. exist = true
  137. break
  138. }
  139. }
  140. }
  141. if !exist {
  142. data := make(map[string]interface{}, 0)
  143. data["pastureName"] = pastureName
  144. data["pastureId"] = eq.Pasture.ID
  145. data["eqClassName"] = eqClass.TypeName
  146. data["mtbf"] = 0
  147. data["mttr"] = 0
  148. data["mttf"] = 0
  149. data["count"] = 0
  150. data["eqClassId"] = eqClass.ID
  151. respMap = append(respMap, data)
  152. }
  153. //}
  154. }
  155. return int(total), respMap, nil
  156. }
  157. func FloatRound(f float64, n int) float64 {
  158. format := "%." + strconv.Itoa(n) + "f"
  159. res, _ := strconv.ParseFloat(fmt.Sprintf(format, f), 64)
  160. return res
  161. }
  162. func RemoveRepeatElement(list []string) []string {
  163. // 创建一个临时map用来存储数组元素
  164. temp := make(map[string]bool)
  165. var list2 []string
  166. index := 0
  167. for _, v := range list {
  168. // 遍历数组元素,判断此元素是否已经存在map中
  169. _, ok := temp[v]
  170. if !ok {
  171. list2 = append(list2, v)
  172. temp[v] = true
  173. }
  174. index++
  175. }
  176. return list2
  177. }
  178. func uniqueArr(arr []int64) []int64 {
  179. newArr := make([]int64, 0)
  180. tempArr := make(map[int64]bool, len(newArr))
  181. for _, v := range arr {
  182. if tempArr[v] == false {
  183. tempArr[v] = true
  184. newArr = append(newArr, v)
  185. }
  186. }
  187. return newArr
  188. }
  189. func GetOversee(pastureId, eqClassId, empname string, offset, pagecount int) ([]map[string]interface{}, error) {
  190. overseeList := make([]*model.Oversee, 0)
  191. eq := s.d.DB.Where(" ( ? = '' or pastureid = ? )", pastureId, pastureId)
  192. if eqClassId != "" {
  193. eq.Where("eqClassId = ?", eqClassId)
  194. }
  195. if empname != "" {
  196. eq.Where("maintenance like ?", "%"+empname+"%")
  197. }
  198. err := eq.Offset(offset).Limit(pagecount).Order("inputTime desc ").Find(&overseeList).Error
  199. if err != nil {
  200. logs.Error(err)
  201. return nil, errors.New(fmt.Sprintf("查询督办数据出错 errors: %v", err))
  202. }
  203. userIds := []string{}
  204. for _, oversee := range overseeList {
  205. u := strings.Split(oversee.Maintenance, ",")
  206. userIds = append(userIds, oversee.Levelone, oversee.Leveltwo, oversee.Levelthree, oversee.Entryperson)
  207. userIds = append(userIds, u...)
  208. }
  209. userIds = RemoveRepeatElement(userIds)
  210. userList := make([]*model.User, 0)
  211. if len(userIds) > 0 {
  212. err = s.d.DB.Raw(` select u.id,u.username,u.empid,e.empname from user u join emp e on e.empcode = u.username where u.username in(?)`, userIds).Find(&userList).Error
  213. if err != nil {
  214. logs.Error(err)
  215. return nil, errors.New(fmt.Sprintf("查询督办数据出错 errors: %v", err))
  216. }
  217. }
  218. userMap := make(map[string]*model.User)
  219. for _, user := range userList {
  220. userMap[user.Username] = user
  221. }
  222. respOversee := make([]map[string]interface{}, 0)
  223. for _, oversee := range overseeList {
  224. arg := make(map[string]interface{})
  225. arg["id"] = oversee.ID
  226. arg["pastureName"] = oversee.PastureName
  227. arg["pastureId"] = oversee.PastureId
  228. arg["pushTime"] = oversee.PushTime
  229. arg["inputTime"] = oversee.InputTime.Format("2006-01-02")
  230. arg["departmentId"] = oversee.DepartmentId
  231. arg["departmentName"] = oversee.DepartmentName
  232. arg["eqClassName"] = oversee.EqClassName
  233. arg["eqClassId"] = oversee.EqClassId
  234. arg["entryperson"] = oversee.Entryperson
  235. if _, ok := userMap[oversee.Entryperson]; ok {
  236. arg["entrypersonName"] = userMap[oversee.Entryperson].EmpName
  237. arg["entrypersonId"] = userMap[oversee.Entryperson].Username
  238. }
  239. arg["levelone"] = oversee.Levelone
  240. if _, ok := userMap[oversee.Levelone]; ok {
  241. arg["leveloneName"] = userMap[oversee.Levelone].EmpName
  242. arg["leveloneId"] = userMap[oversee.Levelone].Username
  243. }
  244. arg["leveltwo"] = oversee.Leveltwo
  245. if _, ok := userMap[oversee.Leveltwo]; ok {
  246. arg["leveltwo"] = userMap[oversee.Leveltwo].EmpName
  247. arg["leveltwoId"] = userMap[oversee.Leveltwo].Username
  248. }
  249. arg["levelthree"] = oversee.Levelthree
  250. if _, ok := userMap[oversee.Levelthree]; ok {
  251. arg["levelthree"] = userMap[oversee.Levelthree].EmpName
  252. arg["levelthreeId"] = userMap[oversee.Levelthree].Username
  253. }
  254. maintenance := make([]map[string]interface{}, 0)
  255. for _, u := range strings.Split(oversee.Maintenance, ",") {
  256. main := make(map[string]interface{})
  257. main["id"] = userMap[u].Username
  258. main["empname"] = userMap[u].EmpName
  259. maintenance = append(maintenance, main)
  260. }
  261. arg["maintenance"] = maintenance
  262. respOversee = append(respOversee, arg)
  263. }
  264. return respOversee, nil
  265. }
  266. func StartStopRecord(pastureId, eqName string, startTime, endTime time.Time, offset, pagecount int) (map[string]interface{}, error) {
  267. eqDb := s.d.DB.Where(" pastureid = ? or '' = ? ", pastureId, pastureId)
  268. if eqName != "" {
  269. eqDb.Where("eqName = ? ", eqName)
  270. }
  271. eqList := make([]*model.Equipment, 0)
  272. if offset > 0 || pagecount > 0 {
  273. eqDb.Offset(offset).Limit(pagecount)
  274. }
  275. err := eqDb.Order("id").Find(&eqList).Error
  276. if err != nil {
  277. return nil, err
  278. }
  279. eqDb1 := s.d.DB.Table("equipment").Where(" pastureid = ? or '' = ? ", pastureId, pastureId)
  280. if eqName != "" {
  281. eqDb1.Where("eqName = ? ", eqName)
  282. }
  283. var count int64
  284. err = eqDb1.Count(&count).Error
  285. if err != nil {
  286. return nil, err
  287. }
  288. eqIDList := []int{}
  289. for _, eq := range eqList {
  290. eqIDList = append(eqIDList, eq.Id)
  291. }
  292. assetStt := make([]*model.AssetStt, 0)
  293. err = s.d.DB.Raw(`select * from asset_stt ast where ast.eqId in(?) and blockTime is not null
  294. union all
  295. select t.* from (
  296. select * from asset_stt ast where ast.eqId in(?) and blockTime is null order by enabledTime desc limit 999999999) t group by t.eqid`, eqIDList, eqIDList).Find(&assetStt).Error
  297. if err != nil {
  298. return nil, err
  299. }
  300. dataList := make([]map[string]interface{}, 0)
  301. pastureList := make([]*model.Pasture, 0)
  302. err = s.d.DB.Where(" id = ? or ? = '' ", pastureId, pastureId).Order("id").Find(&pastureList).Error
  303. if err != nil {
  304. return nil, errors.New("查询牧场信息出错!!!")
  305. }
  306. for _, eq := range eqList {
  307. arg := make(map[string]interface{})
  308. arg["eqName"] = eq.EqName
  309. var run float64
  310. for _, asset := range assetStt {
  311. if asset.EqId == int64(eq.Id) {
  312. if asset.BlockTime.Format("2006") == "0001" {
  313. if time.Now().Unix() > endTime.Unix() {
  314. run += endTime.Sub(asset.EnabledTime).Minutes() / 60
  315. } else {
  316. run += time.Now().Sub(asset.EnabledTime).Minutes() / 60
  317. }
  318. } else {
  319. run += asset.BlockTime.Sub(asset.EnabledTime).Minutes() / 60
  320. }
  321. }
  322. }
  323. t := endTime.Sub(startTime).Hours()
  324. arg["eqCode"] = eq.EqCode
  325. arg["run"] = FloatRound(run, 2)
  326. arg["stop"] = FloatRound(t-run, 2)
  327. for _, pasture := range pastureList {
  328. if pasture.ID == eq.PastureId {
  329. arg["pastureName"] = pasture.Name
  330. break
  331. }
  332. }
  333. arg["id"] = eq.Id
  334. dataList = append(dataList, arg)
  335. }
  336. resp := make(map[string]interface{})
  337. resp["total"] = count
  338. resp["pageNum"] = offset
  339. resp["pageSize"] = pagecount
  340. resp["list"] = dataList
  341. return resp, nil
  342. }
  343. func MaintainListPid(pastureName, eqClassId string, startTime, endTime time.Time, offset, pagecount int) (int, []map[string]interface{}, error) {
  344. eqClassList1 := make([]*model.EqClass, 0)
  345. start := (offset - 1) * pagecount
  346. page := offset * pagecount
  347. if eqClassId == "" {
  348. err := s.d.DB.Where(" section = 2 ").Find(&eqClassList1).Error
  349. if err != nil {
  350. return 0, nil, errors.New(fmt.Sprintf("查看维修类型出错 error:%s", err.Error()))
  351. }
  352. } else {
  353. n, _ := strconv.Atoi(eqClassId)
  354. eqClassList1 = append(eqClassList1, &model.EqClass{ID: n})
  355. }
  356. pastureList := make([]*model.Pasture, 0)
  357. err := s.d.DB.Select("id,name").Where(" name = ? or ? = '' or ?= '现代牧业' ", pastureName, pastureName, pastureName).Where("id != 18").Order("id").Find(&pastureList).Error
  358. if err != nil {
  359. return 0, nil, errors.New("查询牧场信息出错!!!")
  360. }
  361. respMap := make([]map[string]interface{}, 0)
  362. pastureCount := len(pastureList)
  363. n := 0
  364. for i, eq1 := range eqClassList1 {
  365. if len(respMap) >= pagecount {
  366. continue
  367. }
  368. eqClassList := make([]*model.EqClass, 0)
  369. err := s.d.DB.Where(" pid = ? ", eq1.ID).Find(&eqClassList).Error
  370. if err != nil {
  371. return 0, nil, errors.New(fmt.Sprintf("查看维修类型出错 error:%s", err.Error()))
  372. }
  373. n = n + pastureCount*(i+1)
  374. if n >= (offset-1)*pagecount {
  375. //if (start < (i+1)*pastureCount && start >= (i)*pastureCount) || (page >= (i)*pastureCount && page < (i+1)*pastureCount) {
  376. eqClass := model.EqClass{}
  377. err = s.d.DB.Where("id = ? ", eq1.ID).First(&eqClass).Error
  378. if err != nil {
  379. return 0, nil, errors.New("查询设备类别出错!!!")
  380. }
  381. eqClassMap := make(map[string]map[string]float64)
  382. for _, pastureId := range pastureList {
  383. eqClassMap[strconv.Itoa(pastureId.ID)] = make(map[string]float64)
  384. }
  385. for _, eq := range eqClassList {
  386. pastureMaintainList := make([]*model.Maintain, 0)
  387. err = s.d.DB.Raw(` SELECT m.eqId,m.pastureId,m.requestTime,m.orderTime,m.stopTime FROM maintain m JOIN equipment e on e.id = m.eqId WHERE e.eqClassid = ?
  388. and m.stopTime is not null and (m.pastureid = (select id from pasture where name = ? and name != '现代牧业') or ? = '现代牧业' or ?= '' )
  389. and m.stopTime between ? and ? and TIMESTAMPDIFF(hour, m.orderTime, m.stopTime) < 1000 order by requestTime,m.pastureid `,
  390. eq.ID, pastureName, pastureName, pastureName, startTime, endTime).Find(&pastureMaintainList).Error
  391. if err != nil {
  392. return 0, nil, errors.New(fmt.Sprintf("查看维修信息出错 error:%s", err.Error()))
  393. }
  394. maintainMap := make(map[string][]*model.Maintain, 0)
  395. pastureIDList := []string{}
  396. for _, pasture := range pastureMaintainList {
  397. pastureIDList = append(pastureIDList, pasture.PastureId)
  398. maintainMap[pasture.PastureId] = append(maintainMap[pasture.PastureId], pasture)
  399. }
  400. pastureIDList = RemoveRepeatElement(pastureIDList)
  401. for _, pastureId := range pastureIDList {
  402. maintainList := maintainMap[pastureId]
  403. count := float64(len(maintainList))
  404. var t2, t3 float64
  405. //data := make(map[string]interface{}, 0)
  406. mainMap := make(map[int64][]*model.Maintain, 0)
  407. //将每个不同的资产分类放进map
  408. eqIdList := []int64{}
  409. for _, main := range maintainList {
  410. eqIdList = append(eqIdList, main.EqId)
  411. mainMap[main.EqId] = append(mainMap[main.EqId], main)
  412. }
  413. //var stopTime, orderTime, requestTime time.Time
  414. eqIdList = uniqueArr(eqIdList)
  415. for _, k := range eqIdList {
  416. var stopTime, orderTime, requestTime time.Time
  417. mainList := mainMap[k]
  418. for i, main := range mainList {
  419. if i == 0 {
  420. //记录下维修结束时间方便下次计算t1
  421. stopTime = main.StopTime
  422. orderTime = main.OrderTime
  423. requestTime = main.RequestTime
  424. //每个资产第一次都根据筛选开始时间计算出t1
  425. t2 += main.OrderTime.Sub(main.RequestTime).Hours()
  426. t3 += main.StopTime.Sub(main.OrderTime).Hours()
  427. //fmt.Println(main.StopTime, main.OrderTime, "111111")
  428. //t1 += main.RequestTime.Sub(startTime).Minutes()
  429. } else {
  430. //t1 += main.RequestTime.Sub(stopTime).Minutes()
  431. t2 += main.OrderTime.Sub(main.RequestTime).Hours()
  432. t3 += main.StopTime.Sub(main.OrderTime).Hours()
  433. //fmt.Println(main.StopTime, main.OrderTime, "22222222")
  434. //记录下维修结束时间方便下次计算t1
  435. stopTime = main.StopTime
  436. orderTime = main.OrderTime
  437. requestTime = main.RequestTime
  438. }
  439. }
  440. if stopTime.Format("2006") == "0001" {
  441. //如果还没有结束获取当前时间计算t1
  442. if orderTime.Format("2006") == "0001" {
  443. t2 += requestTime.Sub(time.Now()).Hours()
  444. } else {
  445. if time.Now().Unix() < endTime.Unix() {
  446. t3 += time.Now().Sub(orderTime).Hours()
  447. } else {
  448. t3 += endTime.Sub(orderTime).Hours()
  449. }
  450. }
  451. }
  452. }
  453. equipmentList := make([]*model.Equipment, 0)
  454. err = s.d.DB.Select("id").Where("id not in(?) ", eqIdList).
  455. Where(" entranceDate < ? and ( blockTime is null or blockTime = '' or blockTime > ? or blockTime = '0000-00-00 00:00:00' ) "+
  456. "and pastureid = ? and eqClassId = ? ",
  457. endTime, startTime, pastureId, eq.ID).Find(&equipmentList).Error
  458. if err != nil {
  459. return 0, nil, errors.New(fmt.Sprintf("查询资产信息出错 error:%v", err))
  460. }
  461. day := ((endTime.Unix() - startTime.Unix()) / 60 / 60 / 24)
  462. count1 := float64(len(mainMap))
  463. allCount := (24 * (count1 + float64(len(equipmentList)))) * float64(day)
  464. eqClassMap[pastureId]["allCount"] += allCount
  465. eqClassMap[pastureId]["count"] += count
  466. eqClassMap[pastureId]["t2"] += t2
  467. eqClassMap[pastureId]["t3"] += t3
  468. //data["mtbf"] = FloatRound(allCount/count, 2)
  469. //data["mttr"] = FloatRound((t2+t3)/count, 2)
  470. //data["mttf"] = FloatRound((allCount-t2-t3)/count, 2)
  471. //data["count"] = count
  472. //pasture := model.Pasture{}
  473. //err := s.d.DB.Where("id = ? ", pastureId).First(&pasture).Error
  474. //if err != nil {
  475. // return nil, errors.New("查询牧场信息出错!!!")
  476. //}
  477. //data["pastureName"] = pasture.Name
  478. //data["eqClassName"] = eqClass.TypeName
  479. //respMap = append(respMap, data)
  480. }
  481. }
  482. for n, item := range pastureList {
  483. if len(respMap) >= pagecount {
  484. break
  485. } else if (i*pastureCount)+n < page && (i*pastureCount)+n >= start {
  486. pastureId := strconv.Itoa(item.ID)
  487. data := make(map[string]interface{})
  488. data["pastureName"] = item.Name
  489. data["pastureId"] = item.ID
  490. data["eqClassName"] = eqClass.TypeName
  491. data["eqId"] = eqClass.ID
  492. if _, ok := eqClassMap[pastureId]["count"]; ok {
  493. data["mtbf"] = FloatRound(eqClassMap[pastureId]["allCount"]/eqClassMap[pastureId]["count"], 2)
  494. data["mttr"] = FloatRound((eqClassMap[pastureId]["t2"]+eqClassMap[pastureId]["t3"])/eqClassMap[pastureId]["count"], 2)
  495. data["mttf"] = FloatRound((eqClassMap[pastureId]["allCount"]-eqClassMap[pastureId]["t2"]-eqClassMap[pastureId]["t3"])/eqClassMap[pastureId]["count"], 2)
  496. }
  497. data["count"] = eqClassMap[pastureId]["count"]
  498. respMap = append(respMap, data)
  499. }
  500. }
  501. }
  502. }
  503. return pastureCount * len(eqClassList1), respMap, nil
  504. }
  505. func MaintainListEquipment(pastureName, eqClassId string, startTime, endTime time.Time, offset, pageSize int, eqName string) (int64, []map[string]interface{}, error) {
  506. pastureMaintainList := make([]*model.Maintain, 0)
  507. err := s.d.DB.Raw(` SELECT m.* FROM maintain m JOIN equipment e on e.id = m.eqId WHERE e.eqClassId = ?
  508. and m.stopTime is not null and (m.pastureid = (select id from pasture where name = ? and name != '现代牧业') or ? = '现代牧业' )
  509. and m.stopTime between ? and ? and TIMESTAMPDIFF(hour, m.orderTime, m.stopTime) < 1000 order by requestTime,m.pastureid `,
  510. eqClassId, pastureName, pastureName, startTime, endTime).Find(&pastureMaintainList).Error
  511. if err != nil {
  512. return 0, nil, errors.New(fmt.Sprintf("查看维修信息出错 error:%s", err.Error()))
  513. }
  514. maintainMap := make(map[string][]*model.Maintain)
  515. eqid := []int64{}
  516. for _, pasture := range pastureMaintainList {
  517. eqid = append(eqid, pasture.EqId)
  518. maintainMap[pasture.PastureId] = append(maintainMap[pasture.PastureId], pasture)
  519. }
  520. eqClass := model.EqClass{}
  521. err = s.d.DB.Where("id = ? ", eqClassId).First(&eqClass).Error
  522. if err != nil {
  523. return 0, nil, errors.New("查询设备类别出错!!!")
  524. }
  525. //pastureIDList = RemoveRepeatElement(pastureIDList)
  526. pastureList := make([]*model.Pasture, 0)
  527. s.d.DB.Where("name = ?", pastureName).Find(&pastureList)
  528. eqList := make([]*model.Equipment, 0)
  529. err = s.d.DB.Where(" id in ? ", eqid).Where(" (pastureid = (select id from pasture where name = ? ) or ?='现代牧业') ", pastureName).Where(" ( eqName like concat('%',?,'%') or ?= '')", eqName, eqName).Offset(offset - 1).Limit(pageSize).Find(&eqList).Error
  530. if err != nil {
  531. return 0, nil, errors.New("查询设备出错!!!")
  532. }
  533. var total int64
  534. s.d.DB.Table("equipment").Where(" id in ? ", eqid).Where(" (pastureid = (select id from pasture where name = ? ) ) or ?='现代牧业 ", pastureName).Where(" ( eqName like concat('%',?,'%') or ?= '')", eqName, eqName).Count(&total)
  535. respMap := make([]map[string]interface{}, 0)
  536. for _, p := range pastureList {
  537. pastureId := strconv.Itoa(p.ID)
  538. maintainList := maintainMap[pastureId]
  539. //count := float64(len(maintainList))
  540. var t2, t3 float64
  541. mainMap := make(map[int64][]*model.Maintain, 0)
  542. //将每个不同的资产分类放进map
  543. //eqIdList := []int64{}
  544. for _, main := range maintainList {
  545. //eqIdList = append(eqIdList, main.EqId)
  546. mainMap[main.EqId] = append(mainMap[main.EqId], main)
  547. }
  548. //var stopTime, orderTime, requestTime time.Time
  549. //eqIdList = uniqueArr(eqIdList)
  550. //for _, k := range eqIdList {
  551. for _, eq := range eqList {
  552. var stopTime, orderTime, requestTime time.Time
  553. mainList := make([]*model.Maintain, 0)
  554. if _, ok := mainMap[int64(eq.Id)]; ok {
  555. mainList = mainMap[int64(eq.Id)]
  556. }
  557. for i, main := range mainList {
  558. if i == 0 {
  559. //记录下维修结束时间方便下次计算t1
  560. stopTime = main.StopTime
  561. orderTime = main.OrderTime
  562. requestTime = main.RequestTime
  563. //每个资产第一次都根据筛选开始时间计算出t1
  564. t2 += main.OrderTime.Sub(main.RequestTime).Hours()
  565. t3 += main.StopTime.Sub(main.OrderTime).Hours()
  566. //fmt.Println(main.StopTime, main.OrderTime, "111111")
  567. //t1 += main.RequestTime.Sub(startTime).Minutes()
  568. } else {
  569. //t1 += main.RequestTime.Sub(stopTime).Minutes()
  570. t2 += main.OrderTime.Sub(main.RequestTime).Hours()
  571. t3 += main.StopTime.Sub(main.OrderTime).Hours()
  572. //fmt.Println(main.StopTime, main.OrderTime, "22222222")
  573. //记录下维修结束时间方便下次计算t1
  574. stopTime = main.StopTime
  575. orderTime = main.OrderTime
  576. requestTime = main.RequestTime
  577. }
  578. }
  579. data := make(map[string]interface{}, 0)
  580. if len(mainList) > 0 {
  581. if stopTime.Format("2006") == "0001" {
  582. //如果还没有结束获取当前时间计算t1
  583. if orderTime.Format("2006") == "0001" {
  584. t2 += requestTime.Sub(time.Now()).Hours()
  585. } else {
  586. if time.Now().Unix() < endTime.Unix() {
  587. t3 += time.Now().Sub(orderTime).Hours()
  588. } else {
  589. t3 += endTime.Sub(orderTime).Hours()
  590. }
  591. }
  592. }
  593. day := ((endTime.Unix() - startTime.Unix()) / 60 / 60 / 24)
  594. count1 := float64(len(mainList))
  595. allCount := (24 * (count1 + 1)) * float64(day)
  596. data["mtbf"] = FloatRound(allCount/count1, 2)
  597. data["mttr"] = FloatRound((t2+t3)/count1, 2)
  598. data["mttf"] = FloatRound((allCount-t2-t3)/count1, 2)
  599. data["count"] = count1
  600. } else {
  601. data["mtbf"] = 0
  602. data["mttr"] = 0
  603. data["mttf"] = 0
  604. data["count"] = 0
  605. }
  606. data["eqCode"] = eq.EqCode
  607. data["eqName"] = eq.EqName
  608. data["pastureId"] = pastureId
  609. data["eqClassName"] = eqClass.TypeName
  610. respMap = append(respMap, data)
  611. }
  612. }
  613. return total, respMap, nil
  614. }