|
@@ -0,0 +1,396 @@
|
|
|
+package excel
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "errors"
|
|
|
+ "eta/eta_api/models/data_manage"
|
|
|
+ "eta/eta_api/models/data_manage/excel"
|
|
|
+ "eta/eta_api/models/data_manage/excel/request"
|
|
|
+ "eta/eta_api/models/system"
|
|
|
+ "eta/eta_api/utils"
|
|
|
+ "fmt"
|
|
|
+ "strconv"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+func AddCustomAnalysisTable(excelName, content, excelImage string, excelClassifyId int, sysUser *system.Admin) (excelInfo *data_manage.ExcelInfo, err error, errMsg string, isSendEmail bool) {
|
|
|
+ isSendEmail = true
|
|
|
+
|
|
|
+ contentByte := []byte(content)
|
|
|
+
|
|
|
+ var luckySheet LuckySheet
|
|
|
+
|
|
|
+ err = json.Unmarshal(contentByte, &luckySheet)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if len(luckySheet.Sheets) <= 0 {
|
|
|
+ errMsg = "sheet内容为空"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ excelClassify, err := data_manage.GetExcelClassifyById(excelClassifyId)
|
|
|
+ if err != nil {
|
|
|
+ if err.Error() == utils.ErrNoRow() {
|
|
|
+ errMsg = "分类不存在"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ errMsg = "获取分类信息失败"
|
|
|
+ err = errors.New("获取分类信息失败,Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if excelClassify == nil {
|
|
|
+ errMsg = "分类不存在"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if excelClassify.Source != utils.CUSTOM_ANALYSIS_TABLE {
|
|
|
+ errMsg = "当前分类不是自定义分析分类"
|
|
|
+ err = errors.New("当前分类不是自定义分析分类")
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ {
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND excel_classify_id=? "
|
|
|
+ pars = append(pars, excelClassifyId)
|
|
|
+
|
|
|
+ condition += " AND excel_name=? "
|
|
|
+ pars = append(pars, excelName)
|
|
|
+
|
|
|
+
|
|
|
+ count, tmpErr := data_manage.GetExcelInfoCountByCondition(condition, pars)
|
|
|
+ if tmpErr != nil {
|
|
|
+ errMsg = "判断表格名称是否存在失败"
|
|
|
+ err = errors.New("判断表格名称是否存在失败,Err:" + tmpErr.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if count > 0 {
|
|
|
+ errMsg = "表格名称已存在,请重新填写表格名称"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
|
|
|
+
|
|
|
+ excelInfo = &data_manage.ExcelInfo{
|
|
|
+
|
|
|
+ ExcelName: excelName,
|
|
|
+ Source: utils.CUSTOM_ANALYSIS_TABLE,
|
|
|
+
|
|
|
+ UniqueCode: utils.MD5(utils.EXCEL_DATA_PREFIX + "_" + timestamp),
|
|
|
+ ExcelClassifyId: excelClassifyId,
|
|
|
+ SysUserId: sysUser.AdminId,
|
|
|
+ SysUserRealName: sysUser.RealName,
|
|
|
+ Content: ``,
|
|
|
+ ExcelImage: excelImage,
|
|
|
+ Sort: 0,
|
|
|
+ IsDelete: 0,
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ }
|
|
|
+
|
|
|
+ addSheetList := make([]excel.AddExcelSheetParams, 0)
|
|
|
+ splitNum := 2000
|
|
|
+
|
|
|
+
|
|
|
+ sheetNameMap := make(map[string]string)
|
|
|
+ for k, sheetInfo := range luckySheet.Sheets {
|
|
|
+ sheetName := utils.TrimLRStr(sheetInfo.Name)
|
|
|
+ _, ok := sheetNameMap[sheetName]
|
|
|
+ if ok {
|
|
|
+ errMsg = "excel表中存在同名sheet"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ addSheetItem := excel.AddExcelSheetParams{
|
|
|
+ ExcelSheetId: 0,
|
|
|
+ ExcelInfoId: 0,
|
|
|
+ SheetName: sheetName,
|
|
|
+ Sort: k,
|
|
|
+ }
|
|
|
+
|
|
|
+ lenCellData := len(sheetInfo.Celldata)
|
|
|
+
|
|
|
+ splitLen := lenCellData / splitNum
|
|
|
+ residue := lenCellData % splitNum
|
|
|
+ if residue > 0 {
|
|
|
+ splitLen += 1
|
|
|
+ }
|
|
|
+
|
|
|
+ sheetDataList := make([]*excel.ExcelSheetData, 0)
|
|
|
+ for i := 0; i < splitLen; i++ {
|
|
|
+
|
|
|
+ startRow := i * splitNum
|
|
|
+ endRow := (i + 1) * splitNum
|
|
|
+ if i == splitLen-1 && residue > 0 {
|
|
|
+ endRow = lenCellData
|
|
|
+ }
|
|
|
+
|
|
|
+ tmpData := sheetInfo.Celldata[startRow:endRow]
|
|
|
+ tmpDataByte, tmpErr := json.Marshal(tmpData)
|
|
|
+ if tmpErr != nil {
|
|
|
+ errMsg = "保存失败"
|
|
|
+ err = errors.New("保存失败:" + tmpErr.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sheetDataList = append(sheetDataList, &excel.ExcelSheetData{
|
|
|
+ ExcelDataId: 0,
|
|
|
+ ExcelInfoId: 0,
|
|
|
+ ExcelSheetId: 0,
|
|
|
+ Sort: i,
|
|
|
+ Data: string(tmpDataByte),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ addSheetItem.DataList = sheetDataList
|
|
|
+
|
|
|
+ addSheetList = append(addSheetList, addSheetItem)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = data_manage.AddExcelInfoAndSheet(excelInfo, addSheetList)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func SaveCustomAnalysisTable(excelInfo *data_manage.ExcelInfo, excelName, content, excelImage string, excelClassifyId int, sheetOpList []request.SheetOp) (err error, errMsg string, isSendEmail bool) {
|
|
|
+ isSendEmail = true
|
|
|
+
|
|
|
+ contentByte := []byte(content)
|
|
|
+
|
|
|
+ var luckySheet LuckySheet
|
|
|
+
|
|
|
+ err = json.Unmarshal(contentByte, &luckySheet)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if len(luckySheet.Sheets) <= 0 {
|
|
|
+ errMsg = "sheet内容为空"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if len(sheetOpList) <= 0 {
|
|
|
+ errMsg = "sheet操作为空"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ excelClassify, err := data_manage.GetExcelClassifyById(excelClassifyId)
|
|
|
+ if err != nil {
|
|
|
+ if err.Error() == utils.ErrNoRow() {
|
|
|
+ errMsg = "分类不存在"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ errMsg = "获取分类信息失败"
|
|
|
+ err = errors.New("获取分类信息失败,Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if excelClassify == nil {
|
|
|
+ errMsg = "分类不存在"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if excelClassify.Source != utils.CUSTOM_ANALYSIS_TABLE {
|
|
|
+ errMsg = "当前分类不是自定义分析分类"
|
|
|
+ err = errors.New("当前分类不是自定义分析分类")
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ {
|
|
|
+ var condition string
|
|
|
+ var pars []interface{}
|
|
|
+ condition += " AND excel_classify_id=? AND excel_info_id !=? "
|
|
|
+ pars = append(pars, excelClassifyId, excelInfo.ExcelInfoId)
|
|
|
+
|
|
|
+ condition += " AND excel_name=? "
|
|
|
+ pars = append(pars, excelName)
|
|
|
+
|
|
|
+
|
|
|
+ count, tmpErr := data_manage.GetExcelInfoCountByCondition(condition, pars)
|
|
|
+ if tmpErr != nil {
|
|
|
+ errMsg = "判断表格名称是否存在失败"
|
|
|
+ err = errors.New("判断表格名称是否存在失败,Err:" + tmpErr.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if count > 0 {
|
|
|
+ errMsg = "表格名称已存在,请重新填写表格名称"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ currSheetList, err := excel.GetAllSheetList(excelInfo.ExcelInfoId)
|
|
|
+ if err != nil {
|
|
|
+ errMsg = "保存失败"
|
|
|
+ err = errors.New("查找当前excel的sheet列表失败,Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ currSheetMap := make(map[string]string)
|
|
|
+ for _, currSheet := range currSheetList {
|
|
|
+ currSheetMap[currSheet.SheetName] = currSheet.SheetName
|
|
|
+ }
|
|
|
+
|
|
|
+ for k, sheetOp := range sheetOpList {
|
|
|
+ sheetName := utils.TrimLRStr(sheetOp.SheetName)
|
|
|
+ switch sheetOp.OpType {
|
|
|
+ case "add":
|
|
|
+
|
|
|
+ _, ok := currSheetMap[sheetName]
|
|
|
+ if ok {
|
|
|
+ errMsg = "存在同名sheet:" + sheetName
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ case "replace":
|
|
|
+
|
|
|
+ case "append":
|
|
|
+
|
|
|
+ default:
|
|
|
+ errMsg = fmt.Sprint("第", k+1, "个sheet,错误的操作类型")
|
|
|
+ err = errors.New(errMsg + "op:" + sheetOp.OpType)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ excelInfo.ExcelName = excelName
|
|
|
+ excelInfo.ExcelClassifyId = excelClassifyId
|
|
|
+ excelInfo.ModifyTime = time.Now()
|
|
|
+
|
|
|
+ addSheetList := make([]excel.AddExcelSheetParams, 0)
|
|
|
+ splitNum := 2000
|
|
|
+
|
|
|
+
|
|
|
+ sheetNameMap := make(map[string]string)
|
|
|
+ for k, sheetInfo := range luckySheet.Sheets {
|
|
|
+ sheetName := utils.TrimLRStr(sheetInfo.Name)
|
|
|
+ _, ok := sheetNameMap[sheetName]
|
|
|
+ if ok {
|
|
|
+ errMsg = "excel表中存在同名sheet"
|
|
|
+ err = errors.New(errMsg)
|
|
|
+ isSendEmail = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+ addSheetItem := excel.AddExcelSheetParams{
|
|
|
+ ExcelSheetId: 0,
|
|
|
+ ExcelInfoId: 0,
|
|
|
+ SheetName: sheetName,
|
|
|
+ Sort: k,
|
|
|
+ }
|
|
|
+
|
|
|
+ lenCellData := len(sheetInfo.Celldata)
|
|
|
+
|
|
|
+ splitLen := lenCellData / splitNum
|
|
|
+ residue := lenCellData % splitNum
|
|
|
+ if residue > 0 {
|
|
|
+ splitLen += 1
|
|
|
+ }
|
|
|
+
|
|
|
+ sheetDataList := make([]*excel.ExcelSheetData, 0)
|
|
|
+ for i := 0; i < splitLen; i++ {
|
|
|
+
|
|
|
+ startRow := i * splitNum
|
|
|
+ endRow := (i + 1) * splitNum
|
|
|
+ if i == splitLen-1 && residue > 0 {
|
|
|
+ endRow = lenCellData
|
|
|
+ }
|
|
|
+
|
|
|
+ tmpData := sheetInfo.Celldata[startRow:endRow]
|
|
|
+ tmpDataByte, tmpErr := json.Marshal(tmpData)
|
|
|
+ if tmpErr != nil {
|
|
|
+ errMsg = "保存失败"
|
|
|
+ err = errors.New("保存失败:" + tmpErr.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sheetDataList = append(sheetDataList, &excel.ExcelSheetData{
|
|
|
+ ExcelDataId: 0,
|
|
|
+ ExcelInfoId: 0,
|
|
|
+ ExcelSheetId: 0,
|
|
|
+ Sort: i,
|
|
|
+ Data: string(tmpDataByte),
|
|
|
+ ModifyTime: time.Now(),
|
|
|
+ CreateTime: time.Now(),
|
|
|
+ })
|
|
|
+ }
|
|
|
+ addSheetItem.DataList = sheetDataList
|
|
|
+
|
|
|
+ addSheetList = append(addSheetList, addSheetItem)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = data_manage.AddExcelInfoAndSheet(excelInfo, addSheetList)
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+type LuckySheet struct {
|
|
|
+ Info struct {
|
|
|
+ Name string `json:"name"`
|
|
|
+ Creator string `json:"creator"`
|
|
|
+ Lastmodifiedby string `json:"lastmodifiedby"`
|
|
|
+ CreatedTime time.Time `json:"createdTime"`
|
|
|
+ ModifiedTime time.Time `json:"modifiedTime"`
|
|
|
+ Company string `json:"company"`
|
|
|
+ Appversion string `json:"appversion"`
|
|
|
+ } `json:"info"`
|
|
|
+ Sheets []struct {
|
|
|
+ Name string `json:"name"`
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ Index string `json:"index"`
|
|
|
+ Order string `json:"order"`
|
|
|
+ ZoomRatio int `json:"zoomRatio"`
|
|
|
+ ShowGridLines string `json:"showGridLines"`
|
|
|
+ DefaultColWidth int `json:"defaultColWidth"`
|
|
|
+ DefaultRowHeight int `json:"defaultRowHeight"`
|
|
|
+ Celldata []struct {
|
|
|
+ R int `json:"r"`
|
|
|
+ C int `json:"c"`
|
|
|
+ V interface{} `json:"v,omitempty"`
|
|
|
+ } `json:"celldata"`
|
|
|
+ CalcChain []interface{} `json:"calcChain"`
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ } `json:"sheets"`
|
|
|
+}
|