approver_dao.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  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(bid int, pid int, dataType int, dataId int, auditors []int, reAuditors []int) error {
  31. data := make([]models.CmApprover, 0)
  32. for i, item := range auditors {
  33. approverVM := models.CmApprover{}
  34. approverVM.AuditId = item
  35. approverVM.AuditOrder = i + 1
  36. approverVM.Progress = 0
  37. approverVM.BidsectionId = bid
  38. approverVM.ProjectId = pid
  39. approverVM.DataType = dataType
  40. approverVM.DataId = dataId
  41. approverVM.Status = 0
  42. if i == 0 {
  43. approverVM.Status = 1
  44. }
  45. data = append(data, approverVM)
  46. }
  47. checkVM := models.CmApprover{}
  48. checkVM.AuditOrder = len(auditors) + 1
  49. checkVM.Progress = 1
  50. checkVM.BidsectionId = bid
  51. checkVM.ProjectId = pid
  52. checkVM.DataType = dataType
  53. checkVM.DataId = dataId
  54. data = append(data, checkVM)
  55. for i, item := range reAuditors {
  56. approverVM := models.CmApprover{}
  57. approverVM.AuditId = item
  58. approverVM.AuditOrder = i + 2 + len(auditors)
  59. approverVM.Progress = 2
  60. approverVM.BidsectionId = bid
  61. approverVM.ProjectId = pid
  62. approverVM.DataType = dataType
  63. approverVM.DataId = dataId
  64. data = append(data, approverVM)
  65. }
  66. _, err := d.engine.Insert(data)
  67. return err
  68. }
  69. // 更改状态
  70. func (d *ApproverDao) ChangeStatus(id int, status int) error {
  71. data := &models.CmApprover{Status: status}
  72. _, err := d.engine.Where("id = ?", id).Cols("status").Update(data)
  73. return err
  74. }
  75. // 更改审批人
  76. func (d *ApproverDao) ChangeAuditId(bid int, dataType int, dataId int, auditOrder int, uid int) error {
  77. data := &models.CmApprover{AuditId: uid}
  78. _, err := d.engine.Where("bidsection_id = ? and data_type = ? and data_id = ? and audit_order = ?", bid, dataType, dataId, auditOrder).Cols("audit_id").Update(data)
  79. return err
  80. }
  81. // 更改下一个审批人的状态
  82. func (d *ApproverDao) ChangeNextStatus(id int, status int) error {
  83. data := &models.CmApprover{Id: id}
  84. _, err := d.engine.Get(data)
  85. newData := &models.CmApprover{Status: status}
  86. _, 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)
  87. return err
  88. }
  89. // 根据当前times,获取审批流程(包括原报)
  90. func (d *ApproverDao) GetAuditorsWithOwner(bid int, dataType int, dataId int, cur_uid int) []viewmodels.Auditors {
  91. auditors := make([]viewmodels.Auditors, 0)
  92. auditor := viewmodels.Auditors{Progress: "", Id: "", Status: 2}
  93. _, err := d.engine.Sql("select name, company, position, mobile, id as `audit_id` from `cm_project_account` where id = ?", cur_uid).Get(&auditor)
  94. if err != nil {
  95. fmt.Println(err)
  96. }
  97. auditors = append(auditors, auditor)
  98. 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)
  99. // 原报
  100. return auditors
  101. }
  102. func (d *ApproverDao) FindApproverById(id int) (*models.CmApprover, error) {
  103. data := &models.CmApprover{}
  104. _, err := d.engine.ID(id).Get(data)
  105. return data, err
  106. }
  107. // 获取最新的审核人
  108. func (d *ApproverDao) GetLastedAuditor(bid int, dataType int, dataId int) *viewmodels.Approver {
  109. data := &models.CmApprover{BidsectionId: bid, DataType: dataType, DataId: dataId, Status: 1}
  110. has, _ := d.engine.Get(data)
  111. approverVM := &viewmodels.Approver{}
  112. if has == true {
  113. id, _ := comm.AesEncrypt(strconv.Itoa(data.Id), conf.SignSecret)
  114. approverVM.Id = id
  115. pid, _ := comm.AesEncrypt(strconv.Itoa(data.ProjectId), conf.SignSecret)
  116. approverVM.ProjectId = pid
  117. bid, _ := comm.AesEncrypt(strconv.Itoa(data.BidsectionId), conf.SignSecret)
  118. approverVM.BidsectionId = bid
  119. dataId, _ := comm.AesEncrypt(strconv.Itoa(data.DataId), conf.SignSecret)
  120. approverVM.DataId = dataId
  121. auditId, _ := comm.AesEncrypt(strconv.Itoa(data.AuditId), conf.SignSecret)
  122. approverVM.AuditId = auditId
  123. approverVM.AuditOrder = data.AuditOrder
  124. approverVM.DataType = data.DataType
  125. approverVM.Progress = strconv.Itoa(data.Progress)
  126. approverVM.Status = data.Status
  127. }
  128. return approverVM
  129. }
  130. // 获取最后一个审批人
  131. func (d *ApproverDao) GetLastAuditor(bid int, dataType int, dataId int) (*models.CmApprover, error) {
  132. data := &models.CmApprover{BidsectionId: bid, DataType: dataType, DataId: dataId}
  133. _, err := d.engine.Desc("audit_order").Limit(1).Get(data)
  134. return data, err
  135. }
  136. // 初始化审批流程状态
  137. func (d *ApproverDao) InitStatus(bid int, dataType int, dataId int, auditId int, times int, progress int, opinion string) error {
  138. session := d.engine.NewSession()
  139. defer session.Close()
  140. err := session.Begin()
  141. if err != nil {
  142. return errors.New("操作失败-db")
  143. }
  144. data := &models.CmApprover{Status: 0}
  145. _, err = session.Where("bidsection_id = ? and data_type = ? and data_id = ?", bid, dataType, dataId).Cols("status").Update(data)
  146. if err != nil {
  147. session.Rollback()
  148. return err
  149. }
  150. _, err = session.Exec("update cm_safe set status = ?, times = ? where id = ?", 0, times+1, dataId)
  151. if err != nil {
  152. session.Rollback()
  153. return err
  154. }
  155. // 增加审批日志
  156. safeAudit := &models.CmSafeAudit{BidsectionId: bid, SafeId: dataId, Times: times, AuditId: auditId, Status: 1, Progress: 0, CreateTime: time.Now(), Opinion: opinion}
  157. _, err = session.Insert(safeAudit)
  158. if err != nil {
  159. session.Rollback()
  160. return err
  161. }
  162. err = session.Commit()
  163. if err != nil {
  164. return err
  165. }
  166. return nil
  167. }
  168. // 审批通过
  169. func (d *ApproverDao) PassHandler(id int, uid int, auditId int, opinion string, rectifiedInfo string) error {
  170. session := d.engine.NewSession()
  171. defer session.Close()
  172. // add Begin() before any action
  173. err := session.Begin()
  174. auditor, err := d.FindApproverById(id)
  175. if err != nil {
  176. return err
  177. }
  178. if auditor.AuditId != uid {
  179. return errors.New("该用户没有审批权限!")
  180. }
  181. safe := &models.CmSafe{}
  182. _, err = session.ID(auditor.DataId).Get(safe)
  183. if err != nil {
  184. session.Rollback()
  185. return err
  186. }
  187. // 增加审批日志
  188. 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}
  189. _, err = session.Insert(auditReacord)
  190. if err != nil {
  191. session.Rollback()
  192. return err
  193. }
  194. // 改变审批流程中当前审批人以及下一个审批人的审批流程状态
  195. curData := &models.CmApprover{Status: 2}
  196. _, err = session.ID(id).Cols("status").Update(curData)
  197. if err != nil {
  198. session.Rollback()
  199. return err
  200. }
  201. nextData := &models.CmApprover{Status: 1}
  202. _, 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)
  203. if err != nil {
  204. session.Rollback()
  205. return err
  206. }
  207. if auditId != 0 {
  208. // 审批人选择了整改人
  209. // 修改cm_safe表的status状态为待整改
  210. _, err = session.Exec("update `cm_safe` set status = ? where id = ?", 2, auditor.DataId)
  211. if err != nil {
  212. session.Rollback()
  213. return err
  214. }
  215. // 改变审批流程中的整改人id
  216. _, 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)
  217. if err != nil {
  218. session.Rollback()
  219. return err
  220. }
  221. } else {
  222. if auditor.Progress == 1 {
  223. // 整改人审批流程
  224. // 修改cm_safe表的status状态为待复查
  225. _, err = session.Exec("update `cm_safe` set status = ? where id = ?", 3, auditor.DataId)
  226. if err != nil {
  227. session.Rollback()
  228. return err
  229. }
  230. } else {
  231. // 复查流程
  232. // 查找最后一个审批人
  233. lastAuditor := &models.CmApprover{BidsectionId: auditor.BidsectionId, DataType: auditor.DataType, DataId: auditor.DataId}
  234. _, err = session.Desc("audit_order").Limit(1).Get(lastAuditor)
  235. if err != nil {
  236. session.Rollback()
  237. return err
  238. }
  239. if lastAuditor.AuditId == auditor.AuditId {
  240. // 说明审批流程已经走完
  241. _, err = session.Exec("update `cm_safe` set status = ? where id = ?", 4, auditor.DataId)
  242. if err != nil {
  243. session.Rollback()
  244. return err
  245. }
  246. }
  247. }
  248. }
  249. err = session.Commit()
  250. return err
  251. }
  252. // 审批流程-退回
  253. func (d *ApproverDao) BackHandlerWithId(id int, uid int, times int, progress int, opinion string) error {
  254. session := d.engine.NewSession()
  255. defer session.Close()
  256. // add Begin() before any action
  257. err := session.Begin()
  258. // auditor, err := d.FindApproverById(id)
  259. auditor := &models.CmApprover{}
  260. _, err = session.ID(id).Get(auditor)
  261. data := &models.CmApprover{Status: 0}
  262. // 将往后的所有记录的status改为0
  263. _, 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)
  264. if err != nil {
  265. session.Rollback()
  266. return err
  267. }
  268. // 将当前的记录改为1-待审批
  269. data.Status = 1
  270. _, err = session.ID(id).Cols("status").Update(data)
  271. if err != nil {
  272. session.Rollback()
  273. return err
  274. }
  275. // 增加审批日志
  276. safeAudit := &models.CmSafeAudit{BidsectionId: auditor.BidsectionId, SafeId: auditor.DataId, Times: times, AuditId: uid, Status: 1, Progress: progress, CreateTime: time.Now(), Opinion: opinion}
  277. _, err = session.Insert(safeAudit)
  278. if err != nil {
  279. session.Rollback()
  280. return err
  281. }
  282. err = session.Commit()
  283. return err
  284. }
  285. func (d *ApproverDao) CloseHandler(id int, opinion string, curUid int, saveId int) error {
  286. session := d.engine.NewSession()
  287. defer session.Close()
  288. // add Begin() before any action
  289. err := session.Begin()
  290. auditor, err := d.FindApproverById(id)
  291. if auditor.AuditId != curUid {
  292. return errors.New("该用户没有审批权限!")
  293. }
  294. safe := &models.CmSafe{}
  295. _, err = session.ID(saveId).Get(safe)
  296. if err != nil {
  297. session.Rollback()
  298. return err
  299. }
  300. // 增加审批日志
  301. 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}
  302. _, err = session.Insert(safeAudit)
  303. if err != nil {
  304. session.Rollback()
  305. return err
  306. }
  307. // 更改cm_safe的记录
  308. _, err = session.Exec("update `cm_safe` set status = ? where id = ? ", 5, saveId)
  309. if err != nil {
  310. session.Rollback()
  311. return err
  312. }
  313. // 更改cm_approver的记录
  314. _, err = session.Exec("update `cm_approver` set status = ? where id = ? ", 3, id)
  315. if err != nil {
  316. session.Rollback()
  317. return err
  318. }
  319. return err
  320. }
  321. // 删除旧的审批流程
  322. func (d *ApproverDao) DeleteOldAuditors(bid int, dataType int, dataId int) error {
  323. data := &models.CmApprover{BidsectionId: bid, DataType: dataType, DataId: dataId}
  324. _, err := d.engine.Delete(data)
  325. return err
  326. }