project.go 42 KB

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