seal.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  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/admin"
  9. "hongze/hongze_mobile_admin/models/tables/contract_approval"
  10. "hongze/hongze_mobile_admin/models/tables/contract_approval_record"
  11. "hongze/hongze_mobile_admin/models/tables/seal"
  12. "hongze/hongze_mobile_admin/services"
  13. contractService "hongze/hongze_mobile_admin/services/contract"
  14. "hongze/hongze_mobile_admin/utils"
  15. "strings"
  16. "time"
  17. )
  18. //添加用印
  19. func AddSeal(userId, contractId, fileNum int, userName, use, useCompanyName, companyName, creditCode, serviceType, sealType, remark, fileUrl string) (sealInfo *seal.Seal, err error) {
  20. useList := []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议"}
  21. serviceTypeList := []string{"新签合同", "续约合同", "补充协议"}
  22. sealTypeList := []string{"合同章", "公章", "法人章"}
  23. if !strings.Contains(strings.Join(useList, ","), use) {
  24. err = errors.New("用印用途异常")
  25. return
  26. }
  27. if !strings.Contains(strings.Join(serviceTypeList, ","), serviceType) {
  28. err = errors.New("业务类型异常")
  29. return
  30. }
  31. if !strings.Contains(strings.Join(sealTypeList, ","), sealType) {
  32. err = errors.New("加盖印章类型异常")
  33. return
  34. }
  35. sealCode, err := seal.GetSealCode()
  36. if err != nil {
  37. return
  38. }
  39. sealInfo = &seal.Seal{
  40. Code: sealCode,
  41. UserId: userId,
  42. UserName: userName,
  43. Use: use,
  44. CompanyName: companyName,
  45. UseCompanyName: useCompanyName,
  46. CreditCode: creditCode,
  47. ServiceType: serviceType,
  48. SealType: sealType,
  49. Status: "待提交",
  50. Remark: remark,
  51. FileUrl: fileUrl,
  52. FileNum: fileNum,
  53. ContractId: contractId,
  54. ModifyTime: time.Now(),
  55. CreateTime: time.Now(),
  56. }
  57. err = seal.AddSeal(sealInfo)
  58. return
  59. }
  60. //修改用印
  61. func Edit(sealId, userId, contractId, fileNum int, use, companyName, userCompanyName, creditCode, serviceType, sealType, remark, fileUrl string) (sealInfo *seal.Seal, err error) {
  62. useList := []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议"}
  63. serviceTypeList := []string{"新签合同", "续约合同", "补充协议"}
  64. sealTypeList := []string{"合同章", "公章", "法人章"}
  65. if !strings.Contains(strings.Join(useList, ","), use) {
  66. err = errors.New("用印用途异常")
  67. return
  68. }
  69. if !strings.Contains(strings.Join(serviceTypeList, ","), serviceType) {
  70. err = errors.New("业务类型异常")
  71. return
  72. }
  73. if !strings.Contains(strings.Join(sealTypeList, ","), sealType) {
  74. err = errors.New("加盖印章类型异常")
  75. return
  76. }
  77. //查询当前合同信息
  78. sealInfo, err = seal.GetSealInfoById(sealId)
  79. if err != nil {
  80. if err.Error() == utils.ErrNoRow() {
  81. err = errors.New(fmt.Sprint("根据用印编号:", sealId, " 找不到该用印"))
  82. }
  83. return
  84. }
  85. if sealInfo.UserId != userId {
  86. err = errors.New("当前账号无操作权限")
  87. return
  88. }
  89. ignoreStatus := []string{"待提交", "已撤回", "已驳回"}
  90. if !strings.Contains(strings.Join(ignoreStatus, ","), sealInfo.Status) {
  91. err = errors.New("用印状态异常,不允许修改,当前用印状态:" + sealInfo.Status)
  92. return
  93. }
  94. //sealId,userId int, userName, use, companyName, creditCode, serviceType, sealType, remark, fileUrl string
  95. sealInfo.Use = use
  96. sealInfo.CompanyName = companyName
  97. sealInfo.UseCompanyName = userCompanyName
  98. sealInfo.CreditCode = creditCode
  99. sealInfo.ServiceType = serviceType
  100. sealInfo.SealType = sealType
  101. sealInfo.Remark = remark
  102. sealInfo.FileUrl = fileUrl
  103. sealInfo.FileNum = fileNum
  104. sealInfo.ContractId = contractId
  105. sealInfo.ModifyTime = time.Now()
  106. sealInfo.Status = "待提交" //用印状态
  107. err = sealInfo.Update([]string{"Use", "CompanyName", "CreditCode", "ServiceType", "SealType", "Remark", "FileUrl", "ModifyTime", "Status"})
  108. return
  109. }
  110. //审批者修改用印
  111. func CheckEdit(sealInfo *seal.Seal, approvalInfo *contract_approval.ContractApproval, approvalRecord *contract_approval_record.ContractApprovalRecord, fileNum int, use, sealType, remark string, opUser *custom.AdminWx) (err error) {
  112. useList := []string{"销售合同", "渠道合同", "付款通知函", "招投标", "战略合作协议"}
  113. sealTypeList := []string{"合同章", "公章", "法人章"}
  114. if !strings.Contains(strings.Join(useList, ","), use) {
  115. err = errors.New("用印用途异常")
  116. return
  117. }
  118. if !strings.Contains(strings.Join(sealTypeList, ","), sealType) {
  119. err = errors.New("加盖印章类型异常")
  120. return
  121. }
  122. //判断是否是合规账号
  123. if opUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE {
  124. err = errors.New("当前账号无修改权限")
  125. return
  126. }
  127. //用印状态判断
  128. if sealInfo.Status != "待审批" {
  129. err = errors.New("用印状态异常,不允许修改,当前用印状态:" + sealInfo.Status)
  130. return
  131. }
  132. //变更字段判断
  133. updateCol := make([]string, 0)
  134. updateContent := make([]string, 0)
  135. if sealInfo.Use != use {
  136. updateCol = append(updateCol, "Use")
  137. updateContent = append(updateContent, "用印用途")
  138. }
  139. if sealInfo.SealType != sealType {
  140. updateCol = append(updateCol, "SealType")
  141. updateContent = append(updateContent, "加盖何种印章")
  142. }
  143. if sealInfo.Remark != remark {
  144. updateCol = append(updateCol, "Remark")
  145. updateContent = append(updateContent, "备注")
  146. }
  147. if sealInfo.FileNum != fileNum {
  148. updateCol = append(updateCol, "FileNum")
  149. updateContent = append(updateContent, "文件份数")
  150. }
  151. if len(updateCol) <= 0 {
  152. err = errors.New("没有变更信息")
  153. return
  154. }
  155. content := "用印修改:" + opUser.AdminName + "修改了" + strings.Join(updateContent, "、")
  156. //如果变更了盖章类型(涉及到审批流程变更),那么需要变更审批流
  157. //变更审批流:先驳回用印申请,再修改用印,再发消息给申请人,再替申请人重新发起申请,
  158. //然后遍历审批流程,当前操作人节点之前的全部审核通过,最后通过当前操作人的节点(改成如果一级审批人如果是自己,那么直接通过这一级审批,否则不通过,让审批单重走流程)
  159. if (sealInfo.SealType == "合同章" && strings.Contains("公章,法人章", sealType)) || (strings.Contains("公章,法人章", sealInfo.SealType) && sealType == "合同章") {
  160. //先驳回
  161. err = Reject(sealInfo, approvalInfo, approvalRecord, opUser, "")
  162. if err != nil {
  163. return
  164. }
  165. //修改用印申请,给申请人发消息
  166. sealInfo.Use = use
  167. sealInfo.SealType = sealType
  168. sealInfo.Remark = remark
  169. sealInfo.FileNum = fileNum
  170. sealInfo.ModifyTime = time.Now()
  171. checkEdit(sealInfo, updateCol, approvalRecord.ContractApprovalRecordId, content, opUser)
  172. //重新获取最新的用印单
  173. sealInfo, tmpErr := seal.GetSealInfoById(sealInfo.SealId)
  174. if tmpErr != nil {
  175. err = tmpErr
  176. return
  177. }
  178. //重新发起申请
  179. err = CheckApply(sealInfo, opUser)
  180. if err != nil {
  181. return
  182. }
  183. } else { //修改用印基础信息 并 审批通过
  184. //修改用印申请,给申请人发消息
  185. sealInfo.Use = use
  186. sealInfo.SealType = sealType
  187. sealInfo.Remark = remark
  188. sealInfo.FileNum = fileNum
  189. sealInfo.ModifyTime = time.Now()
  190. checkEdit(sealInfo, updateCol, approvalRecord.ContractApprovalRecordId, content, opUser)
  191. //审核通过
  192. err = Approved(sealInfo, approvalInfo, approvalRecord, opUser, "")
  193. }
  194. return
  195. }
  196. func checkEdit(sealInfo *seal.Seal, updateCol []string, approvalRecordId int, content string, opUser *custom.AdminWx) {
  197. _ = sealInfo.Update(updateCol)
  198. //给用印人,发送修改消息
  199. sysUserMobile := ""
  200. sysUser, _ := admin.GetAdminById(opUser.AdminId)
  201. if sysUser != nil {
  202. sysUserMobile = sysUser.Mobile
  203. }
  204. go services.AddCompanyApprovalMessage(opUser.AdminId, sealInfo.UserId, 0, approvalRecordId, 3, sourceType, 2, sealInfo.CompanyName, content, content, sysUserMobile)
  205. return
  206. }
  207. //作废用印
  208. func Invalid(sealId int, opUser *custom.AdminWx, isInvalidContract bool) (err error) {
  209. //查询当前合同信息
  210. sealInfo, err := seal.GetSealInfoById(sealId)
  211. if err != nil {
  212. if err.Error() == utils.ErrNoRow() {
  213. err = errors.New(fmt.Sprint("根据用印编号:", sealId, " 找不到初始用印"))
  214. }
  215. return
  216. }
  217. if sealInfo.UserId != opUser.AdminId && opUser.RoleTypeCode != utils.ROLE_TYPE_CODE_COMPLIANCE {
  218. err = errors.New("当前账号无操作权限")
  219. return
  220. }
  221. if sealInfo.Status != "已审批" {
  222. err = errors.New("用印状态异常,不允许作废,当前用印状态:" + sealInfo.Status)
  223. return
  224. }
  225. //如果删除状态 >0,那么代表已经被删除了
  226. if sealInfo.IsDelete > 0 {
  227. err = errors.New("该用印已删除")
  228. return
  229. }
  230. //用印作废
  231. err = seal.Invalid(sealInfo)
  232. if err != nil {
  233. return
  234. }
  235. //如果是系统合同,同时需要同步作废合同时,那么逻辑处理
  236. if sealInfo.ContractId > 0 && isInvalidContract {
  237. err = contractService.InvalidContract(sealInfo.ContractId, opUser)
  238. if err != nil {
  239. logs.Info("作废用印时,同步作废合同失败,Err:", err.Error())
  240. }
  241. }
  242. //添加操作日志
  243. //remark := "作废合同模板"
  244. //_ = contract_operation_record.AddContractOperationRecord(nowContract.ContractId, opUser.AdminId, 0, "invalid", opUser.RealName, remark)
  245. return
  246. }
  247. //获取审批流和权限
  248. func GetOpButton(sealInfo *seal.Seal, contractApprovalInfo *contract_approval.ContractApproval, opUser *custom.AdminWx) (sealOpButton sealResp.OpButton, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, err error) {
  249. //审批流
  250. approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalInfo.ContractApprovalId)
  251. if err != nil {
  252. err = errors.New("获取审批失败,Err:" + err.Error())
  253. return
  254. }
  255. flowNodeMap := make(map[int][]contract_approval_record.ContractApprovalRecord, 0)
  256. keySort := make([]int, 0)
  257. for _, approvalRecord := range approvalRecordList {
  258. //如果当前节点正好是该节点,同时审批单状态是待审批状态,然后当前账号又有权限,该账号也正是审批人,那么允许审批操作
  259. if contractApprovalInfo.CurrNodeId == approvalRecord.NodeId && contractApprovalInfo.Status == "待审批" {
  260. if opUser.AdminId == approvalRecord.ApproveUserId && approvalRecord.NodeType == "check" {
  261. sealOpButton.Approval = true
  262. }
  263. //合规在审批过程中具有 部分修改权限
  264. if opUser.AdminId == approvalRecord.ApproveUserId && opUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE && approvalRecord.NodeType == "check" {
  265. sealOpButton.CheckEdit = true
  266. }
  267. }
  268. if tmpFlowNodeList, ok := flowNodeMap[approvalRecord.NodeId]; ok {
  269. flowNodeMap[approvalRecord.NodeId] = append(tmpFlowNodeList, *approvalRecord)
  270. } else {
  271. tmpFlowNodeList := make([]contract_approval_record.ContractApprovalRecord, 1)
  272. tmpFlowNodeList[0] = *approvalRecord
  273. flowNodeMap[approvalRecord.NodeId] = tmpFlowNodeList
  274. keySort = append(keySort, approvalRecord.NodeId)
  275. }
  276. }
  277. for _, key := range keySort {
  278. flowNodeListResp = append(flowNodeListResp, flowNodeMap[key])
  279. }
  280. //作废权限
  281. if (opUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE || opUser.AdminId == sealInfo.UserId) && sealInfo.Status == "已审批" {
  282. sealOpButton.Invalid = true
  283. }
  284. //编辑权限
  285. editStatus := []string{"已驳回", "待提交", "已撤回"}
  286. if opUser.AdminId == sealInfo.UserId && strings.Contains(strings.Join(editStatus, ","), sealInfo.Status) {
  287. sealOpButton.Edit = true
  288. }
  289. return
  290. }