user.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  1. package front
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/dchest/captcha"
  6. "github.com/gorilla/sessions"
  7. "go.mongodb.org/mongo-driver/bson"
  8. "go.mongodb.org/mongo-driver/bson/primitive"
  9. mgo "mongodb"
  10. qu "qfw/util"
  11. "strconv"
  12. "strings"
  13. "sync"
  14. "time"
  15. . "util"
  16. )
  17. var store = sessions.NewCookieStore([]byte("jianyu_secret20210422"))
  18. func (f *Front) Login() {
  19. defer qu.Catch()
  20. if f.Method() == "POST" {
  21. username := f.GetString("username")
  22. password := f.GetString("pwd")
  23. imgCode := f.GetString("imgCode")
  24. passwordEn := qu.SE.EncodeString(password)
  25. qu.Debug(username, passwordEn, imgCode)
  26. session, err := store.Get(f.Request, "dataTagLoginImgCode")
  27. if err != nil {
  28. qu.Debug("图片验证码session获取失败-%s \n", username)
  29. f.ServeJson(map[string]interface{}{
  30. "code": 0,
  31. "status": false,
  32. "message": "获取失败",
  33. })
  34. return
  35. }
  36. code := qu.ObjToString(session.Values["dataTagLoginImgCode"])
  37. if code == "" {
  38. qu.Debug("图片验证码过期-%s \n", username)
  39. f.ServeJson(map[string]interface{}{
  40. "checked": false,
  41. "message": "图片验证码过期",
  42. })
  43. return
  44. }
  45. //if !captcha.VerifyString(code, imgCode) {
  46. // qu.Debug("图片验证码错误-%s \n", username)
  47. // f.ServeJson(map[string]interface{}{
  48. // "checked": false,
  49. // "message": "图片验证码错误",
  50. // })
  51. // return
  52. //}
  53. query := map[string]interface{}{
  54. "s_login": username,
  55. "s_password": passwordEn,
  56. }
  57. user, _ := Mgo.FindOne("s_user", query)
  58. checked := false
  59. if user != nil && len(*user) > 0 {
  60. checked = true
  61. f.SetSession("user", map[string]interface{}{
  62. "s_groupid": (*user)["s_groupid"],
  63. "s_name": (*user)["s_name"],
  64. "i_role": (*user)["i_role"],
  65. "s_pwd": password,
  66. "s_login": username,
  67. "id": mgo.BsonIdToSId((*user)["_id"]),
  68. })
  69. UserMenu[username] = GetUserMenu(qu.IntAll((*user)["i_role"]))
  70. }
  71. f.ServeJson(map[string]interface{}{
  72. "checked": checked,
  73. "message": "账号或密码错误",
  74. })
  75. } else {
  76. _ = f.Render("login.html")
  77. }
  78. }
  79. // Code 获取图片验证码
  80. func (f *Front) Code() {
  81. id := captcha.NewLen(4)
  82. //r := &http.Request{}
  83. f.Request.Header.Add("Cache-Control", "no-cache, no-store, must-revalidate")
  84. f.Request.Header.Add("Pragma", "no-cache")
  85. f.Request.Header.Add("Expires", "0")
  86. f.Request.Header.Add("Content-Type", "image/png")
  87. w := f.ResponseWriter
  88. session, err := store.Get(f.Request, "dataTagLoginImgCode")
  89. if err != nil {
  90. qu.Debug("session1获取失败")
  91. return
  92. }
  93. session.Values["dataTagLoginImgCode"] = id
  94. session.Options.MaxAge = 60
  95. if err := session.Save(f.Request, w); err != nil {
  96. qu.Debug("session1保存错误,验证码 ", id)
  97. }
  98. err2 := captcha.WriteImage(w, id, 90, 30)
  99. if err2 != nil {
  100. qu.Debug("生成图片验证码错误,验证码 ", id)
  101. }
  102. return
  103. }
  104. func (f *Front) Logout() {
  105. f.DelSession("user")
  106. _ = f.Redirect("/")
  107. }
  108. func (f *Front) UserGroup() {
  109. defer qu.Catch()
  110. if f.Method() == "POST" {
  111. start, _ := f.GetInteger("start")
  112. limit, _ := f.GetInteger("length")
  113. draw, _ := f.GetInteger("draw")
  114. searchStr := f.GetString("search[value]")
  115. search := strings.TrimSpace(searchStr)
  116. query := map[string]interface{}{
  117. "b_delete": false,
  118. }
  119. if search != "" {
  120. query["$or"] = []interface{}{
  121. bson.M{"s_name": bson.M{"$regex": search}},
  122. }
  123. }
  124. data, _ := Mgo.Find("s_group", query, `{"i_createtime":-1}`, nil, false, start, limit)
  125. count := Mgo.Count("s_group", query)
  126. f.ServeJson(map[string]interface{}{
  127. "draw": draw,
  128. "data": data,
  129. "recordsFiltered": count,
  130. "recordsTotal": count,
  131. })
  132. } else {
  133. _ = f.Render("user/user_group.html")
  134. }
  135. }
  136. func (f *Front) UserGroupNew() {
  137. defer qu.Catch()
  138. if f.Method() == "POST" {
  139. data := GetPostForm(f.Request)
  140. group := *qu.ObjToMap(data["group"])
  141. user := *qu.ObjToMap(data["user"])
  142. currenttime := time.Now().Unix()
  143. group["i_createtime"] = currenttime
  144. group["i_updatetime"] = currenttime
  145. group["b_delete"] = false
  146. group["i_state"] = true
  147. gid := Mgo.Save("s_group", group) // 保存用户组
  148. if gid != "" {
  149. // 1、用户组管理员账号
  150. m1 := make(map[string]interface{})
  151. m1["s_groupid"] = gid
  152. m1["s_name"] = ""
  153. m1["s_login"] = group["s_name"]
  154. m1["s_password"] = qu.SE.EncodeString(qu.ObjToString(group["s_password"]))
  155. m1["i_role"] = group["i_role"]
  156. m1["s_phone"] = ""
  157. m1["i_createtime"] = currenttime
  158. m1["i_updatetime"] = currenttime
  159. m1["i_state"] = true
  160. m1["b_delete"] = false
  161. m1["check_size"] = qu.IntAll(user["u1_size"])
  162. m1["user_size"] = qu.IntAll(user["u2_size"])
  163. Mgo.Save("s_user", m1)
  164. // 2、质检员账号
  165. for i := 0; i < qu.IntAll(user["u1_size"]); i++ {
  166. m := make(map[string]interface{})
  167. m["s_groupid"] = gid
  168. m["s_name"] = ""
  169. m["s_login"] = qu.ObjToString(group["s_name"]) + "_zj_" + strconv.Itoa(i+1)
  170. m["s_password"] = qu.SE.EncodeString(qu.ObjToString(user["u1_pwd"]))
  171. m["i_role"] = "3"
  172. m["s_phone"] = ""
  173. m["i_createtime"] = currenttime
  174. m["i_updatetime"] = currenttime
  175. m["i_state"] = true
  176. m["b_delete"] = false
  177. Mgo.Save("s_user", m)
  178. }
  179. // 3、普通用户账号
  180. for i := 0; i < qu.IntAll(user["u2_size"]); i++ {
  181. m := make(map[string]interface{})
  182. m["s_groupid"] = gid
  183. m["s_name"] = ""
  184. m["s_login"] = qu.ObjToString(group["s_name"]) + "_" + strconv.Itoa(i+1)
  185. m["s_password"] = qu.SE.EncodeString(qu.ObjToString(user["u2_pwd"]))
  186. m["i_role"] = "4"
  187. m["s_phone"] = ""
  188. m["i_createtime"] = currenttime
  189. m["i_updatetime"] = currenttime
  190. m["i_state"] = true
  191. m["b_delete"] = false
  192. Mgo.Save("s_user", m)
  193. }
  194. f.ServeJson(map[string]interface{}{
  195. "rep": true,
  196. })
  197. } else {
  198. f.ServeJson(map[string]interface{}{
  199. "rep": false,
  200. })
  201. }
  202. } else {
  203. f.T["pwd"] = Password
  204. _ = f.Render("user/user_group_create.html", &f.T)
  205. }
  206. }
  207. func (f *Front) GroupModify() {
  208. defer qu.Catch()
  209. if f.Method() == "POST" {
  210. data := GetPostForm(f.Request)
  211. id := qu.ObjToString(data["id"])
  212. delete(data, "id")
  213. qu.Debug(data, id)
  214. data["i_updatetime"] = time.Now().Unix()
  215. b := Mgo.UpdateById("s_group", id, map[string]interface{}{"$set": data})
  216. f.ServeJson(map[string]interface{}{
  217. "rep": b,
  218. })
  219. }
  220. }
  221. func (f *Front) UserGroupState() {
  222. defer qu.Catch()
  223. if f.Method() == "POST" {
  224. data := GetPostForm(f.Request)
  225. b := Mgo.UpdateById("s_group", qu.ObjToString(data["id"]), map[string]interface{}{"$set": map[string]interface{}{"i_state": data["state"]}})
  226. f.ServeJson(map[string]interface{}{
  227. "rep": b,
  228. })
  229. }
  230. }
  231. func (f *Front) UserGroupStateBulk() {
  232. defer qu.Catch()
  233. if f.Method() == "POST" {
  234. data := GetPostForm(f.Request)
  235. qu.Debug(data)
  236. ids := strings.Split(qu.ObjToString(data["ids"]), ",")
  237. for _, k := range ids {
  238. m := map[string]interface{}{"i_state": data["state"], "i_updatetime": time.Now().Unix()}
  239. b := Mgo.UpdateById("s_group", k, map[string]interface{}{"$set": m})
  240. if !b {
  241. f.ServeJson(map[string]interface{}{
  242. "rep": b,
  243. })
  244. }
  245. }
  246. f.ServeJson(map[string]interface{}{
  247. "rep": true,
  248. })
  249. }
  250. }
  251. func (f *Front) UserStateBulk() {
  252. defer qu.Catch()
  253. if f.Method() == "POST" {
  254. data := GetPostForm(f.Request)
  255. ids := strings.Split(qu.ObjToString(data["ids"]), ",")
  256. for _, k := range ids {
  257. m := map[string]interface{}{"i_state": data["state"], "i_updatetime": time.Now().Unix()}
  258. b := Mgo.UpdateById("s_user", k, map[string]interface{}{"$set": m})
  259. if !b {
  260. f.ServeJson(map[string]interface{}{
  261. "rep": b,
  262. })
  263. }
  264. }
  265. f.ServeJson(map[string]interface{}{
  266. "rep": true,
  267. })
  268. }
  269. }
  270. func (f *Front) UserGroupDel() {
  271. defer qu.Catch()
  272. if f.Method() == "POST" {
  273. data := GetPostForm(f.Request)
  274. qu.Debug(data)
  275. m := map[string]interface{}{"b_delete": true, "i_updatetime": time.Now().Unix()}
  276. b := Mgo.UpdateById("s_group", qu.ObjToString(data["id"]), map[string]interface{}{"$set": m})
  277. f.ServeJson(map[string]interface{}{
  278. "rep": b,
  279. })
  280. }
  281. }
  282. func (f *Front) UserManage() {
  283. defer qu.Catch()
  284. if f.Method() == "POST" {
  285. data := GetPostForm(f.Request)
  286. gid := qu.ObjToString(data["gid"])
  287. draw, _ := f.GetInteger("draw")
  288. query := map[string]interface{}{"s_groupid": gid, "b_delete": false}
  289. info, b := Mgo.Find("s_user", query, nil, nil, false, -1, -1)
  290. count := Mgo.Count("s_user", query)
  291. if b && len(*info) > 0 {
  292. f.ServeJson(map[string]interface{}{
  293. "rep": true,
  294. "data": *info,
  295. "draw": draw,
  296. "recordsFiltered": count,
  297. "recordsTotal": count,
  298. })
  299. } else {
  300. f.ServeJson(map[string]interface{}{
  301. "rep": false,
  302. })
  303. }
  304. } else {
  305. f.T["gid"] = f.GetString("id")
  306. _ = f.Render("user/user_list.html", &f.T)
  307. }
  308. }
  309. func (f *Front) UserState() {
  310. defer qu.Catch()
  311. if f.Method() == "POST" {
  312. data := GetPostForm(f.Request)
  313. m := map[string]interface{}{"i_state": data["state"], "i_updatetime": time.Now().Unix()}
  314. b := Mgo.UpdateById("s_user", qu.ObjToString(data["id"]), map[string]interface{}{"$set": m})
  315. f.ServeJson(map[string]interface{}{
  316. "rep": b,
  317. })
  318. }
  319. }
  320. func (f *Front) UserAll() {
  321. defer qu.Catch()
  322. gid := f.GetString("gid")
  323. if f.Method() == "POST" {
  324. start, _ := f.GetInteger("start")
  325. limit, _ := f.GetInteger("length")
  326. draw, _ := f.GetInteger("draw")
  327. searchStr := f.GetString("search[value]")
  328. search := strings.TrimSpace(searchStr)
  329. query := map[string]interface{}{
  330. "b_delete": false,
  331. }
  332. user := f.GetSession("user").(map[string]interface{})
  333. if gid == "" {
  334. if user["i_role"] != "0" && user["i_role"] != "1" {
  335. query["s_groupid"] = qu.ObjToString(user["s_groupid"])
  336. }
  337. } else {
  338. query["s_groupid"] = gid
  339. }
  340. if search != "" {
  341. query["$or"] = []interface{}{
  342. bson.M{"s_login": bson.M{"$regex": search}},
  343. }
  344. }
  345. data, _ := Mgo.Find("s_user", query, `{"i_updatetime":-1}`, nil, false, start, limit)
  346. count := Mgo.Count("s_user", query)
  347. f.ServeJson(map[string]interface{}{
  348. "draw": draw,
  349. "data": data,
  350. "recordsFiltered": count,
  351. "recordsTotal": count,
  352. })
  353. } else {
  354. f.T["gid"] = gid
  355. _ = f.Render("user/user_list.html", &f.T)
  356. }
  357. }
  358. func (f *Front) UserDel() {
  359. defer qu.Catch()
  360. if f.Method() == "POST" {
  361. data := GetPostForm(f.Request)
  362. m := map[string]interface{}{"b_delete": true, "i_updatetime": time.Now().Unix()}
  363. b := Mgo.UpdateById("s_user", qu.ObjToString(data["id"]), map[string]interface{}{"$set": m})
  364. f.ServeJson(map[string]interface{}{
  365. "rep": b,
  366. })
  367. }
  368. }
  369. func (f *Front) UserModify() {
  370. defer qu.Catch()
  371. if f.Method() == "POST" {
  372. data := GetPostForm(f.Request)
  373. id := qu.ObjToString(data["id"])
  374. delete(data, "id")
  375. data["i_updatetime"] = time.Now().Unix()
  376. b := Mgo.UpdateById("s_user", id, map[string]interface{}{"$set": map[string]interface{}{"s_name": data["s_name"], "s_phone": data["s_phone"]}})
  377. f.ServeJson(map[string]interface{}{
  378. "rep": b,
  379. })
  380. }
  381. }
  382. func (f *Front) UserNew() {
  383. defer qu.Catch()
  384. if f.Method() == "POST" {
  385. user := f.GetSession("user").(map[string]interface{})
  386. role := qu.ObjToString(user["i_role"])
  387. gid := qu.ObjToString(user["s_groupid"])
  388. currenttime := time.Now().Unix()
  389. newUser := make(map[string]interface{})
  390. var login, pwd = "", ""
  391. if role == "0" || role == "1" {
  392. newUser["i_role"] = "1"
  393. login = f.GetString("login")
  394. pwd = f.GetString("pwd")
  395. } else {
  396. irole := f.GetString("i_role")
  397. info, _ := Mgo.FindById("s_group", gid, map[string]interface{}{"check_size": 1, "user_size": 1, "s_name": 1})
  398. if len(*info) > 0 {
  399. newUser["i_role"] = irole
  400. if irole == "3" {
  401. i := qu.IntAll((*info)["check_size"])
  402. i++
  403. login = qu.ObjToString((*info)["s_name"]) + "_zj_" + strconv.Itoa(i)
  404. Mgo.UpdateById("s_group", gid, map[string]interface{}{"$set": map[string]interface{}{"check_size": i}})
  405. } else if irole == "4" {
  406. i := qu.IntAll((*info)["user_size"])
  407. i++
  408. login = qu.ObjToString((*info)["s_name"]) + "_" + strconv.Itoa(i)
  409. Mgo.UpdateById("s_group", gid, map[string]interface{}{"$set": map[string]interface{}{"user_size": i}})
  410. }
  411. pwd = Password
  412. }
  413. }
  414. newUser["s_name"] = f.GetString("name")
  415. newUser["s_phone"] = f.GetString("phone")
  416. newUser["s_groupid"] = gid
  417. newUser["s_login"] = login
  418. newUser["s_password"] = qu.SE.EncodeString(pwd)
  419. newUser["i_createtime"] = currenttime
  420. newUser["i_updatetime"] = currenttime
  421. newUser["i_state"] = true
  422. newUser["b_delete"] = false
  423. id := Mgo.Save("s_user", newUser)
  424. if id != "" {
  425. qu.Debug(id)
  426. f.ServeJson(map[string]interface{}{
  427. "rep": true,
  428. })
  429. } else {
  430. f.ServeJson(map[string]interface{}{
  431. "rep": false,
  432. "msg": "新增保存失败",
  433. })
  434. }
  435. }
  436. }
  437. func (f *Front) GroupList() {
  438. qu.Catch()
  439. query := map[string]interface{}{"b_delete": false, "i_state": true}
  440. field := map[string]interface{}{"s_name": 1, "s_personname": 1}
  441. info, b := Mgo.Find("s_group", query, nil, field, false, -1, -1)
  442. if b && len(*info) > 0 {
  443. f.ServeJson(map[string]interface{}{
  444. "rep": b,
  445. "data": *info,
  446. })
  447. }
  448. }
  449. func (f *Front) UserList() {
  450. qu.Catch()
  451. if f.Method() == "POST" {
  452. user := f.GetSession("user").(map[string]interface{})
  453. gid := qu.ObjToString(user["s_groupid"])
  454. query := map[string]interface{}{"s_groupid": gid, "b_delete": false, "i_state": true, "i_role": "4"}
  455. field := map[string]interface{}{"s_login": 1, "s_groupid": 1, "s_name": 1}
  456. info, b := Mgo.Find("s_user", query, `{"_id": -1}`, field, false, -1, -1)
  457. if b && len(*info) > 0 {
  458. f.ServeJson(map[string]interface{}{
  459. "rep": b,
  460. "data": *info,
  461. })
  462. }
  463. }
  464. }
  465. // UserTaskSave 用户任务分发
  466. func (f *Front) UserTaskSave() {
  467. defer qu.Catch()
  468. user := f.GetSession("user").(map[string]interface{})
  469. username := qu.ObjToString(user["s_login"])
  470. var taskArr []map[string]interface{}
  471. var userTaskIdArr []string
  472. userTaskIdInfo := map[string]Task{}
  473. success := false
  474. msg := ""
  475. groupTaskId := f.GetString("grouptaskid") //用户组任务id
  476. groupTask, _ := Mgo.FindById(TASKCOLLNAME, groupTaskId, nil)
  477. if len(*groupTask) == 0 {
  478. qu.Debug("GroupTask Find Error:", groupTaskId)
  479. msg = "用户组任务:" + groupTaskId + "查询失败"
  480. f.ServeJson(map[string]interface{}{"success": false, "msg": msg})
  481. return
  482. }
  483. sourceinfo := qu.ObjToString((*groupTask)["s_sourceinfo"])
  484. userNums := f.GetString("usernums")
  485. var userArr []map[string]interface{}
  486. if err := json.Unmarshal([]byte(userNums), &userArr); err != nil {
  487. qu.Debug("UserInfo Unmarshal Failed:", err)
  488. msg = "用户信息解析失败"
  489. } else {
  490. for _, userInfo := range userArr {
  491. userid := qu.ObjToString(userInfo["s_userid"])
  492. name := qu.ObjToString(userInfo["s_name"]) //可能为空
  493. login := qu.ObjToString(userInfo["s_login"])
  494. givenum := qu.IntAll(userInfo["i_givenum"])
  495. userTaskId := primitive.NewObjectID()
  496. userTaskIdStr := mgo.BsonIdToSId(userTaskId)
  497. userTaskIdArr = append(userTaskIdArr, userTaskIdStr)
  498. ut := Task{
  499. UserId: userid,
  500. GiveNum: givenum,
  501. UserName: login,
  502. }
  503. userTaskIdInfo[userTaskIdStr] = ut
  504. userTask := map[string]interface{}{
  505. "_id": userTaskId, //生成任务id
  506. "s_projectid": qu.ObjToString((*groupTask)["s_projectid"]), //项目标识
  507. "s_projectname": qu.ObjToString((*groupTask)["s_projectname"]), //项目名称
  508. "s_status": "未开始", //任务状态
  509. "s_personid": userid, //任务负责人标识
  510. "s_personname": name, //任务负责人
  511. "s_login": login, //用户账号
  512. "s_groupname": qu.ObjToString((*groupTask)["s_groupname"]), //用户组名称
  513. "s_groupid": qu.ObjToString((*groupTask)["s_groupid"]), //用户组标识
  514. "i_givenum": givenum, //分发数据量
  515. "s_createname": username, //创建人
  516. "i_createtime": time.Now().Unix(), //创建时间
  517. "s_progress": "0%", //完成进度
  518. "s_sourceinfo": sourceinfo, //源数据表
  519. "s_stype": "user", //任务类型
  520. "s_parentid": groupTaskId, //父任务及用户组任务id
  521. "s_entname": qu.ObjToString((*groupTask)["s_entname"]), //公司名称
  522. "s_departname": qu.ObjToString((*groupTask)["s_departname"]), //部门名称
  523. "s_rulename": qu.ObjToString((*groupTask)["s_rulename"]), //规则名称
  524. }
  525. taskArr = append(taskArr, userTask)
  526. }
  527. }
  528. if len(taskArr) > 0 {
  529. //分发数据后更新对应用户组任务信息
  530. success = Mgo.UpdateById(TASKCOLLNAME, groupTaskId, map[string]interface{}{
  531. "$push": map[string]interface{}{
  532. "v_sonids": map[string]interface{}{
  533. "$each": userTaskIdArr,
  534. },
  535. },
  536. })
  537. if !success {
  538. msg = "更新用户组任务:" + groupTaskId + "关联用户任务失败"
  539. } else { //用户分发任务
  540. success = Mgo.SaveBulk(TASKCOLLNAME, taskArr...)
  541. if success {
  542. //用户分发任务后更新该用户组任务的状态和开始时间
  543. Mgo.Update(TASKCOLLNAME,
  544. map[string]interface{}{
  545. "_id": mgo.StringTOBsonId(groupTaskId),
  546. "s_status": "未开始",
  547. },
  548. map[string]interface{}{
  549. "$set": map[string]interface{}{
  550. "s_status": "进行中",
  551. "i_starttime": time.Now().Unix(),
  552. }},
  553. false, false)
  554. msg = "任务分发成功"
  555. UpdateSourceInfoByUser(sourceinfo, groupTaskId, userTaskIdInfo) //用户分发任务成功后,同时更新任务数据源表
  556. }
  557. }
  558. }
  559. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  560. }
  561. // UserTaskList 用户任务列表
  562. func (f *Front) UserTaskList() {
  563. defer qu.Catch()
  564. user := f.GetSession("user").(map[string]interface{})
  565. s_role := qu.ObjToString(user["i_role"])
  566. s_personid := qu.ObjToString(user["id"])
  567. gid := qu.ObjToString(user["s_groupid"])
  568. if f.Method() == "POST" {
  569. start, _ := f.GetInteger("start")
  570. limit, _ := f.GetInteger("length")
  571. draw, _ := f.GetInteger("draw")
  572. status := f.GetString("s_status")
  573. searchStr := f.GetString("search[value]")
  574. search := strings.TrimSpace(searchStr)
  575. query := map[string]interface{}{
  576. "s_stype": "user",
  577. }
  578. if s_role == "4" {
  579. query["s_personid"] = s_personid
  580. } else if s_role == "2" {
  581. query["s_groupid"] = gid
  582. }
  583. if status != "-1" { //任务状态
  584. query["s_status"] = status
  585. }
  586. if search != "" {
  587. query["$or"] = []interface{}{
  588. map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
  589. }
  590. }
  591. count := Mgo.Count(TASKCOLLNAME, query)
  592. qu.Debug("Query:", query, count)
  593. list, _ := Mgo.Find(TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  594. for _, l := range *list {
  595. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  596. giveNum := qu.IntAll(l["i_givenum"])
  597. sourceinfo := qu.ObjToString(l["s_sourceinfo"])
  598. tagNum := Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": mgo.BsonIdToSId(l["_id"]), "b_istag": true})
  599. progressFloat := float64(tagNum) / float64(giveNum)
  600. value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64)
  601. progress := fmt.Sprint(value*100) + "%"
  602. l["s_progress"] = progress
  603. //同步数据库
  604. Mgo.UpdateById(TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  605. }
  606. }
  607. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  608. } else {
  609. _ = f.Render("project/task_user_list.html", &f.T)
  610. }
  611. }
  612. // UserTaskRetrieve 用户任务收回
  613. func (f *Front) UserTaskRetrieve() {
  614. defer qu.Catch()
  615. user := f.GetSession("user").(map[string]interface{})
  616. username := qu.ObjToString(user["s_login"])
  617. userTaskId := f.GetString("taskid") //用户任务id
  618. qu.Debug("User Task Id:", userTaskId)
  619. sourceInfo := f.GetString("s_sourceinfo") //数据源表
  620. status := f.GetString("s_status")
  621. userTaskIdStatus := map[string]string{userTaskId: status}
  622. msg, count, success := RetrieveCloseTaskByUser(sourceInfo, username, userTaskIdStatus)
  623. //userTask, _ := Mgo.FindById(TASKCOLLNAME, userTaskId, nil)
  624. f.ServeJson(map[string]interface{}{"success": success, "count": count, "msg": msg})
  625. }
  626. // UserTaskDeliver 标注完成交付任务
  627. func (f *Front) UserTaskDeliver() {
  628. defer qu.Catch()
  629. success := false
  630. msg := ""
  631. user := f.GetSession("user").(map[string]interface{})
  632. username := qu.ObjToString(user["s_login"])
  633. userTaskId := f.GetString("taskid") //用户任务id
  634. sourceInfo := f.GetString("s_sourceinfo") //数据源表
  635. count := Mgo.Count(sourceInfo, map[string]interface{}{"s_usertaskid": userTaskId, "b_istag": false}) //查询是否含有未标注数据
  636. qu.Debug("User Task Id:", userTaskId, count)
  637. if count == 0 { //标注完成更新任务状态
  638. set := map[string]interface{}{
  639. "s_status": "已完成", //收回、关闭时默认任务状态已完成
  640. "i_updatetime": time.Now().Unix(),
  641. "s_updateperson": username,
  642. "i_completetime": time.Now().Unix(),
  643. }
  644. success = Mgo.UpdateById(TASKCOLLNAME, userTaskId, map[string]interface{}{"$set": set})
  645. if !success {
  646. msg = "更新任务信息失败"
  647. }
  648. } else {
  649. msg = "数据未标注完成"
  650. }
  651. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  652. }
  653. // UserTaskClose 用户任务关闭
  654. func (f *Front) UserTaskClose() {
  655. defer qu.Catch()
  656. user := f.GetSession("user").(map[string]interface{})
  657. username := qu.ObjToString(user["s_login"])
  658. userTaskId := f.GetString("taskid") //用户任务id
  659. qu.Debug("User Task Id:", userTaskId)
  660. sourceInfo := f.GetString("s_sourceinfo") //数据源表
  661. status := f.GetString("s_status")
  662. userTaskIdStatus := map[string]string{userTaskId: status}
  663. msg, count, success := RetrieveCloseTaskByUser(sourceInfo, username, userTaskIdStatus)
  664. f.ServeJson(map[string]interface{}{"success": success, "count": count, "msg": msg})
  665. }
  666. // UpdateSourceInfoByUser 用户分发任务成功后更新数据源表
  667. func UpdateSourceInfoByUser(sourceinfo, groupTaskId string, userTaskIdInfo map[string]Task) {
  668. defer qu.Catch()
  669. for userTaskId, tInfo := range userTaskIdInfo {
  670. userId := tInfo.UserId
  671. num := tInfo.GiveNum
  672. userName := tInfo.UserName
  673. sess := Mgo.GetMgoConn()
  674. defer Mgo.DestoryMongoConn(sess)
  675. ch := make(chan bool, 5)
  676. wg := &sync.WaitGroup{}
  677. lock := &sync.Mutex{}
  678. query := map[string]interface{}{
  679. "s_grouptaskid": groupTaskId,
  680. "b_isgiveuser": false,
  681. }
  682. updateArr := [][]map[string]interface{}{}
  683. qu.Debug("Query:", query)
  684. it := sess.DB(Mgo.DbName).C(sourceinfo).Find(&query).Limit(int64(num)).Iter()
  685. n := 0
  686. for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
  687. ch <- true
  688. wg.Add(1)
  689. go func(tmp map[string]interface{}) {
  690. defer func() {
  691. <-ch
  692. wg.Done()
  693. }()
  694. update := []map[string]interface{}{}
  695. update = append(update, map[string]interface{}{"_id": tmp["_id"]})
  696. update = append(update, map[string]interface{}{
  697. "$set": map[string]interface{}{
  698. "s_usertaskid": userTaskId,
  699. "s_userid": userId,
  700. "s_login": userName,
  701. "b_isgiveuser": true,
  702. "i_updatetime": time.Now().Unix(),
  703. },
  704. })
  705. lock.Lock()
  706. updateArr = append(updateArr, update)
  707. if len(updateArr) > 500 {
  708. Mgo.UpdateBulk(sourceinfo, updateArr...)
  709. updateArr = [][]map[string]interface{}{}
  710. }
  711. lock.Unlock()
  712. }(tmp)
  713. if n%100 == 0 {
  714. qu.Debug("current:", n)
  715. }
  716. tmp = map[string]interface{}{}
  717. }
  718. wg.Wait()
  719. lock.Lock()
  720. if len(updateArr) > 0 {
  721. Mgo.UpdateBulk(sourceinfo, updateArr...)
  722. updateArr = [][]map[string]interface{}{}
  723. }
  724. lock.Unlock()
  725. }
  726. }
  727. // RetrieveCloseTaskByUser 用户收回任务、关闭,更新数据源
  728. func RetrieveCloseTaskByUser(sourceInfo, username string, userTaskIdStatus map[string]string) (allMsg string, allCount int, allSuccess bool) {
  729. defer qu.Catch()
  730. allSuccess = true
  731. for taskId, userTaskStatus := range userTaskIdStatus {
  732. /*
  733. 收回时userTaskStatus:未开始、进行中
  734. 关闭时userTaskStatus:未开始
  735. */
  736. qu.Debug(taskId, userTaskStatus)
  737. //用户任务要更新的信息
  738. taskSet := map[string]interface{}{
  739. "s_status": "已完成", //收回、关闭时默认任务状态已完成
  740. "i_updatetime": time.Now().Unix(),
  741. "s_updateperson": username,
  742. "s_progress": "100%",
  743. "i_completetime": time.Now().Unix(),
  744. }
  745. if userTaskStatus == "未开始" { //未开始的任务手动添加开始时间
  746. taskSet["i_starttime"] = time.Now().Unix()
  747. taskSet["s_status"] = "已关闭"
  748. }
  749. query := map[string]interface{}{
  750. "s_usertaskid": taskId,
  751. "b_istag": false,
  752. }
  753. count := Mgo.Count(sourceInfo, query)
  754. qu.Debug("Find Task Id:", taskId, " Retrieve Count:", count)
  755. if count > 0 { //更新数据源信息
  756. set := map[string]interface{}{
  757. "i_updatetime": time.Now().Unix(),
  758. "b_isgiveuser": false,
  759. }
  760. unset := map[string]interface{}{
  761. "s_usertaskid": "",
  762. "s_userid": "",
  763. "s_login": "",
  764. }
  765. success := Mgo.Update(sourceInfo, query, map[string]interface{}{"$set": set, "$unset": unset}, false, true)
  766. qu.Debug("Update SourceInfo:", success)
  767. if success {
  768. allCount += count
  769. //收回成功,更新task信息
  770. success = Mgo.UpdateById(TASKCOLLNAME, taskId, map[string]interface{}{
  771. "$set": taskSet,
  772. "$inc": map[string]interface{}{ //更新数据量
  773. "i_givenum": -count,
  774. },
  775. })
  776. if !success {
  777. allMsg += "任务ID:" + taskId + "更新数据失败;"
  778. allSuccess = false
  779. }
  780. qu.Debug("Update:", taskId, success)
  781. } else {
  782. allMsg += "任务ID:" + taskId + "更新数据源失败;"
  783. allSuccess = false
  784. }
  785. } else { //没有要收回的数据,只更新任务信息
  786. success := Mgo.UpdateById(TASKCOLLNAME, taskId, map[string]interface{}{
  787. "$set": taskSet,
  788. })
  789. if !success {
  790. allMsg += "任务ID:" + taskId + "更新数据失败;"
  791. allSuccess = false
  792. }
  793. qu.Debug("Update:", taskId, success)
  794. }
  795. }
  796. return
  797. }