custom_analysis.go 9.6 KB

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