|
@@ -0,0 +1,767 @@
|
|
|
+package trade_analysis
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "eta/eta_api/controllers"
|
|
|
+ "eta/eta_api/models"
|
|
|
+ "eta/eta_api/models/data_manage/excel"
|
|
|
+ tradeAnalysisModel "eta/eta_api/models/data_manage/trade_analysis"
|
|
|
+ tradeAnalysisRequest "eta/eta_api/models/data_manage/trade_analysis/request"
|
|
|
+ tradeAnalysisResponse "eta/eta_api/models/data_manage/trade_analysis/response"
|
|
|
+ "eta/eta_api/services"
|
|
|
+ tradeAnalysisService "eta/eta_api/services/data/trade_analysis"
|
|
|
+ "eta/eta_api/utils"
|
|
|
+ "fmt"
|
|
|
+ "github.com/tealeg/xlsx"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "reflect"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+// TradeAnalysisTableController 多空分析表格
|
|
|
+type TradeAnalysisTableController struct {
|
|
|
+ controllers.BaseAuthController
|
|
|
+}
|
|
|
+
|
|
|
+// Preview
|
|
|
+// @Title 表格预览
|
|
|
+// @Description 表格预览
|
|
|
+// @Param request body request.TablePreviewReq true "type json string"
|
|
|
+// @Success 200 {object} response.TableResp
|
|
|
+// @router /table/preview [post]
|
|
|
+func (this *TradeAnalysisTableController) Preview() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ defer func() {
|
|
|
+ if br.ErrMsg == "" {
|
|
|
+ br.IsSendEmail = false
|
|
|
+ }
|
|
|
+ this.Data["json"] = br
|
|
|
+ this.ServeJSON()
|
|
|
+ }()
|
|
|
+ sysUser := this.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请登录"
|
|
|
+ br.ErrMsg = "请登录,SysUser Is Empty"
|
|
|
+ br.Ret = 408
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var req tradeAnalysisRequest.TablePreviewReq
|
|
|
+ if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
|
|
|
+ br.Msg = "参数解析异常"
|
|
|
+ br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 校验配置
|
|
|
+ pass, tips := tradeAnalysisService.CheckAnalysisTableExtraConfig(req.TableConfig)
|
|
|
+ if !pass {
|
|
|
+ br.Msg = tips
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据配置获取表格行数据
|
|
|
+ tableRows, e := tradeAnalysisService.GetTableRowsDataByConfig(req.TableConfig)
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格行数据失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 响应
|
|
|
+ resp := new(tradeAnalysisResponse.TableResp)
|
|
|
+ resp.TableData = tableRows
|
|
|
+ resp.TableName = strings.TrimSpace(req.TableName)
|
|
|
+ resp.ClassifyId = req.ClassifyId
|
|
|
+ resp.TableConfig = req.TableConfig
|
|
|
+ resp.TableCols = make([]*tradeAnalysisModel.TradeAnalysisTableColumnItem, 0)
|
|
|
+ if len(req.TableCols) > 0 {
|
|
|
+ resp.TableCols = req.TableCols
|
|
|
+ }
|
|
|
+ if len(req.TableCols) == 0 {
|
|
|
+ // 获取默认的表头信息
|
|
|
+ colOb := new(tradeAnalysisModel.TradeAnalysisTableColumn)
|
|
|
+ cond := fmt.Sprintf(` AND %s = 0`, colOb.Cols().ExcelInfoId)
|
|
|
+ defaultCols, e := colOb.GetItemsByCondition(cond, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", colOb.Cols().Sort))
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range defaultCols {
|
|
|
+ resp.TableCols = append(resp.TableCols, v.Format2Item())
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ br.Data = resp
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = "操作成功"
|
|
|
+}
|
|
|
+
|
|
|
+// Save
|
|
|
+// @Title 保存表格
|
|
|
+// @Description 保存表格
|
|
|
+// @Param request body request.TableSaveReq true "type json string"
|
|
|
+// @Success 200 string "操作成功"
|
|
|
+// @router /table/save [post]
|
|
|
+func (this *TradeAnalysisTableController) Save() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ defer func() {
|
|
|
+ if br.ErrMsg == "" {
|
|
|
+ br.IsSendEmail = false
|
|
|
+ }
|
|
|
+ this.Data["json"] = br
|
|
|
+ this.ServeJSON()
|
|
|
+ }()
|
|
|
+ sysUser := this.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请登录"
|
|
|
+ br.ErrMsg = "请登录,SysUser Is Empty"
|
|
|
+ br.Ret = 408
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var req tradeAnalysisRequest.TableSaveReq
|
|
|
+ if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
|
|
|
+ br.Msg = "参数解析异常"
|
|
|
+ br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 校验配置
|
|
|
+ pass, tips := tradeAnalysisService.CheckAnalysisTableExtraConfig(req.TableConfig)
|
|
|
+ if !pass {
|
|
|
+ br.Msg = tips
|
|
|
+ return
|
|
|
+ }
|
|
|
+ req.TableName = strings.TrimSpace(req.TableName)
|
|
|
+ if req.TableName == "" {
|
|
|
+ br.Msg = "请输入表格名称"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if req.ClassifyId <= 0 {
|
|
|
+ br.Msg = "请选择分类"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ configByte, e := json.Marshal(req.TableConfig)
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("表格配置JSON格式化失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ extraConfig := string(configByte)
|
|
|
+
|
|
|
+ // 新增表格
|
|
|
+ var excelId int
|
|
|
+ if req.ExcelInfoId <= 0 {
|
|
|
+ timestamp := strconv.FormatInt(time.Now().UnixNano(), 10) + "_" + utils.GetRandString(10)
|
|
|
+ newExcel := &excel.ExcelInfo{
|
|
|
+ ExcelName: req.TableName,
|
|
|
+ Source: utils.TRADE_ANALYSIS_TABLE,
|
|
|
+ ExcelType: 1,
|
|
|
+ UniqueCode: utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
|
|
|
+ ExcelClassifyId: req.ClassifyId,
|
|
|
+ SysUserId: sysUser.AdminId,
|
|
|
+ SysUserRealName: sysUser.RealName,
|
|
|
+ ExtraConfig: extraConfig,
|
|
|
+ UpdateUserId: sysUser.AdminId,
|
|
|
+ UpdateUserRealName: sysUser.RealName,
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ }
|
|
|
+ if e := newExcel.Create(); e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("新增表格失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ excelId = newExcel.ExcelInfoId
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新表格
|
|
|
+ if req.ExcelInfoId > 0 {
|
|
|
+ excelItem, e := excel.GetExcelInfoById(req.ExcelInfoId)
|
|
|
+ if e != nil {
|
|
|
+ if e.Error() == utils.ErrNoRow() {
|
|
|
+ br.Msg = "表格不存在, 请刷新页面"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ excelItem.ExcelName = req.TableName
|
|
|
+ excelItem.ExcelClassifyId = req.ClassifyId
|
|
|
+ excelItem.ExtraConfig = extraConfig
|
|
|
+ excelItem.UpdateUserId = sysUser.AdminId
|
|
|
+ excelItem.UpdateUserRealName = sysUser.RealName
|
|
|
+ excelItem.ModifyTime = time.Now()
|
|
|
+ updateCols := []string{"ExcelName", "ExcelClassifyId", "ExtraConfig", "UpdateUserId", "UpdateUserRealName", "ModifyTime"}
|
|
|
+ if e = excelItem.Update(updateCols); e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("更新表格信息失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ excelId = excelItem.ExcelInfoId
|
|
|
+ }
|
|
|
+ if excelId <= 0 {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("表格ID异常: %d", excelId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 表头信息
|
|
|
+ columnOb := new(tradeAnalysisModel.TradeAnalysisTableColumn)
|
|
|
+ configColumns := make([]*tradeAnalysisModel.TradeAnalysisTableColumn, 0)
|
|
|
+ if len(req.TableCols) > 0 {
|
|
|
+ for _, v := range req.TableCols {
|
|
|
+ t := new(tradeAnalysisModel.TradeAnalysisTableColumn)
|
|
|
+ t.ExcelInfoId = excelId
|
|
|
+ t.ColumnKey = v.ColumnKey
|
|
|
+ t.ColumnName = v.ColumnName
|
|
|
+ t.ColumnNameEn = v.ColumnNameEn
|
|
|
+ t.Sort = v.Sort
|
|
|
+ t.IsMust = v.IsMust
|
|
|
+ t.IsShow = v.IsShow
|
|
|
+ t.IsSort = v.IsSort
|
|
|
+ t.CreateTime = time.Now()
|
|
|
+ t.ModifyTime = time.Now()
|
|
|
+ configColumns = append(configColumns, t)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 获取默认的表头信息
|
|
|
+ cond := fmt.Sprintf(` AND %s = 0`, columnOb.Cols().ExcelInfoId)
|
|
|
+ defaultCols, e := columnOb.GetItemsByCondition(cond, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", columnOb.Cols().Sort))
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range defaultCols {
|
|
|
+ v.Id = 0
|
|
|
+ v.ExcelInfoId = excelId
|
|
|
+ v.CreateTime = time.Now()
|
|
|
+ v.ModifyTime = time.Now()
|
|
|
+ configColumns = append(configColumns, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除并新增表头
|
|
|
+ {
|
|
|
+ cond := fmt.Sprintf(`%s = ?`, columnOb.Cols().ExcelInfoId)
|
|
|
+ pars := make([]interface{}, 0)
|
|
|
+ pars = append(pars, excelId)
|
|
|
+ if e = columnOb.RemoveByCondition(cond, pars); e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("删除原表头配置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if e = columnOb.CreateMulti(configColumns); e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("批量新增表头配置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ br.Data = excelId
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = "操作成功"
|
|
|
+}
|
|
|
+
|
|
|
+// Detail
|
|
|
+// @Title 表格详情
|
|
|
+// @Description 表格详情
|
|
|
+// @Param ExcelInfoId query int true "表格ID"
|
|
|
+// @Success 200 {object} response.TableResp
|
|
|
+// @router /table/detail [get]
|
|
|
+func (this *TradeAnalysisTableController) Detail() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ defer func() {
|
|
|
+ if br.ErrMsg == "" {
|
|
|
+ br.IsSendEmail = false
|
|
|
+ }
|
|
|
+ this.Data["json"] = br
|
|
|
+ this.ServeJSON()
|
|
|
+ }()
|
|
|
+ sysUser := this.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请登录"
|
|
|
+ br.ErrMsg = "请登录,SysUser Is Empty"
|
|
|
+ br.Ret = 408
|
|
|
+ return
|
|
|
+ }
|
|
|
+ excelId, _ := this.GetInt("ExcelInfoId", 0)
|
|
|
+ if excelId <= 0 {
|
|
|
+ br.Msg = "参数有误"
|
|
|
+ br.ErrMsg = fmt.Sprintf("表格ID不可为空, ID: %d", excelId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取表格信息
|
|
|
+ excelItem, e := excel.GetExcelInfoById(excelId)
|
|
|
+ if e != nil {
|
|
|
+ if e.Error() == utils.ErrNoRow() {
|
|
|
+ br.Msg = "表格不存在, 请刷新页面"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ br.Msg = "获取失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if excelItem.Source != utils.TRADE_ANALYSIS_TABLE {
|
|
|
+ br.Msg = "获取失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("表格类型异常, Source: %d", excelItem.Source)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var tableConfig tradeAnalysisModel.TableExtraConfig
|
|
|
+ if e = json.Unmarshal([]byte(excelItem.ExtraConfig), &tableConfig); e != nil {
|
|
|
+ br.Msg = "获取失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("解析表格配置失败, err: %v, config: %s", e, excelItem.ExtraConfig)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 校验配置
|
|
|
+ pass, tips := tradeAnalysisService.CheckAnalysisTableExtraConfig(tableConfig)
|
|
|
+ if !pass {
|
|
|
+ br.Msg = "获取失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("表格配置有误, Msg: %s", tips)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据配置获取表格行数据
|
|
|
+ tableRows, e := tradeAnalysisService.GetTableRowsDataByConfig(tableConfig)
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "获取失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格行数据失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 响应
|
|
|
+ resp := new(tradeAnalysisResponse.TableResp)
|
|
|
+ resp.ExcelInfoId = excelItem.ExcelInfoId
|
|
|
+ resp.TableData = tableRows
|
|
|
+ resp.TableName = strings.TrimSpace(excelItem.ExcelName)
|
|
|
+ resp.ClassifyId = excelItem.ExcelClassifyId
|
|
|
+ resp.ModifyTime = utils.TimeTransferString(utils.FormatDateTime, excelItem.ModifyTime)
|
|
|
+ resp.TableConfig = tableConfig
|
|
|
+ resp.TableCols = make([]*tradeAnalysisModel.TradeAnalysisTableColumnItem, 0)
|
|
|
+ // 获取表头信息
|
|
|
+ {
|
|
|
+ colOb := new(tradeAnalysisModel.TradeAnalysisTableColumn)
|
|
|
+ cond := fmt.Sprintf(" AND %s = ?", colOb.Cols().ExcelInfoId)
|
|
|
+ pars := make([]interface{}, 0)
|
|
|
+ pars = append(pars, excelId)
|
|
|
+ configCols, e := colOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", colOb.Cols().Sort))
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "获取失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格表头设置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 表头信息为空
|
|
|
+ if len(configCols) == 0 {
|
|
|
+ defaultCols, e := colOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", colOb.Cols().Sort))
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ configCols = defaultCols
|
|
|
+ }
|
|
|
+ for _, v := range configCols {
|
|
|
+ resp.TableCols = append(resp.TableCols, v.Format2Item())
|
|
|
+ }
|
|
|
+ }
|
|
|
+ resp.Button = services.GetTradeAnalysisTableOpButton(excelItem.SysUserId, sysUser.AdminId, sysUser.RoleTypeCode, false)
|
|
|
+
|
|
|
+ br.Data = resp
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = "获取成功"
|
|
|
+}
|
|
|
+
|
|
|
+// SaveAs
|
|
|
+// @Title 表格另存为
|
|
|
+// @Description 表格另存为
|
|
|
+// @Param request body request.TableSaveAsReq true "type json string"
|
|
|
+// @Success 200 string "操作成功"
|
|
|
+// @router /table/save_as [post]
|
|
|
+func (this *TradeAnalysisTableController) SaveAs() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ defer func() {
|
|
|
+ if br.ErrMsg == "" {
|
|
|
+ br.IsSendEmail = false
|
|
|
+ }
|
|
|
+ this.Data["json"] = br
|
|
|
+ this.ServeJSON()
|
|
|
+ }()
|
|
|
+ sysUser := this.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请登录"
|
|
|
+ br.ErrMsg = "请登录,SysUser Is Empty"
|
|
|
+ br.Ret = 408
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var req tradeAnalysisRequest.TableSaveAsReq
|
|
|
+ if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
|
|
|
+ br.Msg = "参数解析异常"
|
|
|
+ br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ req.TableName = strings.TrimSpace(req.TableName)
|
|
|
+ if req.TableName == "" {
|
|
|
+ br.Msg = "请输入表格名称"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if req.ClassifyId <= 0 {
|
|
|
+ br.Msg = "请选择分类"
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 原表格
|
|
|
+ excelItem, e := excel.GetExcelInfoById(req.ExcelInfoId)
|
|
|
+ if e != nil {
|
|
|
+ if e.Error() == utils.ErrNoRow() {
|
|
|
+ br.Msg = "原表格不存在, 请刷新页面"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新表格
|
|
|
+ timestamp := strconv.FormatInt(time.Now().UnixNano(), 10) + "_" + utils.GetRandString(10)
|
|
|
+ newExcel := &excel.ExcelInfo{
|
|
|
+ ExcelName: req.TableName,
|
|
|
+ Source: utils.TRADE_ANALYSIS_TABLE,
|
|
|
+ ExcelType: 1,
|
|
|
+ UniqueCode: utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
|
|
|
+ ExcelClassifyId: req.ClassifyId,
|
|
|
+ SysUserId: sysUser.AdminId,
|
|
|
+ SysUserRealName: sysUser.RealName,
|
|
|
+ ExtraConfig: excelItem.ExtraConfig,
|
|
|
+ UpdateUserId: sysUser.AdminId,
|
|
|
+ UpdateUserRealName: sysUser.RealName,
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ }
|
|
|
+ if e := newExcel.Create(); e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("新增表格失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 表头信息
|
|
|
+ columnOb := new(tradeAnalysisModel.TradeAnalysisTableColumn)
|
|
|
+ configColumns := make([]*tradeAnalysisModel.TradeAnalysisTableColumn, 0)
|
|
|
+ {
|
|
|
+ cond := fmt.Sprintf(` AND %s = ?`, columnOb.Cols().ExcelInfoId)
|
|
|
+ pars := make([]interface{}, 0)
|
|
|
+ pars = append(pars, req.ExcelInfoId)
|
|
|
+ originColumns, e := columnOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", columnOb.Cols().Sort))
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range originColumns {
|
|
|
+ v.Id = 0
|
|
|
+ v.ExcelInfoId = newExcel.ExcelInfoId
|
|
|
+ v.CreateTime = time.Now()
|
|
|
+ v.ModifyTime = time.Now()
|
|
|
+ configColumns = append(configColumns, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 没找到就获取默认的表头信息
|
|
|
+ if len(configColumns) == 0 {
|
|
|
+ cond := fmt.Sprintf(` AND %s = 0`, columnOb.Cols().ExcelInfoId)
|
|
|
+ defaultCols, e := columnOb.GetItemsByCondition(cond, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", columnOb.Cols().Sort))
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range defaultCols {
|
|
|
+ v.Id = 0
|
|
|
+ v.ExcelInfoId = newExcel.ExcelInfoId
|
|
|
+ v.CreateTime = time.Now()
|
|
|
+ v.ModifyTime = time.Now()
|
|
|
+ configColumns = append(configColumns, v)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 新增表头
|
|
|
+ if e = columnOb.CreateMulti(configColumns); e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("批量新增表头配置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ br.Data = newExcel.ExcelInfoId
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = "操作成功"
|
|
|
+}
|
|
|
+
|
|
|
+// Refresh
|
|
|
+// @Title 刷新表格
|
|
|
+// @Description 刷新表格
|
|
|
+// @Param request body request.TableRefreshReq true "type json string"
|
|
|
+// @Success 200 string "操作成功"
|
|
|
+// @router /table/refresh [post]
|
|
|
+func (this *TradeAnalysisTableController) Refresh() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ defer func() {
|
|
|
+ if br.ErrMsg == "" {
|
|
|
+ br.IsSendEmail = false
|
|
|
+ }
|
|
|
+ this.Data["json"] = br
|
|
|
+ this.ServeJSON()
|
|
|
+ }()
|
|
|
+ sysUser := this.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请登录"
|
|
|
+ br.ErrMsg = "请登录,SysUser Is Empty"
|
|
|
+ br.Ret = 408
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var req tradeAnalysisRequest.TableRefreshReq
|
|
|
+ if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
|
|
|
+ br.Msg = "参数解析异常"
|
|
|
+ br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if req.ExcelInfoId <= 0 {
|
|
|
+ br.Msg = "参数有误"
|
|
|
+ br.ErrMsg = fmt.Sprintf("表格ID有误: %d", req.ExcelInfoId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取表格信息
|
|
|
+ _, e := excel.GetExcelInfoById(req.ExcelInfoId)
|
|
|
+ if e != nil {
|
|
|
+ if e.Error() == utils.ErrNoRow() {
|
|
|
+ br.Msg = "表格不存在, 请刷新页面"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO:刷个啥呢...
|
|
|
+
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = "操作成功"
|
|
|
+}
|
|
|
+
|
|
|
+// Remove
|
|
|
+// @Title 删除表格
|
|
|
+// @Description 删除表格
|
|
|
+// @Param request body request.TableRemoveReq true "type json string"
|
|
|
+// @Success 200 string "操作成功"
|
|
|
+// @router /table/remove [post]
|
|
|
+func (this *TradeAnalysisTableController) Remove() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ defer func() {
|
|
|
+ if br.ErrMsg == "" {
|
|
|
+ br.IsSendEmail = false
|
|
|
+ }
|
|
|
+ this.Data["json"] = br
|
|
|
+ this.ServeJSON()
|
|
|
+ }()
|
|
|
+ sysUser := this.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请登录"
|
|
|
+ br.ErrMsg = "请登录,SysUser Is Empty"
|
|
|
+ br.Ret = 408
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var req tradeAnalysisRequest.TableRemoveReq
|
|
|
+ if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
|
|
|
+ br.Msg = "参数解析异常"
|
|
|
+ br.ErrMsg = fmt.Sprintf("参数解析异常: %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if req.ExcelInfoId <= 0 {
|
|
|
+ br.Msg = "参数有误"
|
|
|
+ br.ErrMsg = fmt.Sprintf("表格ID有误: %d", req.ExcelInfoId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取表格信息
|
|
|
+ excelItem, e := excel.GetExcelInfoById(req.ExcelInfoId)
|
|
|
+ if e != nil {
|
|
|
+ if e.Error() == utils.ErrNoRow() {
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = "操作成功"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ br.Msg = "获取失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 软删
|
|
|
+ excelItem.IsDelete = 1
|
|
|
+ excelItem.UpdateUserId = sysUser.AdminId
|
|
|
+ excelItem.UpdateUserRealName = sysUser.RealName
|
|
|
+ excelItem.ModifyTime = time.Now()
|
|
|
+ updateCols := []string{"IsDelete", "UpdateUserId", "UpdateUserRealName", "ModifyTime"}
|
|
|
+ if e = excelItem.Update(updateCols); e != nil {
|
|
|
+ br.Msg = "操作失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("删除表格信息失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = "操作成功"
|
|
|
+}
|
|
|
+
|
|
|
+// Download
|
|
|
+// @Title 下载表格
|
|
|
+// @Description 下载表格
|
|
|
+// @Param ExcelInfoId query int true "表格ID"
|
|
|
+// @Success 200 下载成功
|
|
|
+// @router /table/download [get]
|
|
|
+func (this *TradeAnalysisTableController) Download() {
|
|
|
+ br := new(models.BaseResponse).Init()
|
|
|
+ defer func() {
|
|
|
+ if br.ErrMsg == "" {
|
|
|
+ br.IsSendEmail = false
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("多空分析表格-下载失败, ErrMsg: %s", br.ErrMsg))
|
|
|
+ }
|
|
|
+ this.Data["json"] = br
|
|
|
+ this.ServeJSON()
|
|
|
+ }()
|
|
|
+ sysUser := this.SysUser
|
|
|
+ if sysUser == nil {
|
|
|
+ br.Msg = "请登录"
|
|
|
+ br.ErrMsg = "请登录,SysUser Is Empty"
|
|
|
+ br.Ret = 408
|
|
|
+ return
|
|
|
+ }
|
|
|
+ excelId, _ := this.GetInt("ExcelInfoId")
|
|
|
+ if excelId <= 0 {
|
|
|
+ br.Msg = "参数有误"
|
|
|
+ br.ErrMsg = fmt.Sprintf("表格ID有误: %d", excelId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取表格信息
|
|
|
+ excelItem, e := excel.GetExcelInfoById(excelId)
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "下载失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格信息失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取表头信息
|
|
|
+ configCols := make([]*tradeAnalysisModel.TradeAnalysisTableColumn, 0)
|
|
|
+ {
|
|
|
+ colOb := new(tradeAnalysisModel.TradeAnalysisTableColumn)
|
|
|
+ cond := fmt.Sprintf(" AND %s = ?", colOb.Cols().ExcelInfoId)
|
|
|
+ pars := make([]interface{}, 0)
|
|
|
+ pars = append(pars, excelId)
|
|
|
+ items, e := colOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", colOb.Cols().Sort))
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "下载失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格表头设置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ configCols = items
|
|
|
+ // 表头信息为空
|
|
|
+ if len(configCols) == 0 {
|
|
|
+ defaultCols, e := colOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, fmt.Sprintf("%s ASC", colOb.Cols().Sort))
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "下载失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取默认表头设置失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ configCols = defaultCols
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if len(configCols) == 0 {
|
|
|
+ br.Msg = "下载失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("表头信息异常")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据配置获取表格行数据
|
|
|
+ var tableConfig tradeAnalysisModel.TableExtraConfig
|
|
|
+ if e = json.Unmarshal([]byte(excelItem.ExtraConfig), &tableConfig); e != nil {
|
|
|
+ br.Msg = "下载失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("解析表格配置失败, err: %v, config: %s", e, excelItem.ExtraConfig)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ tableRows, e := tradeAnalysisService.GetTableRowsDataByConfig(tableConfig)
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "下载失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("获取表格行数据失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成excel
|
|
|
+ dir, _ := os.Executable()
|
|
|
+ exPath := filepath.Dir(dir)
|
|
|
+ downFile := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
|
|
|
+ xlsxFile := xlsx.NewFile()
|
|
|
+
|
|
|
+ sheetNew := new(xlsx.Sheet)
|
|
|
+ sheetNew, e = xlsxFile.AddSheet("Sheet1")
|
|
|
+ if e != nil {
|
|
|
+ br.Msg = "下载失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("生成Sheet失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 第一行-表头
|
|
|
+ headerRow := sheetNew.AddRow()
|
|
|
+ var headerKeys []string
|
|
|
+ for _, v := range configCols {
|
|
|
+ if v.IsShow == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ headerRow.AddCell().SetValue(v.ColumnName)
|
|
|
+ headerKeys = append(headerKeys, v.ColumnKey)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 数据行
|
|
|
+ for _, v := range tableRows {
|
|
|
+ row := sheetNew.AddRow()
|
|
|
+ rv := reflect.ValueOf(v)
|
|
|
+
|
|
|
+ // v为指针先解引用
|
|
|
+ if rv.Kind() == reflect.Ptr {
|
|
|
+ rv = rv.Elem()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取对应key的值
|
|
|
+ for _, h := range headerKeys {
|
|
|
+ fieldVal := rv.FieldByName(h)
|
|
|
+ if fieldVal.IsValid() {
|
|
|
+ cell := row.AddCell()
|
|
|
+ cell.SetString(fmt.Sprint(fieldVal.Interface()))
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ row.AddCell().SetString("")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存文件
|
|
|
+ if e = xlsxFile.Save(downFile); e != nil {
|
|
|
+ br.Msg = "下载失败"
|
|
|
+ br.ErrMsg = fmt.Sprintf("保存文件内容失败, %v", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ fileName := fmt.Sprintf(`%s%s.xlsx`, excelItem.ExcelName, time.Now().Format("06.01.02"))
|
|
|
+ this.Ctx.Output.Download(downFile, fileName)
|
|
|
+ defer func() {
|
|
|
+ _ = os.Remove(downFile)
|
|
|
+ }()
|
|
|
+
|
|
|
+ br.Ret = 200
|
|
|
+ br.Success = true
|
|
|
+ br.Msg = "下载成功"
|
|
|
+}
|