custom_analysis.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. package excel
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. excelModel "eta/eta_api/models/data_manage/excel"
  7. "eta/eta_api/models/data_manage/excel/request"
  8. "eta/eta_api/models/data_manage/excel/response"
  9. "eta/eta_api/services/data/excel"
  10. "eta/eta_api/utils"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. // CustomAnalysisController 自定义分析
  16. type CustomAnalysisController struct {
  17. controllers.BaseAuthController
  18. }
  19. // ExcelByName
  20. // @Title 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  21. // @Description 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  22. // @Param ExcelName query string true "搜索关键词"
  23. // @Success 200 {object} response.ExcelListResp
  24. // @router /excel_by_name [get]
  25. func (c *CustomAnalysisController) ExcelByName() {
  26. br := new(models.BaseResponse).Init()
  27. defer func() {
  28. c.Data["json"] = br
  29. c.ServeJSON()
  30. }()
  31. sysUser := c.SysUser
  32. if sysUser == nil {
  33. br.Msg = "请登录"
  34. br.ErrMsg = "请登录,SysUser Is Empty"
  35. br.Ret = 408
  36. return
  37. }
  38. excelName := c.GetString("ExcelName")
  39. if excelName == `` {
  40. br.Msg = "请选择表格"
  41. br.ErrMsg = "ExcelName未传"
  42. br.IsSendEmail = false
  43. return
  44. }
  45. resp := response.FindExcelInfoResp{}
  46. excelName = utils.TrimLRStr(excelName)
  47. // 获取数据详情
  48. excelDetail, err := excelModel.GetNoContentExcelInfoByName(excelName, utils.CUSTOM_ANALYSIS_TABLE)
  49. if err != nil {
  50. if err.Error() == utils.ErrNoRow() {
  51. br.Ret = 200
  52. br.Success = true
  53. br.Msg = "获取成功"
  54. br.Data = resp
  55. return
  56. }
  57. br.Msg = "获取表格事变"
  58. br.ErrMsg = err.Error()
  59. return
  60. }
  61. resp.IsFind = true
  62. resp.ExcelInfo = excelDetail
  63. if excelDetail != nil {
  64. sheetList, err := excelModel.GetAllSheetItemList(excelDetail.ExcelInfoId)
  65. if err != nil {
  66. br.Msg = "获取sheet失败"
  67. br.ErrMsg = "获取sheet失败,err:" + err.Error()
  68. return
  69. }
  70. resp.SheetList = sheetList
  71. }
  72. //resp := response.ExcelListResp{
  73. // Paging: page,
  74. // List: list,
  75. //}
  76. br.Ret = 200
  77. br.Success = true
  78. br.Msg = "获取成功"
  79. br.Data = resp
  80. }
  81. // Add
  82. // @Title 新增表格接口
  83. // @Description 新增表格接口
  84. // @Param request body request.AddExcelInfoReq true "type json string"
  85. // @Success 200 {object} response.AddExcelInfoResp
  86. // @router /add [post]
  87. func (c *CustomAnalysisController) Add() {
  88. br := new(models.BaseResponse).Init()
  89. defer func() {
  90. c.Data["json"] = br
  91. c.ServeJSON()
  92. }()
  93. sysUser := c.SysUser
  94. if sysUser == nil {
  95. br.Msg = "请登录"
  96. br.ErrMsg = "请登录,SysUser Is Empty"
  97. br.Ret = 408
  98. return
  99. }
  100. deleteCache := true
  101. cacheKey := "CACHE_EXCEL_TABLE_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
  102. defer func() {
  103. if deleteCache {
  104. _ = utils.Rc.Delete(cacheKey)
  105. }
  106. }()
  107. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  108. deleteCache = false
  109. br.Msg = "系统处理中,请稍后重试!"
  110. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
  111. return
  112. }
  113. var req request.AddExcelInfoReq
  114. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  115. if err != nil {
  116. br.Msg = "参数解析异常!"
  117. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  118. return
  119. }
  120. req.ExcelName = strings.Trim(req.ExcelName, " ")
  121. if req.ExcelName == "" {
  122. br.Msg = "请填写表格名称!"
  123. br.IsSendEmail = false
  124. return
  125. }
  126. if req.ExcelClassifyId <= 0 {
  127. br.Msg = "分类参数错误!"
  128. br.IsSendEmail = false
  129. return
  130. }
  131. excelInfo, err, errMsg, isSendEmail := excel.AddCustomAnalysisTable(utils.TrimLRStr(req.ExcelName), req.Content, req.ExcelImage, req.ExcelClassifyId, sysUser)
  132. if err != nil {
  133. br.Msg = "保存失败"
  134. if errMsg != `` {
  135. br.Msg = errMsg
  136. }
  137. br.ErrMsg = "保存失败,Err:" + err.Error()
  138. br.IsSendEmail = isSendEmail
  139. return
  140. }
  141. // 更新excel下载地址(默认的EXCEL需要更新,自定义表格不需要更新)
  142. //if req.Source == 1 {
  143. // go UpdateExcelInfoFileUrl(excelInfo)
  144. //}
  145. //
  146. resp := new(response.AddExcelInfoResp)
  147. resp.ExcelInfoId = excelInfo.ExcelInfoId
  148. resp.UniqueCode = excelInfo.UniqueCode
  149. // 生成excel文件
  150. go excel.UpdateExcelInfoFileUrl(excelInfo)
  151. //新增操作日志
  152. //{
  153. // excelLog := &data_manage.ExcelInfoLog{
  154. // //ExcelInfoLogId: 0,
  155. // ExcelInfoId: excelInfo.ExcelInfoId,
  156. // ExcelName: req.ExcelName,
  157. // ExcelClassifyId: req.ExcelClassifyId,
  158. // SysUserId: sysUser.AdminId,
  159. // SysUserRealName: sysUser.RealName,
  160. // UniqueCode: excelInfo.UniqueCode,
  161. // CreateTime: time.Now(),
  162. // Content: string(c.Ctx.Input.RequestBody),
  163. // Status: "新增表格",
  164. // Method: c.Ctx.Input.URI(),
  165. // }
  166. // go data_manage.AddExcelInfoLog(excelLog)
  167. //}
  168. br.Ret = 200
  169. br.Success = true
  170. br.Msg = "保存成功"
  171. br.Data = resp
  172. br.IsAddLog = false //数据量太大了,不写入日志吧
  173. }
  174. // Save
  175. // @Title 保存表格接口
  176. // @Description 保存表格接口
  177. // @Param request body request.AddExcelInfoReq true "type json string"
  178. // @Success 200 {object} response.AddExcelInfoResp
  179. // @router /save [post]
  180. func (c *CustomAnalysisController) Save() {
  181. br := new(models.BaseResponse).Init()
  182. defer func() {
  183. c.Data["json"] = br
  184. c.ServeJSON()
  185. }()
  186. sysUser := c.SysUser
  187. if sysUser == nil {
  188. br.Msg = "请登录"
  189. br.ErrMsg = "请登录,SysUser Is Empty"
  190. br.Ret = 408
  191. return
  192. }
  193. deleteCache := true
  194. cacheKey := "CACHE_EXCEL_TABLE_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
  195. defer func() {
  196. if deleteCache {
  197. _ = utils.Rc.Delete(cacheKey)
  198. }
  199. }()
  200. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  201. deleteCache = false
  202. br.Msg = "系统处理中,请稍后重试!"
  203. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
  204. return
  205. }
  206. var req request.SaveExcelInfoReq
  207. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  208. if err != nil {
  209. br.Msg = "参数解析异常!"
  210. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  211. return
  212. }
  213. req.ExcelName = strings.Trim(req.ExcelName, " ")
  214. if req.ExcelName == "" {
  215. br.Msg = "请填写表格名称!"
  216. br.IsSendEmail = false
  217. return
  218. }
  219. if req.ExcelInfoId <= 0 {
  220. br.Msg = "请选择excel!"
  221. br.IsSendEmail = false
  222. return
  223. }
  224. if req.ExcelClassifyId <= 0 {
  225. br.Msg = "分类参数错误!"
  226. br.IsSendEmail = false
  227. return
  228. }
  229. excelInfo, err := excelModel.GetExcelInfoById(req.ExcelInfoId)
  230. if err != nil {
  231. br.Msg = "找不到该EXCEL!"
  232. br.ErrMsg = "找不到该EXCEL!err:" + err.Error()
  233. return
  234. }
  235. if excelInfo.Source != utils.CUSTOM_ANALYSIS_TABLE {
  236. br.Msg = "EXCEL异常!"
  237. br.IsSendEmail = false
  238. return
  239. }
  240. err, errMsg, isSendEmail := excel.SaveCustomAnalysisTable(excelInfo, utils.TrimLRStr(req.ExcelName), req.Content, req.ExcelImage, req.ExcelClassifyId, req.OpSheetList)
  241. if err != nil {
  242. br.Msg = "保存失败"
  243. if errMsg != `` {
  244. br.Msg = errMsg
  245. }
  246. br.ErrMsg = "保存失败,Err:" + err.Error()
  247. br.IsSendEmail = isSendEmail
  248. return
  249. }
  250. // 更新excel下载地址(默认的EXCEL需要更新,自定义表格不需要更新)
  251. //if req.Source == 1 {
  252. // go UpdateExcelInfoFileUrl(excelInfo)
  253. //}
  254. //
  255. resp := new(response.AddExcelInfoResp)
  256. resp.ExcelInfoId = excelInfo.ExcelInfoId
  257. resp.UniqueCode = excelInfo.UniqueCode
  258. // 生成excel文件
  259. go excel.UpdateExcelInfoFileUrl(excelInfo)
  260. //新增操作日志
  261. //{
  262. // excelLog := &data_manage.ExcelInfoLog{
  263. // //ExcelInfoLogId: 0,
  264. // ExcelInfoId: excelInfo.ExcelInfoId,
  265. // ExcelName: req.ExcelName,
  266. // ExcelClassifyId: req.ExcelClassifyId,
  267. // SysUserId: sysUser.AdminId,
  268. // SysUserRealName: sysUser.RealName,
  269. // UniqueCode: excelInfo.UniqueCode,
  270. // CreateTime: time.Now(),
  271. // Content: string(c.Ctx.Input.RequestBody),
  272. // Status: "新增表格",
  273. // Method: c.Ctx.Input.URI(),
  274. // }
  275. // go data_manage.AddExcelInfoLog(excelLog)
  276. //}
  277. br.Ret = 200
  278. br.Success = true
  279. br.Msg = "保存成功"
  280. br.Data = resp
  281. br.IsAddLog = false //数据量太大了,不写入日志吧
  282. }
  283. // BaseExcelDetail
  284. // @Title 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  285. // @Description 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  286. // @Param UniqueCode query string true "excel唯一编码"
  287. // @Success 200 {object} response.ExcelListResp
  288. // @router /excel/base [get]
  289. func (c *CustomAnalysisController) BaseExcelDetail() {
  290. br := new(models.BaseResponse).Init()
  291. defer func() {
  292. c.Data["json"] = br
  293. c.ServeJSON()
  294. }()
  295. sysUser := c.SysUser
  296. if sysUser == nil {
  297. br.Msg = "请登录"
  298. br.ErrMsg = "请登录,SysUser Is Empty"
  299. br.Ret = 408
  300. return
  301. }
  302. uniqueCode := c.GetString("UniqueCode")
  303. if uniqueCode == `` {
  304. br.Msg = "请选择表格"
  305. br.ErrMsg = "UniqueCode未传"
  306. br.IsSendEmail = false
  307. return
  308. }
  309. resp := response.FindExcelInfoResp{}
  310. // 获取数据详情
  311. excelDetail, err := excelModel.GetNoContentExcelInfoByUniqueCode(uniqueCode)
  312. if err != nil {
  313. if err.Error() == utils.ErrNoRow() {
  314. br.Ret = 200
  315. br.Success = true
  316. br.Msg = "获取成功"
  317. br.Data = resp
  318. return
  319. }
  320. br.Msg = "获取表格事变"
  321. br.ErrMsg = err.Error()
  322. return
  323. }
  324. resp.IsFind = true
  325. resp.ExcelInfo = excelDetail
  326. if excelDetail != nil {
  327. sheetList, err := excelModel.GetAllSheetItemList(excelDetail.ExcelInfoId)
  328. if err != nil {
  329. br.Msg = "获取sheet失败"
  330. br.ErrMsg = "获取sheet失败,err:" + err.Error()
  331. return
  332. }
  333. if len(sheetList) > 0 {
  334. sheetIdList := make([]int, 0)
  335. for _, v := range sheetList {
  336. sheetIdList = append(sheetIdList, v.ExcelSheetId)
  337. }
  338. // 获取所有sheet的第一页的数据
  339. sheetDataList, err := excelModel.GetSheetDataListBySheetIdListAndPage(sheetIdList, 1)
  340. if err != nil {
  341. br.Msg = "获取sheet中的数据失败"
  342. br.ErrMsg = "获取sheet中的数据失败,err:" + err.Error()
  343. return
  344. }
  345. sheetDataMap := make(map[int]*excelModel.ExcelSheetData)
  346. for _, v := range sheetDataList {
  347. sheetDataMap[v.ExcelSheetId] = v
  348. }
  349. for k, v := range sheetList {
  350. sheetData, ok := sheetDataMap[v.ExcelSheetId]
  351. if !ok {
  352. continue
  353. }
  354. v.Data = sheetData
  355. sheetList[k] = v
  356. }
  357. }
  358. // TODO 合并单元格信息、计算公式
  359. resp.SheetList = sheetList
  360. }
  361. //resp := response.ExcelListResp{
  362. // Paging: page,
  363. // List: list,
  364. //}
  365. br.Ret = 200
  366. br.Success = true
  367. br.Msg = "获取成功"
  368. br.Data = resp
  369. }
  370. // ExcelDataList
  371. // @Title 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  372. // @Description 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  373. // @Param UniqueCode query string true "excel唯一编码"
  374. // @Param Page query int true "页码"
  375. // @Success 200 {object} response.ExcelListResp
  376. // @router /excel/data [get]
  377. func (c *CustomAnalysisController) ExcelDataList() {
  378. br := new(models.BaseResponse).Init()
  379. defer func() {
  380. c.Data["json"] = br
  381. c.ServeJSON()
  382. }()
  383. sysUser := c.SysUser
  384. if sysUser == nil {
  385. br.Msg = "请登录"
  386. br.ErrMsg = "请登录,SysUser Is Empty"
  387. br.Ret = 408
  388. return
  389. }
  390. uniqueCode := c.GetString("UniqueCode")
  391. if uniqueCode == `` {
  392. br.Msg = "请选择表格"
  393. br.ErrMsg = "UniqueCode未传"
  394. br.IsSendEmail = false
  395. return
  396. }
  397. page, _ := c.GetInt("Page")
  398. if page <= 0 {
  399. br.Msg = "页码异常"
  400. br.ErrMsg = "页码异常"
  401. br.IsSendEmail = false
  402. return
  403. }
  404. sheetList := make([]*excelModel.SheetItem, 0)
  405. // 获取数据详情
  406. excelDetail, err := excelModel.GetNoContentExcelInfoByUniqueCode(uniqueCode)
  407. if err != nil {
  408. if err.Error() == utils.ErrNoRow() {
  409. br.Ret = 200
  410. br.Success = true
  411. br.Msg = "获取成功"
  412. br.Data = sheetList
  413. return
  414. }
  415. br.Msg = "获取表格事变"
  416. br.ErrMsg = err.Error()
  417. return
  418. }
  419. if excelDetail.Source != utils.CUSTOM_ANALYSIS_TABLE {
  420. br.Msg = "excel异常"
  421. br.ErrMsg = "excel异常"
  422. br.IsSendEmail = false
  423. return
  424. }
  425. if excelDetail != nil {
  426. sheetList, err = excelModel.GetAllNoConfigSheetItemList(excelDetail.ExcelInfoId)
  427. if err != nil {
  428. br.Msg = "获取sheet失败"
  429. br.ErrMsg = "获取sheet失败,err:" + err.Error()
  430. return
  431. }
  432. if len(sheetList) > 0 {
  433. sheetIdList := make([]int, 0)
  434. for _, v := range sheetList {
  435. sheetIdList = append(sheetIdList, v.ExcelSheetId)
  436. }
  437. // 获取所有sheet的第一页的数据
  438. sheetDataList, err := excelModel.GetSheetDataListBySheetIdListAndPage(sheetIdList, page)
  439. if err != nil {
  440. br.Msg = "获取sheet中的数据失败"
  441. br.ErrMsg = "获取sheet中的数据失败,err:" + err.Error()
  442. return
  443. }
  444. sheetDataMap := make(map[int]*excelModel.ExcelSheetData)
  445. for _, v := range sheetDataList {
  446. sheetDataMap[v.ExcelSheetId] = v
  447. }
  448. for k, v := range sheetList {
  449. sheetData, ok := sheetDataMap[v.ExcelSheetId]
  450. if !ok {
  451. continue
  452. }
  453. v.Data = sheetData
  454. sheetList[k] = v
  455. }
  456. }
  457. // TODO 合并单元格信息、计算公式
  458. }
  459. //resp := response.ExcelListResp{
  460. // Paging: page,
  461. // List: list,
  462. //}
  463. br.Ret = 200
  464. br.Success = true
  465. br.Msg = "获取成功"
  466. br.Data = sheetList
  467. }
  468. // TODO 修改表格后,更新指标信息