user.go 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128
  1. package front
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gorilla/sessions"
  6. "github.com/shopspring/decimal"
  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. passwordEn := qu.SE.EncodeString(password)
  24. qu.Debug(username, passwordEn)
  25. query := map[string]interface{}{
  26. "s_login": username,
  27. "s_password": passwordEn,
  28. }
  29. user, _ := Mgo.FindOne("s_user", query)
  30. checked := false
  31. if user != nil && len(*user) > 0 {
  32. if (*user)["b_delete"] == true {
  33. f.ServeJson(map[string]interface{}{
  34. "checked": false,
  35. "message": "用户已被删除,请联系管理员",
  36. })
  37. return
  38. }
  39. if (*user)["i_state"] == false {
  40. f.ServeJson(map[string]interface{}{
  41. "checked": false,
  42. "message": "用户状态未启用,请联系管理员",
  43. })
  44. return
  45. }
  46. checked = true
  47. f.SetSession("user", map[string]interface{}{
  48. "s_groupid": (*user)["s_groupid"],
  49. "s_name": (*user)["s_name"],
  50. "i_role": (*user)["i_role"],
  51. "s_pwd": password,
  52. "s_login": username,
  53. "id": mgo.BsonIdToSId((*user)["_id"]),
  54. })
  55. UserMenu[username] = GetUserMenu(qu.IntAll((*user)["i_role"]))
  56. f.ServeJson(map[string]interface{}{
  57. "checked": checked,
  58. "role": (*user)["i_role"],
  59. })
  60. }
  61. f.ServeJson(map[string]interface{}{
  62. "checked": checked,
  63. "message": "账号或密码错误",
  64. })
  65. } else {
  66. _ = f.Render("login.html")
  67. }
  68. }
  69. func (f *Front) Logout() {
  70. f.DelSession("user")
  71. _ = f.Redirect("/")
  72. }
  73. func (f *Front) UserGroup() {
  74. defer qu.Catch()
  75. if f.Method() == "POST" {
  76. start, _ := f.GetInteger("start")
  77. limit, _ := f.GetInteger("length")
  78. draw, _ := f.GetInteger("draw")
  79. searchStr := f.GetString("search[value]")
  80. search := strings.TrimSpace(searchStr)
  81. status := f.GetString("s_status")
  82. query := map[string]interface{}{
  83. "b_delete": false,
  84. }
  85. if status == "1" {
  86. query["i_state"] = true
  87. } else if status == "-1" {
  88. query["i_state"] = false
  89. } else {
  90. delete(query, "i_state")
  91. }
  92. if search != "" {
  93. query["$or"] = []interface{}{
  94. bson.M{"s_name": bson.M{"$regex": search}},
  95. }
  96. }
  97. data, _ := Mgo.Find("s_group", query, `{"i_createtime":-1}`, nil, false, start, limit)
  98. count := Mgo.Count("s_group", query)
  99. f.ServeJson(map[string]interface{}{
  100. "draw": draw,
  101. "data": data,
  102. "recordsFiltered": count,
  103. "recordsTotal": count,
  104. })
  105. } else {
  106. _ = f.Render("user/user_group.html")
  107. }
  108. }
  109. func (f *Front) GroupNameExist() {
  110. name := f.GetString("s_name")
  111. info, _ := Mgo.FindOne("s_group", map[string]interface{}{"s_name": name})
  112. if len(*info) > 0 {
  113. f.ServeJson(map[string]interface{}{
  114. "rep": true,
  115. })
  116. }
  117. f.ServeJson(map[string]interface{}{
  118. "rep": false,
  119. })
  120. }
  121. func (f *Front) UserGroupNew() {
  122. defer qu.Catch()
  123. if f.Method() == "POST" {
  124. data := GetPostForm(f.Request)
  125. group := *qu.ObjToMap(data["group"])
  126. user := *qu.ObjToMap(data["user"])
  127. currenttime := time.Now().Unix()
  128. group["i_createtime"] = currenttime
  129. group["i_updatetime"] = currenttime
  130. group["b_delete"] = false
  131. group["i_state"] = true
  132. group["check_size"] = qu.IntAll(user["u1_size"])
  133. group["user_size"] = qu.IntAll(user["u2_size"])
  134. gid := Mgo.Save("s_group", group) // 保存用户组
  135. if gid != "" {
  136. // 1、用户组管理员账号
  137. m1 := make(map[string]interface{})
  138. m1["s_groupid"] = gid
  139. m1["s_name"] = ""
  140. m1["s_login"] = group["s_name"]
  141. if group["default_pwd"] == false {
  142. m1["s_password"] = qu.SE.EncodeString(qu.ObjToString(group["s_password"]))
  143. } else {
  144. m1["s_password"] = qu.SE.EncodeString(Password)
  145. }
  146. m1["i_role"] = group["i_role"]
  147. m1["s_phone"] = ""
  148. m1["i_createtime"] = currenttime
  149. m1["i_updatetime"] = currenttime
  150. m1["i_state"] = true
  151. m1["b_delete"] = false
  152. Mgo.Save("s_user", m1)
  153. // 2、质检员账号
  154. for i := 0; i < qu.IntAll(user["u1_size"]); i++ {
  155. m := make(map[string]interface{})
  156. m["s_groupid"] = gid
  157. m["s_name"] = ""
  158. m["s_login"] = qu.ObjToString(group["s_name"]) + "_zj_" + strconv.Itoa(i+1)
  159. if user["u1_default_pwd"] == false {
  160. m["s_password"] = qu.SE.EncodeString(qu.ObjToString(user["u1_pwd"]))
  161. } else {
  162. m["s_password"] = qu.SE.EncodeString(Password)
  163. }
  164. m["i_role"] = "3"
  165. m["s_phone"] = ""
  166. m["i_createtime"] = currenttime
  167. m["i_updatetime"] = currenttime
  168. m["i_state"] = true
  169. m["b_delete"] = false
  170. Mgo.Save("s_user", m)
  171. }
  172. // 3、普通用户账号
  173. for i := 0; i < qu.IntAll(user["u2_size"]); i++ {
  174. m := make(map[string]interface{})
  175. m["s_groupid"] = gid
  176. m["s_name"] = ""
  177. m["s_login"] = qu.ObjToString(group["s_name"]) + "_" + strconv.Itoa(i+1)
  178. if user["u2_default_pwd"] == false {
  179. m["s_password"] = qu.SE.EncodeString(qu.ObjToString(user["u2_pwd"]))
  180. } else {
  181. m["s_password"] = qu.SE.EncodeString(Password)
  182. }
  183. m["i_role"] = "4"
  184. m["s_phone"] = ""
  185. m["i_createtime"] = currenttime
  186. m["i_updatetime"] = currenttime
  187. m["i_state"] = true
  188. m["b_delete"] = false
  189. Mgo.Save("s_user", m)
  190. }
  191. f.ServeJson(map[string]interface{}{
  192. "rep": true,
  193. })
  194. } else {
  195. f.ServeJson(map[string]interface{}{
  196. "rep": false,
  197. })
  198. }
  199. } else {
  200. f.T["pwd"] = Password
  201. _ = f.Render("user/user_group_create.html", &f.T)
  202. }
  203. }
  204. func (f *Front) GroupModify() {
  205. defer qu.Catch()
  206. if f.Method() == "POST" {
  207. data := GetPostForm(f.Request)
  208. id := qu.ObjToString(data["id"])
  209. delete(data, "id")
  210. qu.Debug(data, id)
  211. data["i_updatetime"] = time.Now().Unix()
  212. b := Mgo.UpdateById("s_group", id, map[string]interface{}{"$set": data})
  213. f.ServeJson(map[string]interface{}{
  214. "rep": b,
  215. })
  216. }
  217. }
  218. func (f *Front) UserGroupState() {
  219. defer qu.Catch()
  220. if f.Method() == "POST" {
  221. data := GetPostForm(f.Request)
  222. b := Mgo.UpdateById("s_group", qu.ObjToString(data["id"]), map[string]interface{}{"$set": map[string]interface{}{"i_state": data["state"]}})
  223. b = Mgo.Update("s_user", map[string]interface{}{"s_groupid": qu.ObjToString(data["id"])}, map[string]interface{}{"$set": map[string]interface{}{"i_state": data["state"]}}, false, true)
  224. if !b {
  225. f.ServeJson(map[string]interface{}{
  226. "rep": b,
  227. })
  228. return
  229. }
  230. f.ServeJson(map[string]interface{}{
  231. "rep": b,
  232. })
  233. }
  234. }
  235. func (f *Front) UserGroupStateBulk() {
  236. defer qu.Catch()
  237. if f.Method() == "POST" {
  238. data := GetPostForm(f.Request)
  239. qu.Debug(data)
  240. ids := strings.Split(qu.ObjToString(data["ids"]), ",")
  241. for _, k := range ids {
  242. m := map[string]interface{}{"i_state": data["state"], "i_updatetime": time.Now().Unix()}
  243. b := Mgo.UpdateById("s_group", k, map[string]interface{}{"$set": m})
  244. if !b {
  245. f.ServeJson(map[string]interface{}{
  246. "rep": b,
  247. })
  248. return
  249. }
  250. b = Mgo.Update("s_user", map[string]interface{}{"s_groupid": k}, map[string]interface{}{"$set": m}, false, true)
  251. if !b {
  252. f.ServeJson(map[string]interface{}{
  253. "rep": b,
  254. })
  255. return
  256. }
  257. }
  258. f.ServeJson(map[string]interface{}{
  259. "rep": true,
  260. })
  261. }
  262. }
  263. func (f *Front) UserStateBulk() {
  264. defer qu.Catch()
  265. if f.Method() == "POST" {
  266. data := GetPostForm(f.Request)
  267. ids := strings.Split(qu.ObjToString(data["ids"]), ",")
  268. for _, k := range ids {
  269. m := map[string]interface{}{"i_state": data["state"], "i_updatetime": time.Now().Unix()}
  270. b := Mgo.UpdateById("s_user", k, map[string]interface{}{"$set": m})
  271. if !b {
  272. f.ServeJson(map[string]interface{}{
  273. "rep": b,
  274. })
  275. }
  276. }
  277. f.ServeJson(map[string]interface{}{
  278. "rep": true,
  279. })
  280. }
  281. }
  282. func (f *Front) UserGroupDel() {
  283. defer qu.Catch()
  284. if f.Method() == "POST" {
  285. data := GetPostForm(f.Request)
  286. qu.Debug(data)
  287. m := map[string]interface{}{"b_delete": true, "i_updatetime": time.Now().Unix()}
  288. b := Mgo.UpdateById("s_group", qu.ObjToString(data["id"]), map[string]interface{}{"$set": m})
  289. f.ServeJson(map[string]interface{}{
  290. "rep": b,
  291. })
  292. }
  293. }
  294. func (f *Front) UserManage() {
  295. defer qu.Catch()
  296. stype := f.GetString("stype")
  297. if f.Method() == "POST" {
  298. data := GetPostForm(f.Request)
  299. gid := qu.ObjToString(data["gid"])
  300. draw, _ := f.GetInteger("draw")
  301. query := map[string]interface{}{"s_groupid": gid, "b_delete": false}
  302. info, b := Mgo.Find("s_user", query, nil, nil, false, -1, -1)
  303. count := Mgo.Count("s_user", query)
  304. if b && len(*info) > 0 {
  305. f.ServeJson(map[string]interface{}{
  306. "rep": true,
  307. "data": *info,
  308. "draw": draw,
  309. "recordsFiltered": count,
  310. "recordsTotal": count,
  311. })
  312. } else {
  313. f.ServeJson(map[string]interface{}{
  314. "rep": false,
  315. })
  316. }
  317. } else {
  318. f.T["gid"] = f.GetString("id")
  319. f.T["stype"] = stype
  320. _ = f.Render("user/user_list.html", &f.T)
  321. }
  322. }
  323. func (f *Front) UserState() {
  324. defer qu.Catch()
  325. if f.Method() == "POST" {
  326. data := GetPostForm(f.Request)
  327. m := map[string]interface{}{"i_state": data["state"], "i_updatetime": time.Now().Unix()}
  328. b := Mgo.UpdateById("s_user", qu.ObjToString(data["id"]), map[string]interface{}{"$set": m})
  329. f.ServeJson(map[string]interface{}{
  330. "rep": b,
  331. })
  332. }
  333. }
  334. func (f *Front) UserAll() {
  335. defer qu.Catch()
  336. gid := f.GetString("gid")
  337. if f.Method() == "POST" {
  338. start, _ := f.GetInteger("start")
  339. limit, _ := f.GetInteger("length")
  340. draw, _ := f.GetInteger("draw")
  341. searchStr := f.GetString("search[value]")
  342. search := strings.TrimSpace(searchStr)
  343. query := map[string]interface{}{
  344. "b_delete": false,
  345. }
  346. user := f.GetSession("user").(map[string]interface{})
  347. if gid == "" {
  348. if user["i_role"] != "0" && user["i_role"] != "1" {
  349. query["s_groupid"] = qu.ObjToString(user["s_groupid"])
  350. }
  351. } else {
  352. query["s_groupid"] = gid
  353. }
  354. if search != "" {
  355. query["$or"] = []interface{}{
  356. bson.M{"s_login": bson.M{"$regex": search}},
  357. }
  358. }
  359. data, _ := Mgo.Find("s_user", query, `{"i_updatetime":-1}`, nil, false, start, limit)
  360. for _, m := range *data {
  361. m["s_password"] = qu.SE.DecodeString(qu.ObjToString(m["s_password"]))
  362. }
  363. count := Mgo.Count("s_user", query)
  364. f.ServeJson(map[string]interface{}{
  365. "draw": draw,
  366. "data": data,
  367. "recordsFiltered": count,
  368. "recordsTotal": count,
  369. })
  370. } else {
  371. f.T["gid"] = gid
  372. _ = f.Render("user/user_list.html", &f.T)
  373. }
  374. }
  375. func (f *Front) UserDel() {
  376. defer qu.Catch()
  377. if f.Method() == "POST" {
  378. data := GetPostForm(f.Request)
  379. m := map[string]interface{}{"b_delete": true, "i_updatetime": time.Now().Unix()}
  380. b := Mgo.UpdateById("s_user", qu.ObjToString(data["id"]), map[string]interface{}{"$set": m})
  381. f.ServeJson(map[string]interface{}{
  382. "rep": b,
  383. })
  384. }
  385. }
  386. func (f *Front) UserModify() {
  387. defer qu.Catch()
  388. if f.Method() == "POST" {
  389. data := GetPostForm(f.Request)
  390. id := qu.ObjToString(data["id"])
  391. delete(data, "id")
  392. data["i_updatetime"] = time.Now().Unix()
  393. b := Mgo.UpdateById("s_user", id, map[string]interface{}{"$set": map[string]interface{}{"s_name": data["s_name"], "s_phone": data["s_phone"]}})
  394. f.ServeJson(map[string]interface{}{
  395. "rep": b,
  396. })
  397. }
  398. }
  399. func (f *Front) UserNew() {
  400. defer qu.Catch()
  401. if f.Method() == "POST" {
  402. user := f.GetSession("user").(map[string]interface{})
  403. //uRole := qu.ObjToString(user["i_role"])
  404. currenttime := time.Now().Unix()
  405. stype := f.GetString("stype")
  406. irole := f.GetString("i_role")
  407. if stype == "group" {
  408. size, e := f.GetInteger("size")
  409. if e != nil {
  410. f.ServeJson(map[string]interface{}{
  411. "rep": false,
  412. "msg": "新增保存数量出错",
  413. })
  414. return
  415. }
  416. gid := f.GetString("gid")
  417. info, _ := Mgo.FindById("s_group", gid, map[string]interface{}{"check_size": 1, "user_size": 1, "s_name": 1})
  418. if len(*info) > 0 {
  419. if irole == "3" {
  420. oldnum := qu.IntAll((*info)["check_size"])
  421. Mgo.UpdateById("s_group", gid, map[string]interface{}{"$set": map[string]interface{}{"check_size": oldnum + size}})
  422. for i := 0; i < size; i++ {
  423. newUser := make(map[string]interface{})
  424. newUser["i_role"] = irole
  425. newUser["s_name"] = ""
  426. newUser["s_phone"] = ""
  427. newUser["s_groupid"] = gid
  428. newUser["s_login"] = qu.ObjToString((*info)["s_name"]) + "_zj_" + strconv.Itoa(oldnum+i+1)
  429. newUser["s_password"] = qu.SE.EncodeString(Password)
  430. newUser["i_createtime"] = currenttime
  431. newUser["i_updatetime"] = currenttime
  432. newUser["i_state"] = true
  433. newUser["b_delete"] = false
  434. Mgo.Save("s_user", newUser)
  435. }
  436. } else if irole == "4" {
  437. oldnum := qu.IntAll((*info)["user_size"])
  438. Mgo.UpdateById("s_group", gid, map[string]interface{}{"$set": map[string]interface{}{"user_size": oldnum + size}})
  439. for i := 0; i < size; i++ {
  440. newUser := make(map[string]interface{})
  441. newUser["i_role"] = irole
  442. newUser["s_name"] = ""
  443. newUser["s_phone"] = ""
  444. newUser["s_groupid"] = gid
  445. newUser["s_login"] = qu.ObjToString((*info)["s_name"]) + "_" + strconv.Itoa(oldnum+i+1)
  446. newUser["s_password"] = qu.SE.EncodeString(Password)
  447. newUser["i_createtime"] = currenttime
  448. newUser["i_updatetime"] = currenttime
  449. newUser["i_state"] = true
  450. newUser["b_delete"] = false
  451. Mgo.Save("s_user", newUser)
  452. }
  453. }
  454. }
  455. f.ServeJson(map[string]interface{}{
  456. "rep": true,
  457. })
  458. } else {
  459. gid := qu.ObjToString(user["s_groupid"]) //登陆用户的组id
  460. if irole == "1" {
  461. // 添加jy管理人员账号
  462. login := f.GetString("login")
  463. pwd := f.GetString("pwd")
  464. newUser := make(map[string]interface{})
  465. newUser["i_role"] = irole
  466. newUser["s_name"] = f.GetString("name")
  467. newUser["s_phone"] = f.GetString("phone")
  468. newUser["s_groupid"] = gid
  469. newUser["s_login"] = login
  470. newUser["s_password"] = qu.SE.EncodeString(pwd)
  471. newUser["i_createtime"] = currenttime
  472. newUser["i_updatetime"] = currenttime
  473. newUser["i_state"] = true
  474. newUser["b_delete"] = false
  475. Mgo.Save("s_user", newUser)
  476. } else {
  477. size, e := f.GetInteger("size")
  478. if e != nil {
  479. f.ServeJson(map[string]interface{}{
  480. "rep": false,
  481. "msg": "新增保存数量出错",
  482. })
  483. return
  484. }
  485. info, _ := Mgo.FindById("s_group", gid, map[string]interface{}{"check_size": 1, "user_size": 1, "s_name": 1})
  486. if len(*info) > 0 {
  487. if irole == "3" {
  488. oldnum := qu.IntAll((*info)["check_size"])
  489. Mgo.UpdateById("s_group", gid, map[string]interface{}{"$set": map[string]interface{}{"check_size": oldnum + size}})
  490. for i := 0; i < size; i++ {
  491. newUser := make(map[string]interface{})
  492. newUser["i_role"] = irole
  493. newUser["s_name"] = ""
  494. newUser["s_phone"] = ""
  495. newUser["s_groupid"] = gid
  496. newUser["s_login"] = qu.ObjToString((*info)["s_name"]) + "_zj_" + strconv.Itoa(oldnum+i+1)
  497. newUser["s_password"] = qu.SE.EncodeString(Password)
  498. newUser["i_createtime"] = currenttime
  499. newUser["i_updatetime"] = currenttime
  500. newUser["i_state"] = true
  501. newUser["b_delete"] = false
  502. Mgo.Save("s_user", newUser)
  503. }
  504. } else if irole == "4" {
  505. oldnum := qu.IntAll((*info)["user_size"])
  506. Mgo.UpdateById("s_group", gid, map[string]interface{}{"$set": map[string]interface{}{"user_size": oldnum + size}})
  507. for i := 0; i < size; i++ {
  508. newUser := make(map[string]interface{})
  509. newUser["i_role"] = irole
  510. newUser["s_name"] = ""
  511. newUser["s_phone"] = ""
  512. newUser["s_groupid"] = gid
  513. newUser["s_login"] = qu.ObjToString((*info)["s_name"]) + "_" + strconv.Itoa(oldnum+i+1)
  514. newUser["s_password"] = qu.SE.EncodeString(Password)
  515. newUser["i_createtime"] = currenttime
  516. newUser["i_updatetime"] = currenttime
  517. newUser["i_state"] = true
  518. newUser["b_delete"] = false
  519. Mgo.Save("s_user", newUser)
  520. }
  521. }
  522. }
  523. }
  524. f.ServeJson(map[string]interface{}{
  525. "rep": true,
  526. })
  527. }
  528. f.ServeJson(map[string]interface{}{
  529. "rep": false,
  530. "msg": "添加账号信息失败",
  531. })
  532. }
  533. }
  534. func (f *Front) GroupList() {
  535. qu.Catch()
  536. query := map[string]interface{}{"b_delete": false, "i_state": true}
  537. field := map[string]interface{}{"s_name": 1, "s_personname": 1}
  538. info, b := Mgo.Find("s_group", query, nil, field, false, -1, -1)
  539. if b && len(*info) > 0 {
  540. f.ServeJson(map[string]interface{}{
  541. "rep": b,
  542. "data": *info,
  543. })
  544. }
  545. }
  546. func (f *Front) UserList() {
  547. qu.Catch()
  548. if f.Method() == "POST" {
  549. //user := f.GetSession("user").(map[string]interface{})
  550. //gid := qu.ObjToString(user["s_groupid"])
  551. gid := f.GetString("gid")
  552. query := map[string]interface{}{"s_groupid": gid, "b_delete": false, "i_state": true, "i_role": "4"}
  553. field := map[string]interface{}{"s_login": 1, "s_groupid": 1, "s_name": 1}
  554. info, b := Mgo.Find("s_user", query, `{"_id": 1}`, field, false, -1, -1)
  555. if b && len(*info) > 0 {
  556. f.ServeJson(map[string]interface{}{
  557. "rep": b,
  558. "data": *info,
  559. })
  560. }
  561. }
  562. }
  563. // UserTaskSave 用户任务分发
  564. func (f *Front) UserTaskSave() {
  565. defer qu.Catch()
  566. user := f.GetSession("user").(map[string]interface{})
  567. username := qu.ObjToString(user["s_login"])
  568. var taskArr []map[string]interface{}
  569. var userTaskIdArr []string
  570. userTaskIdInfo := map[string]Task{}
  571. success := false
  572. msg := ""
  573. groupTaskId := f.GetString("grouptaskid") //用户组任务id
  574. groupTask, _ := Mgo.FindById(TASKCOLLNAME, groupTaskId, nil)
  575. if len(*groupTask) == 0 {
  576. qu.Debug("GroupTask Find Error:", groupTaskId)
  577. msg = "用户组任务:" + groupTaskId + "查询失败"
  578. f.ServeJson(map[string]interface{}{"success": false, "msg": msg})
  579. return
  580. }
  581. userNums := f.GetString("usernums")
  582. var userArr []map[string]interface{}
  583. if err := json.Unmarshal([]byte(userNums), &userArr); err != nil {
  584. qu.Debug("UserInfo Unmarshal Failed:", err)
  585. msg = "用户信息解析失败"
  586. } else {
  587. for _, userInfo := range userArr {
  588. userid := qu.ObjToString(userInfo["s_userid"])
  589. name := qu.ObjToString(userInfo["s_name"]) //可能为空
  590. login := qu.ObjToString(userInfo["s_login"])
  591. givenum := qu.IntAll(userInfo["i_givenum"])
  592. userTaskId := primitive.NewObjectID()
  593. userTaskIdStr := mgo.BsonIdToSId(userTaskId)
  594. userTaskIdArr = append(userTaskIdArr, userTaskIdStr)
  595. ut := Task{
  596. UserId: userid,
  597. GiveNum: givenum,
  598. UserName: login,
  599. }
  600. userTaskIdInfo[userTaskIdStr] = ut
  601. userTask := map[string]interface{}{
  602. "_id": userTaskId, //生成任务id
  603. "s_projectid": qu.ObjToString((*groupTask)["s_projectid"]), //项目标识
  604. "s_projectname": qu.ObjToString((*groupTask)["s_projectname"]), //项目名称
  605. "s_status": "未开始", //任务状态
  606. "s_personid": userid, //任务负责人标识
  607. "s_personname": name, //任务负责人
  608. "s_login": login, //用户账号
  609. "s_groupname": qu.ObjToString((*groupTask)["s_groupname"]), //用户组名称
  610. "s_groupid": qu.ObjToString((*groupTask)["s_groupid"]), //用户组标识
  611. "i_givenum": givenum, //分发数据量
  612. "s_createname": username, //创建人
  613. "i_createtime": time.Now().Unix(), //创建时间
  614. "s_progress": "0%", //完成进度
  615. "s_stype": "user", //任务类型
  616. "s_parentid": groupTaskId, //父任务及用户组任务id
  617. "s_entname": qu.ObjToString((*groupTask)["s_entname"]), //公司名称
  618. "s_departname": qu.ObjToString((*groupTask)["s_departname"]), //部门名称
  619. "s_rulename": qu.ObjToString((*groupTask)["s_rulename"]), //规则名称
  620. }
  621. taskArr = append(taskArr, userTask)
  622. }
  623. }
  624. if len(taskArr) > 0 {
  625. //分发数据后更新对应用户组任务信息
  626. success = Mgo.UpdateById(TASKCOLLNAME, groupTaskId, map[string]interface{}{
  627. "$push": map[string]interface{}{
  628. "v_sonids": map[string]interface{}{
  629. "$each": userTaskIdArr,
  630. },
  631. },
  632. })
  633. if !success {
  634. msg = "更新用户组任务:" + groupTaskId + "关联用户任务失败"
  635. } else { //用户分发任务
  636. success = Mgo.SaveBulk(TASKCOLLNAME, taskArr...)
  637. if success {
  638. //用户分发任务后更新该用户组任务的状态和开始时间
  639. Mgo.Update(TASKCOLLNAME,
  640. map[string]interface{}{
  641. "_id": mgo.StringTOBsonId(groupTaskId),
  642. "s_status": "未开始",
  643. },
  644. map[string]interface{}{
  645. "$set": map[string]interface{}{
  646. "s_status": "进行中",
  647. "i_starttime": time.Now().Unix(),
  648. }},
  649. false, false)
  650. msg = "任务分发成功"
  651. UpdateSourceInfoByUser(groupTaskId, userTaskIdInfo) //用户分发任务成功后,同时更新任务数据源表
  652. }
  653. }
  654. }
  655. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  656. }
  657. // UserTaskList 用户任务列表
  658. func (f *Front) UserTaskList() {
  659. defer qu.Catch()
  660. user := f.GetSession("user").(map[string]interface{})
  661. s_role := qu.ObjToString(user["i_role"])
  662. s_personid := qu.ObjToString(user["id"])
  663. gid := qu.ObjToString(user["s_groupid"])
  664. if f.Method() == "POST" {
  665. start, _ := f.GetInteger("start")
  666. limit, _ := f.GetInteger("length")
  667. draw, _ := f.GetInteger("draw")
  668. status := f.GetString("s_status")
  669. searchStr := f.GetString("search[value]")
  670. search := strings.TrimSpace(searchStr)
  671. query := map[string]interface{}{
  672. "s_stype": "user",
  673. }
  674. if s_role == "4" {
  675. query["s_personid"] = s_personid
  676. } else if s_role == "2" || s_role == "1" {
  677. query["s_groupid"] = gid
  678. }
  679. if status != "-1" { //任务状态
  680. query["s_status"] = status
  681. } else {
  682. query["s_status"] = map[string]interface{}{
  683. "$in": []string{"未开始", "进行中", "已完成"},
  684. }
  685. }
  686. if search != "" {
  687. query["$or"] = []interface{}{
  688. map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
  689. }
  690. }
  691. count := Mgo.Count(TASKCOLLNAME, query)
  692. list, _ := Mgo.Find(TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  693. for _, l := range *list {
  694. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  695. giveNum := qu.IntAll(l["i_givenum"])
  696. tagNum := Mgo.Count(DATACOLLNAME, map[string]interface{}{"s_usertaskid": mgo.BsonIdToSId(l["_id"]), "b_istag": true})
  697. progressFloat := float64(tagNum) / float64(giveNum)
  698. value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64)
  699. decimalValue := decimal.NewFromFloat(value)
  700. decimalValue = decimalValue.Mul(decimal.NewFromInt(100))
  701. value, _ = decimalValue.Float64()
  702. progress := fmt.Sprint(value) + "%"
  703. l["s_progress"] = progress
  704. //同步数据库
  705. Mgo.UpdateById(TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  706. }
  707. }
  708. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  709. } else {
  710. _ = f.Render("project/task_user_list.html", &f.T)
  711. }
  712. }
  713. // UserTaskRetrieve 用户任务收回
  714. func (f *Front) UserTaskRetrieve() {
  715. defer qu.Catch()
  716. user := f.GetSession("user").(map[string]interface{})
  717. username := qu.ObjToString(user["s_login"])
  718. userTaskId := f.GetString("taskid") //用户任务id
  719. qu.Debug("User Task Id:", userTaskId)
  720. //status := f.GetString("s_status")
  721. task, _ := Mgo.FindById(TASKCOLLNAME, userTaskId, map[string]interface{}{"s_status": 1})
  722. if len(*task) <= 0 {
  723. f.ServeJson(map[string]interface{}{"success": false, "msg": "查询任务失败"})
  724. return
  725. }
  726. status := qu.ObjToString((*task)["s_status"])
  727. userTaskIdStatus := map[string]string{userTaskId: status}
  728. msg, count, success := RetrieveCloseTaskByUser(username, userTaskIdStatus)
  729. //userTask, _ := Mgo.FindById(TASKCOLLNAME, userTaskId, nil)
  730. f.ServeJson(map[string]interface{}{"success": success, "count": count, "msg": msg})
  731. }
  732. // UserTaskDeliver 标注完成交付任务
  733. func (f *Front) UserTaskDeliver() {
  734. defer qu.Catch()
  735. success := false
  736. msg := ""
  737. user := f.GetSession("user").(map[string]interface{})
  738. username := qu.ObjToString(user["s_login"])
  739. userTaskId := f.GetString("taskid") //用户任务id
  740. count := Mgo.Count(DATACOLLNAME, map[string]interface{}{"s_usertaskid": userTaskId, "b_istag": false}) //查询是否含有未标注数据
  741. qu.Debug("User Task Id:", userTaskId, count)
  742. if count == 0 { //标注完成更新任务状态
  743. set := map[string]interface{}{
  744. "s_status": "已完成", //收回、关闭时默认任务状态已完成
  745. "i_updatetime": time.Now().Unix(),
  746. "s_updateperson": username,
  747. "i_completetime": time.Now().Unix(),
  748. }
  749. success = Mgo.UpdateById(TASKCOLLNAME, userTaskId, map[string]interface{}{"$set": set})
  750. if !success {
  751. msg = "更新任务信息失败"
  752. }
  753. } else {
  754. msg = "数据未标注完成"
  755. }
  756. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  757. }
  758. // UserTaskClose 用户任务打回
  759. func (f *Front) UserTaskClose() {
  760. defer qu.Catch()
  761. user := f.GetSession("user").(map[string]interface{})
  762. username := qu.ObjToString(user["s_login"])
  763. taskid := f.GetString("taskid") //用户任务id
  764. qu.Debug("User Task Id:", taskid)
  765. currenttime := time.Now().Unix()
  766. //更新数据源
  767. success := Mgo.Update(DATACOLLNAME, map[string]interface{}{"s_usertaskid": taskid}, map[string]interface{}{
  768. "$set": map[string]interface{}{
  769. "b_istag": false,
  770. "b_check": false,
  771. "i_ckdata": 0,
  772. "i_updatetime": currenttime,
  773. },
  774. "$unset": map[string]interface{}{
  775. "v_taginfo": "",
  776. "v_checkinfo": "",
  777. },
  778. }, false, true)
  779. // 修改任务
  780. if success {
  781. Mgo.UpdateById(TASKCOLLNAME, taskid, map[string]interface{}{
  782. "$set": map[string]interface{}{
  783. "s_status": "未开始",
  784. "s_updateperson": username,
  785. "i_updatetime": currenttime,
  786. "s_progress": "0%",
  787. },
  788. "$unset": map[string]interface{}{
  789. "i_completetime": "",
  790. },
  791. })
  792. } else {
  793. f.ServeJson(map[string]interface{}{"success": false, "msg": "操作失败"})
  794. return
  795. }
  796. f.ServeJson(map[string]interface{}{"success": success})
  797. }
  798. // UpdateSourceInfoByUser 用户分发任务成功后更新数据源表
  799. func UpdateSourceInfoByUser(groupTaskId string, userTaskIdInfo map[string]Task) {
  800. defer qu.Catch()
  801. for userTaskId, tInfo := range userTaskIdInfo {
  802. userId := tInfo.UserId
  803. num := tInfo.GiveNum
  804. userName := tInfo.UserName
  805. sess := Mgo.GetMgoConn()
  806. defer Mgo.DestoryMongoConn(sess)
  807. ch := make(chan bool, 5)
  808. wg := &sync.WaitGroup{}
  809. lock := &sync.Mutex{}
  810. query := map[string]interface{}{
  811. "s_grouptaskid": groupTaskId,
  812. "b_isgiveuser": false,
  813. }
  814. updateArr := [][]map[string]interface{}{}
  815. qu.Debug("Query:", query)
  816. it := sess.DB(Mgo.DbName).C(DATACOLLNAME).Find(&query).Limit(int64(num)).Iter()
  817. n := 0
  818. for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
  819. ch <- true
  820. wg.Add(1)
  821. go func(tmp map[string]interface{}) {
  822. defer func() {
  823. <-ch
  824. wg.Done()
  825. }()
  826. update := []map[string]interface{}{}
  827. update = append(update, map[string]interface{}{"_id": tmp["_id"]})
  828. update = append(update, map[string]interface{}{
  829. "$set": map[string]interface{}{
  830. "s_usertaskid": userTaskId,
  831. "s_userid": userId,
  832. "s_login": userName,
  833. "b_isgiveuser": true,
  834. "i_updatetime": time.Now().Unix(),
  835. },
  836. })
  837. lock.Lock()
  838. updateArr = append(updateArr, update)
  839. if len(updateArr) > 500 {
  840. Mgo.UpdateBulk(DATACOLLNAME, updateArr...)
  841. updateArr = [][]map[string]interface{}{}
  842. }
  843. lock.Unlock()
  844. }(tmp)
  845. if n%100 == 0 {
  846. qu.Debug("current:", n)
  847. }
  848. tmp = map[string]interface{}{}
  849. }
  850. wg.Wait()
  851. lock.Lock()
  852. if len(updateArr) > 0 {
  853. Mgo.UpdateBulk(DATACOLLNAME, updateArr...)
  854. updateArr = [][]map[string]interface{}{}
  855. }
  856. lock.Unlock()
  857. }
  858. }
  859. // RetrieveCloseTaskByUser 用户收回任务、关闭,更新数据源
  860. func RetrieveCloseTaskByUser(username string, userTaskIdStatus map[string]string) (allMsg string, allCount int, allSuccess bool) {
  861. defer qu.Catch()
  862. allSuccess = true
  863. for taskId, userTaskStatus := range userTaskIdStatus {
  864. /*
  865. 收回时userTaskStatus:未开始、进行中
  866. 关闭时userTaskStatus:未开始
  867. */
  868. qu.Debug(taskId, userTaskStatus)
  869. //用户任务要更新的信息
  870. taskSet := map[string]interface{}{
  871. "s_status": "已完成", //收回、关闭时默认任务状态已完成
  872. "i_updatetime": time.Now().Unix(),
  873. "s_updateperson": username,
  874. "s_progress": "100%",
  875. "i_completetime": time.Now().Unix(),
  876. }
  877. if userTaskStatus == "未开始" { //未开始的任务手动添加开始时间
  878. taskSet["i_starttime"] = time.Now().Unix()
  879. taskSet["s_status"] = "已关闭"
  880. }
  881. query := map[string]interface{}{
  882. "s_usertaskid": taskId,
  883. "b_istag": false,
  884. }
  885. count := Mgo.Count(DATACOLLNAME, query)
  886. qu.Debug("Find Task Id:", taskId, " Retrieve Count:", count)
  887. if count > 0 { //更新数据源信息
  888. set := map[string]interface{}{
  889. "i_updatetime": time.Now().Unix(),
  890. "b_isgiveuser": false,
  891. }
  892. unset := map[string]interface{}{
  893. "s_usertaskid": "",
  894. "s_userid": "",
  895. "s_login": "",
  896. }
  897. success := Mgo.Update(DATACOLLNAME, query, map[string]interface{}{"$set": set, "$unset": unset}, false, true)
  898. qu.Debug("Update SourceInfo:", success)
  899. if success {
  900. allCount += count
  901. //收回成功,更新task信息
  902. success = Mgo.UpdateById(TASKCOLLNAME, taskId, map[string]interface{}{
  903. "$set": taskSet,
  904. "$inc": map[string]interface{}{ //更新数据量
  905. "i_givenum": -count,
  906. },
  907. })
  908. if !success {
  909. allMsg += "任务ID:" + taskId + "更新数据失败;"
  910. allSuccess = false
  911. }
  912. qu.Debug("Update:", taskId, success)
  913. } else {
  914. allMsg += "任务ID:" + taskId + "更新数据源失败;"
  915. allSuccess = false
  916. }
  917. } else { //没有要收回的数据,只更新任务信息
  918. success := Mgo.UpdateById(TASKCOLLNAME, taskId, map[string]interface{}{
  919. "$set": taskSet,
  920. })
  921. if !success {
  922. allMsg += "任务ID:" + taskId + "更新数据失败;"
  923. allSuccess = false
  924. }
  925. qu.Debug("Update:", taskId, success)
  926. }
  927. }
  928. return
  929. }
  930. func (f *Front) UserTask() {
  931. defer qu.Catch()
  932. user := f.GetSession("user").(map[string]interface{})
  933. //s_role := qu.ObjToString(user["i_role"])
  934. s_userid := qu.ObjToString(user["id"])
  935. gid := qu.ObjToString(user["s_groupid"])
  936. s_login := qu.ObjToString(user["s_login"])
  937. s_name := qu.ObjToString(user["s_name"])
  938. if f.Method() == "POST" {
  939. num, err := f.GetInteger("num")
  940. grouptaskid := f.GetString("_id")
  941. if err != nil {
  942. f.ServeJson(map[string]interface{}{"success": false, "msg": "分发数据异常"})
  943. return
  944. }
  945. success := false
  946. msg := ""
  947. groupTask, _ := Mgo.FindById(TASKCOLLNAME, grouptaskid, nil)
  948. if len(*groupTask) == 0 {
  949. qu.Debug("GroupTask Find Error:", grouptaskid)
  950. msg = "用户组任务:" + grouptaskid + "查询失败"
  951. f.ServeJson(map[string]interface{}{"success": false, "msg": msg})
  952. return
  953. }
  954. userTaskId := primitive.NewObjectID()
  955. userTask := map[string]interface{}{
  956. "_id": userTaskId, //生成任务id
  957. "s_projectid": qu.ObjToString((*groupTask)["s_projectid"]), //项目标识
  958. "s_projectname": qu.ObjToString((*groupTask)["s_projectname"]), //项目名称
  959. "s_status": "未开始", //任务状态
  960. "s_personid": s_userid, //任务负责人标识
  961. "s_personname": s_name, //任务负责人
  962. "s_login": s_login, //用户账号
  963. "s_groupname": qu.ObjToString((*groupTask)["s_groupname"]), //用户组名称
  964. "s_groupid": qu.ObjToString((*groupTask)["s_groupid"]), //用户组标识
  965. "i_givenum": num, //分发数据量
  966. "s_createname": s_name, //创建人
  967. "i_createtime": time.Now().Unix(), //创建时间
  968. "s_progress": "0%", //完成进度
  969. "s_stype": "user", //任务类型
  970. "s_parentid": grouptaskid, //父任务及用户组任务id
  971. "s_entname": qu.ObjToString((*groupTask)["s_entname"]), //公司名称
  972. "s_departname": qu.ObjToString((*groupTask)["s_departname"]), //部门名称
  973. "s_rulename": qu.ObjToString((*groupTask)["s_rulename"]), //规则名称
  974. }
  975. //分发数据后更新对应用户组任务信息
  976. var userTaskIdArr []string
  977. success = Mgo.UpdateById(TASKCOLLNAME, grouptaskid, map[string]interface{}{
  978. "$push": map[string]interface{}{
  979. "v_sonids": map[string]interface{}{
  980. "$each": append(userTaskIdArr, mgo.BsonIdToSId(userTaskId)),
  981. },
  982. },
  983. })
  984. if !success {
  985. msg = "更新用户组任务:" + grouptaskid + "关联用户任务失败"
  986. } else { //用户分发任务
  987. success = Mgo.SaveByOriID(TASKCOLLNAME, userTask)
  988. if success {
  989. //用户分发任务后更新该用户组任务的状态和开始时间
  990. Mgo.Update(TASKCOLLNAME,
  991. map[string]interface{}{
  992. "_id": mgo.StringTOBsonId(grouptaskid),
  993. "s_status": "未开始",
  994. },
  995. map[string]interface{}{
  996. "$set": map[string]interface{}{
  997. "s_status": "进行中",
  998. "i_starttime": time.Now().Unix(),
  999. }},
  1000. false, false)
  1001. msg = "任务分发成功"
  1002. ut := Task{
  1003. UserId: s_userid,
  1004. GiveNum: num,
  1005. UserName: s_login,
  1006. }
  1007. userTaskIdInfo := map[string]Task{}
  1008. userTaskIdInfo[mgo.BsonIdToSId(userTaskId)] = ut
  1009. UpdateSourceInfoByUser(grouptaskid, userTaskIdInfo) //用户分发任务成功后,同时更新任务数据源表
  1010. }
  1011. }
  1012. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  1013. } else {
  1014. // 聚合
  1015. //match := bson.M{"$match": bson.M{"s_groupid": gid, "s_stype": "group"}}
  1016. //info := make([]map[string]interface{}, 0)
  1017. //Mgo.GetMgoConn().DB(Mgo.DbName).C(TASKCOLLNAME).Pipe([]map[string]interface{}{match, group}).All(&info)
  1018. info, _ := Mgo.Find(TASKCOLLNAME, bson.M{"s_groupid": gid, "s_stype": "group"}, nil, bson.M{}, false, -1, -1)
  1019. var data []map[string]interface{}
  1020. for _, m := range *info {
  1021. d1 := make(map[string]interface{})
  1022. d1["_id"] = mgo.BsonIdToSId(m["_id"])
  1023. d1["pid"] = m["s_projectid"]
  1024. d1["pname"] = m["s_projectname"]
  1025. d1["size"] = m["i_givenum"]
  1026. c := Mgo.Count(qu.ObjToString(d1["coll"]), bson.M{"b_isgiveuser": false, "s_groupid": gid})
  1027. d1["ungive"] = c
  1028. d1["isgive"] = qu.IntAll(d1["size"]) - c
  1029. data = append(data, d1)
  1030. }
  1031. //for _, dm := range data {
  1032. // c := Mgo.Count(qu.ObjToString(dm["coll"]), bson.M{"b_isgiveuser": false, "s_groupid": gid})
  1033. // dm["ungive"] = c
  1034. // dm["isgive"] = qu.IntAll(dm["size"]) - c
  1035. //}
  1036. if data != nil && len(data) > 0 {
  1037. f.T["data"] = data
  1038. } else {
  1039. f.T["data"] = make([]map[string]interface{}, 0)
  1040. }
  1041. _ = f.Render("user/task_user_new.html", &f.T)
  1042. }
  1043. }
  1044. func (f *Front) UserTaskAppend() {
  1045. defer qu.Catch()
  1046. if f.Method() == "POST" {
  1047. gid := f.GetString("groupid")
  1048. c := Mgo.Count(DATACOLLNAME, bson.M{"b_isgiveuser": false, "s_grouptaskid": gid})
  1049. qu.Debug(gid, c)
  1050. if c > 0 {
  1051. f.ServeJson(map[string]interface{}{
  1052. "success": true,
  1053. "count": c,
  1054. })
  1055. } else {
  1056. f.ServeJson(map[string]interface{}{"success": false, "msg": "当前用户组没有更多待分配数量"})
  1057. }
  1058. }
  1059. }
  1060. func (f *Front) UserTaskAppendSave() {
  1061. defer qu.Catch()
  1062. if f.Method() == "POST" {
  1063. user := f.GetSession("user").(map[string]interface{})
  1064. userid := qu.ObjToString(user["id"])
  1065. username := qu.ObjToString(user["s_login"])
  1066. tid := f.GetString("taskid")
  1067. gid := f.GetString("groupid")
  1068. num, _ := f.GetInt("num")
  1069. if num > 0 {
  1070. tinfo, _ := Mgo.FindById(TASKCOLLNAME, tid, "")
  1071. total := qu.IntAll((*tinfo)["i_givenum"]) + int(num)
  1072. n1 := Mgo.Count(DATACOLLNAME, bson.M{"s_usertaskid": tid, "b_istag": false})
  1073. noTag := n1 + int(num)
  1074. progressFloat := float64(noTag) / float64(total)
  1075. value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64)
  1076. decimalValue := decimal.NewFromFloat(value)
  1077. decimalValue = decimalValue.Mul(decimal.NewFromInt(100))
  1078. value, _ = decimalValue.Float64()
  1079. progress := fmt.Sprint(value) + "%"
  1080. update := bson.M{"$set": bson.M{
  1081. "i_givenum": qu.IntAll((*tinfo)["i_givenum"]) + int(num),
  1082. "s_progress": progress,
  1083. "s_status": "进行中",
  1084. }}
  1085. Mgo.UpdateById(TASKCOLLNAME, tid, update)
  1086. UpdateSourceInfoByUser(gid, map[string]Task{tid: {UserId: userid, GiveNum: int(num), UserName: username}})
  1087. f.ServeJson(map[string]interface{}{"success": true, "msg": "领取数量成功"})
  1088. } else {
  1089. f.ServeJson(map[string]interface{}{"success": false, "msg": "领取数量异常"})
  1090. }
  1091. }
  1092. }