group.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package front
  2. import (
  3. "fmt"
  4. "github.com/tealeg/xlsx"
  5. "mongodb"
  6. "os"
  7. qu "qfw/util"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "util"
  12. )
  13. // GroupTaskListByGroup 用户组权限用户组任务列表
  14. func (f *Front) GroupTaskListByGroup() {
  15. defer qu.Catch()
  16. if f.Method() == "POST" {
  17. start, _ := f.GetInteger("start")
  18. limit, _ := f.GetInteger("length")
  19. draw, _ := f.GetInteger("draw")
  20. status := f.GetString("status")
  21. searchStr := f.GetString("search[value]")
  22. search := strings.TrimSpace(searchStr)
  23. query := map[string]interface{}{
  24. "s_stype": "group", //检索用户组任务
  25. }
  26. if status != "-1" { //任务状态
  27. query["s_status"] = status
  28. }
  29. if search != "" {
  30. query["$or"] = []interface{}{
  31. map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
  32. }
  33. }
  34. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  35. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  36. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  37. } else {
  38. _ = f.Render("project/task_group_list.html")
  39. }
  40. }
  41. // GroupTaskListByAdmin 系统管理员权限用户组任务列表
  42. func (f *Front) GroupTaskListByAdmin() {
  43. defer qu.Catch()
  44. if f.Method() == "POST" {
  45. start, _ := f.GetInteger("start")
  46. limit, _ := f.GetInteger("length")
  47. draw, _ := f.GetInteger("draw")
  48. status := f.GetString("status")
  49. searchStr := f.GetString("search[value]")
  50. search := strings.TrimSpace(searchStr)
  51. query := map[string]interface{}{
  52. "s_stype": "group", //检索用户组任务
  53. }
  54. if status != "-1" { //任务状态
  55. query["s_status"] = status
  56. }
  57. if search != "" {
  58. query["$or"] = []interface{}{
  59. map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
  60. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  61. map[string]interface{}{"s_rule": map[string]interface{}{"$regex": search}},
  62. map[string]interface{}{"s_departname": map[string]interface{}{"$regex": search}},
  63. }
  64. }
  65. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  66. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  67. for _, l := range *list {
  68. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  69. //groupId := qu.ObjToString(l["s_groupid"])
  70. groupTaskId := mongodb.BsonIdToSId(l["_id"])
  71. giveNum := qu.IntAll(l["i_givenum"])
  72. sourceinfo := qu.ObjToString(l["s_sourceinfo"])
  73. //tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_isgivegroup": true, "s_grouptaskid": groupTaskId, "b_istag": true})
  74. tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true})
  75. progressFloat := float64(tagNum) / float64(giveNum)
  76. value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", progressFloat), 64)
  77. progress := fmt.Sprint(value*100) + "%"
  78. l["s_progress"] = progress
  79. //同步数据库
  80. util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  81. }
  82. }
  83. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  84. } else {
  85. _ = f.Render("project/task_list.html")
  86. }
  87. }
  88. // GroupUserTaskList 用户任务分发列表
  89. func (f *Front) GroupUserTaskList() {
  90. defer qu.Catch()
  91. //groupId := f.GetString("s_groupid") //用户组id
  92. groupTaskId := f.GetString("grouptaskid") //用户组任务id
  93. qu.Debug("groupTaskId:", groupTaskId)
  94. if f.Method() == "POST" {
  95. start, _ := f.GetInteger("start")
  96. limit, _ := f.GetInteger("length")
  97. draw, _ := f.GetInteger("draw")
  98. status := f.GetString("s_status")
  99. login := f.GetString("s_login")
  100. //searchStr := f.GetString("search[value]")
  101. //search := strings.TrimSpace(searchStr)
  102. query := map[string]interface{}{
  103. "s_stype": "user",
  104. "s_parentid": groupTaskId,
  105. }
  106. if status != "-1" { //任务状态
  107. query["s_status"] = status
  108. }
  109. if login != "-1" { //用户账号
  110. query["s_login"] = login
  111. }
  112. qu.Debug("Query:", query)
  113. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  114. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  115. for _, l := range *list {
  116. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  117. giveNum := qu.IntAll(l["i_givenum"])
  118. sourceinfo := qu.ObjToString(l["s_sourceinfo"])
  119. tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": mongodb.BsonIdToSId(l["_id"]), "b_istag": true})
  120. progressFloat := float64(tagNum) / float64(giveNum)
  121. value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", progressFloat), 64)
  122. progress := fmt.Sprint(value*100) + "%"
  123. l["s_progress"] = progress
  124. //同步数据库
  125. util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  126. }
  127. }
  128. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  129. } else {
  130. sourceinfo := f.GetString("s_sourceinfo")
  131. qu.Debug(sourceinfo)
  132. //统计数据量
  133. isGiveNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_isgiveuser": true}) //已分发量
  134. isNotGiveNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_isgiveuser": false}) //待分发量
  135. isTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true}) //已标注数量
  136. isNotTagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": false}) //未标注数量
  137. allNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": groupTaskId}) //数据总量
  138. qu.Debug("数据总量:", allNum, "已分发量:", isGiveNum, "待分发量:", isNotGiveNum, "已标注量:", isTagNum, "未标注量:", isNotTagNum)
  139. f.T["grouptaskid"] = groupTaskId
  140. f.T["allNum"] = allNum
  141. f.T["isGiveNum"] = isGiveNum
  142. f.T["isNotGiveNum"] = isNotGiveNum
  143. f.T["isTagNum"] = isTagNum
  144. f.T["isNotTagNum"] = isNotTagNum
  145. _ = f.Render("project/task_detail.html", &f.T)
  146. }
  147. }
  148. // GroupTaskDeliver 用户组任务交付
  149. func (f *Front) GroupTaskDeliver() {
  150. defer qu.Catch()
  151. user := f.GetSession("user").(map[string]interface{})
  152. username := qu.ObjToString(user["s_login"]) //当前登录用户
  153. success := false
  154. msg := ""
  155. groupTaskId := f.GetString("taskid") //用户组任务id
  156. qu.Debug("Group Task ID:", groupTaskId)
  157. groupTask, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"v_sonids": 1})
  158. if groupTask != nil && len(*groupTask) > 0 {
  159. sonUserIds := (*groupTask)["v_sonids"].([]interface{})
  160. if len(sonUserIds) > 0 {
  161. sourceInfo := qu.ObjToString((*groupTask)["s_sourceinfo"])
  162. dataCount := util.Mgo.Count(sourceInfo, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": false})
  163. taskCount := util.Mgo.Count(util.TASKCOLLNAME, map[string]interface{}{"s_parentid": groupTaskId, "s_status": map[string]interface{}{"$in": []string{"未开始", "进行中"}}})
  164. if dataCount == 0 && taskCount == 0 {
  165. success = util.Mgo.UpdateById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{
  166. "$set": map[string]interface{}{
  167. "i_completetime": time.Now().Unix(),
  168. "s_updateperson": username,
  169. "i_updatetime": time.Now().Unix(),
  170. "s_status": "已完成",
  171. "s_progress": "100%",
  172. },
  173. })
  174. if !success {
  175. msg = "更新任务信息失败"
  176. }
  177. } else {
  178. if taskCount != 0 {
  179. msg += "用户任务未全部完成;"
  180. }
  181. if dataCount != 0 {
  182. msg += "数据未全部标注;"
  183. }
  184. }
  185. } else {
  186. msg = "任务暂未分配"
  187. }
  188. } else {
  189. msg = "查询任务失败"
  190. }
  191. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  192. }
  193. var modelpath string = "web/model/任务详情%d.xlsx"
  194. // GroupTaskExport 用户组任务导出
  195. func (f *Front) GroupTaskExport() {
  196. defer qu.Catch()
  197. starttime, _ := f.GetInt("i_starttime")
  198. completetime, _ := f.GetInt("i_completetime")
  199. status := f.GetString("s_status")
  200. searchStr := f.GetString("search[value]")
  201. search := strings.TrimSpace(searchStr)
  202. query := map[string]interface{}{
  203. "s_stype": "group",
  204. }
  205. if status != "-1" { //任务状态
  206. query["s_status"] = status
  207. }
  208. if search != "" {
  209. query["$or"] = []interface{}{
  210. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  211. }
  212. }
  213. if starttime > 0 {
  214. query["i_starttime"] = map[string]interface{}{
  215. "$gte": starttime,
  216. }
  217. }
  218. if completetime > 0 {
  219. query["i_completetime"] = map[string]interface{}{
  220. "$lte": completetime,
  221. }
  222. }
  223. qu.Debug("Query:", query)
  224. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  225. if count > 0 {
  226. file, err := xlsx.OpenFile("web/model/taskexportmodel.xlsx")
  227. if err != nil {
  228. qu.Debug("Load Excel Model Error")
  229. f.ServeJson("加载脚本失败")
  230. return
  231. }
  232. sheet := file.Sheets[0]
  233. fields := map[string]interface{}{
  234. "s_entname": 1,
  235. "s_departname": 1,
  236. "s_rulename": 1,
  237. "s_projectname": 1,
  238. "s_groupname": 1,
  239. "s_personname": 1,
  240. "i_givenum": 1,
  241. "s_status": 1,
  242. "i_starttime": 1,
  243. "i_completetime": 1,
  244. }
  245. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, fields, false, -1, -1)
  246. for _, l := range *list {
  247. row := sheet.AddRow()
  248. entname := qu.ObjToString(l["s_entname"])
  249. departname := qu.ObjToString(l["s_departname"])
  250. rulename := qu.ObjToString(l["s_rulename"])
  251. projectname := qu.ObjToString(l["s_projectname"])
  252. groupname := qu.ObjToString(l["s_groupname"])
  253. personname := qu.ObjToString(l["s_personname"])
  254. givenum := qu.IntAll(l["i_givenum"])
  255. status := qu.ObjToString(l["s_status"])
  256. starttimestr := ""
  257. if starttime := qu.Int64All(l["i_starttime"]); starttime != 0 {
  258. starttimestr = qu.FormatDateByInt64(&starttime, qu.Date_Full_Layout)
  259. }
  260. completetimestr := ""
  261. if completetime := qu.Int64All(l["i_completetime"]); completetime != 0 {
  262. completetimestr = qu.FormatDateByInt64(&completetime, qu.Date_Full_Layout)
  263. }
  264. row.AddCell().SetValue(entname)
  265. row.AddCell().SetValue(departname)
  266. row.AddCell().SetValue(rulename)
  267. row.AddCell().SetValue(projectname)
  268. row.AddCell().SetValue(groupname)
  269. row.AddCell().SetValue(personname)
  270. row.AddCell().SetValue(givenum)
  271. row.AddCell().SetValue(status)
  272. row.AddCell().SetValue(starttimestr)
  273. row.AddCell().SetValue(completetimestr)
  274. }
  275. fname := fmt.Sprintf(modelpath, time.Now().Unix())
  276. qu.Debug("File Name:", fname)
  277. err = file.Save(fname)
  278. if err != nil {
  279. qu.Debug("Save Excel" + fname + "Error")
  280. f.ServeJson("导出失败")
  281. return
  282. }
  283. arr := strings.Split(fname, "/")
  284. f.ResponseWriter.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", arr[len(arr)-1]))
  285. f.ServeFile(fname)
  286. go func(path string) {
  287. time.Sleep(time.Second * 30)
  288. os.Remove(path)
  289. }(fname)
  290. } else {
  291. f.ServeJson("没有数据")
  292. }
  293. }