123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080 |
- 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{}{
- "i_ckdata": 2,
- "_id": map[string]interface{}{
- "$gt": mgo.StringTOBsonId(id),
- },
- }
- if tid != "" {
- nextIdQuery["s_usertaskid"] = tid
- }
- qu.Debug(nextIdQuery, coll)
- one, _ := util.Mgo.Find(coll, nextIdQuery, `{"_id":1}`, `{"_id":1}`, true, 0, 1)
- if one != nil && len(*one) == 1 {
- return mgo.BsonIdToSId((*one)[0]["_id"])
- } else {
- delete(nextIdQuery, "_id")
- one, _ = util.Mgo.Find(coll, nextIdQuery, `{"_id":1}`, `{"_id":1}`, true, 0, 1)
- if one != nil && len(*one) == 1 {
- return mgo.BsonIdToSId((*one)[0]["_id"])
- }
- }
- return id
- }
- // GetNextDataId1 质检下一条
- func GetNextDataId1(id, coll, tid string) string {
- nextIdQuery := map[string]interface{}{
- "b_istag": true,
- "_id": map[string]interface{}{
- "$gt": mgo.StringTOBsonId(id),
- },
- }
- if tid != "" {
- nextIdQuery["s_usertaskid"] = tid
- }
- qu.Debug(nextIdQuery, coll)
- one, _ := util.Mgo.Find(coll, nextIdQuery, `{"_id":1}`, `{"_id":1}`, true, 0, 1)
- if one != nil && len(*one) == 1 {
- return mgo.BsonIdToSId((*one)[0]["_id"])
- } else {
- delete(nextIdQuery, "_id")
- one, _ = util.Mgo.Find(coll, nextIdQuery, `{"_id":1}`, `{"_id":1}`, true, 0, 1)
- if one != nil && len(*one) == 1 {
- 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
- }
- }
- 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
- }
- 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,
- }
- //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() + "%"
- }
|