kbController.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package controller
  2. import (
  3. cm "app.yhyue.com/moapp/jybase/common"
  4. . "biBackService/config"
  5. "biBackService/public"
  6. "biBackService/service"
  7. "encoding/json"
  8. "fmt"
  9. "github.com/gin-gonic/gin"
  10. "io/ioutil"
  11. "log"
  12. "math/rand"
  13. "mime/multipart"
  14. "net/http"
  15. "path/filepath"
  16. "strings"
  17. "time"
  18. )
  19. func UploadFile(r *gin.Context) {
  20. // 设置内存限制(100 MB)
  21. if err := r.Request.ParseMultipartForm(100 << 20); err != nil {
  22. r.JSON(http.StatusBadRequest, gin.H{
  23. "error": "文件大小超过限制(最大100MB)",
  24. })
  25. return
  26. }
  27. // 获取所有文件(兼容多字段)
  28. form, err := r.MultipartForm()
  29. if err != nil {
  30. r.JSON(http.StatusBadRequest, gin.H{
  31. "error": "无法解析表单",
  32. })
  33. return
  34. }
  35. // 收集所有上传的文件
  36. var allFiles []*multipart.FileHeader
  37. for fieldName := range form.File {
  38. allFiles = append(allFiles, form.File[fieldName]...)
  39. }
  40. // 处理上传结果
  41. successFiles := make([]string, 0)
  42. failedFiles := make(map[string]string)
  43. for _, fileHeader := range allFiles {
  44. // 生成唯一文件名(时间戳+随机数)
  45. uniqueName := fmt.Sprintf("%s_%d%s",
  46. time.Now().Format("20060102150405001")+cm.GetComplexRandom(8, 0, 0),
  47. rand.Intn(1000),
  48. filepath.Ext(fileHeader.Filename),
  49. )
  50. // 检查文件类型(示例:仅允许图片)
  51. allowedTypes := map[string]bool{
  52. ".jpg": true,
  53. ".jpeg": true,
  54. ".png": true,
  55. ".gif": true,
  56. }
  57. ext := filepath.Ext(uniqueName)
  58. if !allowedTypes[ext] {
  59. failedFiles[fileHeader.Filename] = "文件类型不允许"
  60. continue
  61. }
  62. // 保存文件
  63. //dst := filepath.Join(config.SysConfig.FilePath, uniqueName)
  64. filePath := service.GetFilePath(uniqueName, "bifile")
  65. log.Println("获取路径", filePath)
  66. if err := r.SaveUploadedFile(fileHeader, filePath); err != nil {
  67. failedFiles[fileHeader.Filename] = fmt.Sprintf("保存失败: %v", err)
  68. continue
  69. }
  70. successFiles = append(successFiles, fmt.Sprintf("/shareFile/%s", strings.Replace(filePath, cm.ObjToString(SysConfig.FilePath), "", 1)))
  71. }
  72. // 返回响应
  73. r.JSON(http.StatusOK, gin.H{
  74. "success_count": len(successFiles),
  75. "success_files": successFiles,
  76. "failed_count": len(failedFiles),
  77. "failed_files": failedFiles,
  78. })
  79. }
  80. func WorkTaskSave(r *gin.Context) {
  81. str, _ := ioutil.ReadAll(r.Request.Body)
  82. var param map[string]interface{}
  83. err := json.Unmarshal([]byte(string(str)), &param)
  84. if err != nil {
  85. r.JSON(http.StatusOK, gin.H{
  86. "status": 0,
  87. "error": err.Error(),
  88. })
  89. return
  90. }
  91. //创建人在kb时候有账号
  92. name := cm.ObjToString(param["name"])
  93. kbUserId, err := service.CheckCreateUserAccount(name)
  94. if err != nil {
  95. r.JSON(http.StatusOK, gin.H{
  96. "status": 0,
  97. "error": err.Error(),
  98. })
  99. return
  100. }
  101. //插入工单
  102. task := &service.WordTask{
  103. Title: cm.ObjToString(param["title"]),
  104. Description: cm.ObjToString(param["description"]),
  105. Color_id: "green",
  106. Project_id: SysConfig.Project.ProjectId,
  107. Column_id: SysConfig.Project.TodoColumnId,
  108. Position: 1,
  109. Score: 0,
  110. Creator_id: kbUserId,
  111. Swimlane_id: SysConfig.Project.SwimlaneId,
  112. }
  113. err = task.WordTaskSave()
  114. if err != nil {
  115. r.JSON(http.StatusOK, gin.H{
  116. "status": 0,
  117. "error": err.Error(),
  118. })
  119. return
  120. }
  121. //创建成功发送企微消息
  122. err = service.SendWechatWorkMessage(name)
  123. if err != nil {
  124. r.JSON(http.StatusOK, gin.H{
  125. "status": 0,
  126. "error": err.Error(),
  127. })
  128. return
  129. }
  130. r.JSON(http.StatusOK, gin.H{
  131. "status": 1,
  132. "error": "",
  133. "success": 1,
  134. })
  135. }
  136. func GetTitle(r *gin.Context) {
  137. str, _ := ioutil.ReadAll(r.Request.Body)
  138. var param map[string]interface{}
  139. err := json.Unmarshal([]byte(string(str)), &param)
  140. if err != nil {
  141. r.JSON(http.StatusOK, gin.H{
  142. "status": 0,
  143. "error": err.Error(),
  144. })
  145. return
  146. }
  147. content := cm.ObjToString(param["content"])
  148. toTitle, err := service.GetTitleByContent(content)
  149. if err != nil {
  150. r.JSON(http.StatusOK, gin.H{
  151. "status": 0,
  152. "error": err.Error(),
  153. })
  154. return
  155. }
  156. r.JSON(http.StatusOK, gin.H{
  157. "status": 1,
  158. "error": "",
  159. "title": toTitle,
  160. })
  161. return
  162. }
  163. func WorkWeChatPrivateMsg(r *gin.Context) {
  164. public.SendMsg("RenJiaoJiao", "您新建得工单已解决")
  165. }