seal.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package seal
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/astaxie/beego/logs"
  6. "hongze/hongze_mobile_admin/models/custom"
  7. sealResp "hongze/hongze_mobile_admin/models/response/seal"
  8. "hongze/hongze_mobile_admin/models/tables/contract_approval"
  9. "hongze/hongze_mobile_admin/models/tables/contract_approval_record"
  10. "hongze/hongze_mobile_admin/models/tables/seal"
  11. contractService "hongze/hongze_mobile_admin/services/contract"
  12. "hongze/hongze_mobile_admin/utils"
  13. "strings"
  14. "time"
  15. )
  16. //添加用印
  17. func AddSeal(userId, contractId, fileNum int, userName, use, useCompanyName, companyName, creditCode, serviceType, sealType, remark, fileUrl string) (sealInfo *seal.Seal, err error) {
  18. useList := []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议"}
  19. serviceTypeList := []string{"新签合同", "续约合同", "补充协议"}
  20. sealTypeList := []string{"合同章", "公章", "法人章"}
  21. if !strings.Contains(strings.Join(useList, ","), use) {
  22. err = errors.New("用印用途异常")
  23. return
  24. }
  25. if !strings.Contains(strings.Join(serviceTypeList, ","), serviceType) {
  26. err = errors.New("业务类型异常")
  27. return
  28. }
  29. if !strings.Contains(strings.Join(sealTypeList, ","), sealType) {
  30. err = errors.New("加盖印章类型异常")
  31. return
  32. }
  33. sealCode, err := seal.GetSealCode()
  34. if err != nil {
  35. return
  36. }
  37. sealInfo = &seal.Seal{
  38. Code: sealCode,
  39. UserId: userId,
  40. UserName: userName,
  41. Use: use,
  42. CompanyName: companyName,
  43. UseCompanyName: useCompanyName,
  44. CreditCode: creditCode,
  45. ServiceType: serviceType,
  46. SealType: sealType,
  47. Status: "待提交",
  48. Remark: remark,
  49. FileUrl: fileUrl,
  50. FileNum: fileNum,
  51. ContractId: contractId,
  52. ModifyTime: time.Now(),
  53. CreateTime: time.Now(),
  54. }
  55. err = seal.AddSeal(sealInfo)
  56. return
  57. }
  58. //修改用印
  59. func Edit(sealId, userId, contractId, fileNum int, use, companyName, userCompanyName, creditCode, serviceType, sealType, remark, fileUrl string) (sealInfo *seal.Seal, err error) {
  60. useList := []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议"}
  61. serviceTypeList := []string{"新签合同", "续约合同", "补充协议"}
  62. sealTypeList := []string{"合同章", "公章", "法人章"}
  63. if !strings.Contains(strings.Join(useList, ","), use) {
  64. err = errors.New("用印用途异常")
  65. return
  66. }
  67. if !strings.Contains(strings.Join(serviceTypeList, ","), serviceType) {
  68. err = errors.New("业务类型异常")
  69. return
  70. }
  71. if !strings.Contains(strings.Join(sealTypeList, ","), sealType) {
  72. err = errors.New("加盖印章类型异常")
  73. return
  74. }
  75. //查询当前合同信息
  76. sealInfo, err = seal.GetSealInfoById(sealId)
  77. if err != nil {
  78. if err.Error() == utils.ErrNoRow() {
  79. err = errors.New(fmt.Sprint("根据用印编号:", sealId, " 找不到该用印"))
  80. }
  81. return
  82. }
  83. if sealInfo.UserId != userId {
  84. err = errors.New("当前账号无操作权限")
  85. return
  86. }
  87. ignoreStatus := []string{"待提交", "已撤回", "已驳回"}
  88. if !strings.Contains(strings.Join(ignoreStatus, ","), sealInfo.Status) {
  89. err = errors.New("用印状态异常,不允许修改,当前用印状态:" + sealInfo.Status)
  90. return
  91. }
  92. //sealId,userId int, userName, use, companyName, creditCode, serviceType, sealType, remark, fileUrl string
  93. sealInfo.Use = use
  94. sealInfo.CompanyName = companyName
  95. sealInfo.UseCompanyName = userCompanyName
  96. sealInfo.CreditCode = creditCode
  97. sealInfo.ServiceType = serviceType
  98. sealInfo.SealType = sealType
  99. sealInfo.Remark = remark
  100. sealInfo.FileUrl = fileUrl
  101. sealInfo.FileNum = fileNum
  102. sealInfo.ContractId = contractId
  103. sealInfo.ModifyTime = time.Now()
  104. sealInfo.Status = "待提交" //用印状态
  105. err = sealInfo.Update([]string{"Use", "CompanyName", "CreditCode", "ServiceType", "SealType", "Remark", "FileUrl", "ModifyTime", "Status"})
  106. return
  107. }
  108. //作废用印
  109. func Invalid(sealId int, opUser *custom.AdminWx, isInvalidContract bool) (err error) {
  110. //查询当前合同信息
  111. sealInfo, err := seal.GetSealInfoById(sealId)
  112. if err != nil {
  113. if err.Error() == utils.ErrNoRow() {
  114. err = errors.New(fmt.Sprint("根据用印编号:", sealId, " 找不到初始用印"))
  115. }
  116. return
  117. }
  118. if sealInfo.UserId != opUser.AdminId && opUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE {
  119. err = errors.New("当前账号无操作权限")
  120. return
  121. }
  122. if sealInfo.Status != "已审批" {
  123. err = errors.New("用印状态异常,不允许作废,当前用印状态:" + sealInfo.Status)
  124. return
  125. }
  126. //如果删除状态 >0,那么代表已经被删除了
  127. if sealInfo.IsDelete > 0 {
  128. err = errors.New("该用印已删除")
  129. return
  130. }
  131. //用印作废
  132. err = seal.Invalid(sealInfo)
  133. if err != nil {
  134. return
  135. }
  136. //如果是系统合同,同时需要同步作废合同时,那么逻辑处理
  137. if sealInfo.ContractId > 0 && isInvalidContract {
  138. err = contractService.InvalidContract(sealInfo.ContractId, opUser)
  139. if err != nil {
  140. logs.Info("作废用印时,同步作废合同失败,Err:", err.Error())
  141. }
  142. }
  143. //添加操作日志
  144. //remark := "作废合同模板"
  145. //_ = contract_operation_record.AddContractOperationRecord(nowContract.ContractId, opUser.AdminId, 0, "invalid", opUser.RealName, remark)
  146. return
  147. }
  148. //获取审批流和权限
  149. func GetOpButton(sealInfo *seal.Seal, contractApprovalInfo *contract_approval.ContractApproval, opUser *custom.AdminWx) (sealOpButton sealResp.OpButton, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, err error) {
  150. //审批流
  151. approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalInfo.ContractApprovalId)
  152. if err != nil {
  153. err = errors.New("获取审批失败,Err:" + err.Error())
  154. return
  155. }
  156. flowNodeMap := make(map[int][]contract_approval_record.ContractApprovalRecord, 0)
  157. keySort := make([]int, 0)
  158. for _, approvalRecord := range approvalRecordList {
  159. //如果当前节点正好是该节点,同时审批单状态是待审批状态,然后当前账号又有权限,该账号也正是审批人,那么允许审批操作
  160. if contractApprovalInfo.CurrNodeId == approvalRecord.NodeId && contractApprovalInfo.Status == "待审批" {
  161. if opUser.AdminId == approvalRecord.ApproveUserId && approvalRecord.NodeType == "check" {
  162. sealOpButton.Approval = true
  163. }
  164. //合规在审批过程中具有 部分修改权限
  165. if opUser.AdminId == approvalRecord.ApproveUserId && opUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE && approvalRecord.NodeType == "check" {
  166. sealOpButton.CheckEdit = true
  167. }
  168. }
  169. if tmpFlowNodeList, ok := flowNodeMap[approvalRecord.NodeId]; ok {
  170. flowNodeMap[approvalRecord.NodeId] = append(tmpFlowNodeList, *approvalRecord)
  171. } else {
  172. tmpFlowNodeList := make([]contract_approval_record.ContractApprovalRecord, 1)
  173. tmpFlowNodeList[0] = *approvalRecord
  174. flowNodeMap[approvalRecord.NodeId] = tmpFlowNodeList
  175. keySort = append(keySort, approvalRecord.NodeId)
  176. }
  177. }
  178. for _, key := range keySort {
  179. flowNodeListResp = append(flowNodeListResp, flowNodeMap[key])
  180. }
  181. //作废权限
  182. if (opUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE || opUser.AdminId == sealInfo.UserId) && sealInfo.Status == "已审批" {
  183. sealOpButton.Invalid = true
  184. }
  185. //编辑权限
  186. editStatus := []string{"已驳回", "待提交", "已撤回"}
  187. if opUser.AdminId == sealInfo.UserId && strings.Contains(strings.Join(editStatus, ","), sealInfo.Status) {
  188. sealOpButton.Edit = true
  189. }
  190. return
  191. }