应用集成平台服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

189 lines
5.1 KiB

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
}