project.go 47 KB

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