custom_analysis.go 8.2 KB

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