trade_analysis_table.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767
  1. package trade_analysis
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. "eta/eta_api/models/data_manage/excel"
  7. tradeAnalysisModel "eta/eta_api/models/data_manage/trade_analysis"
  8. tradeAnalysisRequest "eta/eta_api/models/data_manage/trade_analysis/request"
  9. tradeAnalysisResponse "eta/eta_api/models/data_manage/trade_analysis/response"
  10. "eta/eta_api/services"
  11. tradeAnalysisService "eta/eta_api/services/data/trade_analysis"
  12. "eta/eta_api/utils"
  13. "fmt"
  14. "github.com/tealeg/xlsx"
  15. "os"
  16. "path/filepath"
  17. "reflect"
  18. "strconv"
  19. "strings"
  20. "time"
  21. )
  22. // TradeAnalysisTableController 多空分析表格
  23. type TradeAnalysisTableController struct {
  24. controllers.BaseAuthController
  25. }
  26. // Preview
  27. // @Title 表格预览
  28. // @Description 表格预览
  29. // @Param request body request.TablePreviewReq true "type json string"
  30. // @Success 200 {object} response.TableResp
  31. // @router /table/preview [post]
  32. func (this *TradeAnalysisTableController) Preview() {
  33. br := new(models.BaseResponse).Init()
  34. defer func() {
  35. if br.ErrMsg == "" {
  36. br.IsSendEmail = false
  37. }
  38. this.Data["json"] = br
  39. this.ServeJSON()
  40. }()
  41. sysUser := this.SysUser
  42. if sysUser == nil {
  43. br.Msg = "请登录"
  44. br.ErrMsg = "请登录,SysUser Is Empty"
  45. br.Ret = 408
  46. return
  47. }
  48. var req tradeAnalysisRequest.TablePreviewReq
  49. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  50. br.Msg = "参数解析异常"
  51. br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
  52. return
  53. }
  54. // 校验配置
  55. pass, tips := tradeAnalysisService.CheckAnalysisTableExtraConfig(req.TableConfig)
  56. if !pass {
  57. br.Msg = tips
  58. return
  59. }
  60. // 根据配置获取表格行数据
  61. tableRows, e := tradeAnalysisService.GetTableRowsDataByConfig(req.TableConfig)
  62. if e != nil {
  63. br.Msg = "操作失败"
  64. br.ErrMsg = fmt.Sprintf("获取表格行数据失败, %v", e)
  65. return
  66. }
  67. // 响应
  68. resp := new(tradeAnalysisResponse.TableResp)
  69. resp.TableData = tableRows
  70. resp.TableName = strings.TrimSpace(req.TableName)
  71. resp.ClassifyId = req.ClassifyId
  72. resp.TableConfig = req.TableConfig
  73. resp.TableCols = make([]*tradeAnalysisModel.TradeAnalysisTableColumnItem, 0)
  74. if len(req.TableCols) > 0 {
  75. resp.TableCols = req.TableCols
  76. }
  77. if len(req.TableCols) == 0 {
  78. // 获取默认的表头信息
  79. colOb := new(tradeAnalysisModel.TradeAnalysisTableColumn)
  80. cond := fmt.Sprintf(` AND %s = 0`, colOb.Cols().ExcelInfoId)
  81. defaultCols, e := colOb.GetItemsByCondition(cond, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", colOb.Cols().Sort))
  82. if e != nil {
  83. br.Msg = "操作失败"
  84. br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
  85. return
  86. }
  87. for _, v := range defaultCols {
  88. resp.TableCols = append(resp.TableCols, v.Format2Item())
  89. }
  90. }
  91. br.Data = resp
  92. br.Ret = 200
  93. br.Success = true
  94. br.Msg = "操作成功"
  95. }
  96. // Save
  97. // @Title 保存表格
  98. // @Description 保存表格
  99. // @Param request body request.TableSaveReq true "type json string"
  100. // @Success 200 string "操作成功"
  101. // @router /table/save [post]
  102. func (this *TradeAnalysisTableController) Save() {
  103. br := new(models.BaseResponse).Init()
  104. defer func() {
  105. if br.ErrMsg == "" {
  106. br.IsSendEmail = false
  107. }
  108. this.Data["json"] = br
  109. this.ServeJSON()
  110. }()
  111. sysUser := this.SysUser
  112. if sysUser == nil {
  113. br.Msg = "请登录"
  114. br.ErrMsg = "请登录,SysUser Is Empty"
  115. br.Ret = 408
  116. return
  117. }
  118. var req tradeAnalysisRequest.TableSaveReq
  119. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  120. br.Msg = "参数解析异常"
  121. br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
  122. return
  123. }
  124. // 校验配置
  125. pass, tips := tradeAnalysisService.CheckAnalysisTableExtraConfig(req.TableConfig)
  126. if !pass {
  127. br.Msg = tips
  128. return
  129. }
  130. req.TableName = strings.TrimSpace(req.TableName)
  131. if req.TableName == "" {
  132. br.Msg = "请输入表格名称"
  133. return
  134. }
  135. if req.ClassifyId <= 0 {
  136. br.Msg = "请选择分类"
  137. return
  138. }
  139. configByte, e := json.Marshal(req.TableConfig)
  140. if e != nil {
  141. br.Msg = "操作失败"
  142. br.ErrMsg = fmt.Sprintf("表格配置JSON格式化失败, %v", e)
  143. return
  144. }
  145. extraConfig := string(configByte)
  146. // 新增表格
  147. var excelId int
  148. if req.ExcelInfoId <= 0 {
  149. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10) + "_" + utils.GetRandString(10)
  150. newExcel := &excel.ExcelInfo{
  151. ExcelName: req.TableName,
  152. Source: utils.TRADE_ANALYSIS_TABLE,
  153. ExcelType: 1,
  154. UniqueCode: utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
  155. ExcelClassifyId: req.ClassifyId,
  156. SysUserId: sysUser.AdminId,
  157. SysUserRealName: sysUser.RealName,
  158. ExtraConfig: extraConfig,
  159. UpdateUserId: sysUser.AdminId,
  160. UpdateUserRealName: sysUser.RealName,
  161. ModifyTime: time.Now(),
  162. CreateTime: time.Now(),
  163. }
  164. if e := newExcel.Create(); e != nil {
  165. br.Msg = "操作失败"
  166. br.ErrMsg = fmt.Sprintf("新增表格失败, %v", e)
  167. return
  168. }
  169. excelId = newExcel.ExcelInfoId
  170. }
  171. // 更新表格
  172. if req.ExcelInfoId > 0 {
  173. excelItem, e := excel.GetExcelInfoById(req.ExcelInfoId)
  174. if e != nil {
  175. if e.Error() == utils.ErrNoRow() {
  176. br.Msg = "表格不存在, 请刷新页面"
  177. return
  178. }
  179. br.Msg = "操作失败"
  180. br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
  181. return
  182. }
  183. excelItem.ExcelName = req.TableName
  184. excelItem.ExcelClassifyId = req.ClassifyId
  185. excelItem.ExtraConfig = extraConfig
  186. excelItem.UpdateUserId = sysUser.AdminId
  187. excelItem.UpdateUserRealName = sysUser.RealName
  188. excelItem.ModifyTime = time.Now()
  189. updateCols := []string{"ExcelName", "ExcelClassifyId", "ExtraConfig", "UpdateUserId", "UpdateUserRealName", "ModifyTime"}
  190. if e = excelItem.Update(updateCols); e != nil {
  191. br.Msg = "操作失败"
  192. br.ErrMsg = fmt.Sprintf("更新表格信息失败, %v", e)
  193. return
  194. }
  195. excelId = excelItem.ExcelInfoId
  196. }
  197. if excelId <= 0 {
  198. br.Msg = "操作失败"
  199. br.ErrMsg = fmt.Sprintf("表格ID异常: %d", excelId)
  200. return
  201. }
  202. // 表头信息
  203. columnOb := new(tradeAnalysisModel.TradeAnalysisTableColumn)
  204. configColumns := make([]*tradeAnalysisModel.TradeAnalysisTableColumn, 0)
  205. if len(req.TableCols) > 0 {
  206. for _, v := range req.TableCols {
  207. t := new(tradeAnalysisModel.TradeAnalysisTableColumn)
  208. t.ExcelInfoId = excelId
  209. t.ColumnKey = v.ColumnKey
  210. t.ColumnName = v.ColumnName
  211. t.ColumnNameEn = v.ColumnNameEn
  212. t.Sort = v.Sort
  213. t.IsMust = v.IsMust
  214. t.IsShow = v.IsShow
  215. t.IsSort = v.IsSort
  216. t.CreateTime = time.Now()
  217. t.ModifyTime = time.Now()
  218. configColumns = append(configColumns, t)
  219. }
  220. } else {
  221. // 获取默认的表头信息
  222. cond := fmt.Sprintf(` AND %s = 0`, columnOb.Cols().ExcelInfoId)
  223. defaultCols, e := columnOb.GetItemsByCondition(cond, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", columnOb.Cols().Sort))
  224. if e != nil {
  225. br.Msg = "操作失败"
  226. br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
  227. return
  228. }
  229. for _, v := range defaultCols {
  230. v.Id = 0
  231. v.ExcelInfoId = excelId
  232. v.CreateTime = time.Now()
  233. v.ModifyTime = time.Now()
  234. configColumns = append(configColumns, v)
  235. }
  236. }
  237. // 删除并新增表头
  238. {
  239. cond := fmt.Sprintf(`%s = ?`, columnOb.Cols().ExcelInfoId)
  240. pars := make([]interface{}, 0)
  241. pars = append(pars, excelId)
  242. if e = columnOb.RemoveByCondition(cond, pars); e != nil {
  243. br.Msg = "操作失败"
  244. br.ErrMsg = fmt.Sprintf("删除原表头配置失败, %v", e)
  245. return
  246. }
  247. if e = columnOb.CreateMulti(configColumns); e != nil {
  248. br.Msg = "操作失败"
  249. br.ErrMsg = fmt.Sprintf("批量新增表头配置失败, %v", e)
  250. return
  251. }
  252. }
  253. br.Data = excelId
  254. br.Ret = 200
  255. br.Success = true
  256. br.Msg = "操作成功"
  257. }
  258. // Detail
  259. // @Title 表格详情
  260. // @Description 表格详情
  261. // @Param ExcelInfoId query int true "表格ID"
  262. // @Success 200 {object} response.TableResp
  263. // @router /table/detail [get]
  264. func (this *TradeAnalysisTableController) Detail() {
  265. br := new(models.BaseResponse).Init()
  266. defer func() {
  267. if br.ErrMsg == "" {
  268. br.IsSendEmail = false
  269. }
  270. this.Data["json"] = br
  271. this.ServeJSON()
  272. }()
  273. sysUser := this.SysUser
  274. if sysUser == nil {
  275. br.Msg = "请登录"
  276. br.ErrMsg = "请登录,SysUser Is Empty"
  277. br.Ret = 408
  278. return
  279. }
  280. excelId, _ := this.GetInt("ExcelInfoId", 0)
  281. if excelId <= 0 {
  282. br.Msg = "参数有误"
  283. br.ErrMsg = fmt.Sprintf("表格ID不可为空, ID: %d", excelId)
  284. return
  285. }
  286. // 获取表格信息
  287. excelItem, e := excel.GetExcelInfoById(excelId)
  288. if e != nil {
  289. if e.Error() == utils.ErrNoRow() {
  290. br.Msg = "表格不存在, 请刷新页面"
  291. return
  292. }
  293. br.Msg = "获取失败"
  294. br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
  295. return
  296. }
  297. if excelItem.Source != utils.TRADE_ANALYSIS_TABLE {
  298. br.Msg = "获取失败"
  299. br.ErrMsg = fmt.Sprintf("表格类型异常, Source: %d", excelItem.Source)
  300. return
  301. }
  302. var tableConfig tradeAnalysisModel.TableExtraConfig
  303. if e = json.Unmarshal([]byte(excelItem.ExtraConfig), &tableConfig); e != nil {
  304. br.Msg = "获取失败"
  305. br.ErrMsg = fmt.Sprintf("解析表格配置失败, err: %v, config: %s", e, excelItem.ExtraConfig)
  306. return
  307. }
  308. // 校验配置
  309. pass, tips := tradeAnalysisService.CheckAnalysisTableExtraConfig(tableConfig)
  310. if !pass {
  311. br.Msg = "获取失败"
  312. br.ErrMsg = fmt.Sprintf("表格配置有误, Msg: %s", tips)
  313. return
  314. }
  315. // 根据配置获取表格行数据
  316. tableRows, e := tradeAnalysisService.GetTableRowsDataByConfig(tableConfig)
  317. if e != nil {
  318. br.Msg = "获取失败"
  319. br.ErrMsg = fmt.Sprintf("获取表格行数据失败, %v", e)
  320. return
  321. }
  322. // 响应
  323. resp := new(tradeAnalysisResponse.TableResp)
  324. resp.ExcelInfoId = excelItem.ExcelInfoId
  325. resp.TableData = tableRows
  326. resp.TableName = strings.TrimSpace(excelItem.ExcelName)
  327. resp.ClassifyId = excelItem.ExcelClassifyId
  328. resp.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, excelItem.ModifyTime)
  329. resp.TableConfig = tableConfig
  330. resp.TableCols = make([]*tradeAnalysisModel.TradeAnalysisTableColumnItem, 0)
  331. // 获取表头信息
  332. {
  333. colOb := new(tradeAnalysisModel.TradeAnalysisTableColumn)
  334. cond := fmt.Sprintf(" AND %s = ?", colOb.Cols().ExcelInfoId)
  335. pars := make([]interface{}, 0)
  336. pars = append(pars, excelId)
  337. configCols, e := colOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", colOb.Cols().Sort))
  338. if e != nil {
  339. br.Msg = "获取失败"
  340. br.ErrMsg = fmt.Sprintf("获取表格表头设置失败, %v", e)
  341. return
  342. }
  343. // 表头信息为空
  344. if len(configCols) == 0 {
  345. defaultCols, e := colOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", colOb.Cols().Sort))
  346. if e != nil {
  347. br.Msg = "操作失败"
  348. br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
  349. return
  350. }
  351. configCols = defaultCols
  352. }
  353. for _, v := range configCols {
  354. resp.TableCols = append(resp.TableCols, v.Format2Item())
  355. }
  356. }
  357. resp.Button = services.GetTradeAnalysisTableOpButton(excelItem.SysUserId, sysUser.AdminId, sysUser.RoleTypeCode, false)
  358. br.Data = resp
  359. br.Ret = 200
  360. br.Success = true
  361. br.Msg = "获取成功"
  362. }
  363. // SaveAs
  364. // @Title 表格另存为
  365. // @Description 表格另存为
  366. // @Param request body request.TableSaveAsReq true "type json string"
  367. // @Success 200 string "操作成功"
  368. // @router /table/save_as [post]
  369. func (this *TradeAnalysisTableController) SaveAs() {
  370. br := new(models.BaseResponse).Init()
  371. defer func() {
  372. if br.ErrMsg == "" {
  373. br.IsSendEmail = false
  374. }
  375. this.Data["json"] = br
  376. this.ServeJSON()
  377. }()
  378. sysUser := this.SysUser
  379. if sysUser == nil {
  380. br.Msg = "请登录"
  381. br.ErrMsg = "请登录,SysUser Is Empty"
  382. br.Ret = 408
  383. return
  384. }
  385. var req tradeAnalysisRequest.TableSaveAsReq
  386. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  387. br.Msg = "参数解析异常"
  388. br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
  389. return
  390. }
  391. req.TableName = strings.TrimSpace(req.TableName)
  392. if req.TableName == "" {
  393. br.Msg = "请输入表格名称"
  394. return
  395. }
  396. if req.ClassifyId <= 0 {
  397. br.Msg = "请选择分类"
  398. return
  399. }
  400. // 原表格
  401. excelItem, e := excel.GetExcelInfoById(req.ExcelInfoId)
  402. if e != nil {
  403. if e.Error() == utils.ErrNoRow() {
  404. br.Msg = "原表格不存在, 请刷新页面"
  405. return
  406. }
  407. br.Msg = "操作失败"
  408. br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
  409. return
  410. }
  411. // 新表格
  412. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10) + "_" + utils.GetRandString(10)
  413. newExcel := &excel.ExcelInfo{
  414. ExcelName: req.TableName,
  415. Source: utils.TRADE_ANALYSIS_TABLE,
  416. ExcelType: 1,
  417. UniqueCode: utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
  418. ExcelClassifyId: req.ClassifyId,
  419. SysUserId: sysUser.AdminId,
  420. SysUserRealName: sysUser.RealName,
  421. ExtraConfig: excelItem.ExtraConfig,
  422. UpdateUserId: sysUser.AdminId,
  423. UpdateUserRealName: sysUser.RealName,
  424. ModifyTime: time.Now(),
  425. CreateTime: time.Now(),
  426. }
  427. if e := newExcel.Create(); e != nil {
  428. br.Msg = "操作失败"
  429. br.ErrMsg = fmt.Sprintf("新增表格失败, %v", e)
  430. return
  431. }
  432. // 表头信息
  433. columnOb := new(tradeAnalysisModel.TradeAnalysisTableColumn)
  434. configColumns := make([]*tradeAnalysisModel.TradeAnalysisTableColumn, 0)
  435. {
  436. cond := fmt.Sprintf(` AND %s = ?`, columnOb.Cols().ExcelInfoId)
  437. pars := make([]interface{}, 0)
  438. pars = append(pars, req.ExcelInfoId)
  439. originColumns, e := columnOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", columnOb.Cols().Sort))
  440. if e != nil {
  441. br.Msg = "操作失败"
  442. br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
  443. return
  444. }
  445. for _, v := range originColumns {
  446. v.Id = 0
  447. v.ExcelInfoId = newExcel.ExcelInfoId
  448. v.CreateTime = time.Now()
  449. v.ModifyTime = time.Now()
  450. configColumns = append(configColumns, v)
  451. }
  452. }
  453. // 没找到就获取默认的表头信息
  454. if len(configColumns) == 0 {
  455. cond := fmt.Sprintf(` AND %s = 0`, columnOb.Cols().ExcelInfoId)
  456. defaultCols, e := columnOb.GetItemsByCondition(cond, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", columnOb.Cols().Sort))
  457. if e != nil {
  458. br.Msg = "操作失败"
  459. br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
  460. return
  461. }
  462. for _, v := range defaultCols {
  463. v.Id = 0
  464. v.ExcelInfoId = newExcel.ExcelInfoId
  465. v.CreateTime = time.Now()
  466. v.ModifyTime = time.Now()
  467. configColumns = append(configColumns, v)
  468. }
  469. }
  470. // 新增表头
  471. if e = columnOb.CreateMulti(configColumns); e != nil {
  472. br.Msg = "操作失败"
  473. br.ErrMsg = fmt.Sprintf("批量新增表头配置失败, %v", e)
  474. return
  475. }
  476. br.Data = newExcel.ExcelInfoId
  477. br.Ret = 200
  478. br.Success = true
  479. br.Msg = "操作成功"
  480. }
  481. // Refresh
  482. // @Title 刷新表格
  483. // @Description 刷新表格
  484. // @Param request body request.TableRefreshReq true "type json string"
  485. // @Success 200 string "操作成功"
  486. // @router /table/refresh [post]
  487. func (this *TradeAnalysisTableController) Refresh() {
  488. br := new(models.BaseResponse).Init()
  489. defer func() {
  490. if br.ErrMsg == "" {
  491. br.IsSendEmail = false
  492. }
  493. this.Data["json"] = br
  494. this.ServeJSON()
  495. }()
  496. sysUser := this.SysUser
  497. if sysUser == nil {
  498. br.Msg = "请登录"
  499. br.ErrMsg = "请登录,SysUser Is Empty"
  500. br.Ret = 408
  501. return
  502. }
  503. var req tradeAnalysisRequest.TableRefreshReq
  504. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  505. br.Msg = "参数解析异常"
  506. br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
  507. return
  508. }
  509. if req.ExcelInfoId <= 0 {
  510. br.Msg = "参数有误"
  511. br.ErrMsg = fmt.Sprintf("表格ID有误: %d", req.ExcelInfoId)
  512. return
  513. }
  514. // 获取表格信息
  515. _, e := excel.GetExcelInfoById(req.ExcelInfoId)
  516. if e != nil {
  517. if e.Error() == utils.ErrNoRow() {
  518. br.Msg = "表格不存在, 请刷新页面"
  519. return
  520. }
  521. br.Msg = "操作失败"
  522. br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
  523. return
  524. }
  525. // TODO:刷个啥呢...
  526. br.Ret = 200
  527. br.Success = true
  528. br.Msg = "操作成功"
  529. }
  530. // Remove
  531. // @Title 删除表格
  532. // @Description 删除表格
  533. // @Param request body request.TableRemoveReq true "type json string"
  534. // @Success 200 string "操作成功"
  535. // @router /table/remove [post]
  536. func (this *TradeAnalysisTableController) Remove() {
  537. br := new(models.BaseResponse).Init()
  538. defer func() {
  539. if br.ErrMsg == "" {
  540. br.IsSendEmail = false
  541. }
  542. this.Data["json"] = br
  543. this.ServeJSON()
  544. }()
  545. sysUser := this.SysUser
  546. if sysUser == nil {
  547. br.Msg = "请登录"
  548. br.ErrMsg = "请登录,SysUser Is Empty"
  549. br.Ret = 408
  550. return
  551. }
  552. var req tradeAnalysisRequest.TableRemoveReq
  553. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  554. br.Msg = "参数解析异常"
  555. br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
  556. return
  557. }
  558. if req.ExcelInfoId <= 0 {
  559. br.Msg = "参数有误"
  560. br.ErrMsg = fmt.Sprintf("表格ID有误: %d", req.ExcelInfoId)
  561. return
  562. }
  563. // 获取表格信息
  564. excelItem, e := excel.GetExcelInfoById(req.ExcelInfoId)
  565. if e != nil {
  566. if e.Error() == utils.ErrNoRow() {
  567. br.Ret = 200
  568. br.Success = true
  569. br.Msg = "操作成功"
  570. return
  571. }
  572. br.Msg = "获取失败"
  573. br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
  574. return
  575. }
  576. // 软删
  577. excelItem.IsDelete = 1
  578. excelItem.UpdateUserId = sysUser.AdminId
  579. excelItem.UpdateUserRealName = sysUser.RealName
  580. excelItem.ModifyTime = time.Now()
  581. updateCols := []string{"IsDelete", "UpdateUserId", "UpdateUserRealName", "ModifyTime"}
  582. if e = excelItem.Update(updateCols); e != nil {
  583. br.Msg = "操作失败"
  584. br.ErrMsg = fmt.Sprintf("删除表格信息失败, %v", e)
  585. return
  586. }
  587. br.Ret = 200
  588. br.Success = true
  589. br.Msg = "操作成功"
  590. }
  591. // Download
  592. // @Title 下载表格
  593. // @Description 下载表格
  594. // @Param ExcelInfoId query int true "表格ID"
  595. // @Success 200 下载成功
  596. // @router /table/download [get]
  597. func (this *TradeAnalysisTableController) Download() {
  598. br := new(models.BaseResponse).Init()
  599. defer func() {
  600. if br.ErrMsg == "" {
  601. br.IsSendEmail = false
  602. utils.FileLog.Info(fmt.Sprintf("多空分析表格-下载失败, ErrMsg: %s", br.ErrMsg))
  603. }
  604. this.Data["json"] = br
  605. this.ServeJSON()
  606. }()
  607. sysUser := this.SysUser
  608. if sysUser == nil {
  609. br.Msg = "请登录"
  610. br.ErrMsg = "请登录,SysUser Is Empty"
  611. br.Ret = 408
  612. return
  613. }
  614. excelId, _ := this.GetInt("ExcelInfoId")
  615. if excelId <= 0 {
  616. br.Msg = "参数有误"
  617. br.ErrMsg = fmt.Sprintf("表格ID有误: %d", excelId)
  618. return
  619. }
  620. // 获取表格信息
  621. excelItem, e := excel.GetExcelInfoById(excelId)
  622. if e != nil {
  623. br.Msg = "下载失败"
  624. br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
  625. return
  626. }
  627. // 获取表头信息
  628. configCols := make([]*tradeAnalysisModel.TradeAnalysisTableColumn, 0)
  629. {
  630. colOb := new(tradeAnalysisModel.TradeAnalysisTableColumn)
  631. cond := fmt.Sprintf(" AND %s = ?", colOb.Cols().ExcelInfoId)
  632. pars := make([]interface{}, 0)
  633. pars = append(pars, excelId)
  634. items, e := colOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", colOb.Cols().Sort))
  635. if e != nil {
  636. br.Msg = "下载失败"
  637. br.ErrMsg = fmt.Sprintf("获取表格表头设置失败, %v", e)
  638. return
  639. }
  640. configCols = items
  641. // 表头信息为空
  642. if len(configCols) == 0 {
  643. defaultCols, e := colOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", colOb.Cols().Sort))
  644. if e != nil {
  645. br.Msg = "下载失败"
  646. br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
  647. return
  648. }
  649. configCols = defaultCols
  650. }
  651. }
  652. if len(configCols) == 0 {
  653. br.Msg = "下载失败"
  654. br.ErrMsg = fmt.Sprintf("表头信息异常")
  655. return
  656. }
  657. // 根据配置获取表格行数据
  658. var tableConfig tradeAnalysisModel.TableExtraConfig
  659. if e = json.Unmarshal([]byte(excelItem.ExtraConfig), &tableConfig); e != nil {
  660. br.Msg = "下载失败"
  661. br.ErrMsg = fmt.Sprintf("解析表格配置失败, err: %v, config: %s", e, excelItem.ExtraConfig)
  662. return
  663. }
  664. tableRows, e := tradeAnalysisService.GetTableRowsDataByConfig(tableConfig)
  665. if e != nil {
  666. br.Msg = "下载失败"
  667. br.ErrMsg = fmt.Sprintf("获取表格行数据失败, %v", e)
  668. return
  669. }
  670. // 生成excel
  671. dir, _ := os.Executable()
  672. exPath := filepath.Dir(dir)
  673. downFile := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  674. xlsxFile := xlsx.NewFile()
  675. sheetNew := new(xlsx.Sheet)
  676. sheetNew, e = xlsxFile.AddSheet("Sheet1")
  677. if e != nil {
  678. br.Msg = "下载失败"
  679. br.ErrMsg = fmt.Sprintf("生成Sheet失败, %v", e)
  680. return
  681. }
  682. // 第一行-表头
  683. headerRow := sheetNew.AddRow()
  684. var headerKeys []string
  685. for _, v := range configCols {
  686. if v.IsShow == 0 {
  687. continue
  688. }
  689. headerRow.AddCell().SetValue(v.ColumnName)
  690. headerKeys = append(headerKeys, v.ColumnKey)
  691. }
  692. // 数据行
  693. for _, v := range tableRows {
  694. row := sheetNew.AddRow()
  695. rv := reflect.ValueOf(v)
  696. // v为指针先解引用
  697. if rv.Kind() == reflect.Ptr {
  698. rv = rv.Elem()
  699. }
  700. // 获取对应key的值
  701. for _, h := range headerKeys {
  702. fieldVal := rv.FieldByName(h)
  703. if fieldVal.IsValid() {
  704. cell := row.AddCell()
  705. cell.SetString(fmt.Sprint(fieldVal.Interface()))
  706. continue
  707. }
  708. row.AddCell().SetString("")
  709. }
  710. }
  711. // 保存文件
  712. if e = xlsxFile.Save(downFile); e != nil {
  713. br.Msg = "下载失败"
  714. br.ErrMsg = fmt.Sprintf("保存文件内容失败, %v", e)
  715. return
  716. }
  717. fileName := fmt.Sprintf(`%s%s.xlsx`, excelItem.ExcelName, time.Now().Format("06.01.02"))
  718. this.Ctx.Output.Download(downFile, fileName)
  719. defer func() {
  720. _ = os.Remove(downFile)
  721. }()
  722. br.Ret = 200
  723. br.Success = true
  724. br.Msg = "下载成功"
  725. }