custom_analysis.go 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145
  1. package excel
  2. import (
  3. "encoding/json"
  4. "eta/eta_api/controllers"
  5. "eta/eta_api/models"
  6. excelPermissionModel "eta/eta_api/models/data_manage/data_manage_permission"
  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/models/system"
  11. "eta/eta_api/services"
  12. "eta/eta_api/services/data/data_manage_permission"
  13. "eta/eta_api/services/data/excel"
  14. excel2 "eta/eta_api/services/data/excel"
  15. "eta/eta_api/utils"
  16. "fmt"
  17. "github.com/rdlucklib/rdluck_tools/paging"
  18. "sort"
  19. "strconv"
  20. "strings"
  21. "time"
  22. )
  23. // CustomAnalysisController 自定义分析
  24. type CustomAnalysisController struct {
  25. controllers.BaseAuthController
  26. }
  27. // ExcelByName
  28. // @Title 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  29. // @Description 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  30. // @Param ExcelName query string true "搜索关键词"
  31. // @Success 200 {object} response.ExcelListResp
  32. // @router /excel_by_name [get]
  33. func (c *CustomAnalysisController) ExcelByName() {
  34. br := new(models.BaseResponse).Init()
  35. defer func() {
  36. c.Data["json"] = br
  37. c.ServeJSON()
  38. }()
  39. sysUser := c.SysUser
  40. if sysUser == nil {
  41. br.Msg = "请登录"
  42. br.ErrMsg = "请登录,SysUser Is Empty"
  43. br.Ret = 408
  44. return
  45. }
  46. excelName := c.GetString("ExcelName")
  47. if excelName == `` {
  48. br.Msg = "请选择表格"
  49. br.ErrMsg = "ExcelName未传"
  50. br.IsSendEmail = false
  51. return
  52. }
  53. resp := response.FindExcelInfoResp{}
  54. excelName = utils.TrimLRStr(excelName)
  55. // 获取数据详情
  56. excelDetail, err := excelModel.GetNoContentExcelInfoByName(excelName, utils.CUSTOM_ANALYSIS_TABLE)
  57. if err != nil {
  58. if err.Error() == utils.ErrNoRow() {
  59. br.Ret = 200
  60. br.Success = true
  61. br.Msg = "获取成功"
  62. br.Data = resp
  63. return
  64. }
  65. br.Msg = "获取表格事变"
  66. br.ErrMsg = err.Error()
  67. return
  68. }
  69. // 数据权限
  70. haveOperaAuth, err := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelDetail.ExcelInfoId, excelDetail.ExcelClassifyId, excelDetail.IsJoinPermission, c.SysUser.AdminId)
  71. if err != nil {
  72. br.Msg = "获取ETA表格失败"
  73. br.ErrMsg = "获取ETA表格权限失败,Err:" + err.Error()
  74. return
  75. }
  76. resp.IsFind = true
  77. resp.ExcelInfo = response.FindExcelInfo{
  78. ExcelInfoId: excelDetail.ExcelInfoId,
  79. Source: excelDetail.Source,
  80. ExcelType: excelDetail.ExcelType,
  81. ExcelName: excelDetail.ExcelName,
  82. UniqueCode: excelDetail.UniqueCode,
  83. ExcelClassifyId: excelDetail.ExcelClassifyId,
  84. SysUserId: excelDetail.SysUserId,
  85. SysUserRealName: excelDetail.SysUserRealName,
  86. ExcelImage: excelDetail.ExcelImage,
  87. FileUrl: excelDetail.FileUrl,
  88. Sort: excelDetail.Sort,
  89. ModifyTime: excelDetail.ModifyTime,
  90. CreateTime: excelDetail.CreateTime,
  91. Button: excel.GetExcelInfoOpButton(sysUser, excelDetail.SysUserId, excelDetail.Source, haveOperaAuth),
  92. HaveOperaAuth: true,
  93. }
  94. if excelDetail != nil {
  95. sheetList, err := excelModel.GetAllSheetItemList(excelDetail.ExcelInfoId)
  96. if err != nil {
  97. br.Msg = "获取sheet失败"
  98. br.ErrMsg = "获取sheet失败,err:" + err.Error()
  99. return
  100. }
  101. resp.SheetList = sheetList
  102. }
  103. //resp := response.ExcelListResp{
  104. // Paging: page,
  105. // List: list,
  106. //}
  107. br.Ret = 200
  108. br.Success = true
  109. br.Msg = "获取成功"
  110. br.Data = resp
  111. }
  112. // Add
  113. // @Title 新增表格接口
  114. // @Description 新增表格接口
  115. // @Param request body request.AddExcelInfoReq true "type json string"
  116. // @Success 200 {object} response.AddExcelInfoResp
  117. // @router /add [post]
  118. func (c *CustomAnalysisController) Add() {
  119. br := new(models.BaseResponse).Init()
  120. defer func() {
  121. c.Data["json"] = br
  122. c.ServeJSON()
  123. }()
  124. sysUser := c.SysUser
  125. if sysUser == nil {
  126. br.Msg = "请登录"
  127. br.ErrMsg = "请登录,SysUser Is Empty"
  128. br.Ret = 408
  129. return
  130. }
  131. deleteCache := true
  132. cacheKey := "CACHE_EXCEL_TABLE_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
  133. defer func() {
  134. if deleteCache {
  135. _ = utils.Rc.Delete(cacheKey)
  136. }
  137. }()
  138. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  139. deleteCache = false
  140. br.Msg = "系统处理中,请稍后重试!"
  141. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
  142. return
  143. }
  144. var req request.AddExcelInfoReq
  145. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  146. if err != nil {
  147. br.Msg = "参数解析异常!"
  148. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  149. return
  150. }
  151. req.ExcelName = strings.Trim(req.ExcelName, " ")
  152. if req.ExcelName == "" {
  153. br.Msg = "请填写表格名称!"
  154. br.IsSendEmail = false
  155. return
  156. }
  157. // 获取是否存在该表格名称
  158. {
  159. var condition string
  160. var pars []interface{}
  161. condition += " AND source=? "
  162. pars = append(pars, utils.CUSTOM_ANALYSIS_TABLE)
  163. condition += " AND excel_name=? "
  164. pars = append(pars, req.ExcelName)
  165. count, err := excelModel.GetExcelInfoCountByCondition(condition, pars)
  166. if err != nil {
  167. br.Msg = "判断表格名称是否存在失败"
  168. br.ErrMsg = "判断表格名称是否存在失败,Err:" + err.Error()
  169. return
  170. }
  171. if count > 0 {
  172. br.Msg = "表格名称已存在,请重新填写表格名称"
  173. br.IsSendEmail = false
  174. return
  175. }
  176. }
  177. if req.ExcelClassifyId <= 0 {
  178. br.Msg = "分类参数错误!"
  179. br.IsSendEmail = false
  180. return
  181. }
  182. excelInfo, err, errMsg, isSendEmail := excel.AddCustomAnalysisTable(utils.TrimLRStr(req.ExcelName), req.Content, req.ExcelImage, req.ExcelClassifyId, sysUser)
  183. if err != nil {
  184. br.Msg = "保存失败"
  185. if errMsg != `` {
  186. br.Msg = errMsg
  187. }
  188. br.ErrMsg = "保存失败,Err:" + err.Error()
  189. br.IsSendEmail = isSendEmail
  190. return
  191. }
  192. // 更新excel下载地址(默认的EXCEL需要更新,自定义表格不需要更新)
  193. //if req.Source == 1 {
  194. // go UpdateExcelInfoFileUrl(excelInfo)
  195. //}
  196. //
  197. resp := new(response.AddExcelInfoResp)
  198. resp.ExcelInfoId = excelInfo.ExcelInfoId
  199. resp.UniqueCode = excelInfo.UniqueCode
  200. // 生成excel文件
  201. go excel.UpdateExcelInfoFileUrl(excelInfo)
  202. //新增操作日志
  203. //{
  204. // excelLog := &data_manage.ExcelInfoLog{
  205. // //ExcelInfoLogId: 0,
  206. // ExcelInfoId: excelInfo.ExcelInfoId,
  207. // ExcelName: req.ExcelName,
  208. // ExcelClassifyId: req.ExcelClassifyId,
  209. // SysUserId: sysUser.AdminId,
  210. // SysUserRealName: sysUser.RealName,
  211. // UniqueCode: excelInfo.UniqueCode,
  212. // CreateTime: time.Now(),
  213. // Content: string(c.Ctx.Input.RequestBody),
  214. // Status: "新增表格",
  215. // Method: c.Ctx.Input.URI(),
  216. // }
  217. // go data_manage.AddExcelInfoLog(excelLog)
  218. //}
  219. br.Ret = 200
  220. br.Success = true
  221. br.Msg = "保存成功"
  222. br.Data = resp
  223. br.IsAddLog = false //数据量太大了,不写入日志吧
  224. }
  225. // Save
  226. // @Title 保存表格接口
  227. // @Description 保存表格接口
  228. // @Param request body request.AddExcelInfoReq true "type json string"
  229. // @Success 200 {object} response.AddExcelInfoResp
  230. // @router /save [post]
  231. func (c *CustomAnalysisController) Save() {
  232. br := new(models.BaseResponse).Init()
  233. defer func() {
  234. c.Data["json"] = br
  235. c.ServeJSON()
  236. }()
  237. sysUser := c.SysUser
  238. if sysUser == nil {
  239. br.Msg = "请登录"
  240. br.ErrMsg = "请登录,SysUser Is Empty"
  241. br.Ret = 408
  242. return
  243. }
  244. deleteCache := true
  245. cacheKey := "CACHE_EXCEL_TABLE_INFO_ADD_" + strconv.Itoa(sysUser.AdminId)
  246. defer func() {
  247. if deleteCache {
  248. _ = utils.Rc.Delete(cacheKey)
  249. }
  250. }()
  251. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  252. deleteCache = false
  253. br.Msg = "系统处理中,请稍后重试!"
  254. br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
  255. return
  256. }
  257. var req request.SaveExcelInfoReq
  258. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  259. if err != nil {
  260. br.Msg = "参数解析异常!"
  261. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  262. return
  263. }
  264. req.ExcelName = strings.Trim(req.ExcelName, " ")
  265. if req.ExcelName == "" {
  266. br.Msg = "请填写表格名称!"
  267. br.IsSendEmail = false
  268. return
  269. }
  270. if req.ExcelInfoId <= 0 {
  271. br.Msg = "请选择excel!"
  272. br.IsSendEmail = false
  273. return
  274. }
  275. if req.ExcelClassifyId <= 0 {
  276. br.Msg = "分类参数错误!"
  277. br.IsSendEmail = false
  278. return
  279. }
  280. excelInfo, err := excelModel.GetExcelInfoById(req.ExcelInfoId)
  281. if err != nil {
  282. br.Msg = "找不到该EXCEL!"
  283. br.ErrMsg = "找不到该EXCEL!err:" + err.Error()
  284. return
  285. }
  286. if excelInfo.Source != utils.CUSTOM_ANALYSIS_TABLE {
  287. br.Msg = "EXCEL异常!"
  288. br.IsSendEmail = false
  289. return
  290. }
  291. err, errMsg, isSendEmail := excel.SaveCustomAnalysisTable(excelInfo, utils.TrimLRStr(req.ExcelName), req.Content, req.ExcelImage, req.ExcelClassifyId, req.OpSheetList)
  292. if err != nil {
  293. br.Msg = "保存失败"
  294. if errMsg != `` {
  295. br.Msg = errMsg
  296. }
  297. br.ErrMsg = "保存失败,Err:" + err.Error()
  298. br.IsSendEmail = isSendEmail
  299. return
  300. }
  301. // 更新excel下载地址(默认的EXCEL需要更新,自定义表格不需要更新)
  302. //if req.Source == 1 {
  303. // go UpdateExcelInfoFileUrl(excelInfo)
  304. //}
  305. //
  306. resp := new(response.AddExcelInfoResp)
  307. resp.ExcelInfoId = excelInfo.ExcelInfoId
  308. resp.UniqueCode = excelInfo.UniqueCode
  309. // 生成excel文件
  310. go excel.UpdateExcelInfoFileUrl(excelInfo)
  311. //新增操作日志
  312. //{
  313. // excelLog := &data_manage.ExcelInfoLog{
  314. // //ExcelInfoLogId: 0,
  315. // ExcelInfoId: excelInfo.ExcelInfoId,
  316. // ExcelName: req.ExcelName,
  317. // ExcelClassifyId: req.ExcelClassifyId,
  318. // SysUserId: sysUser.AdminId,
  319. // SysUserRealName: sysUser.RealName,
  320. // UniqueCode: excelInfo.UniqueCode,
  321. // CreateTime: time.Now(),
  322. // Content: string(c.Ctx.Input.RequestBody),
  323. // Status: "新增表格",
  324. // Method: c.Ctx.Input.URI(),
  325. // }
  326. // go data_manage.AddExcelInfoLog(excelLog)
  327. //}
  328. br.Ret = 200
  329. br.Success = true
  330. br.Msg = "保存成功"
  331. br.Data = resp
  332. br.IsAddLog = false //数据量太大了,不写入日志吧
  333. }
  334. // BaseExcelDetail
  335. // @Title 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  336. // @Description 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  337. // @Param UniqueCode query string true "excel唯一编码"
  338. // @Success 200 {object} response.ExcelListResp
  339. // @router /excel/base [get]
  340. func (c *CustomAnalysisController) BaseExcelDetail() {
  341. br := new(models.BaseResponse).Init()
  342. defer func() {
  343. c.Data["json"] = br
  344. c.ServeJSON()
  345. }()
  346. sysUser := c.SysUser
  347. if sysUser == nil {
  348. br.Msg = "请登录"
  349. br.ErrMsg = "请登录,SysUser Is Empty"
  350. br.Ret = 408
  351. return
  352. }
  353. uniqueCode := c.GetString("UniqueCode")
  354. if uniqueCode == `` {
  355. br.Msg = "请选择表格"
  356. br.ErrMsg = "UniqueCode未传"
  357. br.IsSendEmail = false
  358. return
  359. }
  360. resp := response.FindExcelInfoResp{}
  361. // 获取数据详情
  362. excelDetail, err := excelModel.GetNoContentExcelInfoByUniqueCode(uniqueCode)
  363. if err != nil {
  364. if err.Error() == utils.ErrNoRow() {
  365. br.Ret = 200
  366. br.Success = true
  367. br.Msg = "获取成功"
  368. br.Data = resp
  369. return
  370. }
  371. br.Msg = "获取表格事变"
  372. br.ErrMsg = err.Error()
  373. return
  374. }
  375. // 编辑状态
  376. markStatus, err := services.UpdateExcelEditMark(excelDetail.ExcelInfoId, sysUser.AdminId, 2, sysUser.RealName)
  377. if err != nil {
  378. br.Msg = "查询标记状态失败"
  379. br.ErrMsg = "查询标记状态失败,Err:" + err.Error()
  380. return
  381. }
  382. // 数据权限
  383. //haveOperaAuth, err := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelDetail.ExcelInfoId, excelDetail.ExcelClassifyId, excelDetail.IsJoinPermission, c.SysUser.AdminId)
  384. //if err != nil {
  385. // br.Msg = "获取ETA表格失败"
  386. // br.ErrMsg = "获取ETA表格权限失败,Err:" + err.Error()
  387. // return
  388. //}
  389. // 自定义分析权限与其他表格略有差别...
  390. permissions, e := excelPermissionModel.GetExcelPermissionByExcelIdAndUserId(excelDetail.ExcelInfoId, sysUser.AdminId)
  391. if e != nil {
  392. br.Msg = "获取失败"
  393. br.ErrMsg = fmt.Sprintf("获取表格权限失败, %v", e)
  394. return
  395. }
  396. var permissionType []int
  397. for _, v := range permissions {
  398. permissionType = append(permissionType, v.PermissionType)
  399. }
  400. opButton := excel.GetCustomAnalysisOpButton(sysUser, excelDetail.SysUserId, permissionType)
  401. resp.IsFind = true
  402. resp.ExcelInfo = response.FindExcelInfo{
  403. ExcelInfoId: excelDetail.ExcelInfoId,
  404. Source: excelDetail.Source,
  405. ExcelType: excelDetail.ExcelType,
  406. ExcelName: excelDetail.ExcelName,
  407. UniqueCode: excelDetail.UniqueCode,
  408. ExcelClassifyId: excelDetail.ExcelClassifyId,
  409. SysUserId: excelDetail.SysUserId,
  410. SysUserRealName: excelDetail.SysUserRealName,
  411. ExcelImage: excelDetail.ExcelImage,
  412. FileUrl: excelDetail.FileUrl,
  413. Sort: excelDetail.Sort,
  414. ModifyTime: excelDetail.ModifyTime,
  415. CreateTime: excelDetail.CreateTime,
  416. Button: opButton,
  417. HaveOperaAuth: true,
  418. }
  419. if markStatus.Status == 0 {
  420. resp.ExcelInfo.CanEdit = true
  421. } else {
  422. resp.ExcelInfo.Editor = markStatus.Editor
  423. }
  424. if excelDetail != nil {
  425. sheetList, err := excelModel.GetAllSheetItemList(excelDetail.ExcelInfoId)
  426. if err != nil {
  427. br.Msg = "获取sheet失败"
  428. br.ErrMsg = "获取sheet失败,err:" + err.Error()
  429. return
  430. }
  431. if len(sheetList) > 0 {
  432. sheetIdList := make([]int, 0)
  433. for _, v := range sheetList {
  434. sheetIdList = append(sheetIdList, v.ExcelSheetId)
  435. }
  436. // 获取所有sheet的第一页的数据
  437. sheetDataList, err := excelModel.GetSheetDataListBySheetIdListAndPage(sheetIdList, 1)
  438. if err != nil {
  439. br.Msg = "获取sheet中的数据失败"
  440. br.ErrMsg = "获取sheet中的数据失败,err:" + err.Error()
  441. return
  442. }
  443. sheetDataMap := make(map[int]*excelModel.ExcelSheetData)
  444. for _, v := range sheetDataList {
  445. sheetDataMap[v.ExcelSheetId] = v
  446. }
  447. for k, v := range sheetList {
  448. sheetData, ok := sheetDataMap[v.ExcelSheetId]
  449. if !ok {
  450. continue
  451. }
  452. v.Data = sheetData
  453. sheetList[k] = v
  454. }
  455. }
  456. // TODO 合并单元格信息、计算公式
  457. resp.SheetList = sheetList
  458. }
  459. //resp := response.ExcelListResp{
  460. // Paging: page,
  461. // List: list,
  462. //}
  463. br.Ret = 200
  464. br.Success = true
  465. br.Msg = "获取成功"
  466. br.Data = resp
  467. }
  468. // ExcelDataList
  469. // @Title 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  470. // @Description 根据excel名称获取表格详情(基础信息+第一页初始化数据)
  471. // @Param UniqueCode query string true "excel唯一编码"
  472. // @Param Page query int true "页码"
  473. // @Success 200 {object} response.ExcelListResp
  474. // @router /excel/data [get]
  475. func (c *CustomAnalysisController) ExcelDataList() {
  476. br := new(models.BaseResponse).Init()
  477. defer func() {
  478. c.Data["json"] = br
  479. c.ServeJSON()
  480. }()
  481. sysUser := c.SysUser
  482. if sysUser == nil {
  483. br.Msg = "请登录"
  484. br.ErrMsg = "请登录,SysUser Is Empty"
  485. br.Ret = 408
  486. return
  487. }
  488. uniqueCode := c.GetString("UniqueCode")
  489. if uniqueCode == `` {
  490. br.Msg = "请选择表格"
  491. br.ErrMsg = "UniqueCode未传"
  492. br.IsSendEmail = false
  493. return
  494. }
  495. page, _ := c.GetInt("Page")
  496. if page <= 0 {
  497. br.Msg = "页码异常"
  498. br.ErrMsg = "页码异常"
  499. br.IsSendEmail = false
  500. return
  501. }
  502. sheetList := make([]*excelModel.SheetItem, 0)
  503. // 获取数据详情
  504. excelDetail, err := excelModel.GetNoContentExcelInfoByUniqueCode(uniqueCode)
  505. if err != nil {
  506. if err.Error() == utils.ErrNoRow() {
  507. br.Ret = 200
  508. br.Success = true
  509. br.Msg = "获取成功"
  510. br.Data = sheetList
  511. return
  512. }
  513. br.Msg = "获取表格事变"
  514. br.ErrMsg = err.Error()
  515. return
  516. }
  517. if excelDetail.Source != utils.CUSTOM_ANALYSIS_TABLE {
  518. br.Msg = "excel异常"
  519. br.ErrMsg = "excel异常"
  520. br.IsSendEmail = false
  521. return
  522. }
  523. if excelDetail != nil {
  524. sheetList, err = excelModel.GetAllNoConfigSheetItemList(excelDetail.ExcelInfoId)
  525. if err != nil {
  526. br.Msg = "获取sheet失败"
  527. br.ErrMsg = "获取sheet失败,err:" + err.Error()
  528. return
  529. }
  530. if len(sheetList) > 0 {
  531. sheetIdList := make([]int, 0)
  532. for _, v := range sheetList {
  533. sheetIdList = append(sheetIdList, v.ExcelSheetId)
  534. }
  535. // 获取所有sheet的第一页的数据
  536. sheetDataList, err := excelModel.GetSheetDataListBySheetIdListAndPage(sheetIdList, page)
  537. if err != nil {
  538. br.Msg = "获取sheet中的数据失败"
  539. br.ErrMsg = "获取sheet中的数据失败,err:" + err.Error()
  540. return
  541. }
  542. sheetDataMap := make(map[int]*excelModel.ExcelSheetData)
  543. for _, v := range sheetDataList {
  544. sheetDataMap[v.ExcelSheetId] = v
  545. }
  546. for k, v := range sheetList {
  547. sheetData, ok := sheetDataMap[v.ExcelSheetId]
  548. if !ok {
  549. continue
  550. }
  551. v.Data = sheetData
  552. sheetList[k] = v
  553. }
  554. }
  555. // TODO 合并单元格信息、计算公式
  556. }
  557. //resp := response.ExcelListResp{
  558. // Paging: page,
  559. // List: list,
  560. //}
  561. br.Ret = 200
  562. br.Success = true
  563. br.Msg = "获取成功"
  564. br.Data = sheetList
  565. }
  566. // ClassifyList
  567. // @Title 分类列表
  568. // @Description 分类列表
  569. // @Param IsShare query bool false "是否共享表格: true-是; false-否(默认)"
  570. // @Success 200 {object} response.ExcelClassifyListResp
  571. // @router /excel_classify/list [get]
  572. func (c *CustomAnalysisController) ClassifyList() {
  573. br := new(models.BaseResponse).Init()
  574. defer func() {
  575. if br.ErrMsg == "" {
  576. br.IsSendEmail = false
  577. }
  578. c.Data["json"] = br
  579. c.ServeJSON()
  580. }()
  581. sysUser := c.SysUser
  582. if sysUser == nil {
  583. br.Msg = "请登录"
  584. br.ErrMsg = "请登录,SysUser Is Empty"
  585. br.Ret = 408
  586. return
  587. }
  588. source := utils.CUSTOM_ANALYSIS_TABLE
  589. isShare, _ := c.GetBool("IsShare")
  590. resp := new(response.ExcelClassifyListResp)
  591. // 查询我分享的/分享给我的表格
  592. excels, e := excelPermissionModel.GetAdminAuthExcelInfoPermission(source, sysUser.AdminId, "")
  593. if e != nil {
  594. br.Msg = "获取失败"
  595. br.ErrMsg = fmt.Sprintf("获取我分享的/分享给我的表格失败, %v", e)
  596. return
  597. }
  598. hasShareMap := make(map[int]bool) // 是否已分享标记
  599. for _, v := range excels {
  600. if v.CreateUserId == sysUser.AdminId {
  601. hasShareMap[int(v.ExcelInfoId)] = true
  602. }
  603. }
  604. // 共享
  605. if isShare {
  606. shareExcel := new(excelModel.ExcelClassifyItems)
  607. shareExcel.ExcelClassifyId = excelModel.CustomAnalysisMenuShareId
  608. shareExcel.ExcelClassifyName = "我共享的"
  609. shareExcel.Level = 1
  610. shareExcel.Sort = 1
  611. shareExcel.UniqueCode = fmt.Sprintf("SHARE%d", shareExcel.ExcelClassifyId)
  612. shareExcel.HaveOperaAuth = true
  613. shareExcel.Children = make([]*excelModel.ExcelClassifyItems, 0)
  614. sharedExcel := new(excelModel.ExcelClassifyItems)
  615. sharedExcel.ExcelClassifyId = excelModel.CustomAnalysisMenuSharedId
  616. sharedExcel.ExcelClassifyName = "收到共享"
  617. sharedExcel.Level = 1
  618. sharedExcel.Sort = 2
  619. sharedExcel.UniqueCode = fmt.Sprintf("SHARED%d", sharedExcel.ExcelClassifyId)
  620. sharedExcel.HaveOperaAuth = true
  621. sharedExcel.Children = make([]*excelModel.ExcelClassifyItems, 0)
  622. // 收到共享细分目录
  623. sharedUserClassify := make(map[int]*excelModel.ExcelClassifyItems)
  624. adminIdName := make(map[int]string)
  625. {
  626. adminOb := new(system.Admin)
  627. adminList, e := adminOb.GetItemsByCondition(``, make([]interface{}, 0), []string{}, "")
  628. if e != nil {
  629. br.Msg = "获取失败"
  630. br.ErrMsg = fmt.Sprintf("获取用户列表失败, %v", e)
  631. return
  632. }
  633. for _, v := range adminList {
  634. adminIdName[v.AdminId] = v.RealName
  635. }
  636. }
  637. sortUser := make([]int, 0)
  638. shareExists := make(map[int]bool)
  639. for _, v := range excels {
  640. item := new(excelModel.ExcelClassifyItems)
  641. item.ExcelInfoId = int(v.ExcelInfoId)
  642. item.ExcelClassifyName = v.ExcelName
  643. item.UniqueCode = v.UniqueCode
  644. item.HaveOperaAuth = true
  645. item.HasShare = hasShareMap[int(v.ExcelInfoId)]
  646. // 我共享的
  647. if v.CreateUserId == sysUser.AdminId && !shareExists[int(v.ExcelInfoId)] {
  648. shareExists[int(v.ExcelInfoId)] = true
  649. item.Level = 2
  650. item.ParentId = shareExcel.ExcelClassifyId
  651. shareExcel.Children = append(shareExcel.Children, item)
  652. continue
  653. }
  654. // 收到共享
  655. if int(v.SysUserId) == sysUser.AdminId {
  656. if adminIdName[v.CreateUserId] == "" {
  657. // 分享人用户不存在, 那么不显示该分类
  658. continue
  659. }
  660. if !utils.InArrayByInt(sortUser, v.CreateUserId) {
  661. sortUser = append(sortUser, v.CreateUserId)
  662. }
  663. if sharedUserClassify[v.CreateUserId] == nil {
  664. us := new(excelModel.ExcelClassifyItems)
  665. us.ExcelClassifyId = v.CreateUserId // 用户ID作为分类ID
  666. us.ExcelClassifyName = fmt.Sprintf("%s的表格", adminIdName[v.CreateUserId])
  667. us.Level = 2
  668. us.UniqueCode = fmt.Sprintf("%d-%d", sharedExcel.ExcelClassifyId, v.CreateUserId)
  669. us.HaveOperaAuth = true
  670. us.Children = make([]*excelModel.ExcelClassifyItems, 0)
  671. sharedUserClassify[v.CreateUserId] = us
  672. }
  673. item.Level = 3
  674. item.ParentId = sharedUserClassify[v.CreateUserId].ExcelClassifyId
  675. item.PermissionType = v.PermissionType
  676. sharedUserClassify[v.CreateUserId].Children = append(sharedUserClassify[v.CreateUserId].Children, item)
  677. }
  678. }
  679. for _, v := range sortUser {
  680. if sharedUserClassify[v] != nil {
  681. sharedExcel.Children = append(sharedExcel.Children, sharedUserClassify[v])
  682. }
  683. }
  684. resp.AllNodes = make([]*excelModel.ExcelClassifyItems, 0)
  685. resp.AllNodes = append(resp.AllNodes, shareExcel, sharedExcel)
  686. br.Ret = 200
  687. br.Success = true
  688. br.Msg = "获取成功"
  689. br.Data = resp
  690. return
  691. }
  692. // 我的表格
  693. classifyList, err := excelModel.GetAdminExcelClassifyBySource(source, sysUser.AdminId)
  694. if err != nil {
  695. br.Msg = "获取失败"
  696. br.ErrMsg = "获取数据失败,Err:" + err.Error()
  697. return
  698. }
  699. classifyMap := make(map[int]*excelModel.ExcelClassifyItems)
  700. for _, v := range classifyList {
  701. v.HaveOperaAuth = true
  702. classifyMap[v.ExcelClassifyId] = v
  703. }
  704. allExcelInfo, err := excelModel.GetNoContentExcelInfoAll(source, sysUser.AdminId)
  705. if err != nil && err.Error() != utils.ErrNoRow() {
  706. br.Msg = "获取失败"
  707. br.ErrMsg = "获取表格信息失败,Err:" + err.Error()
  708. return
  709. }
  710. excelInfoMap := make(map[int][]*excelModel.ExcelClassifyItems)
  711. for _, v := range allExcelInfo {
  712. v.HaveOperaAuth = true
  713. v.HasShare = hasShareMap[v.ExcelInfoId]
  714. excelInfoMap[v.ExcelClassifyId] = append(excelInfoMap[v.ExcelClassifyId], v)
  715. }
  716. classifyListMap := make(map[int][]*excelModel.ExcelClassifyItems)
  717. for _, v := range classifyList {
  718. if v.ParentId > 0 {
  719. classifyListMap[v.ParentId] = append(classifyListMap[v.ParentId], v)
  720. }
  721. if existItems, ok := excelInfoMap[v.ExcelClassifyId]; ok {
  722. v.Children = existItems
  723. }
  724. }
  725. for key, classify := range classifyList {
  726. subList, ok := classifyListMap[classify.ExcelClassifyId]
  727. if ok {
  728. classifyList[key].Children = append(classifyList[key].Children, subList...)
  729. sort.Slice(classifyList[key].Children, func(i, j int) bool {
  730. return excelModel.ExcelClassifyItemBySort(classifyList[key].Children[i], classifyList[key].Children[j])
  731. })
  732. }
  733. }
  734. nodeAll := make([]*excelModel.ExcelClassifyItems, 0)
  735. for _, v := range classifyList {
  736. if v.ParentId == 0 {
  737. sort.Slice(v.Children, func(i, j int) bool {
  738. return excelModel.ExcelClassifyItemBySort(v.Children[i], v.Children[j])
  739. })
  740. nodeAll = append(nodeAll, v)
  741. }
  742. }
  743. resp.AllNodes = nodeAll
  744. br.Ret = 200
  745. br.Success = true
  746. br.Msg = "获取成功"
  747. br.Data = resp
  748. }
  749. // List
  750. // @Title 自定义分析列表
  751. // @Description ETA表格列表接口
  752. // @Param PageSize query int true "每页数据条数"
  753. // @Param CurrentIndex query int true "当前页页码,从1开始"
  754. // @Param ExcelClassifyId query int true "分类id"
  755. // @Param Keyword query string true "搜索关键词"
  756. // @Param IsShare query bool false "是否共享表格: true-是; false-否(默认)"
  757. // @Success 200 {object} response.ExcelListResp
  758. // @router /excel/list [get]
  759. func (c *CustomAnalysisController) List() {
  760. br := new(models.BaseResponse).Init()
  761. defer func() {
  762. if br.ErrMsg == "" {
  763. br.IsSendEmail = false
  764. }
  765. c.Data["json"] = br
  766. c.ServeJSON()
  767. }()
  768. sysUser := c.SysUser
  769. if sysUser == nil {
  770. br.Msg = "请登录"
  771. br.ErrMsg = "请登录,SysUser Is Empty"
  772. br.Ret = 408
  773. return
  774. }
  775. excelClassifyId, _ := c.GetInt("ExcelClassifyId")
  776. pageSize, _ := c.GetInt("PageSize")
  777. currentIndex, _ := c.GetInt("CurrentIndex")
  778. keyword := c.GetString("Keyword")
  779. keyword = strings.TrimSpace(keyword)
  780. adminId := sysUser.AdminId
  781. isShare, _ := c.GetBool("IsShare")
  782. source := utils.CUSTOM_ANALYSIS_TABLE
  783. var condition string
  784. var pars []interface{}
  785. condition += " AND source = ?"
  786. pars = append(pars, source)
  787. // 共享的
  788. //hasShareMap := make(map[int]bool)
  789. if isShare {
  790. if keyword != "" {
  791. keyword = fmt.Sprint("%", keyword, "%")
  792. }
  793. // 查询我分享的/分享给我的表格
  794. excels, e := excelPermissionModel.GetAdminAuthExcelInfoPermission(source, adminId, keyword)
  795. if e != nil {
  796. br.Msg = "获取失败"
  797. br.ErrMsg = fmt.Sprintf("获取我分享的/分享给我的表格失败, %v", e)
  798. return
  799. }
  800. var excelIds, shareIds, sharedIds, userIds []int
  801. for _, v := range excels {
  802. id := int(v.ExcelInfoId)
  803. // 无分类ID
  804. if excelClassifyId <= 0 && !utils.InArrayByInt(excelIds, id) {
  805. excelIds = append(excelIds, id)
  806. continue
  807. }
  808. // 用户分类
  809. if excelClassifyId == v.CreateUserId {
  810. userIds = append(userIds, id)
  811. continue
  812. }
  813. // 我共享的
  814. if excelClassifyId == excelModel.CustomAnalysisMenuShareId && v.CreateUserId == sysUser.AdminId {
  815. shareIds = append(shareIds, id)
  816. //hasShareMap[id] = true
  817. continue
  818. }
  819. // 收到共享
  820. if excelClassifyId == excelModel.CustomAnalysisMenuSharedId && int(v.SysUserId) == sysUser.AdminId {
  821. sharedIds = append(sharedIds, id)
  822. continue
  823. }
  824. }
  825. if excelClassifyId > 0 {
  826. switch excelClassifyId {
  827. case excelModel.CustomAnalysisMenuShareId: // 我共享的
  828. excelIds = shareIds
  829. case excelModel.CustomAnalysisMenuSharedId: // 收到共享
  830. excelIds = sharedIds
  831. default: // 用户目录
  832. excelIds = userIds
  833. }
  834. }
  835. if len(excelIds) == 0 {
  836. page := paging.GetPaging(currentIndex, pageSize, 0)
  837. resp := response.ExcelListResp{
  838. Paging: page,
  839. List: make([]*excelModel.MyExcelInfoList, 0),
  840. }
  841. br.Ret = 200
  842. br.Success = true
  843. br.Msg = "获取成功"
  844. br.Data = resp
  845. return
  846. }
  847. condition += fmt.Sprintf(` AND excel_info_id IN (%s)`, utils.GetOrmInReplace(len(excelIds)))
  848. pars = append(pars, excelIds)
  849. } else {
  850. condition += ` AND sys_user_id = ?`
  851. pars = append(pars, adminId)
  852. }
  853. // 筛选分类
  854. if !isShare && excelClassifyId > 0 {
  855. _, err := excelModel.GetExcelClassifyById(excelClassifyId)
  856. if err != nil && err.Error() != utils.ErrNoRow() {
  857. br.Msg = "获取表格信息失败"
  858. br.ErrMsg = "获取信息失败,GetExcelClassify,Err:" + err.Error()
  859. return
  860. }
  861. childClassify, e, _ := excel2.GetChildClassifyByClassifyId(excelClassifyId, source)
  862. if e != nil && e.Error() != utils.ErrNoRow() {
  863. br.Msg = "获取失败"
  864. br.ErrMsg = "获取分类信息失败, GetEdbClassify,Err:" + e.Error()
  865. return
  866. }
  867. if len(childClassify) == 0 {
  868. condition += " AND excel_classify_id = ? "
  869. pars = append(pars, excelClassifyId)
  870. } else {
  871. classifyIds := []int{excelClassifyId}
  872. for _, v := range childClassify {
  873. classifyIds = append(classifyIds, v.ExcelClassifyId)
  874. }
  875. condition += fmt.Sprintf(` AND excel_classify_id IN (%s) `, utils.GetOrmInReplace(len(classifyIds)))
  876. pars = append(pars, classifyIds)
  877. }
  878. }
  879. if keyword != "" {
  880. condition += ` AND (excel_name LIKE ?)`
  881. pars = utils.GetLikeKeywordPars(pars, keyword, 1)
  882. }
  883. // 获取表格信息
  884. var total int
  885. page := paging.GetPaging(currentIndex, pageSize, total)
  886. var startSize int
  887. if pageSize <= 0 {
  888. pageSize = utils.PageSize20
  889. }
  890. if currentIndex <= 0 {
  891. currentIndex = 1
  892. }
  893. startSize = paging.StartIndex(currentIndex, pageSize)
  894. list, err := excelModel.GetNoContentExcelListByCondition(condition, pars, startSize, pageSize)
  895. if err != nil && err.Error() != utils.ErrNoRow() {
  896. br.Success = true
  897. br.Msg = "获取表格信息失败"
  898. br.ErrMsg = "获取表格信息失败,Err:" + err.Error()
  899. return
  900. }
  901. for _, v := range list {
  902. v.HaveOperaAuth = true
  903. //v.Button.CancelShareButton = hasShareMap[v.ExcelInfoId]
  904. }
  905. // 总数据量
  906. dataCount, err := excelModel.GetExcelListCountByCondition(condition, pars)
  907. if err != nil && err.Error() != utils.ErrNoRow() {
  908. br.Msg = "获取表格列表信息失败"
  909. br.ErrMsg = "获取表格列表数据总数失败,Err:" + err.Error()
  910. return
  911. }
  912. page = paging.GetPaging(currentIndex, pageSize, dataCount)
  913. resp := response.ExcelListResp{
  914. Paging: page,
  915. List: list,
  916. }
  917. br.Ret = 200
  918. br.Success = true
  919. br.Msg = "获取成功"
  920. br.Data = resp
  921. }
  922. // Share
  923. // @Title 分享表格
  924. // @Description 分享表格
  925. // @Param request body request.ShareExcelInfoReq true "type json string"
  926. // @Success 200 string "操作成功"
  927. // @router /excel/share [post]
  928. func (c *CustomAnalysisController) Share() {
  929. br := new(models.BaseResponse).Init()
  930. defer func() {
  931. if br.ErrMsg != "" {
  932. br.IsSendEmail = false
  933. }
  934. c.Data["json"] = br
  935. c.ServeJSON()
  936. }()
  937. var req request.ShareExcelInfoReq
  938. err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
  939. if err != nil {
  940. br.Msg = "参数解析异常!"
  941. br.ErrMsg = "参数解析失败,Err:" + err.Error()
  942. return
  943. }
  944. sysUser := c.SysUser
  945. if sysUser == nil {
  946. br.Msg = "请登录"
  947. br.ErrMsg = "请登录,SysUser Is Empty"
  948. br.Ret = 408
  949. return
  950. }
  951. if req.ExcelInfoId <= 0 {
  952. br.Msg = "请选择表格"
  953. return
  954. }
  955. excelInfo, e := excelModel.GetExcelInfoById(req.ExcelInfoId)
  956. if e != nil {
  957. if e.Error() == utils.ErrNoRow() {
  958. br.Msg = "表格不存在, 请刷新页面"
  959. return
  960. }
  961. br.Msg = "操作失败"
  962. br.ErrMsg = fmt.Sprintf("获取表格失败, %v", e)
  963. return
  964. }
  965. if excelInfo.SysUserId != sysUser.AdminId {
  966. br.Msg = "无权操作"
  967. br.ErrMsg = fmt.Sprintf("无权设置表格权限, ExcelInfoId: %d, SysAdminId: %d", req.ExcelInfoId, sysUser.AdminId)
  968. return
  969. }
  970. source := utils.CUSTOM_ANALYSIS_TABLE
  971. newPermissions := make([]*excelPermissionModel.ExcelInfoPermission, 0)
  972. for _, v := range req.ViewUserIds {
  973. newPermissions = append(newPermissions, &excelPermissionModel.ExcelInfoPermission{
  974. ExcelInfoId: int32(req.ExcelInfoId),
  975. Source: int32(source),
  976. SysUserId: int32(v),
  977. CreateTime: time.Now().Local(),
  978. ModifyTime: time.Now().Local(),
  979. PermissionType: 1,
  980. })
  981. }
  982. for _, v := range req.EditUserIds {
  983. newPermissions = append(newPermissions, &excelPermissionModel.ExcelInfoPermission{
  984. ExcelInfoId: int32(req.ExcelInfoId),
  985. Source: int32(source),
  986. SysUserId: int32(v),
  987. CreateTime: time.Now().Local(),
  988. ModifyTime: time.Now().Local(),
  989. PermissionType: 2,
  990. })
  991. }
  992. if e := excelPermissionModel.ClearAndSetExcelInfoPermission(source, req.ExcelInfoId, newPermissions); e != nil {
  993. br.Msg = "操作失败"
  994. br.ErrMsg = fmt.Sprintf("设置表格权限失败, %v", e)
  995. return
  996. }
  997. br.Ret = 200
  998. br.Success = true
  999. br.Msg = "操作成功"
  1000. }
  1001. // ShareDetail
  1002. // @Title 分享表格-详情
  1003. // @Description 分享表格-详情
  1004. // @Param ExcelInfoId query int true "表格ID"
  1005. // @Success 200 {object} response.ShareExcelInfoDetail
  1006. // @router /excel/share_detail [get]
  1007. func (c *CustomAnalysisController) ShareDetail() {
  1008. br := new(models.BaseResponse).Init()
  1009. defer func() {
  1010. if br.ErrMsg != "" {
  1011. br.IsSendEmail = false
  1012. }
  1013. c.Data["json"] = br
  1014. c.ServeJSON()
  1015. }()
  1016. sysUser := c.SysUser
  1017. if sysUser == nil {
  1018. br.Msg = "请登录"
  1019. br.ErrMsg = "请登录,SysUser Is Empty"
  1020. br.Ret = 408
  1021. return
  1022. }
  1023. excelInfoId, _ := c.GetInt("ExcelInfoId")
  1024. if excelInfoId <= 0 {
  1025. br.Msg = "请选择表格"
  1026. return
  1027. }
  1028. permissions, e := excelPermissionModel.GetExcelPermissionBySourceAndId(excelInfoId, utils.CUSTOM_ANALYSIS_TABLE)
  1029. if e != nil {
  1030. br.Msg = "获取失败"
  1031. br.ErrMsg = fmt.Sprintf("获取表格权限失败, %v", e)
  1032. return
  1033. }
  1034. resp := new(response.ShareExcelInfoDetail)
  1035. resp.ExcelInfoId = excelInfoId
  1036. for _, v := range permissions {
  1037. if v.PermissionType == 1 {
  1038. resp.ViewUserIds = append(resp.ViewUserIds, int(v.SysUserId))
  1039. }
  1040. if v.PermissionType == 2 {
  1041. resp.EditUserIds = append(resp.EditUserIds, int(v.SysUserId))
  1042. }
  1043. }
  1044. br.Data = resp
  1045. br.Ret = 200
  1046. br.Success = true
  1047. br.Msg = "获取成功"
  1048. }