project.go 24 KB

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