diff --git a/api/version1/taskplatform/taskmanagement/importFormFile.go b/api/version1/taskplatform/taskmanagement/importFormFile.go new file mode 100644 index 0000000..b5ade84 --- /dev/null +++ b/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 +} diff --git a/apirouter/v1/taskrouter/taskrouter.go b/apirouter/v1/taskrouter/taskrouter.go index a065889..c612154 100644 --- a/apirouter/v1/taskrouter/taskrouter.go +++ b/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) //删除任务数据