quality_service.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. package services
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "time"
  7. "github.com/kataras/iris/v12"
  8. "github.com/shopspring/decimal"
  9. "go.mod/comm"
  10. "go.mod/conf"
  11. "go.mod/dao"
  12. "go.mod/datasource"
  13. "go.mod/models"
  14. "go.mod/web/viewmodels"
  15. )
  16. type QualityService interface {
  17. Get(id int, pid int, pageNo int, pageSize int) ([]viewmodels.QualityList, int64)
  18. Post(data models.CmQuality) error
  19. Del(id int) error
  20. GetDetail(id int, pid int) viewmodels.QualityDetail
  21. GetSurvey(projectId int, bidsectionId int) map[string]interface{}
  22. GetPending(projectId int, projectAccountId int) []viewmodels.Quality
  23. ValidRule(ctx iris.Context) (viewmodels.Quality, error)
  24. }
  25. // //返回service操作类
  26. type qualityService struct {
  27. daoQuality *dao.QualityDao
  28. daoQualityAudit *dao.QualityAuditDao
  29. daoProjectAccount *dao.ProjectAccountDao
  30. daoAnnex *dao.AnnexDao
  31. daoRule *dao.RuleDao
  32. daoApprover *dao.ApproverDao
  33. validDetail string
  34. }
  35. //创建项目用户service
  36. func NewQualityService() QualityService {
  37. return &qualityService{
  38. validDetail: "/api/quality/detail",
  39. daoQuality: dao.NewQualityDao(datasource.InstanceDbMaster()),
  40. daoAnnex: dao.NewAnnexDao(datasource.InstanceDbMaster()),
  41. daoQualityAudit: dao.NewQualityAuditDao(datasource.InstanceDbMaster()),
  42. daoProjectAccount: dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
  43. daoApprover: dao.NewApproverDao(datasource.InstanceDbMaster()),
  44. }
  45. }
  46. func (s *qualityService) Get(id int, pid int, pageNo int, pageSize int) ([]viewmodels.QualityList, int64) {
  47. datalist, total := s.daoQuality.GetListByBid(id, pageNo, pageSize)
  48. qualityList := make([]viewmodels.QualityList, 0)
  49. for _, item := range datalist {
  50. qualityVM := viewmodels.QualityList{}
  51. qualityVM.Code = item.Code
  52. account := s.daoProjectAccount.Get(item.Uid, pid)
  53. qualityVM.AuditName = account.Name
  54. qualityVM.CreateTime = item.CreateTime.Format(conf.SysTimeform)
  55. qualityVM.Demand = item.Demand
  56. id, _ := comm.AesEncrypt(strconv.Itoa(item.Id), conf.SignSecret)
  57. qualityVM.Id = id
  58. qualityVM.Inspection = item.Inspection
  59. qualityVM.InspectionDetail = item.InspectionDetail
  60. qualityVM.Position = item.Position
  61. qualityVM.Status = item.Status
  62. counts, _ := s.daoAnnex.GetCount(2, item.Id)
  63. qualityVM.FileCounts = counts
  64. qualityList = append(qualityList, qualityVM)
  65. }
  66. return qualityList, total
  67. }
  68. // post请求,插入单条数据
  69. func (s *qualityService) Post(data models.CmQuality) error {
  70. // has := s.daoQuality.FindByCode(data.Code)
  71. // if has {
  72. // return errors.New("该编号已存在!")
  73. // }
  74. // Inserted, err := s.daoQuality.InsertRecord(data)
  75. // if Inserted == true {
  76. // return nil
  77. // }
  78. err := s.daoQuality.CreateQuality(data)
  79. return err
  80. }
  81. // delete请求,删除数据
  82. func (s *qualityService) Del(id int) error {
  83. err := s.daoQuality.DeleteRecord(id)
  84. return err
  85. }
  86. // 详情页数据拼装
  87. func (s *qualityService) GetDetail(id int, pid int) viewmodels.QualityDetail {
  88. qualityData := s.daoQuality.FindById(id)
  89. qualityId, _ := comm.AesEncrypt(strconv.Itoa(qualityData.Id), conf.SignSecret)
  90. bid, _ := comm.AesEncrypt(strconv.Itoa(qualityData.BidsectionId), conf.SignSecret)
  91. uid, _ := comm.AesEncrypt(strconv.Itoa(qualityData.Uid), conf.SignSecret)
  92. data := viewmodels.QualityDetail{}
  93. data.Id = qualityId
  94. data.BidsectionId = bid
  95. data.Uid = uid
  96. data.Code = qualityData.Code
  97. data.Inspection = qualityData.Inspection
  98. data.InspectionDetail = qualityData.InspectionDetail
  99. data.Demand = qualityData.Demand
  100. account := s.daoProjectAccount.Get(qualityData.Uid, pid)
  101. data.AuditName = account.Name
  102. data.CreateTime = qualityData.CreateTime
  103. data.Times = qualityData.Times
  104. data.Status = qualityData.Status
  105. fileList, total := s.daoAnnex.GetList(2, qualityData.Id, 1, conf.PageSize)
  106. // 加密id
  107. fileArr := make([]viewmodels.AnnexListView, 0)
  108. for _, item := range fileList {
  109. fileListVM := viewmodels.AnnexListView{}
  110. fileId, _ := comm.AesEncrypt(item.Id, conf.SignSecret)
  111. fileListVM.Id = fileId
  112. uid, _ := comm.AesEncrypt(item.AccountId, conf.SignSecret)
  113. fileListVM.AccountId = uid
  114. fileListVM.AccountName = item.AccountName
  115. fileListVM.CreateTime = item.CreateTime
  116. fileListVM.FileName = item.FileName
  117. fileListVM.FilePath = item.FilePath
  118. fileArr = append(fileArr, fileListVM)
  119. }
  120. fileVM := viewmodels.FileStruct{}
  121. fileVM.FileList = fileArr
  122. fileVM.Total = total
  123. data.File = fileVM
  124. auditors := s.daoApprover.GetAuditorsWithOwner(qualityData.BidsectionId, int(2), qualityData.Id, account.Id)
  125. encryptAuditors := make([]viewmodels.Auditors, 0)
  126. for _, item := range auditors {
  127. auditorVM := viewmodels.Auditors{}
  128. if item.Id != "" {
  129. id, _ := comm.AesEncrypt(item.Id, conf.SignSecret)
  130. auditorVM.Id = id
  131. }
  132. auditId, _ := comm.AesEncrypt(item.AuditId, conf.SignSecret)
  133. auditorVM.AuditId = auditId
  134. auditorVM.Name = item.Name
  135. auditorVM.Position = item.Position
  136. auditorVM.Mobile = item.Mobile
  137. auditorVM.AuditOrder = item.AuditOrder
  138. auditorVM.AccountGroup = item.AccountGroup
  139. auditorVM.Progress = item.Progress
  140. auditorVM.Company = item.Company
  141. auditorVM.Status = item.Status
  142. encryptAuditors = append(encryptAuditors, auditorVM)
  143. }
  144. auditHistory := s.daoQualityAudit.GetAuditHistory(qualityData.Id, qualityData.Times)
  145. data.AuditHistory = auditHistory
  146. // 整改单
  147. rectifiedInfo, _ := s.daoQualityAudit.GetRectifications(qualityData.BidsectionId, qualityData.ProjectId, qualityData.Id, 2)
  148. data.RectifiedInfo = rectifiedInfo
  149. // 最新审批人信息
  150. latestAuditor := s.daoApprover.GetLastedAuditor(qualityData.BidsectionId, 2, qualityData.Id)
  151. data.LatestdAuditor = latestAuditor
  152. data.Auditors = encryptAuditors
  153. return data
  154. }
  155. // 质量概况
  156. func (s *qualityService) GetSurvey(projectId int, bidsectionId int) map[string]interface{} {
  157. // 1.获得安全巡检
  158. year := time.Now().Year()
  159. qualityList := s.daoQuality.GetTypeYear(bidsectionId, year)
  160. // 2.初始化
  161. rectifylist := make([]viewmodels.QualitySurveyList, 0)
  162. rectifyTotal := 0
  163. approvalTotal := 0
  164. rectifyedTotal := 0
  165. columnarData := make([]map[string]interface{}, 0)
  166. lineData := columnarData
  167. for i := 1; i <= 12; i++ {
  168. item := map[string]interface{}{
  169. "name": "rectifyed",
  170. "month": fmt.Sprintf("%d-%02d", year, i),
  171. "count": 0,
  172. }
  173. columnarData = append(columnarData, item)
  174. item = map[string]interface{}{
  175. "name": "submit",
  176. "month": fmt.Sprintf("%d-%02d", year, i),
  177. "count": 0,
  178. }
  179. columnarData = append(columnarData, item)
  180. item = map[string]interface{}{
  181. "month": fmt.Sprintf("%d-%02d", year, i),
  182. "percentage": 0,
  183. }
  184. lineData = append(lineData, item)
  185. }
  186. // 3.当年数据初始化
  187. submitData := map[string]int{
  188. fmt.Sprintf("%d-01", year): 0,
  189. fmt.Sprintf("%d-02", year): 0,
  190. fmt.Sprintf("%d-03", year): 0,
  191. fmt.Sprintf("%d-04", year): 0,
  192. fmt.Sprintf("%d-05", year): 0,
  193. fmt.Sprintf("%d-06", year): 0,
  194. fmt.Sprintf("%d-07", year): 0,
  195. fmt.Sprintf("%d-08", year): 0,
  196. fmt.Sprintf("%d-09", year): 0,
  197. fmt.Sprintf("%d-10", year): 0,
  198. fmt.Sprintf("%d-11", year): 0,
  199. fmt.Sprintf("%d-12", year): 0,
  200. }
  201. rectifyedData := map[string]int{
  202. fmt.Sprintf("%d-01", year): 0,
  203. fmt.Sprintf("%d-02", year): 0,
  204. fmt.Sprintf("%d-03", year): 0,
  205. fmt.Sprintf("%d-04", year): 0,
  206. fmt.Sprintf("%d-05", year): 0,
  207. fmt.Sprintf("%d-06", year): 0,
  208. fmt.Sprintf("%d-07", year): 0,
  209. fmt.Sprintf("%d-08", year): 0,
  210. fmt.Sprintf("%d-09", year): 0,
  211. fmt.Sprintf("%d-10", year): 0,
  212. fmt.Sprintf("%d-11", year): 0,
  213. fmt.Sprintf("%d-12", year): 0,
  214. }
  215. for _, item := range qualityList {
  216. if item.Status == 2 {
  217. idInt, _ := strconv.Atoi(item.Id)
  218. detail := s.daoApprover.GetDataIdByProgress(idInt, 2, 1)
  219. id, _ := comm.AesEncrypt(item.Id, conf.SignSecret)
  220. item.Id = id
  221. item.UpdateTime = detail.UpdateTime
  222. rectifylist = append(rectifylist, item)
  223. rectifyTotal++
  224. }
  225. if item.Status == 1 {
  226. approvalTotal++
  227. }
  228. if item.Status == 4 {
  229. rectifyedTotal++
  230. }
  231. index := item.CreateTime.Format(conf.SysTimeformMonth)
  232. submitData[index] = submitData[index] + 1
  233. if item.Status == 4 {
  234. rectifyedData[index] = rectifyedData[index] + 1
  235. }
  236. }
  237. for index, columnar := range columnarData {
  238. if columnar["name"] == "rectifyed" {
  239. columnarData[index]["count"] = rectifyedData[columnar["month"].(string)]
  240. }
  241. if columnar["name"] == "submit" {
  242. columnarData[index]["count"] = submitData[columnar["month"].(string)]
  243. }
  244. }
  245. for index, line := range lineData {
  246. rectifyedCount := 0
  247. submitCount := 0
  248. for _, columnar := range columnarData {
  249. if line["month"] == columnar["month"] {
  250. if columnar["name"] == "rectifyed" {
  251. rectifyedCount = columnar["count"].(int)
  252. }
  253. if columnar["name"] == "submit" {
  254. submitCount = columnar["count"].(int)
  255. }
  256. }
  257. }
  258. lineData[index]["percentage"] = 0.00
  259. if rectifyedCount != 0 && submitCount != 0 {
  260. decimal.DivisionPrecision = 2
  261. percentage, _ := decimal.NewFromFloat(float64(rectifyedCount)).Div(decimal.NewFromFloat(float64(submitCount))).Float64()
  262. lineData[index]["percentage"] = percentage * 100
  263. }
  264. }
  265. // 整改占总数比例 - 完成整改/提交巡检
  266. surveryData := map[string]interface{}{
  267. "rectifylist": rectifylist,
  268. "rectifyTotal": rectifyTotal,
  269. "approvalTotal": approvalTotal,
  270. "rectifyedTotal": rectifyedTotal,
  271. "columnarData": columnarData,
  272. "lineData": lineData,
  273. }
  274. return surveryData
  275. }
  276. // 获得账号下需要审批的巡检
  277. func (s *qualityService) GetPending(projectId int, projectAccountId int) []viewmodels.Quality {
  278. data := s.daoQuality.GetStatusByProjectAndAccount(projectId, projectAccountId, 1)
  279. safeList := make([]viewmodels.Quality, 0)
  280. for _, item := range data {
  281. safeVM := viewmodels.Quality{}
  282. Id, _ := comm.AesEncrypt(strconv.Itoa(item.Id), conf.SignSecret)
  283. BidsectionId, _ := comm.AesEncrypt(strconv.Itoa(item.BidsectionId), conf.SignSecret)
  284. // AuditId, _ := comm.AesEncrypt(item.AuditId, conf.SignSecret)
  285. Uid, _ := comm.AesEncrypt(strconv.Itoa(item.Uid), conf.SignSecret)
  286. // ProjectId, _ := comm.AesEncrypt(strconv.Itoa(item.ProjectId), conf.SignSecret)
  287. safeVM.Id = Id
  288. safeVM.BidsectionId = BidsectionId
  289. safeVM.Uid = Uid
  290. safeVM.Code = item.Code
  291. safeVM.CreateTime = item.CreateTime.Format(conf.SysTimeform)
  292. safeVM.EndTime = item.EndTime.Format(conf.SysTimeform)
  293. safeVM.Position = item.Position
  294. safeVM.Inspection = item.Inspection
  295. safeVM.InspectionDetail = item.InspectionDetail
  296. safeVM.Demand = item.Demand
  297. safeVM.Status = item.Status
  298. safeList = append(safeList, safeVM)
  299. }
  300. return safeList
  301. }
  302. // 规则校验
  303. func (s *qualityService) ValidRule(ctx iris.Context) (viewmodels.Quality, error) {
  304. qualityVaild := viewmodels.Quality{}
  305. // fmt.Println("---------------------------safeVaild", safeVaild)
  306. if ctx.Method() == "GET" {
  307. err := ctx.ReadForm(&qualityVaild)
  308. if err != nil {
  309. log.Println("safe-ValidRule-ReadForm转换异常, error=", err)
  310. return qualityVaild, err
  311. }
  312. if ctx.Path() == s.validDetail {
  313. // 一样要传id,所以用delete的方法判断
  314. err = qualityVaild.ValidateQualityDelete()
  315. } else {
  316. err = qualityVaild.ValidateQualityList()
  317. }
  318. return qualityVaild, err
  319. }
  320. if ctx.Method() == "POST" {
  321. err := ctx.ReadJSON(&qualityVaild)
  322. if err != nil {
  323. log.Println("safe-ValidRule-ReadJson转换异常, error=", err)
  324. return qualityVaild, err
  325. }
  326. err = qualityVaild.ValidateQualityCreate()
  327. return qualityVaild, err
  328. // if ctx.Path() == s.validCreate {
  329. // }
  330. // if ctx.Path() == s.validFile {
  331. // err = safeVaild.ValidateFile()
  332. // return safeVaild, err
  333. // }
  334. }
  335. if ctx.Method() == "PUT" {
  336. err := ctx.ReadForm(&qualityVaild)
  337. if err != nil {
  338. log.Println("safe-ValidRule-ReadForm转换异常, error=", err)
  339. return qualityVaild, err
  340. }
  341. err = qualityVaild.ValidateQualityDelete()
  342. return qualityVaild, err
  343. }
  344. return qualityVaild, nil
  345. }