4 changed files with 229 additions and 12 deletions
@ -0,0 +1,189 @@ |
|||
package taskmanagement |
|||
|
|||
import ( |
|||
"appPlatform/api/version1/customerform" |
|||
"appPlatform/models/customerForm" |
|||
"appPlatform/models/modelAppPlatform" |
|||
"appPlatform/models/modelshr" |
|||
"appPlatform/overall" |
|||
"appPlatform/overall/publicmethod" |
|||
"encoding/csv" |
|||
"errors" |
|||
"fmt" |
|||
"mime/multipart" |
|||
"net/http" |
|||
"regexp" |
|||
"strconv" |
|||
"strings" |
|||
"time" |
|||
|
|||
"github.com/gin-gonic/gin" |
|||
"github.com/xuri/excelize/v2" |
|||
) |
|||
|
|||
func (a *ApiMethod) ImportFormListFile(ctx *gin.Context) { |
|||
formId := ctx.Request.FormValue("formId") |
|||
pFileHeader, err := ctx.FormFile("file") |
|||
if err != nil { |
|||
ctx.JSON(http.StatusBadRequest, err) |
|||
return |
|||
} |
|||
|
|||
file, err := pFileHeader.Open() |
|||
if err != nil { |
|||
ctx.JSON(http.StatusBadRequest, err) |
|||
return |
|||
} |
|||
defer file.Close() |
|||
|
|||
//获取form的view,以便可以获取具体的table名
|
|||
var formCont modelAppPlatform.CustomerFormView |
|||
err = formCont.GetCont(map[string]interface{}{"`id`": formId}) |
|||
if err != nil || formCont.TableKey == "" { |
|||
ctx.JSON(http.StatusBadGateway, err) |
|||
return |
|||
} |
|||
|
|||
//直接读取数据库获取表的详细结构
|
|||
masterFieldAry, mastErr := customerform.ReadDatabaseForm(formCont.TableKey) |
|||
if mastErr != nil { |
|||
ctx.JSON(http.StatusBadGateway, mastErr) |
|||
return |
|||
} |
|||
|
|||
isCSV := strings.HasSuffix(pFileHeader.Filename, ".csv") |
|||
var ( |
|||
title []string |
|||
data [][]interface{} |
|||
) |
|||
//支持处理excel和csv格式文件
|
|||
title, data, err = handleCSVDataFile(file, masterFieldAry, isCSV) |
|||
|
|||
//构建task记录,每条导入记录绑定一个task
|
|||
context, _ := ctx.Get(overall.MyContJwt) |
|||
var userCont modelshr.ManCont |
|||
userCont.GetLoginCont(context) //当前操作人
|
|||
cureeTime := time.Now().Unix() //写入时间
|
|||
|
|||
valueMap := make(map[string]interface{}) |
|||
valueMap["creater_time"] = cureeTime |
|||
valueMap["creater"] = userCont.Key |
|||
valueMap["createrOrg"] = userCont.AdminOrg |
|||
valueMap["edit_time"] = cureeTime |
|||
i, l := 0, len(title) |
|||
for k := range data { |
|||
if len(data[k]) != l { |
|||
continue |
|||
} |
|||
_uuid := publicmethod.GetUUid(1) //统一识别符
|
|||
valueMap["masters_key"] = _uuid |
|||
for ; i < l; i++ { |
|||
//准备数据
|
|||
valueMap[title[i]] = data[k][i] |
|||
} |
|||
//重置循环
|
|||
i = 0 |
|||
delete(valueMap, "@id") |
|||
//开始插入
|
|||
if err = overall.CONSTANT_DB_CustomerForm.Table(formCont.TableKey).Create(valueMap).Error; err != nil { |
|||
break |
|||
} |
|||
|
|||
var taskCont customerForm.TaskRecord |
|||
taskCont.MastersKey = _uuid |
|||
taskCont.Title = fmt.Sprintf("%v-%v(%v)-%v", formCont.Name, userCont.Name, userCont.Number, publicmethod.UnixTimeToDay(cureeTime, 14)) //标题"`
|
|||
taskCont.AppKey = formCont.Groupid |
|||
taskCont.TableKey = formCont.SignCode |
|||
taskCont.Creater = valueMap["creater"].(int64) //创建人"`
|
|||
taskCont.CreaterTime = valueMap["edit_time"].(int64) //创建时间"`
|
|||
taskCont.EditTime = valueMap["edit_time"].(int64) //编辑时间"`
|
|||
taskCont.Types = formCont.FlowIsOpen //类型(1:流程表单;2:普通表单)"`
|
|||
taskCont.VersionId = formCont.Id //来源于哪个表单"`
|
|||
taskCont.Status = 2 |
|||
taskCont.CreaterOrg = valueMap["createrOrg"].(int64) |
|||
taskCont.MastesForm = formCont.MastesForm |
|||
taskCont.MastesFormJson = formCont.MastesFormJson |
|||
if err = overall.CONSTANT_DB_CustomerForm.Create(&taskCont).Error; err != nil { |
|||
break |
|||
} |
|||
} |
|||
if err != nil { |
|||
ctx.JSON(http.StatusBadGateway, err) |
|||
return |
|||
} |
|||
ctx.JSON(http.StatusOK, nil) |
|||
} |
|||
|
|||
// 处理excel和csv格式文件
|
|||
func handleCSVDataFile(file multipart.File, fields []customerform.Result, iscsv bool) (title []string, result [][]interface{}, err error) { |
|||
var records [][]string |
|||
if iscsv { |
|||
//handle csv file
|
|||
f := csv.NewReader(file) |
|||
records, err = f.ReadAll() |
|||
} else { |
|||
//handle excel file
|
|||
fe, err0 := excelize.OpenReader(file) |
|||
records, err = fe.GetRows("Sheet1") |
|||
if err0 != nil { |
|||
err = errors.Join(err) |
|||
} |
|||
} |
|||
|
|||
if err != nil { |
|||
return |
|||
} |
|||
|
|||
title = records[0] |
|||
reg := regexp.MustCompile(`(\w+)`) |
|||
|
|||
reflects := []string{} |
|||
//根据title,获取对应列的具体存储类型
|
|||
for k, v := range title { |
|||
//(shen1gao1)标题 => shen1gao1
|
|||
v = reg.FindString(v) |
|||
title[k] = v |
|||
for _, f := range fields { |
|||
if v == f.Field { |
|||
if strings.Contains(f.Type, "varchar") { |
|||
reflects = append(reflects, "string") |
|||
} else if strings.Contains(f.Type, "int") { |
|||
reflects = append(reflects, "int") |
|||
} else if strings.Contains(f.Type, "double") || strings.Contains(f.Type, "float") { |
|||
reflects = append(reflects, "number") |
|||
} else { |
|||
reflects = append(reflects, "string") |
|||
} |
|||
} |
|||
} |
|||
} |
|||
max := len(records) |
|||
result = make([][]interface{}, len(title)-1) //丢掉标题行
|
|||
for i := 1; i < max; i++ { |
|||
arr := []interface{}{} |
|||
for k := range records[i] { //csv的第i行数据
|
|||
//根据列数,先转换类型,然后在插入到对应的数组中
|
|||
switch reflects[k] { |
|||
case "int": |
|||
vi, err0 := strconv.Atoi(records[i][k]) |
|||
if err0 != nil { |
|||
err = err0 |
|||
return |
|||
} |
|||
arr = append(arr, vi) |
|||
case "number": |
|||
vf, err0 := strconv.ParseFloat(records[i][k], 64) |
|||
if err0 != nil { |
|||
err = err0 |
|||
return |
|||
} |
|||
arr = append(arr, vf) |
|||
default: |
|||
arr = append(arr, records[i][k]) |
|||
} |
|||
} |
|||
result[i-1] = arr |
|||
} |
|||
|
|||
return |
|||
} |
|||
Loading…
Reference in new issue