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