|
@@ -3,6 +3,7 @@ package front
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
"fmt"
|
|
|
+ "github.com/shopspring/decimal"
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
|
"math"
|
|
|
mgo "mongodb"
|
|
@@ -588,16 +589,15 @@ func (f *Front) CheckData() {
|
|
|
pid := f.GetString("pid")
|
|
|
tid := f.GetString("tid")
|
|
|
sourceinfo := f.GetString("s_sourceinfo")
|
|
|
-
|
|
|
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 := map[string]interface{}{
|
|
|
- "s_grouptaskid": tid,
|
|
|
- "b_istag": true,
|
|
|
+ query := map[string]interface{}{"b_istag": true}
|
|
|
+ if tid != "" {
|
|
|
+ query["s_grouptaskid"] = tid
|
|
|
}
|
|
|
if search != "" {
|
|
|
query["$or"] = []interface{}{
|
|
@@ -616,15 +616,23 @@ func (f *Front) CheckData() {
|
|
|
"recordsTotal": count,
|
|
|
})
|
|
|
} else {
|
|
|
-
|
|
|
- task, _ := util.Mgo.FindById(util.TASKCOLLNAME, tid, map[string]interface{}{"i_givenum": 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})
|
|
|
+ if tid == "" {
|
|
|
+ project, _ := util.Mgo.FindById(util.PROJECTCOLLNAME, pid, map[string]interface{}{"i_importnum": 1})
|
|
|
+ f.T["taskNum"] = (*project)["i_importnum"]
|
|
|
+ tagCount := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_istag": true})
|
|
|
+ checkCount := util.Mgo.Count(sourceinfo, map[string]interface{}{"b_check": true})
|
|
|
+ f.T["taskTagNum"] = tagCount
|
|
|
+ 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 := 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})
|
|
|
+ f.T["taskTagNum"] = tagCount
|
|
|
+ f.T["taskCheckNum"] = checkCount
|
|
|
+ }
|
|
|
f.T["pid"] = pid
|
|
|
f.T["tid"] = tid
|
|
|
- f.T["taskNum"] = (*task)["i_givenum"]
|
|
|
- f.T["taskTagNum"] = tagCount
|
|
|
- f.T["taskCheckNum"] = checkCount
|
|
|
f.T["sourceinfo"] = sourceinfo
|
|
|
_ = f.Render("project/check_data_list.html", &f.T)
|
|
|
}
|
|
@@ -777,22 +785,23 @@ func (f *Front) CheckSave() {
|
|
|
|
|
|
// 质检时,标注标记变成质检标记
|
|
|
checkFields, _ := (*project)["v_fields"].(map[string]interface{})
|
|
|
- tagSet = map[string]interface{}{}
|
|
|
+ checkSet := make(map[string]interface{})
|
|
|
for k := range checkFields {
|
|
|
- tagSet[k] = true
|
|
|
+ checkSet[k] = tagSet[k]
|
|
|
}
|
|
|
|
|
|
- if len(tagSet) > 0 || baseInfo["purchasinglist_alltag"] != nil { //purchasinglist_alltag特殊处理
|
|
|
+ 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"] = tagSet
|
|
|
+ setResult["v_checkinfo"] = checkSet
|
|
|
for field, val := range baseSet { //更新基本字段
|
|
|
setResult["v_baseinfo."+field] = val
|
|
|
}
|
|
@@ -821,3 +830,134 @@ func (f *Front) CheckSave() {
|
|
|
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")
|
|
|
+ qu.Debug("----------", tid, pid)
|
|
|
+ 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 := map[string]interface{}{"s_grouptaskid": tid, "b_istag": true}
|
|
|
+ result := sess.DB(util.Mgo.DbName).C(sourceinfo).Find(query).Iter()
|
|
|
+ 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) {
|
|
|
+ checkNum++
|
|
|
+ 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
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if checkNum == 0 {
|
|
|
+ f.ServeJson(map[string]interface{}{"rep": false, "msg": "无质检审核数据!"})
|
|
|
+ return
|
|
|
+ }
|
|
|
+ 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 := range (*projcet)["v_fields"].(map[string]interface{}) {
|
|
|
+ tmp1 := make(map[string]interface{})
|
|
|
+ tmp1["name"] = k
|
|
|
+ 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 := range (*projcet)["v_fields"].(map[string]interface{}) {
|
|
|
+ tmp1 := make(map[string]interface{})
|
|
|
+ tmp1["name"] = k
|
|
|
+ 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() + "%"
|
|
|
+}
|