report_open.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta_gn/eta_report/models"
  5. "eta_gn/eta_report/services"
  6. "eta_gn/eta_report/services/knowledge"
  7. "eta_gn/eta_report/utils"
  8. "fmt"
  9. "strconv"
  10. "strings"
  11. "time"
  12. )
  13. // ReportOpenController 报告开放接口
  14. type ReportOpenController struct {
  15. BaseOpenController
  16. }
  17. // ClassifyTree
  18. // @Title 报告分类
  19. // @Description 报告分类接口
  20. // @Param ClassifyType query int false "分类类型:0-全部(不传默认为0);1-研报;2-PPT"
  21. // @Param OutId query string false "用户工号Id"
  22. // @Success 200 {object} models.ClassifyTreeItem
  23. // @router /report/classify [get]
  24. func (this *ReportOpenController) ClassifyTree() {
  25. br := new(models.BaseResponse).Init()
  26. defer func() {
  27. if br.ErrMsg == "" {
  28. br.IsSendEmail = false
  29. }
  30. this.Data["json"] = br
  31. this.ServeJSON()
  32. }()
  33. classifyType, _ := this.GetInt("ClassifyType", 0)
  34. outId := this.GetString("OutId")
  35. if classifyType < 0 || classifyType > 2 {
  36. classifyType = 0
  37. }
  38. // 获取分类列表, 格式化分类树
  39. classifyOb := new(models.Classify)
  40. cond := ``
  41. pars := make([]interface{}, 0)
  42. if classifyType > 0 {
  43. cond += ` AND classify_type = ?`
  44. pars = append(pars, classifyType)
  45. }
  46. classifyList, e := classifyOb.GetItemsByCondition(cond, pars, []string{}, "parent_id ASC, sort ASC, create_time ASC")
  47. if e != nil {
  48. br.Msg = "获取失败"
  49. br.ErrMsg = fmt.Sprintf("获取分类列表失败,%v", e)
  50. return
  51. }
  52. if outId == "" {
  53. br.Msg = "工号不能为空"
  54. return
  55. }
  56. list := make([]*models.Classify, 0)
  57. classifyObj := new(models.ClassifyVisible)
  58. visibleUsers, err := classifyObj.GetClassifyVisibleAll()
  59. if err != nil {
  60. br.Msg = "获取失败"
  61. br.ErrMsg = fmt.Sprintf("获取可见用户失败,%v", err)
  62. return
  63. }
  64. adminObj := new(models.Admin)
  65. admin, e := adminObj.GetAdminByOutId(outId)
  66. if e != nil {
  67. if utils.IsErrNoRow(e) {
  68. br.Msg = "工号不存在"
  69. return
  70. }
  71. br.Msg = "获取失败"
  72. br.ErrMsg = fmt.Sprintf("获取管理员信息失败,%v", e)
  73. return
  74. }
  75. visibleUsersMap := make(map[int][]int)
  76. for _, v := range visibleUsers {
  77. visibleUsersMap[v.ClassifyId] = append(visibleUsersMap[v.ClassifyId], v.AdminId)
  78. }
  79. for _, v := range classifyList {
  80. if visibleUser, ok := visibleUsersMap[v.Id]; ok {
  81. if !utils.InArrayByInt(visibleUser, admin.AdminId) {
  82. continue
  83. }
  84. }
  85. list = append(list, v)
  86. }
  87. resp := services.GetReportClassifyTreeRecursive(list, 0)
  88. resp = services.RecursiveFilterNoChildTreeClassify(resp)
  89. br.Data = resp
  90. br.Ret = 200
  91. br.Success = true
  92. br.Msg = "获取成功"
  93. }
  94. // ReportCreate
  95. // @Title 生成报告
  96. // @Description 生成报告接口
  97. // @Param request body models.ReportCreateReq true "type json string"
  98. // @Success 200 string "操作成功"
  99. // @router /report/create [post]
  100. func (this *ReportOpenController) ReportCreate() {
  101. br := new(models.BaseResponse).Init()
  102. defer func() {
  103. if br.ErrMsg == "" {
  104. br.IsSendEmail = false
  105. }
  106. this.Data["json"] = br
  107. this.ServeJSON()
  108. }()
  109. var req models.ReportCreateReq
  110. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  111. br.Msg = "参数解析异常"
  112. br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
  113. return
  114. }
  115. if req.ReportId <= 0 {
  116. br.Msg = "报告ID有误"
  117. br.ErrMsg = fmt.Sprintf("智力共享报告ID有误, %d", req.ReportId)
  118. return
  119. }
  120. if req.ClassifyId <= 0 {
  121. br.Msg = "请选择分类"
  122. return
  123. }
  124. req.Title = strings.TrimSpace(req.Title)
  125. if req.Title == "" {
  126. br.Msg = "请输入报告标题"
  127. return
  128. }
  129. req.EndTime = strings.TrimSpace(req.EndTime)
  130. if req.EndTime == "" {
  131. br.Msg = "请输入课题结束时间"
  132. return
  133. }
  134. req.Abstract = strings.TrimSpace(req.Abstract)
  135. topicTime, e := time.ParseInLocation(utils.FormatDateTime, req.EndTime, time.Local)
  136. if e != nil {
  137. br.Msg = "课题结束时间格式有误"
  138. return
  139. }
  140. req.Creator = strings.TrimSpace(req.Creator)
  141. if req.Creator == "" {
  142. br.Msg = "请输入创建人工号"
  143. return
  144. }
  145. // 查询分类,根据分类创建对应类型的研报
  146. classifyOb := new(models.Classify)
  147. classify, e := classifyOb.GetItemById(req.ClassifyId)
  148. if e != nil {
  149. if utils.IsErrNoRow(e) {
  150. br.Msg = "分类不存在"
  151. return
  152. }
  153. br.Msg = "操作失败"
  154. br.ErrMsg = fmt.Sprintf("获取分类失败, %v", e)
  155. return
  156. }
  157. // 校验报告ID是否已存在, 已存在返回已有的报告ID
  158. reportExist, pptExist := services.GetReportByOutReportId(req.ReportId)
  159. if reportExist != nil && reportExist.Id > 0 {
  160. resp := new(models.ReportCreateResp)
  161. resp.ReportId = reportExist.Id
  162. br.Data = resp
  163. br.Ret = 200
  164. br.Success = true
  165. br.Msg = "操作成功"
  166. return
  167. }
  168. if pptExist != nil && pptExist.PptId > 0 {
  169. resp := new(models.ReportCreateResp)
  170. resp.ReportId = pptExist.PptId
  171. br.Data = resp
  172. br.Ret = 200
  173. br.Success = true
  174. br.Msg = "操作成功"
  175. return
  176. }
  177. // 研报类型
  178. var reportId int
  179. if classify.ClassifyType == utils.ReportTypeDefault {
  180. reportId, e = services.CreateReport(req.ReportId, req.ClassifyId, req.Title, req.Abstract, topicTime, req.Creator, req.Authors)
  181. if e != nil {
  182. br.Msg = "操作失败"
  183. br.ErrMsg = fmt.Sprintf("新增报告失败, %v", e)
  184. return
  185. }
  186. }
  187. // PPT类型
  188. if classify.ClassifyType == utils.ReportTypePPT {
  189. reportId, e = services.CreatePptReport(req.ReportId, req.ClassifyId, req.Title, req.Abstract, topicTime, req.Creator, req.Authors)
  190. if e != nil {
  191. br.Msg = "操作失败"
  192. br.ErrMsg = fmt.Sprintf("新增PPT报告失败, %v", e)
  193. return
  194. }
  195. }
  196. resp := new(models.ReportCreateResp)
  197. resp.ReportId = reportId
  198. //resp.ReportCode = reportCode
  199. br.Data = resp
  200. br.Ret = 200
  201. br.Success = true
  202. br.Msg = "操作成功"
  203. }
  204. // ReportModify
  205. // @Title 编辑报告
  206. // @Description 编辑报告接口
  207. // @Param request body models.ReportModifyReq true "type json string"
  208. // @Success 200 string "操作成功"
  209. // @router /report/modify [post]
  210. func (this *ReportOpenController) ReportModify() {
  211. br := new(models.BaseResponse).Init()
  212. defer func() {
  213. if br.ErrMsg == "" {
  214. br.IsSendEmail = false
  215. }
  216. this.Data["json"] = br
  217. this.ServeJSON()
  218. }()
  219. var req models.ReportModifyReq
  220. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  221. br.Msg = "参数解析异常"
  222. br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
  223. return
  224. }
  225. if req.ReportId <= 0 {
  226. br.Msg = "报告ID有误"
  227. br.ErrMsg = fmt.Sprintf("智力共享报告ID有误, %d", req.ReportId)
  228. return
  229. }
  230. req.Abstract = strings.TrimSpace(req.Abstract)
  231. req.Title = strings.TrimSpace(req.Title)
  232. if req.Title == "" {
  233. br.Msg = "请输入报告标题"
  234. return
  235. }
  236. req.EndTime = strings.TrimSpace(req.EndTime)
  237. if req.EndTime == "" {
  238. br.Msg = "请输入课题结束时间"
  239. return
  240. }
  241. topicTime, e := time.ParseInLocation(utils.FormatDateTime, req.EndTime, time.Local)
  242. if e != nil {
  243. br.Msg = "课题结束时间格式有误"
  244. return
  245. }
  246. reportExist, pptExist := services.GetReportByOutReportId(req.ReportId)
  247. if reportExist == nil && pptExist == nil {
  248. br.Msg = "报告不存在"
  249. br.ErrMsg = fmt.Sprintf("报告不存在, OutReportId: %d", req.ReportId)
  250. return
  251. }
  252. // 研报类型
  253. if reportExist != nil && reportExist.Id > 0 {
  254. if reportExist.State == models.ReportStatePass {
  255. br.Msg = "报告已发布,不可编辑"
  256. return
  257. }
  258. if e = services.EditReport(reportExist, req.Title, req.Abstract, topicTime, req.Authors); e != nil {
  259. br.Msg = "操作失败"
  260. br.ErrMsg = fmt.Sprintf("编辑报告失败, %v", e)
  261. return
  262. }
  263. }
  264. // PPT类型
  265. if pptExist != nil && pptExist.PptId > 0 {
  266. if pptExist.State == models.ReportStatePass {
  267. br.Msg = "报告已发布,不可编辑"
  268. return
  269. }
  270. if e = services.EditPptReport(pptExist, req.Title, req.Abstract, topicTime, req.Authors); e != nil {
  271. br.Msg = "操作失败"
  272. br.ErrMsg = fmt.Sprintf("编辑PPT报告失败, %v", e)
  273. return
  274. }
  275. }
  276. br.Ret = 200
  277. br.Success = true
  278. br.Msg = "操作成功"
  279. }
  280. // ReportApprove
  281. // @Title 审批报告
  282. // @Description 审批报告接口
  283. // @Param request body models.ReportApproveReq true "type json string"
  284. // @Success 200 string "操作成功"
  285. // @router /report/approve [post]
  286. func (this *ReportOpenController) ReportApprove() {
  287. br := new(models.BaseResponse).Init()
  288. defer func() {
  289. if br.ErrMsg == "" {
  290. br.IsSendEmail = false
  291. }
  292. this.Data["json"] = br
  293. this.ServeJSON()
  294. }()
  295. var req models.ReportApproveReq
  296. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  297. br.Msg = "参数解析异常"
  298. br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
  299. return
  300. }
  301. if len(req.ReportIds) == 0 {
  302. br.Msg = "报告ID有误"
  303. br.ErrMsg = fmt.Sprintf("智力共享报告ID有误, %v", req.ReportIds)
  304. return
  305. }
  306. if req.ApproveType != 1 && req.ApproveType != 2 && req.ApproveType != 3 && req.ApproveType != 4 {
  307. br.Msg = "审批类型异常"
  308. br.ErrMsg = fmt.Sprintf("审批类型异常, %d", req.ApproveType)
  309. return
  310. }
  311. // 先做校验后执行, 报告很可能是研报和PPT类型混着一起审批的
  312. updateReports := make([]*models.Report, 0)
  313. updatePpts := make([]*models.PptV2, 0)
  314. for _, v := range req.ReportIds {
  315. reportExist, pptExist := services.GetReportByOutReportId(v)
  316. if reportExist == nil && pptExist == nil {
  317. utils.FileLog.Info(fmt.Sprintf("ReportApprove-报告ID: %d不存在", v))
  318. continue
  319. }
  320. // 通过和驳回需要审批中/已驳回状态,撤回、提审暂不做限制(若报告未撰写完毕,提审会把状态从待提交直接变为待审批,那么就是撰写终止附件不会再传回去了,这种情况是允许的)
  321. if reportExist != nil && reportExist.Id > 0 {
  322. if (req.ApproveType == 1 || req.ApproveType == 2) && reportExist.State != models.ReportStateWaitApprove && reportExist.State != models.ReportStateRefused {
  323. utils.FileLog.Info(fmt.Sprintf("ReportApprove-报告当前状态不允许审批, OutId: %d, State: %d", v, reportExist.State))
  324. continue
  325. }
  326. updateReports = append(updateReports, reportExist)
  327. }
  328. if pptExist != nil && pptExist.PptId > 0 {
  329. if (req.ApproveType == 1 || req.ApproveType == 2) && pptExist.State != models.ReportStateWaitApprove && pptExist.State != models.ReportStateRefused {
  330. utils.FileLog.Info(fmt.Sprintf("ReportApprove-PPT当前状态不允许审批, OutId: %d, State: %d", v, pptExist.State))
  331. continue
  332. }
  333. updatePpts = append(updatePpts, pptExist)
  334. }
  335. }
  336. // 审批人
  337. approveUser := new(models.Admin)
  338. {
  339. ob := new(models.Admin)
  340. cond := ` AND out_id = ?`
  341. pars := make([]interface{}, 0)
  342. pars = append(pars, req.ApproveUser)
  343. admin, e := ob.GetItemByCondition(cond, pars, "")
  344. if e != nil && !utils.IsErrNoRow(e) {
  345. br.Msg = "操作失败"
  346. br.ErrMsg = fmt.Sprintf("获取审批人信息失败, %v", e)
  347. return
  348. }
  349. if admin != nil && admin.AdminId > 0 {
  350. approveUser = admin
  351. }
  352. }
  353. if approveUser.AdminId == 0 {
  354. utils.FileLog.Info(fmt.Sprintf("ReportApprove-无审批人信息, OutId: %s", req.ApproveUser))
  355. }
  356. reportMessages := make([]*models.ReportMessage, 0)
  357. afterApproveMap := map[int]int{
  358. 1: models.ReportStatePass,
  359. 2: models.ReportStateRefused,
  360. 3: models.ReportStateWaitSubmit,
  361. 4: models.ReportStateWaitApprove,
  362. }
  363. if len(updateReports) > 0 {
  364. for _, v := range updateReports {
  365. updateCols := []string{"State", "ModifyTime"}
  366. v.State = afterApproveMap[req.ApproveType]
  367. v.ModifyTime = time.Now()
  368. if v.State == models.ReportStatePass || v.State == models.ReportStateRefused {
  369. v.ApproveTime = time.Now()
  370. updateCols = append(updateCols, "ApproveTime")
  371. }
  372. if e := v.Update(updateCols); e != nil {
  373. br.Msg = "操作失败"
  374. br.ErrMsg = fmt.Sprintf("更新报告状态失败, %v", e)
  375. return
  376. }
  377. if req.ApproveType == 1 {
  378. // 审批通过,将PPT或研报加入报告库中
  379. go func() {
  380. msg, err := knowledge.ReportKnowledgeResourceAdd(v.Title, []string{v.DetailPdfUrl}, v.AdminId, v.AdminRealName, "市场研究报告/内部报告/日常报告", "市场信息研究所", time.Now())
  381. if err != nil {
  382. utils.FileLog.Error(fmt.Sprintf("ReportKnowledgeResourceAdd-报告知识资源库添加失败,reportId:%d,msg:%s,err: %v", v.Id, msg, err))
  383. return
  384. }
  385. }()
  386. go func() {
  387. // 审批通过,将摘要加入知识资源库观点中
  388. var classifyId int
  389. if v.ClassifyIdThird > 0 {
  390. classifyId = v.ClassifyIdThird
  391. } else if v.ClassifyIdSecond > 0 {
  392. classifyId = v.ClassifyIdSecond
  393. } else {
  394. classifyId = v.ClassifyIdFirst
  395. }
  396. v.Abstract = strings.TrimSpace(v.Abstract)
  397. if v.Abstract == "" {
  398. return
  399. }
  400. classifyId, err := knowledge.ReportKnowledgeResourceClassifyCheckAndSave(classifyId)
  401. if err != nil {
  402. utils.FileLog.Error(fmt.Sprintf("ReportKnowledgeResourceClassifyCheckAndSave-报告分类保存失败,reportId:%d,classifyId:%d,err: %v", v.Id, classifyId, err))
  403. return
  404. }
  405. msg, err := knowledge.ViewPointSave(0, v.AdminId, v.AdminRealName, v.Title, v.Abstract, "市场信息研究所", "", classifyId, &v.ApproveTime)
  406. if err != nil {
  407. utils.FileLog.Error(fmt.Sprintf("ViewPointSave-报告摘要知识资源库添加失败,reportId:%d,msg:%s,err: %v", v.Id, msg, err))
  408. return
  409. }
  410. }()
  411. }
  412. if req.ApproveType == 3 || req.ApproveType == 4 {
  413. // 撤回/提审暂不发消息
  414. continue
  415. }
  416. // 创作人和协作人
  417. userIds := make([]int, 0)
  418. userIds = append(userIds, v.AdminId)
  419. {
  420. grantOb := new(models.ReportGrant)
  421. grantCond := ` AND report_id = ?`
  422. grantPars := make([]interface{}, 0)
  423. grantPars = append(grantPars, v.Id)
  424. grants, e := grantOb.GetItemsByCondition(grantCond, grantPars, []string{"admin_id"}, "")
  425. if e != nil {
  426. br.Msg = "操作失败"
  427. br.ErrMsg = fmt.Sprintf("获取报告协作人失败, %v", e)
  428. return
  429. }
  430. for _, v := range grants {
  431. if utils.InArrayByInt(userIds, v.AdminId) {
  432. continue
  433. }
  434. userIds = append(userIds, v.AdminId)
  435. }
  436. }
  437. // 发送系统消息给创建人和协作人
  438. var messageType int
  439. var tips string
  440. var extraContent string
  441. if v.State == models.ReportStatePass {
  442. messageType = models.ReportMessageTypeApprovePass
  443. tips = "已通过审批!"
  444. }
  445. if v.State == models.ReportStateRefused {
  446. messageType = models.ReportMessageTypeApproveRefuse
  447. tips = "已被驳回,点击查看详情!"
  448. // 审批详情信息
  449. var extra models.ReportMessageApproveItem
  450. extra.Title = v.Title
  451. extra.ApproveType = 2
  452. extra.ApproveUserId = approveUser.AdminId
  453. extra.ApproveUserName = approveUser.RealName
  454. extra.ApproveRemark = req.Suggestion
  455. b, e := json.Marshal(extra)
  456. if e != nil {
  457. br.Msg = "操作失败"
  458. br.ErrMsg = fmt.Sprintf("消息通知-审批信息JSON格式化失败, %v", e)
  459. return
  460. }
  461. extraContent = string(b)
  462. }
  463. for _, u := range userIds {
  464. m := new(models.ReportMessage)
  465. m.SendUserId = approveUser.AdminId
  466. m.ReceiveUserId = u
  467. m.Content = fmt.Sprintf("您提交的【%s】%s", v.Title, tips)
  468. m.ExtraContent = extraContent
  469. m.ReportType = utils.ReportTypeDefault
  470. m.ReportId = v.Id
  471. m.MessageType = messageType
  472. m.CreateTime = time.Now()
  473. m.ModifyTime = time.Now()
  474. reportMessages = append(reportMessages, m)
  475. }
  476. }
  477. }
  478. if len(updatePpts) > 0 {
  479. for _, v := range updatePpts {
  480. updateCols := []string{"State", "ModifyTime"}
  481. v.State = afterApproveMap[req.ApproveType]
  482. v.ModifyTime = time.Now()
  483. if v.State == models.ReportStatePass || v.State == models.ReportStateRefused {
  484. v.ApproveTime = time.Now()
  485. updateCols = append(updateCols, "ApproveTime")
  486. }
  487. if e := v.Update(updateCols); e != nil {
  488. br.Msg = "操作失败"
  489. br.ErrMsg = fmt.Sprintf("更新报告状态失败, %v", e)
  490. return
  491. }
  492. if req.ApproveType == 1 {
  493. // 审批通过,将PPT或研报加入报告库中
  494. go func() {
  495. msg, err := knowledge.ReportKnowledgeResourceAdd(v.Title, []string{v.PptxUrl}, v.AdminId, v.AdminRealName, "市场研究报告/内部报告/日常报告", "市场信息研究所", time.Now())
  496. if err != nil {
  497. utils.FileLog.Error(fmt.Sprintf("ReportKnowledgeResourceAdd-PPT知识资源报告库添加失败,pptId:%d,msg:%s,err: %v", v.PptId, msg, err))
  498. return
  499. }
  500. }()
  501. go func() {
  502. // 审批通过,将摘要加入知识资源库观点中
  503. v.Abstract = strings.TrimSpace(v.Abstract)
  504. if v.Abstract == "" {
  505. return
  506. }
  507. classifyId, err := knowledge.ReportKnowledgeResourceClassifyCheckAndSave(v.ClassifyId)
  508. if err != nil {
  509. utils.FileLog.Error(fmt.Sprintf("ReportKnowledgeResourceClassifyCheckAndSave-PPT分类保存失败,pptId:%d,classifyId:%d,err: %v", v.PptId, v.ClassifyId, err))
  510. return
  511. }
  512. msg, err := knowledge.ViewPointSave(0, v.AdminId, v.AdminRealName, v.Title, v.Abstract, "市场信息研究所", "", classifyId, &v.ApproveTime)
  513. if err != nil {
  514. utils.FileLog.Error(fmt.Sprintf("ViewPointSave-ppt摘要知识库添加失败,pptId:%d,msg:%s,err: %v", v.PptId, msg, err))
  515. return
  516. }
  517. }()
  518. }
  519. if req.ApproveType == 3 || req.ApproveType == 4 {
  520. // 撤回/提审暂不发消息
  521. continue
  522. }
  523. // 创建人和协作人
  524. userIds := make([]int, 0)
  525. userIds = append(userIds, v.AdminId)
  526. if v.CollaborateUsers != "" {
  527. partnerArr := strings.Split(v.CollaborateUsers, ",")
  528. for _, p := range partnerArr {
  529. uid, _ := strconv.Atoi(p)
  530. if uid > 0 && !utils.InArrayByInt(userIds, uid) {
  531. userIds = append(userIds, uid)
  532. }
  533. }
  534. }
  535. // 发送系统消息给创建人和协作人
  536. var messageType int
  537. var tips string
  538. var extraContent string
  539. if v.State == models.ReportStatePass {
  540. messageType = models.ReportMessageTypeApprovePass
  541. tips = "已通过审批!"
  542. }
  543. if v.State == models.ReportStateRefused {
  544. messageType = models.ReportMessageTypeApproveRefuse
  545. tips = "已被驳回,点击查看详情!"
  546. // 审批详情信息
  547. var extra models.ReportMessageApproveItem
  548. extra.Title = v.Title
  549. extra.ApproveType = 2
  550. extra.ApproveUserId = approveUser.AdminId
  551. extra.ApproveUserName = approveUser.RealName
  552. extra.ApproveRemark = req.Suggestion
  553. b, e := json.Marshal(extra)
  554. if e != nil {
  555. br.Msg = "操作失败"
  556. br.ErrMsg = fmt.Sprintf("消息通知-审批信息JSON格式化失败, %v", e)
  557. return
  558. }
  559. extraContent = string(b)
  560. }
  561. for _, u := range userIds {
  562. m := new(models.ReportMessage)
  563. m.SendUserId = approveUser.AdminId
  564. m.ReceiveUserId = u
  565. m.Content = fmt.Sprintf("您提交的【%s】%s", v.Title, tips)
  566. m.ExtraContent = extraContent
  567. m.ReportType = utils.ReportTypePPT
  568. m.ReportId = v.PptId
  569. m.MessageType = messageType
  570. m.CreateTime = time.Now()
  571. m.ModifyTime = time.Now()
  572. reportMessages = append(reportMessages, m)
  573. }
  574. }
  575. }
  576. // 消息通知
  577. if len(reportMessages) > 0 {
  578. messageOb := new(models.ReportMessage)
  579. if e := messageOb.CreateMulti(reportMessages); e != nil {
  580. br.Msg = "操作失败"
  581. br.ErrMsg = fmt.Sprintf("批量新增报告消息失败, %v", e)
  582. return
  583. }
  584. }
  585. br.Ret = 200
  586. br.Success = true
  587. br.Msg = "操作成功"
  588. }
  589. // ReportRemove
  590. // @Title 删除报告
  591. // @Description 删除报告接口
  592. // @Param request body models.ReportRemoveReq true "type json string"
  593. // @Success 200 string "操作成功"
  594. // @router /report/remove [post]
  595. func (this *ReportOpenController) ReportRemove() {
  596. br := new(models.BaseResponse).Init()
  597. defer func() {
  598. if br.ErrMsg == "" {
  599. br.IsSendEmail = false
  600. }
  601. this.Data["json"] = br
  602. this.ServeJSON()
  603. }()
  604. var req models.ReportRemoveReq
  605. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  606. br.Msg = "参数解析异常"
  607. br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
  608. return
  609. }
  610. if len(req.ReportIds) == 0 {
  611. br.Msg = "报告ID有误"
  612. br.ErrMsg = fmt.Sprintf("智力共享报告ID有误, %v", req.ReportIds)
  613. return
  614. }
  615. // TODO:(可选优化)若报告的状态是已审批状态,那么把OutReportId置空,不做物理删除
  616. for _, v := range req.ReportIds {
  617. reportExist, pptExist := services.GetReportByOutReportId(v)
  618. // 不存在忽略即可
  619. if reportExist == nil && pptExist == nil {
  620. continue
  621. }
  622. // 研报类型
  623. if reportExist != nil && reportExist.Id > 0 {
  624. if e := reportExist.Remove(); e != nil {
  625. br.Msg = "操作失败"
  626. br.ErrMsg = fmt.Sprintf("删除报告失败, %v", e)
  627. return
  628. }
  629. }
  630. // PPT类型
  631. if pptExist != nil && pptExist.PptId > 0 {
  632. if e := pptExist.Remove(); e != nil {
  633. br.Msg = "操作失败"
  634. br.ErrMsg = fmt.Sprintf("删除PPT报告失败, %v", e)
  635. return
  636. }
  637. }
  638. }
  639. br.Ret = 200
  640. br.Success = true
  641. br.Msg = "操作成功"
  642. }
  643. // ViewPointSave
  644. // @Title 观点保存
  645. // @Description 观点保存
  646. // @Param request body models.ReportViewPointReq true "type json string"
  647. // @Success 200 string "操作成功"
  648. // @router /viewpoint/save [post]
  649. func (this *ReportOpenController) ViewPointSave() {
  650. br := new(models.BaseResponse).Init()
  651. defer func() {
  652. if br.ErrMsg == "" {
  653. br.IsSendEmail = false
  654. }
  655. this.Data["json"] = br
  656. this.ServeJSON()
  657. }()
  658. var req *models.ReportViewPointSaveReq
  659. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  660. br.Msg = "参数解析异常"
  661. br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
  662. return
  663. }
  664. req.Content = strings.TrimSpace(req.Content)
  665. req.Title = strings.TrimSpace(req.Title)
  666. req.Category = strings.TrimSpace(req.Category)
  667. if req.Title == "" {
  668. br.Msg = "观点标题不能为空"
  669. return
  670. }
  671. if req.Content == "" {
  672. br.Msg = "观点内容不能为空"
  673. return
  674. }
  675. if req.Category == "" {
  676. br.Msg = "观点分类不能为空"
  677. return
  678. }
  679. if req.DataDate == "" {
  680. br.Msg = "观点日期不能为空"
  681. return
  682. }
  683. dataDate, err := time.ParseInLocation(utils.FormatDateTime, req.DataDate, time.Local)
  684. if err != nil {
  685. br.Msg = "观点日期格式不正确"
  686. return
  687. }
  688. msg, err := knowledge.ViewPointSave(req.Id, 0, "", req.Title, req.Content, req.DataSource, req.Category, 0, &dataDate)
  689. if err != nil {
  690. if msg == "" {
  691. msg = "保存观点失败"
  692. }
  693. br.Msg = msg
  694. br.ErrMsg = fmt.Sprintf("保存观点失败, %v", err)
  695. return
  696. }
  697. br.Msg = "保存观点成功"
  698. br.Success = true
  699. br.Ret = 200
  700. }
  701. // @Title 观点删除
  702. // @Description 观点删除
  703. // @Param request body models.ReportViewPointReq true "type json string"
  704. // @Success 200 string "操作成功"
  705. // @router /viewpoint/delete [post]
  706. func (this *ReportOpenController) ViewPointDelete() {
  707. br := new(models.BaseResponse).Init()
  708. defer func() {
  709. if br.ErrMsg == "" {
  710. br.IsSendEmail = false
  711. }
  712. this.Data["json"] = br
  713. this.ServeJSON()
  714. }()
  715. var req *models.ReportViewPointDeleteRep
  716. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  717. br.Msg = "参数解析异常"
  718. br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
  719. return
  720. }
  721. if req.Id == nil {
  722. br.Msg = "观点ID不能为空"
  723. return
  724. }
  725. obj := new(models.KnowledgeResource)
  726. obj, err := obj.GetKnowledgeResourceByOutId(*req.Id)
  727. if err != nil {
  728. if utils.IsErrNoRow(err) {
  729. br.Msg = "观点不存在"
  730. return
  731. }
  732. br.Msg = "删除观点失败"
  733. br.ErrMsg = fmt.Sprintf("删除观点失败, %v", err)
  734. return
  735. }
  736. obj.IsDelete = 1
  737. if err = obj.Update([]string{"IsDelete"}); err != nil {
  738. br.Msg = "删除观点失败"
  739. br.ErrMsg = fmt.Sprintf("删除观点失败, %v", err)
  740. return
  741. }
  742. updateMap := map[string]interface{}{
  743. "IsDelete": "1",
  744. }
  745. err = knowledge.UpdateEsKnowledgeResource(obj.KnowledgeResourceId, updateMap)
  746. if err != nil {
  747. br.Msg = "删除观点失败"
  748. br.ErrMsg = fmt.Sprintf("es删除观点失败, %v", err)
  749. return
  750. }
  751. br.Msg = "删除观点成功"
  752. br.Success = true
  753. br.Ret = 200
  754. }
  755. // @Title 知识资源报告库上传
  756. // @Description 知识资源报告库上传
  757. // @Param request body string/int true/false "Description"
  758. // @Success 200 string "操作成功"
  759. // @router /report/knowledge/upload [post]
  760. func (this *ReportOpenController) ReportKnowledgeUpload() {
  761. br := new(models.BaseResponse).Init()
  762. defer func() {
  763. if br.ErrMsg == "" {
  764. br.IsSendEmail = false
  765. }
  766. this.Data["json"] = br
  767. this.ServeJSON()
  768. }()
  769. var req models.ReportKnowledgeUploadRep
  770. if e := this.BindForm(&req); e != nil {
  771. br.Msg = "参数解析异常"
  772. br.ErrMsg = fmt.Sprintf("参数解析失败,%v", e)
  773. return
  774. }
  775. pushTime, err := time.Parse(utils.FormatDateTime, req.PushTime)
  776. if err != nil {
  777. br.Msg = "发布时间格式不正确"
  778. return
  779. }
  780. fileUrls, msg, err := knowledge.UploadFormFile(this.Ctx.Request.MultipartForm.File)
  781. if err != nil {
  782. if msg == "" {
  783. msg = "上传失败"
  784. }
  785. br.Msg = msg
  786. br.ErrMsg = fmt.Sprintf("上传失败, %v", err)
  787. return
  788. }
  789. msg, err = knowledge.ReportKnowledgeResourceAdd(req.Title, fileUrls, 0, "", req.ClassifyPath, req.Source, pushTime)
  790. if err != nil {
  791. if msg == "" {
  792. msg = "保存失败"
  793. }
  794. br.Msg = msg
  795. br.ErrMsg = fmt.Sprintf("保存失败, %v", err)
  796. return
  797. }
  798. br.Ret = 200
  799. br.Msg = "上传成功"
  800. br.Success = true
  801. }