report.go 25 KB

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