contract_approval.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  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 Reject(contractApprovalRecord *contract_approval_record.ContractApprovalRecord, opUser *custom.AdminWx, rejectRemark string) (err error) {
  247. if contractApprovalRecord == nil {
  248. err = errors.New("审批流异常,没有审批流信息")
  249. return
  250. }
  251. //审批流状态判断
  252. if contractApprovalRecord.Status != "待审批" {
  253. err = errors.New("审批流状态异常,不允许驳回申请,当前审批流状态:" + contractApprovalRecord.Status)
  254. return
  255. }
  256. //判断是否审批类型,如果不是审批类型,那么就没有审批权限
  257. if contractApprovalRecord.NodeType != "check" {
  258. err = errors.New("当前账号没有审批权限")
  259. return
  260. }
  261. //操作人
  262. opUserId := opUser.AdminId
  263. opUserName := opUser.RealName
  264. //操作权限校验
  265. if opUser.RoleTypeCode != contractApprovalRecord.ApproveRoleTypeCode {
  266. err = errors.New("当前账号没有审批权限")
  267. return
  268. }
  269. if contractApprovalRecord.ApproveUserId > 0 && contractApprovalRecord.ApproveUserId != opUserId {
  270. err = errors.New("当前账号没有审批权限,需要指定人操作")
  271. return
  272. }
  273. //获取审批单详情
  274. contractApproval, err := contract_approval.GetContractApprovalById(contractApprovalRecord.ContractApprovalId)
  275. if err != nil {
  276. return
  277. }
  278. //审批单状态判断
  279. if contractApproval.Status != "待审批" {
  280. err = errors.New("审批单状态异常,不允许驳回申请,当前审批单状态:" + contractApproval.Status)
  281. return
  282. }
  283. //获取合同信息
  284. contractInfo, err := contract.GetContractById(contractApproval.ContractId)
  285. if err != nil {
  286. return
  287. }
  288. //合同状态判断
  289. if contractInfo.Status != "待审批" {
  290. err = errors.New("合同状态异常,不允许驳回申请,当前合同状态:" + contractInfo.Status)
  291. return
  292. }
  293. err = contractApproval.Reject(contractApproval, contractApprovalRecord, opUserId, opUserName, rejectRemark)
  294. if err != nil {
  295. return
  296. }
  297. //添加操作日志
  298. remark := "驳回申请"
  299. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, opUserId, contractApprovalRecord.ContractApprovalRecordId, "reject", opUserName, remark)
  300. //待办通知
  301. {
  302. content := contractInfo.CompanyName + " 合同模板已驳回"
  303. approvalSysUser, _ := admin.GetAdminById(contractInfo.SellerId)
  304. go services.AddCompanyApprovalMessage(opUserId, contractInfo.SellerId, 0, contractApprovalRecord.ContractApprovalRecordId, 2, 2, 3, contractInfo.CompanyName, content, content, approvalSysUser.Mobile)
  305. //发送消息给所有的抄送人
  306. go messageToAllCcUser(opUserId, contractApprovalRecord.ContractApprovalId, 2, 3, contractInfo.CompanyName, content)
  307. }
  308. return
  309. }
  310. //审批通过
  311. func Approved(contractApprovalRecord *contract_approval_record.ContractApprovalRecord, opUser *custom.AdminWx, approvedRemark string) (err error) {
  312. if contractApprovalRecord == nil {
  313. err = errors.New("审批流异常,没有审批流信息")
  314. return
  315. }
  316. //审批流状态判断
  317. if contractApprovalRecord.Status != "待审批" {
  318. err = errors.New("审批流状态异常,不允许审批,当前审批流状态:" + contractApprovalRecord.Status)
  319. return
  320. }
  321. //判断是否审批类型,如果不是审批类型,那么就没有审批权限
  322. if contractApprovalRecord.NodeType != "check" {
  323. err = errors.New("当前账号没有审批权限")
  324. return
  325. }
  326. //操作人
  327. opUserId := opUser.AdminId
  328. opUserName := opUser.RealName
  329. //操作权限校验
  330. if opUser.RoleTypeCode != contractApprovalRecord.ApproveRoleTypeCode {
  331. err = errors.New("当前账号没有审批权限")
  332. return
  333. }
  334. if contractApprovalRecord.ApproveUserId > 0 && contractApprovalRecord.ApproveUserId != opUserId {
  335. err = errors.New("当前账号没有审批权限,需要指定人操作")
  336. return
  337. }
  338. //获取审批单详情
  339. contractApproval, err := contract_approval.GetContractApprovalById(contractApprovalRecord.ContractApprovalId)
  340. if err != nil {
  341. return
  342. }
  343. //审批单状态判断
  344. if contractApproval.Status != "待审批" {
  345. err = errors.New("审批单状态异常,不允许审批,当前审批单状态:" + contractApproval.Status)
  346. return
  347. }
  348. //获取合同信息
  349. contractInfo, err := contract.GetContractById(contractApproval.ContractId)
  350. if err != nil {
  351. return
  352. }
  353. //合同状态判断
  354. if contractInfo.Status != "待审批" {
  355. err = errors.New("合同状态异常,不允许审批,当前合同状态:" + contractInfo.Status)
  356. return
  357. }
  358. //if contractApprovalRecord
  359. err = contractApproval.Approved(contractApproval, contractApprovalRecord, approvedRemark)
  360. if err != nil {
  361. return
  362. }
  363. //添加操作日志
  364. remark := "审批通过"
  365. _ = contract_operation_record.AddContractOperationRecord(contractInfo.ContractId, opUserId, contractApprovalRecord.ContractApprovalRecordId, "approval", opUserName, remark)
  366. //发送信息给所有抄送人
  367. content := contractInfo.CompanyName + " 合同模板已审核"
  368. go messageToAllCcUser(opUserId, contractApprovalRecord.ContractApprovalId, 2, 2, contractInfo.CompanyName, content)
  369. //如果下一个节点属于结束节点,那么通知对应的销售,同时,异步生成合同pdf
  370. if contractApprovalRecord.NextNodeId == 0 {
  371. //待办通知(通知销售已经审核通过了)
  372. {
  373. content := contractInfo.CompanyName + " 合同模板已审核"
  374. approvalSysUser, _ := admin.GetAdminById(contractInfo.SellerId)
  375. go services.AddCompanyApprovalMessage(opUserId, contractInfo.SellerId, 0, contractApprovalRecord.ContractApprovalRecordId, 2, 2, 2, contractInfo.CompanyName, content, content, approvalSysUser.Mobile)
  376. }
  377. //审核通过后的异步操作(pdf生成、修改数据等)
  378. go AfterApproved(contractInfo.ContractId)
  379. } else {
  380. //获取下级节点信息
  381. flowNodeInfo, tmpErr := approval_flow_node.GetByNodeId(contractApprovalRecord.NextNodeId)
  382. if tmpErr != nil {
  383. err = tmpErr
  384. return
  385. }
  386. //如果该级节点是抄送类型,那么需要将该节点给处理掉
  387. if flowNodeInfo.NodeType == "cc" {
  388. go approvedByCc(approvedRemark, contractApprovalRecord)
  389. } else {
  390. //发送消息下级审批人
  391. go messageToNodeUser(contractApprovalRecord.NextNodeId, contractInfo.SellerId, contractApproval.ContractApprovalId, 1, 1, contractInfo.CompanyName, content)
  392. }
  393. }
  394. return
  395. }
  396. //审批通过(抄送节点)
  397. func approvedByCc(approvedRemark string, sourceContractApprovalRecord *contract_approval_record.ContractApprovalRecord) (err error) {
  398. //下个流程节点id
  399. nextNodeId := 0
  400. //获取审批单中抄送节点的所有数据列表
  401. contractApprovalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractIdAndNode(sourceContractApprovalRecord.ContractApprovalId, sourceContractApprovalRecord.NextNodeId)
  402. if err != nil {
  403. return
  404. }
  405. //遍历所有的抄送单
  406. for _, contractApprovalRecord := range contractApprovalRecordList {
  407. nextNodeId = contractApprovalRecord.NextNodeId
  408. //审批流状态判断
  409. if contractApprovalRecord.Status != "待审批" {
  410. err = errors.New("审批流状态异常,不允许审批,当前审批流状态:" + contractApprovalRecord.Status)
  411. return
  412. }
  413. //判断是否审批类型,如果不是审批类型,那么就没有审批权限
  414. if contractApprovalRecord.NodeType != "cc" {
  415. err = errors.New("当前账号不是抄送权限")
  416. return
  417. }
  418. }
  419. //获取审批单详情
  420. contractApproval, err := contract_approval.GetContractApprovalById(sourceContractApprovalRecord.ContractApprovalId)
  421. if err != nil {
  422. return
  423. }
  424. //获取合同信息
  425. contractInfo, err := contract.GetContractById(contractApproval.ContractId)
  426. if err != nil {
  427. return
  428. }
  429. //if contractApprovalRecord
  430. err = contractApproval.ApprovedByCc(contractApproval, contractApprovalRecordList, approvedRemark, nextNodeId)
  431. if err != nil {
  432. return
  433. }
  434. //如果下一个节点属于结束节点,那么通知对应的销售,同时,异步生成合同pdf
  435. if nextNodeId == 0 {
  436. //待办通知
  437. {
  438. content := contractInfo.CompanyName + " 合同模板已审核"
  439. approvalSysUser, _ := admin.GetAdminById(contractInfo.SellerId)
  440. go services.AddCompanyApprovalMessage(sourceContractApprovalRecord.ApproveUserId, contractInfo.SellerId, 0, sourceContractApprovalRecord.ContractApprovalRecordId, 2, 2, 2, contractInfo.CompanyName, content, content, approvalSysUser.Mobile)
  441. }
  442. //审核通过后的异步操作(pdf生成、修改数据等)
  443. go AfterApproved(contractInfo.ContractId)
  444. } else {
  445. //获取下级节点信息
  446. flowNodeInfo, tmpErr := approval_flow_node.GetByNodeId(nextNodeId)
  447. if tmpErr != nil {
  448. err = tmpErr
  449. return
  450. }
  451. //如果下级节点是抄送类型,那么还是需要处理抄送节点逻辑
  452. if flowNodeInfo.NodeType == "cc" {
  453. go approvedByCc(approvedRemark, sourceContractApprovalRecord)
  454. } else {
  455. //如果下级级节点是审批类型
  456. //发送消息下级审批人
  457. go messageToNodeUser(nextNodeId, contractInfo.SellerId, contractApproval.ContractApprovalId, 1, 1, contractInfo.CompanyName, contractApproval.ApplyContent)
  458. }
  459. }
  460. return
  461. }
  462. //抄送信息给用户(根据节点来推送)
  463. func messageToNodeUser(flowNodeId, createUserId, contractApprovalId, messageType, approvalStatus int, companyName, content string) (err error) {
  464. //获取审批单中抄送节点的所有数据列表
  465. contractApprovalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractIdAndNode(contractApprovalId, flowNodeId)
  466. if err != nil {
  467. return
  468. }
  469. err = messageToUser(contractApprovalRecordList, createUserId, messageType, approvalStatus, companyName, content)
  470. return
  471. }
  472. //发送信息给所有抄送人
  473. // @param createUserId 消息发起人
  474. // @param contractApprovalId 审批单id
  475. // @param messageType 消息类型:1:申请消息,2:审批结果
  476. // @param approvalStatus 审批状态:1:待审批,2:已审批,3:已驳回"
  477. // @param companyName 企业客户名称
  478. // @param content 消息内容
  479. func messageToAllCcUser(createUserId, contractApprovalId, messageType, approvalStatus int, companyName, content string) (err error) {
  480. //获取审批单中抄送节点的所有数据列表
  481. contractApprovalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalId)
  482. if err != nil {
  483. return
  484. }
  485. err = messageToUser(contractApprovalRecordList, createUserId, messageType, approvalStatus, companyName, content)
  486. return
  487. }
  488. //抄送信息给用户(发送给所有抄送人)
  489. // @param createUserId 待审批、抄送记录
  490. // @param createUserId 消息发起人
  491. // @param contractApprovalId 审批单id
  492. // @param messageType 消息类型:1:申请消息,2:审批结果
  493. // @param approvalStatus 审批状态:1:待审批,2:已审批,3:已驳回"
  494. // @param companyName 企业客户名称
  495. // @param content 消息内容
  496. func messageToUser(contractApprovalRecordList []*contract_approval_record.ContractApprovalRecord, createUserId, messageType, approvalStatus int, companyName, content string) (err error) {
  497. for _, contractApprovalRecord := range contractApprovalRecordList {
  498. sysUserMobile := ""
  499. sysUser, _ := admin.GetAdminById(contractApprovalRecord.ApproveUserId)
  500. if sysUser != nil {
  501. sysUserMobile = sysUser.Mobile
  502. }
  503. //接收人,就是审批记录里面的待审核人(抄送人)
  504. receiveUserId := contractApprovalRecord.ApproveUserId
  505. go services.AddCompanyApprovalMessage(createUserId, receiveUserId, 0, contractApprovalRecord.ContractApprovalRecordId, messageType, 2, approvalStatus, companyName, content, content, sysUserMobile)
  506. }
  507. return
  508. }
  509. //审批完成后操作
  510. func AfterApproved(contractId int) (err error) {
  511. defer func() {
  512. if err != nil {
  513. //fmt.Println("异常提醒:"+utils.RunMode, "合同审批通过后,生成pdf失败,ERR:"+err.Error()+"", utils.EmailSendToUsers)
  514. go utils.SendEmail("异常提醒:"+utils.RunMode, "合同审批通过后,生成pdf失败,ERR:"+err.Error()+"", utils.EmailSendToUsers)
  515. }
  516. }()
  517. contractDetail, err := GetContractDetail(contractId)
  518. if err != nil {
  519. return
  520. }
  521. //fmt.Println("contractDetail:", contractDetail)
  522. //pdf生成并保存
  523. {
  524. //获取合同的html模板信息
  525. contractHtml, tmpErr := services.GetHtmlByContractDetail(contractDetail, "pdf")
  526. if tmpErr != nil {
  527. err = tmpErr
  528. return
  529. }
  530. //生成pdf
  531. pdfPath := fmt.Sprint("./static/word/系统生成合同_", contractId, ".pdf")
  532. tmpErr = services.Html2Pdf(contractHtml, pdfPath)
  533. if tmpErr != nil {
  534. err = tmpErr
  535. return
  536. }
  537. defer os.Remove(pdfPath)
  538. //randStr := utils.GetRandStringNoSpecialChar(28)
  539. fileName := contractDetail.ContractCode + ".pdf"
  540. //上传到阿里云
  541. resourceUrl, tmpErr := services.UploadAliyun(fileName, pdfPath)
  542. if tmpErr != nil {
  543. err = tmpErr
  544. return
  545. }
  546. tmpErr = contract.AddContractPdf(contractId, resourceUrl)
  547. if tmpErr != nil {
  548. err = tmpErr
  549. return
  550. }
  551. }
  552. //修改客户名称
  553. {
  554. //根据社会信用码获取客户信息
  555. companyInfo, tmpErr := company.GetCompanyByCreditCode(contractDetail.CreditCode)
  556. //如果查询异常,且并不是在系统中找不到该社会信用码,那么就异常返回
  557. if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
  558. err = tmpErr
  559. return
  560. }
  561. //如果客户信息不为空的情况下,那么去校验客户名称
  562. if companyInfo != nil {
  563. if companyInfo.CompanyName != contractDetail.CompanyName || companyInfo.Province != contractDetail.Province || companyInfo.City != contractDetail.City {
  564. companyInfo.CompanyName = contractDetail.CompanyName
  565. companyInfo.Province = contractDetail.Province
  566. companyInfo.City = contractDetail.City
  567. companyInfo.Address = contractDetail.Address
  568. tmpErr = company.ModifyCompany(companyInfo)
  569. if tmpErr != nil {
  570. err = tmpErr
  571. return
  572. }
  573. //新增客户日志
  574. {
  575. companyLog := new(company_log.CompanyLog)
  576. companyLog.CompanyId = companyInfo.CompanyId
  577. companyLog.CompanyName = companyInfo.CompanyName
  578. companyLog.CreditCode = companyInfo.CreditCode
  579. companyLog.Address = companyInfo.Address
  580. companyLog.City = companyInfo.City
  581. companyLog.Province = companyInfo.Province
  582. companyLog.LastUpdatedTime = companyInfo.LastUpdatedTime
  583. companyLog.AdminId = 0
  584. companyLog.LogType = "modify"
  585. companyLog.LogCreateTime = time.Now()
  586. go company_log.AddCompanyLog(companyLog)
  587. }
  588. }
  589. }
  590. }
  591. return
  592. }