contract_approval.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  1. package contract
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "hongze/hongze_mobile_admin/models/custom"
  7. "hongze/hongze_mobile_admin/models/tables/admin"
  8. "hongze/hongze_mobile_admin/models/tables/approval_flow"
  9. "hongze/hongze_mobile_admin/models/tables/approval_flow_node"
  10. "hongze/hongze_mobile_admin/models/tables/company"
  11. "hongze/hongze_mobile_admin/models/tables/company_approval_message"
  12. "hongze/hongze_mobile_admin/models/tables/company_log"
  13. "hongze/hongze_mobile_admin/models/tables/contract"
  14. "hongze/hongze_mobile_admin/models/tables/contract_approval"
  15. "hongze/hongze_mobile_admin/models/tables/contract_approval_record"
  16. "hongze/hongze_mobile_admin/models/tables/contract_operation_record"
  17. "hongze/hongze_mobile_admin/services"
  18. "hongze/hongze_mobile_admin/services/flow"
  19. "hongze/hongze_mobile_admin/utils"
  20. "os"
  21. "strings"
  22. "time"
  23. )
  24. //提交审批
  25. func Apply(contractId int) (err error) {
  26. //获取合同详情
  27. contractInfo, err := GetContractDetail(contractId)
  28. if err != nil {
  29. err = errors.New("获取合同信息失败,Err:" + err.Error())
  30. return
  31. }
  32. if contractInfo == nil {
  33. err = errors.New("合同异常,没有合同信息")
  34. return
  35. }
  36. contractInfo.StartDateStr = contractInfo.StartDate.Format(utils.FormatDate)
  37. contractInfo.EndDateStr = contractInfo.EndDate.Format(utils.FormatDate)
  38. contractInfo.ModifyTimeStr = contractInfo.ModifyTime.Format(utils.FormatDateTime)
  39. contractInfo.CreateTimeStr = contractInfo.CreateTime.Format(utils.FormatDateTime)
  40. //合同状态判断
  41. ignoreStatus := []string{"待提交", "已撤回", "已驳回"}
  42. if !strings.Contains(strings.Join(ignoreStatus, ","), contractInfo.Status) {
  43. err = errors.New("合同状态异常,不允许提交审批,当前合同状态:" + contractInfo.Status)
  44. return
  45. }
  46. //待审内容
  47. applyContent := "生成新模板"
  48. //if contractInfo.SourceId > 0 {
  49. // applyContent = "作废重生成"
  50. //}
  51. if contractInfo.Status == "已驳回" {
  52. applyContent = "驳回重申请"
  53. }
  54. //if contractInfo.Status == "已撤回" {
  55. // applyContent = "撤回重申请"
  56. //}
  57. contractDetailByte, err := json.Marshal(contractInfo)
  58. if err != nil {
  59. err = errors.New(fmt.Sprint("合同状态异常,当前合同数据格式化失败:", err))
  60. return
  61. }
  62. //获取基础审批流
  63. var flowItemInfo *approval_flow.ApprovalFlowItem
  64. if contractInfo.ProductId == 1 {
  65. tmpFlowItemInfo, tmpErr := flow.GetApprovalFlow(3)
  66. if tmpErr != nil {
  67. err = errors.New(fmt.Sprint("查找审批流程配置失败:", tmpErr))
  68. return
  69. }
  70. flowItemInfo = tmpFlowItemInfo
  71. } else {
  72. tmpFlowItemInfo, tmpErr := flow.GetApprovalFlow(4)
  73. if tmpErr != nil {
  74. err = errors.New(fmt.Sprint("查找审批流程配置失败:", tmpErr))
  75. return
  76. }
  77. flowItemInfo = tmpFlowItemInfo
  78. }
  79. fmt.Println(flowItemInfo)
  80. //校验是否存在待审批的审批单(其实没有多大意义,只是为了 异常数据校验)
  81. contractApproval := &contract_approval.ContractApproval{
  82. ContractId: contractInfo.ContractId,
  83. Status: "待审批",
  84. ApplyContent: applyContent,
  85. ContractDetail: string(contractDetailByte),
  86. ApplyUserId: contractInfo.SellerId,
  87. ApplyUserName: contractInfo.SellerName,
  88. FlowId: flowItemInfo.FlowId,
  89. FlowVersion: flowItemInfo.CurrVersion,
  90. CurrNodeId: flowItemInfo.NodeList[0].NodeId,
  91. ModifyTime: time.Now(),
  92. CreateTime: time.Now(),
  93. }
  94. has, err := contractApproval.CheckPendingByContractId(contractInfo.ContractId, "contract")
  95. if err != nil {
  96. return
  97. }
  98. if has {
  99. err = errors.New("合同异常,不允许提交审批,存在待审核的审批单")
  100. return
  101. }
  102. contractApprovalRecordList := make([]*contract_approval_record.ContractApprovalRecord, 0)
  103. ApproveUserMap := make(map[int]approval_flow_node.User)
  104. for _, nodeItem := range flowItemInfo.NodeList {
  105. //审批流记录
  106. if len(nodeItem.UserList) <= 0 {
  107. err = errors.New(fmt.Sprint("审批流程异常,没有可审批的人员,Err:", err))
  108. return
  109. }
  110. for _, userItem := range nodeItem.UserList {
  111. contractApprovalRecord := &contract_approval_record.ContractApprovalRecord{
  112. Status: "待审批",
  113. ApproveRemark: "",
  114. ApproveUserId: userItem.AdminId,
  115. ApproveUserName: userItem.Name,
  116. ApproveRoleTypeCode: userItem.RoleTypeCode,
  117. NodeId: nodeItem.NodeId,
  118. NodeType: nodeItem.NodeType,
  119. NextNodeId: nodeItem.NextNodeId,
  120. CreateTime: time.Now(),
  121. ModifyTime: time.Now(),
  122. }
  123. contractApprovalRecordList = append(contractApprovalRecordList, contractApprovalRecord)
  124. ApproveUserMap[userItem.AdminId] = userItem
  125. }
  126. }
  127. err = contractApproval.Apply(contractApproval, contractApprovalRecordList)
  128. if err != nil {
  129. return
  130. }
  131. //添加操作日志
  132. remark := "提交审批"
  133. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, contractInfo.SellerId, contractApprovalRecordList[0].ContractApprovalRecordId, "apply", contractInfo.SellerName, remark)
  134. //待办通知
  135. {
  136. //发送消息下级审批人
  137. go messageToNodeUser(contractApprovalRecordList[0].NodeId, contractInfo.SellerId, contractApproval.ContractApprovalId, 1, 1, contractInfo.CompanyName, applyContent)
  138. //发送消息给所有的抄送人
  139. //go messageToAllCcUser(contractInfo.SellerId, contractApproval.ContractApprovalId, 1, 1, contractInfo.CompanyName, applyContent)
  140. }
  141. return
  142. }
  143. //撤销合同
  144. func CancelApplyByContract(contractInfo *contract.Contract, opUserId int) (err error) {
  145. if contractInfo == nil {
  146. err = errors.New("审批流异常,没有审批流信息")
  147. return
  148. }
  149. //合同状态判断
  150. if contractInfo.Status != "待审批" {
  151. err = errors.New("合同状态异常,不允许撤回申请,当前合同状态:" + contractInfo.Status)
  152. return
  153. }
  154. //校验操作人与合同申请人是否同一人
  155. if contractInfo.SellerId != opUserId {
  156. err = errors.New("操作人异常,不允许撤回非本人提交的申请:" + contractInfo.Status)
  157. return
  158. }
  159. //获取最近一次待审批的审批单信息
  160. contractApproval, err := contract_approval.GetLastPendingContractApprovalByContractId(contractInfo.ContractId)
  161. if err != nil {
  162. return
  163. }
  164. //获取当前待审批的审批流信息
  165. contractApprovalRecord, err := contract_approval_record.GetCurrContractApprovalRecordByContractId(contractApproval.ContractApprovalId)
  166. if err != nil {
  167. return
  168. }
  169. //判断当前节点是否存在上级节点,如果存在,那么说明
  170. if contractApprovalRecord.PrevNodeId > 0 {
  171. err = errors.New("合同已存在审批操作,不允许撤回申请")
  172. return
  173. }
  174. //获取当前审批单中所有待审批的流程流
  175. contractApprovalRecordList, err := contract_approval_record.GetPendingContractApprovalRecordListByContractId(contractApproval.ContractApprovalId, contractApprovalRecord.NodeId)
  176. if err != nil {
  177. return
  178. }
  179. //撤回审批流
  180. err = contractApproval.Cancel(contractApproval, contractApprovalRecordList)
  181. if err != nil {
  182. return
  183. }
  184. //添加操作日志
  185. remark := "撤回申请"
  186. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, contractInfo.SellerId, contractApprovalRecord.ContractApprovalRecordId, "cancel_apply", contractInfo.SellerName, remark)
  187. //作废原有消息
  188. for _, contractApprovalRecord := range contractApprovalRecordList {
  189. go company_approval_message.CancelCompanyApprovalMessage(contractApprovalRecord.ContractApprovalRecordId, 2)
  190. }
  191. return
  192. }
  193. //撤回审批单
  194. func CancelApply(contractApprovalRecord *contract_approval_record.ContractApprovalRecord, opUserId int) (err error) {
  195. if contractApprovalRecord == nil {
  196. err = errors.New("审批流异常,没有审批流信息")
  197. return
  198. }
  199. //审批流状态判断
  200. if contractApprovalRecord.Status != "待审批" {
  201. err = errors.New("审批流状态异常,不允许撤回申请,当前审批流状态:" + contractApprovalRecord.Status)
  202. return
  203. }
  204. //获取审批单详情
  205. contractApproval, err := contract_approval.GetContractApprovalById(contractApprovalRecord.ContractApprovalId)
  206. if err != nil {
  207. return
  208. }
  209. //审批单状态判断
  210. if contractApproval.Status != "待审批" {
  211. err = errors.New("审批单状态异常,不允许撤回申请,当前审批单状态:" + contractApproval.Status)
  212. return
  213. }
  214. //获取合同信息
  215. contractInfo, err := contract.GetContractById(contractApproval.ContractId)
  216. if err != nil {
  217. return
  218. }
  219. //合同状态判断
  220. if contractInfo.Status != "待审批" {
  221. err = errors.New("合同状态异常,不允许撤回申请,当前合同状态:" + contractInfo.Status)
  222. return
  223. }
  224. //校验操作人与合同申请人是否同一人
  225. if contractInfo.SellerId != opUserId {
  226. err = errors.New("操作人异常,不允许撤回非本人提交的申请:" + contractInfo.Status)
  227. return
  228. }
  229. //获取当前审批单中所有待审批的流程流
  230. contractApprovalRecordList, err := contract_approval_record.GetPendingContractApprovalRecordListByContractId(contractApproval.ContractApprovalId, contractApprovalRecord.NodeId)
  231. if err != nil {
  232. return
  233. }
  234. err = contractApproval.Cancel(contractApproval, contractApprovalRecordList)
  235. if err != nil {
  236. return
  237. }
  238. //添加操作日志
  239. remark := "撤回申请"
  240. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, contractInfo.SellerId, contractApprovalRecord.ContractApprovalRecordId, "cancel_apply", contractInfo.SellerName, remark)
  241. //作废原有消息
  242. go company_approval_message.CancelCompanyApprovalMessage(contractApprovalRecord.ContractApprovalRecordId, 2)
  243. return
  244. }
  245. //校验审批操作权限
  246. func CheckApproveAuth(contractId int, opUser *custom.AdminWx) (contractInfo *contract.Contract, approvalInfo *contract_approval.ContractApproval, approvalRecord *contract_approval_record.ContractApprovalRecord, err error) {
  247. //合同详情
  248. contractInfo, err = contract.GetContractById(contractId)
  249. if err != nil {
  250. err = errors.New("获取合同失败,Err:" + err.Error())
  251. return
  252. }
  253. //合同状态判断
  254. if contractInfo.Status != "待审批" {
  255. err = errors.New("合同状态异常,不允许驳回申请,当前合同状态:" + contractInfo.Status)
  256. return
  257. }
  258. //获取该最近一条审批单详情
  259. approvalInfo, err = contract_approval.GetLastContractApprovalByContractId(contractInfo.ContractId, "contract")
  260. if err != nil {
  261. err = errors.New("获取审批单失败,Err:" + err.Error())
  262. return
  263. }
  264. if approvalInfo.Status != "待审批" {
  265. err = errors.New("当前审批单状态异常,不允许审批,审批单状态:" + approvalInfo.Status)
  266. return
  267. }
  268. //审批流
  269. approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalIdAndNodeId(approvalInfo.ContractApprovalId, approvalInfo.CurrNodeId)
  270. if err != nil {
  271. err = errors.New("获取审批失败,Err:" + err.Error())
  272. return
  273. }
  274. for _, tmpApprovalRecord := range approvalRecordList {
  275. if tmpApprovalRecord.NodeType == "check" && tmpApprovalRecord.ApproveUserId == opUser.AdminId {
  276. approvalRecord = tmpApprovalRecord
  277. }
  278. }
  279. if approvalRecord == nil {
  280. err = errors.New("当前账号没有审批权限")
  281. return
  282. }
  283. return
  284. }
  285. //审批驳回
  286. func Reject(contractInfo *contract.Contract, approvalInfo *contract_approval.ContractApproval, contractApprovalRecord *contract_approval_record.ContractApprovalRecord, opUser *custom.AdminWx, rejectRemark string) (err error) {
  287. if contractApprovalRecord == nil {
  288. err = errors.New("审批流异常,没有审批流信息")
  289. return
  290. }
  291. //审批流状态判断
  292. if contractApprovalRecord.Status != "待审批" {
  293. err = errors.New("审批流状态异常,不允许驳回申请,当前审批流状态:" + contractApprovalRecord.Status)
  294. return
  295. }
  296. //判断是否审批类型,如果不是审批类型,那么就没有审批权限
  297. if contractApprovalRecord.NodeType != "check" {
  298. err = errors.New("当前账号没有审批权限")
  299. return
  300. }
  301. //操作人
  302. opUserId := opUser.AdminId
  303. opUserName := opUser.RealName
  304. //操作权限校验
  305. if opUser.RoleTypeCode != contractApprovalRecord.ApproveRoleTypeCode {
  306. err = errors.New("当前账号没有审批权限")
  307. return
  308. }
  309. if contractApprovalRecord.ApproveUserId > 0 && contractApprovalRecord.ApproveUserId != opUserId {
  310. err = errors.New("当前账号没有审批权限,需要指定人操作")
  311. return
  312. }
  313. //审批单状态判断
  314. if approvalInfo.Status != "待审批" {
  315. err = errors.New("审批单状态异常,不允许驳回申请,当前审批单状态:" + approvalInfo.Status)
  316. return
  317. }
  318. //驳回操作
  319. err = approvalInfo.Reject(approvalInfo, contractApprovalRecord, opUserId, opUserName, rejectRemark)
  320. if err != nil {
  321. return
  322. }
  323. //添加操作日志
  324. remark := "驳回申请"
  325. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, opUserId, contractApprovalRecord.ContractApprovalRecordId, "reject", opUserName, remark)
  326. //待办通知
  327. {
  328. content := contractInfo.CompanyName + " 合同模板已驳回"
  329. approvalSysUser, _ := admin.GetAdminById(contractInfo.SellerId)
  330. go services.AddCompanyApprovalMessage(opUserId, contractInfo.SellerId, 0, contractApprovalRecord.ContractApprovalRecordId, 2, 2, 3, contractInfo.CompanyName, content, content, approvalSysUser.Mobile)
  331. //发送消息给所有的抄送人
  332. //go messageToAllCcUser(opUserId, contractApprovalRecord.ContractApprovalId, 2, 3, contractInfo.CompanyName, content)
  333. }
  334. return
  335. }
  336. //审批通过
  337. func Approved(contractInfo *contract.Contract, approvalInfo *contract_approval.ContractApproval, contractApprovalRecord *contract_approval_record.ContractApprovalRecord, opUser *custom.AdminWx, approvedRemark string) (err error) {
  338. if contractApprovalRecord == nil {
  339. err = errors.New("审批流异常,没有审批流信息")
  340. return
  341. }
  342. //审批流状态判断
  343. if contractApprovalRecord.Status != "待审批" {
  344. err = errors.New("审批流状态异常,不允许审批,当前审批流状态:" + contractApprovalRecord.Status)
  345. return
  346. }
  347. //判断是否审批类型,如果不是审批类型,那么就没有审批权限
  348. if contractApprovalRecord.NodeType != "check" {
  349. err = errors.New("当前账号没有审批权限")
  350. return
  351. }
  352. //操作人
  353. opUserId := opUser.AdminId
  354. opUserName := opUser.RealName
  355. //操作权限校验
  356. if opUser.RoleTypeCode != contractApprovalRecord.ApproveRoleTypeCode {
  357. err = errors.New("当前账号没有审批权限")
  358. return
  359. }
  360. if contractApprovalRecord.ApproveUserId > 0 && contractApprovalRecord.ApproveUserId != opUserId {
  361. err = errors.New("当前账号没有审批权限,需要指定人操作")
  362. return
  363. }
  364. //审批单状态判断
  365. if approvalInfo.Status != "待审批" {
  366. err = errors.New("审批单状态异常,不允许审批,当前审批单状态:" + approvalInfo.Status)
  367. return
  368. }
  369. //合同状态判断
  370. if contractInfo.Status != "待审批" {
  371. err = errors.New("合同状态异常,不允许审批,当前合同状态:" + contractInfo.Status)
  372. return
  373. }
  374. //if contractApprovalRecord
  375. err = approvalInfo.Approved(approvalInfo, contractApprovalRecord, approvedRemark)
  376. if err != nil {
  377. return
  378. }
  379. //添加操作日志
  380. remark := "审批通过"
  381. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, opUserId, contractApprovalRecord.ContractApprovalRecordId, "approval", opUserName, remark)
  382. //发送信息给所有抄送人
  383. content := contractInfo.CompanyName + " 合同模板已审核"
  384. //go messageToAllCcUser(opUserId, contractApprovalRecord.ContractApprovalId, 2, 2, contractInfo.CompanyName, content)
  385. //如果下一个节点属于结束节点,那么通知对应的销售,同时,异步生成合同pdf
  386. if contractApprovalRecord.NextNodeId == 0 {
  387. //待办通知(通知销售已经审核通过了)
  388. {
  389. content := contractInfo.CompanyName + " 合同模板已审核"
  390. approvalSysUser, _ := admin.GetAdminById(contractInfo.SellerId)
  391. go services.AddCompanyApprovalMessage(opUserId, contractInfo.SellerId, 0, contractApprovalRecord.ContractApprovalRecordId, 2, 2, 2, contractInfo.CompanyName, content, content, approvalSysUser.Mobile)
  392. }
  393. //审核通过后的异步操作(pdf生成、修改数据等)
  394. go AfterApproved(contractInfo.ContractId)
  395. } else {
  396. //获取下级节点信息
  397. flowNodeInfo, tmpErr := approval_flow_node.GetByNodeId(contractApprovalRecord.NextNodeId)
  398. if tmpErr != nil {
  399. err = tmpErr
  400. return
  401. }
  402. //如果该级节点是抄送类型,那么需要将该节点给处理掉
  403. if flowNodeInfo.NodeType == "cc" {
  404. go approvedByCc(approvedRemark, contractApprovalRecord)
  405. } else {
  406. //发送消息下级审批人
  407. go messageToNodeUser(contractApprovalRecord.NextNodeId, contractInfo.SellerId, approvalInfo.ContractApprovalId, 1, 1, contractInfo.CompanyName, content)
  408. }
  409. }
  410. return
  411. }
  412. //审批通过(实际操作)
  413. func approved(contractInfo *contract.Contract, contractApprovalRecord *contract_approval_record.ContractApprovalRecord, opUser *custom.AdminWx, approvedRemark string) (err error) {
  414. if contractApprovalRecord == nil {
  415. err = errors.New("审批流异常,没有审批流信息")
  416. return
  417. }
  418. //审批流状态判断
  419. if contractApprovalRecord.Status != "待审批" {
  420. err = errors.New("审批流状态异常,不允许审批,当前审批流状态:" + contractApprovalRecord.Status)
  421. return
  422. }
  423. //判断是否审批类型,如果不是审批类型,那么就没有审批权限
  424. if contractApprovalRecord.NodeType != "check" {
  425. err = errors.New("当前账号没有审批权限")
  426. return
  427. }
  428. //操作人
  429. opUserId := opUser.AdminId
  430. opUserName := opUser.RealName
  431. //操作权限校验
  432. if opUser.RoleTypeCode != contractApprovalRecord.ApproveRoleTypeCode {
  433. err = errors.New("当前账号没有审批权限")
  434. return
  435. }
  436. if contractApprovalRecord.ApproveUserId > 0 && contractApprovalRecord.ApproveUserId != opUserId {
  437. err = errors.New("当前账号没有审批权限,需要指定人操作")
  438. return
  439. }
  440. //获取审批单详情
  441. contractApproval, err := contract_approval.GetContractApprovalById(contractApprovalRecord.ContractApprovalId)
  442. if err != nil {
  443. return
  444. }
  445. //审批单状态判断
  446. if contractApproval.Status != "待审批" {
  447. err = errors.New("审批单状态异常,不允许审批,当前审批单状态:" + contractApproval.Status)
  448. return
  449. }
  450. //if contractApprovalRecord
  451. err = contractApproval.Approved(contractApproval, contractApprovalRecord, approvedRemark)
  452. if err != nil {
  453. return
  454. }
  455. //添加操作日志
  456. remark := "审批通过"
  457. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, opUserId, contractApprovalRecord.ContractApprovalRecordId, "approval", opUserName, remark)
  458. //发送信息给所有抄送人
  459. content := contractInfo.CompanyName + " 合同模板已审核"
  460. //go messageToAllCcUser(opUserId, contractApprovalRecord.ContractApprovalId, 2, 2, contractInfo.CompanyName, content)
  461. //如果下一个节点属于结束节点,那么通知对应的销售,同时,异步生成合同pdf
  462. if contractApprovalRecord.NextNodeId == 0 {
  463. //待办通知(通知销售已经审核通过了)
  464. {
  465. content := contractInfo.CompanyName + " 合同模板已审核"
  466. approvalSysUser, _ := admin.GetAdminById(contractInfo.SellerId)
  467. go services.AddCompanyApprovalMessage(opUserId, contractInfo.SellerId, 0, contractApprovalRecord.ContractApprovalRecordId, 2, 2, 2, contractInfo.CompanyName, content, content, approvalSysUser.Mobile)
  468. }
  469. //审核通过后的异步操作(pdf生成、修改数据等)
  470. go AfterApproved(contractInfo.ContractId)
  471. } else {
  472. //获取下级节点信息
  473. flowNodeInfo, tmpErr := approval_flow_node.GetByNodeId(contractApprovalRecord.NextNodeId)
  474. if tmpErr != nil {
  475. err = tmpErr
  476. return
  477. }
  478. //如果该级节点是抄送类型,那么需要将该节点给处理掉
  479. if flowNodeInfo.NodeType == "cc" {
  480. go approvedByCc(approvedRemark, contractApprovalRecord)
  481. } else {
  482. //发送消息下级审批人
  483. go messageToNodeUser(contractApprovalRecord.NextNodeId, contractInfo.SellerId, contractApproval.ContractApprovalId, 1, 1, contractInfo.CompanyName, content)
  484. }
  485. }
  486. return
  487. }
  488. //审批通过(抄送节点)
  489. func approvedByCc(approvedRemark string, sourceContractApprovalRecord *contract_approval_record.ContractApprovalRecord) (err error) {
  490. //下个流程节点id
  491. nextNodeId := 0
  492. //获取审批单中抄送节点的所有数据列表
  493. contractApprovalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractIdAndNode(sourceContractApprovalRecord.ContractApprovalId, sourceContractApprovalRecord.NextNodeId)
  494. if err != nil {
  495. return
  496. }
  497. //遍历所有的抄送单
  498. for _, contractApprovalRecord := range contractApprovalRecordList {
  499. nextNodeId = contractApprovalRecord.NextNodeId
  500. //审批流状态判断
  501. if contractApprovalRecord.Status != "待审批" {
  502. err = errors.New("审批流状态异常,不允许审批,当前审批流状态:" + contractApprovalRecord.Status)
  503. return
  504. }
  505. //判断是否审批类型,如果不是审批类型,那么就没有审批权限
  506. if contractApprovalRecord.NodeType != "cc" {
  507. err = errors.New("当前账号不是抄送权限")
  508. return
  509. }
  510. }
  511. //获取审批单详情
  512. contractApproval, err := contract_approval.GetContractApprovalById(sourceContractApprovalRecord.ContractApprovalId)
  513. if err != nil {
  514. return
  515. }
  516. //获取合同信息
  517. contractInfo, err := contract.GetContractById(contractApproval.ContractId)
  518. if err != nil {
  519. return
  520. }
  521. //if contractApprovalRecord
  522. err = contractApproval.ApprovedByCc(contractApproval, contractApprovalRecordList, approvedRemark, nextNodeId)
  523. if err != nil {
  524. return
  525. }
  526. //如果下一个节点属于结束节点,那么通知对应的销售,同时,异步生成合同pdf
  527. if nextNodeId == 0 {
  528. //待办通知
  529. {
  530. content := contractInfo.CompanyName + " 合同模板已审核"
  531. approvalSysUser, _ := admin.GetAdminById(contractInfo.SellerId)
  532. go services.AddCompanyApprovalMessage(sourceContractApprovalRecord.ApproveUserId, contractInfo.SellerId, 0, sourceContractApprovalRecord.ContractApprovalRecordId, 2, 2, 2, contractInfo.CompanyName, content, content, approvalSysUser.Mobile)
  533. }
  534. //审核通过后的异步操作(pdf生成、修改数据等)
  535. go AfterApproved(contractInfo.ContractId)
  536. } else {
  537. //获取下级节点信息
  538. flowNodeInfo, tmpErr := approval_flow_node.GetByNodeId(nextNodeId)
  539. if tmpErr != nil {
  540. err = tmpErr
  541. return
  542. }
  543. //如果下级节点是抄送类型,那么还是需要处理抄送节点逻辑
  544. if flowNodeInfo.NodeType == "cc" {
  545. go approvedByCc(approvedRemark, sourceContractApprovalRecord)
  546. } else {
  547. //如果下级级节点是审批类型
  548. //发送消息下级审批人
  549. go messageToNodeUser(nextNodeId, contractInfo.SellerId, contractApproval.ContractApprovalId, 1, 1, contractInfo.CompanyName, contractApproval.ApplyContent)
  550. }
  551. }
  552. return
  553. }
  554. //抄送信息给用户(根据节点来推送)
  555. func messageToNodeUser(flowNodeId, createUserId, contractApprovalId, messageType, approvalStatus int, companyName, content string) (err error) {
  556. //获取审批单中抄送节点的所有数据列表
  557. contractApprovalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractIdAndNode(contractApprovalId, flowNodeId)
  558. if err != nil {
  559. return
  560. }
  561. err = messageToUser(contractApprovalRecordList, createUserId, messageType, approvalStatus, companyName, content)
  562. return
  563. }
  564. //发送信息给所有抄送人
  565. // @param createUserId 消息发起人
  566. // @param contractApprovalId 审批单id
  567. // @param messageType 消息类型:1:申请消息,2:审批结果
  568. // @param approvalStatus 审批状态:1:待审批,2:已审批,3:已驳回"
  569. // @param companyName 企业客户名称
  570. // @param content 消息内容
  571. func messageToAllCcUser(createUserId, contractApprovalId, messageType, approvalStatus int, companyName, content string) (err error) {
  572. //获取审批单中抄送节点的所有数据列表
  573. contractApprovalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalId)
  574. if err != nil {
  575. return
  576. }
  577. err = messageToUser(contractApprovalRecordList, createUserId, messageType, approvalStatus, companyName, content)
  578. return
  579. }
  580. //抄送信息给用户(发送给所有抄送人)
  581. // @param createUserId 待审批、抄送记录
  582. // @param createUserId 消息发起人
  583. // @param contractApprovalId 审批单id
  584. // @param messageType 消息类型:1:申请消息,2:审批结果
  585. // @param approvalStatus 审批状态:1:待审批,2:已审批,3:已驳回"
  586. // @param companyName 企业客户名称
  587. // @param content 消息内容
  588. func messageToUser(contractApprovalRecordList []*contract_approval_record.ContractApprovalRecord, createUserId, messageType, approvalStatus int, companyName, content string) (err error) {
  589. for _, contractApprovalRecord := range contractApprovalRecordList {
  590. sysUserMobile := ""
  591. sysUser, _ := admin.GetAdminById(contractApprovalRecord.ApproveUserId)
  592. if sysUser != nil {
  593. sysUserMobile = sysUser.Mobile
  594. }
  595. //接收人,就是审批记录里面的待审核人(抄送人)
  596. receiveUserId := contractApprovalRecord.ApproveUserId
  597. go services.AddCompanyApprovalMessage(createUserId, receiveUserId, 0, contractApprovalRecord.ContractApprovalRecordId, messageType, 2, approvalStatus, companyName, content, content, sysUserMobile)
  598. }
  599. return
  600. }
  601. //审批完成后操作
  602. func AfterApproved(contractId int) (err error) {
  603. defer func() {
  604. if err != nil {
  605. //fmt.Println("异常提醒:"+utils.RunMode, "合同审批通过后,生成pdf失败,ERR:"+err.Error()+"", utils.EmailSendToUsers)
  606. go utils.SendEmail("异常提醒:"+utils.RunMode, "合同审批通过后,生成pdf失败,ERR:"+err.Error()+"", utils.EmailSendToUsers)
  607. }
  608. }()
  609. contractDetail, err := GetContractDetail(contractId)
  610. if err != nil {
  611. return
  612. }
  613. //fmt.Println("contractDetail:", contractDetail)
  614. //pdf生成并保存
  615. {
  616. //获取合同的html模板信息
  617. contractHtml, tmpErr := services.GetHtmlByContractDetail(contractDetail, "pdf")
  618. if tmpErr != nil {
  619. err = tmpErr
  620. return
  621. }
  622. //生成pdf
  623. pdfPath := fmt.Sprint("./static/word/系统生成合同_", contractId, ".pdf")
  624. tmpErr = services.Html2Pdf(contractHtml, pdfPath)
  625. if tmpErr != nil {
  626. err = tmpErr
  627. return
  628. }
  629. defer os.Remove(pdfPath)
  630. //randStr := utils.GetRandStringNoSpecialChar(28)
  631. fileName := contractDetail.ContractCode + ".pdf"
  632. //上传到阿里云
  633. resourceUrl, tmpErr := services.UploadAliyun(fileName, pdfPath)
  634. if tmpErr != nil {
  635. err = tmpErr
  636. return
  637. }
  638. tmpErr = contract.AddContractPdf(contractId, resourceUrl)
  639. if tmpErr != nil {
  640. err = tmpErr
  641. return
  642. }
  643. }
  644. //修改客户名称
  645. {
  646. //根据社会信用码获取客户信息
  647. companyInfo, tmpErr := company.GetCompanyByCreditCode(contractDetail.CreditCode)
  648. //如果查询异常,且并不是在系统中找不到该社会信用码,那么就异常返回
  649. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  650. err = tmpErr
  651. return
  652. }
  653. //如果客户信息不为空的情况下,那么去校验客户名称
  654. if companyInfo != nil {
  655. if companyInfo.CompanyName != contractDetail.CompanyName || companyInfo.Province != contractDetail.Province || companyInfo.City != contractDetail.City {
  656. companyInfo.CompanyName = contractDetail.CompanyName
  657. companyInfo.Province = contractDetail.Province
  658. companyInfo.City = contractDetail.City
  659. companyInfo.Address = contractDetail.Address
  660. tmpErr = company.ModifyCompany(companyInfo)
  661. if tmpErr != nil {
  662. err = tmpErr
  663. return
  664. }
  665. //新增客户日志
  666. {
  667. companyLog := new(company_log.CompanyLog)
  668. companyLog.CompanyId = companyInfo.CompanyId
  669. companyLog.CompanyName = companyInfo.CompanyName
  670. companyLog.CreditCode = companyInfo.CreditCode
  671. companyLog.Address = companyInfo.Address
  672. companyLog.City = companyInfo.City
  673. companyLog.Province = companyInfo.Province
  674. companyLog.LastUpdatedTime = companyInfo.LastUpdatedTime
  675. companyLog.AdminId = 0
  676. companyLog.LogType = "modify"
  677. companyLog.LogCreateTime = time.Now()
  678. go company_log.AddCompanyLog(companyLog)
  679. }
  680. }
  681. }
  682. }
  683. return
  684. }