project.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. package front
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/tealeg/xlsx"
  6. "io/ioutil"
  7. "mime/multipart"
  8. qu "qfw/util"
  9. "sort"
  10. "strings"
  11. "sync"
  12. "sync/atomic"
  13. "time"
  14. "util"
  15. )
  16. // ProjectList 项目列表
  17. func (f *Front) ProjectList() {
  18. defer qu.Catch()
  19. if f.Method() == "POST" {
  20. start, _ := f.GetInteger("start")
  21. limit, _ := f.GetInteger("length")
  22. draw, _ := f.GetInteger("draw")
  23. status := f.GetString("status")
  24. searchStr := f.GetString("search[value]")
  25. search := strings.TrimSpace(searchStr)
  26. //data := util.GetPostForm(f.Request)
  27. query := map[string]interface{}{}
  28. if status != "-1" {
  29. query["s_status"] = status
  30. }
  31. if search != "" {
  32. query["$or"] = []interface{}{
  33. map[string]interface{}{"s_name": map[string]interface{}{"$regex": search}},
  34. map[string]interface{}{"s_entname": map[string]interface{}{"$regex": search}},
  35. map[string]interface{}{"s_rule": map[string]interface{}{"$regex": search}},
  36. map[string]interface{}{"s_departname": map[string]interface{}{"$regex": search}},
  37. }
  38. }
  39. list, _ := util.Mgo.Find(util.PROJECTCOLLNAME, query, nil, nil, false, start, limit)
  40. count := util.Mgo.Count(util.PROJECTCOLLNAME, query)
  41. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  42. } else {
  43. query := map[string]interface{}{"s_type": "tag"}
  44. info, _ := util.Mgo.Find("v_field", query, nil, map[string]interface{}{"s_name": 1, "s_code": 1}, false, -1, -1)
  45. f.T["fields"] = *info
  46. _ = f.Render("project/project_list.html", &f.T)
  47. }
  48. }
  49. // ProjectSave 项目保存
  50. func (f *Front) ProjectSave() {
  51. defer qu.Catch()
  52. success := false //导入数据是否成功
  53. msg := "" //异常信息
  54. successNum := int64(0) //导入成功条数
  55. importDataNum := 0 //查询数量
  56. var s_rulename []string //规则
  57. user := f.GetSession("user").(map[string]interface{})
  58. username := qu.ObjToString(user["s_name"]) //当前登录用户
  59. stype := f.GetString("s_type") //新建项目类型:数据库导入、excel导入
  60. s_name := f.GetString("s_name") //项目名称
  61. s_sourceinfo := f.GetString("s_sourceinfo") //数据表
  62. s_sourceinfo = "s_sourceinfo_" + s_sourceinfo
  63. s_departname, s_entname := "", ""
  64. query := map[string]interface{}{
  65. "s_name": s_name,
  66. }
  67. set := map[string]interface{}{}
  68. //导入数据
  69. if stype == "excel" { //excel导入
  70. s_entname = f.GetString("s_entname") //公司名称
  71. s_departname = f.GetString("s_departname") //部门名称
  72. rulename := f.GetString("s_rulename") //规则名称
  73. s_rulename = strings.Split(rulename, ",")
  74. mf, _, err := f.GetFile("xlsx")
  75. if err == nil {
  76. importDataNum = ImportDataByExcel(s_sourceinfo, mf, &success, &msg, &successNum)
  77. }
  78. //保存项目信息
  79. set = map[string]interface{}{
  80. "s_name": s_name, //项目名称
  81. "s_entname": s_entname, //公司名称
  82. "s_departname": s_departname, //部门名称
  83. "s_rulename": strings.Join(s_rulename, ","), //规则名称
  84. "i_importnum": importDataNum, //导入数量
  85. "s_sourceinfo": s_sourceinfo, //源数据表
  86. "s_createname": username, //创建人
  87. "s_status": "未开始", //项目状态
  88. "i_createtime": time.Now().Unix(), //创建时间
  89. "s_importtype": "excel", //导入类型
  90. }
  91. } else if stype == "coll" { //数据库导入
  92. historyid := f.GetString("s_historyid")
  93. s_departname, s_entname, s_rulename, importDataNum = ImportDataByColl(s_sourceinfo, historyid, &success, &msg, &successNum)
  94. qu.Debug(s_departname, s_entname, s_rulename)
  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": "coll", //导入类型
  107. "s_historyid": historyid, //源数据集标识
  108. }
  109. } else if stype == "edit" { //编辑保存
  110. //s_entname = f.GetString("s_entname") //公司名称
  111. s_departname = f.GetString("s_departname") //部门名称
  112. rulename := f.GetString("s_rulename") //规则名称
  113. s_rulename = strings.Split(rulename, ",")
  114. s_personname := f.GetString("s_personname")
  115. fields := f.GetString("v_fields")
  116. v_fields := map[string]interface{}{}
  117. if err := json.Unmarshal([]byte(fields), &v_fields); err != nil {
  118. qu.Debug("V_Filelds Unmarshal Failed:", err)
  119. f.ServeJson(map[string]interface{}{"success": false})
  120. return
  121. }
  122. set = map[string]interface{}{
  123. //"s_name": s_name, //项目名称
  124. //"s_entname": s_entname, //公司名称
  125. "s_departname": s_departname, //部门名称
  126. "s_rulename": strings.Join(s_rulename, ","), //规则名称
  127. "v_fields": v_fields, //标注字段
  128. "i_updatetime": username, //更新人
  129. "i_createtime": time.Now().Unix(), //更新时间
  130. "s_personname": s_personname, //售后人员
  131. //"i_starttime":,//开始时间
  132. //"i_completetime",//结束时间
  133. }
  134. }
  135. b := util.Mgo.Update(util.PROJECTCOLLNAME, query, map[string]interface{}{"$set": set}, true, false)
  136. qu.Debug("Create Project:", b)
  137. //返回信息
  138. if stype == "edit" {
  139. f.ServeJson(map[string]interface{}{"success": b})
  140. } else {
  141. f.ServeJson(map[string]interface{}{"success": success, "msg": msg, "importnum": importDataNum, "successnum": successNum, "failnum": int64(importDataNum) - successNum})
  142. }
  143. }
  144. // ProjectClear 项目清洗
  145. func (f *Front) ProjectClear() {
  146. defer qu.Catch()
  147. projectid := f.GetString("s_projectid") //项目id
  148. project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"s_status": 1})
  149. if project != nil && len(*project) > 0 {
  150. if status := qu.ObjToString((*project)["s_status"]); status == "未开始" {
  151. //TODO:调用数据质量评估接口
  152. //点击清洗更新项目状态为进行中
  153. b := util.Mgo.UpdateById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{"$set": map[string]interface{}{"s_status": "进行中", "i_starttime": time.Now().Unix()}})
  154. qu.Debug("Update Porject:"+projectid+" Status Success:", b)
  155. }
  156. } else {
  157. qu.Debug("Search Porject Failed:", projectid)
  158. f.ServeJson("查询项目信息失败")
  159. return
  160. }
  161. sourceinfo := f.GetString("s_sourceinfo") //数据源表
  162. noTagAllDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": false}) //达标数据总量
  163. noTagGiveDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": false, "b_isgive": true}) //达标数据已分发量
  164. noTagNoGiveDataNum := noTagAllDataNum - noTagGiveDataNum //达标待分发量
  165. tagAllDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": true}) //未达标数据总量
  166. tagGiveDataNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istagging": true, "b_isgive": true}) //未达标数据已分发量
  167. tagNoGiveDataNum := tagAllDataNum - tagGiveDataNum //未达标待分发量
  168. allGiveDataNum := noTagGiveDataNum + tagGiveDataNum //总分发量
  169. allNoGiveDataNum := noTagNoGiveDataNum + tagNoGiveDataNum //总待分发量
  170. allDataNum := allGiveDataNum + allNoGiveDataNum
  171. f.T["allDataNum"] = allDataNum
  172. f.T["allGiveDataNum"] = allGiveDataNum
  173. f.T["allNoGiveDataNum"] = allNoGiveDataNum
  174. f.T["noTagAllDataNum"] = noTagAllDataNum
  175. f.T["noTagGiveDataNum"] = noTagGiveDataNum
  176. f.T["noTagNoGiveDataNum"] = noTagNoGiveDataNum
  177. f.T["tagAllDataNum"] = tagAllDataNum
  178. f.T["tagGiveDataNum"] = tagGiveDataNum
  179. f.T["tagNoGiveDataNum"] = tagNoGiveDataNum
  180. f.T["s_projectid"] = projectid
  181. _ = f.Render("user/user_group.html", &f.T)
  182. }
  183. // ProjectTaskList 用户组任务分发列表
  184. func (f *Front) ProjectTaskList() {
  185. defer qu.Catch()
  186. projectid := f.GetString("s_projectid") //项目id
  187. status := f.GetString("s_status") //任务状态
  188. searchStr := f.GetString("search[value]")
  189. search := strings.TrimSpace(searchStr)
  190. start, _ := f.GetInteger("start")
  191. limit, _ := f.GetInteger("length")
  192. draw, _ := f.GetInteger("draw")
  193. query := map[string]interface{}{
  194. "s_projectid": projectid,
  195. }
  196. if status != "-1" {
  197. query["s_status"] = status
  198. }
  199. if search != "" {
  200. query["$or"] = []interface{}{
  201. map[string]interface{}{"s_groupname": map[string]interface{}{"$regex": search}},
  202. }
  203. }
  204. list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, nil, nil, false, start, limit)
  205. count := util.Mgo.Count(util.TASKCOLLNAME, query)
  206. f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
  207. }
  208. // ProjectTaskSave 用户组任务分发
  209. func (f *Front) ProjectTaskSave() {
  210. defer qu.Catch()
  211. var groupArr []map[string]interface{}
  212. var taskArr []map[string]interface{}
  213. var groupIdArr []string
  214. success := false
  215. msg := ""
  216. user := f.GetSession("user").(map[string]interface{})
  217. username := qu.ObjToString(user["s_name"]) //当前登录用户
  218. projectid := f.GetString("s_projectid") //项目标识
  219. projectname := f.GetString("s_projectname") //项目名称
  220. sourceinfo := f.GetString("s_sourceinfo") //源数据表
  221. sourcetaskinfo := "s_sourcetaskinfo_" + strings.ReplaceAll(sourceinfo, "s_sourceinfo_", "") //任务日志表
  222. group := f.GetString("s_group")
  223. if err := json.Unmarshal([]byte(group), &groupArr); err != nil {
  224. qu.Debug("V_Filelds Unmarshal Failed:", err)
  225. } else {
  226. for _, groupInfo := range groupArr {
  227. groupId := qu.ObjToString(groupInfo["s_groupid"])
  228. groupIdArr = append(groupIdArr, groupId)
  229. task := map[string]interface{}{
  230. "s_projectid": projectid, //项目标识
  231. "s_projectname": projectname, //项目名称
  232. "s_status": "未开始", //任务状态
  233. "s_personid": qu.ObjToString(groupInfo["s_personid"]), //任务负责人标识
  234. "s_personname": qu.ObjToString(groupInfo["s_personname"]), //任务负责人
  235. "s_groupname": qu.ObjToString(groupInfo["s_groupname"]), //用户组名称
  236. "s_groupid": groupId, //用户组标识
  237. "i_givenum": qu.ObjToString(groupInfo["i_givenum"]), //分发数据量
  238. "s_createname": username, //创建人
  239. "i_createtime": time.Now().Unix(), //创建时间
  240. "s_progress": "0%", //完成进度
  241. "s_sourceinfo": sourceinfo, //源数据表
  242. "s_sourcetaskinfo": sourcetaskinfo, //任务日志表
  243. }
  244. taskArr = append(taskArr, task)
  245. }
  246. }
  247. //分发数据后更新项目中用户组标识信息
  248. success = util.Mgo.UpdateById(util.PROJECTCOLLNAME, projectid, map[string]interface{}{
  249. "$push": map[string]interface{}{
  250. "v_groupids": map[string]interface{}{
  251. "$each": groupIdArr,
  252. },
  253. },
  254. })
  255. if !success {
  256. msg = "更新项目:" + projectname + "用户组标识失败"
  257. } else { //分发任务
  258. success = util.Mgo.SaveBulk(util.TASKCOLLNAME, taskArr...)
  259. msg = "任务分发成功"
  260. }
  261. qu.Debug("Msg:", msg)
  262. f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
  263. }
  264. // ProjectGetEntnameList 模糊查询公司名称
  265. func (f *Front) ProjectGetEntnameList() {
  266. defer qu.Catch()
  267. var entnameList []string
  268. entname := f.GetString("entname")
  269. query := map[string]interface{}{
  270. "username": map[string]interface{}{
  271. "$regex": entname,
  272. },
  273. }
  274. list, _ := util.MgoJy.Find(util.JyUser, query, nil, map[string]interface{}{"username": 1}, false, -1, -1)
  275. for _, l := range *list {
  276. entnameList = append(entnameList, qu.ObjToString(l["username"]))
  277. }
  278. f.ServeJson(map[string]interface{}{"entname": entnameList})
  279. }
  280. //ImportDataByExcel 通过excel获取数据源
  281. func ImportDataByExcel(s_sourceinfo string, mf multipart.File, success *bool, msg *string, successNum *int64) (importDataNum int) {
  282. defer qu.Catch()
  283. binary, _ := ioutil.ReadAll(mf)
  284. xls, _ := xlsx.OpenBinary(binary)
  285. sheet := xls.Sheets[0]
  286. rows := sheet.Rows
  287. idcolnum := -1
  288. cellFieldName := map[int]string{} //记录客户需求字段所在的列
  289. idInfoMap := map[string]map[string]interface{}{} //记录数据id及需要保存的字段信息
  290. for rn, row := range rows {
  291. if rn == 0 {
  292. for index, cell := range row.Cells {
  293. title := cell.Value
  294. if fieldName := util.CustomerFieldMap_HE[title]; fieldName != "" { //客户需求字段
  295. cellFieldName[index] = fieldName
  296. }
  297. if title == "唯一标识" || title == "信息标识" { //id所在列
  298. idcolnum = index
  299. }
  300. }
  301. if idcolnum == -1 {
  302. break
  303. }
  304. continue
  305. }
  306. if len(row.Cells) < len(rows[0].Cells) {
  307. break
  308. }
  309. tmp := map[string]interface{}{}
  310. for index, f := range cellFieldName {
  311. if val := row.Cells[index].Value; val != "" {
  312. if f == "capital" { //注册资金(万元)
  313. cf, _ := row.Cells[index].Float()
  314. tmp[f] = cf
  315. } else if f == "createtime" { //创建时间
  316. ci, _ := row.Cells[index].Int64()
  317. tmp[f] = ci
  318. } else {
  319. tmp[f] = val
  320. }
  321. }
  322. }
  323. id := row.Cells[idcolnum].String() //加密的id
  324. if id == "" {
  325. break
  326. }
  327. id = util.SE.DecodeString(id) //解密后id
  328. idInfoMap[id] = tmp
  329. }
  330. importDataNum = len(idInfoMap)
  331. qu.Debug("Load Excel Count:", importDataNum)
  332. if importDataNum > 0 {
  333. GetDataById(idInfoMap, "excel", s_sourceinfo, success, msg, successNum)
  334. } else {
  335. *success = false
  336. *msg = "查询数据失败"
  337. }
  338. idInfoMap = map[string]map[string]interface{}{}
  339. return
  340. }
  341. //ImportDataByColl 通过表获取数据源
  342. func ImportDataByColl(s_sourceinfo, historyid string, success *bool, msg *string, successNum *int64) (departname, entname string, rulename []string, importDataNum int) {
  343. defer qu.Catch()
  344. rulenameMap := map[string]bool{}
  345. sess := util.MgoJy.GetMgoConn()
  346. defer util.MgoJy.DestoryMongoConn(sess)
  347. ch := make(chan bool, 3)
  348. wg := &sync.WaitGroup{}
  349. lock := &sync.Mutex{}
  350. idInfoMap := map[string]map[string]interface{}{} //记录数据id及需要保存的字段信息
  351. query := map[string]interface{}{
  352. "historyId": historyid,
  353. }
  354. it := sess.DB(util.MgoJy.DbName).C(util.JyHistory).Find(&query).Iter()
  355. n := 0
  356. for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
  357. ch <- true
  358. wg.Add(1)
  359. go func(tmp map[string]interface{}) {
  360. defer func() {
  361. <-ch
  362. wg.Done()
  363. }()
  364. id := qu.ObjToString(tmp["id"]) //bidding id
  365. appid := qu.ObjToString(tmp["appid"]) //根据appid查user表获取公司名称
  366. departname = qu.ObjToString(tmp["departname"]) //部门名称。所有数据都应部门名称,若不一致,随机取
  367. needField := map[string]interface{}{}
  368. for f, _ := range util.CustomerFieldMap_EH {
  369. if tmp[f] != nil {
  370. needField[f] = tmp[f]
  371. }
  372. }
  373. if entname == "" { //获取一次公司名称即可
  374. user, _ := util.MgoJy.FindOne(util.JyUser, map[string]interface{}{"appid": appid})
  375. entname = qu.ObjToString((*user)["username"]) //公司名称
  376. }
  377. rname := qu.ObjToString(tmp["rulename"])
  378. lock.Lock()
  379. rulenameMap[rname] = true
  380. //rulename = append(rulename, qu.ObjToString(tmp["rulename"])) //规则名称
  381. idInfoMap[id] = needField
  382. lock.Unlock()
  383. }(tmp)
  384. if n%1000 == 0 {
  385. qu.Debug("current:", n)
  386. }
  387. tmp = map[string]interface{}{}
  388. }
  389. wg.Wait()
  390. for r, _ := range rulenameMap {
  391. rulename = append(rulename, r)
  392. }
  393. importDataNum = len(idInfoMap) //查询数据总数
  394. if importDataNum > 0 {
  395. GetDataById(idInfoMap, "coll", s_sourceinfo, success, msg, successNum)
  396. } else {
  397. *msg = "查询数据失败"
  398. }
  399. idInfoMap = map[string]map[string]interface{}{}
  400. return
  401. }
  402. //GetDataById 通过id集从bidding、extract、project获取数据所有信息
  403. func GetDataById(idsInfo map[string]map[string]interface{}, importType, s_sourceinfo string, success *bool, msg *string, successNum *int64) {
  404. *success = true
  405. var msgArr []string
  406. wg := &sync.WaitGroup{}
  407. lock := &sync.Mutex{}
  408. ch := make(chan bool, 10)
  409. num := int64(0) //计数
  410. for id, info := range idsInfo {
  411. wg.Add(1)
  412. ch <- true
  413. go func(id string, tmp map[string]interface{}) {
  414. defer func() {
  415. wg.Done()
  416. <-ch
  417. }()
  418. /*
  419. 1.查bidding
  420. 2.查extract
  421. 3.extract合并到bidding(删除item字段与客户需要的item不是一个含义)
  422. 4.对比marked表,替换已标注过的字段值,补充标记
  423. 5.合并客户所需字段信息,补充id字段
  424. //6.若为同步时,删除原有id对应的信息,新增该id对应的_id信息
  425. 6.mgo查询项目信息
  426. */
  427. tagInfoMap := map[string]interface{}{} //记录数据已标注过的信息
  428. baseInfoMap := map[string]interface{}{} //记录其他信息
  429. //1.查bidding
  430. tmpBidColl := util.BidColl1 //bidding
  431. //查询bidding
  432. if id < util.BIDDINGSTARTID {
  433. tmpBidColl = util.BidColl2 //bidding_back
  434. }
  435. bidData, _ := util.MgoB.FindById(tmpBidColl, id, nil)
  436. if bidData != nil && len(*bidData) > 0 { //bidding表数据存在
  437. //2.查extract
  438. extData, _ := util.MgoE.FindById(util.ExtColl1, id, nil)
  439. if extData == nil || len(*extData) == 0 {
  440. extData, _ = util.MgoE.FindById(util.ExtColl2, id, nil)
  441. }
  442. //抽取表字段合并到bidding
  443. if extData != nil && len(*extData) > 0 {
  444. for k, v := range *extData {
  445. (*bidData)[k] = v
  446. }
  447. }
  448. //3.删除item
  449. //删除item
  450. delete((*bidData), "item")
  451. //4.对比marked表,对比marked表是否已标注该数据
  452. markData, _ := util.Mgo.FindById(util.AllToColl, id, nil)
  453. if markData != nil && len(*markData) > 0 {
  454. UpdateMarkColl(bidData, markData, &tagInfoMap, &baseInfoMap) //比对更新数据
  455. } else {
  456. baseInfoMap["i_ckdata"] = 0 //设置ck_data默认值0
  457. //多包、中标候选人、标的信息是否抽取
  458. //if packageMap, ok := (*bidData)["package"].(map[string]interface{}); ok && len(packageMap) > 0 {
  459. // baseInfoMap["b_pkgisext"] = true
  460. //} else {
  461. // baseInfoMap["b_pkgisext"] = false
  462. //}
  463. //if winorderArr, ok := (*bidData)["winnerorder"].([]interface{}); ok && len(winorderArr) > 0 {
  464. // baseInfoMap["b_wodrisext"] = true
  465. //} else {
  466. // baseInfoMap["b_wodrisext"] = false
  467. //}
  468. //if purchArr, ok := (*bidData)["purchasinglist"].([]interface{}); ok && len(purchArr) > 0 {
  469. // baseInfoMap["b_pclisext"] = true
  470. //} else {
  471. // baseInfoMap["b_pclisext"] = false
  472. //}
  473. }
  474. //合并导入表中客户所需的字段
  475. if len(tmp) > 0 {
  476. for k, v := range tmp {
  477. (*bidData)[k] = v
  478. }
  479. }
  480. //补充id
  481. //(*bidData)["id"] = id
  482. //if stype == "syncoll" { //同步数据时删除原始数据
  483. // if util.MgoM.Delete(coll, `{"id":"`+id+`"}`) == 0 {
  484. // lock.Lock()
  485. // *msg += "同步未删除成功数据id:" + id + ";\n"
  486. // *success = false
  487. // lock.Unlock()
  488. // }
  489. //}
  490. // 处理 package winner_all
  491. if p, o1 := (*bidData)["package"].(map[string]interface{}); o1 {
  492. for _, v := range p {
  493. v1 := v.(map[string]interface{})
  494. t := make(map[string]interface{})
  495. if v1["winner"] != nil {
  496. t["winner"] = v1["winner"]
  497. }
  498. if v1["bidamount"] != nil {
  499. t["bidamount"] = qu.Float64All(v1["bidamount"])
  500. }
  501. if len(t) > 0 {
  502. v1["winner_all"] = append([]map[string]interface{}{}, t)
  503. }
  504. }
  505. }
  506. // 补充filetext
  507. (*bidData)["filetext"] = util.GetFileText(*bidData)
  508. // 6.es查询项目合并信息
  509. //esQ := `{"query":{"bool":{"must":[{"term":{"ids":"` + id + `"}}]}}}`
  510. //info := util.Es.Get("projectset", "projectset", esQ)
  511. projectId := qu.ObjToString((*bidData)["projectId"])
  512. project, _ := util.MgoE.FindById(util.ProjectColl, projectId, map[string]interface{}{"ids": 1})
  513. if project != nil && len(*project) > 0 {
  514. ids := qu.ObjArrToStringArr((*project)["ids"].([]interface{}))
  515. if len(ids) > 0 {
  516. var infolist []map[string]interface{}
  517. for _, v := range ids {
  518. if v == id { // 当前公告
  519. continue
  520. }
  521. if v < util.BIDDINGSTARTID {
  522. tmpBidColl = util.BidColl2 //bidding_back
  523. }
  524. bid, b := util.MgoB.FindById(tmpBidColl, v, nil)
  525. if b && len(*bid) > 0 {
  526. tmp := make(map[string]interface{})
  527. tmp["id"] = v
  528. tmp["title"] = (*bid)["title"]
  529. tmp["href"] = (*bid)["href"]
  530. tmp["toptype"] = (*bid)["toptype"]
  531. tmp["subtype"] = (*bid)["subtype"]
  532. tmp["publishtime"] = (*bid)["publishtime"]
  533. tmp["detail"] = (*bid)["detail"]
  534. tmp["filetext"] = util.GetFileText(*bid)
  535. infolist = append(infolist, tmp)
  536. }
  537. }
  538. (*bidData)["info"] = infolist
  539. }
  540. } else {
  541. qu.Debug("Projectset Find Error", projectId)
  542. }
  543. baseInfoMap["id"] = id
  544. _id := (*bidData)["_id"]
  545. delete(*bidData, "_id")
  546. //保存数据
  547. baseInfoMap["_id"] = _id
  548. baseInfoMap["v_datainfo"] = bidData
  549. if len(tagInfoMap) > 0 {
  550. baseInfoMap["v_taginfo"] = tagInfoMap
  551. }
  552. baseInfoMap["i_createtime"] = time.Now().Unix()
  553. baseInfoMap["b_isgive"] = false //是否分配
  554. baseInfoMap["b_istag"] = false //是否已标注
  555. if util.Mgo.SaveByOriID(s_sourceinfo, baseInfoMap) {
  556. atomic.AddInt64(successNum, 1) //保存成功计数
  557. } else {
  558. lock.Lock()
  559. *success = false
  560. if importType == "excel" {
  561. msgArr = append(msgArr, "第"+fmt.Sprint(num+2)+"行未导入id:"+id)
  562. //*msg += "第" + fmt.Sprint(num+2) + "行未保存成功数据_id:" + id + ";\n"
  563. } else {
  564. msgArr = append(msgArr, "未导入id:"+id)
  565. //*msg += "未保存成功数据_id:" + id + ";\n"
  566. }
  567. lock.Unlock()
  568. }
  569. } else {
  570. lock.Lock()
  571. *success = false
  572. if importType == "excel" {
  573. msgArr = append(msgArr, "第"+fmt.Sprint(num+2)+"行未查询id:"+id)
  574. //*msg += "第" + fmt.Sprint(num+2) + "行未查询到数据:" + id + ";\n"
  575. } else {
  576. msgArr = append(msgArr, "未查询id:"+id)
  577. //*msg += "未查询到数据_id:" + id + ";\n"
  578. }
  579. lock.Unlock()
  580. }
  581. }(id, info)
  582. }
  583. wg.Wait()
  584. sort.Strings(msgArr)
  585. *msg = strings.Join(msgArr, ";\n")
  586. }
  587. // UpdateMarkColl 更新数据
  588. func UpdateMarkColl(bidData, markData, tagInfoMap, baseInfoMap *map[string]interface{}) {
  589. defer qu.Catch()
  590. ckdata := qu.IntAll((*markData)["i_ckdata"])
  591. v_taginfo := (*markData)["v_taginfo"].(map[string]interface{}) //标注信息
  592. v_datainfo := (*markData)["v_datainfo"].(map[string]interface{}) //基本信息
  593. for fk, _ := range v_taginfo {
  594. if v_datainfo[fk] != nil {
  595. (*bidData)[fk] = v_datainfo[fk] //字段更新
  596. }
  597. }
  598. (*tagInfoMap) = v_taginfo //marked中已有的标注信息保存到新数据上
  599. if ckdata == 2 { //某些字段已标注
  600. (*baseInfoMap)["i_ckdata"] = 0 //marked表中该条数据如果为字段验证,临时表ck_data:0;若为数据验证ck_data:1
  601. } else if ckdata == 1 {
  602. (*baseInfoMap)["i_ckdata"] = 1
  603. }
  604. }