contract_approval.go 23 KB

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