Browse Source

批量导入自定义表单数据

han_v1
han2015 4 months ago
parent
commit
5e2f63505b
  1. 174
      api/version1/taskplatform/taskmanagement/importFormFile.go
  2. 2
      apirouter/v1/taskrouter/taskrouter.go

174
api/version1/taskplatform/taskmanagement/importFormFile.go

@ -0,0 +1,174 @@
package taskmanagement
import (
"appPlatform/api/version1/customerform"
"appPlatform/models/customerForm"
"appPlatform/models/modelAppPlatform"
"appPlatform/models/modelshr"
"appPlatform/overall"
"appPlatform/overall/publicmethod"
"encoding/csv"
"fmt"
"mime/multipart"
"net/http"
"regexp"
"strconv"
"strings"
"time"
"github.com/gin-gonic/gin"
)
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{}
)
if isCSV {
title, data, err = handleCSVDataFile(file, masterFieldAry)
} else {
//处理excel
//title, data, err = handleCSVDataFile(file)
}
//构建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 _, v := range data {
if len(v) != l {
continue
}
_uuid := publicmethod.GetUUid(1) //统一识别符
valueMap["masters_key"] = _uuid
for ; i < l; i++ {
//准备数据
valueMap[title[i]] = v[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 = 0
taskCont.TableKey = 0
taskCont.Creater = userCont.Key //创建人"`
taskCont.CreaterTime = cureeTime //创建时间"`
taskCont.EditTime = cureeTime //编辑时间"`
taskCont.Types = formCont.FlowIsOpen //类型(1:流程表单;2:普通表单)"`
taskCont.VersionId = formCont.Id //来源于哪个表单"`
taskCont.Status = 2
taskCont.CreaterOrg = userCont.AdminOrg
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)
}
func handleCSVDataFile(file multipart.File, fields []customerform.Result) (title []string, result [][]interface{}, err error) {
f := csv.NewReader(file)
records, _ := f.ReadAll()
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, v := range records[i] { //csv的第i行数据
//根据列数,先转换类型,然后在插入到对应的数组中
switch reflects[k] {
case "int":
vi, err0 := strconv.Atoi(v)
if err0 != nil {
err = err0
return
}
arr = append(arr, vi)
case "number":
vf, err0 := strconv.ParseFloat(v, 64)
if err0 != nil {
err = err0
return
}
arr = append(arr, vf)
default:
arr = append(arr, v)
}
}
result[i-1] = arr
}
return
}

2
apirouter/v1/taskrouter/taskrouter.go

@ -27,6 +27,8 @@ func (a *ApiRouter) RouterGroupPc(router *gin.RouterGroup) {
apiRouter.POST("add_form_newdata", taskManagementRouter.AddFormAddNewData) //用户端自定义表单新增记录(新版)
apiRouter.POST("add_customer_form", taskManagementRouter.AddCustomerForm) //用户端自定义表单新增记录(列表新版)
apiRouter.POST("import_form_list", taskManagementRouter.ImportFormListFile) //用户端自定义表单新增记录(列表新版)
apiRouter.POST("gainTaskFormInfo", taskManagementRouter.GainTaskFormInfo) //获取任务表单内容
apiRouter.POST("softDeletion", taskManagementRouter.SoftDeletion) //删除任务数据

Loading…
Cancel
Save