contract_approval.go 33 KB

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