contract_approval.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. package contract_approval
  2. import (
  3. "hongze/hongze_mobile_admin/models/tables/contract"
  4. "hongze/hongze_mobile_admin/models/tables/contract_approval_record"
  5. "hongze/hongze_mobile_admin/utils"
  6. "rdluck_tools/orm"
  7. "time"
  8. )
  9. //合同审批单
  10. type ContractApproval struct {
  11. ContractApprovalId int `orm:"column(contract_approval_id);pk"`
  12. ContractId int `orm:"column(contract_id)";description:"合同id"`
  13. Status string `description:"审批单状态,枚举值:待审批','已审批','已驳回','已撤回',默认待审批"`
  14. ApplyContent string `description:"待审内容,长度255位"`
  15. ContractDetail string `description:"审批单详情,完整的合同json数据"`
  16. ApplyUserId int `description:"申请人id"`
  17. ApplyUserName string `description:"申请人名称"`
  18. ApproveRemark string `description:"审批人备注,可以是驳回理由,长度128位"`
  19. FlowId int `description:"审批流程id"`
  20. FlowVersion int `description:"审批流程版本"`
  21. CurrNodeId int `description:"当前审批节点id"`
  22. ModifyTime time.Time `description:"发起申请时间"`
  23. CreateTime time.Time `description:"最近一次审批单修改时间"`
  24. }
  25. //根据合同审批单id获取合同审批单信息
  26. func GetContractApprovalById(contractApprovalId int) (contractApprovalInfo *ContractApproval, err error) {
  27. o := orm.NewOrm()
  28. sql := `select * from contract_approval where contract_approval_id = ? `
  29. err = o.Raw(sql, contractApprovalId).QueryRow(&contractApprovalInfo)
  30. return
  31. }
  32. //根据合同id获取最近一次待审批的合同审批单信息
  33. func GetLastPendingContractApprovalByContractId(contractId int) (contractApprovalInfo *ContractApproval, err error) {
  34. o := orm.NewOrm()
  35. sql := `select * from contract_approval where status = "待审批" AND contract_id=? `
  36. err = o.Raw(sql, contractId).QueryRow(&contractApprovalInfo)
  37. return
  38. }
  39. //根据合同id获取总共被驳回的次数
  40. func GetRejectContractCountByContractId(contractId int) (total int64, err error) {
  41. o := orm.NewOrm()
  42. sql := `select count(1) total from contract_approval where status = "已驳回" AND contract_id=? `
  43. err = o.Raw(sql, contractId).QueryRow(&total)
  44. return
  45. }
  46. //获取审批列表数据数量
  47. func GetContractApprovalListCount(condition string, pars []interface{}) (count int, err error) {
  48. o := orm.NewOrm()
  49. sql := `
  50. SELECT a.* from contract_approval a
  51. JOIN contract c ON a.contract_id = c.contract_id
  52. WHERE
  53. c.is_delete = 0 `
  54. sql += condition
  55. sql += ` GROUP BY a.contract_id `
  56. sql = `select count(*) count from (` + sql + `) b`
  57. err = o.Raw(sql, pars).QueryRow(&count)
  58. return
  59. }
  60. //审批列表
  61. type ContractApprovalList struct {
  62. ContractApprovalId int `description:"审批单id"`
  63. ContractId int `description:"合同id"`
  64. ContractApprovalRecordId int `description:"审批流id"`
  65. ContractCode string `description:"合同编号"`
  66. Status string `description:"审批单状态,枚举值:待审批','已审批','已驳回','已撤回',默认待审批"`
  67. ContractStatus string `json:"-";description:"合同状态,枚举值:待审批','已审批','已驳回','已撤回',默认待审批"`
  68. ApplyContent string `description:"待审内容"`
  69. ContractDetail string `json:"-";description:"提交审批时的合同信息;合同快照"`
  70. ContractInfo contract.ContractDetail `description:"提交审批时的合同信息;合同快照"`
  71. ApproveRemark string `description:"审核备注"`
  72. ContractType string `description:"合同类型"`
  73. Price float64 `description:"合同金额"`
  74. CompanyName string `description:"客户名称"`
  75. FileUrl string `description:"合同下载地址"`
  76. SellerId int `description:"销售id"`
  77. ProductId int `description:"产品id,1:ficc;2:权益"`
  78. SellerName string `description:"销售名称"`
  79. StartDate time.Time `description:"合同开始日期"`
  80. EndDate time.Time `description:"合同结束日期"`
  81. CreateTime time.Time `description:"发起审批的时间"`
  82. ModifyTime time.Time `description:"最后一次修改的时间"`
  83. ApproveTime time.Time `description:"审批时间"`
  84. CanApprovalButton bool `description:"是否具有审核操作权限,true才允许审核操作"`
  85. StartDateStr string `description:"合同开始日期(字符串类型)"`
  86. EndDateStr string `description:"合同结束日期(字符串类型)"`
  87. CreateTimeStr string `description:"发起审批的时间(字符串类型)"`
  88. ModifyTimeStr string `description:"最后一次修改的时间(字符串类型)"`
  89. ApproveTimeStr string `description:"审批时间(字符串类型)"`
  90. }
  91. //获取审批列表数据
  92. func GetContractApprovalList(childCondition, condition string, childPars, pars []interface{}, startSize, pageSize int) (list []*ContractApprovalList, err error) {
  93. o := orm.NewOrm()
  94. sql := `
  95. SELECT
  96. a.contract_approval_id,a.contract_id,a.apply_content,a.contract_detail,a.approve_remark,a.create_time,a.modify_time,a.status,c.status contract_status,c.product_id,
  97. c.contract_type,c.start_date,c.end_date,c.price,c.company_name,c.seller_id,c.seller_name,c.file_url,c.contract_code from contract_approval a
  98. join
  99. ( SELECT max( contract_approval_id ) max_id,contract_id FROM contract_approval where 1=1 `
  100. sql += childCondition
  101. sql += ` GROUP BY contract_id ) b on a.contract_approval_id=b.max_id
  102. JOIN contract c ON a.contract_id = c.contract_id
  103. WHERE c.is_delete = 0 `
  104. sql += condition
  105. sql += ` group by contract_id order by modify_time desc LIMIT ?,? `
  106. _, err = o.Raw(sql, childPars, pars, startSize, pageSize).QueryRows(&list)
  107. return
  108. }
  109. //根据合同id获取合同审批单信息
  110. func (ContractApproval) CheckPendingByContractId(contractId int) (has bool, err error) {
  111. o := orm.NewOrm()
  112. var contractApprovalInfo ContractApproval
  113. sql := `select * from contract_approval where contract_id = ? AND status="待审批" limit 1`
  114. err = o.Raw(sql, contractId).QueryRow(&contractApprovalInfo)
  115. if err != nil {
  116. if err.Error() == utils.ErrNoRow() {
  117. //如果不存在待审批记录,那么报错信息置空,存在与否直接返回false
  118. err = nil
  119. return
  120. }
  121. //系统异常,返回错误信息
  122. return
  123. }
  124. //存在待审批的审批单
  125. has = true
  126. return
  127. }
  128. //发起审批
  129. func (ContractApproval) Apply(contractApprovalInfo *ContractApproval, contractApprovalRecord *contract_approval_record.ContractApprovalRecord) (err error) {
  130. o := orm.NewOrm()
  131. o.Begin()
  132. defer func() {
  133. if err != nil {
  134. o.Rollback()
  135. } else {
  136. o.Commit()
  137. }
  138. }()
  139. //审批单记录
  140. ContractApprovalId, err := o.Insert(contractApprovalInfo)
  141. if err != nil {
  142. return
  143. }
  144. //审批单id
  145. contractApprovalInfo.ContractApprovalId = int(ContractApprovalId)
  146. //审批流记录
  147. contractApprovalRecord.ContractApprovalId = contractApprovalInfo.ContractApprovalId
  148. contractApprovalRecordId, err := o.Insert(contractApprovalRecord)
  149. if err != nil {
  150. return
  151. }
  152. //审批流id
  153. contractApprovalRecord.ContractApprovalRecordId = int(contractApprovalRecordId)
  154. //修改合同状态为待审批
  155. sql := `UPDATE contract SET status="待审批",modify_time=NOW() WHERE contract_id = ?`
  156. _, err = o.Raw(sql, contractApprovalInfo.ContractId).Exec()
  157. return
  158. }
  159. //发起审批(工作流)
  160. func (ContractApproval) Apply2(contractApprovalInfo *ContractApproval, contractApprovalRecordList []*contract_approval_record.ContractApprovalRecord) (err error) {
  161. o := orm.NewOrm()
  162. o.Begin()
  163. defer func() {
  164. if err != nil {
  165. o.Rollback()
  166. } else {
  167. o.Commit()
  168. }
  169. }()
  170. //审批单记录
  171. ContractApprovalId, err := o.Insert(contractApprovalInfo)
  172. if err != nil {
  173. return
  174. }
  175. //审批单id
  176. contractApprovalInfo.ContractApprovalId = int(ContractApprovalId)
  177. for _, contractApprovalRecord := range contractApprovalRecordList {
  178. //审批流记录
  179. contractApprovalRecord.ContractApprovalId = contractApprovalInfo.ContractApprovalId
  180. contractApprovalRecordId, tmpErr := o.Insert(contractApprovalRecord)
  181. if tmpErr != nil {
  182. err = tmpErr
  183. return
  184. }
  185. //审批流id
  186. contractApprovalRecord.ContractApprovalRecordId = int(contractApprovalRecordId)
  187. }
  188. //修改合同状态为待审批
  189. sql := `UPDATE contract SET status="待审批",modify_time=NOW() WHERE contract_id = ?`
  190. _, err = o.Raw(sql, contractApprovalInfo.ContractId).Exec()
  191. return
  192. }
  193. //撤回审核单
  194. func (ContractApproval) Cancel(contractApprovalInfo *ContractApproval, contractApprovalRecord *contract_approval_record.ContractApprovalRecord) (err error) {
  195. o := orm.NewOrm()
  196. o.Begin()
  197. defer func() {
  198. if err != nil {
  199. o.Rollback()
  200. } else {
  201. o.Commit()
  202. }
  203. }()
  204. //变更审批单记录
  205. contractApprovalInfo.Status = "已撤回"
  206. contractApprovalInfo.ModifyTime = time.Now()
  207. _, err = o.Update(contractApprovalInfo)
  208. if err != nil {
  209. return
  210. }
  211. //变更审批流记录
  212. contractApprovalRecord.Status = "已撤回"
  213. contractApprovalRecord.ModifyTime = time.Now()
  214. _, err = o.Update(contractApprovalRecord)
  215. if err != nil {
  216. return
  217. }
  218. //修改合同状态为已撤回
  219. sql := `UPDATE contract SET status="已撤回",modify_time=NOW() WHERE contract_id = ?`
  220. _, err = o.Raw(sql, contractApprovalInfo.ContractId).Exec()
  221. return
  222. }
  223. func (ContractApproval) Cancel2(contractApprovalInfo *ContractApproval, contractApprovalRecordList []*contract_approval_record.ContractApprovalRecord) (err error) {
  224. o := orm.NewOrm()
  225. o.Begin()
  226. defer func() {
  227. if err != nil {
  228. o.Rollback()
  229. } else {
  230. o.Commit()
  231. }
  232. }()
  233. //变更审批单记录
  234. contractApprovalInfo.Status = "已撤回"
  235. contractApprovalInfo.ModifyTime = time.Now()
  236. _, err = o.Update(contractApprovalInfo)
  237. if err != nil {
  238. return
  239. }
  240. //变更所有审批流记录
  241. for _, contractApprovalRecord := range contractApprovalRecordList {
  242. contractApprovalRecord.Status = "已撤回"
  243. contractApprovalRecord.ModifyTime = time.Now()
  244. _, tmpErr := o.Update(contractApprovalRecord)
  245. if tmpErr != nil {
  246. err = tmpErr
  247. return
  248. }
  249. }
  250. //修改合同状态为已撤回
  251. sql := `UPDATE contract SET status="已撤回",modify_time=NOW() WHERE contract_id = ?`
  252. _, err = o.Raw(sql, contractApprovalInfo.ContractId).Exec()
  253. return
  254. }
  255. //审核驳回
  256. func (ContractApproval) Reject(contractApprovalInfo *ContractApproval, contractApprovalRecord *contract_approval_record.ContractApprovalRecord, approveUserId int, approveUserName, remark string) (err error) {
  257. o := orm.NewOrm()
  258. o.Begin()
  259. defer func() {
  260. if err != nil {
  261. o.Rollback()
  262. } else {
  263. o.Commit()
  264. }
  265. }()
  266. //变更审批单记录
  267. contractApprovalInfo.Status = "已驳回"
  268. contractApprovalInfo.ApproveRemark = remark //审核失败理由
  269. contractApprovalInfo.ModifyTime = time.Now()
  270. contractApprovalInfo.CurrNodeId = 0 //当前节点变更为0,代表当前审批流程已经结束了
  271. _, err = o.Update(contractApprovalInfo)
  272. if err != nil {
  273. return
  274. }
  275. //变更审批流记录
  276. contractApprovalRecord.Status = "已驳回"
  277. contractApprovalRecord.ApproveRemark = remark //审核失败理由
  278. contractApprovalRecord.ApproveUserId = approveUserId //审批人id
  279. contractApprovalRecord.ApproveUserName = approveUserName //审批人名称
  280. contractApprovalRecord.ApproveTime = time.Now() //审批人名称
  281. contractApprovalRecord.ModifyTime = time.Now()
  282. _, err = o.Update(contractApprovalRecord)
  283. if err != nil {
  284. return
  285. }
  286. //修改合同状态为已驳回
  287. sql := `UPDATE contract SET status="已驳回",modify_content="",approval_remark=?,modify_time=NOW() WHERE contract_id = ?`
  288. _, err = o.Raw(sql, remark, contractApprovalInfo.ContractId).Exec()
  289. return
  290. }
  291. //下级审批人信息
  292. type NextApproval struct {
  293. ApproveRoleTypeCode string
  294. ApproveUserId int
  295. ApproveUserName string
  296. }
  297. //审核通过
  298. func (ContractApproval) ApprovedOld(contractApprovalInfo *ContractApproval, contractApprovalRecord *contract_approval_record.ContractApprovalRecord, approveUserId int, approveUserName, remark string, nextApproval NextApproval) (err error) {
  299. o := orm.NewOrm()
  300. o.Begin()
  301. defer func() {
  302. if err != nil {
  303. o.Rollback()
  304. } else {
  305. o.Commit()
  306. }
  307. }()
  308. //变更审批流记录
  309. contractApprovalRecord.Status = "已审批"
  310. contractApprovalRecord.ApproveRemark = remark //审核失败理由
  311. contractApprovalRecord.ApproveUserId = approveUserId //审批人id
  312. contractApprovalRecord.ApproveUserName = approveUserName //审批人名称
  313. contractApprovalRecord.ApproveTime = time.Now() //审批人名称
  314. contractApprovalRecord.ModifyTime = time.Now()
  315. _, err = o.Update(contractApprovalRecord)
  316. if err != nil {
  317. return
  318. }
  319. //判断是否存在下一级的审批人,如果不存在,那么就去变更审批单和合同的状态
  320. if nextApproval.ApproveRoleTypeCode == "" && nextApproval.ApproveUserId == 0 {
  321. //变更审批单记录
  322. contractApprovalInfo.Status = "已审批"
  323. contractApprovalInfo.ApproveRemark = remark //审核理由
  324. contractApprovalInfo.ModifyTime = time.Now()
  325. _, tmpErr := o.Update(contractApprovalInfo)
  326. if tmpErr != nil {
  327. err = tmpErr
  328. return
  329. }
  330. //修改合同状态为已审批
  331. sql := `UPDATE contract SET status="已审批",approval_remark=?,modify_time=NOW() WHERE contract_id = ?`
  332. _, tmpErr = o.Raw(sql, remark, contractApprovalInfo.ContractId).Exec()
  333. if tmpErr != nil {
  334. err = tmpErr
  335. return
  336. }
  337. } else {
  338. //如果还存在下一级审批人,那么进入下级审批流
  339. nextContractApprovalRecord := &contract_approval_record.ContractApprovalRecord{
  340. ContractApprovalId: contractApprovalInfo.ContractApprovalId,
  341. Status: "待审批",
  342. ApproveRoleTypeCode: nextApproval.ApproveRoleTypeCode,
  343. ApproveUserId: nextApproval.ApproveUserId,
  344. ApproveUserName: nextApproval.ApproveUserName,
  345. ModifyTime: time.Now(),
  346. CreateTime: time.Now(),
  347. }
  348. nextContractApprovalRecordId, tmpErr := o.Insert(nextContractApprovalRecord)
  349. if tmpErr != nil {
  350. err = tmpErr
  351. return
  352. }
  353. nextContractApprovalRecord.ContractApprovalRecordId = int(nextContractApprovalRecordId)
  354. }
  355. return
  356. }
  357. func (ContractApproval) Approved(contractApprovalInfo *ContractApproval, contractApprovalRecord *contract_approval_record.ContractApprovalRecord, remark string) (err error) {
  358. o := orm.NewOrm()
  359. o.Begin()
  360. defer func() {
  361. if err != nil {
  362. o.Rollback()
  363. } else {
  364. o.Commit()
  365. }
  366. }()
  367. //变更审批流记录
  368. contractApprovalRecord.Status = "已审批"
  369. contractApprovalRecord.ApproveRemark = remark //审核失败理由
  370. contractApprovalRecord.ApproveTime = time.Now() //审批时间
  371. contractApprovalRecord.ModifyTime = time.Now()
  372. _, err = o.Update(contractApprovalRecord, "Status", "ApproveRemark", "ApproveTime", "ModifyTime")
  373. if err != nil {
  374. return
  375. }
  376. //如果没有下级节点了,那么完成该审批单
  377. if contractApprovalRecord.NextNodeId <= 0 {
  378. //变更审批单记录
  379. contractApprovalInfo.Status = "已审批"
  380. contractApprovalInfo.ApproveRemark = remark //审核理由
  381. contractApprovalInfo.CurrNodeId = contractApprovalRecord.NextNodeId //下级审批节点id
  382. contractApprovalInfo.ModifyTime = time.Now()
  383. _, tmpErr := o.Update(contractApprovalInfo, "Status", "ApproveRemark", "CurrNodeId", "ModifyTime")
  384. if tmpErr != nil {
  385. err = tmpErr
  386. return
  387. }
  388. //修改合同状态为已审批
  389. sql := `UPDATE contract SET status="已审批",approval_remark=?,modify_time=NOW() WHERE contract_id = ?`
  390. _, tmpErr = o.Raw(sql, remark, contractApprovalInfo.ContractId).Exec()
  391. if tmpErr != nil {
  392. err = tmpErr
  393. return
  394. }
  395. } else {
  396. //变更审批单记录
  397. contractApprovalInfo.ApproveRemark = remark //审核理由
  398. contractApprovalInfo.CurrNodeId = contractApprovalRecord.NextNodeId //下级审批节点id
  399. contractApprovalInfo.ModifyTime = time.Now()
  400. _, tmpErr := o.Update(contractApprovalInfo, "ApproveRemark", "CurrNodeId", "ModifyTime")
  401. if tmpErr != nil {
  402. err = tmpErr
  403. return
  404. }
  405. }
  406. return
  407. }
  408. //抄送
  409. func (ContractApproval) ApprovedByCc(contractApprovalInfo *ContractApproval, contractApprovalRecordList []*contract_approval_record.ContractApprovalRecord, remark string, nextNodeId int) (err error) {
  410. o := orm.NewOrm()
  411. o.Begin()
  412. defer func() {
  413. if err != nil {
  414. o.Rollback()
  415. } else {
  416. o.Commit()
  417. }
  418. }()
  419. for _, contractApprovalRecord := range contractApprovalRecordList {
  420. //变更审批流记录
  421. contractApprovalRecord.Status = "已审批"
  422. contractApprovalRecord.ApproveTime = time.Now() //审批时间
  423. contractApprovalRecord.ModifyTime = time.Now()
  424. _, err = o.Update(contractApprovalRecord, "Status", "ApproveTime", "ModifyTime")
  425. if err != nil {
  426. return
  427. }
  428. }
  429. if err != nil {
  430. return
  431. }
  432. //如果没有下级节点了,那么完成该审批单
  433. if nextNodeId <= 0 {
  434. //变更审批单记录
  435. contractApprovalInfo.Status = "已审批"
  436. contractApprovalInfo.CurrNodeId = nextNodeId //下级审批节点id
  437. contractApprovalInfo.ModifyTime = time.Now()
  438. _, tmpErr := o.Update(contractApprovalInfo, "Status", "CurrNodeId", "ModifyTime")
  439. if tmpErr != nil {
  440. err = tmpErr
  441. return
  442. }
  443. //修改合同状态为已审批
  444. sql := `UPDATE contract SET status="已审批",approval_remark=?,modify_time=NOW() WHERE contract_id = ?`
  445. _, tmpErr = o.Raw(sql, remark, contractApprovalInfo.ContractId).Exec()
  446. if tmpErr != nil {
  447. err = tmpErr
  448. return
  449. }
  450. } else {
  451. //变更审批单记录
  452. contractApprovalInfo.CurrNodeId = nextNodeId //下级审批节点id
  453. contractApprovalInfo.ModifyTime = time.Now()
  454. _, tmpErr := o.Update(contractApprovalInfo, "CurrNodeId", "ModifyTime")
  455. if tmpErr != nil {
  456. err = tmpErr
  457. return
  458. }
  459. }
  460. return
  461. }