1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096 |
- package front
- import (
- "encoding/json"
- "fmt"
- "github.com/shopspring/decimal"
- "go.mongodb.org/mongo-driver/bson"
- "math"
- mgo "mongodb"
- qu "qfw/util"
- "sort"
- "strconv"
- "strings"
- "time"
- "util"
- )
- func (f *Front) RemarkList() {
- qu.Catch()
- pid := qu.ObjToString(f.GetString("pid"))
- tid := qu.ObjToString(f.GetString("tid"))
- sourceinfo := qu.ObjToString(f.GetString("s_sourceinfo"))
- if f.Method() == "POST" {
- //user := f.GetSession("user").(map[string]interface{})
- start, _ := f.GetInteger("start")
- limit, _ := f.GetInteger("length")
- draw, _ := f.GetInteger("draw")
- searchStr := f.GetString("search[value]")
- search := strings.TrimSpace(searchStr)
- query := map[string]interface{}{"s_usertaskid": tid}
- ckdata, err := f.GetInteger("i_ckdata")
- if err != nil {
- ckdata = -1
- }
- if ckdata == 0 {
- query["b_istag"] = false
- } else if ckdata == 1 {
- query["b_istag"] = true
- }
- if search != "" {
- query["$or"] = []interface{}{
- bson.M{"v_baseinfo.title": bson.M{"$regex": search}},
- }
- }
- qu.Debug(query)
- field := map[string]interface{}{"v_baseinfo.title": 1, "b_istag": 1, "i_ckdata": 1}
- info, _ := util.Mgo.Find(sourceinfo, query, `{"_id": 1}`, field, false, start, limit)
- count := util.Mgo.Count(sourceinfo, query)
- qu.Debug(query, sourceinfo, count)
- f.ServeJson(map[string]interface{}{
- "draw": draw,
- "data": *info,
- "recordsFiltered": count,
- "recordsTotal": count,
- })
- } else {
- f.T["pid"] = pid
- f.T["tid"] = tid
- f.T["s_sourceinfo"] = sourceinfo
- _ = f.Render("project/remark_list.html", &f.T)
- }
- }
- func (f *Front) RemarkDetail() {
- pid := f.GetString("pid")
- tid := f.GetString("tid")
- did := f.GetString("did")
- coll := f.GetString("s_sourceinfo")
- project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, pid, `{"v_fields": 1}`)
- if len(*project) > 0 {
- field := make(map[string]bool)
- vf := (*project)["v_fields"].(map[string]interface{})
- for k := range vf {
- field[k] = true
- }
- f.T["fields"] = field
- }
- qu.Debug(pid, did, coll)
- rep := getDetail(did, coll) //获取本条公告的信息
- f.T["otherInfo"] = rep["otherInfo"] //展示关联公告信息
- f.T["moreInfo"] = rep["moreInfo"] //更多关联公告信息
- f.T["pid"] = pid
- f.T["tid"] = tid
- f.T["did"] = did
- f.T["coll"] = coll
- f.T["info"] = rep["info"]
- f.T["common"] = rep["common"]
- f.T["worder"] = rep["worder"]
- f.T["packs"] = rep["packs"]
- f.T["packskey"] = rep["packskey"]
- f.T["ck_pclistag"] = rep["purchasingTag"]
- f.T["timeplace"] = rep["timeplace"]
- f.T["purchasinglist"] = rep["purchasinglist"]
- f.T["other"] = rep["other"]
- f.T["PurchasinglistField"] = util.PurchasinglistField
- f.T["WinnerorderField"] = util.WinnerorderField
- f.T["PackageField"] = util.PackageField
- f.T["topsubtype"] = util.TopSubStypeArr2
- f.T["ck_purchasinglist"] = rep["ck_purchasinglist"]
- f.T["ck_package"] = rep["ck_package"]
- f.T["ck_winnerorder"] = rep["ck_winnerorder"]
- f.T["worder_new"] = rep["worder_new"]
- f.T["pcl_new"] = rep["pcl_new"]
- f.T["pkg_new"] = rep["pkg_new"]
- f.T["nextid"] = GetNextDataId(did, coll, tid) //下一条id
- _ = f.Render("project/remark_detail.html", &f.T)
- }
- func getDetail(id, coll string) map[string]interface{} {
- rep := map[string]interface{}{}
- infoTmp, _ := util.Mgo.FindById(coll, id, ``)
- baseInfo := (*infoTmp)["v_baseinfo"].(map[string]interface{}) //字段值
- var bzInfo map[string]interface{} //标注信息
- if (*infoTmp)["v_taginfo"] != nil {
- bzInfo = (*infoTmp)["v_taginfo"].(map[string]interface{})
- } else {
- bzInfo = make(map[string]interface{})
- }
- baseInfo["detail"] = qu.ObjToString(baseInfo["title"]) + "</br>" + qu.ObjToString(baseInfo["detail"])
- baseInfo["_id"] = mgo.BsonIdToSId(baseInfo["_id"])
- purchasingTag, _ := baseInfo["purchasinglist_alltag"].(bool)
- rep["purchasingTag"] = purchasingTag
- href := qu.ObjToString(baseInfo["href"])
- if !strings.HasPrefix(href, "http") {
- baseInfo["href"] = "https://" + href
- }
- rep["info"] = baseInfo
- common, timeplace, other := setExtComMap(baseInfo, bzInfo) //拼装抽取common值
- rep["common"] = common
- rep["timeplace"] = timeplace
- rep["other"] = other
- packs, packskey, pkg_new := setPaceMap(baseInfo) //拼装子包信息
- rep["packs"] = packs
- rep["packskey"] = packskey
- rep["pkg_new"] = pkg_new
- purchasinglist, isNewStatus := setPurchasingMap(baseInfo) //标的物
- rep["purchasinglist"] = purchasinglist
- rep["pcl_new"] = isNewStatus
- worder, worder_new := setWorderMap(baseInfo) //中标候选人
- rep["worder"] = worder
- rep["worder_new"] = worder_new
- otherInfo, moreInfo := setOtherInfo(baseInfo) //处理公告关联信息
- rep["otherInfo"] = otherInfo
- rep["moreInfo"] = moreInfo
- //
- if bzInfo["purchasinglist"] != nil {
- rep["ck_purchasinglist"] = "1"
- } else {
- rep["ck_purchasinglist"] = "-1"
- }
- if bzInfo["package"] != nil {
- rep["ck_package"] = "1"
- } else {
- rep["ck_package"] = "-1"
- }
- if bzInfo["winnerorder"] != nil {
- rep["ck_winnerorder"] = "1"
- } else {
- rep["ck_winnerorder"] = "-1"
- }
- return rep
- }
- //拼装抽取common值
- func setExtComMap(info, bzInfo map[string]interface{}) ([]interface{}, []interface{}, []interface{}) {
- //基本参数
- common, _ := util.BiaoZhu["common"].([]interface{})
- for k, tmp := range common {
- if cp, ok := tmp.(map[string]interface{}); ok {
- if info[fmt.Sprint(cp["key"])] == nil {
- cp["value"] = ""
- } else {
- if cp["key"] == "subtype" {
- if info["toptype"] != nil && info["subtype"] != nil {
- cp["value"] = qu.ObjToString(info["toptype"]) + "-" + qu.ObjToString(info[fmt.Sprint(cp["key"])])
- } else {
- cp["value"] = ""
- }
- } else {
- cp["value"] = info[fmt.Sprint(cp["key"])]
- }
- }
- if bzInfo[fmt.Sprint(cp["key"])] == nil {
- cp["status"] = "-1"
- } else {
- cp["status"] = "1"
- }
- common[k] = cp
- }
- }
- //时间地点信息
- timeplace, _ := util.BiaoZhu["timeplace"].([]interface{})
- for k, tmp := range timeplace {
- if tp, ok := tmp.(map[string]interface{}); ok {
- if info[fmt.Sprint(tp["key"])] == nil {
- tp["value"] = ""
- } else {
- key := tp["key"]
- if key == "bidopentime" || key == "publishtime" || key == "bidendtime" || key == "project_startdate" || key == "project_completedate" {
- tmpTime := qu.Int64All(info[fmt.Sprint(tp["key"])])
- if tmpTime > 0 {
- tp["value"] = qu.FormatDateByInt64(&tmpTime, qu.Date_Full_Layout)
- } else {
- tp["value"] = info[qu.ObjToString(tp["key"])]
- }
- } else {
- tp["value"] = info[fmt.Sprint(tp["key"])]
- }
- }
- if bzInfo[fmt.Sprint(tp["key"])] == nil {
- tp["status"] = "-1"
- } else {
- tp["status"] = "1"
- }
- timeplace[k] = tp
- }
- }
- //other信息
- other, _ := util.BiaoZhu["other"].([]interface{})
- for k, tmp := range other {
- if cp, ok := tmp.(map[string]interface{}); ok {
- if info[fmt.Sprint(cp["key"])] == nil {
- cp["value"] = ""
- } else {
- if cp["key"] == "signaturedate" {
- bidopentime := qu.Int64All(info[fmt.Sprint(cp["key"])])
- if bidopentime > 0 {
- cp["value"] = qu.FormatDateByInt64(&bidopentime, qu.Date_Full_Layout)
- } else {
- cp["value"] = info[qu.ObjToString(cp["key"])]
- }
- } else {
- cp["value"] = info[fmt.Sprint(cp["key"])]
- }
- }
- //log.Println(cp)
- if bzInfo[fmt.Sprint(cp["key"])] == nil {
- cp["status"] = "-1"
- } else {
- cp["status"] = "1"
- }
- other[k] = cp
- }
- }
- return common, timeplace, other
- }
- //拼装子包信息
- func setPaceMap(info map[string]interface{}) ([]map[string]interface{}, []string, []bool) {
- var confpack []interface{}
- confpack, _ = util.BiaoZhu["package"].([]interface{})
- //bzpack := bzInfo["package"].(map[string]interface{})
- packs := map[string]map[string]interface{}{}
- var sortpackskey []string
- isNewPkg := map[string]bool{} //记录子包是否是新增的
- if packages, ok := info["package"].(map[string]interface{}); ok && len(packages) > 0 {
- for k, tmpackage := range packages { //遍历分包
- if tmppack, ok := tmpackage.(map[string]interface{}); ok {
- //isNew, _ := tmppack["isnew"].(bool)
- isNew := false
- status := "-1"
- if tmppack["package_son"] != nil {
- status = "1"
- }
- isNewPkg[k] = isNew
- sortpackskey = append(sortpackskey, k)
- var pack []interface{}
- for _, cpack := range confpack {
- cpack, _ := cpack.(map[string]interface{})
- key := qu.ObjToString(cpack["key"])
- if key == "winner" || key == "bidamount" { //中标单位和中标金额winner_all特殊处理
- continue
- }
- tp := map[string]interface{}{
- "key": key,
- "descript": cpack["descript"],
- }
- if tmppack[fmt.Sprint(tp["key"])] != nil {
- tp["value"] = tmppack[qu.ObjToString(tp["key"])]
- } else {
- tp["value"] = ""
- }
- tp["status"] = status
- pack = append(pack, tp)
- }
- //特殊处理中标单位和中标金额
- winnerall := []interface{}{}
- if tmpWinnerAll, ok := tmppack["winner_all"].([]interface{}); ok && len(tmpWinnerAll) > 0 {
- for _, tmp := range tmpWinnerAll {
- tmpMap := tmp.(map[string]interface{})
- win := map[string]interface{}{
- "descript": "标段(包)中标单位",
- "key": "winner",
- "status": status,
- "value": qu.ObjToString(tmpMap["winner"]),
- }
- winnerall = append(winnerall, win)
- var bidamount interface{}
- if tmpMap["bidamount"] == nil {
- bidamount = ""
- } else {
- bidamount = strconv.FormatFloat(qu.Float64All(tmpMap["bidamount"]), 'f', -1, 64)
- }
- bid := map[string]interface{}{
- "descript": "标段(包)中标金额",
- "key": "bidamount",
- "status": status,
- "value": bidamount,
- }
- winnerall = append(winnerall, bid)
- }
- } else {
- winnerall = append(winnerall, map[string]interface{}{
- "descript": "标段(包)中标单位",
- "key": "winner",
- "status": "-1",
- "value": "",
- })
- winnerall = append(winnerall, map[string]interface{}{
- "descript": "标段(包)中标金额",
- "key": "bidamount",
- "status": "-1",
- "value": "",
- })
- }
- packs[k] = map[string]interface{}{
- "pack": pack,
- "packstatus": status,
- "winnerall": winnerall,
- }
- }
- }
- }
- sort.Strings(sortpackskey)
- var packages []map[string]interface{}
- var isNewPkgArr []bool
- for _, v := range sortpackskey {
- packages = append(packages, packs[v])
- isNewPkgArr = append(isNewPkgArr, isNewPkg[v])
- }
- return packages, sortpackskey, isNewPkgArr
- }
- //拼装标的物
- func setPurchasingMap(info map[string]interface{}) ([]interface{}, []map[string]interface{}) {
- purchasinglist, _ := util.BiaoZhu["purchasinglist"].([]interface{})
- var purchasinglists []interface{}
- //isNewPcl := []bool{} //记录子包是否是新增的
- var isNewAndStatus []map[string]interface{}
- if tmpcls, ok := info["purchasinglist"].([]interface{}); ok {
- for _, v := range tmpcls {
- if pcl, ok := v.(map[string]interface{}); ok {
- //isNew, _ := pcl["isnew"].(bool)
- isNew := false
- status := "-1"
- if pcl["purchasinglist_son"] != nil {
- status = "1"
- }
- //isNewPcl = append(isNewPcl, isNew)
- isNewAndStatus = append(isNewAndStatus, map[string]interface{}{"isnew": isNew, "status": status})
- var pcls []interface{}
- for _, ps := range purchasinglist {
- ps, _ := ps.(map[string]interface{})
- value := pcl[qu.ObjToString(ps["key"])]
- if value == nil {
- value = ""
- }
- tp := map[string]interface{}{
- "key": ps["key"],
- "descript": ps["descript"],
- "value": value,
- "status": status,
- }
- // if pcl[preKey+fmt.Sprint(tp["key"])] == nil {
- // tp["status"] = "-1"
- // } else {
- // tp["status"] = "1"
- // }
- pcls = append(pcls, tp)
- }
- purchasinglists = append(purchasinglists, pcls)
- }
- }
- }
- return purchasinglists, isNewAndStatus
- }
- //拼装中标候选人
- func setWorderMap(info map[string]interface{}) ([]interface{}, []map[string]interface{}) {
- //基本参数--中标候选人
- winnerorder, _ := util.BiaoZhu["winnerorder"].([]interface{})
- worders := []interface{}{}
- isNewAndStatus := []map[string]interface{}{}
- if tmpwds, ok := info["winnerorder"].([]interface{}); ok {
- for _, v := range tmpwds {
- if wd, ok := v.(map[string]interface{}); ok {
- //isNew, _ := wd["isnew"].(bool)
- isNew := false
- status := "-1"
- if wd["winnerorder_son"] != nil {
- status = "1"
- }
- isNewAndStatus = append(isNewAndStatus, map[string]interface{}{"isnew": isNew, "status": status})
- wds := []interface{}{}
- for _, cp := range winnerorder {
- cp, _ := cp.(map[string]interface{})
- value := wd[qu.ObjToString(cp["key"])]
- if value == nil {
- value = ""
- }
- tp := map[string]interface{}{
- "key": cp["key"],
- "descript": cp["descript"],
- "value": value,
- "status": status,
- }
- wds = append(wds, tp)
- }
- worders = append(worders, wds)
- }
- }
- }
- return worders, isNewAndStatus
- }
- //获取公告关联信息
- func setOtherInfo(info map[string]interface{}) (result, moreArr []map[string]interface{}) {
- if otherInfo, ok := info["info"].([]interface{}); ok && len(otherInfo) > 0 {
- //中标,成交、合同、招标(不含变更)
- /*
- [
- {},
- {},
- ]
- */
- zbArr := []map[string]interface{}{}
- cjArr := []map[string]interface{}{}
- htArr := []map[string]interface{}{}
- zbbArr := []map[string]interface{}{}
- for _, tmp := range otherInfo {
- tmpInfo := tmp.(map[string]interface{})
- tmpInfo["detail"] = qu.ObjToString(tmpInfo["title"]) + "</br>" + qu.ObjToString(tmpInfo["title"])
- toptype := tmpInfo["toptype"]
- subtype := tmpInfo["subtype"]
- ptime := ""
- tmpPtime := qu.Int64All(tmpInfo["publishtime"])
- if tmpPtime > 0 {
- ptime = qu.FormatDateByInt64(&tmpPtime, qu.Date_Full_Layout)
- }
- tmpInfo["publishtime_str"] = ptime
- if subtype == "中标" {
- zbArr = append(zbArr, tmpInfo)
- } else if subtype == "成交" {
- cjArr = append(cjArr, tmpInfo)
- } else if subtype == "合同" {
- htArr = append(htArr, tmpInfo)
- } else if toptype == "招标" && subtype != "变更" {
- zbbArr = append(zbbArr, tmpInfo)
- } else { //标注页不展示的信息,更多中展示
- moreArr = append(moreArr, map[string]interface{}{
- "publishtime": tmpInfo["publishtime_str"],
- "subtype": subtype,
- "title": tmpInfo["title"],
- "href": util.GetJyHref(qu.ObjToString(tmpInfo["id"])),
- })
- }
- }
- publishtime := qu.Float64All(info["publishtime"])
- //中标信息
- if zbLen := len(zbArr); zbLen > 0 {
- rzb := DealData(zbLen, publishtime, zbArr, &moreArr)
- result = append(result, rzb)
- }
- //成交
- if cjLen := len(cjArr); cjLen > 0 {
- rcj := DealData(cjLen, publishtime, cjArr, &moreArr)
- result = append(result, rcj)
- }
- //合同
- if htLen := len(htArr); htLen > 0 {
- rht := DealData(htLen, publishtime, htArr, &moreArr)
- result = append(result, rht)
- }
- result = append(result, zbbArr...)
- }
- return
- }
- func DealData(tmpLen int, publishtime float64, tmp []map[string]interface{}, moreArr *[]map[string]interface{}) (resultTmp map[string]interface{}) {
- if tmpLen == 1 || publishtime <= 0 { //相同类型只有一条或者原公告发布时间异常取第一条公告
- resultTmp = tmp[0]
- for _, t := range tmp[1:] { //将过滤掉的数据加入到更多中
- *moreArr = append(*moreArr, map[string]interface{}{
- "publishtime": t["publishtime_str"],
- "subtype": t["subtype"],
- "title": t["title"],
- "href": util.GetJyHref(qu.ObjToString(t["id"])),
- })
- }
- return
- } else {
- diff := float64(0) //记录差值
- index := 0
- for i, zb := range tmp {
- pTmp := qu.Float64All(zb["publishtime"])
- diffTmp := math.Abs(publishtime - pTmp) //绝对值
- if i == 0 {
- diff = diffTmp
- } else if diffTmp < diff { //记录较小差值的数据索引位置
- diff = diffTmp
- index = i
- } else { //将过滤掉的数据加入到更多中
- *moreArr = append(*moreArr, map[string]interface{}{
- "publishtime": zb["publishtime_str"],
- "subtype": zb["subtype"],
- "title": zb["title"],
- "href": util.GetJyHref(qu.ObjToString(zb["id"])),
- })
- }
- }
- resultTmp = tmp[index]
- }
- return
- }
- // GetNextDataId 获取当前数据下一条的id
- func GetNextDataId(id, coll, tid string) string {
- nextIdQuery := map[string]interface{}{
- "_id": map[string]interface{}{
- "$gt": mgo.StringTOBsonId(id),
- },
- }
- if tid != "" {
- nextIdQuery["s_usertaskid"] = tid
- }
- one, _ := util.Mgo.Find(coll, nextIdQuery, `{"_id":1}`, `{"_id":1}`, true, 0, 1)
- if len(*one) == 1 && len((*one)[0]) > 0 {
- return mgo.BsonIdToSId((*one)[0]["_id"])
- } else {
- delete(nextIdQuery, "_id")
- one, _ = util.Mgo.Find(coll, nextIdQuery, `{"_id":1}`, `{"_id":1}`, true, 0, 1)
- if len(*one) == 1 && len((*one)[0]) > 0 {
- return mgo.BsonIdToSId((*one)[0]["_id"])
- }
- }
- return id
- }
- // GetNextDataId1 质检下一条
- func GetNextDataId1(id, coll, tid string) string {
- nextIdQuery := map[string]interface{}{
- "_id": map[string]interface{}{
- "$gt": mgo.StringTOBsonId(id),
- },
- }
- if tid != "" {
- // 数据有任务 查询带上标注标记
- nextIdQuery["i_ckdata"] = 2
- nextIdQuery["s_usertaskid"] = tid
- } else {
- nextIdQuery["i_ckdata"] = 2
- }
- qu.Debug(nextIdQuery, coll)
- one, _ := util.Mgo.Find(coll, nextIdQuery, `{"_id":1}`, `{"_id":1}`, true, 0, 1)
- if len(*one) == 1 && len((*one)[0]) > 0 {
- return mgo.BsonIdToSId((*one)[0]["_id"])
- } else {
- delete(nextIdQuery, "_id")
- one, _ = util.Mgo.Find(coll, nextIdQuery, `{"_id":1}`, `{"_id":1}`, true, 0, 1)
- if len(*one) == 1 && len((*one)[0]) > 0 {
- return mgo.BsonIdToSId((*one)[0]["_id"])
- }
- }
- return id
- }
- func (f *Front) CheckList() {
- qu.Catch()
- if f.Method() == "POST" {
- user := f.GetSession("user").(map[string]interface{})
- iRole := qu.ObjToString(user["i_role"])
- gid := qu.ObjToString(user["s_groupid"])
- start, _ := f.GetInteger("start")
- limit, _ := f.GetInteger("length")
- draw, _ := f.GetInteger("draw")
- status := f.GetString("s_status")
- searchStr := f.GetString("search[value]")
- search := strings.TrimSpace(searchStr)
- query := map[string]interface{}{
- "s_stype": "user",
- }
- if iRole != "0" {
- query["s_groupid"] = gid
- }
- if status != "-1" { //任务状态
- query["s_status"] = status
- }
- if search != "" {
- query["$or"] = []interface{}{
- map[string]interface{}{"s_projectname": map[string]interface{}{"$regex": search}},
- }
- }
- qu.Debug("Query:", query)
- count := util.Mgo.Count(util.TASKCOLLNAME, query)
- list, _ := util.Mgo.Find(util.TASKCOLLNAME, query, map[string]interface{}{"_id": -1}, nil, false, start, limit)
- for _, l := range *list {
- if status := qu.ObjToString(l["s_status"]); status == "进行中" { //更新任务进度
- giveNum := qu.IntAll(l["i_givenum"])
- sourceinfo := qu.ObjToString(l["s_sourceinfo"])
- tagNum := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": mgo.BsonIdToSId(l["_id"]), "b_istag": true})
- progressFloat := float64(tagNum) / float64(giveNum)
- value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", progressFloat), 64)
- progress := fmt.Sprint(value*100) + "%"
- l["s_progress"] = progress
- }
- }
- f.ServeJson(map[string]interface{}{"draw": draw, "data": *list, "recordsFiltered": count, "recordsTotal": count})
- } else {
- _ = f.Render("project/check_task_list.html")
- }
- }
- func (f *Front) CheckData() {
- qu.Catch()
- pid := f.GetString("pid")
- tid := f.GetString("tid")
- stype := f.GetString("stype")
- sourceinfo := f.GetString("s_sourceinfo")
- datatype, _ := f.GetInteger("datatype")
- if f.Method() == "POST" {
- start, _ := f.GetInteger("start")
- limit, _ := f.GetInteger("length")
- draw, _ := f.GetInteger("draw")
- searchStr := f.GetString("search[value]")
- search := strings.TrimSpace(searchStr)
- query := make(map[string]interface{})
- if tid != "" {
- // 任务数据质检
- if stype == "group" {
- query["s_grouptaskid"] = tid
- } else {
- query["s_usertaskid"] = tid
- }
- query["b_istag"] = true
- } else {
- if stype == "notag" {
- if datatype == 1 {
- // 待分发数据
- query["b_isgivegroup"] = false
- query["b_istagging"] = false
- } else {
- // 标注数据
- query["i_ckdata"] = 2
- query["b_isgivegroup"] = false
- }
- } else if stype == "tag" {
- query["b_istagging"] = true //未达标
- query["i_ckdata"] = 2
- } else {
- query["i_ckdata"] = 2
- }
- }
- ckdata, err := f.GetInteger("i_ckdata")
- if err != nil {
- ckdata = -1
- }
- if ckdata == 0 {
- query["b_istag"] = false
- } else if ckdata == 1 {
- query["b_istag"] = true
- }
- if search != "" {
- query["$or"] = []interface{}{
- map[string]interface{}{"v_baseinfo.title": map[string]interface{}{"$regex": search}},
- }
- }
- qu.Debug("Query:", query)
- fields := map[string]interface{}{"v_baseinfo.title": 1, "b_check": 1, "i_ckdata": 1, "s_login": 1}
- info, _ := util.Mgo.Find(sourceinfo, query, `{"_id": 1}`, fields, false, start, limit)
- count := util.Mgo.Count(sourceinfo, query)
- qu.Debug(query, sourceinfo, count)
- f.ServeJson(map[string]interface{}{
- "draw": draw,
- "data": *info,
- "recordsFiltered": count,
- "recordsTotal": count,
- })
- } else {
- if tid == "" {
- //project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, pid, map[string]interface{}{"i_importnum": 1})
- //f.T["taskNum"] = (*project)["i_importnum"]
- query1 := make(map[string]interface{})
- if stype == "all" {
- query1["i_ckdata"] = 2
- } else if stype == "notag" {
- if datatype == 1 {
- // 待分发数据
- query1["b_isgivegroup"] = false
- query1["b_istagging"] = false
- } else {
- // 标注数据
- query1["i_ckdata"] = 2
- query1["b_isgivegroup"] = false
- }
- } else if stype == "tag" {
- query1["b_istagging"] = true //未达标
- query1["i_ckdata"] = 2
- } else {
- query1["i_ckdata"] = 2
- }
- qu.Debug(sourceinfo, query1)
- f.T["taskNum"] = util.Mgo.Count(sourceinfo, query1)
- query1["b_check"] = true // 已质检
- checkCount := util.Mgo.Count(sourceinfo, query1)
- f.T["taskTagNum"] = 0
- f.T["taskCheckNum"] = checkCount
- } else {
- task, _ := util.Mgo.FindById(util.TASKCOLLNAME, tid, map[string]interface{}{"i_givenum": 1})
- f.T["taskNum"] = (*task)["i_givenum"]
- tagCount, checkCount := 0, 0
- if stype == "group" {
- tagCount = util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "b_istag": true})
- checkCount = util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "b_check": true})
- } else {
- tagCount = util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid, "b_istag": true})
- checkCount = util.Mgo.Count(sourceinfo, map[string]interface{}{"s_usertaskid": tid, "b_check": true})
- }
- f.T["taskTagNum"] = tagCount
- f.T["taskCheckNum"] = checkCount
- }
- f.T["pid"] = pid
- f.T["tid"] = tid
- f.T["sourceinfo"] = sourceinfo
- f.T["stype"] = stype
- f.T["datatype"] = datatype
- _ = f.Render("project/check_data_list.html", &f.T)
- }
- }
- func (f *Front) CheckDetail() {
- qu.Catch()
- tid := f.GetString("tid")
- pid := f.GetString("pid")
- did := f.GetString("did")
- coll := f.GetString("s_sourceinfo")
- project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, pid, `{"v_fields": 1}`)
- if len(*project) > 0 {
- field := make(map[string]bool)
- vf := (*project)["v_fields"].(map[string]interface{})
- for k := range vf {
- field[k] = true
- }
- f.T["fields"] = field
- }
- qu.Debug(pid, did, coll)
- rep := getDetail(did, coll) //获取本条公告的信息
- f.T["otherInfo"] = rep["otherInfo"] //展示关联公告信息
- f.T["moreInfo"] = rep["moreInfo"] //更多关联公告信息
- f.T["pid"] = pid
- f.T["tid"] = tid
- f.T["did"] = did
- f.T["coll"] = coll
- f.T["info"] = rep["info"]
- f.T["common"] = rep["common"]
- f.T["worder"] = rep["worder"]
- f.T["packs"] = rep["packs"]
- f.T["packskey"] = rep["packskey"]
- f.T["ck_pclistag"] = rep["purchasingTag"]
- f.T["timeplace"] = rep["timeplace"]
- f.T["purchasinglist"] = rep["purchasinglist"]
- f.T["other"] = rep["other"]
- f.T["PurchasinglistField"] = util.PurchasinglistField
- f.T["WinnerorderField"] = util.WinnerorderField
- f.T["PackageField"] = util.PackageField
- f.T["topsubtype"] = util.TopSubStypeArr2
- f.T["ck_purchasinglist"] = rep["ck_purchasinglist"]
- f.T["ck_package"] = rep["ck_package"]
- f.T["ck_winnerorder"] = rep["ck_winnerorder"]
- f.T["worder_new"] = rep["worder_new"]
- f.T["pcl_new"] = rep["pcl_new"]
- f.T["pkg_new"] = rep["pkg_new"]
- f.T["nextid"] = GetNextDataId1(did, coll, tid) //下一条id
- _ = f.Render("project/check_detail.html", &f.T)
- }
- func (f *Front) CheckSave() {
- defer qu.Catch()
- success := false
- msg := ""
- user := f.GetSession("user").(map[string]interface{})
- username := qu.ObjToString(user["s_login"]) //当前登录用户
- userId := qu.ObjToString(user["id"]) //当前登录用户标识
- userRole := qu.ObjToString(user["i_role"]) //当前登录用户权限
- var obj []map[string]interface{}
- infoId := f.GetString("s_infoid")
- sourceInfo := f.GetString("s_sourceinfo")
- pid := f.GetString("pid")
- qu.Debug("Data ID:", infoId)
- project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, pid, map[string]interface{}{"s_name": 1, "v_fields": 1})
- data := f.GetString("data")
- err := json.Unmarshal([]byte(data), &obj)
- if err != nil {
- qu.Debug("Json Unmarshal Error")
- f.ServeJson(map[string]interface{}{"success": success, "msg": "解析数据失败"})
- return
- }
- tagSet := map[string]interface{}{} //被标注字段状态
- baseSet := map[string]interface{}{} //要修改的字段信息
- baseUnset := map[string]interface{}{} //要删除的字段信息
- if len(obj) == 1 { //单独保存某个一级
- content, ok := obj[0]["content"].([]interface{})
- if !ok || len(content) == 0 {
- f.ServeJson(map[string]interface{}{"success": success, "msg": "解析数据失败"})
- return
- }
- title := qu.ObjToString(obj[0]["title"])
- istag, _ := obj[0]["checkAllTag"].(bool)
- status := qu.IntAll(obj[0]["status"])
- switch title {
- case "基本字段":
- MarkBase(content, tagSet, baseSet, baseUnset)
- case "时间地点":
- MarkTimePlace(content, tagSet, baseSet, baseUnset)
- case "标的信息":
- MarkPurchasinglist(content, tagSet, baseSet, baseUnset, istag, status)
- case "多包信息":
- MarkPackage(content, tagSet, baseSet, baseUnset, status)
- case "中标候选人信息":
- MarkWonderorder(content, tagSet, baseSet, baseUnset, status)
- case "其余信息":
- MarkOther(content, tagSet, baseSet, baseUnset)
- }
- } else {
- for j, val := range obj {
- content, ok := val["content"].([]interface{})
- status := qu.IntAll(val["status"])
- if !ok {
- qu.Debug("Content Error")
- continue
- }
- istag, _ := val["checkAllTag"].(bool)
- if j == 0 { //基本信息
- MarkBase(content, tagSet, baseSet, baseUnset)
- } else if j == 1 { //时间地点
- MarkTimePlace(content, tagSet, baseSet, baseUnset)
- } else if j == 2 { //标的物
- MarkPurchasinglist(content, tagSet, baseSet, baseUnset, istag, status)
- } else if j == 3 { //多包
- MarkPackage(content, tagSet, baseSet, baseUnset, status)
- } else if j == 4 { //候选人
- MarkWonderorder(content, tagSet, baseSet, baseUnset, status)
- } else { //其余信息
- MarkOther(content, tagSet, baseSet, baseUnset)
- }
- }
- }
- dataInfo, _ := util.Mgo.FindById(sourceInfo, infoId, map[string]interface{}{"v_baseinfo": 1, "v_taginfo": 1}) //查询标注保存前的原始信息
- tagInfo, _ := (*dataInfo)["v_taginfo"].(map[string]interface{})
- baseInfo, _ := (*dataInfo)["v_baseinfo"].(map[string]interface{})
- if tagInfo != nil && len(tagInfo) > 0 {
- for field, tmpStatus := range tagSet { //比对本次标注信息和历史标注信息
- status := qu.IntAll(tmpStatus) //此次被标注字段的状态
- markedStatus := qu.IntAll(tagInfo[field]) //历史标注状态
- if status == 1 && markedStatus != 0 { //此次标注结果为正确,且有历史标注记录,不做修改
- qu.Debug("已标注字段field---", field)
- //delete(tagSet, field)
- delete(baseSet, field)
- //continue
- }
- }
- }
- allTagFields := map[string]interface{}{} //记录此此标注所有标注信息,用于日志记录
- for k, _ := range tagSet {
- allTagFields[k] = true
- }
- for k, v := range baseSet {
- allTagFields[k] = v
- }
- for k, _ := range baseUnset {
- allTagFields[k] = nil
- }
- qu.Debug("allTagFields===", allTagFields)
- qu.Debug("tagSet===", tagSet)
- // 质检时,标注标记变成质检标记
- checkFields, _ := (*project)["v_fields"].(map[string]interface{})
- checkSet := make(map[string]interface{})
- for k := range checkFields {
- checkSet[k] = tagSet[k]
- }
- if len(checkSet) > 0 || baseInfo["purchasinglist_alltag"] != nil { //purchasinglist_alltag特殊处理
- //1、更新数据源信息
- setResult := map[string]interface{}{ //更新字段集
- "i_updatetime": time.Now().Unix(),
- "b_check": true,
- "s_checkid": userId,
- "b_istag": true,
- "b_isgivegroup": true,
- "b_isgiveuser": true,
- "s_userid": userId,
- }
- //for field, val := range tagSet { //更新质检字段
- // setResult["v_taginfo."+field] = val
- //}
- setResult["v_checkinfo"] = checkSet
- for field, val := range baseSet { //更新基本字段
- setResult["v_baseinfo."+field] = val
- }
- baseUnsetResult := map[string]interface{}{} //删除字段集
- for field, _ := range baseUnset { //删除基本字段
- baseUnsetResult["v_baseinfo."+field] = ""
- }
- set := map[string]interface{}{
- "$set": setResult,
- }
- if len(baseUnsetResult) > 0 {
- set["$unset"] = baseUnsetResult
- }
- qu.Debug("set---", set)
- success = util.Mgo.UpdateById(sourceInfo, infoId, set)
- //2、更新marked表
- tmp, _ := util.Mgo.FindById(sourceInfo, infoId, map[string]interface{}{"v_baseinfo": 1, "v_taginfo": 1, "i_ckdata": 1})
- qu.Debug("infoId:", infoId)
- delete(*tmp, "_id")
- (*tmp)["updatetime"] = time.Now().Unix()
- b := util.Mgo.Update(util.AllToColl, map[string]interface{}{"_id": mgo.StringTOBsonId(infoId)}, map[string]interface{}{"$set": tmp}, true, false)
- qu.Debug("Update Marked:", b)
- }
- //3、保存标注日志
- b := SaveLog(infoId, "", username, userId, userRole, qu.ObjToString((*project)["s_name"]), "质检", baseInfo, allTagFields)
- qu.Debug("Save Log:", b)
- f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
- }
- func (f *Front) CheckResult() {
- qu.Catch()
- pid := f.GetString("pid")
- tid := f.GetString("tid")
- sourceinfo := f.GetString("s_sourceinfo")
- stype := f.GetString("stype")
- datatype, _ := f.GetInteger("datatype")
- task, _ := util.Mgo.FindById(util.TASKCOLLNAME, tid, map[string]interface{}{"i_givenum": 1})
- projcet, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, pid, map[string]interface{}{"v_fields": 1})
- //tagCount := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "b_istag": true})
- //checkCount := util.Mgo.Count(sourceinfo, map[string]interface{}{"s_grouptaskid": tid, "b_check": true})
- allNum := (*task)["i_givenum"] //任务数据量
- markNum, checkNum, checkNumR := 0, 0, 0 // 标注数量, 审核数据量, 审核数据完全正确的数据量
- cmaps := make(map[string]int) // 标注字段整体准确率
- umaps := make(map[string]interface{}) // 按人员 字段准确率
- for k := range (*projcet)["v_fields"].(map[string]interface{}) {
- cmaps[k] = 0
- }
- sess := util.Mgo.GetMgoConn()
- defer util.Mgo.DestoryMongoConn(sess)
- query := make(map[string]interface{})
- if tid == "" {
- query1 := make(map[string]interface{})
- if stype == "all" {
- query1["i_ckdata"] = 2
- } else if stype == "notag" {
- if datatype == 1 {
- // 待分发数据
- query1["b_isgivegroup"] = false
- query1["b_istagging"] = false
- } else {
- // 标注数据
- query1["i_ckdata"] = 2
- query1["b_isgivegroup"] = false
- }
- } else if stype == "tag" {
- query1["b_istagging"] = true //未达标
- query1["i_ckdata"] = 2
- }
- f.T["taskNum"] = util.Mgo.Count(sourceinfo, query1)
- } else {
- if stype == "group" {
- query["s_grouptaskid"] = tid
- } else {
- query["s_usertaskid"] = tid
- }
- }
- query["b_check"] = true
- qu.Debug(query)
- checkNum = util.Mgo.Count(sourceinfo, query)
- result := sess.DB(util.Mgo.DbName).C(sourceinfo).Find(query).Iter()
- if checkNum == 0 {
- f.ServeJson(map[string]interface{}{"rep": false, "msg": "无质检审核数据!"})
- return
- }
- for tmp := make(map[string]interface{}); result.Next(&tmp); markNum++ {
- user := qu.ObjToString(tmp["s_login"])
- var up map[string]int
- if umaps[user] == nil {
- up = make(map[string]int)
- } else {
- up = umaps[user].(map[string]int)
- }
- up["ck_count"] += 1
- umaps[user] = up
- if tmp["b_check"].(bool) {
- if f, ok := tmp["v_checkinfo"].(map[string]interface{}); ok {
- flag := true // 数据整体准确率
- // 按人员统计字段准备率
- var up map[string]int
- if umaps[user] == nil {
- up = make(map[string]int)
- } else {
- up = umaps[user].(map[string]int)
- }
- for k1 := range cmaps {
- if qu.IntAll(f[k1]) == 1 {
- cmaps[k1] += 1 // 字段整体正确率
- up[k1] += 1
- } else {
- flag = false
- }
- }
- up["re_count"] += 1
- umaps[user] = up
- if flag {
- checkNumR++
- up["re_rg_count"] += 1
- }
- }
- }
- }
- qu.Debug(cmaps)
- qu.Debug(umaps)
- // 前台页面数据
- dataSource := make(map[string]interface{})
- var userSelect []string
- var dataSelect []map[string]interface{}
- userSelect = append(userSelect, "全部")
- tmp := make(map[string]interface{})
- tmp["name"] = "全部"
- tmp["num1"] = allNum
- tmp["num2"] = checkNum
- tmp["num3"] = checkNumR
- tmp["num4"] = CountPr(checkNumR, checkNum)
- dataSelect = append(dataSelect, tmp)
- for k, v := range (*projcet)["v_fields"].(map[string]interface{}) {
- tmp1 := make(map[string]interface{})
- tmp1["name"] = v
- tmp1["num1"] = markNum
- tmp1["num2"] = checkNum
- tmp1["num3"] = cmaps[k]
- tmp1["num4"] = CountPr(cmaps[k], checkNum)
- dataSelect = append(dataSelect, tmp1)
- }
- dataSource["全部"] = dataSelect
- for k1, v1 := range umaps {
- if v2, o := v1.(map[string]int); o {
- userSelect = append(userSelect, k1)
- var dataSelect1 []map[string]interface{}
- tmp2 := make(map[string]interface{})
- tmp2["name"] = "全部"
- tmp2["num1"] = v2["ck_count"]
- tmp2["num2"] = v2["re_count"]
- tmp2["num3"] = v2["re_rg_count"]
- tmp2["num4"] = CountPr(v2["re_rg_count"], v2["re_count"])
- dataSelect1 = append(dataSelect1, tmp2)
- for k, v := range (*projcet)["v_fields"].(map[string]interface{}) {
- tmp1 := make(map[string]interface{})
- tmp1["name"] = v
- tmp1["num1"] = v2["ck_count"]
- tmp1["num2"] = v2["re_count"]
- tmp1["num3"] = v2[k]
- tmp1["num4"] = CountPr(v2[k], v2["re_count"])
- dataSelect1 = append(dataSelect1, tmp1)
- }
- dataSource[k1] = dataSelect1
- }
- }
- f.T["pid"] = pid
- f.T["tid"] = tid
- f.T["taskNum"] = allNum
- f.T["taskTagNum"] = markNum
- f.T["taskCheckNum"] = checkNum
- f.T["taskCheckRight"] = checkNumR
- f.T["tableData"] = dataSource
- f.T["userSelect"] = userSelect
- _ = f.Render("project/check_result.html", &f.T)
- }
- // CountPr 计算百分比
- func CountPr(c1, c2 int) string {
- decimal.DivisionPrecision = 2
- if c1 == 0 || c2 == 0 {
- return "0"
- }
- d := decimal.NewFromInt32(int32(c1)).Div(decimal.NewFromInt32(int32(c2))).Mul(decimal.NewFromInt32(100))
- return d.String() + "%"
- }
|