server.go 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262
  1. // front
  2. package front
  3. import (
  4. "context"
  5. "encoding/json"
  6. "io/ioutil"
  7. //"container/list"
  8. "fmt"
  9. qu "qfw/util"
  10. "qfw/util/redis"
  11. mgo "mongodb"
  12. "strings"
  13. "sync"
  14. "time"
  15. "util"
  16. "github.com/go-xweb/xweb"
  17. "go.mongodb.org/mongo-driver/bson"
  18. "github.com/tealeg/xlsx"
  19. es "gopkg.in/olivere/elastic.v7"
  20. )
  21. type Front struct {
  22. *xweb.Action
  23. // elist xweb.Mapper `xweb:"/elist"`
  24. login xweb.Mapper `xweb:"/"`
  25. saveUser xweb.Mapper `xweb:"/center/saveuser"`
  26. listInfo xweb.Mapper `xweb:"/center/list"`
  27. checkId xweb.Mapper `xweb:"/center/checkid"`
  28. detail xweb.Mapper `xweb:"/center/detail/(.*).html"`
  29. biaozhu xweb.Mapper `xweb:"/center/biaozhu"`
  30. importByExcel xweb.Mapper `xweb:"/center/importbyexcel"`
  31. importByEs xweb.Mapper `xweb:"/center/importbyes"`
  32. getEsCount xweb.Mapper `xweb:"/center/getescount"`
  33. finishCheck xweb.Mapper `xweb:"/center/finishcheck"`
  34. errCheck xweb.Mapper `xweb:"/center/errcheck"`
  35. syncMarked xweb.Mapper `xweb:"/center/syncmarked"`
  36. markedInit xweb.Mapper `xweb:"/center/markedinit"`
  37. review xweb.Mapper `xweb:"/center/review"` // 质检
  38. reviewList xweb.Mapper `xweb:"/center/reviewlist"` // 质检数据列表
  39. reviewDetail xweb.Mapper `xweb:"/center/reviewdetail/(.*).html"`
  40. reviewSave xweb.Mapper `xweb:"/center/reviewsave"`
  41. reviewStat xweb.Mapper `xweb:"/center/review/result"`
  42. reviewNext xweb.Mapper `xweb:"/center/review/next"`
  43. logout xweb.Mapper `xweb:"/front/logout"`
  44. }
  45. var preKey = "ck_"
  46. var preErr = "err_"
  47. var SE = qu.SimpleEncrypt{Key: "topJYBX2019"}
  48. var CheckLock = &sync.Mutex{}
  49. var LABELER, AUDITOR, ADMIN = 1, 2, 3 //标注人员,审核人员,管理员
  50. /*
  51. status
  52. -1:初始未验证
  53. 1:正确
  54. 2:新增
  55. 3:修改
  56. 4:删除
  57. */
  58. //列表
  59. func (i *Front) ListInfo() error {
  60. //loginuser := i.GetSession("loginuser").(string)
  61. spidercode := i.GetString("spidercode")
  62. coll := i.GetString("coll")
  63. field := i.GetString("field")
  64. stype := i.GetString("type")
  65. min := i.GetString("minval") //min max不用int类型接收,以免有默认值0
  66. max := i.GetString("maxval")
  67. hasno, _ := i.GetBool("hasno")
  68. notag, _ := i.GetBool("notag")
  69. pagenum, _ := i.GetInteger("pagenum")
  70. labeler := i.GetString("labeler")
  71. if pagenum == 0 { //页码
  72. pagenum = 1
  73. }
  74. qu.Debug("coll:", coll, "stype:", stype, "field:", field, "hasno:", hasno, "notag:", notag, "max:", max, "min:", min, "pagenum:", pagenum, "labeler:", labeler)
  75. query := map[string]interface{}{}
  76. if spidercode != "" { //爬虫代码
  77. query["spidercode"] = spidercode
  78. }
  79. if stype != "-1" && stype != "" { //类型
  80. if stype == util.SPECIALTYPE {
  81. query["subtype"] = map[string]interface{}{
  82. "$exists": false,
  83. }
  84. } else {
  85. subtype := strings.Split(stype, "-")[1]
  86. query["subtype"] = subtype
  87. }
  88. }
  89. fieldScreen := false
  90. if field != "-1" && field != "" { //字段
  91. fieldScreen = true
  92. queryfield := map[string]interface{}{
  93. "$exists": !hasno,
  94. }
  95. numMap := map[string]interface{}{}
  96. if field == "budget" || field == "bidamount" { //金额区间
  97. if min != "" {
  98. minint := qu.IntAll(min)
  99. numMap["$gte"] = minint
  100. }
  101. if max != "" {
  102. maxint := qu.IntAll(max)
  103. numMap["$lte"] = maxint
  104. }
  105. //if len(numMap) > 0 { //给定了区间,不再判断字段存在
  106. // queryfield = numMap
  107. //}
  108. }
  109. if len(numMap) > 0 {
  110. if !hasno {
  111. query[field] = numMap
  112. } else {
  113. query["$or"] = []map[string]interface{}{
  114. {field: queryfield},
  115. {field: numMap},
  116. }
  117. }
  118. } else {
  119. query[field] = queryfield
  120. }
  121. }
  122. if fieldScreen && notag {
  123. query[preKey+field] = map[string]interface{}{
  124. "$exists": false,
  125. }
  126. } else if !fieldScreen && notag {
  127. query["ck_data"] = 0
  128. }
  129. //标注人员
  130. if labeler != "" {
  131. query["modifyuser"] = labeler
  132. }
  133. qu.Debug("query:", coll, query)
  134. if coll == "" {
  135. coll = util.Config.Fromtable
  136. //coll = "markwork_wb_zcz"
  137. }
  138. i.SetSession("coll", coll) //session中存入查询表
  139. i.SetSession("query", query) //session中存入查询条件
  140. listData := getListInfo(coll, query, pagenum)
  141. i.T["list"] = listData
  142. i.T["type"] = stype
  143. i.T["field"] = field
  144. i.T["spidercode"] = spidercode
  145. i.T["coll"] = coll
  146. i.T["topsubtype"] = util.TopSubStypeArr
  147. i.T["allfield"] = util.AllFieldArr
  148. i.T["fromtable"] = util.Config.Fromtable
  149. i.T["dbname"] = util.Config.Dbname
  150. i.T["max"] = max
  151. i.T["min"] = min
  152. i.T["hasno"] = hasno
  153. i.T["notag"] = notag
  154. checkedNum, allNum := GetCheckedAndAllDataInfo(query, coll) //已标和总数信息
  155. if notag {
  156. checkedNum = 0
  157. }
  158. i.T["checkednum"] = checkedNum
  159. i.T["allnum"] = allNum
  160. i.T["pagenum"] = pagenum
  161. role := qu.IntAll(i.GetSession("role"))
  162. i.T["role"] = role
  163. i.T["labeler"] = labeler
  164. if role >= AUDITOR {
  165. i.T["labelers"] = GetLabeler(coll)
  166. }
  167. return i.Render("list.html", &i.T)
  168. }
  169. //判断id是否正在被标记
  170. func (i *Front) CheckId() {
  171. defer qu.Catch()
  172. CheckLock.Lock()
  173. defer CheckLock.Unlock()
  174. msg := ""
  175. id := i.GetString("id")
  176. coll := i.GetSession("coll").(string)
  177. if coll != "" {
  178. exists, err := redis.Exists("extcheck", coll+"_"+id)
  179. if err == nil {
  180. if exists {
  181. id, exists = GetNoCheckedId(id, coll)
  182. }
  183. } else {
  184. msg = "校验数据出错!"
  185. }
  186. i.ServeJson(map[string]interface{}{"msg": msg, "id": id, "exists": exists})
  187. return
  188. }
  189. i.ServeJson(map[string]interface{}{"msg": "数据校验表出错!"})
  190. }
  191. //标注
  192. func (i *Front) Biaozhu() error {
  193. b := false
  194. obj := []map[string]interface{}{}
  195. //ispackage := i.GetString("ispackage")
  196. key := i.GetString("key")
  197. _id := i.GetString("_id")
  198. stype, _ := i.GetInteger("stype")
  199. err := json.Unmarshal([]byte(key), &obj)
  200. if err != nil {
  201. i.ServeJson(b)
  202. return nil
  203. }
  204. //base := map[string]interface{}{}
  205. set := map[string]interface{}{} //更新、新增字段
  206. unset := map[string]interface{}{} //删除字段
  207. errset := map[string]interface{}{} //记录修改的字段信息
  208. isSaveMarked := false
  209. if len(obj) == 1 { //单独保存某个一级
  210. content, ok := obj[0]["content"].([]interface{})
  211. if !ok || len(content) == 0 {
  212. i.ServeJson(b)
  213. return nil
  214. }
  215. title := qu.ObjToString(obj[0]["title"])
  216. isext, _ := obj[0]["checkType"].(bool)
  217. istag, _ := obj[0]["checkAllTag"].(bool)
  218. status := qu.IntAll(obj[0]["status"])
  219. switch title {
  220. case "基本字段":
  221. BzJBZD(content, set, unset, errset)
  222. case "时间地点":
  223. BzSJDD(content, set, unset, errset)
  224. case "标的信息":
  225. BzBDXX(content, set, unset, errset, isext, istag, status)
  226. case "多包信息":
  227. BzDBXX(content, set, unset, errset, isext, status)
  228. case "中标候选人信息":
  229. BzZBHXRXX(content, set, unset, errset, isext, status)
  230. case "其余信息":
  231. BzQYXX(content, set, unset, errset)
  232. }
  233. } else {
  234. isSaveMarked = true
  235. for j, val := range obj {
  236. content, ok := val["content"].([]interface{})
  237. status := qu.IntAll(val["status"])
  238. if !ok {
  239. continue
  240. // i.ServeJson(b)
  241. // return nil
  242. }
  243. isext, _ := val["checkType"].(bool)
  244. istag, _ := val["checkAllTag"].(bool)
  245. if j == 0 { //基本信息
  246. BzJBZD(content, set, unset, errset)
  247. } else if j == 1 { //时间地点
  248. BzSJDD(content, set, unset, errset)
  249. } else if j == 2 { //标的物
  250. BzBDXX(content, set, unset, errset, isext, istag, status)
  251. } else if j == 3 { //多包
  252. BzDBXX(content, set, unset, errset, isext, status)
  253. } else if j == 4 { //候选人
  254. BzZBHXRXX(content, set, unset, errset, isext, status)
  255. } else { //其余信息
  256. BzQYXX(content, set, unset, errset)
  257. }
  258. }
  259. }
  260. qu.Debug("errset---", errset)
  261. qu.Debug("set---", set)
  262. qu.Debug("unset---", unset)
  263. userInfo := map[string]interface{}{} //记录本次标注日志
  264. modifyFields := map[string]interface{}{} //本次标注所有字段
  265. unerrset := map[string]interface{}{} //记录errdata错误信息表删除
  266. loginuser := i.GetSession("loginuser").(string)
  267. coll := i.GetSession("coll").(string)
  268. data, _ := util.MgoM.FindById(coll, _id, nil) //查询标注保存前的原始信息
  269. //modifyuser := qu.ObjToString((*data)["modifyuser"])
  270. //标注多次操作处理
  271. if len(set) > 0 { //set中为本次标注保存的数据(ck_bidopentime:1;ck_buyer:2;buyer:"XXX")
  272. for s, sv := range set {
  273. //特殊字段处理
  274. //if s == "ck_pclistag" && (*data)["ck_pclistag"] != nil {
  275. // delete(set, s)
  276. // continue
  277. //}
  278. //区分是标记字段,还是普通字段(标记字段:ck_buyer;普通字段:buyer)
  279. if strings.HasPrefix(s, preKey) {
  280. status := qu.IntAll(sv) //标注字段状态
  281. field := s[3:] //去除前缀,被标注字段
  282. checkedStatus := qu.IntAll((*data)[s]) //数据库被标注状态
  283. if status == 1 && (checkedStatus == 2 || checkedStatus == 1) { //数据库已有标记,且页面标注正确,此次该字段不做标注保存
  284. qu.Debug("已标注字段field---", field)
  285. delete(set, field)
  286. delete(set, s)
  287. continue
  288. } else {
  289. qu.Debug("未标注字段field---", field, status)
  290. if set[field] == nil && status != 2 { //表示该字段没有要修改的值,此时标记为1或2(亦或是ck_wodrisext;ck_pkgisext;ck_pclisext)
  291. modifyFields[field] = set[s] //目前会有pclisext、pclistag、pkgisext、wodrisext
  292. continue
  293. } else { //此时有修改的值和标记2
  294. modifyFields[field] = status //记录标注的字段和状态
  295. if checkedStatus != 0 { //已有标注信息的状态
  296. if status == 2 && checkedStatus == 2 { //字段已被修改且本次也为修改
  297. errdata, _ := util.MgoM.FindById(util.Config.Totablel, _id, map[string]interface{}{"userinfo": 0})
  298. //if field == "package" || field == "purchasinglist" || field == "winnerorder" {
  299. //}
  300. if errdata != nil && len(*errdata) != 0 {
  301. qu.Debug(field, (*errdata)[field] != nil, fmt.Sprint((*errdata)[field]))
  302. delete(errset, field) //errdata中有该字段的错误记录,不再更新errdata
  303. //对比errdata错误值:相等变为1,errdata删除;不等变为2,标注表修改该字段
  304. errText := fmt.Sprint((*errdata)[field])
  305. text := fmt.Sprint(set[field])
  306. qu.Debug("errText---", errText, text)
  307. if errText == text {
  308. set[s] = 1 //更新标注表字段状态
  309. unerrset[field] = "" //删除errdata表字段
  310. //delete(errset, field)
  311. }
  312. }
  313. }
  314. }
  315. }
  316. }
  317. }
  318. }
  319. }
  320. qu.Debug("errset---", errset)
  321. qu.Debug("set---", set)
  322. qu.Debug("unset---", unset)
  323. qu.Debug("unerrset---", unerrset)
  324. //1、errdata操作
  325. //存储原错误信息
  326. errUpdata := map[string]interface{}{} //errdata所有要更新内容
  327. for f, v := range errset {
  328. qu.Debug("err filed---", f, v)
  329. //if f != "package" && f != "purchasinglist" && f != "winnerorder" {
  330. errset[f] = (*data)[f]
  331. //}
  332. }
  333. if len(modifyFields) > 0 { //有标注字段,记录标注信息
  334. errset["updatetime"] = time.Now().Unix()
  335. errset["modifyuser"] = loginuser
  336. userInfo["fields"] = modifyFields
  337. userInfo["updatetime"] = time.Now().Unix()
  338. userInfo["modifyuser"] = loginuser
  339. errUpdata["$push"] = map[string]interface{}{
  340. "userinfo": map[string]interface{}{
  341. "$each": []interface{}{userInfo},
  342. "$position": 0,
  343. },
  344. }
  345. }
  346. qu.Debug("set---", set)
  347. qu.Debug("errset---", errset)
  348. qu.Debug("unerrset---", unerrset)
  349. qu.Debug("userInfo---", userInfo)
  350. if len(errset) > 0 {
  351. errUpdata["$set"] = errset
  352. }
  353. if len(unerrset) > 0 {
  354. errUpdata["$unset"] = unerrset
  355. }
  356. if len(errUpdata) > 0 {
  357. util.MgoM.Update(util.Config.Totablel, `{"_id":"`+_id+`"}`, errUpdata, true, false)
  358. }
  359. //更新表操作
  360. //qu.Debug("set---", set)
  361. //更新正确信息
  362. update := map[string]interface{}{}
  363. if len(set) > 0 {
  364. set["ck_data"] = stype
  365. set["updatetime"] = time.Now().Unix()
  366. set["modifyuser"] = loginuser
  367. update["$set"] = set
  368. }
  369. qu.Debug("unset---", unset)
  370. if len(unset) > 0 {
  371. update["$unset"] = unset
  372. }
  373. qu.Debug("update---", update)
  374. if len(update) > 0 {
  375. b = util.MgoM.Update(coll, `{"_id":"`+_id+`"}`, update, false, false)
  376. if b {
  377. if coll != util.Config.Fromtable && isSaveMarked { //util.coll此时的标注表 util.Config.Fromtable默认标注表
  378. data, _ := util.MgoM.FindById(coll, _id, nil)
  379. delete(*data, "modifyuser")
  380. if data != nil && len(*data) > 0 {
  381. update := map[string]interface{}{"$set": *data}
  382. if len(unset) > 0 {
  383. update["$unset"] = unset
  384. }
  385. if !util.MgoM.Update(util.Config.Fromtable, map[string]interface{}{"_id": (*data)["_id"]}, update, true, false) {
  386. qu.Debug("同步marked失败,", _id)
  387. }
  388. }
  389. }
  390. }
  391. i.ServeJson(b)
  392. } else {
  393. i.ServeJson(true)
  394. }
  395. return nil
  396. }
  397. //查询信息
  398. func (i *Front) Detail(id string) error {
  399. coll, _ := i.GetSession("coll").(string)
  400. //if coll != "" {
  401. // exists, _ := redis.Exists("extcheck", coll+"_"+id)
  402. // if exists {
  403. // tmpId, exists := GetNoCheckedId(id, coll)
  404. // if exists { //标注完成
  405. // return i.Render("finish.html", &i.T)
  406. // } else {
  407. // id = tmpId
  408. // }
  409. // }
  410. //} else {
  411. // i.T["err"] = "数据查询表为空!"
  412. // return i.Render("err.html", &i.T)
  413. //}
  414. query, _ := i.GetSession("query").(map[string]interface{})
  415. rep := getDetail(id, coll) //获取本条公告的信息
  416. i.T["otherInfo"] = rep["otherInfo"] //展示关联公告信息
  417. i.T["moreInfo"] = rep["moreInfo"] //更多关联公告信息
  418. //i.T["jyhref"] = util.JYHREFPRE + qu.CommonEncodeArticle("content", id) + ".html"
  419. i.T["info"] = rep["info"]
  420. i.T["common"] = rep["common"]
  421. i.T["worder"] = rep["worder"]
  422. i.T["packs"] = rep["packs"]
  423. i.T["packskey"] = rep["packskey"]
  424. //i.T["ck_pclisext"] = rep["ck_pclisext"]
  425. i.T["ck_pclistag"] = rep["ck_pclistag"]
  426. //i.T["ck_wodrisext"] = rep["ck_wodrisext"]
  427. //i.T["ck_pkgisext"] = rep["ck_pkgisext"]
  428. i.T["timeplace"] = rep["timeplace"]
  429. i.T["purchasinglist"] = rep["purchasinglist"]
  430. i.T["other"] = rep["other"]
  431. i.T["PurchasinglistField"] = util.PurchasinglistField
  432. i.T["WinnerorderField"] = util.WinnerorderField
  433. i.T["PackageField"] = util.PackageField
  434. i.T["topsubtype"] = util.TopSubStypeArr2
  435. i.T[preKey+"purchasinglist"] = rep[preKey+"purchasinglist"]
  436. i.T[preKey+"package"] = rep[preKey+"package"]
  437. i.T[preKey+"winnerorder"] = rep[preKey+"winnerorder"]
  438. i.T["worder_new"] = rep["worder_new"]
  439. i.T["pcl_new"] = rep["pcl_new"]
  440. i.T["pkg_new"] = rep["pkg_new"]
  441. i.T["nextid"] = GetNextDataId(id, coll, query) //下一条id
  442. checkedNum, allNum := GetCheckedAndAllDataInfo(query, coll) //已标和总数信息
  443. i.T["checkednum"] = checkedNum
  444. i.T["allnum"] = allNum
  445. i.T["fields"] = util.Config.Fields
  446. //存入Redis
  447. redis.Put("extcheck", coll+"_"+id, "", util.Config.RedisTimeout*60) //正在标注的数据存入redis避免多人同时标注(加上coll左前缀避免不同表相同id数据不能同时标注)
  448. return i.Render("detail.html", &i.T)
  449. }
  450. //通过excel表格导入
  451. func (i *Front) ImportByExcel() {
  452. defer qu.Catch()
  453. //success := false
  454. msg := ""
  455. importNum := 0
  456. successNum := int64(0)
  457. coll := i.GetString("excelcoll")
  458. if coll == "" {
  459. i.ServeJson(map[string]interface{}{"msg": "表名错误"})
  460. return
  461. }
  462. mf, _, err := i.GetFile("xlsx")
  463. if err == nil {
  464. binary, _ := ioutil.ReadAll(mf)
  465. xls, _ := xlsx.OpenBinary(binary)
  466. sheet := xls.Sheets[0]
  467. rows := sheet.Rows
  468. idcolnum := -1
  469. ids := []string{}
  470. cellFieldName := map[int]string{} //记录客户需求字段所在的列
  471. tmpMap := map[string]map[string]interface{}{} //excel表中需要保存字段集合
  472. for rn, row := range rows {
  473. if rn == 0 {
  474. for j, cell := range row.Cells {
  475. title := cell.Value
  476. if fieldName := util.Config.CustomerField[title]; fieldName != "" { //客户需求字段
  477. cellFieldName[j] = fieldName
  478. }
  479. if title == "唯一标识" || title == "信息标识" { //id所在列
  480. idcolnum = j
  481. }
  482. }
  483. if idcolnum == -1 {
  484. break
  485. }
  486. continue
  487. }
  488. if len(row.Cells) < len(rows[0].Cells) {
  489. break
  490. }
  491. tmp := map[string]interface{}{}
  492. for j, f := range cellFieldName {
  493. if val := row.Cells[j].Value; val != "" {
  494. if f == "capital" { //注册资金(万元)
  495. cf, _ := row.Cells[j].Float()
  496. tmp[f] = cf
  497. } else if f == "createtime" { //创建时间
  498. ci, _ := row.Cells[j].Int64()
  499. tmp[f] = ci
  500. } else {
  501. tmp[f] = val
  502. }
  503. }
  504. }
  505. id := row.Cells[idcolnum].String() //加密的id
  506. if id == "" {
  507. break
  508. }
  509. id = SE.DecodeString(id) //解密后id
  510. tmpMap[id] = tmp
  511. ids = append(ids, id)
  512. }
  513. importNum = len(ids) //excel表数据个数
  514. if importNum > 0 {
  515. _, msg, successNum = GetDataById1(coll, ids, "excel", tmpMap)
  516. tmpMap = map[string]map[string]interface{}{}
  517. ids = []string{}
  518. }
  519. }
  520. msg = fmt.Sprintf("共查询%d条,导入成功%d条\n", importNum, successNum) + msg
  521. i.ServeJson(map[string]interface{}{"msg": msg})
  522. }
  523. func (i *Front) GetEsCount() {
  524. defer qu.Catch()
  525. msg := ""
  526. count := int64(0)
  527. estext := i.GetString("estext") //es查询语句
  528. esJson := map[string]interface{}{}
  529. if json.Unmarshal([]byte(estext), &esJson) != nil || len(esJson) == 0 {
  530. msg = "Es语句错误"
  531. } else {
  532. count = util.Es.Count(util.Index, util.Itype, estext)
  533. }
  534. i.ServeJson(map[string]interface{}{"count": count, "msg": msg})
  535. }
  536. //通过es语句导入
  537. func (i *Front) ImportByEs() {
  538. defer qu.Catch()
  539. //success := false
  540. msg := ""
  541. successNum := int64(0)
  542. estext := i.GetString("estext") //es查询语句
  543. coll := i.GetString("coll") //导入表
  544. if coll == "" {
  545. i.ServeJson(map[string]interface{}{"msg": "表名错误"})
  546. return
  547. }
  548. client := util.Es.GetEsConn()
  549. defer util.Es.DestoryEsConn(client)
  550. ch := make(chan bool, 5)
  551. wg := &sync.WaitGroup{}
  552. lock := &sync.Mutex{}
  553. escount := util.Es.Count(util.Index, util.Itype, estext)
  554. qu.Debug("查询总数:", escount)
  555. if escount > 0 {
  556. //查询条件类型转换
  557. q := es.NewQueryStringQuery(estext)
  558. //游标查询,index不支持别名,只能写索引库的名称
  559. res, err := client.Scroll(util.Index).Query(q).Size(200).Do(context.TODO()) //查询一条获取游标
  560. ids := []string{} //id数据
  561. if err == nil {
  562. numDocs := 0
  563. scrollId := res.ScrollId
  564. for {
  565. if scrollId == "" {
  566. qu.Debug("ScrollId Is Error")
  567. break
  568. }
  569. searchResult, err := client.Scroll(util.Index).Size(200).ScrollId(scrollId).Do(context.TODO()) //查询
  570. if err != nil {
  571. if err.Error() == "EOS" { //迭代完毕
  572. qu.Debug("Es Search Data Over:", err)
  573. } else {
  574. qu.Debug("Es Search Data Error:", err)
  575. }
  576. break
  577. }
  578. for _, hit := range searchResult.Hits.Hits {
  579. //开始处理数据
  580. wg.Add(1)
  581. ch <- true
  582. go func(tmpHit *es.SearchHit) {
  583. defer func() {
  584. <-ch
  585. wg.Done()
  586. }()
  587. tmp := make(map[string]interface{})
  588. if json.Unmarshal(tmpHit.Source, &tmp) == nil {
  589. id := qu.ObjToString(tmp["_id"])
  590. tmp["id"] = id //记录数据原有id
  591. lock.Lock()
  592. ids = append(ids, id)
  593. lock.Unlock()
  594. }
  595. }(hit)
  596. numDocs += 1
  597. if numDocs%500 == 0 {
  598. qu.Debug("Current:", numDocs)
  599. }
  600. }
  601. scrollId = searchResult.ScrollId
  602. }
  603. wg.Wait()
  604. client.ClearScroll().ScrollId(scrollId).Do(context.TODO()) //清理游标
  605. //qu.Debug("Result Data Count:", numDocs)
  606. } else {
  607. qu.Debug("Es Search Data Error")
  608. }
  609. //判断数量
  610. if int64(len(ids)) != escount {
  611. msg = "查询数据和结果不一致"
  612. } else { //入库
  613. _, msg, successNum = GetDataById1(coll, ids, "es", map[string]map[string]interface{}{})
  614. }
  615. } else {
  616. msg = "无查询数据"
  617. }
  618. msg = fmt.Sprintf("共查询%d条,导入成功%d条\n", escount, successNum) + msg
  619. i.ServeJson(map[string]interface{}{"msg": msg})
  620. }
  621. //同步数据
  622. func (i *Front) SyncMarked() {
  623. syncColl := i.GetString("coll")
  624. sess := util.MgoM.GetMgoConn()
  625. defer util.MgoM.DestoryMongoConn(sess)
  626. it := sess.DB(util.Config.Dbname).C(syncColl).Find(nil).Iter()
  627. count, _ := sess.DB(util.Config.Dbname).C(syncColl).Find(nil).Count()
  628. qu.Debug(syncColl, count)
  629. n := 0
  630. lock := &sync.Mutex{}
  631. wg := &sync.WaitGroup{}
  632. ch := make(chan bool, 3)
  633. result := map[string]map[string]interface{}{}
  634. idArr := []string{}
  635. for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
  636. wg.Add(1)
  637. ch <- true
  638. go func(tmp map[string]interface{}) {
  639. defer func() {
  640. <-ch
  641. wg.Done()
  642. }()
  643. id := qu.ObjToString(tmp["id"])
  644. if id == "" {
  645. return
  646. }
  647. tmpMap := map[string]interface{}{}
  648. for _, f := range util.Config.CustomerField {
  649. if val := tmp[f]; val != nil {
  650. tmpMap[f] = val
  651. }
  652. }
  653. tmpMap["info"] = tmp["info"]
  654. lock.Lock()
  655. idArr = append(idArr, id)
  656. if result[id] != nil {
  657. qu.Debug("id exist!!!", id)
  658. }
  659. result[id] = tmpMap
  660. lock.Unlock()
  661. }(tmp)
  662. tmp = map[string]interface{}{}
  663. }
  664. wg.Wait()
  665. if count != int64(len(result)) {
  666. i.ServeJson(map[string]interface{}{"msg": "同步失败", "flag": false})
  667. return
  668. }
  669. //util.MgoM.C.Database(util.Config.Dbname).Collection(syncColl).Drop(util.MgoM.Ctx) //删除syncColl表(清空数据)
  670. success, msg, successNum := GetDataById(syncColl, idArr, "syncoll", result)
  671. result = map[string]map[string]interface{}{}
  672. idArr = []string{}
  673. msg = fmt.Sprintf("共查询%d条,同步成功%d条\n", count, successNum) + msg
  674. i.ServeJson(map[string]interface{}{"msg": msg, "flag": success})
  675. }
  676. //将marked表中ck_data:2更新为0
  677. func (i *Front) MarkedInit() {
  678. set := map[string]interface{}{
  679. "$set": map[string]interface{}{
  680. "ck_data": 0,
  681. },
  682. }
  683. b := util.MgoM.Update(util.Config.Fromtable, `{"ck_data":2}`, set, false, true)
  684. i.ServeJson(map[string]interface{}{"success": b})
  685. }
  686. //标注完成
  687. func (i *Front) FinishCheck() {
  688. i.Render("finish.html")
  689. }
  690. //错误页面
  691. func (i *Front) ErrCheck() {
  692. i.Render("err.html")
  693. }
  694. //统计抽查
  695. func (i *Front) Tj() error {
  696. comm := map[string]map[string]int{}
  697. comm_win := map[string]map[string]int{}
  698. pack := map[string]map[string]int{}
  699. pack_win := map[string]map[string]int{}
  700. list, _ := util.MgoM.Find(util.Config.Totablel, "{}", nil, nil, false, -1, -1)
  701. for _, tmp := range *list {
  702. for k, val := range tmp {
  703. if len(k) > 3 && k[:3] == preKey {
  704. comm = mapIntAdd(k, qu.ObjToString(val), comm)
  705. }
  706. }
  707. if winnerorder, ok := tmp["winnerorder"].([]interface{}); ok {
  708. for _, wd := range winnerorder {
  709. if winner, ok := wd.(map[string]interface{}); ok {
  710. for k, val := range winner {
  711. if len(k) > 3 && k[:3] == preKey {
  712. comm_win = mapIntAdd(k, qu.ObjToString(val), comm_win)
  713. }
  714. }
  715. }
  716. }
  717. }
  718. if ptmp, ok := tmp["package"].(map[string]interface{}); ok {
  719. for _, pktmp := range ptmp {
  720. if pkage, ok := pktmp.(map[string]interface{}); ok {
  721. for k, val := range pkage {
  722. if len(k) > 3 && k[:3] == preKey {
  723. pack = mapIntAdd(k, qu.ObjToString(val), pack)
  724. }
  725. if k == "winnerorder" {
  726. if wtmp, ok := val.([]interface{}); ok {
  727. for _, winner := range wtmp {
  728. if win, ok := winner.(map[string]interface{}); ok {
  729. for wk, wval := range win {
  730. if len(k) > 3 && k[:3] == preKey {
  731. pack_win = mapIntAdd(wk, qu.ObjToString(wval), pack_win)
  732. }
  733. }
  734. }
  735. }
  736. }
  737. }
  738. }
  739. }
  740. }
  741. }
  742. }
  743. //data := map[string]interface{}{"total": len(list), "comm": comm, "pack": pack, "pack_win": pack_win}
  744. //mongodb.Save("extcheck_tj", data)
  745. i.T["comm"] = comm
  746. i.T["pack"] = pack
  747. i.T["comm_win"] = comm_win
  748. i.T["pack_win"] = pack_win
  749. i.T["total"] = len(*list)
  750. return i.Render("tj.html", &i.T)
  751. }
  752. //标错列表
  753. func (i *Front) Elist() error {
  754. attrname := i.GetString("attrname")
  755. common := util.Config.Biaozhu["common"]
  756. elist, _ := util.MgoM.Find(util.Config.Totablel, `{"ck_`+attrname+`":"0"}`, `{"_id":1}`, `{"_id":1}`, false, -1, -1)
  757. for _, v := range *elist {
  758. v["_id"] = mgo.BsonIdToSId(v["_id"])
  759. }
  760. i.T["elist"] = *elist
  761. i.T["attrname"] = attrname
  762. i.T["common"] = common
  763. return i.Render("elist.html", &i.T)
  764. }
  765. func (i *Front) Review() error {
  766. defer qu.Catch()
  767. var labeler []map[string]interface{}
  768. coll := i.GetString("coll")
  769. sess := util.MgoM.GetMgoConn()
  770. defer util.MgoM.DestoryMongoConn(sess)
  771. sess.DB(util.MgoM.DbName).C(coll).Pipe([]map[string]interface{}{
  772. //查询条件
  773. {
  774. "$match": bson.M{
  775. "ck_data": bson.M{"$gte": 1},
  776. },
  777. },
  778. // 按照modifyuser分组,并统计
  779. {
  780. "$group": bson.M{
  781. "_id": "$modifyuser",
  782. "count": bson.M{"$sum": 1},
  783. },
  784. },
  785. // 排序
  786. {
  787. "$sort": bson.M{"count": -1},
  788. },
  789. }).All(&labeler)
  790. var maps []string
  791. maps = append(maps, "")
  792. for k, v := range util.Config.Fields {
  793. if v {
  794. maps = append(maps, k)
  795. }
  796. }
  797. maps = append(maps, "全部数据")
  798. i.T["fields"] = maps
  799. i.T["users"] = labeler
  800. i.T["coll"] = coll
  801. return i.Render("review.html", &i.T)
  802. }
  803. func (i *Front) ReviewList() {
  804. defer qu.Catch()
  805. if i.Method() == "POST" {
  806. coll := i.GetSession("coll").(string)
  807. user := i.GetString("user")
  808. q := make(map[string]interface{})
  809. q["ck_data"] = bson.M{"$gte": 1}
  810. if user != "0" && user != "-1" {
  811. q["modifyuser"] = user
  812. }
  813. i.SetSession("query1", q)
  814. datas, b := util.MgoM.Find(coll, q, bson.M{"_id": 1}, nil, false, -1, -1)
  815. if b && len(*datas) > 0 {
  816. i.ServeJson(map[string]interface{}{
  817. "rep": b,
  818. "data": *datas,
  819. })
  820. } else {
  821. i.ServeJson(map[string]interface{}{
  822. "rep": false,
  823. "msg": "未查询到数据",
  824. })
  825. }
  826. }
  827. }
  828. func (i *Front) ReviewDetail(id string) error {
  829. defer qu.Catch()
  830. coll, _ := i.GetSession("coll").(string)
  831. query, _ := i.GetSession("query1").(map[string]interface{})
  832. rep := getDetail(id, coll) //获取本条公告的信息
  833. i.T["otherInfo"] = rep["otherInfo"] //展示关联公告信息
  834. i.T["moreInfo"] = rep["moreInfo"] //更多关联公告信息
  835. i.T["info"] = rep["info"]
  836. i.T["common"] = rep["common"]
  837. i.T["worder"] = rep["worder"]
  838. i.T["packs"] = rep["packs"]
  839. i.T["packskey"] = rep["packskey"]
  840. i.T["ck_pclisext"] = rep["ck_pclisext"]
  841. i.T["ck_wodrisext"] = rep["ck_wodrisext"]
  842. i.T["ck_pkgisext"] = rep["ck_pkgisext"]
  843. i.T["timeplace"] = rep["timeplace"]
  844. i.T["purchasinglist"] = rep["purchasinglist"]
  845. i.T["other"] = rep["other"]
  846. i.T["PurchasinglistField"] = util.PurchasinglistField
  847. i.T["WinnerorderField"] = util.WinnerorderField
  848. i.T["PackageField"] = util.PackageField
  849. i.T["topsubtype"] = util.TopSubStypeArr2
  850. i.T[preKey+"purchasinglist"] = rep[preKey+"purchasinglist"]
  851. i.T[preKey+"package"] = rep[preKey+"package"]
  852. i.T[preKey+"winnerorder"] = rep[preKey+"winnerorder"]
  853. i.T["worder_new"] = rep["worder_new"]
  854. i.T["pcl_new"] = rep["pcl_new"]
  855. i.T["pkg_new"] = rep["pkg_new"]
  856. i.T["fields"] = util.Config.Fields
  857. i.T["nextid"] = GetNextDataId(id, coll, query) //下一条id
  858. return i.Render("re_detail.html", &i.T)
  859. }
  860. func (i *Front) ReviewSave() error {
  861. defer qu.Catch()
  862. b := false
  863. obj := []map[string]interface{}{}
  864. key := i.GetString("key")
  865. _id := i.GetString("_id")
  866. //stype, _ := i.GetInteger("stype")
  867. err := json.Unmarshal([]byte(key), &obj)
  868. if err != nil {
  869. i.ServeJson(b)
  870. return nil
  871. }
  872. set := map[string]interface{}{} //更新、新增字段
  873. unset := map[string]interface{}{} //删除字段
  874. errset := map[string]interface{}{} //记录修改的字段信息
  875. isSaveMarked := false
  876. if len(obj) == 1 { //单独保存某个一级
  877. content, ok := obj[0]["content"].([]interface{})
  878. if !ok || len(content) == 0 {
  879. i.ServeJson(b)
  880. return nil
  881. }
  882. title := qu.ObjToString(obj[0]["title"])
  883. isext, _ := obj[0]["checkType"].(bool)
  884. istag, _ := obj[0]["checkAllTag"].(bool)
  885. status := qu.IntAll(obj[0]["status"])
  886. switch title {
  887. case "基本字段":
  888. BzJBZD(content, set, unset, errset)
  889. case "时间地点":
  890. BzSJDD(content, set, unset, errset)
  891. case "标的信息":
  892. BzBDXX(content, set, unset, errset, isext, istag, status)
  893. case "多包信息":
  894. BzDBXX(content, set, unset, errset, isext, status)
  895. case "中标候选人信息":
  896. BzZBHXRXX(content, set, unset, errset, isext, status)
  897. case "其余信息":
  898. BzQYXX(content, set, unset, errset)
  899. }
  900. } else {
  901. isSaveMarked = true
  902. for j, val := range obj {
  903. content, ok := val["content"].([]interface{})
  904. status := qu.IntAll(val["status"])
  905. if !ok {
  906. continue
  907. // i.ServeJson(b)
  908. // return nil
  909. }
  910. isext, _ := val["checkType"].(bool)
  911. istag, _ := val["checkAllTag"].(bool)
  912. if j == 0 { //基本信息
  913. BzJBZD(content, set, unset, errset)
  914. } else if j == 1 { //时间地点
  915. BzSJDD(content, set, unset, errset)
  916. } else if j == 2 { //标的物
  917. BzBDXX(content, set, unset, errset, isext, istag, status)
  918. } else if j == 3 { //多包
  919. BzDBXX(content, set, unset, errset, isext, status)
  920. } else if j == 4 { //候选人
  921. BzZBHXRXX(content, set, unset, errset, isext, status)
  922. } else { //其余信息
  923. BzQYXX(content, set, unset, errset)
  924. }
  925. }
  926. }
  927. userInfo := map[string]interface{}{} //记录本次标注日志
  928. modifyFields := map[string]interface{}{} //本次标注所有字段
  929. unerrset := map[string]interface{}{} //记录errdata错误信息表删除
  930. loginuser := i.GetSession("loginuser").(string)
  931. coll := i.GetSession("coll").(string)
  932. data, _ := util.MgoM.FindById(coll, _id, nil) //查询标注保存前的原始信息
  933. //modifyuser := qu.ObjToString((*data)["modifyuser"])
  934. remap := make(map[string]interface{}) // 质检信息
  935. reField := make(map[string]interface{})
  936. remap["user"] = loginuser
  937. remap["updatetime"] = time.Now().Unix()
  938. //标注多次操作处理
  939. if len(set) > 0 { //set中为本次标注保存的数据(ck_bidopentime:1;ck_buyer:2;buyer:"XXX")
  940. for s, sv := range set {
  941. //特殊字段处理
  942. //if s == "ck_pclistag" && (*data)["ck_pclistag"] != nil {
  943. // delete(set, s)
  944. // continue
  945. //}
  946. //区分是标记字段,还是普通字段(标记字段:ck_buyer;普通字段:buyer)
  947. if strings.HasPrefix(s, preKey) {
  948. status := qu.IntAll(sv) //标注字段状态
  949. field := s[3:] //去除前缀,被标注字段
  950. checkedStatus := qu.IntAll((*data)[s]) //数据库被标注状态
  951. rename := strings.Replace(s, "ck_", "re_", -1)
  952. reField[rename] = status
  953. if status == 1 && (checkedStatus == 2 || checkedStatus == 1) { //数据库已有标记,且页面标注正确,此次该字段不做标注保存
  954. delete(set, field)
  955. delete(set, s)
  956. continue
  957. } else {
  958. if set[field] == nil && status != 2 { //表示该字段没有要修改的值,此时标记为1或2(亦或是ck_wodrisext;ck_pkgisext;ck_pclisext)
  959. modifyFields[field] = set[s] //目前会有pclisext、pclistag、pkgisext、wodrisext
  960. continue
  961. } else { //此时有修改的值和标记2
  962. modifyFields[field] = status //记录标注的字段和状态
  963. if checkedStatus != 0 { //已有标注信息的状态
  964. if status == 2 && checkedStatus == 2 { //字段已被修改且本次也为修改
  965. errdata, _ := util.MgoM.FindById(util.Config.Totablel, _id, map[string]interface{}{"userinfo": 0})
  966. if errdata != nil && len(*errdata) != 0 {
  967. delete(errset, field) //errdata中有该字段的错误记录,不再更新errdata
  968. //对比errdata错误值:相等变为1,errdata删除;不等变为2,标注表修改该字段
  969. errText := fmt.Sprint((*errdata)[field])
  970. text := fmt.Sprint(set[field])
  971. if errText == text {
  972. set[s] = 1 //更新标注表字段状态
  973. unerrset[field] = "" //删除errdata表字段
  974. }
  975. }
  976. }
  977. }
  978. }
  979. }
  980. }
  981. }
  982. }
  983. remap["field"] = reField
  984. set["review"] = remap
  985. set["re_data"] = 1
  986. //存储原错误信息
  987. //1、errdata操作
  988. errUpdata := map[string]interface{}{} //errdata所有要更新内容
  989. for f, _ := range errset {
  990. errset[f] = (*data)[f]
  991. }
  992. if len(modifyFields) > 0 { //有标注字段,记录标注信息
  993. errset["updatetime"] = time.Now().Unix()
  994. errset["modifyuser"] = loginuser
  995. userInfo["fields"] = modifyFields
  996. userInfo["updatetime"] = time.Now().Unix()
  997. userInfo["modifyuser"] = loginuser
  998. errUpdata["$push"] = map[string]interface{}{
  999. "userinfo": map[string]interface{}{
  1000. "$each": []interface{}{userInfo},
  1001. "$position": 0,
  1002. },
  1003. }
  1004. }
  1005. if len(errset) > 0 {
  1006. errUpdata["$set"] = errset
  1007. }
  1008. if len(unerrset) > 0 {
  1009. errUpdata["$unset"] = unerrset
  1010. }
  1011. if len(errUpdata) > 0 {
  1012. util.MgoM.Update(util.Config.Totablel, `{"_id":"`+_id+`"}`, errUpdata, true, false)
  1013. }
  1014. //更新表操作
  1015. //更新正确信息
  1016. update := map[string]interface{}{}
  1017. if len(set) > 0 {
  1018. if len(set) > 1 {
  1019. set["updatetime"] = time.Now().Unix()
  1020. //set["modifyuser"] = loginuser
  1021. }
  1022. update["$set"] = set
  1023. }
  1024. if len(unset) > 0 {
  1025. update["$unset"] = unset
  1026. }
  1027. if len(update) > 0 {
  1028. b = util.MgoM.Update(coll, `{"_id":"`+_id+`"}`, update, false, false)
  1029. if b {
  1030. if coll != util.Config.Fromtable && isSaveMarked { //util.coll此时的标注表 util.Config.Fromtable默认标注表
  1031. data, _ := util.MgoM.FindById(coll, _id, nil)
  1032. if data != nil && len(*data) > 0 {
  1033. update := map[string]interface{}{"$set": *data}
  1034. if len(unset) > 0 {
  1035. update["$unset"] = unset
  1036. }
  1037. if !util.MgoM.Update(util.Config.Fromtable, map[string]interface{}{"_id": (*data)["_id"]}, update, true, false) {
  1038. qu.Debug("同步marked失败,", _id)
  1039. }
  1040. }
  1041. }
  1042. }
  1043. i.ServeJson(b)
  1044. } else {
  1045. i.ServeJson(true)
  1046. }
  1047. return nil
  1048. }
  1049. func (i *Front) ReviewNext() {
  1050. defer qu.Catch()
  1051. id := i.GetString("id")
  1052. coll := i.GetSession("coll").(string)
  1053. q := bson.M{"_id": bson.M{"$gt": mgo.StringTOBsonId(id)}}
  1054. info, b := util.MgoM.Find(coll, q, bson.M{"_id": 1}, bson.M{"_id": 1}, false, 0, 1)
  1055. if b && len(*info) > 0 {
  1056. nxid := mgo.BsonIdToSId((*info)[0]["_id"])
  1057. i.ServeJson(bson.M{"id": nxid, "exists": true})
  1058. } else {
  1059. i.ServeJson(bson.M{"exists": false})
  1060. }
  1061. }
  1062. func (i *Front) ReviewStat() {
  1063. defer qu.Catch()
  1064. sess := util.MgoM.GetMgoConn()
  1065. defer util.MgoM.DestoryMongoConn(sess)
  1066. coll := i.GetSession("coll").(string)
  1067. qu.Debug(coll)
  1068. result := sess.DB(util.MgoM.DbName).C(coll).Find(nil).Iter()
  1069. count, cmark, rmark, rgmark := 0, 0, 0, 0 // 总数, 标注数量, 审核数据量, 审核数据完全正确的数据量
  1070. cmaps := make(map[string]int) // 标注字段整体准确率
  1071. umaps := make(map[string]interface{}) // 按人员 字段准确率
  1072. for k, i2 := range util.Config.Fields {
  1073. if i2 {
  1074. cmaps[k] = 0
  1075. }
  1076. }
  1077. for tmp := make(map[string]interface{}); result.Next(&tmp); {
  1078. count++
  1079. user := qu.ObjToString(tmp["modifyuser"])
  1080. if qu.IntAll(tmp["ck_data"]) >= 1 {
  1081. cmark++
  1082. var up map[string]int
  1083. if umaps[user] == nil {
  1084. up = make(map[string]int)
  1085. } else {
  1086. up = umaps[user].(map[string]int)
  1087. }
  1088. up["ck_count"] += 1
  1089. umaps[user] = up
  1090. }
  1091. if qu.IntAll(tmp["re_data"]) > 0 {
  1092. rmark++
  1093. if reField, ok := tmp["review"].(map[string]interface{}); ok {
  1094. remap, _ := reField["field"].(map[string]interface{})
  1095. flag := true // 数据整体准确率
  1096. // 按人员统计字段准备率
  1097. var up map[string]int
  1098. if umaps[user] == nil {
  1099. up = make(map[string]int)
  1100. } else {
  1101. up = umaps[user].(map[string]int)
  1102. }
  1103. for k1 := range cmaps {
  1104. k2 := "re_" + k1
  1105. if qu.IntAll(remap[k2]) == 1 {
  1106. cmaps[k1] += 1 // 字段整体正确率
  1107. up[k1] += 1
  1108. } else {
  1109. flag = false
  1110. }
  1111. }
  1112. up["re_count"] += 1
  1113. umaps[user] = up
  1114. if flag {
  1115. rgmark++
  1116. up["re_rg_count"] += 1
  1117. }
  1118. }
  1119. }
  1120. }
  1121. //qu.Debug("count:", count, ",cmark:", cmark, ",rmark:", rmark, ",rgmark:", rgmark)
  1122. //qu.Debug(cmaps)
  1123. //qu.Debug(umaps)
  1124. if rmark == 0 {
  1125. i.ServeJson(map[string]interface{}{"rep": false, "msg": "无质检审核数据!"})
  1126. return
  1127. }
  1128. save := bson.M{"total_count": count, "cmake_count": cmark, "rmark_count": rmark, "rgmark_count": rgmark}
  1129. save["result"] = cmaps
  1130. save["user_result"] = umaps
  1131. save["re_user"] = i.GetSession("loginuser").(string)
  1132. id := util.MgoM.Save("review_result", save)
  1133. if id != "" {
  1134. // 前台页面数据
  1135. dataSource := make(map[string]interface{})
  1136. var userSelect []string
  1137. var dataSelect []map[string]interface{}
  1138. userSelect = append(userSelect, "全部")
  1139. tmp := make(map[string]interface{})
  1140. tmp["name"] = "全部"
  1141. tmp["num1"] = cmark
  1142. tmp["num2"] = rmark
  1143. tmp["num3"] = rgmark
  1144. tmp["num4"] = CountPr(rgmark, rmark)
  1145. dataSelect = append(dataSelect, tmp)
  1146. for k, v := range util.Config.Fields {
  1147. if v {
  1148. tmp1 := make(map[string]interface{})
  1149. tmp1["name"] = k
  1150. tmp1["num1"] = cmark
  1151. tmp1["num2"] = rmark
  1152. tmp1["num3"] = cmaps[k]
  1153. tmp1["num4"] = CountPr(cmaps[k], rmark)
  1154. dataSelect = append(dataSelect, tmp1)
  1155. }
  1156. }
  1157. dataSource["全部"] = dataSelect
  1158. for k1, v1 := range umaps {
  1159. if v2, o := v1.(map[string]int); o {
  1160. userSelect = append(userSelect, k1)
  1161. var dataSelect1 []map[string]interface{}
  1162. tmp2 := make(map[string]interface{})
  1163. tmp2["name"] = "全部"
  1164. tmp2["num1"] = v2["ck_count"]
  1165. tmp2["num2"] = v2["re_count"]
  1166. tmp2["num3"] = v2["re_rg_count"]
  1167. tmp2["num4"] = CountPr(v2["re_rg_count"], v2["re_count"])
  1168. dataSelect1 = append(dataSelect1, tmp2)
  1169. for k, v := range util.Config.Fields {
  1170. if v {
  1171. tmp1 := make(map[string]interface{})
  1172. tmp1["name"] = k
  1173. tmp1["num1"] = v2["ck_count"]
  1174. tmp1["num2"] = v2["re_count"]
  1175. tmp1["num3"] = v2[k]
  1176. tmp1["num4"] = CountPr(v2[k], v2["re_count"])
  1177. dataSelect1 = append(dataSelect1, tmp1)
  1178. }
  1179. }
  1180. dataSource[k1] = dataSelect1
  1181. }
  1182. }
  1183. //var dataSource [][]string
  1184. //var tmp []string
  1185. //tmp = append(tmp, "全部")
  1186. //for k, v := range util.Config.Fields{
  1187. // if v {
  1188. // str := fmt.Sprintf("抽查字段标注数据量:%d,</br>抽查字段标注正确数量:%d,</br>占比%s", rmark, cmaps[k], CountPr(cmaps[k], rmark))
  1189. // tmp = append(tmp, str)
  1190. // }
  1191. //}
  1192. //str := fmt.Sprintf("抽查标注数据量:%d,</br>抽查数据标注正确数量:%d,</br>占比%s", rmark, rgmark, CountPr(rgmark, rmark))
  1193. //tmp = append(tmp, str)
  1194. //dataSource = append(dataSource, tmp)
  1195. //for k1, v1 := range umaps{
  1196. // if v2, o := v1.(map[string]int); o {
  1197. // var tmp2 []string
  1198. // tmp2 = append(tmp2, k1)
  1199. // for k, v := range util.Config.Fields{
  1200. // if v {
  1201. // str := fmt.Sprintf("抽查字段标注数据量:%d,</br>抽查字段标注正确数量:%d,</br>占比%s", v2["count"], v2[k], CountPr(v2[k], v2["count"]))
  1202. // tmp2 = append(tmp2, str)
  1203. // }
  1204. // }
  1205. // str := fmt.Sprintf("抽查标注数据量:%d,</br>抽查数据标注正确数量:%d,</br>占比%s", v2["count"], v2["rgmark_count"], CountPr(v2["rgmark_count"], v2["count"]))
  1206. // tmp2 = append(tmp2, str)
  1207. // dataSource = append(dataSource, tmp2)
  1208. // }
  1209. //}
  1210. i.ServeJson(map[string]interface{}{"rep": true, "data": map[string]interface{}{"tableData": dataSource, "userSelect": userSelect}})
  1211. } else {
  1212. i.ServeJson(map[string]interface{}{"rep": false, "msg": "统计失败!"})
  1213. }
  1214. }
  1215. func (i *Front) Logout() {
  1216. i.DelSession("user")
  1217. err := i.Redirect("/")
  1218. if err != nil {
  1219. return
  1220. }
  1221. }