custom_analysis.go 13 KB

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