custom_analysis.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. package excel
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta_gn/eta_api/models/data_manage/excel"
  6. "eta_gn/eta_api/models/data_manage/excel/request"
  7. "eta_gn/eta_api/models/system"
  8. "eta_gn/eta_api/utils"
  9. "strconv"
  10. "time"
  11. )
  12. var cellSplitNum = 10000 // 基础分割单元格数
  13. func AddCustomAnalysisTable(excelName, content, excelImage string, excelClassifyId int, sysUser *system.Admin) (excelInfo *excel.ExcelInfo, err error, errMsg string, isSendEmail bool) {
  14. isSendEmail = true
  15. contentByte := []byte(content)
  16. var luckySheetList []LuckySheet
  17. err = json.Unmarshal(contentByte, &luckySheetList)
  18. if err != nil {
  19. return
  20. }
  21. if len(luckySheetList) <= 0 {
  22. errMsg = "sheet内容为空"
  23. err = errors.New(errMsg)
  24. isSendEmail = false
  25. return
  26. }
  27. excelClassify, err := excel.GetExcelClassifyById(excelClassifyId)
  28. if err != nil {
  29. if utils.IsErrNoRow(err) {
  30. errMsg = "分类不存在"
  31. err = errors.New(errMsg)
  32. isSendEmail = false
  33. return
  34. }
  35. errMsg = "获取分类信息失败"
  36. err = errors.New("获取分类信息失败,Err:" + err.Error())
  37. return
  38. }
  39. if excelClassify == nil {
  40. errMsg = "分类不存在"
  41. err = errors.New(errMsg)
  42. isSendEmail = false
  43. return
  44. }
  45. if excelClassify.Source != utils.CUSTOM_ANALYSIS_TABLE {
  46. errMsg = "当前分类不是自定义分析分类"
  47. err = errors.New("当前分类不是自定义分析分类")
  48. isSendEmail = false
  49. return
  50. }
  51. {
  52. var condition string
  53. var pars []interface{}
  54. condition += " AND excel_classify_id=? "
  55. pars = append(pars, excelClassifyId)
  56. condition += " AND excel_name=? "
  57. pars = append(pars, excelName)
  58. count, tmpErr := excel.GetExcelInfoCountByCondition(condition, pars)
  59. if tmpErr != nil {
  60. errMsg = "判断表格名称是否存在失败"
  61. err = errors.New("判断表格名称是否存在失败,Err:" + tmpErr.Error())
  62. return
  63. }
  64. if count > 0 {
  65. errMsg = "表格名称已存在,请重新填写表格名称"
  66. err = errors.New(errMsg)
  67. isSendEmail = false
  68. return
  69. }
  70. }
  71. timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
  72. excelInfo = &excel.ExcelInfo{
  73. ExcelName: excelName,
  74. Source: utils.CUSTOM_ANALYSIS_TABLE,
  75. UniqueCode: utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
  76. ExcelClassifyId: excelClassifyId,
  77. SysUserId: sysUser.AdminId,
  78. SysUserRealName: sysUser.RealName,
  79. Content: ``,
  80. ExcelImage: excelImage,
  81. Sort: 0,
  82. IsDelete: 0,
  83. ModifyTime: time.Now(),
  84. CreateTime: time.Now(),
  85. }
  86. addSheetList := make([]excel.AddExcelSheetParams, 0)
  87. sheetNameMap := make(map[string]string)
  88. for k, sheetInfo := range luckySheetList {
  89. sheetName := utils.TrimLRStr(sheetInfo.Name)
  90. _, ok := sheetNameMap[sheetName]
  91. if ok {
  92. errMsg = "excel表中存在同名sheet"
  93. err = errors.New(errMsg)
  94. isSendEmail = false
  95. return
  96. }
  97. sheetConf, tmpErr := json.Marshal(sheetInfo.Config)
  98. if tmpErr != nil {
  99. err = tmpErr
  100. return
  101. }
  102. sheetCalcChain, tmpErr := json.Marshal(sheetInfo.CalcChain)
  103. if tmpErr != nil {
  104. err = tmpErr
  105. return
  106. }
  107. addSheetItem := excel.AddExcelSheetParams{
  108. ExcelSheetId: 0,
  109. ExcelInfoId: 0,
  110. SheetName: sheetName,
  111. Index: sheetInfo.Index,
  112. Sort: k,
  113. Config: string(sheetConf),
  114. CalcChain: string(sheetCalcChain),
  115. }
  116. lenCellData := len(sheetInfo.CellData)
  117. splitLen := lenCellData / cellSplitNum
  118. residue := lenCellData % cellSplitNum
  119. if residue > 0 {
  120. splitLen += 1
  121. }
  122. sheetDataList := make([]*excel.ExcelSheetData, 0)
  123. for i := 0; i < splitLen; i++ {
  124. startRow := i * cellSplitNum
  125. endRow := (i + 1) * cellSplitNum
  126. if i == splitLen-1 && residue > 0 {
  127. endRow = lenCellData
  128. }
  129. tmpData := sheetInfo.CellData[startRow:endRow]
  130. tmpDataByte, tmpErr := json.Marshal(tmpData)
  131. if tmpErr != nil {
  132. errMsg = "保存失败"
  133. err = errors.New("保存失败:" + tmpErr.Error())
  134. return
  135. }
  136. sheetDataList = append(sheetDataList, &excel.ExcelSheetData{
  137. ExcelDataId: 0,
  138. ExcelInfoId: 0,
  139. ExcelSheetId: 0,
  140. Sort: i + 1,
  141. Data: string(tmpDataByte),
  142. ModifyTime: time.Now(),
  143. CreateTime: time.Now(),
  144. })
  145. }
  146. addSheetItem.DataList = sheetDataList
  147. addSheetList = append(addSheetList, addSheetItem)
  148. }
  149. err = excel.AddExcelInfoAndSheet(excelInfo, addSheetList)
  150. return
  151. }
  152. func SaveCustomAnalysisTable(excelInfo *excel.ExcelInfo, excelName, content, excelImage string, excelClassifyId int, sheetOpList []request.SheetOp) (err error, errMsg string, isSendEmail bool) {
  153. isSendEmail = true
  154. contentByte := []byte(content)
  155. var luckySheetList []LuckySheet
  156. err = json.Unmarshal(contentByte, &luckySheetList)
  157. if err != nil {
  158. return
  159. }
  160. if len(luckySheetList) <= 0 {
  161. errMsg = "sheet内容为空"
  162. err = errors.New(errMsg)
  163. isSendEmail = false
  164. return
  165. }
  166. excelClassify, err := excel.GetExcelClassifyById(excelClassifyId)
  167. if err != nil {
  168. if utils.IsErrNoRow(err) {
  169. errMsg = "分类不存在"
  170. err = errors.New(errMsg)
  171. isSendEmail = false
  172. return
  173. }
  174. errMsg = "获取分类信息失败"
  175. err = errors.New("获取分类信息失败,Err:" + err.Error())
  176. return
  177. }
  178. if excelClassify == nil {
  179. errMsg = "分类不存在"
  180. err = errors.New(errMsg)
  181. isSendEmail = false
  182. return
  183. }
  184. if excelClassify.Source != utils.CUSTOM_ANALYSIS_TABLE {
  185. errMsg = "当前分类不是自定义分析分类"
  186. err = errors.New("当前分类不是自定义分析分类")
  187. isSendEmail = false
  188. return
  189. }
  190. {
  191. var condition string
  192. var pars []interface{}
  193. condition += " AND excel_classify_id=? AND excel_info_id !=? "
  194. pars = append(pars, excelClassifyId, excelInfo.ExcelInfoId)
  195. condition += " AND excel_name=? "
  196. pars = append(pars, excelName)
  197. count, tmpErr := excel.GetExcelInfoCountByCondition(condition, pars)
  198. if tmpErr != nil {
  199. errMsg = "判断表格名称是否存在失败"
  200. err = errors.New("判断表格名称是否存在失败,Err:" + tmpErr.Error())
  201. return
  202. }
  203. if count > 0 {
  204. errMsg = "表格名称已存在,请重新填写表格名称"
  205. err = errors.New(errMsg)
  206. isSendEmail = false
  207. return
  208. }
  209. }
  210. excelInfo.ExcelName = excelName
  211. if excelClassifyId <= 0 {
  212. excelInfo.ExcelClassifyId = excelClassifyId
  213. }
  214. if excelImage != `` {
  215. excelInfo.ExcelImage = excelImage
  216. }
  217. excelInfo.ModifyTime = time.Now()
  218. updateExcelInfoParam := []string{"ExcelName", "ExcelClassifyId", "ExcelImage", "ModifyTime"}
  219. addSheetList := make([]excel.AddExcelSheetParams, 0)
  220. sheetNameMap := make(map[string]string)
  221. for k, sheetInfo := range luckySheetList {
  222. sheetName := utils.TrimLRStr(sheetInfo.Name)
  223. _, ok := sheetNameMap[sheetName]
  224. if ok {
  225. errMsg = "excel表中存在同名sheet"
  226. err = errors.New(errMsg)
  227. isSendEmail = false
  228. return
  229. }
  230. sheetConf, tmpErr := json.Marshal(sheetInfo.Config)
  231. if tmpErr != nil {
  232. err = tmpErr
  233. return
  234. }
  235. sheetCalcChain, tmpErr := json.Marshal(sheetInfo.CalcChain)
  236. if tmpErr != nil {
  237. err = tmpErr
  238. return
  239. }
  240. addSheetItem := excel.AddExcelSheetParams{
  241. ExcelSheetId: 0,
  242. ExcelInfoId: excelInfo.ExcelInfoId,
  243. SheetName: sheetName,
  244. Index: sheetInfo.Index,
  245. Sort: k,
  246. Config: string(sheetConf),
  247. CalcChain: string(sheetCalcChain),
  248. }
  249. lenCellData := len(sheetInfo.CellData)
  250. splitLen := lenCellData / cellSplitNum
  251. residue := lenCellData % cellSplitNum
  252. if residue > 0 {
  253. splitLen += 1
  254. }
  255. sheetDataList := make([]*excel.ExcelSheetData, 0)
  256. for i := 0; i < splitLen; i++ {
  257. startRow := i * cellSplitNum
  258. endRow := (i + 1) * cellSplitNum
  259. if i == splitLen-1 && residue > 0 {
  260. endRow = lenCellData
  261. }
  262. tmpData := sheetInfo.CellData[startRow:endRow]
  263. tmpDataByte, tmpErr := json.Marshal(tmpData)
  264. if tmpErr != nil {
  265. errMsg = "保存失败"
  266. err = errors.New("保存失败:" + tmpErr.Error())
  267. return
  268. }
  269. sheetDataList = append(sheetDataList, &excel.ExcelSheetData{
  270. ExcelDataId: 0,
  271. ExcelInfoId: excelInfo.ExcelInfoId,
  272. ExcelSheetId: 0,
  273. Sort: i + 1,
  274. Data: string(tmpDataByte),
  275. ModifyTime: time.Now(),
  276. CreateTime: time.Now(),
  277. })
  278. }
  279. addSheetItem.DataList = sheetDataList
  280. addSheetList = append(addSheetList, addSheetItem)
  281. }
  282. err = excel.SaveExcelInfoAndSheet(excelInfo, updateExcelInfoParam, addSheetList)
  283. return
  284. }
  285. type LuckySheet struct {
  286. Name string `json:"name"`
  287. Config interface{}
  288. Index string `json:"index"`
  289. Order int `json:"order"`
  290. ZoomRatio float64 `json:"zoomRatio"`
  291. ShowGridLines string `json:"showGridLines"`
  292. DefaultColWidth int `json:"defaultColWidth"`
  293. DefaultRowHeight int `json:"defaultRowHeight"`
  294. CellData []LuckySheetCellData `json:"celldata"`
  295. CalcChain []interface{} `json:"calcChain"`
  296. }
  297. type LuckySheetCellData struct {
  298. R int `json:"r"`
  299. C int `json:"c"`
  300. V interface{} `json:"v,omitempty"`
  301. }