excel_op.go 8.8 KB

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