package front import ( "encoding/json" "fmt" qu "qfw/util" "strings" "time" "util" ) // DataMark 数据标注 func (f *Front) DataMark() { defer qu.Catch() success := false msg := "" //user := f.GetSession("user").(map[string]interface{}) //username := qu.ObjToString(user["s_login"]) //当前登录用户 obj := []map[string]interface{}{} infoId := f.GetString("s_infoid") userTaskId := f.GetString("s_usertaskid") data := f.GetString("data") err := json.Unmarshal([]byte(data), &obj) if err != nil { f.ServeJson(map[string]interface{}{"success": success, "msg": "解析数据失败"}) return } tagSet := map[string]interface{}{} //被标注字段状态 baseSet := map[string]interface{}{} //要修改的字段信息 baseUnset := map[string]interface{}{} //要删除的字段信息 //isSaveMarked := false 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 "基本字段": BzJBZD_New(content, tagSet, baseSet, baseUnset) case "时间地点": BzSJDD_New(content, tagSet, baseSet, baseUnset) case "标的信息": BzBDXX_New(content, tagSet, baseSet, baseUnset, istag, status) case "多包信息": BzDBXX_New(content, tagSet, baseSet, baseUnset, status) case "中标候选人信息": BzZBHXRXX_New(content, tagSet, baseSet, baseUnset, status) case "其余信息": BzQYXX_New(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 { //基本信息 BzJBZD_New(content, tagSet, baseSet, baseUnset) } else if j == 1 { //时间地点 BzSJDD_New(content, tagSet, baseSet, baseUnset) } else if j == 2 { //标的物 BzBDXX_New(content, tagSet, baseSet, baseUnset, istag, status) } else if j == 3 { //多包 BzDBXX_New(content, tagSet, baseSet, baseUnset, status) } else if j == 4 { //候选人 BzZBHXRXX_New(content, tagSet, baseSet, baseUnset, status) } else { //其余信息 BzQYXX_New(content, tagSet, baseSet, baseUnset) } } } userTask, _ := util.Mgo.FindById(util.TASKCOLLNAME, userTaskId, map[string]interface{}{"s_personid": 1, "s_personname": 1, "s_projectname": 1, "s_sourceinfo": 1}) if sourceInfo := qu.ObjToString((*userTask)["s_sourceinfo"]); sourceInfo != "" { //数据源表 dataInfo, _ := util.Mgo.FindById(sourceInfo, infoId, map[string]interface{}{"v_baseinfo": 1, "v_taginfo": 1}) //查询标注保存前的原始信息 if tagInfo, ok := (*dataInfo)["v_taginfo"].(map[string]interface{}); ok && 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 } else { qu.Debug("未标注字段field---", field, status) } } } if len(tagSet) > 0 { //1、更新数据源信息 setResult := map[string]interface{}{ //更新字段集 "i_updatetime": time.Now().Unix(), "i_ckdata": 2, "b_istag": true, } for field, val := range tagSet { //更新标注字段 setResult["v_taginfo."+field] = val } 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表 //3、保存标注记录 } } f.ServeJson(map[string]interface{}{"success": success, "msg": msg}) } func BzJBZD_New(content []interface{}, tagSet, baseSet, baseUnset map[string]interface{}) { defer qu.Catch() info, _ := content[0].(map[string]interface{}) if uInputs, ok := info["uInput"].([]interface{}); ok { for _, tmp := range uInputs { if tmpMap, ok := tmp.(map[string]interface{}); ok { if status := qu.IntAll(tmpMap["status"]); status != -1 { key := qu.ObjToString(tmpMap["key"]) //字段 if key == "" { continue } if status == 2 { //新增、修改、删除 input := tmpMap["input"] //值 if key == "bidamounttype" || key == "subtype" || key == "attach_discern" || key == "attach_ext" || key == "isrepeat" { //附件识别、抽取select input = tmpMap["select"] } if input == "" { //删除原字段 baseUnset[key] = "" } else { //修改原字段 if key == "budget" || key == "bidamount" || key == "biddiscount" { input = qu.Float64All(input) //input, _ = strconv.ParseFloat(qu.ObjToString(input), 32) } if key == "subtype" { if topsubtype := strings.Split(qu.ObjToString(input), "-"); len(topsubtype) == 2 { baseSet["toptype"] = topsubtype[0] baseSet[key] = topsubtype[1] } } else { baseSet[key] = input } } } tagSet[key] = status //记录被标注状态 } } } } qu.Debug("tagSet===", tagSet) qu.Debug("baseSet===", baseSet) qu.Debug("baseUnset===", baseUnset) } func BzSJDD_New(content []interface{}, tagSet, baseSet, baseUnset map[string]interface{}) { info, _ := content[0].(map[string]interface{}) if uInputs, ok := info["uInput"].([]interface{}); ok { for _, tmp := range uInputs { if tmpMap, ok := tmp.(map[string]interface{}); ok { if status := qu.IntAll(tmpMap["status"]); status != -1 { key := qu.ObjToString(tmpMap["key"]) //字段 if key == "" { continue } if status == 2 { //新增、修改、删除 input := tmpMap["input"] //值 if input == "" { baseUnset[key] = "" } else { if key == "bidopentime" || key == "publishtime" || key == "bidendtime" || key == "project_startdate" || key == "project_completedate" { inputTmp, _ := time.ParseInLocation(qu.Date_Full_Layout, input.(string), time.Local) input = inputTmp.Unix() } else if key == "project_duration" { input = qu.IntAll(input) } baseSet[key] = input } } tagSet[key] = status } } } } qu.Debug("tagSet===", tagSet) qu.Debug("baseSet===", baseSet) qu.Debug("baseUnset===", baseUnset) } func BzBDXX_New(content []interface{}, tagSet, baseSet, baseUnset map[string]interface{}, istag bool, status int) { if status == -1 { return } baseSet["purchasinglist_alltag"] = istag //标的信息是否标注完全 purchasinglist := []interface{}{} delpclson := 0 for _, con := range content { info, _ := con.(map[string]interface{}) isNew, _ := info["isnew"].(bool) //是否是新增子包 pclSonStatus := qu.IntAll(info["status"]) if pclSonStatus == 4 { delpclson++ } if uInputs, ok := info["uInput"].([]interface{}); ok { result := map[string]interface{}{ "isnew": isNew, } for _, tmp := range uInputs { if tmpMap, ok := tmp.(map[string]interface{}); ok { key := qu.ObjToString(tmpMap["key"]) //字段 input := tmpMap["input"] //值 //status := qu.IntAll(tmpMap["status"]) isNull := false if input == "" { //判断前台页面是否填值,无值不进行字段存储 isNull = true } else if key == "number" || key == "unitprice" || key == "totalprice" { input = qu.Float64All(input) } if !isNull { //避免数字类型的字段在没有填写值的情况默认给0 result[key] = input } } } if pclSonStatus != -1 { //没有标注的标的信息不打标记 result["purchasinglist_son"] = pclSonStatus } if len(result) > 0 && pclSonStatus != 4 { purchasinglist = append(purchasinglist, result) } } } qu.Debug("purchasinglist", len(purchasinglist)) if len(purchasinglist)+delpclson == len(content) { if len(purchasinglist) > 0 { baseSet["purchasinglist"] = purchasinglist } if len(content) > 0 && delpclson == len(content) { //只有删除 baseUnset["purchasinglist"] = "" } tagSet["purchasinglist"] = status } else { qu.Debug("Purchasinglist Tag Error") } qu.Debug("tagSet===", tagSet) qu.Debug("baseSet===", baseSet) qu.Debug("baseUnset===", baseUnset) } func BzDBXX_New(content []interface{}, tagSet, baseSet, baseUnset map[string]interface{}, status int) { if status == -1 { return } pkgs := map[string]interface{}{} newNum := 1 delpkgson := 0 //记录子包删除个数 for _, con := range content { info, _ := con.(map[string]interface{}) pkgSonStatus := qu.IntAll(info["status"]) if pkgSonStatus == 4 { delpkgson++ } num := fmt.Sprint(info["num"]) //包号 isNew, _ := info["isnew"].(bool) //是否是新增子包 if isNew { //新增子包新建包名 num = "new" + fmt.Sprint(newNum) newNum++ } if uInputs, ok := info["uInput"].([]interface{}); ok { result := map[string]interface{}{ "isnew": isNew, } winnerArr := []interface{}{} bidamountArr := []interface{}{} for _, tmp := range uInputs { if tmpMap, ok := tmp.(map[string]interface{}); ok { key := qu.ObjToString(tmpMap["key"]) //字段 input := tmpMap["input"] //值 isNull := false //记录字段是否有值 if key == "bidamounttype" { input = tmpMap["select"] } else { if input == "" { //判断前台页面是否填值,无值不进行字段存储 isNull = true } else if key == "bidamount" || key == "budget" { input = qu.Float64All(input) //input, _ = strconv.ParseFloat(qu.ObjToString(input), 32) } } if key == "winner" { if isNull { winnerArr = append(winnerArr, nil) } else { winnerArr = append(winnerArr, input) } continue } else if key == "bidamount" { if isNull { bidamountArr = append(bidamountArr, nil) } else { bidamountArr = append(bidamountArr, input) } continue } if !isNull { //避免数字类型的字段在没有填写值的情况默认给0 result[key] = input } } } winner_all := []interface{}{} if len(winnerArr) == len(bidamountArr) { for i, w := range winnerArr { b := bidamountArr[i] wbMap := map[string]interface{}{} if w != nil { wbMap["winner"] = w } if b != nil { wbMap["bidamount"] = b } if len(wbMap) > 0 { winner_all = append(winner_all, wbMap) } } } if len(winner_all) > 0 { result["winner_all"] = winner_all } result["package_son"] = pkgSonStatus if len(result) > 0 && pkgSonStatus != 4 { //要删除的子包不再保存 pkgs[num] = result } } } qu.Debug("pkgs", len(pkgs)) if len(pkgs)+delpkgson == len(content) { if len(pkgs) > 0 { baseSet["package"] = pkgs } if len(content) > 0 && delpkgson == len(content) { //只有删除 baseUnset["package"] = "" } tagSet["package"] = status } else { qu.Debug("Package Tag Error") } qu.Debug("tagSet===", tagSet) qu.Debug("baseSet===", baseSet) qu.Debug("baseUnset===", baseUnset) } func BzZBHXRXX_New(content []interface{}, tagSet, baseSet, baseUnset map[string]interface{}, status int) { if status == -1 { return } winnerorder := []interface{}{} delwodrson := 0 for _, con := range content { info, _ := con.(map[string]interface{}) isNew, _ := info["isnew"].(bool) //是否是新增子包 wodrSonStatus := qu.IntAll(info["status"]) if wodrSonStatus == 4 { delwodrson++ } if uInputs, ok := info["uInput"].([]interface{}); ok { result := map[string]interface{}{ "isnew": isNew, } for _, tmp := range uInputs { if tmpMap, ok := tmp.(map[string]interface{}); ok { key := qu.ObjToString(tmpMap["key"]) //字段 input := tmpMap["input"] //值 isNull := false if input == "" { //判断前台页面是否填值,无值不进行字段存储 isNull = true } else if key == "price" { input = qu.Float64All(input) //input, _ = strconv.ParseFloat(qu.ObjToString(input), 32) } if !isNull { //避免数字类型的字段在没有填写值的情况默认给0 result[key] = input } result["winnerorder_son"] = wodrSonStatus } } if len(result) > 0 && wodrSonStatus != 4 { winnerorder = append(winnerorder, result) } } } qu.Debug("winnerorder", len(winnerorder)) if len(winnerorder)+delwodrson == len(content) { if len(winnerorder) > 0 { baseSet["winnerorder"] = winnerorder } if len(content) > 0 && delwodrson == len(content) { //只有删除 baseUnset["winnerorder"] = "" } tagSet["winnerorder"] = status } else { qu.Debug("Winnerorder Tag Error") } qu.Debug("tagSet===", tagSet) qu.Debug("baseSet===", baseSet) qu.Debug("baseUnset===", baseUnset) } func BzQYXX_New(content []interface{}, tagSet, baseSet, baseUnset map[string]interface{}) { info, _ := content[0].(map[string]interface{}) if uInputs, ok := info["uInput"].([]interface{}); ok { for _, tmp := range uInputs { if tmpMap, ok := tmp.(map[string]interface{}); ok { if status := qu.IntAll(tmpMap["status"]); status != -1 { key := qu.ObjToString(tmpMap["key"]) //字段 if key == "" { continue } if status == 2 { //新增、修改、删除 input := tmpMap["input"] //值 if key == "isppp" || key == "contract_guarantee" || key == "bid_guarantee" { input = tmpMap["select"] } if input == "" { baseUnset[key] = "" } else { if key == "signaturedate" { inputTmp, _ := time.ParseInLocation(qu.Date_Full_Layout, input.(string), time.Local) input = inputTmp.Unix() } else if key == "bid_bond" || key == "contract_bond" || key == "supervisorrate" || key == "agencyrate" || key == "docamount" || key == "agencyfee" { input = qu.Float64All(input) //input, _ = strconv.ParseFloat(qu.ObjToString(input), 32) } baseSet[key] = input } } tagSet[key] = status } } } } qu.Debug("tagSet===", tagSet) qu.Debug("baseSet===", baseSet) qu.Debug("baseUnset===", baseUnset) }