project.go 43 KB

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