excel_op.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. package excel
  2. import (
  3. "errors"
  4. excelModel "eta/eta_api/models/data_manage/excel"
  5. "eta/eta_api/models/system"
  6. "eta/eta_api/services"
  7. "eta/eta_api/services/alarm_msg"
  8. "eta/eta_api/services/data/data_manage_permission"
  9. excel "eta/eta_api/services/excel"
  10. "eta/eta_api/utils"
  11. "fmt"
  12. "os"
  13. "strconv"
  14. "time"
  15. )
  16. // Delete excel删除
  17. func Delete(excelInfo *excelModel.ExcelInfo, sysUser *system.Admin) (err error, errMsg string, isSendEmail bool) {
  18. isSendEmail = true
  19. // 操作权限校验
  20. {
  21. // 数据权限
  22. haveOperaAuth, tmpErr := data_manage_permission.CheckExcelPermissionByExcelInfoId(excelInfo.ExcelInfoId, excelInfo.ExcelClassifyId, excelInfo.IsJoinPermission, sysUser.AdminId)
  23. if err != nil {
  24. errMsg = "获取ETA表格权限失败"
  25. err = errors.New("获取ETA表格权限失败,Err:" + tmpErr.Error())
  26. return
  27. }
  28. button := GetExcelInfoOpButton(sysUser, excelInfo.SysUserId, excelInfo.Source, haveOperaAuth)
  29. if !button.DeleteButton {
  30. errMsg = "无操作权限"
  31. err = errors.New(errMsg)
  32. isSendEmail = false
  33. return
  34. }
  35. }
  36. // 自定义分析,需要做这个指标关联的校验
  37. if excelInfo.Source == utils.CUSTOM_ANALYSIS_TABLE {
  38. list, tmpErr := excelModel.GetExcelEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
  39. if tmpErr != nil {
  40. errMsg = `获取关联的指标信息失败`
  41. err = tmpErr
  42. return
  43. }
  44. if len(list) > 0 {
  45. errMsg = "已关联指标,不可删除!"
  46. err = errors.New(errMsg)
  47. isSendEmail = false
  48. return
  49. }
  50. } else if excelInfo.Source == utils.BALANCE_TABLE {
  51. // 如果父级删除是否删除子表和静态表,同时删除图表和图表数据
  52. excelIds := make([]int, 0)
  53. //查询动态表所有的子表,并复制为静态表
  54. condition := " AND source=?"
  55. var pars []interface{}
  56. pars = append(pars, utils.BALANCE_TABLE)
  57. excelIds = append(excelIds, excelInfo.ExcelInfoId)
  58. if excelInfo.ParentId == 0 {
  59. if excelInfo.BalanceType == 0 {
  60. condition += " AND (parent_id = ? or rel_excel_info_id=?)"
  61. pars = append(pars, excelInfo.ExcelInfoId, excelInfo.ExcelInfoId)
  62. } else if excelInfo.BalanceType == 1 {
  63. condition += " AND (parent_id = ?)"
  64. pars = append(pars, excelInfo.ExcelInfoId)
  65. }
  66. excelList, e := excelModel.GetNoContentExcelInfoListByConditionNoPage(condition, pars)
  67. if e != nil {
  68. err = fmt.Errorf("获取子表失败 %s", err.Error())
  69. errMsg = "获取子表失败"
  70. return
  71. }
  72. for _, v := range excelList {
  73. excelIds = append(excelIds, v.ExcelInfoId)
  74. }
  75. }
  76. // 相关联指标
  77. mappingListTmp, e := excelModel.GetExcelChartEdbMappingByExcelInfoIds(excelIds)
  78. if e != nil {
  79. errMsg = "获取失败"
  80. err = fmt.Errorf(" 获取图表,指标信息失败 Err:%s", e.Error())
  81. return
  82. }
  83. charInfoIds := make([]int, 0)
  84. for _, v := range mappingListTmp {
  85. charInfoIds = append(charInfoIds, v.ChartInfoId)
  86. }
  87. err = excelModel.DeleteExcelChartEdbAndData(excelIds, charInfoIds)
  88. if err != nil {
  89. errMsg = "删除表格失败"
  90. err = fmt.Errorf("删除图表,指标信息失败 Err:%s", err.Error())
  91. return
  92. }
  93. return
  94. }
  95. // 标记删除
  96. excelInfo.IsDelete = 1
  97. excelInfo.ModifyTime = time.Now()
  98. err = excelInfo.Update([]string{"IsDelete", "ModifyTime"})
  99. return
  100. }
  101. // Copy 复制excel
  102. func Copy(oldExcelInfoId, excelClassifyId int, excelName string, sysUser *system.Admin) (excelInfo *excelModel.ExcelInfo, err error, errMsg string, isSendEmail bool) {
  103. isSendEmail = true
  104. excelName = utils.TrimLRStr(excelName)
  105. excelClassify, err := excelModel.GetExcelClassifyById(excelClassifyId)
  106. if err != nil {
  107. if err.Error() == utils.ErrNoRow() {
  108. errMsg = "分类不存在"
  109. err = errors.New(errMsg)
  110. isSendEmail = false
  111. return
  112. }
  113. errMsg = "获取分类信息失败"
  114. return
  115. }
  116. if excelClassify == nil {
  117. errMsg = "分类不存在"
  118. err = errors.New(errMsg)
  119. isSendEmail = false
  120. return
  121. }
  122. // 获取原ETA表格信息
  123. oldExcelInfo, err := excelModel.GetExcelInfoById(oldExcelInfoId)
  124. if err != nil {
  125. errMsg = "获取ETA表格失败"
  126. return
  127. }
  128. // 操作权限校验
  129. {
  130. // 数据权限
  131. haveOperaAuth, tmpErr := data_manage_permission.CheckExcelPermissionByExcelInfoId(oldExcelInfo.ExcelInfoId, oldExcelInfo.ExcelClassifyId, oldExcelInfo.IsJoinPermission, sysUser.AdminId)
  132. if err != nil {
  133. errMsg = "获取ETA表格权限失败"
  134. err = errors.New("获取ETA表格权限失败,Err:" + tmpErr.Error())
  135. return
  136. }
  137. button := GetExcelInfoOpButton(sysUser, oldExcelInfo.SysUserId, oldExcelInfo.Source, haveOperaAuth)
  138. if !button.CopyButton {
  139. errMsg = "无操作权限"
  140. err = errors.New(errMsg)
  141. isSendEmail = false
  142. return
  143. }
  144. }
  145. // 检验分类下是否存在该表格名称
  146. {
  147. var condition string
  148. var pars []interface{}
  149. condition += " AND excel_classify_id=? "
  150. pars = append(pars, excelClassifyId)
  151. condition += " AND excel_name=? "
  152. pars = append(pars, excelName)
  153. count, tmpErr := excelModel.GetExcelInfoCountByCondition(condition, pars)
  154. if tmpErr != nil {
  155. errMsg = "判断表格名称是否存在失败"
  156. err = tmpErr
  157. return
  158. }
  159. if count > 0 {
  160. errMsg = "表格名称已存在,请重新填写表格名称"
  161. err = errors.New(errMsg)
  162. isSendEmail = false
  163. return
  164. }
  165. }
  166. // 表格信息
  167. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  168. excelInfo = &excelModel.ExcelInfo{
  169. //ExcelInfoId: 0,
  170. ExcelName: excelName,
  171. Source: oldExcelInfo.Source,
  172. ExcelType: oldExcelInfo.ExcelType,
  173. UniqueCode: utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
  174. ExcelClassifyId: excelClassifyId,
  175. SysUserId: sysUser.AdminId,
  176. SysUserRealName: sysUser.RealName,
  177. Content: oldExcelInfo.Content,
  178. ExcelImage: oldExcelInfo.ExcelImage,
  179. FileUrl: oldExcelInfo.FileUrl,
  180. Sort: 0,
  181. IsDelete: 0,
  182. ModifyTime: time.Now(),
  183. CreateTime: time.Now(),
  184. }
  185. // 如果不是自定义分析,那么直接加主表就好了
  186. if excelInfo.Source != utils.CUSTOM_ANALYSIS_TABLE {
  187. // 获取excel与指标的关系表
  188. list, tmpErr := excelModel.GetAllExcelEdbMappingByExcelInfoId(excelInfo.ExcelInfoId)
  189. if tmpErr != nil {
  190. errMsg = "获取失败"
  191. err = tmpErr
  192. return
  193. }
  194. for k, v := range list {
  195. v.ExcelEdbMappingId = 0
  196. v.ExcelInfoId = 0
  197. list[k] = v
  198. }
  199. var childExcel *excelModel.ExcelInfo
  200. err = excelModel.AddExcelInfo(excelInfo, list, childExcel)
  201. if err != nil {
  202. errMsg = "保存失败"
  203. }
  204. return
  205. }
  206. // 自定义分析,需要有额外信息
  207. addSheetList := make([]excelModel.AddExcelSheetParams, 0)
  208. // 获取所有的sheet页
  209. oldSheetItemList, err := excelModel.GetAllSheetList(oldExcelInfo.ExcelInfoId)
  210. if err != nil {
  211. errMsg = `获取sheet页失败`
  212. return
  213. }
  214. // 获取所有的sheet页的sheet数据
  215. sheetCellDataMapList := make(map[int][]*excelModel.ExcelSheetData)
  216. {
  217. dataList, tmpErr := excelModel.GetAllSheetDataListByExcelInfoId(oldExcelInfo.ExcelInfoId)
  218. if tmpErr != nil {
  219. errMsg = `获取sheet页的单元格数据失败`
  220. err = tmpErr
  221. return
  222. }
  223. for _, cellData := range dataList {
  224. sheetDataList, ok := sheetCellDataMapList[cellData.ExcelSheetId]
  225. if !ok {
  226. sheetDataList = make([]*excelModel.ExcelSheetData, 0)
  227. }
  228. sheetCellDataMapList[cellData.ExcelSheetId] = append(sheetDataList, cellData)
  229. }
  230. }
  231. // sheet处理
  232. for _, sheetInfo := range oldSheetItemList {
  233. addSheetItem := excelModel.AddExcelSheetParams{
  234. ExcelSheetId: 0,
  235. ExcelInfoId: 0,
  236. SheetName: sheetInfo.SheetName,
  237. Sort: sheetInfo.Sort,
  238. Config: sheetInfo.Config,
  239. CalcChain: sheetInfo.CalcChain,
  240. }
  241. sheetDataList, ok := sheetCellDataMapList[sheetInfo.ExcelSheetId]
  242. if ok {
  243. for i, sheetData := range sheetDataList {
  244. sheetData.ExcelDataId = 0
  245. sheetData.ExcelSheetId = 0
  246. sheetData.ExcelInfoId = 0
  247. sheetDataList[i] = sheetData
  248. }
  249. }
  250. addSheetItem.DataList = sheetDataList
  251. addSheetList = append(addSheetList, addSheetItem)
  252. }
  253. // 添加表格
  254. err = excelModel.AddExcelInfoAndSheet(excelInfo, addSheetList)
  255. return
  256. }
  257. // UpdateExcelInfoFileUrl 更新excel表格的下载地址
  258. func UpdateExcelInfoFileUrl(excelInfo *excelModel.ExcelInfo) {
  259. var err error
  260. defer func() {
  261. if err != nil {
  262. go alarm_msg.SendAlarmMsg(fmt.Sprintf("更新excel表格的下载地址失败,表格id:%d;表格名称:%s; ERR:%s", excelInfo.ExcelInfoId, excelInfo.ExcelName, err), 3)
  263. utils.FileLog.Info(fmt.Sprintf("更新excel表格的下载地址失败,表格id:%d;表格名称:%s; ERR:%s", excelInfo.ExcelInfoId, excelInfo.ExcelName, err), 3)
  264. }
  265. }()
  266. fileName := excelInfo.ExcelName + "_" + excelInfo.UniqueCode + ".xlsx"
  267. var downloadFilePath string // excel文件下载地址
  268. switch excelInfo.Source {
  269. case utils.EXCEL_DEFAULT: // 自定义表格
  270. luckySheetData, tmpErr := excel.GetLuckySheetData(excelInfo.Content)
  271. if tmpErr != nil {
  272. err = tmpErr
  273. fmt.Println("err:", err)
  274. return
  275. }
  276. //_, err = luckySheetData.GetTableDataByLuckySheetDataStr()
  277. downloadFilePath, err = luckySheetData.ToExcel()
  278. case utils.CUSTOM_ANALYSIS_TABLE: // 自定义分析表格
  279. downloadFilePath, err, _ = GenerateExcelCustomAnalysisExcel(excelInfo)
  280. }
  281. if err != nil {
  282. fmt.Println("err:", err)
  283. return
  284. }
  285. defer func() {
  286. _ = os.Remove(downloadFilePath)
  287. }()
  288. var resourceUrl string
  289. //上传到阿里云
  290. //if utils.ObjectStorageClient == "minio" {
  291. // resourceUrl, err = services.UploadImgToMinIo(fileName, downloadFilePath)
  292. //} else {
  293. // resourceUrl, err = services.UploadAliyunV2(fileName, downloadFilePath)
  294. //}
  295. //if err != nil {
  296. // return
  297. //}
  298. ossClient := services.NewOssClient()
  299. if ossClient == nil {
  300. err = fmt.Errorf("初始化OSS服务失败")
  301. return
  302. }
  303. resourceUrl, err = ossClient.UploadFile(fileName, downloadFilePath, "")
  304. if err != nil {
  305. err = fmt.Errorf("文件上传失败, Err: %s", err.Error())
  306. return
  307. }
  308. excelInfo.FileUrl = resourceUrl
  309. err = excelInfo.Update([]string{"FileUrl"})
  310. }