usda_fas_data.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206
  1. package data_manage
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. "eta/eta_api/models/data_manage"
  7. "eta/eta_api/models/system"
  8. "eta/eta_api/services/data"
  9. etaTrialService "eta/eta_api/services/eta_trial"
  10. "eta/eta_api/utils"
  11. "fmt"
  12. "os"
  13. "path/filepath"
  14. "strconv"
  15. "strings"
  16. "time"
  17. "github.com/rdlucklib/rdluck_tools/paging"
  18. "github.com/tealeg/xlsx"
  19. )
  20. type BaseFromUsdaFasController struct {
  21. controllers.BaseAuthController
  22. }
  23. // UsdaFasClassify
  24. // @Title 美国农业部数据分类
  25. // @Description 美国农业部数据分类接口
  26. // @Success 200 {object} data_manage.BaseFromUsdaFasClassify
  27. // @router /usda_fas/classify [get]
  28. func (this *BaseFromUsdaFasController) UsdaFasClassify() {
  29. br := new(models.BaseResponse).Init()
  30. defer func() {
  31. this.Data["json"] = br
  32. this.ServeJSON()
  33. }()
  34. sysUser := this.SysUser
  35. if sysUser == nil {
  36. br.Msg = "请登录"
  37. br.ErrMsg = "请登录,SysUser Is Empty"
  38. br.Ret = 408
  39. return
  40. }
  41. classifyAll, err := data_manage.GetAllBaseFromUsdaFasClassify()
  42. if err != nil && err.Error() != utils.ErrNoRow() {
  43. br.Msg = "获取失败"
  44. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  45. return
  46. }
  47. //组装一级分类
  48. rootMap := make(map[int][]*data_manage.BaseFromUsdaFasClassifyItems)
  49. list := make([]*data_manage.BaseFromUsdaFasClassifyItems, 0)
  50. for _, classify := range classifyAll {
  51. classify.UniqueCode = strconv.Itoa(classify.ClassifyId)
  52. if classify.ParentId == 0 {
  53. if _, ok := rootMap[classify.ClassifyId]; !ok {
  54. rootMap[classify.ClassifyId] = make([]*data_manage.BaseFromUsdaFasClassifyItems, 0)
  55. list = append(list, classify)
  56. }
  57. } else {
  58. child, ok := rootMap[classify.ParentId]
  59. if ok {
  60. child = append(child, classify)
  61. rootMap[classify.ParentId] = child
  62. }
  63. }
  64. }
  65. for k, v := range list {
  66. child, ok := rootMap[v.ClassifyId]
  67. if ok {
  68. list[k].Children = child
  69. }
  70. }
  71. //组装二级分类
  72. var ret data_manage.BaseFromUsdaFasClassifyResp
  73. ret.List = list
  74. br.Ret = 200
  75. br.Success = true
  76. br.Msg = "获取成功"
  77. br.Data = ret
  78. }
  79. // UsdaFasIndexData
  80. // @Title 获取美国农业部数据
  81. // @Description 获取美国农业部数据接口
  82. // @Param PageSize query int true "每页数据条数"
  83. // @Param CurrentIndex query int true "当前页页码,从1开始"
  84. // @Param ClassifyId query string true "分类id"
  85. // @Success 200 {object} data_manage.LzFrequency
  86. // @router /usda_fas/index/data [get]
  87. func (this *BaseFromUsdaFasController) UsdaFasIndexData() {
  88. br := new(models.BaseResponse).Init()
  89. defer func() {
  90. this.Data["json"] = br
  91. this.ServeJSON()
  92. }()
  93. sysUser := this.SysUser
  94. if sysUser == nil {
  95. br.Msg = "请登录"
  96. br.ErrMsg = "请登录,SysUser Is Empty"
  97. br.Ret = 408
  98. return
  99. }
  100. pageSize, _ := this.GetInt("PageSize")
  101. currentIndex, _ := this.GetInt("CurrentIndex")
  102. var startSize int
  103. if pageSize <= 0 {
  104. pageSize = utils.PageSize20
  105. }
  106. if currentIndex <= 0 {
  107. currentIndex = 1
  108. }
  109. startSize = utils.StartIndex(currentIndex, pageSize)
  110. classifyId, _ := this.GetInt("ClassifyId")
  111. if classifyId < 0 {
  112. br.Msg = "请选择分类"
  113. br.ErrMsg = "请选择分类"
  114. return
  115. }
  116. // 增加频度请求入参
  117. frequency := this.GetString("Frequency")
  118. //获取指标
  119. var condition string
  120. var pars []interface{}
  121. if classifyId >= 0 {
  122. classifyInfo, err := data_manage.GetBaseFromUsdaFasClassifyById(classifyId)
  123. if err != nil {
  124. if err.Error() == utils.ErrNoRow() {
  125. br.Msg = "分类不存在"
  126. return
  127. }
  128. br.Msg = "获取分类信息失败"
  129. br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
  130. return
  131. }
  132. if classifyInfo.Level == 2 || classifyInfo.ParentId > 0 {
  133. condition += ` AND classify_id=? `
  134. pars = append(pars, classifyId)
  135. } else if classifyInfo.Level == 1 {
  136. childClassify, err := data_manage.GetBaseFromUsdaFasClassifyByParentId(classifyId)
  137. if err != nil {
  138. br.Msg = "获取分类信息失败"
  139. br.ErrMsg = "获取子分类信息失败,Err:" + err.Error()
  140. return
  141. }
  142. var classifyList []int
  143. for _, v := range childClassify {
  144. classifyList = append(classifyList, v.ClassifyId)
  145. }
  146. condition += ` AND classify_id IN (` + utils.GetOrmInReplace(len(classifyList)) + `) `
  147. pars = append(pars, classifyList)
  148. }
  149. }
  150. if frequency != "" {
  151. condition += ` AND frequency=? `
  152. pars = append(pars, frequency)
  153. }
  154. UsdaFasList, err := data_manage.GetUsdaFasIndex(condition, pars)
  155. if err != nil {
  156. br.Msg = "获取数据失败"
  157. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  158. return
  159. }
  160. edbCodeList := make([]string, 0)
  161. for _, v := range UsdaFasList {
  162. edbCodeList = append(edbCodeList, v.IndexCode)
  163. }
  164. edbInfoList, err := data_manage.GetEdbInfoByEdbCodeList(utils.DATA_SOURCE_USDA_FAS, edbCodeList)
  165. if err != nil {
  166. br.Msg = "获取数据源失败"
  167. br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
  168. return
  169. }
  170. edbInfoMap := make(map[string]*data_manage.EdbInfo)
  171. for _, v := range edbInfoList {
  172. edbInfoMap[v.EdbCode] = v
  173. }
  174. resultList := make([]*data_manage.BaseFromUsdaFasIndexList, 0)
  175. for _, v := range UsdaFasList {
  176. product := new(data_manage.BaseFromUsdaFasIndexList)
  177. product.BaseFromUsdaFasIndexId = v.BaseFromUsdaFasIndexId
  178. product.Unit = v.Unit
  179. product.IndexCode = v.IndexCode
  180. product.IndexName = v.IndexName
  181. product.Frequency = v.Frequency
  182. product.ModifyTime = v.ModifyTime
  183. if edb, ok := edbInfoMap[v.IndexCode]; ok {
  184. product.EdbInfoId = edb.EdbInfoId
  185. product.EdbExist = 1
  186. }
  187. total, err := data_manage.GetUsdaFasIndexDataCount(v.IndexCode)
  188. if err != nil {
  189. br.Msg = "获取数据失败"
  190. br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
  191. return
  192. }
  193. page := paging.GetPaging(currentIndex, pageSize, total)
  194. dataList, err := data_manage.GetUsdaFasIndexData(v.IndexCode, startSize, pageSize)
  195. if err != nil {
  196. br.Msg = "获取数据失败"
  197. br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
  198. return
  199. }
  200. if dataList == nil {
  201. dataList = make([]*data_manage.BaseFromUsdaFasData, 0)
  202. }
  203. product.DataList = dataList
  204. product.Paging = page
  205. resultList = append(resultList, product)
  206. }
  207. br.Ret = 200
  208. br.Success = true
  209. br.Msg = "获取成功"
  210. br.Data = resultList
  211. }
  212. // UsdaFasSearchList
  213. // @Title UsdaFas模糊搜索
  214. // @Description UsdaFas模糊搜索
  215. // @Param Keyword query string ture "关键字搜索"
  216. // @Success 200 {object} models.BaseResponse
  217. // @router /usda_fas/search_list [get]
  218. func (this *BaseFromUsdaFasController) UsdaFasSearchList() {
  219. br := new(models.BaseResponse).Init()
  220. defer func() {
  221. this.Data["json"] = br
  222. this.ServeJSON()
  223. }()
  224. sysUser := this.SysUser
  225. if sysUser == nil {
  226. br.Msg = "请重新登录"
  227. return
  228. }
  229. list := make([]*data_manage.BaseFromUsdaFasIndexSearchItem, 0)
  230. var err error
  231. //关键字
  232. keyword := this.GetString("Keyword")
  233. if keyword != "" {
  234. keyWordArr := strings.Split(keyword, " ")
  235. if len(keyWordArr) > 0 {
  236. condition := ""
  237. for _, v := range keyWordArr {
  238. condition += ` AND CONCAT(index_name,index_code) LIKE '%` + v + `%'`
  239. }
  240. list, err = data_manage.GetUsdaFasItemList(condition)
  241. if err != nil {
  242. br.ErrMsg = "获取失败,Err:" + err.Error()
  243. br.Msg = "获取失败"
  244. return
  245. }
  246. }
  247. } else {
  248. // todo es 模糊搜索
  249. list, err = data_manage.GetUsdaFasItemList("")
  250. if err != nil {
  251. br.ErrMsg = "获取失败,Err:" + err.Error()
  252. br.Msg = "获取失败"
  253. return
  254. }
  255. }
  256. classifyIds := make([]int, 0)
  257. for _, v := range list {
  258. classifyIds = append(classifyIds, v.ClassifyId)
  259. }
  260. classifyList, err := data_manage.GetBaseFromUsdaFasClassifyByIds(classifyIds)
  261. if err != nil {
  262. br.Msg = "搜索失败"
  263. br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
  264. return
  265. }
  266. classifyMap := make(map[int]int)
  267. for _, v := range classifyList {
  268. classifyMap[v.ClassifyId] = v.ParentId
  269. }
  270. for _, v := range list {
  271. v.ParentClassifyId = classifyMap[v.ClassifyId]
  272. }
  273. br.Ret = 200
  274. br.Success = true
  275. br.Msg = "获取成功"
  276. br.Data = list
  277. }
  278. // UsdaFasSingleData
  279. // @Title 获取UsdaFas数据
  280. // @Description 获取UsdaFas单条数据接口
  281. // @Param IndexCode query string true "指标唯一编码"
  282. // @Success 200 {object} models.BaseResponse
  283. // @router /usda_fas/single_data [get]
  284. func (this *BaseFromUsdaFasController) UsdaFasSingleData() {
  285. br := new(models.BaseResponse).Init()
  286. defer func() {
  287. this.Data["json"] = br
  288. this.ServeJSON()
  289. }()
  290. sysUser := this.SysUser
  291. if sysUser == nil {
  292. br.Msg = "请登录"
  293. br.ErrMsg = "请登录,SysUser Is Empty"
  294. br.Ret = 408
  295. return
  296. }
  297. indexCode := this.GetString("IndexCode")
  298. indexInfo, err := data_manage.GetBaseFromUsdaFasIndexByIndexCode(indexCode)
  299. if err != nil {
  300. br.Msg = "获取指标信息失败"
  301. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  302. return
  303. }
  304. dataTmpList, err := data_manage.GetUsdaFasIndexDataByCode(indexCode)
  305. if err != nil {
  306. br.Msg = "获取数据失败"
  307. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  308. return
  309. }
  310. edbInfo, err := data_manage.GetEdbInfoByEdbCode(utils.DATA_SOURCE_USDA_FAS, indexCode)
  311. if err != nil && err.Error() != utils.ErrNoRow() {
  312. br.Msg = "获取数据源失败"
  313. br.ErrMsg = "获取数据源失败,Err:" + err.Error()
  314. return
  315. }
  316. var ret data_manage.UsdaFasSingleDataResp
  317. var dataList []*data_manage.UsdaFasSingleData
  318. if edbInfo != nil {
  319. ret.EdbInfoId = edbInfo.EdbInfoId
  320. ret.EdbExist = 1
  321. }
  322. ret.ClassifyId = indexInfo.ClassifyId
  323. ret.BaseFromUsdaFasIndexId = indexInfo.BaseFromUsdaFasIndexId
  324. ret.IndexCode = indexInfo.IndexCode
  325. ret.IndexName = indexInfo.IndexName
  326. ret.Frequency = indexInfo.Frequency
  327. ret.CreateTime = indexInfo.CreateTime.Format(utils.FormatDateTime)
  328. ret.ModifyTime = indexInfo.ModifyTime.Format(utils.FormatDateTime)
  329. ret.Unit = indexInfo.Unit
  330. for _, v := range dataTmpList {
  331. tmp := &data_manage.UsdaFasSingleData{
  332. Value: v.Value,
  333. DataTime: v.DataTime,
  334. }
  335. dataList = append(dataList, tmp)
  336. }
  337. ret.Data = dataList
  338. br.Ret = 200
  339. br.Success = true
  340. br.Msg = "获取成功"
  341. br.Data = ret
  342. }
  343. // UsdaFasIndexList
  344. // @Title 美国农业部指标列表
  345. // @Description 美国农业部指标列表
  346. // @Param ClassifyId query int true "分类id"
  347. // @Success 200 {object} data_manage.BaseFromMysteelChemicalIndexResp
  348. // @router /usda_fas/classify/index/list [get]
  349. func (this *BaseFromUsdaFasController) UsdaFasIndexList() {
  350. br := new(models.BaseResponse).Init()
  351. defer func() {
  352. this.Data["json"] = br
  353. this.ServeJSON()
  354. }()
  355. classifyId, _ := this.GetInt("ClassifyId", 0)
  356. indexList, err := data_manage.GetUsdaFasIndexByClassifyId(classifyId)
  357. if err != nil && err.Error() != utils.ErrNoRow() {
  358. br.Msg = "获取失败"
  359. br.ErrMsg = "获取指标信息失败,Err:" + err.Error()
  360. return
  361. }
  362. var ret data_manage.BaseFromUsdaFasClassifyResp
  363. list := make([]*data_manage.BaseFromUsdaFasClassifyItems, 0)
  364. for _, v := range indexList {
  365. classify := new(data_manage.BaseFromUsdaFasClassifyItems)
  366. classify.ClassifyId = classifyId
  367. classify.BaseFromUsdaFasIndexId = v.BaseFromUsdaFasIndexId
  368. classify.IndexCode = v.IndexCode
  369. classify.ClassifyName = v.IndexName
  370. classify.UniqueCode = fmt.Sprintf("%d_%d", classifyId, v.BaseFromUsdaFasIndexId)
  371. list = append(list, classify)
  372. }
  373. ret.List = list
  374. br.Ret = 200
  375. br.Success = true
  376. br.Msg = "获取成功"
  377. br.Data = ret
  378. }
  379. // UsdaFasBatchSearch
  380. // @Title 美国农业部指标查询
  381. // @Description 美国农业部指标查询
  382. // @Param ClassifyIds query string true "分类id, 多个分类用英文"
  383. // @Param Keyword query string true "关键词, 指标ID/指标名称"
  384. // @Success 200 {object} data_manage.LzFrequency
  385. // @router /usda_fas/batch_search [get]
  386. func (this *BaseFromUsdaFasController) UsdaFasBatchSearch() {
  387. br := new(models.BaseResponse).Init()
  388. defer func() {
  389. this.Data["json"] = br
  390. this.ServeJSON()
  391. }()
  392. sysUser := this.SysUser
  393. if sysUser == nil {
  394. br.Msg = "请登录"
  395. br.ErrMsg = "请登录,SysUser Is Empty"
  396. br.Ret = 408
  397. return
  398. }
  399. classifyIdStr := this.GetString("ClassifyIds")
  400. pageSize, _ := this.GetInt("PageSize")
  401. currentIndex, _ := this.GetInt("CurrentIndex")
  402. var startSize int
  403. if pageSize <= 0 {
  404. pageSize = utils.PageSize20
  405. }
  406. if currentIndex <= 0 {
  407. currentIndex = 1
  408. }
  409. startSize = utils.StartIndex(currentIndex, pageSize)
  410. resp := data_manage.BaseFromUsdaFasIndexSearchList{}
  411. total := 0
  412. page := paging.GetPaging(currentIndex, pageSize, total)
  413. var list = make([]*data_manage.BaseFromUsdaFasIndexList, 0)
  414. var condition string
  415. var pars []interface{}
  416. classifyIds := strings.Split(classifyIdStr, ",")
  417. if len(classifyIds) > 0 && classifyIds[0] != `` {
  418. condition += " AND classify_id IN (" + utils.GetOrmInReplace(len(classifyIds)) + " ) "
  419. pars = append(pars, classifyIds)
  420. }
  421. keyword := this.GetString("Keyword")
  422. if keyword != `` {
  423. condition += " AND (index_name like ? OR index_code like ?) "
  424. pars = utils.GetLikeKeywordPars(pars, keyword, 2)
  425. }
  426. frequencies := this.GetString("Frequencies")
  427. if frequencies != "" {
  428. frequencyList := strings.Split(frequencies, ",")
  429. condition += " AND frequency IN (" + utils.GetOrmInReplace(len(frequencyList)) + " ) "
  430. pars = append(pars, frequencyList)
  431. }
  432. if classifyIdStr == `` && keyword == `` && frequencies == `` {
  433. resp.Paging = page
  434. resp.List = list
  435. br.Ret = 200
  436. br.Success = true
  437. br.Msg = "获取成功"
  438. br.Data = resp
  439. return
  440. }
  441. list, err := data_manage.GetUsdaFasIndexPage(condition, pars, startSize, pageSize)
  442. if err != nil {
  443. br.Msg = "获取失败"
  444. br.ErrMsg = "获取失败,Err:" + err.Error()
  445. return
  446. }
  447. total, err = data_manage.GetUsdaFasIndexPageCount(condition, pars)
  448. if err != nil {
  449. br.Msg = "获取数据失败"
  450. br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
  451. return
  452. }
  453. page = paging.GetPaging(currentIndex, pageSize, total)
  454. resp.Paging = page
  455. resp.List = list
  456. br.Ret = 200
  457. br.Success = true
  458. br.Msg = "获取成功"
  459. br.Data = resp
  460. }
  461. // UsdaFasBatchAdd
  462. // @Title 美国农业部批量新增
  463. // @Description 美国农业部批量新增
  464. // @Param request body data_manage.AddEdbInfoReq true "type json string"
  465. // @Success 200 string "操作成功"
  466. // @router /usda_fas/batch_add [post]
  467. func (this *BaseFromUsdaFasController) UsdaFasBatchAdd() {
  468. br := new(models.BaseResponse).Init()
  469. defer func() {
  470. if br.ErrMsg == "" {
  471. br.IsSendEmail = false
  472. }
  473. this.Data["json"] = br
  474. this.ServeJSON()
  475. }()
  476. sysUser := this.SysUser
  477. if sysUser == nil {
  478. br.Msg = "请登录"
  479. br.ErrMsg = "请登录,SysUser Is Empty"
  480. br.Ret = 408
  481. return
  482. }
  483. deleteCache := true
  484. cacheKey := "CACHE_EDB_INFO_BATCH_ADD_UsdaFas_" + strconv.Itoa(sysUser.AdminId)
  485. defer func() {
  486. if deleteCache {
  487. _ = utils.Rc.Delete(cacheKey)
  488. }
  489. }()
  490. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  491. deleteCache = false
  492. br.Msg = "系统处理中,请稍后重试!"
  493. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
  494. return
  495. }
  496. var req []*data_manage.AddEdbInfoReq
  497. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  498. br.Msg = "参数解析异常!"
  499. br.ErrMsg = "参数解析失败,Err:" + e.Error()
  500. return
  501. }
  502. if len(req) == 0 {
  503. br.Msg = "请选择指标"
  504. return
  505. }
  506. if len(req) > 30 {
  507. br.Msg = "批量添加指标数量不得超过30个"
  508. return
  509. }
  510. for _, v := range req {
  511. v.EdbCode = strings.TrimSpace(v.EdbCode)
  512. if v.EdbCode == "" {
  513. br.Msg = "指标ID不可为空"
  514. return
  515. }
  516. v.EdbName = strings.TrimSpace(v.EdbName)
  517. if v.EdbName == "" {
  518. br.Msg = "请输入指标名称"
  519. return
  520. }
  521. v.Frequency = strings.TrimSpace(v.Frequency)
  522. if v.Frequency == "" {
  523. br.Msg = "请选择频度"
  524. return
  525. }
  526. v.Unit = strings.TrimSpace(v.Unit)
  527. if v.Unit == "" {
  528. br.Msg = "请输入单位"
  529. return
  530. }
  531. if v.ClassifyId <= 0 {
  532. br.Msg = "请选择分类"
  533. return
  534. }
  535. }
  536. // 限定同一时间最多批量新增30个指标
  537. for _, v := range req {
  538. var r data_manage.UsdaFasIndexSource2EdbReq
  539. r.EdbCode = v.EdbCode
  540. r.EdbName = v.EdbName
  541. r.Frequency = v.Frequency
  542. r.Unit = v.Unit
  543. r.ClassifyId = v.ClassifyId
  544. r.AdminId = sysUser.AdminId
  545. r.AdminRealName = sysUser.RealName
  546. edbInfo, e, errMsg, skip := data.UsdaFasIndexSource2Edb(r, this.Lang)
  547. if e != nil {
  548. br.Msg = "操作失败"
  549. if errMsg != "" {
  550. br.Msg = errMsg
  551. }
  552. br.ErrMsg = e.Error()
  553. return
  554. }
  555. if skip {
  556. continue
  557. }
  558. // 试用平台更新用户累计新增指标数
  559. if utils.BusinessCode == utils.BusinessCodeSandbox {
  560. go func() {
  561. adminItem, e := system.GetSysAdminById(sysUser.AdminId)
  562. if e != nil {
  563. tips := fmt.Sprintf("试用平台更新用户累计新增指标数-获取用户失败, Err: " + e.Error())
  564. utils.FileLog.Info(tips)
  565. return
  566. }
  567. if adminItem.DepartmentName != "ETA试用客户" {
  568. return
  569. }
  570. var ur etaTrialService.EtaTrialUserReq
  571. ur.Mobile = adminItem.Mobile
  572. _, _ = etaTrialService.UpdateUserIndexNum(ur)
  573. }()
  574. }
  575. // 新增操作日志
  576. {
  577. edbLog := new(data_manage.EdbInfoLog)
  578. edbLog.EdbInfoId = edbInfo.EdbInfoId
  579. edbLog.SourceName = edbInfo.SourceName
  580. edbLog.Source = edbInfo.Source
  581. edbLog.EdbCode = edbInfo.EdbCode
  582. edbLog.EdbName = edbInfo.EdbName
  583. edbLog.ClassifyId = edbInfo.ClassifyId
  584. edbLog.SysUserId = sysUser.AdminId
  585. edbLog.SysUserRealName = sysUser.RealName
  586. edbLog.CreateTime = time.Now()
  587. edbLog.Content = string(this.Ctx.Input.RequestBody)
  588. edbLog.Status = "新增指标"
  589. edbLog.Method = this.Ctx.Input.URI()
  590. go data_manage.AddEdbInfoLog(edbLog)
  591. }
  592. }
  593. br.Msg = "操作成功"
  594. br.Ret = 200
  595. br.Success = true
  596. br.IsAddLog = true
  597. }
  598. // UsdaFasNameCheck
  599. // @Title 加入指标库的重名检测
  600. // @Description 加入指标库的重名检测
  601. // @Param ClassifyIds query string true "分类id, 多个分类用英文"
  602. // @Param Keyword query string true "关键词, 指标ID/指标名称"
  603. // @Success 200 {object} NameCheckResult
  604. // @router /usda_fas/edb_info/name_check [post]
  605. func (this *BaseFromUsdaFasController) UsdaFasNameCheck() {
  606. br := new(models.BaseResponse).Init()
  607. defer func() {
  608. if br.ErrMsg == "" {
  609. br.IsSendEmail = false
  610. }
  611. this.Data["json"] = br
  612. this.ServeJSON()
  613. }()
  614. sysUser := this.SysUser
  615. if sysUser == nil {
  616. br.Msg = "请登录"
  617. br.ErrMsg = "请登录,SysUser Is Empty"
  618. br.Ret = 408
  619. return
  620. }
  621. var req []*data_manage.NameCheckEdbInfoReq
  622. if e := json.Unmarshal(this.Ctx.Input.RequestBody, &req); e != nil {
  623. br.Msg = "参数解析异常!"
  624. br.ErrMsg = "参数解析失败,Err:" + e.Error()
  625. return
  626. }
  627. if len(req) == 0 {
  628. br.Msg = "请选择指标"
  629. return
  630. }
  631. codeMax := 30
  632. codeLen := len(req)
  633. if codeLen > codeMax {
  634. br.Msg = fmt.Sprintf("最多只能选择%d个指标", codeMax)
  635. return
  636. }
  637. indexNames := make([]string, 0)
  638. resp := make([]*data_manage.EdbNameCheckResult, 0)
  639. for _, v := range req {
  640. v.EdbCode = strings.TrimSpace(v.EdbCode)
  641. if v.EdbCode == "" {
  642. br.Msg = "指标ID不可为空"
  643. return
  644. }
  645. v.EdbName = strings.TrimSpace(v.EdbName)
  646. if v.EdbName == "" {
  647. br.Msg = "请输入指标名称"
  648. return
  649. }
  650. indexNames = append(indexNames, v.EdbName)
  651. resp = append(resp, &data_manage.EdbNameCheckResult{
  652. EdbCode: v.EdbCode,
  653. EdbName: v.EdbName,
  654. })
  655. dataItems, err := data_manage.GetEdbDataAllByEdbCode(v.EdbCode, utils.DATA_SOURCE_USDA_FAS, 0, utils.EDB_DATA_LIMIT)
  656. if err != nil && err.Error() != utils.ErrNoRow() {
  657. br.Msg = "获取失败"
  658. br.ErrMsg = "获取钢联已存在信息失败,Err:" + err.Error()
  659. return
  660. }
  661. if len(dataItems) <= 0 {
  662. respItem, err := data.AddEdbData(utils.DATA_SOURCE_USDA_FAS, v.EdbCode, v.Frequency)
  663. if err != nil {
  664. br.Msg = "获取失败"
  665. br.ErrMsg = "获取失败,Err:" + err.Error()
  666. return
  667. }
  668. if respItem.Ret != 200 {
  669. br.Msg = "未搜索到该指标"
  670. br.ErrMsg = respItem.ErrMsg + ";EdbCode:" + v.EdbCode
  671. return
  672. }
  673. }
  674. }
  675. // 重名校验
  676. edbList, e := data_manage.GetEdbInfoByNameArr(indexNames, utils.EDB_INFO_TYPE)
  677. if e != nil {
  678. br.Msg = "操作失败"
  679. br.ErrMsg = "获取重名指标失败, Err: " + e.Error()
  680. return
  681. }
  682. nameExists := make(map[string]bool)
  683. for _, v := range edbList {
  684. nameExists[v.EdbName] = true
  685. }
  686. if len(nameExists) > 0 {
  687. for _, v := range resp {
  688. v.Exist = nameExists[v.EdbName]
  689. }
  690. }
  691. br.Data = resp
  692. br.Msg = "校验成功"
  693. br.Ret = 200
  694. br.Success = true
  695. }
  696. // UsdaFasAddCheck
  697. // @Title 加入指标库指标Id检测
  698. // @Description 加入指标库指标Id检测
  699. // @Param request body request.BatchAddCheckReq true "type json string"
  700. // @Success 200 string "操作成功"
  701. // @router /usda_fas/edb_info/add_check [post]
  702. func (c *BaseFromUsdaFasController) UsdaFasAddCheck() {
  703. br := new(models.BaseResponse).Init()
  704. defer func() {
  705. if br.ErrMsg == "" {
  706. br.IsSendEmail = false
  707. }
  708. c.Data["json"] = br
  709. c.ServeJSON()
  710. }()
  711. sysUser := c.SysUser
  712. if sysUser == nil {
  713. br.Msg = "请登录"
  714. br.ErrMsg = "请登录,SysUser Is Empty"
  715. br.Ret = 408
  716. return
  717. }
  718. var req data_manage.BatchAddCheckReq
  719. if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
  720. br.Msg = "参数解析异常!"
  721. br.ErrMsg = "参数解析失败,Err:" + e.Error()
  722. return
  723. }
  724. codeMax := 30
  725. codeLen := len(req.IndexCodes)
  726. // 获取指标库已有指标
  727. existsEdb, e := data_manage.GetEdbCodesBySource(utils.DATA_SOURCE_USDA_FAS)
  728. if e != nil {
  729. br.Msg = "获取失败"
  730. br.ErrMsg = "获取自有数据已添加的指标失败, Err: " + e.Error()
  731. return
  732. }
  733. existMap := make(map[string]*data_manage.EdbInfo)
  734. for _, v := range existsEdb {
  735. existMap[v.EdbCode] = v
  736. }
  737. if codeLen == 0 {
  738. br.Msg = "请选择指标"
  739. return
  740. }
  741. if codeLen > codeMax {
  742. br.Msg = fmt.Sprintf("最多只能选择%d个指标", codeMax)
  743. return
  744. }
  745. // 查询选中的指标
  746. cond := fmt.Sprintf(` AND index_code IN (%s)`, utils.GetOrmInReplace(codeLen))
  747. pars := make([]interface{}, 0)
  748. pars = append(pars, req.IndexCodes)
  749. list, err := data_manage.GetUsdaFasIndex(cond, pars)
  750. if err != nil {
  751. br.Msg = "获取失败"
  752. br.ErrMsg = "获取钢联已存在信息失败,Err:" + err.Error()
  753. return
  754. }
  755. if len(list) > codeMax {
  756. br.Msg = fmt.Sprintf("最多只能选择%d个指标", codeMax)
  757. return
  758. }
  759. resp := make([]*data_manage.BaseFromUsdaFasIndexList, 0)
  760. for _, v := range list {
  761. if edb, ok := existMap[v.IndexCode]; ok {
  762. v.EdbInfoId = edb.EdbInfoId
  763. v.EdbClassifyId = edb.ClassifyId
  764. v.EdbUniqueCode = edb.UniqueCode
  765. v.EdbExist = 1
  766. }
  767. resp = append(resp, v)
  768. }
  769. br.Data = resp
  770. br.Msg = "校验成功"
  771. br.Ret = 200
  772. br.Success = true
  773. }
  774. // UsdaFasEdbInfoAdd
  775. // @Title 新增指标接口
  776. // @Description 新增指标接口
  777. // @Param request body data_manage.AddEdbInfoReq true "type json string"
  778. // @Success Ret=200 保存成功
  779. // @router /usda_fas/edb_info/add [post]
  780. func (this *BaseFromUsdaFasController) UsdaFasEdbInfoAdd() {
  781. br := new(models.BaseResponse).Init()
  782. defer func() {
  783. this.Data["json"] = br
  784. this.ServeJSON()
  785. }()
  786. sysUser := this.SysUser
  787. if sysUser == nil {
  788. br.Msg = "请登录"
  789. br.ErrMsg = "请登录,SysUser Is Empty"
  790. br.Ret = 408
  791. return
  792. }
  793. deleteCache := true
  794. cacheKey := "CACHE_EDB_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
  795. defer func() {
  796. if deleteCache {
  797. utils.Rc.Delete(cacheKey)
  798. }
  799. }()
  800. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  801. deleteCache = false
  802. br.Msg = "系统处理中,请稍后重试!"
  803. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(this.Ctx.Input.RequestBody)
  804. return
  805. }
  806. var req data_manage.AddEdbInfoReq
  807. err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
  808. if err != nil {
  809. br.Msg = "参数解析异常!"
  810. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  811. return
  812. }
  813. req.EdbName = strings.Trim(req.EdbName, " ")
  814. req.EdbCode = strings.Trim(req.EdbCode, " ")
  815. if req.EdbCode == "" {
  816. br.Msg = "指标ID不能为空"
  817. return
  818. }
  819. if req.EdbName == "" {
  820. br.Msg = "指标名称不能为空"
  821. return
  822. }
  823. if req.Frequency == "" {
  824. br.Msg = "频率不能为空"
  825. return
  826. }
  827. if req.Unit == "" {
  828. br.Msg = "单位不能为空"
  829. return
  830. }
  831. if req.ClassifyId <= 0 {
  832. br.Msg = "请选择分类"
  833. return
  834. }
  835. count, err := data_manage.GetUsdaFasIndexDataCount(req.EdbCode)
  836. if err != nil {
  837. br.Msg = "获取失败"
  838. br.ErrMsg = "获取失败,Err:" + err.Error()
  839. return
  840. }
  841. if count == 0 {
  842. br.Msg = "指标不存在"
  843. }
  844. // 指标入库
  845. edbInfo, err, errMsg, isSendEmail := data.EdbInfoAdd(utils.DATA_SOURCE_USDA_FAS, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, req.StartDate, req.EndDate, sysUser.AdminId, sysUser.RealName, this.Lang)
  846. if err != nil {
  847. br.Msg = "保存失败"
  848. if errMsg != `` {
  849. br.Msg = errMsg
  850. }
  851. br.ErrMsg = err.Error()
  852. br.IsSendEmail = isSendEmail
  853. return
  854. }
  855. // 试用平台更新用户累计新增指标数
  856. adminItem, e := system.GetSysAdminById(sysUser.AdminId)
  857. if e != nil {
  858. br.Msg = "操作失败"
  859. br.ErrMsg = "获取系统用户数据失败,Err:" + e.Error()
  860. return
  861. }
  862. if utils.BusinessCode == utils.BusinessCodeSandbox && adminItem.DepartmentName == "ETA试用客户" {
  863. go func() {
  864. var r etaTrialService.EtaTrialUserReq
  865. r.Mobile = adminItem.Mobile
  866. _, _ = etaTrialService.UpdateUserIndexNum(r)
  867. }()
  868. }
  869. //新增操作日志
  870. {
  871. edbLog := new(data_manage.EdbInfoLog)
  872. edbLog.EdbInfoId = edbInfo.EdbInfoId
  873. edbLog.SourceName = edbInfo.SourceName
  874. edbLog.Source = edbInfo.Source
  875. edbLog.EdbCode = edbInfo.EdbCode
  876. edbLog.EdbName = edbInfo.EdbName
  877. edbLog.ClassifyId = edbInfo.ClassifyId
  878. edbLog.SysUserId = sysUser.AdminId
  879. edbLog.SysUserRealName = sysUser.RealName
  880. edbLog.CreateTime = time.Now()
  881. edbLog.Content = string(this.Ctx.Input.RequestBody)
  882. edbLog.Status = "新增指标"
  883. edbLog.Method = this.Ctx.Input.URI()
  884. go data_manage.AddEdbInfoLog(edbLog)
  885. }
  886. // 更新es
  887. go data.AddOrEditEdbInfoToEs(edbInfo.EdbInfoId)
  888. resp := new(data_manage.AddEdbInfoResp)
  889. resp.EdbInfoId = edbInfo.EdbInfoId
  890. resp.UniqueCode = edbInfo.UniqueCode
  891. br.Ret = 200
  892. br.Success = true
  893. br.Msg = "保存成功"
  894. br.Data = resp
  895. br.IsAddLog = true
  896. }
  897. // ExportUsdaFasList
  898. // @Title 导出美国农业部数据
  899. // @Description 导出美国农业部数据
  900. // @Param ClassifyId query int true "关键字搜索"
  901. // @Param IndexCode query string true "指标编码"
  902. // @Success 200 导出成功
  903. // @router /usda_fas/export [get]
  904. func (this *BaseFromUsdaFasController) ExportUsdaFasList() {
  905. br := new(models.BaseResponse).Init()
  906. defer func() {
  907. this.Data["json"] = br
  908. this.ServeJSON()
  909. }()
  910. sysUser := this.SysUser
  911. if sysUser == nil {
  912. br.Msg = "请重新登录"
  913. return
  914. }
  915. classifyId, _ := this.GetInt("ClassifyId")
  916. indexCode := this.GetString("IndexCode")
  917. if classifyId < 0 {
  918. br.Msg = "请选择分类"
  919. return
  920. }
  921. dir, _ := os.Executable()
  922. exPath := filepath.Dir(dir)
  923. downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
  924. xlsxFile := xlsx.NewFile()
  925. var condition string
  926. var pars []interface{}
  927. var classifyName string
  928. if classifyId > 0 {
  929. classifyInfo, err := data_manage.GetBaseFromUsdaFasClassifyById(classifyId)
  930. if err != nil {
  931. if err.Error() == utils.ErrNoRow() {
  932. br.Msg = "分类不存在"
  933. return
  934. }
  935. br.Msg = "下载失败"
  936. br.ErrMsg = "获取分类失败,Err:" + err.Error()
  937. return
  938. }
  939. classifyName = classifyInfo.ClassifyName
  940. childClassify, err := data_manage.GetBaseFromUsdaFasClassifyByParentId(classifyId)
  941. if err != nil {
  942. br.Msg = "下载失败"
  943. br.ErrMsg = "获取分类失败,Err:" + err.Error()
  944. return
  945. }
  946. if len(childClassify) > 0 {
  947. condition += `AND classify_id IN (` + utils.GetOrmInReplace(len(childClassify)) + `)`
  948. for _, child := range childClassify {
  949. pars = append(pars, child.ClassifyId)
  950. }
  951. } else {
  952. condition += ` AND classify_id=?`
  953. pars = append(pars, classifyId)
  954. }
  955. } else {
  956. condition += ` AND classify_id=?`
  957. pars = append(pars, classifyId)
  958. }
  959. if indexCode != "" {
  960. condition += ` AND index_code=? `
  961. pars = append(pars, indexCode)
  962. }
  963. indexList, err := data_manage.GetUsdaFasIndex(condition, pars)
  964. if err != nil {
  965. fmt.Println("获取数据失败,Err:" + err.Error())
  966. return
  967. }
  968. if len(indexList) <= 0 {
  969. fmt.Println("indexList 为空")
  970. br.Ret = 200
  971. br.Success = true
  972. br.Msg = "success"
  973. return
  974. }
  975. indexCodeList := make([]string, 0)
  976. frequenciesMap := make(map[string][]*data_manage.BaseFromUsdaFasIndexList)
  977. for _, v := range indexList {
  978. indexCodeList = append(indexCodeList, v.IndexCode)
  979. frequenciesMap[v.Frequency] = append(frequenciesMap[v.Frequency], v)
  980. }
  981. dataListMap := make(map[string][]*data_manage.BaseFromUsdaFasData)
  982. if len(indexList) > 0 {
  983. allDataList, e := data_manage.GetUsdaFasIndexDataByCodes(indexCodeList)
  984. if e != nil {
  985. br.Msg = "获取数据失败"
  986. br.ErrMsg = "获取数据失败,Err:" + e.Error()
  987. return
  988. }
  989. for _, v := range allDataList {
  990. dataListMap[v.IndexCode] = append(dataListMap[v.IndexCode], v)
  991. }
  992. }
  993. // 按照频率分组排序
  994. frequencies := []string{
  995. "日度", "周度", "旬度", "月度", "季度", "半年度", "年度",
  996. }
  997. for _, frequency := range frequencies {
  998. //获取指标
  999. indexCodeList, ok := frequenciesMap[frequency]
  1000. if !ok {
  1001. continue
  1002. }
  1003. if len(indexCodeList) <= 0 {
  1004. fmt.Printf("sheet:%s, 不存在指标", frequency)
  1005. return
  1006. }
  1007. var sheetName string
  1008. switch frequency {
  1009. case "日度":
  1010. sheetName = "日度(Daily)"
  1011. case "周度":
  1012. sheetName = "周度(Weekly)"
  1013. case "旬度":
  1014. sheetName = "旬度(ten-day)"
  1015. case "月度":
  1016. sheetName = "月度(Monthly)"
  1017. case "季度":
  1018. sheetName = "季度(Quarterly)"
  1019. case "半年度":
  1020. sheetName = "半年度(Semi-annual)"
  1021. case "年度":
  1022. sheetName = "年度(Annual)"
  1023. default:
  1024. sheetName = "其他数据"
  1025. }
  1026. sheetNew, err := xlsxFile.AddSheet(sheetName)
  1027. if err != nil {
  1028. fmt.Println("新增Sheet失败", err.Error())
  1029. return
  1030. }
  1031. secNameRow := sheetNew.AddRow()
  1032. frequencyRow := sheetNew.AddRow()
  1033. unitRow := sheetNew.AddRow()
  1034. lastModifyDateRow := sheetNew.AddRow()
  1035. var indexIdList []int
  1036. for _, idx := range frequenciesMap[frequency] {
  1037. indexIdList = append(indexIdList, idx.BaseFromUsdaFasIndexId)
  1038. }
  1039. dataTimeList, err := data_manage.GetUsdaFasDataDataTimeByIndexId(indexIdList)
  1040. if err != nil {
  1041. fmt.Println("获取数据时间失败", err.Error())
  1042. return
  1043. }
  1044. // 添加excel左侧指标日期
  1045. setRowIndex := 4
  1046. for rk, dv := range dataTimeList {
  1047. rowIndex := setRowIndex + rk
  1048. row := sheetNew.Row(rowIndex)
  1049. displayDate, _ := time.Parse(utils.FormatDate, dv)
  1050. displayDateCell := row.AddCell()
  1051. style := new(xlsx.Style)
  1052. style.ApplyAlignment = true
  1053. style.Alignment.WrapText = true
  1054. displayDateCell.SetStyle(style)
  1055. displayDateCell.SetDate(displayDate)
  1056. }
  1057. for k, icl := range indexCodeList {
  1058. // 获取数据
  1059. dataList, ok := dataListMap[icl.IndexCode]
  1060. if !ok {
  1061. continue
  1062. }
  1063. if k == 0 {
  1064. secNameRow.AddCell().SetValue("指标名称/Metric Name")
  1065. frequencyRow.AddCell().SetValue("频度/Frequency")
  1066. unitRow.AddCell().SetValue("单位/Unit")
  1067. lastModifyDateRow.AddCell().SetValue("更新时间/Update Time")
  1068. min := k * 3
  1069. sheetNew.SetColWidth(min, min, 15)
  1070. }
  1071. if len(dataList) == 0 {
  1072. continue
  1073. }
  1074. secNameRow.AddCell().SetValue(icl.IndexName)
  1075. frequencyRow.AddCell().SetValue(icl.Frequency)
  1076. unitRow.AddCell().SetValue(icl.Unit)
  1077. timeDate, err := time.Parse(utils.FormatDateTime, dataList[0].ModifyTime)
  1078. if err != nil {
  1079. continue
  1080. }
  1081. lastModifyDateRow.AddCell().SetValue(timeDate.Format(utils.FormatDate))
  1082. dataInfoMap := make(map[string]*data_manage.BaseFromUsdaFasData)
  1083. for _, v := range dataList {
  1084. dataInfoMap[v.DataTime] = v
  1085. }
  1086. for rk, dtv := range dataTimeList {
  1087. rowIndex := setRowIndex + rk
  1088. row := sheetNew.Row(rowIndex)
  1089. displayDateCell := row.AddCell()
  1090. tmpData, ok := dataInfoMap[dtv]
  1091. if ok {
  1092. displayDateCell.SetValue(tmpData.Value)
  1093. }
  1094. }
  1095. }
  1096. }
  1097. err = xlsxFile.Save(downLoadnFilePath)
  1098. if err != nil {
  1099. //有指标无数据时先导出一遍空表
  1100. sheet, err := xlsxFile.AddSheet("无数据")
  1101. if err != nil {
  1102. br.Msg = "新增Sheet失败"
  1103. br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
  1104. return
  1105. }
  1106. rowSecName := sheet.AddRow()
  1107. celSecName := rowSecName.AddCell()
  1108. celSecName.SetValue("")
  1109. err = xlsxFile.Save(downLoadnFilePath)
  1110. if err != nil {
  1111. br.Msg = "保存文件失败"
  1112. br.ErrMsg = "保存文件失败"
  1113. return
  1114. }
  1115. }
  1116. fileName := classifyName
  1117. if indexCode != "" && len(indexList) == 1 {
  1118. fileName = indexList[0].IndexName
  1119. }
  1120. fileName += time.Now().Format("06.01.02") + `.xlsx` //文件名称
  1121. this.Ctx.Output.Download(downLoadnFilePath, fileName)
  1122. defer func() {
  1123. os.Remove(downLoadnFilePath)
  1124. }()
  1125. br.Ret = 200
  1126. br.Success = true
  1127. br.Msg = "success"
  1128. }