seal_approval.go 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208
  1. package seal
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/rdlucklib/rdluck_tools/paging"
  7. "github.com/tealeg/xlsx"
  8. "hongze/hz_crm_api/controllers"
  9. "hongze/hz_crm_api/models"
  10. "hongze/hz_crm_api/models/company"
  11. "hongze/hz_crm_api/models/contract"
  12. sealModels "hongze/hz_crm_api/models/seal"
  13. "hongze/hz_crm_api/models/seal/request"
  14. "hongze/hz_crm_api/models/seal/response"
  15. "hongze/hz_crm_api/services"
  16. contractService "hongze/hz_crm_api/services/contract"
  17. "hongze/hz_crm_api/services/seal"
  18. "hongze/hz_crm_api/utils"
  19. "os"
  20. "path/filepath"
  21. "strconv"
  22. "strings"
  23. "time"
  24. )
  25. // 用印审批管理
  26. type SealApprovalController struct {
  27. controllers.BaseAuthController
  28. }
  29. // 用印审批列表-分页
  30. // @Title 用印审批列表
  31. // @Description 用印审批列表
  32. // @Param PageSize query int true "每页数据条数"
  33. // @Param CurrentIndex query int true "当前页页码,从1开始"
  34. // @Param ContractType query string false "合同类型 新签合同/续签合同/代付合同"
  35. // @Param Status query string false "用印状态 待审批/处理中/已审批/已驳回/已签回/已作废"
  36. // @Param SellerId query string false "所属销售ID,多个逗号拼接"
  37. // @Param StartTime query string false "提交开始时间"
  38. // @Param EndTime query string false "提交结束时间"
  39. // @Param Keyword query string false "搜索关键词(客户名称/社会信用码)"
  40. // @Param IsExport query bool false "是否导出excel,默认是false"
  41. // @Param AffiliatedCompany query string false "归属公司"
  42. // @Success 200 {object} response.SealApprovalListResp
  43. // @router /getApprovalPageList [get]
  44. func (this *SealApprovalController) List() {
  45. br := new(models.BaseResponse).Init()
  46. defer func() {
  47. this.Data["json"] = br
  48. this.ServeJSON()
  49. }()
  50. sysUser := this.SysUser
  51. if sysUser == nil {
  52. br.Msg = "请登录"
  53. br.ErrMsg = "请登录,SysUser is Empty"
  54. br.Ret = 408
  55. return
  56. }
  57. // 分页
  58. pageSize, _ := this.GetInt("PageSize")
  59. currentIndex, _ := this.GetInt("CurrentIndex")
  60. var startSize int
  61. if pageSize <= 0 {
  62. pageSize = utils.PageSize20
  63. }
  64. if currentIndex <= 0 {
  65. currentIndex = 1
  66. }
  67. startSize = paging.StartIndex(currentIndex, pageSize)
  68. isExport, _ := this.GetBool("IsExport", false)
  69. // 筛选条件
  70. condition := ""
  71. joinCondition := " AND a.curr_node_id = d.node_id" // contract_approval和contract_approval_record的join条件
  72. pars := make([]interface{}, 0)
  73. // 数据权限
  74. reqStatus := this.GetString("Status")
  75. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_ADMIN {
  76. // 超管
  77. condition += ` AND c.status != "已撤回" `
  78. if reqStatus != "" {
  79. if reqStatus == "待审批" {
  80. // 当前审批节点小于等于审批节点且状态为-待审批
  81. condition += ` AND (a.curr_node_id <= a.start_node_id AND c.status = "待审批") `
  82. joinCondition = ``
  83. } else if reqStatus == "处理中" {
  84. // 当前审批节点大于开始审批节点且状态为-待审批
  85. condition += ` AND (a.curr_node_id > a.start_node_id AND c.status = "待审批")`
  86. } else {
  87. condition += ` AND c.status = ?`
  88. pars = append(pars, reqStatus)
  89. }
  90. }
  91. } else if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE {
  92. // 合规
  93. if reqStatus != "" {
  94. if reqStatus == "待审批" {
  95. condition += ` AND (d.approve_user_id = ? AND a.curr_node_id <= d.node_id AND d.node_type != "cc") AND c.status="待审批"`
  96. joinCondition = ``
  97. pars = append(pars, sysUser.AdminId)
  98. } else if reqStatus == "处理中" {
  99. condition += ` AND (d.approve_user_id = ? AND a.curr_node_id > d.node_id AND d.node_type != "cc") AND c.status="待审批"`
  100. joinCondition = " AND a.curr_node_id != d.node_id"
  101. pars = append(pars, sysUser.AdminId)
  102. } else if reqStatus == "已撤回" {
  103. condition += ` AND c.status = ? AND c.user_id = ?`
  104. pars = append(pars, reqStatus, sysUser.AdminId)
  105. } else {
  106. condition += ` AND c.status = ?`
  107. pars = append(pars, reqStatus)
  108. }
  109. } else {
  110. condition += ` AND (c.status = "已撤回" AND c.user_id = ? ) OR (c.status != "已撤回") AND (c.status != "待提交")`
  111. pars = append(pars, sysUser.AdminId)
  112. }
  113. } else {
  114. // 销售
  115. condition += ` AND (c.user_id = ? OR (d.approve_user_id = ? AND d.node_id <= a.curr_node_id) OR (d.approve_user_id = ? AND d.node_type = "cc") )`
  116. pars = append(pars, sysUser.AdminId, sysUser.AdminId, sysUser.AdminId)
  117. if reqStatus != "" {
  118. switch reqStatus {
  119. case "待审批":
  120. condition += ` AND c.status = "待审批" AND ( (((c.user_id = ? and a.start_node_id = a.curr_node_id) OR (d.approve_user_id = ? AND a.curr_node_id=d.node_id)) ) OR (d.approve_user_id = ? AND a.curr_node_id > d.node_id AND d.node_type="cc") )`
  121. joinCondition = ``
  122. pars = append(pars, sysUser.AdminId, sysUser.AdminId, sysUser.AdminId)
  123. case "处理中":
  124. condition += ` AND ((c.user_id = ? AND a.start_node_id != a.curr_node_id) OR (d.approve_user_id = ? AND a.curr_node_id > d.node_id AND d.node_type != "cc")) AND c.status="待审批" `
  125. joinCondition = " AND a.curr_node_id != d.node_id"
  126. pars = append(pars, sysUser.AdminId, sysUser.AdminId)
  127. case "已撤回":
  128. condition += ` AND (c.status = "已撤回" AND c.user_id = ? ) `
  129. pars = append(pars, sysUser.AdminId)
  130. case "已审批", "已驳回", "已签回", "已作废":
  131. joinCondition = ``
  132. condition += ` AND c.status = ?`
  133. pars = append(pars, reqStatus)
  134. }
  135. } else {
  136. joinCondition = ``
  137. condition += ` AND ((c.status = "已撤回" AND c.user_id = ? ) OR (c.status != "已撤回")) `
  138. pars = append(pars, sysUser.AdminId)
  139. }
  140. }
  141. // 合同类型
  142. reqContractType := this.GetString("ContractType")
  143. if reqContractType != "" {
  144. condition += ` AND c.service_type = ? `
  145. pars = append(pars, reqContractType)
  146. }
  147. // 所属销售-多个
  148. reqSellerId := this.GetString("SellerId")
  149. if reqSellerId != "" {
  150. condition += ` AND c.user_id IN (` + reqSellerId + `)`
  151. }
  152. // 提交时间
  153. reqStartTime := this.GetString("StartTime")
  154. reqEndTime := this.GetString("EndTime")
  155. if reqStartTime != "" && reqEndTime != "" {
  156. reqStartTime += " 00:00:00"
  157. reqEndTime += " 23:59:59"
  158. condition += ` AND c.create_time >= ? AND c.create_time <= ?`
  159. pars = append(pars, reqStartTime, reqEndTime)
  160. }
  161. // 客户名称-社会信用码
  162. reqKeyword := this.GetString("Keyword")
  163. if reqKeyword != "" {
  164. keywords := "%" + reqKeyword + "%"
  165. condition += ` AND (c.company_name LIKE ? OR c.use_company_name LIKE ? OR c.credit_code LIKE ?)`
  166. pars = append(pars, keywords, keywords, keywords)
  167. }
  168. // 归属公司
  169. affiliatedCompany := this.GetString("AffiliatedCompany")
  170. if affiliatedCompany != "" {
  171. condition += ` AND c.affiliated_company = ?`
  172. pars = append(pars, affiliatedCompany)
  173. }
  174. //导出excel
  175. if isExport {
  176. ApprovalListExport(this, condition, joinCondition, pars, br)
  177. return
  178. }
  179. // 列表
  180. listData, listTotal, err := seal.GetSealApprovalPageList(condition, joinCondition, pars, startSize, pageSize, sysUser)
  181. if err != nil {
  182. br.Msg = "审批列表获取失败!"
  183. br.ErrMsg = "审批列表获取失败!" + err.Error()
  184. return
  185. }
  186. page := paging.GetPaging(currentIndex, pageSize, listTotal)
  187. br.Ret = 200
  188. br.Success = true
  189. br.Msg = "获取成功"
  190. br.Data = response.SealApprovalListResp{
  191. Paging: page,
  192. List: listData,
  193. }
  194. }
  195. // ApprovalListExport 审批列表导出
  196. func ApprovalListExport(this *SealApprovalController, condition, joinCondition string, pars []interface{}, br *models.BaseResponse) {
  197. list, err := sealModels.GetSealApprovalList(condition, joinCondition, pars)
  198. if err != nil {
  199. br.Msg = "审批列表获取失败!"
  200. br.ErrMsg = "审批列表获取失败!" + err.Error()
  201. return
  202. }
  203. ////超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
  204. //resp := new(cygx.CanDownload)
  205. //adminInfo, errAdmin := system.GetSysUserById(sysUser.AdminId)
  206. //if errAdmin != nil {
  207. // br.Msg = "获取失败"
  208. // br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
  209. // return
  210. //}
  211. //if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
  212. // resp.IsCanDownload = true
  213. //}
  214. if len(list) > 0 {
  215. // 取出所有列表的关联合同id
  216. contractIdSlice := make([]string, 0)
  217. contractApprovalIdSlice := make([]string, 0)
  218. for i := 0; i < len(list); i++ {
  219. contractIdSlice = append(contractIdSlice, strconv.Itoa(list[i].ContractId))
  220. contractApprovalIdSlice = append(contractApprovalIdSlice, strconv.Itoa(list[i].ContractApprovalId))
  221. }
  222. // 获取所有关联的合同列表
  223. selfContractMap := make(map[int]*contract.ContractList)
  224. {
  225. if len(contractIdSlice) > 0 {
  226. contractIdStr := strings.Join(contractIdSlice, ",")
  227. contractList, tempErr := contract.GetContractListByContractIds(contractIdStr)
  228. if tempErr != nil {
  229. err = errors.New(fmt.Sprint("获取合同失败,Err:"+tempErr.Error(), err))
  230. return
  231. }
  232. for i := 0; i < len(contractList); i++ {
  233. selfContractMap[contractList[i].ContractId] = contractList[i]
  234. }
  235. }
  236. }
  237. selfContractApprovalRecordMap := make(map[int][]*contract.ContractApprovalRecord)
  238. {
  239. if len(contractApprovalIdSlice) > 0 {
  240. contractApprovalIdStr := strings.Join(contractApprovalIdSlice, ",")
  241. contractApprovalList, tempErr := contract.GetContractApprovalRecordListByContractApprovalIds(contractApprovalIdStr)
  242. if tempErr != nil {
  243. err = errors.New(fmt.Sprint("获取合同审批记录失败,Err:"+tempErr.Error(), err))
  244. return
  245. }
  246. for i := 0; i < len(contractApprovalList); i++ {
  247. selfContractApprovalRecordMap[contractApprovalList[i].ContractApprovalId] = append(selfContractApprovalRecordMap[contractApprovalList[i].ContractApprovalId], contractApprovalList[i])
  248. }
  249. }
  250. }
  251. for i, v := range list {
  252. // 合同编码
  253. if selfContract, has := selfContractMap[v.ContractId]; has {
  254. list[i].ContractCode = selfContract.ContractCode
  255. }
  256. // 审批人和抄送人
  257. if recordList, ok := selfContractApprovalRecordMap[v.ContractApprovalId]; ok {
  258. keySort := make([]int, 0)
  259. flowNodeMap := make(map[int][]contract.ContractApprovalRecord, 0)
  260. for _, approvalRecord := range recordList {
  261. if tmpFlowNodeList, ok := flowNodeMap[approvalRecord.NodeId]; ok {
  262. flowNodeMap[approvalRecord.NodeId] = append(tmpFlowNodeList, *approvalRecord)
  263. } else {
  264. tmpFlowNodeList := make([]contract.ContractApprovalRecord, 1)
  265. tmpFlowNodeList[0] = *approvalRecord
  266. flowNodeMap[approvalRecord.NodeId] = tmpFlowNodeList
  267. keySort = append(keySort, approvalRecord.NodeId)
  268. }
  269. }
  270. approversList := make([][]string, 0)
  271. ccList := make([][]string, 0)
  272. for _, key := range keySort {
  273. approver := make([]string, 0)
  274. cc := make([]string, 0)
  275. if node, ok := flowNodeMap[key]; ok {
  276. for _, vv := range node {
  277. if vv.NodeType == "check" {
  278. approver = append(approver, vv.ApproveUserName)
  279. } else if vv.NodeType == "cc" {
  280. cc = append(cc, vv.ApproveUserName)
  281. }
  282. }
  283. if len(approver) > 0 {
  284. approversList = append(approversList, approver)
  285. }
  286. if len(cc) > 0 {
  287. ccList = append(ccList, cc)
  288. }
  289. }
  290. }
  291. if len(approversList) > 0 {
  292. list[i].FirstLevelApprovers = strings.Join(approversList[0], ",")
  293. }
  294. if len(ccList) > 0 {
  295. list[i].FirstLevelCC = strings.Join(ccList[0], ",")
  296. }
  297. if len(approversList) > 1 {
  298. list[i].SecondLevelApprovers = strings.Join(approversList[1], ",")
  299. }
  300. if len(ccList) > 1 {
  301. list[i].SecondLevelCC = strings.Join(ccList[1], ",")
  302. }
  303. if len(approversList) > 2 {
  304. list[i].ThirdLevelApprovers = strings.Join(approversList[2], ",")
  305. }
  306. if len(ccList) > 2 {
  307. list[i].ThirdLevelCC = strings.Join(ccList[2], ",")
  308. }
  309. }
  310. }
  311. }
  312. //创建excel
  313. dir, err := os.Executable()
  314. exPath := filepath.Dir(dir)
  315. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  316. xlsxFile := xlsx.NewFile()
  317. if err != nil {
  318. br.Msg = "生成文件失败"
  319. br.ErrMsg = "生成文件失败"
  320. return
  321. }
  322. style := xlsx.NewStyle()
  323. alignment := xlsx.Alignment{
  324. Horizontal: "center",
  325. Vertical: "center",
  326. WrapText: true,
  327. }
  328. style.Alignment = alignment
  329. style.ApplyAlignment = true
  330. sheetName := "审批列表"
  331. sheet, err := xlsxFile.AddSheet(sheetName)
  332. if err != nil {
  333. br.Msg = "新增Sheet失败"
  334. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  335. return
  336. }
  337. //标头
  338. rowTitle := sheet.AddRow()
  339. cellA := rowTitle.AddCell()
  340. cellA.Value = "归属公司"
  341. cellB := rowTitle.AddCell()
  342. cellB.Value = "客户名称"
  343. cellC := rowTitle.AddCell()
  344. cellC.Value = "社会信用码"
  345. cellD := rowTitle.AddCell()
  346. cellD.Value = "用印用途"
  347. cellE := rowTitle.AddCell()
  348. cellE.Value = "合同编号"
  349. cellF := rowTitle.AddCell()
  350. cellF.Value = "合同类型"
  351. cellG := rowTitle.AddCell()
  352. cellG.Value = "加盖印章"
  353. cellH := rowTitle.AddCell()
  354. cellH.Value = "所属销售"
  355. cellI := rowTitle.AddCell()
  356. cellI.Value = "提交时间"
  357. cellJ := rowTitle.AddCell()
  358. cellJ.Value = "用印状态"
  359. cellK := rowTitle.AddCell()
  360. cellK.Value = "一级审批人"
  361. cellL := rowTitle.AddCell()
  362. cellL.Value = "一级抄送人"
  363. cellM := rowTitle.AddCell()
  364. cellM.Value = "二级审批人"
  365. cellN := rowTitle.AddCell()
  366. cellN.Value = "二级抄送人"
  367. cellO := rowTitle.AddCell()
  368. cellO.Value = "三级审批人"
  369. cellP := rowTitle.AddCell()
  370. cellP.Value = "三级抄送人"
  371. for _, v := range list {
  372. row := sheet.AddRow()
  373. cellA := row.AddCell()
  374. cellA.Value = v.AffiliatedCompany
  375. cellB := row.AddCell()
  376. cellB.Value = v.CompanyName
  377. cellC := row.AddCell()
  378. cellC.Value = v.CreditCode
  379. cellD := row.AddCell()
  380. cellD.Value = v.Use
  381. cellE := row.AddCell()
  382. cellE.Value = v.ContractCode
  383. cellF := row.AddCell()
  384. cellF.Value = v.ContractType
  385. cellG := row.AddCell()
  386. cellG.Value = v.SealType
  387. cellH := row.AddCell()
  388. cellH.Value = v.ApplyUserName
  389. cellI := row.AddCell()
  390. cellI.Value = v.CreateTime.Format(utils.FormatDateTime)
  391. cellJ := row.AddCell()
  392. cellJ.Value = v.Status
  393. cellK := row.AddCell()
  394. cellK.Value = v.FirstLevelApprovers
  395. cellL := row.AddCell()
  396. cellL.Value = v.FirstLevelCC
  397. cellM := row.AddCell()
  398. cellM.Value = v.SecondLevelApprovers
  399. cellN := row.AddCell()
  400. cellN.Value = v.SecondLevelCC
  401. cellO := row.AddCell()
  402. cellO.Value = v.ThirdLevelApprovers
  403. cellP := row.AddCell()
  404. cellP.Value = v.ThirdLevelCC
  405. }
  406. err = xlsxFile.Save(downLoadnFilePath)
  407. if err != nil {
  408. br.Msg = "保存文件失败"
  409. br.ErrMsg = "保存文件失败"
  410. return
  411. }
  412. downloadFileName := "用印审批列表" + time.Now().Format("2006.01.02") + ".xlsx"
  413. this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
  414. defer func() {
  415. os.Remove(downLoadnFilePath)
  416. }()
  417. br.Success = true
  418. br.Ret = 200
  419. br.IsAddLog = true
  420. }
  421. // 用印申请
  422. // @Title 用印申请
  423. // @Description 用印申请
  424. // @Param request body request.SealApprovalApplyReq true "type json string"
  425. // @Success 200 申请成功
  426. // @router /applySealApproval [post]
  427. func (this *SealApprovalController) Apply() {
  428. br := new(models.BaseResponse).Init()
  429. defer func() {
  430. this.Data["json"] = br
  431. this.ServeJSON()
  432. }()
  433. sysUser := this.SysUser
  434. if sysUser == nil {
  435. br.Msg = "请登录"
  436. br.ErrMsg = "请登录,SysUser is Empty"
  437. br.Ret = 408
  438. return
  439. }
  440. var req request.SealApprovalApplyReq
  441. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  442. if err != nil {
  443. br.Msg = "参数解析异常!"
  444. br.ErrMsg = "参数解析异常!Err:" + err.Error()
  445. return
  446. }
  447. creditCode := req.CreditCode
  448. startDate := req.StartDate
  449. reqVerify := utils.Rules{
  450. "Use": {utils.NotEmpty()},
  451. "CompanyName": {utils.NotEmpty()},
  452. "CreditCode": {utils.NotEmpty()},
  453. //"ServiceType": {utils.NotEmpty()} /、/权益非标合同不校验合同类型
  454. "SealType": {utils.NotEmpty()},
  455. "FileUrls": {utils.NotEmpty()},
  456. "AffiliatedCompany": {utils.NotEmpty()},
  457. }
  458. //目前只有权益的用印申请会有开始时间,先作为权益的标识判断 CRM_16.8
  459. if startDate != "" {
  460. companyInfo, tmpErr := company.GetCompanyByCreditCode(creditCode)
  461. //如果查询异常,且并不是在系统中找不到该社会信用码,那么就异常返回
  462. if tmpErr != nil {
  463. br.Msg = "根据社会信用码获取客户信息失败!"
  464. br.ErrMsg = "根据社会信用码获取客户信息失败!Err:" + err.Error()
  465. return
  466. }
  467. req.CompanyId = companyInfo.CompanyId
  468. totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(req.CompanyId, req.StartDate)
  469. if err != nil {
  470. br.Msg = "获取合同信息失败"
  471. br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
  472. return
  473. }
  474. if totalLastYear > 0 {
  475. req.ServiceType = "新签合同"
  476. } else {
  477. req.ServiceType = "续约合同"
  478. }
  479. reqVerify["Money"] = []string{utils.NotEmpty()}
  480. } else {
  481. reqVerify["ServiceType"] = []string{utils.NotEmpty()}
  482. }
  483. err = utils.Verify(req, reqVerify, utils.LANG_CN)
  484. if err != nil {
  485. br.Msg = "参数丢失!"
  486. br.ErrMsg = "参数丢失!Err:" + err.Error()
  487. return
  488. }
  489. // 申请用印
  490. err = seal.ApplySeal(this.SysUser, req)
  491. if err != nil {
  492. br.Msg = "申请用印失败!"
  493. br.ErrMsg = "申请用印失败!Err:" + err.Error()
  494. return
  495. }
  496. br.Ret = 200
  497. br.Success = true
  498. br.Msg = "申请用印成功"
  499. }
  500. // 编辑用印申请
  501. // @Title 编辑用印申请
  502. // @Description 编辑用印申请
  503. // @Param request body request.SealApprovalEditReq true "type json string"
  504. // @Success 200 操作成功
  505. // @router /editSealApproval [post]
  506. func (this *SealApprovalController) Edit() {
  507. br := new(models.BaseResponse).Init()
  508. defer func() {
  509. this.Data["json"] = br
  510. this.ServeJSON()
  511. }()
  512. sysUser := this.SysUser
  513. if sysUser == nil {
  514. br.Msg = "请登录"
  515. br.ErrMsg = "请登录,SysUser is Empty"
  516. br.Ret = 408
  517. return
  518. }
  519. var req request.SealApprovalEditReq
  520. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  521. if err != nil {
  522. br.Msg = "参数解析异常!"
  523. br.ErrMsg = "参数解析异常!Err:" + err.Error()
  524. return
  525. }
  526. if req.SealId <= 0 {
  527. br.Msg = "用印审批ID有误"
  528. br.ErrMsg = "用印审批ID有误"
  529. return
  530. }
  531. if req.Use == "" {
  532. br.Msg = "用印用途不能为空"
  533. br.ErrMsg = "用印用途不能为空"
  534. return
  535. }
  536. if req.CompanyName == "" {
  537. br.Msg = "客户名称不能为空"
  538. br.ErrMsg = "客户名称不能为空"
  539. return
  540. }
  541. if req.CreditCode == "" {
  542. br.Msg = "社会统一信用代码不能为空"
  543. br.ErrMsg = "社会统一信用代码不能为空"
  544. return
  545. }
  546. if req.ServiceType == "" {
  547. br.Msg = "合同类型不能为空"
  548. br.ErrMsg = "合同类型不能为空"
  549. return
  550. }
  551. if req.SealType == "" {
  552. br.Msg = "印章类型不能为空"
  553. br.ErrMsg = "印章类型不能为空"
  554. return
  555. }
  556. if len(req.FileUrls) == 0 {
  557. br.Msg = "合同附件不能为空"
  558. br.ErrMsg = "合同附件不能为空"
  559. return
  560. }
  561. if req.AffiliatedCompany == "" {
  562. br.Msg = "归属公司不能为空"
  563. br.ErrMsg = "归属公司不能为空"
  564. return
  565. }
  566. startDate := req.StartDate
  567. creditCode := req.CreditCode
  568. if startDate != "" {
  569. companyInfo, tmpErr := company.GetCompanyByCreditCode(creditCode)
  570. //如果查询异常,且并不是在系统中找不到该社会信用码,那么就异常返回
  571. if tmpErr != nil {
  572. br.Msg = "根据社会信用码获取客户信息失败!"
  573. br.ErrMsg = "根据社会信用码获取客户信息失败!Err:" + err.Error()
  574. return
  575. }
  576. companyId := companyInfo.CompanyId
  577. totalLastYear, err := contractService.GetCompanyContractCountRaiByLastYear(companyId, req.StartDate)
  578. if err != nil {
  579. br.Msg = "获取合同信息失败"
  580. br.ErrMsg = "获取合同信息失败,Err:" + err.Error()
  581. return
  582. }
  583. if totalLastYear > 0 {
  584. req.ServiceType = "新签合同"
  585. } else {
  586. req.ServiceType = "续约合同"
  587. }
  588. }
  589. // 编辑用印
  590. err = seal.EditApply(this.SysUser, req)
  591. if err != nil {
  592. br.Msg = "编辑用印申请失败!"
  593. br.ErrMsg = "编辑用印申请失败!Err:" + err.Error()
  594. return
  595. }
  596. br.Ret = 200
  597. br.Success = true
  598. br.Msg = "编辑用印申请成功"
  599. }
  600. // 审批角色编辑
  601. // @Title 审批角色编辑
  602. // @Description 审批角色编辑
  603. // @Param request body request.SealApprovalEditReq true "type json string"
  604. // @Success 200 操作成功
  605. // @router /verifierEditSealApproval [post]
  606. func (this *SealApprovalController) VerifierEdit() {
  607. br := new(models.BaseResponse).Init()
  608. defer func() {
  609. this.Data["json"] = br
  610. this.ServeJSON()
  611. }()
  612. sysUser := this.SysUser
  613. if sysUser == nil {
  614. br.Msg = "请登录"
  615. br.ErrMsg = "请登录,SysUser is Empty"
  616. br.Ret = 408
  617. return
  618. }
  619. var req request.SealApprovalEditReq
  620. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  621. if err != nil {
  622. br.Msg = "参数解析异常!"
  623. br.ErrMsg = "参数解析异常!Err:" + err.Error()
  624. return
  625. }
  626. if req.SealId <= 0 {
  627. br.Msg = "用印审批ID有误"
  628. br.ErrMsg = "用印审批ID有误"
  629. return
  630. }
  631. if req.Use == "" {
  632. br.Msg = "用印用途不能为空"
  633. br.ErrMsg = "用印用途不能为空"
  634. return
  635. }
  636. if req.CompanyName == "" {
  637. br.Msg = "客户名称不能为空"
  638. br.ErrMsg = "客户名称不能为空"
  639. return
  640. }
  641. if req.CreditCode == "" {
  642. br.Msg = "社会统一信用代码不能为空"
  643. br.ErrMsg = "社会统一信用代码不能为空"
  644. return
  645. }
  646. if req.ServiceType == "" {
  647. br.Msg = "合同类型不能为空"
  648. br.ErrMsg = "合同类型不能为空"
  649. return
  650. }
  651. if req.SealType == "" {
  652. br.Msg = "印章类型不能为空"
  653. br.ErrMsg = "印章类型不能为空"
  654. return
  655. }
  656. if len(req.FileUrls) == 0 {
  657. br.Msg = "合同附件不能为空"
  658. br.ErrMsg = "合同附件不能为空"
  659. return
  660. }
  661. if req.AffiliatedCompany == "" {
  662. br.Msg = "归属公司不能为空"
  663. br.ErrMsg = "归属公司不能为空"
  664. return
  665. }
  666. // 审批者编辑
  667. err = seal.VerifierEditApply(this.SysUser, req)
  668. if err != nil {
  669. br.Msg = "编辑用印申请失败!"
  670. br.ErrMsg = "编辑用印申请失败!Err:" + err.Error()
  671. return
  672. }
  673. br.Ret = 200
  674. br.Success = true
  675. br.Msg = "编辑用印申请成功"
  676. }
  677. // 用印审批详情
  678. // @Title 用印审批详情
  679. // @Description 用印审批详情
  680. // @Param SealId query int false "用印审批ID"
  681. // @Success 200 {object} response.SealApprovalDetail
  682. // @router /getSealApprovalDetail [get]
  683. func (this *SealApprovalController) Detail() {
  684. br := new(models.BaseResponse).Init()
  685. defer func() {
  686. this.Data["json"] = br
  687. this.ServeJSON()
  688. }()
  689. sysUser := this.SysUser
  690. if sysUser == nil {
  691. br.Msg = "请登录"
  692. br.ErrMsg = "请登录,SysUser is Empty"
  693. br.Ret = 408
  694. return
  695. }
  696. sealId, _ := this.GetInt("SealId")
  697. sealInfo, flowNodeListResp, opButton, err := seal.GetSealApprovalDetail(sealId, sysUser)
  698. if err != nil {
  699. br.Msg = "获取用印详情失败"
  700. br.ErrMsg = "获取用印详情失败,Err:" + err.Error()
  701. return
  702. }
  703. br.Ret = 200
  704. br.Success = true
  705. br.Msg = "获取成功"
  706. br.Data = response.SealApprovalDetail{
  707. SealDetail: sealInfo,
  708. FlowNodeList: flowNodeListResp,
  709. OpButton: opButton,
  710. }
  711. }
  712. // 撤回用印申请
  713. // @Title 撤回用印申请
  714. // @Description 撤回用印申请
  715. // @Param request body request.SealApprovalCancelReq true "type json string"
  716. // @Success 200 操作成功
  717. // @router /cancelSealApproval [post]
  718. func (this *SealApprovalController) Cancel() {
  719. br := new(models.BaseResponse).Init()
  720. defer func() {
  721. this.Data["json"] = br
  722. this.ServeJSON()
  723. }()
  724. sysUser := this.SysUser
  725. if sysUser == nil {
  726. br.Msg = "请登录"
  727. br.ErrMsg = "请登录,SysUser is Empty"
  728. br.Ret = 408
  729. return
  730. }
  731. var req request.SealApprovalCancelReq
  732. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  733. if err != nil {
  734. br.Msg = "参数解析异常!"
  735. br.ErrMsg = "参数解析异常!Err:" + err.Error()
  736. return
  737. }
  738. if req.SealId <= 0 {
  739. br.Msg = "参数异常!"
  740. br.ErrMsg = "参数异常!"
  741. return
  742. }
  743. err = seal.CancelSealApproval(req.SealId, sysUser)
  744. if err != nil {
  745. br.Msg = "用印审批撤回失败"
  746. br.ErrMsg = "用印审批撤回失败,Err:" + err.Error()
  747. return
  748. }
  749. br.Ret = 200
  750. br.Success = true
  751. br.Msg = "操作成功"
  752. }
  753. // 删除用印申请
  754. // @Title 删除用印申请
  755. // @Description 删除用印申请
  756. // @Param request body request.SealApprovalDelReq true "type json string"
  757. // @Success 200 操作成功
  758. // @router /delSealApproval [post]
  759. func (this *SealApprovalController) Del() {
  760. br := new(models.BaseResponse).Init()
  761. defer func() {
  762. this.Data["json"] = br
  763. this.ServeJSON()
  764. }()
  765. sysUser := this.SysUser
  766. if sysUser == nil {
  767. br.Msg = "请登录"
  768. br.ErrMsg = "请登录,SysUser is Empty"
  769. br.Ret = 408
  770. return
  771. }
  772. var req request.SealApprovalDelReq
  773. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  774. if err != nil {
  775. br.Msg = "参数解析异常!"
  776. br.ErrMsg = "参数解析异常!Err:" + err.Error()
  777. return
  778. }
  779. if req.SealId <= 0 {
  780. br.Msg = "参数异常!"
  781. br.ErrMsg = "参数异常!"
  782. return
  783. }
  784. err = seal.DelSealApproval(req.SealId, sysUser)
  785. if err != nil {
  786. br.Msg = "用印申请删除失败"
  787. br.ErrMsg = "用印申请删除失败,Err:" + err.Error()
  788. return
  789. }
  790. br.Ret = 200
  791. br.Success = true
  792. br.Msg = "操作成功"
  793. }
  794. // 通过用印申请
  795. // @Title 通过用印申请
  796. // @Description 通过用印申请
  797. // @Param request body request.SealApplyApprovedReq true "type json string"
  798. // @Success 200 操作成功
  799. // @router /approvedSealApproval [post]
  800. func (this *SealApprovalController) Approved() {
  801. br := new(models.BaseResponse).Init()
  802. defer func() {
  803. this.Data["json"] = br
  804. this.ServeJSON()
  805. }()
  806. sysUser := this.SysUser
  807. if sysUser == nil {
  808. br.Msg = "请登录"
  809. br.ErrMsg = "请登录,SysUser is Empty"
  810. br.Ret = 408
  811. return
  812. }
  813. var req request.SealApplyApprovedReq
  814. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  815. if err != nil {
  816. br.Msg = "参数解析异常!"
  817. br.ErrMsg = "参数解析异常!Err:" + err.Error()
  818. return
  819. }
  820. if req.SealId <= 0 {
  821. br.Msg = "参数异常!"
  822. br.ErrMsg = "参数异常!"
  823. return
  824. }
  825. err = seal.ApprovedApproval(req.SealId, sysUser, req.Remark)
  826. if err != nil {
  827. br.Msg = "用印审批失败"
  828. br.ErrMsg = "用印审批失败,Err:" + err.Error()
  829. return
  830. }
  831. br.Ret = 200
  832. br.Success = true
  833. br.Msg = "操作成功"
  834. }
  835. // 驳回用印申请
  836. // @Title 驳回用印申请
  837. // @Description 驳回用印申请
  838. // @Param request body request.SealApplyRejectReq true "type json string"
  839. // @Success 200 操作成功
  840. // @router /rejectSealApproval [post]
  841. func (this *SealApprovalController) Reject() {
  842. br := new(models.BaseResponse).Init()
  843. defer func() {
  844. this.Data["json"] = br
  845. this.ServeJSON()
  846. }()
  847. sysUser := this.SysUser
  848. if sysUser == nil {
  849. br.Msg = "请登录"
  850. br.ErrMsg = "请登录,SysUser is Empty"
  851. br.Ret = 408
  852. return
  853. }
  854. var req request.SealApplyRejectReq
  855. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  856. if err != nil {
  857. br.Msg = "参数解析异常!"
  858. br.ErrMsg = "参数解析异常!Err:" + err.Error()
  859. return
  860. }
  861. if req.SealId <= 0 {
  862. br.Msg = "参数异常!"
  863. br.ErrMsg = "参数异常!"
  864. return
  865. }
  866. remark := strings.Trim(req.Remark, " ")
  867. if remark == "" {
  868. br.Msg = "请输入驳回理由"
  869. br.ErrMsg = "请输入驳回理由"
  870. return
  871. }
  872. err = seal.RejectApproval(req.SealId, sysUser, remark)
  873. if err != nil {
  874. br.Msg = "用印驳回失败"
  875. br.ErrMsg = "用印驳回失败,Err:" + err.Error()
  876. return
  877. }
  878. br.Ret = 200
  879. br.Success = true
  880. br.Msg = "操作成功"
  881. }
  882. // 作废用印申请
  883. // @Title 作废用印申请
  884. // @Description 作废用印申请
  885. // @Param request body request.SealApplyInvalidReq true "type json string"
  886. // @Success 200 操作成功
  887. // @router /invalidSealApproval [post]
  888. func (this *SealApprovalController) Invalid() {
  889. br := new(models.BaseResponse).Init()
  890. defer func() {
  891. this.Data["json"] = br
  892. this.ServeJSON()
  893. }()
  894. sysUser := this.SysUser
  895. if sysUser == nil {
  896. br.Msg = "请登录"
  897. br.ErrMsg = "请登录,SysUser is Empty"
  898. br.Ret = 408
  899. return
  900. }
  901. var req request.SealApprovalInvalidReq
  902. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  903. if err != nil {
  904. br.Msg = "参数解析异常!"
  905. br.ErrMsg = "参数解析异常!Err:" + err.Error()
  906. return
  907. }
  908. if req.SealId <= 0 {
  909. br.Msg = "参数异常!"
  910. br.ErrMsg = "参数异常!"
  911. return
  912. }
  913. err = seal.InvalidSealApproval(req.SealId, sysUser)
  914. if err != nil {
  915. br.Msg = "用印作废失败"
  916. br.ErrMsg = "用印作废失败,Err:" + err.Error()
  917. return
  918. }
  919. br.Ret = 200
  920. br.Success = true
  921. br.Msg = "操作成功"
  922. }
  923. // OperationList
  924. // @Title 用印操作日志列表
  925. // @Description 用印操作日志列表接口
  926. // @Param SealId query int true "用印申请ID"
  927. // @Success 200 {object} response.SealOperationListResp
  928. // @router /getOperationList [get]
  929. func (this *SealApprovalController) OperationList() {
  930. br := new(models.BaseResponse).Init()
  931. defer func() {
  932. this.Data["json"] = br
  933. this.ServeJSON()
  934. }()
  935. sysUser := this.SysUser
  936. if sysUser == nil {
  937. br.Msg = "请登录"
  938. br.ErrMsg = "请登录,SysUser is Empty"
  939. br.Ret = 408
  940. return
  941. }
  942. reqSealId, _ := this.GetInt("SealId", 0)
  943. if reqSealId <= 0 {
  944. br.Msg = "用印申请编号获取失败!"
  945. br.ErrMsg = "用印申请编号获取失败!"
  946. return
  947. }
  948. list, err := seal.GetSealOperationRecordList(reqSealId)
  949. if err != nil {
  950. br.Msg = "获取列表失败!"
  951. br.ErrMsg = "获取列表失败!"
  952. return
  953. }
  954. br.Ret = 200
  955. br.Msg = "获取成功"
  956. br.Success = true
  957. br.Data = response.SealOperationListResp{
  958. List: list,
  959. }
  960. }
  961. // 关联公司列表
  962. // @Title 关联公司列表
  963. // @Description 关联公司列表
  964. // @Success 200 {object} response.SealApprovalListResp
  965. // @router /getAffiliatedCompany [get]
  966. func (this *SealApprovalController) AffiliatedCompanyList() {
  967. br := new(models.BaseResponse).Init()
  968. defer func() {
  969. this.Data["json"] = br
  970. this.ServeJSON()
  971. }()
  972. sysUser := this.SysUser
  973. if sysUser == nil {
  974. br.Msg = "请登录"
  975. br.ErrMsg = "请登录,SysUser is Empty"
  976. br.Ret = 408
  977. return
  978. }
  979. crmConfig, err := company.GetConfigDetailByCode("affiliated_company")
  980. if err != nil {
  981. br.Msg = "获取配置失败"
  982. br.ErrMsg = "获取配置失败"
  983. br.IsSendEmail = false
  984. return
  985. }
  986. list := strings.Split(crmConfig.ConfigValue, ",")
  987. br.Ret = 200
  988. br.Success = true
  989. br.Msg = "获取成功"
  990. br.Data = list
  991. }
  992. // 用印客户名称检索
  993. // @Title 用印客户名称检索列表
  994. // @Description 关联公司列表
  995. // @Param KeyWord query string true "搜索关键词"
  996. // @Success 200 {object} company.CompanySearchView
  997. // @router /company/search [get]
  998. func (this *SealApprovalController) CompanySearch() {
  999. br := new(models.BaseResponse).Init()
  1000. defer func() {
  1001. this.Data["json"] = br
  1002. this.ServeJSON()
  1003. }()
  1004. sysUser := this.SysUser
  1005. if sysUser == nil {
  1006. br.Msg = "请登录"
  1007. br.ErrMsg = "请登录,SysUser is Empty"
  1008. br.Ret = 408
  1009. return
  1010. }
  1011. KeyWord := this.GetString("KeyWord")
  1012. if KeyWord == "" {
  1013. br.Msg = "请输入搜索词!"
  1014. return
  1015. }
  1016. KeyWord = "%" + KeyWord + "%"
  1017. productId := services.GetProductId(sysUser.RoleTypeCode)
  1018. var groupId int
  1019. if sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_FICC_GROUP || sysUser.RoleTypeCode == utils.ROLE_TYPE_CODE_RAI_GROUP {
  1020. groupId = sysUser.GroupId
  1021. } else {
  1022. groupId = -1
  1023. }
  1024. list, err := company.GetCompanySearchBySeal(productId, sysUser.AdminId, groupId, KeyWord)
  1025. if err != nil && err.Error() != utils.ErrNoRow() {
  1026. br.Msg = "搜索客户失败!"
  1027. br.ErrMsg = "搜索客户失败!Err:" + err.Error()
  1028. return
  1029. }
  1030. if list == nil {
  1031. list = make([]*company.CompanySearchView, 0)
  1032. }
  1033. br.Ret = 200
  1034. br.Success = true
  1035. br.Msg = "获取成功"
  1036. br.Data = list
  1037. }
  1038. // 用印合同编号检索
  1039. // @Title 用印合同编号检索
  1040. // @Description 关联用印信息列表
  1041. // @Param KeyWord query string true "搜索关键词"
  1042. // @Success 200 {object} sealModels.SealSearCodeViewListResp
  1043. // @router /sealcode/search [get]
  1044. func (this *SealApprovalController) SealCodeSearch() {
  1045. br := new(models.BaseResponse).Init()
  1046. defer func() {
  1047. this.Data["json"] = br
  1048. this.ServeJSON()
  1049. }()
  1050. sysUser := this.SysUser
  1051. if sysUser == nil {
  1052. br.Msg = "请登录"
  1053. br.ErrMsg = "请登录,SysUser is Empty"
  1054. br.Ret = 408
  1055. return
  1056. }
  1057. KeyWord := this.GetString("KeyWord")
  1058. if KeyWord == "" {
  1059. br.Msg = "请输入搜索词!"
  1060. return
  1061. }
  1062. KeyWord = "%" + KeyWord + "%"
  1063. var condition string
  1064. var pars []interface{}
  1065. condition += ` AND code LIKE ? AND user_id = ? `
  1066. pars = append(pars, KeyWord, sysUser.AdminId)
  1067. list, err := sealModels.GetList(condition, pars, 0, 100)
  1068. if err != nil && err.Error() != utils.ErrNoRow() {
  1069. br.Msg = "搜索客户失败!"
  1070. br.ErrMsg = "搜索客户失败!Err:" + err.Error()
  1071. return
  1072. }
  1073. resp := new(sealModels.SealSearCodeViewListResp)
  1074. if list == nil {
  1075. resp.List = make([]*sealModels.SealSearCodeView, 0)
  1076. } else {
  1077. for _, v := range list {
  1078. item := new(sealModels.SealSearCodeView)
  1079. item.SealId = v.SealId
  1080. item.Code = v.Code
  1081. item.StartDate = v.StartDate
  1082. item.EndDate = v.EndDate
  1083. item.Money = v.Money
  1084. resp.List = append(resp.List, item)
  1085. }
  1086. }
  1087. br.Ret = 200
  1088. br.Success = true
  1089. br.Msg = "获取成功"
  1090. br.Data = resp
  1091. }
  1092. // 通过ID获取用印对应详情
  1093. // @Title 通过ID获取用印对应详情接口
  1094. // @Description 获取用印对应详情
  1095. // @Param SealId query int true "用印ID"
  1096. // @Success 200 {object} response.SealSearCodeViewDetailResp
  1097. // @router /sealdetail/by_sealid [get]
  1098. func (this *SealApprovalController) SealdetailById() {
  1099. br := new(models.BaseResponse).Init()
  1100. defer func() {
  1101. this.Data["json"] = br
  1102. this.ServeJSON()
  1103. }()
  1104. sysUser := this.SysUser
  1105. if sysUser == nil {
  1106. br.Msg = "请登录"
  1107. br.ErrMsg = "请登录,SysUser is Empty"
  1108. br.Ret = 408
  1109. return
  1110. }
  1111. sealId, _ := this.GetInt("SealId")
  1112. if sealId == 0 {
  1113. br.Msg = "请输入用印ID!"
  1114. return
  1115. }
  1116. sealInfo, err := sealModels.GetSealInfoById(sealId)
  1117. if err != nil {
  1118. br.Msg = "获取用印失败!"
  1119. br.ErrMsg = "获取用印失败!Err:" + err.Error()
  1120. return
  1121. }
  1122. resp := new(sealModels.SealSearCodeViewDetailResp)
  1123. item := new(sealModels.SealSearCodeView)
  1124. item.SealId = sealInfo.SealId
  1125. item.Code = sealInfo.Code
  1126. item.StartDate = sealInfo.StartDate
  1127. item.EndDate = sealInfo.EndDate
  1128. item.Money = sealInfo.Money
  1129. resp.Detail = item
  1130. br.Ret = 200
  1131. br.Success = true
  1132. br.Msg = "获取成功"
  1133. br.Data = resp
  1134. }