package controller import ( cm "app.yhyue.com/moapp/jybase/common" . "biBackService/config" "biBackService/public" "biBackService/service" "encoding/json" "fmt" "github.com/gin-gonic/gin" "io/ioutil" "log" "math/rand" "mime/multipart" "net/http" "path/filepath" "strings" "time" ) func UploadFile(r *gin.Context) { // 设置内存限制(100 MB) if err := r.Request.ParseMultipartForm(100 << 20); err != nil { r.JSON(http.StatusBadRequest, gin.H{ "error": "文件大小超过限制(最大100MB)", }) return } // 获取所有文件(兼容多字段) form, err := r.MultipartForm() if err != nil { r.JSON(http.StatusBadRequest, gin.H{ "error": "无法解析表单", }) return } // 收集所有上传的文件 var allFiles []*multipart.FileHeader for fieldName := range form.File { allFiles = append(allFiles, form.File[fieldName]...) } // 处理上传结果 successFiles := make([]string, 0) failedFiles := make(map[string]string) for _, fileHeader := range allFiles { // 生成唯一文件名(时间戳+随机数) uniqueName := fmt.Sprintf("%s_%d%s", time.Now().Format("20060102150405001")+cm.GetComplexRandom(8, 0, 0), rand.Intn(1000), filepath.Ext(fileHeader.Filename), ) // 检查文件类型(示例:仅允许图片) allowedTypes := map[string]bool{ ".jpg": true, ".jpeg": true, ".png": true, ".gif": true, } ext := filepath.Ext(uniqueName) if !allowedTypes[ext] { failedFiles[fileHeader.Filename] = "文件类型不允许" continue } // 保存文件 //dst := filepath.Join(config.SysConfig.FilePath, uniqueName) filePath := service.GetFilePath(uniqueName, "bifile") log.Println("获取路径", filePath) if err := r.SaveUploadedFile(fileHeader, filePath); err != nil { failedFiles[fileHeader.Filename] = fmt.Sprintf("保存失败: %v", err) continue } successFiles = append(successFiles, fmt.Sprintf("/shareFile/%s", strings.Replace(filePath, cm.ObjToString(SysConfig.FilePath), "", 1))) } // 返回响应 r.JSON(http.StatusOK, gin.H{ "success_count": len(successFiles), "success_files": successFiles, "failed_count": len(failedFiles), "failed_files": failedFiles, }) } func WorkTaskSave(r *gin.Context) { str, _ := ioutil.ReadAll(r.Request.Body) var param map[string]interface{} err := json.Unmarshal([]byte(string(str)), ¶m) if err != nil { r.JSON(http.StatusOK, gin.H{ "status": 0, "error": err.Error(), }) return } //创建人在kb时候有账号 name := cm.ObjToString(param["name"]) kbUserId, err := service.CheckCreateUserAccount(name) if err != nil { r.JSON(http.StatusOK, gin.H{ "status": 0, "error": err.Error(), }) return } //插入工单 task := &service.WordTask{ Title: cm.ObjToString(param["title"]), Description: cm.ObjToString(param["description"]), Color_id: "green", Project_id: SysConfig.Project.ProjectId, Column_id: SysConfig.Project.TodoColumnId, Position: 1, Score: 0, Creator_id: kbUserId, Swimlane_id: SysConfig.Project.SwimlaneId, } err = task.WordTaskSave() if err != nil { r.JSON(http.StatusOK, gin.H{ "status": 0, "error": err.Error(), }) return } //创建成功发送企微消息 err = service.SendWechatWorkMessage(name) if err != nil { r.JSON(http.StatusOK, gin.H{ "status": 0, "error": err.Error(), }) return } r.JSON(http.StatusOK, gin.H{ "status": 1, "error": "", "success": 1, }) } func GetTitle(r *gin.Context) { str, _ := ioutil.ReadAll(r.Request.Body) var param map[string]interface{} err := json.Unmarshal([]byte(string(str)), ¶m) if err != nil { r.JSON(http.StatusOK, gin.H{ "status": 0, "error": err.Error(), }) return } content := cm.ObjToString(param["content"]) toTitle, err := service.GetTitleByContent(content) if err != nil { r.JSON(http.StatusOK, gin.H{ "status": 0, "error": err.Error(), }) return } r.JSON(http.StatusOK, gin.H{ "status": 1, "error": "", "title": toTitle, }) return } func WorkWeChatPrivateMsg(r *gin.Context) { public.SendMsg("RenJiaoJiao", "您新建得工单已解决") }