approver_dao.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  1. /*
  2. * @description: 审批流程数据库操作相关
  3. * @Author: LanJianRong
  4. * @Date: 2021-01-06
  5. * @FilePath: \construction_management\dao\approver_dao.go
  6. */
  7. package dao
  8. import (
  9. "errors"
  10. "fmt"
  11. "strconv"
  12. "time"
  13. "github.com/go-xorm/xorm"
  14. "go.mod/comm"
  15. "go.mod/conf"
  16. "go.mod/models"
  17. "go.mod/web/viewmodels"
  18. )
  19. // 数据库操作引擎
  20. type ApproverDao struct {
  21. engine *xorm.Engine
  22. }
  23. // 获得一个DAO对象
  24. func NewApproverDao(engine *xorm.Engine) *ApproverDao {
  25. return &ApproverDao{
  26. engine: engine,
  27. }
  28. }
  29. // 批量插入数据
  30. func (d *ApproverDao) InsertData(cur_uid int, bid int, pid int, dataType int, dataId int, auditors []int, reAuditors []int) error {
  31. data := make([]models.CmApprover, 0)
  32. msg := make([]models.CmProjectMessage, 0)
  33. var content string
  34. var title string
  35. if dataType == 1 {
  36. safe := &models.CmSafe{Id: dataId}
  37. _, err := d.engine.Get(safe)
  38. if err != nil {
  39. return err
  40. }
  41. account := &models.CmProjectAccount{Id: safe.Uid}
  42. _, err = d.engine.Get(account)
  43. title = fmt.Sprintf("%s - %s", account.Name, account.Position)
  44. content = fmt.Sprintf("%s|%s|已上报,审批中", safe.Code, safe.InspectionDetail)
  45. } else {
  46. quality := &models.CmQuality{Id: dataId}
  47. _, err := d.engine.Get(quality)
  48. if err != nil {
  49. return err
  50. }
  51. account := &models.CmProjectAccount{Id: quality.Uid}
  52. _, err = d.engine.Get(account)
  53. if err != nil {
  54. return err
  55. }
  56. title = fmt.Sprintf("%s - %s", account.Name, account.Position)
  57. content = fmt.Sprintf("%s|%s|已上报,审批中", quality.Code, quality.InspectionDetail)
  58. }
  59. _, err := d.engine.Exec("delete from project_message where data_type = ? and data_id = ?", dataType, dataId)
  60. for i, item := range auditors {
  61. approverVM := models.CmApprover{}
  62. approverVM.AuditId = item
  63. approverVM.AuditOrder = i + 1
  64. approverVM.Progress = 0
  65. approverVM.BidsectionId = bid
  66. approverVM.ProjectId = pid
  67. approverVM.DataType = dataType
  68. approverVM.DataId = dataId
  69. approverVM.Status = 0
  70. if i == 0 {
  71. approverVM.Status = 1
  72. }
  73. data = append(data, approverVM)
  74. // 消息推送
  75. msgVM := models.CmProjectMessage{}
  76. msgVM.AccountId = item
  77. msgVM.BidsectionId = bid
  78. msgVM.ProjectId = pid
  79. msgVM.DataId = dataId
  80. msgVM.DataType = 1
  81. msgVM.Content = content
  82. msgVM.Title = title
  83. msgVM.CreateTime = time.Now()
  84. msg = append(msg, msgVM)
  85. }
  86. checkVM := models.CmApprover{}
  87. checkVM.AuditOrder = len(auditors) + 1
  88. checkVM.Progress = 1
  89. checkVM.BidsectionId = bid
  90. checkVM.ProjectId = pid
  91. checkVM.DataType = dataType
  92. checkVM.DataId = dataId
  93. data = append(data, checkVM)
  94. for i, item := range reAuditors {
  95. approverVM := models.CmApprover{}
  96. approverVM.AuditId = item
  97. approverVM.AuditOrder = i + 2 + len(auditors)
  98. approverVM.Progress = 2
  99. approverVM.BidsectionId = bid
  100. approverVM.ProjectId = pid
  101. approverVM.DataType = dataType
  102. approverVM.DataId = dataId
  103. data = append(data, approverVM)
  104. // 消息推送
  105. msgVM := models.CmProjectMessage{}
  106. msgVM.AccountId = item
  107. msgVM.BidsectionId = bid
  108. msgVM.ProjectId = pid
  109. msgVM.DataId = dataId
  110. msgVM.DataType = 1
  111. msgVM.Content = content
  112. msgVM.Title = title
  113. msgVM.CreateTime = time.Now()
  114. msg = append(msg, msgVM)
  115. }
  116. // 再推送自己
  117. msgVM := models.CmProjectMessage{}
  118. msgVM.AccountId = cur_uid
  119. msgVM.BidsectionId = bid
  120. msgVM.ProjectId = pid
  121. msgVM.DataId = dataId
  122. msgVM.DataType = 1
  123. msgVM.Content = content
  124. msgVM.Title = title
  125. msgVM.CreateTime = time.Now()
  126. msg = append(msg, msgVM)
  127. _, err = d.engine.Insert(data)
  128. _, err = d.engine.Insert(msg)
  129. return err
  130. }
  131. // 更改状态
  132. func (d *ApproverDao) ChangeStatus(id int, status int) error {
  133. data := &models.CmApprover{Status: status}
  134. _, err := d.engine.Where("id = ?", id).Cols("status").Update(data)
  135. return err
  136. }
  137. // 更改审批人
  138. func (d *ApproverDao) ChangeAuditId(bid int, dataType int, dataId int, auditOrder int, uid int) error {
  139. data := &models.CmApprover{AuditId: uid}
  140. _, err := d.engine.Where("bidsection_id = ? and data_type = ? and data_id = ? and audit_order = ?", bid, dataType, dataId, auditOrder).Cols("audit_id").Update(data)
  141. return err
  142. }
  143. // 更改下一个审批人的状态
  144. func (d *ApproverDao) ChangeNextStatus(id int, status int) error {
  145. data := &models.CmApprover{Id: id}
  146. _, err := d.engine.Get(data)
  147. newData := &models.CmApprover{Status: status}
  148. _, err = d.engine.Where("bidsection_id = ? and data_type = ? and data_id = ? and audit_order = ?", data.BidsectionId, data.DataType, data.DataId, data.AuditOrder+1).Cols("status").Update(newData)
  149. return err
  150. }
  151. // 根据当前times,获取审批流程(包括原报)
  152. func (d *ApproverDao) GetAuditorsWithOwner(bid int, dataType int, dataId int, cur_uid int) []viewmodels.Auditors {
  153. auditors := make([]viewmodels.Auditors, 0)
  154. auditor := viewmodels.Auditors{Progress: "", Id: "", Status: 2}
  155. _, err := d.engine.Sql("select name, company, position, mobile, id as `audit_id` from `cm_project_account` where id = ?", cur_uid).Get(&auditor)
  156. if err != nil {
  157. fmt.Println(err)
  158. }
  159. auditors = append(auditors, auditor)
  160. d.engine.Sql("select pa.`company`, pa.`name`, pa.`account_group`,pa.`mobile`, pa.`position`,ca.`audit_id` as `audit_id`, ca.`id`, ca.`status`, ca.`audit_order`, ca.`progress` from `cm_project_account` as pa, `cm_approver` as ca where ca.`bidsection_id` = ? and ca.`data_type` = ? and ca.`data_id` = ? and ca.audit_id = pa.id order by `audit_order`", bid, dataType, dataId).Find(&auditors)
  161. // 原报
  162. return auditors
  163. }
  164. func (d *ApproverDao) FindApproverById(id int) (*models.CmApprover, error) {
  165. data := &models.CmApprover{}
  166. _, err := d.engine.ID(id).Get(data)
  167. return data, err
  168. }
  169. // 获取最新的审核人
  170. func (d *ApproverDao) GetLastedAuditor(bid int, dataType int, dataId int) *viewmodels.Approver {
  171. data := &models.CmApprover{BidsectionId: bid, DataType: dataType, DataId: dataId, Status: 1}
  172. has, _ := d.engine.Get(data)
  173. approverVM := &viewmodels.Approver{}
  174. if has == true {
  175. id, _ := comm.AesEncrypt(strconv.Itoa(data.Id), conf.SignSecret)
  176. approverVM.Id = id
  177. pid, _ := comm.AesEncrypt(strconv.Itoa(data.ProjectId), conf.SignSecret)
  178. approverVM.ProjectId = pid
  179. bid, _ := comm.AesEncrypt(strconv.Itoa(data.BidsectionId), conf.SignSecret)
  180. approverVM.BidsectionId = bid
  181. dataId, _ := comm.AesEncrypt(strconv.Itoa(data.DataId), conf.SignSecret)
  182. approverVM.DataId = dataId
  183. auditId, _ := comm.AesEncrypt(strconv.Itoa(data.AuditId), conf.SignSecret)
  184. approverVM.AuditId = auditId
  185. approverVM.AuditOrder = data.AuditOrder
  186. approverVM.DataType = data.DataType
  187. approverVM.Progress = strconv.Itoa(data.Progress)
  188. approverVM.Status = data.Status
  189. }
  190. return approverVM
  191. }
  192. // 获取最后一个审批人
  193. func (d *ApproverDao) GetLastAuditor(bid int, dataType int, dataId int) (*models.CmApprover, error) {
  194. data := &models.CmApprover{BidsectionId: bid, DataType: dataType, DataId: dataId}
  195. _, err := d.engine.Desc("audit_order").Limit(1).Get(data)
  196. return data, err
  197. }
  198. // 初始化审批流程状态
  199. func (d *ApproverDao) InitStatus(auditType string, bid int, dataType int, dataId int, auditId int, times int, progress int, opinion string) error {
  200. session := d.engine.NewSession()
  201. defer session.Close()
  202. err := session.Begin()
  203. if err != nil {
  204. return errors.New("操作失败-db")
  205. }
  206. // 消息推送,先删除旧的推送
  207. _, err = session.Exec("delete from cm_project_message where data_type = ? and data_id = ?", auditType, dataId)
  208. if err != nil {
  209. session.Rollback()
  210. return err
  211. }
  212. approvers := make([]models.CmApprover, 0)
  213. err = session.Where("data_type = ? and data_id = ? and audit_id != 0", dataType, dataId).Find(&approvers)
  214. if err != nil {
  215. session.Rollback()
  216. return err
  217. }
  218. data := &models.CmApprover{Status: 0}
  219. _, err = session.Where("bidsection_id = ? and data_type = ? and data_id = ?", bid, dataType, dataId).Cols("status").Update(data)
  220. if err != nil {
  221. session.Rollback()
  222. return err
  223. }
  224. if auditType == "safe" {
  225. safe := &models.CmSafe{}
  226. _, err = session.ID(dataId).Get(safe)
  227. if err != nil {
  228. session.Rollback()
  229. return err
  230. }
  231. account := &models.CmProjectAccount{Id: safe.Uid}
  232. _, err = d.engine.Get(account)
  233. title := fmt.Sprintf("%s - %s", account.Name, account.Position)
  234. msg := make([]models.CmProjectMessage, 0)
  235. for _, item := range approvers {
  236. msgVM := models.CmProjectMessage{}
  237. msgVM.AccountId = item.AuditId
  238. msgVM.BidsectionId = item.BidsectionId
  239. msgVM.ProjectId = item.ProjectId
  240. msgVM.CreateTime = time.Now()
  241. msgVM.DataId = item.DataId
  242. msgVM.DataType = item.DataType
  243. msgVM.Content = fmt.Sprintf("%s|%s|审批退回到上报人", safe.Code, safe.InspectionDetail)
  244. msgVM.Title = title
  245. msg = append(msg, msgVM)
  246. }
  247. // 添加巡检拥有者的推送
  248. msgVM := models.CmProjectMessage{}
  249. msgVM.AccountId = safe.Uid
  250. msgVM.BidsectionId = safe.BidsectionId
  251. msgVM.ProjectId = safe.ProjectId
  252. msgVM.CreateTime = time.Now()
  253. msgVM.DataId = safe.Id
  254. msgVM.DataType = 1
  255. msgVM.Content = fmt.Sprintf("%s|%s|审批退回到上报人", safe.Code, safe.InspectionDetail)
  256. msgVM.Title = title
  257. msg = append(msg, msgVM)
  258. // 插入消息
  259. _, err = session.Insert(msg)
  260. if err != nil {
  261. session.Rollback()
  262. return err
  263. }
  264. _, err = session.Exec("update cm_safe set status = ?, times = ? where id = ?", 0, times+1, dataId)
  265. if err != nil {
  266. session.Rollback()
  267. return err
  268. }
  269. // 增加审批日志
  270. safeAudit := &models.CmSafeAudit{BidsectionId: bid, SafeId: dataId, Times: times, AuditId: auditId, Status: 1, Progress: progress, CreateTime: time.Now(), Opinion: opinion}
  271. _, err = session.Insert(safeAudit)
  272. if err != nil {
  273. session.Rollback()
  274. return err
  275. }
  276. // 说明本身除于整改人流程,退回原报,要将整改总数-1,未整改总数+1
  277. if progress-1 != 0 {
  278. _, err = session.Exec("update cm_tree set safe_rectification = safe_rectification + 1, safe_rectification_in = if(safe_rectification_in >= 1, safe_rectification_in - 1, 0) where bidsection_id = ?", bid)
  279. }
  280. } else {
  281. quality := &models.CmQuality{}
  282. _, err = session.ID(dataId).Get(quality)
  283. if err != nil {
  284. session.Rollback()
  285. return err
  286. }
  287. account := &models.CmProjectAccount{Id: quality.Uid}
  288. _, err = d.engine.Get(account)
  289. title := fmt.Sprintf("%s - %s", account.Name, account.Position)
  290. msg := make([]models.CmProjectMessage, 0)
  291. for _, item := range approvers {
  292. msgVM := models.CmProjectMessage{}
  293. msgVM.AccountId = item.AuditId
  294. msgVM.BidsectionId = item.BidsectionId
  295. msgVM.ProjectId = item.ProjectId
  296. msgVM.CreateTime = time.Now()
  297. msgVM.DataId = item.DataId
  298. msgVM.DataType = item.DataType
  299. msgVM.Content = fmt.Sprintf("%s|%s|审批退回到上报人", quality.Code, quality.InspectionDetail)
  300. msgVM.Title = title
  301. msg = append(msg, msgVM)
  302. }
  303. // 添加巡检拥有者的推送
  304. msgVM := models.CmProjectMessage{}
  305. msgVM.AccountId = quality.Uid
  306. msgVM.BidsectionId = quality.BidsectionId
  307. msgVM.ProjectId = quality.ProjectId
  308. msgVM.CreateTime = time.Now()
  309. msgVM.DataId = quality.Id
  310. msgVM.DataType = 1
  311. msgVM.Content = fmt.Sprintf("%s|%s|审批退回到上报人", quality.Code, quality.InspectionDetail)
  312. msgVM.Title = title
  313. msg = append(msg, msgVM)
  314. // 插入消息
  315. _, err = session.Insert(msg)
  316. if err != nil {
  317. session.Rollback()
  318. return err
  319. }
  320. _, err = session.Exec("update cm_quality set status = ?, times = ? where id = ?", 0, times+1, dataId)
  321. if err != nil {
  322. session.Rollback()
  323. return err
  324. }
  325. // 增加审批日志
  326. qualityAudit := &models.CmQualityAudit{BidsectionId: bid, QualityId: dataId, Times: times, AuditId: auditId, Status: 1, Progress: progress, CreateTime: time.Now(), Opinion: opinion}
  327. _, err = session.Insert(qualityAudit)
  328. if err != nil {
  329. session.Rollback()
  330. return err
  331. }
  332. if progress-1 != 0 {
  333. _, err = session.Exec("update cm_tree set quality_rectification = quality_rectification + 1, quality_rectification_in = if(quality_rectification_in >= 1, quality_rectification_in - 1, 0) where bidsection_id = ?", bid)
  334. }
  335. }
  336. err = session.Commit()
  337. return err
  338. }
  339. // 审批通过
  340. func (d *ApproverDao) PassHandler(auditType string, id int, uid int, auditId int, opinion string, rectifiedInfo string) error {
  341. session := d.engine.NewSession()
  342. defer session.Close()
  343. // add Begin() before any action
  344. err := session.Begin()
  345. auditor, err := d.FindApproverById(id)
  346. if err != nil {
  347. return err
  348. }
  349. if auditor.AuditId != uid {
  350. return errors.New("该用户没有审批权限!")
  351. }
  352. var msgContent string
  353. switch auditor.Progress {
  354. case 0:
  355. msgContent = "审批完成,待整改"
  356. case 1:
  357. msgContent = "整改完成,待复查"
  358. case 2:
  359. msgContent = "复查完成"
  360. }
  361. // 消息推送,先删除旧的推送
  362. _, err = session.Exec("delete from cm_project_message where data_type = ? and data_id = ?", auditor.DataType, auditor.DataId)
  363. if err != nil {
  364. session.Rollback()
  365. return err
  366. }
  367. approvers := make([]models.CmApprover, 0)
  368. err = session.Where("data_type = ? and data_id = ? and audit_id != 0", auditor.DataType, auditor.DataId).Find(&approvers)
  369. if err != nil {
  370. session.Rollback()
  371. return err
  372. }
  373. // 安全巡检
  374. if auditType == "safe" {
  375. safe := &models.CmSafe{}
  376. _, err = session.ID(auditor.DataId).Get(safe)
  377. if err != nil {
  378. session.Rollback()
  379. return err
  380. }
  381. account := &models.CmProjectAccount{Id: safe.Uid}
  382. _, err = d.engine.Get(account)
  383. title := fmt.Sprintf("%s - %s", account.Name, account.Position)
  384. msg := make([]models.CmProjectMessage, 0)
  385. for _, item := range approvers {
  386. msgVM := models.CmProjectMessage{}
  387. msgVM.AccountId = item.AuditId
  388. msgVM.BidsectionId = item.BidsectionId
  389. msgVM.ProjectId = item.ProjectId
  390. msgVM.CreateTime = time.Now()
  391. msgVM.DataId = item.DataId
  392. msgVM.DataType = item.DataType
  393. msgVM.Content = fmt.Sprintf("%s|%s|%s", msgContent, safe.Code, safe.InspectionDetail)
  394. msgVM.Title = title
  395. msg = append(msg, msgVM)
  396. }
  397. // 添加巡检拥有者的推送
  398. msgVM := models.CmProjectMessage{}
  399. msgVM.AccountId = safe.Uid
  400. msgVM.BidsectionId = safe.BidsectionId
  401. msgVM.ProjectId = safe.ProjectId
  402. msgVM.CreateTime = time.Now()
  403. msgVM.DataId = safe.Id
  404. msgVM.DataType = 1
  405. msgVM.Content = fmt.Sprintf("%s|%s|%s", msgContent, safe.Code, safe.InspectionDetail)
  406. msgVM.Title = title
  407. msg = append(msg, msgVM)
  408. // 插入消息
  409. _, err = session.Insert(msg)
  410. if err != nil {
  411. session.Rollback()
  412. return err
  413. }
  414. // 增加审批日志
  415. auditReacord := &models.CmSafeAudit{BidsectionId: auditor.BidsectionId, SafeId: auditor.DataId, AuditId: auditor.AuditId, Times: safe.Times, CreateTime: time.Now(), Status: 0, Progress: auditor.Progress + 1, Opinion: opinion, Rectifiedinfo: rectifiedInfo}
  416. _, err = session.Insert(auditReacord)
  417. if err != nil {
  418. session.Rollback()
  419. return err
  420. }
  421. // 改变审批流程中当前审批人以及下一个审批人的审批流程状态
  422. curData := &models.CmApprover{Status: 2}
  423. _, err = session.ID(id).Cols("status").Update(curData)
  424. if err != nil {
  425. session.Rollback()
  426. return err
  427. }
  428. nextData := &models.CmApprover{Status: 1}
  429. _, err = session.Where("bidsection_id = ? and data_type = ? and data_id = ? and audit_order = ?", auditor.BidsectionId, auditor.DataType, auditor.DataId, auditor.AuditOrder+1).Cols("status").Update(nextData)
  430. if err != nil {
  431. session.Rollback()
  432. return err
  433. }
  434. if auditId != 0 {
  435. // 审批人选择了整改人
  436. // 修改cm_safe表的status状态为待整改
  437. _, err = session.Exec("update `cm_safe` set status = ? where id = ?", 2, auditor.DataId)
  438. if err != nil {
  439. session.Rollback()
  440. return err
  441. }
  442. // 将cm_tree的safe_rectification待整改+1
  443. _, err := session.Exec("update cm_tree set safe_rectification_in = safe_rectification_in + 1, safe_rectification = if(safe_rectification >= 1, safe_rectification - 1, 0) where bidsection_id = ?", auditor.BidsectionId)
  444. if err != nil {
  445. session.Rollback()
  446. return err
  447. }
  448. // 改变审批流程中的整改人id
  449. _, err = session.Exec("update `cm_approver` set `audit_id` = ? where `bidsection_id` = ? and `data_type` = ? and `data_id` = ? and `audit_order` = ?", auditId, auditor.BidsectionId, auditor.DataType, auditor.DataId, auditor.AuditOrder+1)
  450. if err != nil {
  451. session.Rollback()
  452. return err
  453. }
  454. } else {
  455. if auditor.Progress == 1 {
  456. // 整改人审批流程
  457. // 修改cm_safe表的status状态为待复查
  458. _, err = session.Exec("update `cm_safe` set status = ? where id = ?", 3, auditor.DataId)
  459. if err != nil {
  460. session.Rollback()
  461. return err
  462. }
  463. } else {
  464. // 复查流程
  465. // 查找最后一个审批人
  466. lastAuditor := &models.CmApprover{BidsectionId: auditor.BidsectionId, DataType: auditor.DataType, DataId: auditor.DataId}
  467. _, err = session.Desc("audit_order").Limit(1).Get(lastAuditor)
  468. if err != nil {
  469. session.Rollback()
  470. return err
  471. }
  472. if lastAuditor.AuditId == auditor.AuditId {
  473. // 说明审批流程已经走完
  474. _, err = session.Exec("update `cm_safe` set status = ? where id = ?", 4, auditor.DataId)
  475. if err != nil {
  476. session.Rollback()
  477. return err
  478. }
  479. // 将cm_tree的safe_rectification_finish待整改+1
  480. _, err := session.Exec("update cm_tree set safe_rectification_finish = safe_rectification_finish + 1, safe_rectification_in = if(safe_rectification_in >= 1, safe_rectification_in - 1, 0)where bidsection_id = ?", auditor.BidsectionId)
  481. if err != nil {
  482. session.Rollback()
  483. return err
  484. }
  485. }
  486. }
  487. }
  488. } else {
  489. // 质量巡检
  490. quality := &models.CmQuality{}
  491. _, err = session.ID(auditor.DataId).Get(quality)
  492. if err != nil {
  493. session.Rollback()
  494. return err
  495. }
  496. account := &models.CmProjectAccount{Id: quality.Uid}
  497. _, err = d.engine.Get(account)
  498. title := fmt.Sprintf("%s - %s", account.Name, account.Position)
  499. msg := make([]models.CmProjectMessage, 0)
  500. for _, item := range approvers {
  501. msgVM := models.CmProjectMessage{}
  502. msgVM.AccountId = item.AuditId
  503. msgVM.BidsectionId = item.BidsectionId
  504. msgVM.ProjectId = item.ProjectId
  505. msgVM.CreateTime = time.Now()
  506. msgVM.DataId = item.DataId
  507. msgVM.DataType = item.DataType
  508. msgVM.Content = fmt.Sprintf("%s|%s|%s", msgContent, quality.Code, quality.InspectionDetail)
  509. msgVM.Title = title
  510. msg = append(msg, msgVM)
  511. }
  512. // 添加巡检拥有者的推送
  513. msgVM := models.CmProjectMessage{}
  514. msgVM.AccountId = quality.Uid
  515. msgVM.BidsectionId = quality.BidsectionId
  516. msgVM.ProjectId = quality.ProjectId
  517. msgVM.CreateTime = time.Now()
  518. msgVM.DataId = quality.Id
  519. msgVM.DataType = 1
  520. msgVM.Content = fmt.Sprintf("%s|%s|%s", msgContent, quality.Code, quality.InspectionDetail)
  521. msgVM.Title = title
  522. msg = append(msg, msgVM)
  523. // 插入消息
  524. _, err = session.Insert(msg)
  525. if err != nil {
  526. session.Rollback()
  527. return err
  528. }
  529. // 增加审批日志
  530. auditReacord := &models.CmQualityAudit{BidsectionId: auditor.BidsectionId, QualityId: auditor.DataId, AuditId: auditor.AuditId, Times: quality.Times, CreateTime: time.Now(), Status: 0, Progress: auditor.Progress + 1, Opinion: opinion, Rectifiedinfo: rectifiedInfo}
  531. _, err = session.Insert(auditReacord)
  532. if err != nil {
  533. session.Rollback()
  534. return err
  535. }
  536. // 改变审批流程中当前审批人以及下一个审批人的审批流程状态
  537. curData := &models.CmApprover{Status: 2}
  538. _, err = session.ID(id).Cols("status").Update(curData)
  539. if err != nil {
  540. session.Rollback()
  541. return err
  542. }
  543. nextData := &models.CmApprover{Status: 1}
  544. _, err = session.Where("bidsection_id = ? and data_type = ? and data_id = ? and audit_order = ?", auditor.BidsectionId, auditor.DataType, auditor.DataId, auditor.AuditOrder+1).Cols("status").Update(nextData)
  545. if err != nil {
  546. session.Rollback()
  547. return err
  548. }
  549. if auditId != 0 {
  550. // 审批人选择了整改人
  551. // 修改cm_quality表的status状态为待整改
  552. _, err = session.Exec("update `cm_quality` set status = ? where id = ?", 2, auditor.DataId)
  553. if err != nil {
  554. session.Rollback()
  555. return err
  556. }
  557. // 将cm_tree的quality_rectification待整改+1
  558. _, err := session.Exec("update cm_tree set quality_rectification_in = quality_rectification_in + 1, quality_rectification = if(quality_rectification >= 1, quality_rectification - 1, 0) where bidsection_id = ?", auditor.BidsectionId)
  559. if err != nil {
  560. session.Rollback()
  561. return err
  562. }
  563. // 改变审批流程中的整改人id
  564. _, err = session.Exec("update `cm_approver` set `audit_id` = ? where `bidsection_id` = ? and `data_type` = ? and `data_id` = ? and `audit_order` = ?", auditId, auditor.BidsectionId, auditor.DataType, auditor.DataId, auditor.AuditOrder+1)
  565. if err != nil {
  566. session.Rollback()
  567. return err
  568. }
  569. } else {
  570. if auditor.Progress == 1 {
  571. // 整改人审批流程
  572. // 修改cm_quality表的status状态为待复查
  573. _, err = session.Exec("update `cm_quality` set status = ? where id = ?", 3, auditor.DataId)
  574. if err != nil {
  575. session.Rollback()
  576. return err
  577. }
  578. } else {
  579. // 复查流程
  580. // 查找最后一个审批人
  581. lastAuditor := &models.CmApprover{BidsectionId: auditor.BidsectionId, DataType: auditor.DataType, DataId: auditor.DataId}
  582. _, err = session.Desc("audit_order").Limit(1).Get(lastAuditor)
  583. if err != nil {
  584. session.Rollback()
  585. return err
  586. }
  587. if lastAuditor.AuditId == auditor.AuditId {
  588. // 说明审批流程已经走完
  589. _, err = session.Exec("update `cm_quality` set status = ? where id = ?", 4, auditor.DataId)
  590. if err != nil {
  591. session.Rollback()
  592. return err
  593. }
  594. // 将cm_tree的quality_rectification_finish待整改+1
  595. _, err := session.Exec("update cm_tree set quality_rectification_finish = quality_rectification_finish + 1, quality_rectification_in = if(quality_rectification_in >= 1, quality_rectification_in - 1, 0) where bidsection_id = ?", auditor.BidsectionId)
  596. if err != nil {
  597. session.Rollback()
  598. return err
  599. }
  600. }
  601. }
  602. }
  603. }
  604. err = session.Commit()
  605. return err
  606. }
  607. // 审批流程-退回
  608. func (d *ApproverDao) BackHandlerWithId(auditType string, id int, uid int, times int, progress int, opinion string) error {
  609. session := d.engine.NewSession()
  610. defer session.Close()
  611. err := session.Begin()
  612. auditor := &models.CmApprover{}
  613. _, err = session.ID(id).Get(auditor)
  614. data := &models.CmApprover{Status: 0}
  615. // 将往后的所有记录的status改为0
  616. _, err = session.Where("bidsection_id = ? and data_type = ? and data_id = ? and audit_order > ?", auditor.BidsectionId, auditor.DataType, auditor.DataId, auditor.AuditOrder).Cols("status").Update(data)
  617. if err != nil {
  618. session.Rollback()
  619. return err
  620. }
  621. // 获取改账号的信息
  622. account := &models.CmProjectAccount{Id: auditor.AuditId}
  623. _, err = session.Get(account)
  624. if err != nil {
  625. session.Rollback()
  626. return err
  627. }
  628. // 将当前的记录改为1-待审批
  629. data.Status = 1
  630. _, err = session.ID(id).Cols("status").Update(data)
  631. if err != nil {
  632. session.Rollback()
  633. return err
  634. }
  635. // 消息推送,先删除旧的推送
  636. _, err = session.Exec("delete from cm_project_message where data_type = ? and data_id = ?", auditor.DataType, auditor.DataId)
  637. if err != nil {
  638. session.Rollback()
  639. return err
  640. }
  641. approvers := make([]models.CmApprover, 0)
  642. err = session.Where("data_type = ? and data_id = ? and audit_id != 0", auditor.DataType, auditor.DataId).Find(&approvers)
  643. if err != nil {
  644. session.Rollback()
  645. return err
  646. }
  647. // 增加审批日志
  648. if auditType == "safe" {
  649. safe := &models.CmSafe{}
  650. _, err = session.ID(auditor.DataId).Get(safe)
  651. if err != nil {
  652. session.Rollback()
  653. return err
  654. }
  655. account := &models.CmProjectAccount{Id: safe.Uid}
  656. _, err = d.engine.Get(account)
  657. title := fmt.Sprintf("%s - %s", account.Name, account.Position)
  658. msg := make([]models.CmProjectMessage, 0)
  659. for _, item := range approvers {
  660. msgVM := models.CmProjectMessage{}
  661. msgVM.AccountId = item.AuditId
  662. msgVM.BidsectionId = item.BidsectionId
  663. msgVM.ProjectId = item.ProjectId
  664. msgVM.CreateTime = time.Now()
  665. msgVM.DataId = item.DataId
  666. msgVM.DataType = item.DataType
  667. msgVM.Content = fmt.Sprintf("%s|%s|审批退回,退回至%s", safe.Code, safe.InspectionDetail, account.Name)
  668. msgVM.Title = title
  669. msg = append(msg, msgVM)
  670. }
  671. // 添加巡检拥有者的推送
  672. msgVM := models.CmProjectMessage{}
  673. msgVM.AccountId = safe.Uid
  674. msgVM.BidsectionId = safe.BidsectionId
  675. msgVM.ProjectId = safe.ProjectId
  676. msgVM.CreateTime = time.Now()
  677. msgVM.DataId = safe.Id
  678. msgVM.DataType = 1
  679. msgVM.Content = fmt.Sprintf("%s|%s|审批退回,退回至%s", safe.Code, safe.InspectionDetail, account.Name)
  680. msg = append(msg, msgVM)
  681. // 插入消息
  682. _, err = session.Insert(msg)
  683. if err != nil {
  684. session.Rollback()
  685. return err
  686. }
  687. safeAudit := &models.CmSafeAudit{BidsectionId: auditor.BidsectionId, SafeId: auditor.DataId, Times: times, AuditId: uid, Status: 1, Progress: progress, CreateTime: time.Now(), Opinion: opinion}
  688. _, err = session.Insert(safeAudit)
  689. if err != nil {
  690. session.Rollback()
  691. return err
  692. }
  693. } else {
  694. quality := &models.CmQuality{}
  695. _, err = session.ID(auditor.DataId).Get(quality)
  696. if err != nil {
  697. session.Rollback()
  698. return err
  699. }
  700. account := &models.CmProjectAccount{Id: quality.Uid}
  701. _, err = d.engine.Get(account)
  702. title := fmt.Sprintf("%s - %s", account.Name, account.Position)
  703. msg := make([]models.CmProjectMessage, 0)
  704. for _, item := range approvers {
  705. msgVM := models.CmProjectMessage{}
  706. msgVM.AccountId = item.AuditId
  707. msgVM.BidsectionId = item.BidsectionId
  708. msgVM.ProjectId = item.ProjectId
  709. msgVM.CreateTime = time.Now()
  710. msgVM.DataId = item.DataId
  711. msgVM.DataType = item.DataType
  712. msgVM.Content = fmt.Sprintf("%s|%s|审批退回,退回至%s", quality.Code, quality.InspectionDetail, account.Name)
  713. msgVM.Title = title
  714. msg = append(msg, msgVM)
  715. }
  716. // 添加巡检拥有者的推送
  717. msgVM := models.CmProjectMessage{}
  718. msgVM.AccountId = quality.Uid
  719. msgVM.BidsectionId = quality.BidsectionId
  720. msgVM.ProjectId = quality.ProjectId
  721. msgVM.CreateTime = time.Now()
  722. msgVM.DataId = quality.Id
  723. msgVM.DataType = 2
  724. msgVM.Content = fmt.Sprintf("%s|%s|审批退回,退回至%s", quality.Code, quality.InspectionDetail, account.Name)
  725. msgVM.Title = title
  726. msg = append(msg, msgVM)
  727. // 插入消息
  728. _, err = session.Insert(msg)
  729. if err != nil {
  730. session.Rollback()
  731. return err
  732. }
  733. qualityAudit := &models.CmQualityAudit{BidsectionId: auditor.BidsectionId, QualityId: auditor.DataId, Times: times, AuditId: uid, Status: 1, Progress: progress, CreateTime: time.Now(), Opinion: opinion}
  734. _, err = session.Insert(qualityAudit)
  735. if err != nil {
  736. session.Rollback()
  737. return err
  738. }
  739. }
  740. curAuditor := &models.CmApprover{}
  741. _, err = session.ID(uid).Get(curAuditor)
  742. if err != nil {
  743. session.Rollback()
  744. return err
  745. }
  746. // 当前审批人是整改或者复查流程的并且退回的是审批流程的
  747. if curAuditor.Progress >= 1 && auditor.Progress == 0 {
  748. var sql string
  749. if auditType == "safe" {
  750. sql = "update cm_tree set safe_rectification = safe_rectification_in + 1 and safe_rectification_in = if(safe_rectification_in >= 1, safe_rectification_in - 1, 0) where bidsection_id = ?"
  751. } else {
  752. sql = "update cm_tree set quality_rectification = quality_rectification_in + 1 and quality_rectification_in = if(quality_rectification_in >= 1, quality_rectification_in - 1, 0) where bidsection_id = ?"
  753. }
  754. _, err = session.Exec(sql, auditor.BidsectionId)
  755. if err != nil {
  756. session.Rollback()
  757. return err
  758. }
  759. }
  760. err = session.Commit()
  761. return err
  762. }
  763. func (d *ApproverDao) CloseHandler(auditType string, id int, opinion string, curUid int, saveId int) error {
  764. session := d.engine.NewSession()
  765. defer session.Close()
  766. // add Begin() before any action
  767. err := session.Begin()
  768. auditor, err := d.FindApproverById(id)
  769. if auditor.AuditId != curUid {
  770. return errors.New("该用户没有审批权限!")
  771. }
  772. // 消息推送,先删除旧的推送
  773. _, err = session.Exec("delete from cm_project_message where data_type = ? and data_id = ?", auditor.DataType, auditor.DataId)
  774. if err != nil {
  775. session.Rollback()
  776. return err
  777. }
  778. approvers := make([]models.CmApprover, 0)
  779. err = session.Where("data_type = ? and data_id = ? and audit_id != 0", auditor.DataType, auditor.DataId).Find(&approvers)
  780. if err != nil {
  781. session.Rollback()
  782. return err
  783. }
  784. if auditType == "safe" {
  785. safe := &models.CmSafe{}
  786. _, err = session.ID(saveId).Get(safe)
  787. if err != nil {
  788. session.Rollback()
  789. return err
  790. }
  791. account := &models.CmProjectAccount{Id: safe.Uid}
  792. _, err = d.engine.Get(account)
  793. title := fmt.Sprintf("%s - %s", account.Name, account.Position)
  794. msg := make([]models.CmProjectMessage, 0)
  795. for _, item := range approvers {
  796. msgVM := models.CmProjectMessage{}
  797. msgVM.AccountId = item.AuditId
  798. msgVM.BidsectionId = item.BidsectionId
  799. msgVM.ProjectId = item.ProjectId
  800. msgVM.CreateTime = time.Now()
  801. msgVM.DataId = item.DataId
  802. msgVM.DataType = item.DataType
  803. msgVM.Content = fmt.Sprintf("%s|%s|已关闭,停止审批流程", safe.Code, safe.InspectionDetail)
  804. msgVM.Title = title
  805. msg = append(msg, msgVM)
  806. }
  807. // 添加巡检拥有者的推送
  808. msgVM := models.CmProjectMessage{}
  809. msgVM.AccountId = safe.Uid
  810. msgVM.BidsectionId = safe.BidsectionId
  811. msgVM.ProjectId = safe.ProjectId
  812. msgVM.CreateTime = time.Now()
  813. msgVM.DataId = safe.Id
  814. msgVM.DataType = 1
  815. msgVM.Content = fmt.Sprintf("%s|%s|已关闭,停止审批流程", safe.Code, safe.InspectionDetail)
  816. msgVM.Title = title
  817. msg = append(msg, msgVM)
  818. // 插入消息
  819. _, err = session.Insert(msg)
  820. if err != nil {
  821. session.Rollback()
  822. return err
  823. }
  824. // 增加审批日志
  825. safeAudit := &models.CmSafeAudit{BidsectionId: auditor.BidsectionId, SafeId: auditor.DataId, Times: safe.Times, AuditId: auditor.AuditId, Status: 2, Progress: auditor.Progress, CreateTime: time.Now(), Opinion: opinion}
  826. _, err = session.Insert(safeAudit)
  827. if err != nil {
  828. session.Rollback()
  829. return err
  830. }
  831. // 更改cm_safe的记录
  832. _, err = session.Exec("update `cm_safe` set status = ? where id = ? ", 5, saveId)
  833. if err != nil {
  834. session.Rollback()
  835. return err
  836. }
  837. } else {
  838. quality := &models.CmQuality{}
  839. _, err = session.ID(saveId).Get(quality)
  840. if err != nil {
  841. session.Rollback()
  842. return err
  843. }
  844. account := &models.CmProjectAccount{Id: quality.Uid}
  845. _, err = d.engine.Get(account)
  846. title := fmt.Sprintf("%s - %s", account.Name, account.Position)
  847. msg := make([]models.CmProjectMessage, 0)
  848. for _, item := range approvers {
  849. msgVM := models.CmProjectMessage{}
  850. msgVM.AccountId = item.AuditId
  851. msgVM.BidsectionId = item.BidsectionId
  852. msgVM.ProjectId = item.ProjectId
  853. msgVM.CreateTime = time.Now()
  854. msgVM.DataId = item.DataId
  855. msgVM.DataType = item.DataType
  856. msgVM.Content = fmt.Sprintf("%s|%s|已关闭,停止审批流程", quality.Code, quality.InspectionDetail)
  857. msgVM.Title = title
  858. msg = append(msg, msgVM)
  859. }
  860. // 添加巡检拥有者的推送
  861. msgVM := models.CmProjectMessage{}
  862. msgVM.AccountId = quality.Uid
  863. msgVM.BidsectionId = quality.BidsectionId
  864. msgVM.ProjectId = quality.ProjectId
  865. msgVM.CreateTime = time.Now()
  866. msgVM.DataId = quality.Id
  867. msgVM.DataType = 2
  868. msgVM.Content = fmt.Sprintf("%s|%s|已关闭,停止审批流程", quality.Code, quality.InspectionDetail)
  869. msgVM.Title = title
  870. msg = append(msg, msgVM)
  871. // 插入消息
  872. _, err = session.Insert(msg)
  873. if err != nil {
  874. session.Rollback()
  875. return err
  876. }
  877. // 增加审批日志
  878. qualityAudit := &models.CmQualityAudit{BidsectionId: auditor.BidsectionId, QualityId: auditor.DataId, Times: quality.Times, AuditId: auditor.AuditId, Status: 2, Progress: auditor.Progress, CreateTime: time.Now(), Opinion: opinion}
  879. _, err = session.Insert(qualityAudit)
  880. if err != nil {
  881. session.Rollback()
  882. return err
  883. }
  884. // 更改cm_quality的记录
  885. _, err = session.Exec("update `cm_quality` set status = ? where id = ? ", 5, saveId)
  886. if err != nil {
  887. session.Rollback()
  888. return err
  889. }
  890. }
  891. // 更改cm_approver的记录
  892. _, err = session.Exec("update `cm_approver` set status = ? where id = ? ", 3, id)
  893. if err != nil {
  894. session.Rollback()
  895. return err
  896. }
  897. err = session.Commit()
  898. return err
  899. }
  900. // 删除旧的审批流程
  901. func (d *ApproverDao) DeleteOldAuditors(bid int, dataType int, dataId int) error {
  902. data := &models.CmApprover{BidsectionId: bid, DataType: dataType, DataId: dataId}
  903. _, err := d.engine.Delete(data)
  904. return err
  905. }
  906. func (d *ApproverDao) GetStatusByProjectAndAccount(projectId int, projectAccountId int, status int) []models.CmApprover {
  907. datalist := make([]models.CmApprover, 0)
  908. _ = d.engine.
  909. Where("project_id = ? and audit_id= ? and status=? ", projectId, projectAccountId, status).
  910. Desc("id").
  911. Find(&datalist)
  912. return datalist
  913. }