project.go 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432
  1. package front
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/shopspring/decimal"
  6. "github.com/tealeg/xlsx"
  7. "go.mongodb.org/mongo-driver/bson"
  8. "go.mongodb.org/mongo-driver/bson/primitive"
  9. "io/ioutil"
  10. "mime/multipart"
  11. "mongodb"
  12. qu "qfw/util"
  13. "sort"
  14. "strconv"
  15. "strings"
  16. "sync"
  17. "sync/atomic"
  18. "time"
  19. "util"
  20. )
  21. // ProjectIsExists 获取所有项目名称
  22. func (f *Front) ProjectIsExists() {
  23. defer qu.Catch()
  24. name := f.GetString("s_name")
  25. exists := false
  26. project, _ := util.Mgo.FindOne(util.PROJECTCOLLNAME, map[string]interface{}{"s_name": name})
  27. if project != nil && len(*project) > 0 {
  28. exists = true
  29. }
  30. f.ServeJson(map[string]interface{}{"exists": exists})
  31. }
  32. // ProjectList 项目列表
  33. func (f *Front) ProjectList() {
  34. defer qu.Catch()
  35. if f.Method() == "POST" {
  36. start, _ := f.GetInteger("start")
  37. limit, _ := f.GetInteger("length")
  38. draw, _ := f.GetInteger("draw")
  39. status := f.GetString("s_status")
  40. searchStr := f.GetString("search[value]")
  41. search := strings.TrimSpace(searchStr)
  42. //data := util.GetPostForm(f.Request)
  43. query := map[string]interface{}{}
  44. if status != "-1" {
  45. query["s_status"] = status
  46. } else {
  47. query["s_status"] = map[string]interface{}{
  48. "$in": []string{"未开始", "进行中", "已完成"},
  49. }
  50. }
  51. if search != "" {
  52. query["$or"] = []interface{}{
  53. map[string]interface{}{"s_name": map[string]interface{}{"$regex": search}},
  54. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  55. map[string]interface{}{"s_rule": map[string]interface{}{"$regex": search}},
  56. map[string]interface{}{"s_departname": map[string]interface{}{"$regex": search}},
  57. }
  58. }
  59. list, _ := util.Mgo.Find(util.PROJECTCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  60. count := util.Mgo.Count(util.PROJECTCOLLNAME, query)
  61. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  62. } else {
  63. _ = f.Render("project/project_list.html", &f.T)
  64. }
  65. }
  66. // ProjectSave 项目保存
  67. func (f *Front) ProjectSave() {
  68. defer qu.Catch()
  69. s_name := f.GetString("s_name") //项目名称
  70. if s_name == "" {
  71. f.ServeJson(map[string]interface{}{"success": false, "msg": "缺少项目名称字段"})
  72. return
  73. }
  74. success := false //导入数据是否成功
  75. msg := "" //异常信息
  76. successNum := int64(0) //导入成功条数
  77. importDataNum := 0 //查询数量
  78. appid := "" // 客户标识(客户管理平台)
  79. var s_rulename []string //规则
  80. user := f.GetSession("user").(map[string]interface{})
  81. username := qu.ObjToString(user["s_login"]) //当前登录用户
  82. stype := f.GetString("s_type") //新建项目类型:数据库导入、excel导入
  83. s_departname, s_entname := "", ""
  84. query := map[string]interface{}{
  85. "s_name": s_name,
  86. }
  87. set := map[string]interface{}{}
  88. //导入数据
  89. if stype == "excel" { //excel导入
  90. s_entname = f.GetString("s_entname") //公司名称
  91. if s_entname == "" {
  92. f.ServeJson(map[string]interface{}{"success": false, "msg": "缺少公司名称字段"})
  93. return
  94. }
  95. s_departname = f.GetString("s_departname") //部门名称
  96. rulename := f.GetString("s_rulename") //规则名称
  97. s_rulename = strings.Split(rulename, ",")
  98. mf, _, err := f.GetFile("xlsx")
  99. qu.Debug(s_entname, s_departname, s_rulename)
  100. if err == nil {
  101. importDataNum, appid = ImportDataByExcel(mf, &success, &msg, &successNum, true)
  102. }
  103. if importDataNum == 0 {
  104. f.ServeJson(map[string]interface{}{"success": false, "msg": "文档缺少企业客户id字段"})
  105. return
  106. }
  107. //保存项目信息
  108. set = map[string]interface{}{
  109. "s_name": s_name, //项目名称
  110. "s_entname": s_entname, //公司名称
  111. "s_departname": s_departname, //部门名称
  112. "s_rulename": strings.Join(s_rulename, ","), //规则名称
  113. "i_importnum": importDataNum, //导入数量
  114. "appid": appid,
  115. "s_createname": username, //创建人
  116. "s_status": "未开始", //项目状态
  117. "i_createtime": time.Now().Unix(), //创建时间
  118. "s_importtype": "excel", //导入类型
  119. "b_isassessment": false, //是否进行了质量评估
  120. }
  121. } else if stype == "coll" { //数据库导入
  122. historyid := f.GetString("s_historyid")
  123. if historyid == "" {
  124. f.ServeJson(map[string]interface{}{"success": false, "msg": "数据导出ID字段"})
  125. return
  126. }
  127. s_departname, s_entname, s_rulename, importDataNum = ImportDataByColl(historyid, &success, &msg, &successNum)
  128. qu.Debug(s_departname, s_entname, s_rulename, importDataNum)
  129. //保存项目信息
  130. set = map[string]interface{}{
  131. "s_name": s_name, //项目名称
  132. "s_entname": s_entname, //公司名称
  133. "s_departname": s_departname, //部门名称
  134. "s_rulename": strings.Join(s_rulename, ","), //规则名称
  135. "i_importnum": importDataNum, //导入数量
  136. "appid": appid,
  137. "s_createname": username, //创建人
  138. "s_status": "未开始", //项目状态
  139. "i_createtime": time.Now().Unix(), //创建时间
  140. "s_importtype": "coll", //导入类型
  141. "s_historyid": historyid, //源数据集标识
  142. "b_isassessment": false, //是否进行了质量评估
  143. }
  144. } else if stype == "edit" { //编辑保存
  145. success = true
  146. //s_entname = f.GetString("s_entname") //公司名称
  147. s_departname = f.GetString("s_departname") //部门名称
  148. rulename := f.GetString("s_rulename") //规则名称
  149. s_rulename = strings.Split(rulename, ",")
  150. s_personname := f.GetString("s_personname")
  151. set = map[string]interface{}{
  152. //"s_name": s_name, //项目名称
  153. //"s_entname": s_entname, //公司名称
  154. "s_departname": s_departname, //部门名称
  155. "s_rulename": strings.Join(s_rulename, ","), //规则名称
  156. "s_updateperson": username, //更新人
  157. "i_createtime": time.Now().Unix(), //更新时间
  158. "s_personname": s_personname, //售后人员
  159. //"i_starttime":,//开始时间
  160. //"i_completetime",//结束时间
  161. }
  162. }
  163. if success {
  164. success = util.Mgo.Update(util.PROJECTCOLLNAME, query, map[string]interface{}{"$set": set}, true, false)
  165. qu.Debug("Save Project:", success)
  166. if !success { //保存项目失败
  167. msg = "新建项目失败\n" + msg
  168. } else {
  169. msg = "保存项目成功"
  170. }
  171. }
  172. //qu.Debug("Msg:", msg)
  173. //返回信息
  174. if stype == "edit" {
  175. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  176. } else {
  177. qu.Debug("Create Project:", success, "importnum:", importDataNum, "successnum:", successNum, "failnum:", int64(importDataNum)-successNum)
  178. f.ServeJson(map[string]interface{}{"success": success, "msg": msg, "importnum": importDataNum, "successnum": successNum, "failnum": int64(importDataNum) - successNum})
  179. }
  180. }
  181. func (f *Front) ProjectAddData() {
  182. defer qu.Catch()
  183. if f.Method() == "POST" {
  184. user := f.GetSession("user").(map[string]interface{})
  185. username := qu.ObjToString(user["s_login"])
  186. projectid := f.GetString("projectid")
  187. stype := f.GetString("s_type")
  188. info, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, projectid, nil)
  189. if len(*info) > 0 {
  190. success := false //导入数据是否成功
  191. msg := "" //异常信息
  192. importDataNum, successNum := 0, int64(0) //导入成功条数
  193. if stype == "excel" {
  194. mf, _, err := f.GetFile("xlsx")
  195. if err == nil {
  196. importDataNum, _ = ImportDataByExcel(mf, &success, &msg, &successNum, false)
  197. var addDataTag []map[string]interface{}
  198. if (*info)["v_add_tag"] != nil {
  199. arr := qu.ObjArrToMapArr((*info)["v_add_data"].([]interface{}))
  200. addDataTag = append(addDataTag, arr...)
  201. } else {
  202. addDataTag = append(addDataTag, map[string]interface{}{
  203. "s_importtype": stype,
  204. "i_importnum": importDataNum,
  205. "s_updateperson": username,
  206. "i_updatetime": time.Now().Unix(),
  207. })
  208. }
  209. s_status := ""
  210. if status := qu.ObjToString((*info)["s_status"]); status == "未开始" || status == "进行中" {
  211. s_status = status
  212. } else if status == "已完成" {
  213. s_status = "进行中"
  214. }
  215. set := map[string]interface{}{
  216. "i_importnum": importDataNum + qu.IntAll((*info)["i_importnum"]), //导入数量
  217. "s_status": s_status, //项目状态
  218. "i_updatetime": time.Now().Unix(),
  219. "v_add_data": addDataTag,
  220. }
  221. util.Mgo.UpdateById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"$set": set})
  222. }
  223. } else if stype == "coll" {
  224. historyid := f.GetString("s_historyid")
  225. if historyid == "" {
  226. f.ServeJson(map[string]interface{}{"success": false, "msg": "数据导出ID字段"})
  227. return
  228. }
  229. _, _, _, importDataNum = ImportDataByColl(historyid, &success, &msg, &successNum)
  230. if !success {
  231. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  232. return
  233. }
  234. var addDataTag []map[string]interface{}
  235. if (*info)["v_add_tag"] != nil {
  236. arr := qu.ObjArrToMapArr((*info)["v_add_data"].([]interface{}))
  237. addDataTag = append(addDataTag, arr...)
  238. } else {
  239. addDataTag = append(addDataTag, map[string]interface{}{
  240. "s_importtype": stype,
  241. "i_importnum": importDataNum,
  242. "s_updateperson": username,
  243. "i_updatetime": time.Now().Unix(),
  244. })
  245. }
  246. s_status := ""
  247. if status := qu.ObjToString((*info)["s_status"]); status == "未开始" || status == "进行中" {
  248. s_status = status
  249. } else if status == "已完成" {
  250. s_status = "进行中"
  251. }
  252. //保存项目信息
  253. set := map[string]interface{}{
  254. "i_importnum": importDataNum + qu.IntAll((*info)["i_importnum"]), //导入数量
  255. "s_status": s_status, //项目状态
  256. "i_updatetime": time.Now().Unix(),
  257. "v_add_data": addDataTag,
  258. }
  259. util.Mgo.UpdateById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"$set": set})
  260. }
  261. f.ServeJson(map[string]interface{}{"success": success, "msg": msg, "importnum": importDataNum, "successnum": successNum, "failnum": int64(importDataNum) - successNum})
  262. } else {
  263. f.ServeJson(map[string]interface{}{"success": false, "msg": "项目查询失败"})
  264. }
  265. }
  266. }
  267. // ProjectComplete 项目提交完成
  268. func (f *Front) ProjectComplete() {
  269. defer qu.Catch()
  270. user := f.GetSession("user").(map[string]interface{})
  271. username := qu.ObjToString(user["s_login"]) //当前登录用户
  272. success := false
  273. msg := ""
  274. projectId := f.GetString("s_projectid")
  275. //status := f.GetString("s_status")
  276. info, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, projectId, `{"s_status": 1, "appid": 1}`)
  277. if len(*info) <= 0 {
  278. f.ServeJson(map[string]interface{}{"success": false, "msg": "查询项目失败"})
  279. return
  280. }
  281. status := (*info)["s_status"]
  282. if status == "进行中" {
  283. //查询该项目下未完成的用户组和用户任务
  284. query := map[string]interface{}{
  285. "s_projectid": projectId,
  286. "s_status": map[string]interface{}{
  287. "$in": []string{"未开始", "进行中"},
  288. },
  289. }
  290. taskCount := util.Mgo.Count(util.TASKCOLLNAME, query)
  291. dataCount := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"b_istag": false, "appid": qu.ObjToString((*info)["appid"])}) //未标注数据个数
  292. qu.Debug("No Tag Count:", dataCount)
  293. if dataCount == 0 && taskCount == 0 { //全部完成
  294. success = util.Mgo.UpdateById(util.PROJECTCOLLNAME, projectId, map[string]interface{}{
  295. "$set": map[string]interface{}{
  296. "s_status": "已完成",
  297. "i_completetime": time.Now().Unix(),
  298. "s_updateperson": username,
  299. "i_updatetime": time.Now().Unix(),
  300. },
  301. })
  302. if !success {
  303. msg = "更新项目失败"
  304. }
  305. }
  306. if taskCount != 0 {
  307. msg += "任务未全部完成,"
  308. }
  309. if dataCount != 0 {
  310. msg += "数据未全部标注"
  311. }
  312. } else {
  313. msg = "项目未开始"
  314. }
  315. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  316. }
  317. // ProjectQualityAssessment 数据质量评估
  318. func (f *Front) ProjectQualityAssessment() {
  319. defer qu.Catch()
  320. msg := ""
  321. success := false
  322. //质量评估
  323. projectid := f.GetString("pid") //项目id
  324. project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"b_isassessment": 1, "appid": 1, "v_fields": 1})
  325. if project != nil && len(*project) > 0 {
  326. if isAssessment, ok := (*project)["b_isassessment"].(bool); ok && !isAssessment {
  327. appid := qu.ObjToString((*project)["appid"])
  328. // todo
  329. util.Mgo.Update(util.DATACOLLNAME, bson.M{"appid": appid}, bson.M{"$set": bson.M{"b_istagging": true}}, false, true)
  330. b := util.Mgo.UpdateById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"$set": map[string]interface{}{"b_isassessment": true, "s_status": "进行中", "i_starttime": time.Now().Unix()}})
  331. qu.Debug("Update Porject:"+projectid+" Status Success:", b)
  332. success = true
  333. } else if ok && isAssessment {
  334. success = true
  335. msg = "成功"
  336. } else {
  337. msg = "查询项目失败"
  338. }
  339. } else {
  340. msg = "查询项目失败"
  341. }
  342. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  343. }
  344. // ProjectGroupTaskList 用户组任务分发列表
  345. func (f *Front) ProjectGroupTaskList() {
  346. defer qu.Catch()
  347. projectid := f.GetString("pid") //项目id
  348. if f.Method() == "POST" {
  349. status := f.GetString("s_status") //任务状态
  350. searchStr := f.GetString("search[value]")
  351. search := strings.TrimSpace(searchStr)
  352. start, _ := f.GetInteger("start")
  353. limit, _ := f.GetInteger("length")
  354. draw, _ := f.GetInteger("draw")
  355. query := map[string]interface{}{ //查找用户组任务
  356. "s_projectid": projectid,
  357. "s_stype": "group",
  358. }
  359. if status != "-1" {
  360. query["s_status"] = status
  361. }
  362. if search != "" {
  363. query["$or"] = []interface{}{
  364. map[string]interface{}{"s_groupname": map[string]interface{}{"$regex": search}},
  365. }
  366. }
  367. qu.Debug("Query:", query)
  368. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
  369. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  370. for _, l := range *list {
  371. if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
  372. //groupId := qu.ObjToString(l["s_groupid"])
  373. groupTaskId := mongodb.BsonIdToSId(l["_id"])
  374. giveNum := qu.IntAll(l["i_givenum"])
  375. tagNum := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"s_grouptaskid": groupTaskId, "b_istag": true})
  376. progressFloat := float64(tagNum) / float64(giveNum)
  377. value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64)
  378. decimalValue := decimal.NewFromFloat(value)
  379. decimalValue = decimalValue.Mul(decimal.NewFromInt(100))
  380. value, _ = decimalValue.Float64()
  381. progress := fmt.Sprint(value) + "%"
  382. l["s_progress"] = progress
  383. //同步数据库
  384. util.Mgo.UpdateById(util.TASKCOLLNAME, l["_id"], map[string]interface{}{"$set": map[string]interface{}{"s_progress": progress}})
  385. }
  386. }
  387. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  388. } else {
  389. project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"appid": 1})
  390. appid := qu.ObjToString((*project)["appid"])
  391. if project != nil && len(*project) > 0 { //数据源表
  392. okAllDataNum := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"b_istagging": false, "appid": appid}) //达标数据总量
  393. okIsGiveDataNum := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"b_istagging": false, "b_isgivegroup": true, "appid": appid}) //达标数据已分发量
  394. okNotGiveDataNum := okAllDataNum - okIsGiveDataNum //达标待分发量
  395. okIsTagDataNum := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"b_istagging": false, "b_istag": true, "appid": appid}) //达标已标注量
  396. IsNoOkAllDataNum := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"b_istagging": true, "appid": appid}) //未达标数据总量
  397. IsNoOkIsGiveDataNum := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"b_istagging": true, "b_isgivegroup": true, "appid": appid}) //未达标数据已分发量
  398. IsNotOkNotGiveDataNum := IsNoOkAllDataNum - IsNoOkIsGiveDataNum //未达标待分发量
  399. IsNotOkIsTagDataNum := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"b_istagging": true, "b_istag": true, "appid": appid}) //未达标已标注量
  400. acceptNum := util.Mgo.Count("jy_check", map[string]interface{}{"projectid": projectid}) // 验收数据量
  401. allGiveDataNum := okIsGiveDataNum + IsNoOkIsGiveDataNum //总分发量
  402. allNoGiveDataNum := okNotGiveDataNum + IsNotOkNotGiveDataNum //总待分发量
  403. allIsTagDataNum := okIsTagDataNum + IsNotOkIsTagDataNum //已标注总量
  404. allDataNum := allGiveDataNum + allNoGiveDataNum
  405. // 查询全部实际可分发数据量(未分发、未标注)
  406. okRealGiveNum := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"b_isgivegroup": false, "b_istag": false})
  407. //qu.Debug("数据总量:", allDataNum, "已分发总量:", allGiveDataNum, "待分发总量:", allNoGiveDataNum, "已标注总量:", allIsTagDataNum)
  408. //qu.Debug("达标量:", okAllDataNum, "达标已分发量:", okIsGiveDataNum, "达标待分发量:", okNotGiveDataNum, "达标已标注量:", okIsTagDataNum)
  409. //qu.Debug(" 未达标量:", IsNoOkAllDataNum, " 未达标已分发量:", IsNoOkIsGiveDataNum, " 未达标待分发量:", IsNotOkNotGiveDataNum, " 未达标已标注量:", IsNotOkIsTagDataNum)
  410. f.T["s_projectid"] = projectid
  411. f.T["appid"] = appid
  412. f.T["allDataNum"] = allDataNum
  413. f.T["okAllDataNum"] = okAllDataNum
  414. f.T["okIsGiveDataNum"] = okIsGiveDataNum
  415. f.T["okNotGiveDataNum"] = okNotGiveDataNum
  416. f.T["IsNoOkAllDataNum"] = IsNoOkAllDataNum
  417. f.T["IsNoOkIsGiveDataNum"] = IsNoOkIsGiveDataNum
  418. f.T["IsNotOkNotGiveDataNum"] = IsNotOkNotGiveDataNum
  419. f.T["allGiveDataNum"] = allGiveDataNum
  420. f.T["allNoGiveDataNum"] = allNoGiveDataNum
  421. f.T["allIsTagDataNum"] = allIsTagDataNum
  422. f.T["okIsTagDataNum"] = okIsTagDataNum
  423. f.T["IsNotOkIsTagDataNum"] = IsNotOkIsTagDataNum
  424. f.T["okRealGiveNum"] = okRealGiveNum
  425. f.T["acceptNum"] = acceptNum
  426. _ = f.Render("project/project_clear.html", &f.T)
  427. } else {
  428. qu.Debug("Project Find Error")
  429. f.ServeJson("查询项目失败")
  430. }
  431. }
  432. }
  433. // ProjectGroupTaskSave 用户组任务分发
  434. func (f *Front) ProjectGroupTaskSave() {
  435. defer qu.Catch()
  436. var groupArr []map[string]interface{}
  437. var taskArr []map[string]interface{}
  438. var groupIdArr []string
  439. var groupTaskIdArr []string
  440. groupIdTask := map[string]util.Task{}
  441. success := false
  442. msg := ""
  443. user := f.GetSession("user").(map[string]interface{})
  444. username := qu.ObjToString(user["s_login"]) //当前登录用户
  445. projectid := f.GetString("s_projectid") //项目标识
  446. project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, projectid, nil)
  447. projectname := qu.ObjToString((*project)["s_name"]) //项目名称
  448. appid := qu.ObjToString((*project)["appid"])
  449. group := f.GetString("s_group")
  450. stype := f.GetString("s_type")
  451. qu.Debug("项目id:", projectid, " 项目名称:", projectname)
  452. if err := json.Unmarshal([]byte(group), &groupArr); err != nil {
  453. qu.Debug("GroupInfo Unmarshal Failed:", err)
  454. msg = "用户组信息解析失败"
  455. } else {
  456. qu.Debug("用户组信息:", groupArr, stype)
  457. //if stype != "tag" { //如果分发的是达标数据或者全部数据且进行了初步质检,将没有质检记录的字段从v_taginfo标注记录中删除
  458. // DeleleDataTagInfo(sourceinfo)
  459. //}
  460. // 查询实际可分发数据量(未分发、未标注)
  461. realNum := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"b_isgivegroup": false, "b_istag": false, "appid": appid})
  462. for _, groupInfo := range groupArr {
  463. groupId := qu.ObjToString(groupInfo["s_groupid"])
  464. groupIdArr = append(groupIdArr, groupId)
  465. givenum := qu.IntAll(groupInfo["i_givenum"])
  466. if givenum <= 0 {
  467. continue
  468. }
  469. if realNum <= 0 {
  470. break
  471. }
  472. if realNum < givenum {
  473. givenum = realNum
  474. }
  475. groupTaskId := primitive.NewObjectID()
  476. groupTaskIdStr := mongodb.BsonIdToSId(groupTaskId)
  477. groupTaskIdArr = append(groupTaskIdArr, groupTaskIdStr)
  478. gt := util.Task{
  479. UserId: groupId,
  480. GiveNum: givenum,
  481. }
  482. groupIdTask[groupTaskIdStr] = gt
  483. groupTask := map[string]interface{}{
  484. "_id": groupTaskId, //生成任务id
  485. "s_projectid": projectid, //项目标识
  486. "s_projectname": projectname, //项目名称
  487. "s_status": "未开始", //任务状态
  488. "s_personid": qu.ObjToString(groupInfo["s_personid"]), //任务负责人标识
  489. "s_personname": qu.ObjToString(groupInfo["s_personname"]), //任务负责人
  490. "s_groupname": qu.ObjToString(groupInfo["s_groupname"]), //用户组名称
  491. "s_groupid": groupId, //用户组标识
  492. "i_givenum": givenum, //分发数据量
  493. "s_createname": username, //创建人
  494. "i_createtime": time.Now().Unix(), //创建时间
  495. "s_progress": "0%", //完成进度
  496. "s_stype": "group", //任务类型
  497. "s_entname": qu.ObjToString((*project)["s_entname"]), //公司名称
  498. "s_departname": qu.ObjToString((*project)["s_departname"]), //部门名称
  499. "s_rulename": qu.ObjToString((*project)["s_rulename"]), //规则名称
  500. "s_datatype": qu.ObjToString((*project)["s_datatype"]), //数据类型
  501. }
  502. realNum = realNum - givenum
  503. taskArr = append(taskArr, groupTask)
  504. }
  505. }
  506. if len(taskArr) > 0 {
  507. //分发数据后更新项目中用户组标识信息和用户组任务id
  508. success = util.Mgo.UpdateById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{
  509. "$push": map[string]interface{}{
  510. "v_groupids": map[string]interface{}{
  511. "$each": groupIdArr,
  512. },
  513. "v_grouptaskids": map[string]interface{}{
  514. "$each": groupTaskIdArr,
  515. },
  516. },
  517. })
  518. if !success {
  519. msg = "更新项目:" + projectname + "用户组标识失败"
  520. } else { //用户组分发任务
  521. success = util.Mgo.SaveBulk(util.TASKCOLLNAME, taskArr...)
  522. if success {
  523. msg = "任务分发成功"
  524. UpdateSourceInfoByGroup(stype, appid, groupIdTask) //用户组分发任务成功后,给数据源打上用户组标识
  525. } else {
  526. msg = "任务分发失败"
  527. }
  528. }
  529. }
  530. qu.Debug("Success:", success, "Msg:", msg)
  531. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  532. }
  533. // ProjectGetEntnameList 模糊查询公司名称
  534. func (f *Front) ProjectGetEntnameList() {
  535. defer qu.Catch()
  536. var entnameList []string
  537. entname := f.GetString("entname")
  538. query := map[string]interface{}{
  539. "username": map[string]interface{}{
  540. "$regex": entname,
  541. },
  542. }
  543. list, _ := util.MgoJy.Find(util.JyUser, query, nil, map[string]interface{}{"username": 1}, false, -1, -1)
  544. if len(*list) > 0 {
  545. for _, l := range *list {
  546. entnameList = append(entnameList, qu.ObjToString(l["username"]))
  547. }
  548. f.ServeJson(map[string]interface{}{"entname": entnameList})
  549. } else {
  550. f.ServeJson(map[string]interface{}{"entname": []string{}})
  551. }
  552. }
  553. // ProjectGroupTaskRepulse 用户组任务打回
  554. func (f *Front) ProjectGroupTaskRepulse() {
  555. defer qu.Catch()
  556. success := false
  557. msg := ""
  558. user := f.GetSession("user").(map[string]interface{})
  559. username := qu.ObjToString(user["s_login"])
  560. //status := f.GetString("s_status")
  561. groupTaskId := f.GetString("taskid")
  562. appid := f.GetString("appid")
  563. currenttime := time.Now().Unix()
  564. //更新数据源
  565. success = util.Mgo.Update(util.DATACOLLNAME, map[string]interface{}{"s_grouptaskid": groupTaskId, "appid": appid}, map[string]interface{}{
  566. "$set": map[string]interface{}{
  567. "b_istag": false,
  568. "b_check": false, // 质检标记
  569. "i_ckdata": 0,
  570. "b_isgiveuser": false,
  571. "i_updatetime": currenttime,
  572. },
  573. "$unset": map[string]interface{}{
  574. "s_userid": "",
  575. "s_usertaskid": "",
  576. "s_login": "",
  577. "v_taginfo": "",
  578. "v_checkinfo": "",
  579. },
  580. }, false, true)
  581. if success {
  582. util.Mgo.Update(util.TASKCOLLNAME, map[string]interface{}{
  583. "s_stype": "user",
  584. "s_parentid": groupTaskId,
  585. }, map[string]interface{}{
  586. "$set": map[string]interface{}{
  587. "s_status": "已关闭",
  588. "s_progress": "%0",
  589. "i_updatetime": currenttime,
  590. "s_updateperson": username,
  591. },
  592. }, false, true)
  593. //更新用户组任务 清除最迟完成时间,更新任务状态
  594. success = util.Mgo.UpdateById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{
  595. "$set": map[string]interface{}{
  596. "s_status": "未开始",
  597. "s_updateperson": username,
  598. "i_updatetime": currenttime,
  599. "s_progress": "0%",
  600. },
  601. "$unset": map[string]interface{}{
  602. "i_completetime": "",
  603. },
  604. })
  605. if !success {
  606. msg = "更新用户组任务失败"
  607. }
  608. } else {
  609. msg = "更新数据源信息失败"
  610. }
  611. qu.Debug("Task Repulse:", success, " Msg:", msg)
  612. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  613. }
  614. // ProjectGroupTaskRetrieve 用户组任务收回
  615. func (f *Front) ProjectGroupTaskRetrieve() {
  616. defer qu.Catch()
  617. user := f.GetSession("user").(map[string]interface{})
  618. username := qu.ObjToString(user["s_login"])
  619. groupTaskId := f.GetString("taskid")
  620. appid := f.GetString("appid")
  621. //status := f.GetString("s_status") //未开始、进行中
  622. //giveNum, _ := f.GetInteger("i_givenum") //收回时要更新的分发数据量
  623. msg := ""
  624. success := false
  625. count := 0
  626. groupTask, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"v_sonids": 1, "s_status": 1})
  627. if len(*groupTask) <= 0 {
  628. f.ServeJson(map[string]interface{}{"success": false, "msg": "查询任务失败"})
  629. return
  630. }
  631. status := qu.ObjToString((*groupTask)["s_status"])
  632. if status == "未开始" { //未开始的用户组任务,暂未给用户分发任务
  633. success = true
  634. } else { //进行中的用户组任务需更新其下用户信息
  635. if groupTask != nil && len(*groupTask) > 0 {
  636. if sonIds, ok := (*groupTask)["v_sonids"].([]interface{}); ok && len(sonIds) > 0 { //更新所有用户任务信息
  637. userTaskIdStatus := map[string]string{} //封装要回收的用户任务信息
  638. for _, sId := range sonIds {
  639. userTaskId := qu.ObjToString(sId)
  640. userTask, _ := util.Mgo.FindById(util.TASKCOLLNAME, userTaskId, map[string]interface{}{"s_status": 1})
  641. if userTask != nil && len(*userTask) > 0 {
  642. if statusTmp := qu.ObjToString((*userTask)["s_status"]); statusTmp != "已完成" && statusTmp != "已关闭" { //已完成和已关闭的任务不收回
  643. userTaskIdStatus[userTaskId] = statusTmp
  644. }
  645. } else {
  646. qu.Debug("Find User Task:", userTaskId, "Error")
  647. }
  648. }
  649. qu.Debug("userTaskIdStatus:", len(userTaskIdStatus))
  650. if len(userTaskIdStatus) > 0 { //收回用户组下所有用户信息
  651. //用户组收回时,若已有用户任务在未开始时收回或关闭,调用RetrieveTaskByUser返回的总收回量count就遗漏了用户收回或关闭任务的量
  652. msg, _, success = RetrieveCloseTaskByUser(username, userTaskIdStatus) //用户信息收回
  653. } else { //用户组下所有用户任务都已完成
  654. success = true
  655. }
  656. } else { //没有分配给用户任务
  657. success = true
  658. }
  659. } else {
  660. msg = "用户组任务查找失败"
  661. }
  662. }
  663. if success { //所有用户信息收回成功后,更新用户组任务相关信息
  664. count = util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{ //统计该用户组任务下未标注的数据量
  665. "appid": appid,
  666. "s_grouptaskid": groupTaskId,
  667. "b_istag": false,
  668. })
  669. UpdateGroupTaskAndSourceInfo(groupTaskId, appid, username, status, count, &msg, &success)
  670. }
  671. qu.Debug(success, count, msg)
  672. f.ServeJson(map[string]interface{}{"success": success, "msg": msg, "count": count})
  673. }
  674. // ProjectGroupTaskClose 用户组任务关闭
  675. func (f *Front) ProjectGroupTaskClose() {
  676. defer qu.Catch()
  677. user := f.GetSession("user").(map[string]interface{})
  678. username := qu.ObjToString(user["s_login"])
  679. groupTaskId := f.GetString("taskid")
  680. appid := f.GetString("appid")
  681. //status := f.GetString("s_status") //未开始、进行中
  682. msg := ""
  683. success := false
  684. count := 0
  685. groupTask, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"s_status": 1})
  686. if len(*groupTask) <= 0 {
  687. f.ServeJson(map[string]interface{}{"success": false, "msg": "查询任务失败"})
  688. return
  689. }
  690. status := qu.ObjToString((*groupTask)["s_status"])
  691. if status == "未开始" { //未开始的用户组任务,暂未给用户分发任务;已完成只更新用户组任务
  692. success = true
  693. } else { //进行中的用户组任务需更新其下用户信息
  694. //groupTask, _ := util.Mgo.FindById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"v_sonids": 1})
  695. //if groupTask != nil && len(*groupTask) > 0 {
  696. // if sonIds, ok := (*groupTask)["v_sonids"].([]interface{}); ok && len(sonIds) > 0 { //更新所有用户任务信息
  697. // userTaskIdStatus := map[string]string{} //封装要关闭的用户任务信息
  698. // for _, sId := range sonIds {
  699. // userTaskId := qu.ObjToString(sId)
  700. // userTask, _ := util.Mgo.FindById(util.TASKCOLLNAME, userTaskId, map[string]interface{}{"s_status": 1})
  701. // if userTask != nil && len(*userTask) > 0 {
  702. // if statusTmp := qu.ObjToString((*userTask)["s_status"]); statusTmp == "已完成" && statusTmp != "已关闭" { //已关闭的任务不更新
  703. // userTaskIdStatus[userTaskId] = statusTmp
  704. // }
  705. // } else {
  706. // qu.Debug("Find User Task:", userTaskId, "Error")
  707. // }
  708. // }
  709. // if len(userTaskIdStatus) > 0 { //关闭用户组下所有用户信息
  710. // msg, _, success = RetrieveCloseTaskByUser(sourceInfo, username, userTaskIdStatus) //用户信息收回
  711. // } else { //用户组下所有用户任务都已关闭
  712. // success = true
  713. // }
  714. // } else { //没有分配给用户任务
  715. // success = true
  716. // }
  717. //} else {
  718. // msg = "用户组任务查找失败"
  719. //}
  720. }
  721. if success { //所有用户信息关闭成功后,更新用户组任务相关信息
  722. count = util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{ //统计该用户组任务下未标注的数据量
  723. "s_grouptaskid": groupTaskId,
  724. "b_istag": false,
  725. })
  726. UpdateGroupTaskAndSourceInfo(groupTaskId, appid, username, status, count, &msg, &success)
  727. }
  728. qu.Debug(success, count, msg)
  729. f.ServeJson(map[string]interface{}{"success": success, "msg": msg, "count": count})
  730. }
  731. // UpdateGroupTaskAndSourceInfo 更新用户组任务相关信息
  732. func UpdateGroupTaskAndSourceInfo(groupTaskId, appid, username, status string, count int, msg *string, success *bool) {
  733. defer qu.Catch()
  734. qu.Debug("GroupTaskStatus:", status, " Count:", count)
  735. if count != 0 { //更新数据源
  736. query := map[string]interface{}{
  737. "appid": appid,
  738. "s_grouptaskid": groupTaskId,
  739. "b_istag": false,
  740. }
  741. set := map[string]interface{}{
  742. "b_isgivegroup": false,
  743. "i_updatetime": time.Now().Unix(),
  744. }
  745. unset := map[string]interface{}{
  746. "s_groupid": "",
  747. "s_grouptaskid": "",
  748. }
  749. *success = util.Mgo.Update(util.DATACOLLNAME, query, map[string]interface{}{"$set": set, "$unset": unset}, false, true)
  750. }
  751. //更新用户组任务
  752. if *success {
  753. taskSet := map[string]interface{}{
  754. "s_status": "已完成",
  755. "s_updateperson": username,
  756. "i_updatetime": time.Now().Unix(),
  757. "i_completetime": time.Now().Unix(),
  758. "s_progress": "100%",
  759. }
  760. if status == "未开始" {
  761. taskSet["i_starttime"] = time.Now().Unix()
  762. taskSet["s_status"] = "已关闭"
  763. }
  764. inc := map[string]interface{}{
  765. "i_givenum": -count,
  766. }
  767. *success = util.Mgo.UpdateById(util.TASKCOLLNAME, groupTaskId, map[string]interface{}{"$set": taskSet, "$inc": inc})
  768. if !*success {
  769. *msg = "更新用户组任务失败"
  770. }
  771. } else {
  772. *msg = "更新数据源信息失败"
  773. }
  774. }
  775. // DeleleDataTagInfo 删除标注记录
  776. func DeleleDataTagInfo(sourceinfo string) {
  777. defer qu.Catch()
  778. sess := util.Mgo.GetMgoConn()
  779. defer util.Mgo.DestoryMongoConn(sess)
  780. ch := make(chan bool, 5)
  781. wg := &sync.WaitGroup{}
  782. lock := &sync.Mutex{}
  783. query := map[string]interface{}{ //达标数据可能会分发后收回、打回再分发
  784. "b_istagging": false, //达标数据
  785. "b_cleartag": false, //未进行一次标注信息清理
  786. }
  787. fields := map[string]interface{}{
  788. "v_taginfo": 1,
  789. "v_check": 1,
  790. }
  791. updateArr := [][]map[string]interface{}{}
  792. it := sess.DB(util.Mgo.DbName).C(util.DATACOLLNAME).Find(&query).Select(&fields).Iter()
  793. count, _ := sess.DB(util.Mgo.DbName).C(util.DATACOLLNAME).Find(&query).Count()
  794. qu.Debug("Find Needs To Clearn Data Count:", count)
  795. n := 0
  796. for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
  797. ch <- true
  798. wg.Add(1)
  799. go func(tmp map[string]interface{}) {
  800. defer func() {
  801. <-ch
  802. wg.Done()
  803. }()
  804. update := []map[string]interface{}{}
  805. update = append(update, map[string]interface{}{"_id": tmp["_id"]})
  806. tagInfo, _ := tmp["v_taginfo"].(map[string]interface{})
  807. checkInfo, _ := tmp["v_check"].(map[string]interface{})
  808. set := map[string]interface{}{
  809. "b_cleartag": true,
  810. }
  811. unset := map[string]interface{}{}
  812. if len(tagInfo) != 0 && len(checkInfo) != 0 { //有质检信息,删除v_taginfo未质检的字段
  813. for f := range tagInfo {
  814. if checkInfo[f] == nil {
  815. delete(tagInfo, f)
  816. }
  817. }
  818. set["v_taginfo"] = tagInfo
  819. } else if len(tagInfo) != 0 && len(checkInfo) == 0 { //没有质检删除v_taginfo字段
  820. unset["v_taginfo"] = ""
  821. }
  822. if len(unset) > 0 {
  823. update = append(update, map[string]interface{}{
  824. "$set": set,
  825. "$unset": unset,
  826. })
  827. } else {
  828. update = append(update, map[string]interface{}{
  829. "$set": set,
  830. })
  831. }
  832. lock.Lock()
  833. updateArr = append(updateArr, update)
  834. if len(updateArr) > 500 {
  835. util.Mgo.UpdateBulk(util.DATACOLLNAME, updateArr...)
  836. updateArr = [][]map[string]interface{}{}
  837. }
  838. lock.Unlock()
  839. }(tmp)
  840. if n%100 == 0 {
  841. qu.Debug("current:", n)
  842. }
  843. tmp = map[string]interface{}{}
  844. }
  845. wg.Wait()
  846. lock.Lock()
  847. if len(updateArr) > 0 {
  848. util.Mgo.UpdateBulk(util.DATACOLLNAME, updateArr...)
  849. updateArr = [][]map[string]interface{}{}
  850. }
  851. lock.Unlock()
  852. }
  853. // UpdateSourceInfoByGroup 用户组分发任务成功后,给数据源打上用户组标识
  854. func UpdateSourceInfoByGroup(stype, appid string, groupIdInfo map[string]util.Task) {
  855. defer qu.Catch()
  856. for groupTaskId, tInfo := range groupIdInfo {
  857. groupId := tInfo.UserId
  858. num := tInfo.GiveNum
  859. sess := util.Mgo.GetMgoConn()
  860. defer util.Mgo.DestoryMongoConn(sess)
  861. ch := make(chan bool, 5)
  862. wg := &sync.WaitGroup{}
  863. lock := &sync.Mutex{}
  864. query := map[string]interface{}{ //查找未分配且未标注对应stype的数据分发
  865. "appid": appid,
  866. "b_isgivegroup": false,
  867. "b_istag": false,
  868. }
  869. if stype == "notag" { //达标数据
  870. query["b_istagging"] = false
  871. } else if stype == "tag" { //未达标数据
  872. query["b_istagging"] = true
  873. }
  874. fields := map[string]interface{}{
  875. "v_baseinfo": 1,
  876. }
  877. updateArr := [][]map[string]interface{}{}
  878. qu.Debug("Query:", query)
  879. it := sess.DB(util.Mgo.DbName).C(util.DATACOLLNAME).Find(&query).Select(&fields).Limit(int64(num)).Iter()
  880. n := 0
  881. for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
  882. ch <- true
  883. wg.Add(1)
  884. go func(tmp map[string]interface{}) {
  885. defer func() {
  886. <-ch
  887. wg.Done()
  888. }()
  889. update := []map[string]interface{}{}
  890. update = append(update, map[string]interface{}{"_id": tmp["_id"]})
  891. update = append(update, map[string]interface{}{
  892. "$set": map[string]interface{}{
  893. "s_groupid": groupId,
  894. "s_grouptaskid": groupTaskId,
  895. "b_isgivegroup": true,
  896. "i_updatetime": time.Now().Unix(),
  897. },
  898. // 分发时 删除程序检测的标记
  899. "$unset": map[string]interface{}{
  900. "s_excp": "",
  901. "s_excp_info": "",
  902. },
  903. })
  904. lock.Lock()
  905. updateArr = append(updateArr, update)
  906. //saveArr = append(saveArr, save)
  907. if len(updateArr) > 500 {
  908. util.Mgo.UpdateBulk(util.DATACOLLNAME, updateArr...)
  909. updateArr = [][]map[string]interface{}{}
  910. }
  911. lock.Unlock()
  912. }(tmp)
  913. if n%100 == 0 {
  914. qu.Debug("current:", n)
  915. }
  916. tmp = map[string]interface{}{}
  917. }
  918. wg.Wait()
  919. lock.Lock()
  920. if len(updateArr) > 0 {
  921. util.Mgo.UpdateBulk(util.DATACOLLNAME, updateArr...)
  922. updateArr = [][]map[string]interface{}{}
  923. }
  924. lock.Unlock()
  925. }
  926. }
  927. // ImportDataByExcel 通过excel获取数据源
  928. func ImportDataByExcel(mf multipart.File, success *bool, msg *string, successNum *int64, createindex bool) (importDataNum int, appid string) {
  929. defer qu.Catch()
  930. binary, _ := ioutil.ReadAll(mf)
  931. xls, _ := xlsx.OpenBinary(binary)
  932. sheet := xls.Sheets[0]
  933. rows := sheet.Rows
  934. idcolnum := -1
  935. appidColnum := -1
  936. cellFieldName := map[int]string{} //记录客户需求字段所在的列
  937. idInfoArr := []util.Data{} //记录数据id及需要保存的字段信息
  938. for rn, row := range rows {
  939. if rn == 0 {
  940. for index, cell := range row.Cells {
  941. title := cell.Value
  942. if fieldName := util.CustomerFieldMap_HE[title]; fieldName != "" { //客户需求字段
  943. cellFieldName[index] = fieldName
  944. }
  945. if title == "唯一标识" || title == "信息标识" { //id所在列
  946. idcolnum = index
  947. }
  948. if title == "企业客户id" { //id所在列
  949. appidColnum = index
  950. }
  951. }
  952. if idcolnum == -1 {
  953. break
  954. }
  955. if appidColnum == -1 {
  956. return 0, ""
  957. }
  958. continue
  959. }
  960. if len(row.Cells) < len(rows[0].Cells) {
  961. break
  962. }
  963. tmp := map[string]interface{}{}
  964. for index, f := range cellFieldName {
  965. if val := row.Cells[index].Value; val != "" {
  966. if f == "capital" { //注册资金(万元)
  967. cf, _ := row.Cells[index].Float()
  968. tmp[f] = cf
  969. } else if f == "createtime" { //创建时间
  970. ci, _ := row.Cells[index].Int64()
  971. tmp[f] = ci
  972. } else {
  973. tmp[f] = val
  974. }
  975. }
  976. }
  977. id := row.Cells[idcolnum].String() //加密的id
  978. if id == "" {
  979. break
  980. }
  981. id = util.SE.DecodeString(id) //解密后id
  982. idInfoArr = append(idInfoArr, util.Data{
  983. ID: id,
  984. Info: tmp,
  985. })
  986. if appid == "" {
  987. appid = qu.ObjToString(tmp["appid"])
  988. }
  989. }
  990. importDataNum = len(idInfoArr)
  991. qu.Debug("Load Excel Count:", importDataNum, appid)
  992. if importDataNum > 0 {
  993. GetDataById(idInfoArr, "excel", success, msg, successNum)
  994. } else {
  995. *success = false
  996. *msg = "查询数据失败"
  997. }
  998. idInfoArr = []util.Data{}
  999. return
  1000. }
  1001. // ImportDataByColl 通过表获取数据源
  1002. func ImportDataByColl(historyid string, success *bool, msg *string, successNum *int64) (departname, entname string, rulename []string, importDataNum int) {
  1003. defer qu.Catch()
  1004. rulenameMap := map[string]bool{}
  1005. sess := util.MgoJy.GetMgoConn()
  1006. defer util.MgoJy.DestoryMongoConn(sess)
  1007. ch := make(chan bool, 3)
  1008. wg := &sync.WaitGroup{}
  1009. lock := &sync.Mutex{}
  1010. idInfoArr := []util.Data{} //记录数据id及需要保存的字段信息
  1011. query := map[string]interface{}{
  1012. "historyId": historyid,
  1013. }
  1014. it := sess.DB(util.MgoJy.DbName).C(util.JyHistory).Find(&query).Iter()
  1015. n := 0
  1016. for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
  1017. ch <- true
  1018. wg.Add(1)
  1019. go func(tmp map[string]interface{}) {
  1020. defer func() {
  1021. <-ch
  1022. wg.Done()
  1023. }()
  1024. id := qu.ObjToString(tmp["id"]) //bidding id
  1025. appid := qu.ObjToString(tmp["appid"]) //根据appid查user表获取公司名称
  1026. departname = qu.ObjToString(tmp["departname"]) //部门名称。所有数据都应部门名称,若不一致,随机取
  1027. needField := map[string]interface{}{}
  1028. for f := range util.CustomerFieldMap_EH {
  1029. if tmp[f] != nil {
  1030. needField[f] = tmp[f]
  1031. }
  1032. }
  1033. if entname == "" { //获取一次公司名称即可
  1034. user, _ := util.MgoJy.FindOne(util.JyUser, map[string]interface{}{"appid": appid})
  1035. entname = qu.ObjToString((*user)["username"]) //公司名称
  1036. }
  1037. rname := qu.ObjToString(tmp["rulename"])
  1038. lock.Lock()
  1039. for _, r := range strings.Split(rname, ",") {
  1040. rulenameMap[r] = true
  1041. }
  1042. //rulename = append(rulename, qu.ObjToString(tmp["rulename"])) //规则名称
  1043. //idInfoMap[id] = needField
  1044. idInfoArr = append(idInfoArr, util.Data{
  1045. ID: id,
  1046. Info: needField,
  1047. })
  1048. lock.Unlock()
  1049. }(tmp)
  1050. if n%100 == 0 {
  1051. qu.Debug("current:", n)
  1052. }
  1053. tmp = map[string]interface{}{}
  1054. }
  1055. wg.Wait()
  1056. for r := range rulenameMap {
  1057. rulename = append(rulename, r)
  1058. }
  1059. importDataNum = len(idInfoArr) //查询数据总数
  1060. if importDataNum > 0 {
  1061. GetDataById(idInfoArr, "coll", success, msg, successNum)
  1062. } else {
  1063. *msg = "查询数据失败"
  1064. }
  1065. idInfoArr = []util.Data{}
  1066. return
  1067. }
  1068. // GetDataById 通过id集从bidding、extract、project获取数据所有信息
  1069. func GetDataById(idInfoArr []util.Data, importType string, success *bool, msg *string, successNum *int64) {
  1070. *success = true
  1071. var msgArr []string
  1072. wg := &sync.WaitGroup{}
  1073. lock := &sync.Mutex{}
  1074. ch := make(chan bool, 10)
  1075. //num := int64(0) //计数
  1076. for i, data := range idInfoArr {
  1077. wg.Add(1)
  1078. ch <- true
  1079. go func(index int, tmpData util.Data) {
  1080. defer func() {
  1081. wg.Done()
  1082. <-ch
  1083. }()
  1084. /*
  1085. 1.查询数据是否存在 f_data
  1086. 1.查询bidding
  1087. 2.查extract
  1088. 3.extract合并到bidding(删除item字段与客户需要的item不是一个含义)
  1089. 4.对比marked表,替换已标注过的字段值,补充标记
  1090. 5.合并客户所需字段信息,补充id字段
  1091. //6.若为同步时,删除原有id对应的信息,新增该id对应的_id信息
  1092. 6.mgo查询项目信息
  1093. */
  1094. tagInfoMap := map[string]interface{}{} //记录数据已标注过的信息
  1095. baseInfoMap := map[string]interface{}{} //记录其他信息
  1096. id := tmpData.ID
  1097. tmp := tmpData.Info
  1098. m, _ := util.Mgo.FindById(util.DATACOLLNAME, id, nil)
  1099. if len(*m) > 0 {
  1100. appid := qu.ObjArrToStringArr((*m)["appid"].([]interface{}))
  1101. if !strings.Contains(strings.Join(appid, ","), qu.ObjToString(tmp["appid"])) {
  1102. if s1 := qu.ObjToString(tmp["matchkey"]); s1 != "" {
  1103. if s1 != qu.ObjToString((*m)["matchkey"]) {
  1104. s1 = qu.ObjToString((*m)["matchkey"]) + "," + s1
  1105. }
  1106. util.Mgo.UpdateById(util.DATACOLLNAME, id, bson.M{"$set": bson.M{"matchkey": s1}, "$push": bson.M{"appid": qu.ObjToString(tmp["appid"])}})
  1107. } else {
  1108. util.Mgo.UpdateById(util.DATACOLLNAME, id, bson.M{"$push": bson.M{"appid": qu.ObjToString(tmp["appid"])}})
  1109. }
  1110. }
  1111. } else {
  1112. //markData, _ := util.MgoHM.FindById("bidding", id, nil)
  1113. //if len(*markData) > 0 {
  1114. //
  1115. //}
  1116. //1.查bidding
  1117. tmpBidColl := util.BidColl1 //bidding
  1118. if id < util.BIDDINGSTARTID {
  1119. tmpBidColl = util.BidColl2 //bidding_back
  1120. }
  1121. bidData, _ := util.MgoB.FindById(tmpBidColl, id, nil)
  1122. if qu.ObjToString((*bidData)["toptype"]) != "采购意向" {
  1123. // 导入数据时,删掉purchasinglist(排除采购意向数据)
  1124. delete(*bidData, "purchasinglist")
  1125. // 删除多包字段 20230518
  1126. delete(*bidData, "package")
  1127. }
  1128. if bidData != nil && len(*bidData) > 0 { //bidding表数据存在
  1129. //2.查extract
  1130. extData, _ := util.MgoE.FindById(util.ExtColl1, id, map[string]interface{}{"attach_text": 0})
  1131. if extData == nil || len(*extData) == 0 {
  1132. extData, _ = util.MgoE.FindById(util.ExtColl2, id, map[string]interface{}{"attach_text": 0, "field_source": 0})
  1133. }
  1134. //抽取表字段合并到bidding
  1135. if extData != nil && len(*extData) > 0 {
  1136. for k, v := range *extData {
  1137. if k == "publishtime" {
  1138. continue
  1139. }
  1140. (*bidData)[k] = v
  1141. }
  1142. }
  1143. //3.删除item
  1144. //删除item
  1145. delete((*bidData), "item")
  1146. //合并导入表中客户所需的字段
  1147. if len(tmp) > 0 {
  1148. for k, v := range tmp {
  1149. (*bidData)[k] = v
  1150. }
  1151. }
  1152. //补充id
  1153. //(*bidData)["id"] = id
  1154. //if stype == "syncoll" { //同步数据时删除原始数据
  1155. // if util.MgoM.Delete(coll, `{"id":"`+id+`"}`) == 0 {
  1156. // lock.Lock()
  1157. // *msg += "同步未删除成功数据id:" + id + ";\n"
  1158. // *success = false
  1159. // lock.Unlock()
  1160. // }
  1161. //}
  1162. // 处理 package winner_all
  1163. if p, o1 := (*bidData)["package"].(map[string]interface{}); o1 {
  1164. for _, v := range p {
  1165. v1 := v.(map[string]interface{})
  1166. t := make(map[string]interface{})
  1167. if v1["winner"] != nil {
  1168. t["winner"] = v1["winner"]
  1169. }
  1170. if v1["bidamount"] != nil {
  1171. t["bidamount"] = qu.Float64All(v1["bidamount"])
  1172. }
  1173. if len(t) > 0 {
  1174. v1["winner_all"] = append([]map[string]interface{}{}, t)
  1175. }
  1176. }
  1177. }
  1178. // 补充filetext
  1179. (*bidData)["filetext"] = util.GetFileText(*bidData)
  1180. // 6.项目合并信息
  1181. project, _ := util.MgoE.Find(util.ProjectColl, bson.M{"ids": id}, nil, nil, true, -1, -1)
  1182. if project != nil && len((*project)[0]) > 0 {
  1183. qu.Debug(*project)
  1184. ids := qu.ObjArrToStringArr((*project)[0]["ids"].([]interface{}))
  1185. if len(ids) > 0 {
  1186. var infolist []map[string]interface{}
  1187. for _, v := range ids {
  1188. if v == id { // 当前公告
  1189. continue
  1190. }
  1191. if v < util.BIDDINGSTARTID {
  1192. tmpBidColl = util.BidColl2 //bidding_back
  1193. }
  1194. bid, b := util.MgoB.FindById(tmpBidColl, v, nil)
  1195. if b && len(*bid) > 0 {
  1196. tmp1 := make(map[string]interface{})
  1197. tmp1["id"] = v
  1198. tmp1["title"] = (*bid)["title"]
  1199. tmp1["href"] = (*bid)["href"]
  1200. tmp1["toptype"] = (*bid)["toptype"]
  1201. tmp1["subtype"] = (*bid)["subtype"]
  1202. tmp1["publishtime"] = (*bid)["publishtime"]
  1203. tmp1["detail"] = (*bid)["detail"]
  1204. tmp1["filetext"] = util.GetFileText(*bid)
  1205. infolist = append(infolist, tmp1)
  1206. }
  1207. }
  1208. (*bidData)["info"] = infolist
  1209. }
  1210. } else {
  1211. qu.Debug("Projectset Find Error", id)
  1212. }
  1213. baseInfoMap["id"] = id
  1214. _id := (*bidData)["_id"]
  1215. delete(*bidData, "_id")
  1216. //保存数据
  1217. baseInfoMap["_id"] = _id
  1218. baseInfoMap["v_baseinfo"] = bidData
  1219. if len(tagInfoMap) > 0 {
  1220. baseInfoMap["v_taginfo"] = tagInfoMap
  1221. }
  1222. baseInfoMap["i_createtime"] = time.Now().Unix()
  1223. baseInfoMap["appid"] = []string{qu.ObjToString((*bidData)["appid"])}
  1224. baseInfoMap["b_isgivegroup"] = false //是否分配给用户组
  1225. baseInfoMap["b_istag"] = false //是否已标注
  1226. //baseInfoMap["b_cleartag"] = false //是否清理标注信息
  1227. baseInfoMap["b_isgiveuser"] = false //是否分配给用户
  1228. baseInfoMap["b_check"] = false // 质检标记
  1229. baseInfoMap["b_isEff"] = false // 标的物有效性
  1230. if util.Mgo.SaveByOriID(util.DATACOLLNAME, baseInfoMap) {
  1231. atomic.AddInt64(successNum, 1) //保存成功计数
  1232. } else {
  1233. lock.Lock()
  1234. //*success = false
  1235. if importType == "excel" {
  1236. msgArr = append(msgArr, "第"+fmt.Sprint(index+2)+"行未导入id:"+id)
  1237. //*msg += "第" + fmt.Sprint(num+2) + "行未保存成功数据_id:" + id + ";\n"
  1238. } else {
  1239. msgArr = append(msgArr, "未导入id:"+id)
  1240. //*msg += "未保存成功数据_id:" + id + ";\n"
  1241. }
  1242. lock.Unlock()
  1243. }
  1244. } else {
  1245. lock.Lock()
  1246. *success = false
  1247. qu.Debug(id)
  1248. if importType == "excel" {
  1249. msgArr = append(msgArr, "第"+fmt.Sprint(index+2)+"行,未查询到id:"+id)
  1250. //*msg += "第" + fmt.Sprint(num+2) + "行未查询到数据:" + id + ";\n"
  1251. } else {
  1252. msgArr = append(msgArr, "未查询id:"+id)
  1253. //*msg += "未查询到数据_id:" + id + ";\n"
  1254. }
  1255. lock.Unlock()
  1256. }
  1257. }
  1258. }(i, data)
  1259. }
  1260. wg.Wait()
  1261. sort.Strings(msgArr)
  1262. *msg = strings.Join(msgArr, ";<br>")
  1263. }
  1264. func (f *Front) ProjectCheckSuc() {
  1265. defer qu.Catch()
  1266. if f.Method() == "POST" {
  1267. appid := f.GetString("appid")
  1268. query := map[string]interface{}{
  1269. "appid": appid,
  1270. "b_istagging": false,
  1271. }
  1272. b := util.Mgo.Update(util.DATACOLLNAME, query, map[string]interface{}{"$set": map[string]interface{}{"b_istag": true}}, false, true)
  1273. f.ServeJson(map[string]interface{}{"success": b, "msg": "更新数据失败"})
  1274. }
  1275. }
  1276. func (f *Front) ProjectPassSuc() {
  1277. defer qu.Catch()
  1278. if f.Method() == "POST" {
  1279. appid := f.GetString("appid")
  1280. query := map[string]interface{}{
  1281. "appid": appid,
  1282. "b_istag": false,
  1283. }
  1284. b := util.Mgo.Update(util.DATACOLLNAME, query, map[string]interface{}{"$set": map[string]interface{}{"b_istag": true, "i_ckdata": 2}}, false, true)
  1285. f.ServeJson(map[string]interface{}{"success": b, "msg": "更新数据失败"})
  1286. }
  1287. }
  1288. func (f *Front) ProjectTagNum() {
  1289. defer qu.Catch()
  1290. if f.Method() == "POST" {
  1291. appid := f.GetString("appid")
  1292. count := util.Mgo.Count(util.DATACOLLNAME, map[string]interface{}{"i_ckdata": 2, "appid": appid})
  1293. if count > 0 {
  1294. f.ServeJson(map[string]interface{}{"success": true})
  1295. } else {
  1296. f.ServeJson(map[string]interface{}{"success": false, "msg": "暂时没有可质检的数据"})
  1297. }
  1298. }
  1299. }
  1300. func (f *Front) ProjectField() {
  1301. defer qu.Catch()
  1302. if f.Method() == "POST" {
  1303. pid := f.GetString("pid")
  1304. d1 := f.GetString("fields") //配置字段
  1305. var bObj []map[string]interface{}
  1306. err := json.Unmarshal([]byte(d1), &bObj)
  1307. if err != nil {
  1308. qu.Debug("Json Unmarshal Error")
  1309. f.ServeJson(map[string]interface{}{"success": false, "msg": "解析数据失败"})
  1310. return
  1311. }
  1312. b := util.Mgo.UpdateById(util.PROJECTCOLLNAME, pid, bson.M{"$set": bson.M{"v_fields": bObj}})
  1313. if b {
  1314. f.ServeJson(map[string]interface{}{"success": b, "msg": "保存数据成功"})
  1315. } else {
  1316. f.ServeJson(map[string]interface{}{"success": b, "msg": "字段保存失败"})
  1317. }
  1318. } else {
  1319. pid := f.GetString("id")
  1320. project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, pid, map[string]interface{}{"v_fields": 1})
  1321. if (*project)["v_fields"] != nil {
  1322. fields := util.Copy(util.FieldsArr).([]map[string]interface{})
  1323. var a1 []string // 标注基本字段
  1324. a2 := make(map[string]interface{}) // 多包、标的物、采购意向、中标候选
  1325. for _, m := range qu.ObjArrToMapArr((*project)["v_fields"].([]interface{})) {
  1326. if m["child"] != nil {
  1327. if qu.ObjToString(m["key"]) == "extend" {
  1328. m["enable"] = true
  1329. f.T["diy_fields"] = m["child"]
  1330. } else {
  1331. var a []string
  1332. for _, m2 := range qu.ObjArrToMapArr(m["child"].([]interface{})) {
  1333. a = append(a, qu.ObjToString(m2["key"]))
  1334. }
  1335. a2[qu.ObjToString(m["key"])] = a
  1336. }
  1337. } else {
  1338. a1 = append(a1, qu.ObjToString(m["key"]))
  1339. }
  1340. }
  1341. for _, m := range fields {
  1342. if qu.ObjToString(m["descript"]) == "基本字段" {
  1343. if len(a1) > 0 {
  1344. m["enable"] = true
  1345. s := strings.Join(a1, ",")
  1346. for _, m2 := range m["child"].([]map[string]interface{}) {
  1347. if strings.Contains(s, qu.ObjToString(m2["key"])) {
  1348. m2["enable"] = true
  1349. }
  1350. }
  1351. }
  1352. } else {
  1353. if a3 := a2[qu.ObjToString(m["key"])]; a3 != nil {
  1354. m["enable"] = true
  1355. for _, m2 := range m["child"].([]map[string]interface{}) {
  1356. s := strings.Join(a3.([]string), ",")
  1357. if strings.Contains(s, qu.ObjToString(m2["key"])) {
  1358. m2["enable"] = true
  1359. }
  1360. }
  1361. } else {
  1362. continue
  1363. }
  1364. }
  1365. }
  1366. f.T["fields"] = fields
  1367. } else {
  1368. f.T["fields"] = util.FieldsArr
  1369. }
  1370. f.T["pid"] = pid
  1371. _ = f.Render("project/project_field.html", &f.T)
  1372. }
  1373. }
  1374. func (f *Front) ProjectData() {
  1375. defer qu.Catch() //项目id
  1376. appid := f.GetString("appid")
  1377. if f.Method() == "POST" {
  1378. start, _ := f.GetInteger("start")
  1379. limit, _ := f.GetInteger("length")
  1380. draw, _ := f.GetInteger("draw")
  1381. searchStr := f.GetString("search[value]")
  1382. searchStr = strings.TrimSpace(searchStr)
  1383. query := map[string]interface{}{}
  1384. query["appid"] = appid
  1385. if searchStr != "" {
  1386. query["$or"] = []interface{}{
  1387. map[string]interface{}{"v_baseinfo.projectname": map[string]interface{}{"$regex": searchStr}},
  1388. map[string]interface{}{"v_baseinfo.title": map[string]interface{}{"$regex": searchStr}},
  1389. }
  1390. }
  1391. list, _ := util.Mgo.Find(util.DATACOLLNAME, query, bson.M{"_id": 1}, nil, false, start, limit)
  1392. count := util.Mgo.Count(util.DATACOLLNAME, query)
  1393. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  1394. } else {
  1395. f.T["appid"] = appid
  1396. _ = f.Render("project/project_data.html", &f.T)
  1397. }
  1398. }