|
@@ -176,7 +176,7 @@ func (p *ProjectTask) startProjectMerge(info *Info, tmp map[string]interface{})
|
|
|
ex := 0
|
|
|
resArr := []*ProjectInfo{}
|
|
|
for _, res := range resN {
|
|
|
- choose, e := CompareStatus(resN[0], info)
|
|
|
+ choose, e := p.CompareStatus(resN[0], info)
|
|
|
if !choose {
|
|
|
ex = e
|
|
|
resArr = append(resArr, res)
|
|
@@ -471,7 +471,7 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
|
|
|
set["bidopentime"] = bidopentime
|
|
|
}
|
|
|
if thisinfo.ProjectName != "" {
|
|
|
- set["s_projectname"] = tmp["projectname"] //兼容老版本
|
|
|
+ set["s_projectname"] = tmp["projectname"]
|
|
|
}
|
|
|
now := time.Now().Unix()
|
|
|
set["createtime"] = now
|
|
@@ -498,7 +498,9 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
|
|
|
}
|
|
|
|
|
|
//招标类型
|
|
|
+ p.mapBidLock.Lock()
|
|
|
bt := bidtype[thisinfo.SubType]
|
|
|
+ p.mapBidLock.Unlock()
|
|
|
if bt == "" {
|
|
|
bt = "招标"
|
|
|
}
|
|
@@ -506,6 +508,18 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
|
|
|
set["bidstatus"] = thisinfo.SubType
|
|
|
|
|
|
p1, pkg := p.NewCachePinfo(pId, thisinfo, bt)
|
|
|
+ //招标信息是中标或者成交,保存bidstatus、budget、bidamount
|
|
|
+ if thisinfo.SubType == "中标" || thisinfo.SubType == "成交" {
|
|
|
+ p1.IdStatusInfo = map[string]map[string]interface{}{
|
|
|
+ thisinfo.Id: {
|
|
|
+ "projectname": thisinfo.ProjectName,
|
|
|
+ "bidstatus": thisinfo.SubType,
|
|
|
+ "budget": thisinfo.Budget,
|
|
|
+ "bidamount": thisinfo.Bidamount,
|
|
|
+ },
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if len(thisinfo.Subscopeclass) > 0 {
|
|
|
s_subscopeclass := strings.Join(thisinfo.Subscopeclass, ",")
|
|
|
set["s_subscopeclass"] = s_subscopeclass
|
|
@@ -579,7 +593,7 @@ func (p *ProjectTask) PushListInfo(tmp map[string]interface{}, infoid string) bs
|
|
|
func (p *ProjectTask) NewCachePinfo(id primitive.ObjectID, thisinfo *Info, bidtype string) (ProjectInfo, map[string]interface{}) {
|
|
|
pkg := map[string]interface{}{}
|
|
|
if thisinfo.HasPackage {
|
|
|
- pkg, _, _ = PackageFormat(thisinfo, nil)
|
|
|
+ pkg = PackageFormat(thisinfo, nil)
|
|
|
}
|
|
|
p1 := ProjectInfo{
|
|
|
Id: id,
|
|
@@ -635,6 +649,8 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
|
|
|
if thisinfo.Publishtime > pInfo.LastTime {
|
|
|
pInfo.LastTime = thisinfo.Publishtime
|
|
|
set["lasttime"] = thisinfo.Publishtime
|
|
|
+ p.mapBidLock.Lock()
|
|
|
+ defer p.mapBidLock.Unlock()
|
|
|
bt := bidtype[thisinfo.SubType]
|
|
|
if bt != "" {
|
|
|
set["bidtype"] = bt
|
|
@@ -653,6 +669,19 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
|
|
|
set["bidstatus"] = "其它"
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ //废标、流标 处理时间
|
|
|
+ if thisinfo.SubType == "流标" || thisinfo.SubType == "废标" {
|
|
|
+ pInfo.FirstTime = thisinfo.Publishtime
|
|
|
+ pInfo.Bidopentime = int64(0)
|
|
|
+ pInfo.LastTime = thisinfo.Publishtime
|
|
|
+
|
|
|
+ set["firsttime"] = thisinfo.Publishtime
|
|
|
+ set["zbtime"] = int64(0)
|
|
|
+ set["publishtime"] = thisinfo.Publishtime
|
|
|
+ set["bidopentime"] = int64(0)
|
|
|
+ }
|
|
|
+
|
|
|
//异常标记
|
|
|
if ex > 0 {
|
|
|
set["exception"] = ex
|
|
@@ -698,10 +727,6 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
|
|
|
if pInfo.Buyer == "" {
|
|
|
set["buyerclass"] = ""
|
|
|
}
|
|
|
- //if thisinfo.Buyerclass != "" && pInfo.Buyerclass == "" {
|
|
|
- // pInfo.Buyerclass = thisinfo.Buyerclass
|
|
|
- // set["buyerclass"] = pInfo.Buyerclass
|
|
|
- //}
|
|
|
|
|
|
//8--代理机构
|
|
|
if (pInfo.Agency == "" && thisinfo.Agency != "") || (len([]rune(pInfo.Agency)) < 5 && len([]rune(thisinfo.Agency)) > 5) {
|
|
@@ -723,15 +748,6 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
|
|
|
pInfo.Bidopentime = thisinfo.Bidopentime
|
|
|
set["bidopentime"] = pInfo.Bidopentime
|
|
|
}
|
|
|
- if thisinfo.Bidamount > 0 {
|
|
|
- pInfo.Bidamount = pInfo.Bidamount + thisinfo.Bidamount
|
|
|
- set["bidamount"] = pInfo.Bidamount
|
|
|
- }
|
|
|
-
|
|
|
- if thisinfo.Budget > 0 {
|
|
|
- pInfo.Budget = pInfo.Budget + thisinfo.Budget
|
|
|
- set["budget"] = pInfo.Budget
|
|
|
- }
|
|
|
|
|
|
if len(thisinfo.Topscopeclass) > 0 {
|
|
|
sort.Strings(pInfo.Topscopeclass)
|
|
@@ -770,12 +786,17 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
|
|
|
|
|
|
if thisinfo.HasPackage { //多包处理
|
|
|
set["multipackage"] = 1
|
|
|
- pkg, _, _ := PackageFormat(thisinfo, pInfo)
|
|
|
+ pkg := PackageFormat(thisinfo, pInfo)
|
|
|
pInfo.Package = pkg
|
|
|
set["package"] = pInfo.Package
|
|
|
} else {
|
|
|
set["multipackage"] = 0
|
|
|
}
|
|
|
+ //处理多包后,计算预算金额、中标金额
|
|
|
+ CountAmount(pInfo, thisinfo)
|
|
|
+ set["budget"] = pInfo.Budget
|
|
|
+ set["bidamount"] = pInfo.Bidamount
|
|
|
+ //
|
|
|
|
|
|
set["mpn"] = pInfo.MPN
|
|
|
set["mpc"] = pInfo.MPC
|
|
@@ -796,7 +817,7 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
|
|
|
}
|
|
|
if len(update) > 0 {
|
|
|
updateInfo := []map[string]interface{}{
|
|
|
- map[string]interface{}{
|
|
|
+ {
|
|
|
"_id": pInfo.Id,
|
|
|
},
|
|
|
update,
|
|
@@ -813,7 +834,7 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
|
|
|
* 3、项目合并时,项目状态是”流标“/”废标“,招标信息状态不是”招标“ 异常:2
|
|
|
* 4、项目合并时,项目状态是”合同“/”其它“,招标信息类型是”结果“ 异常:3
|
|
|
*/
|
|
|
-func CompareStatus(project *ProjectInfo, info *Info) (bool, int) {
|
|
|
+func (p *ProjectTask) CompareStatus(project *ProjectInfo, info *Info) (bool, int) {
|
|
|
if info.TopType == "拟建" || info.TopType == "预告" || info.TopType == "招标" {
|
|
|
if project.Bidstatus == "拟建" || project.Bidstatus == "预告" || project.Bidstatus == "招标" {
|
|
|
return false, 0
|
|
@@ -823,10 +844,10 @@ func CompareStatus(project *ProjectInfo, info *Info) (bool, int) {
|
|
|
} else if info.TopType == "结果" {
|
|
|
if project.Bidstatus == "拟建" || project.Bidstatus == "预告" || project.Bidstatus == "招标" {
|
|
|
return false, 0
|
|
|
- } else if project.Bidstatus == info.SubType {
|
|
|
- key := titleGetPc.FindStringSubmatch(info.ProjectName)
|
|
|
- if key != nil {
|
|
|
- return false, 0
|
|
|
+ } else if project.Bidstatus == info.SubType {
|
|
|
+ //状态一样,根据发布时间判断是否合并
|
|
|
+ if (info.Publishtime - project.FirstTime) > p.statusTime {
|
|
|
+ return true, 0
|
|
|
} else {
|
|
|
return true, 0
|
|
|
}
|
|
@@ -884,9 +905,7 @@ var PackageEle = []string{
|
|
|
"bidstatus",
|
|
|
}
|
|
|
|
|
|
-func packageEle(map1 map[string]interface{}, id string) (map[string]interface{}, float64, float64) {
|
|
|
- budget := 0.0
|
|
|
- bidamount := 0.0
|
|
|
+func packageEle(map1 map[string]interface{}, id string) map[string]interface{} {
|
|
|
p2 := map[string]interface{}{}
|
|
|
for _, k := range PackageEle {
|
|
|
if map1[k] != nil {
|
|
@@ -896,31 +915,32 @@ func packageEle(map1 map[string]interface{}, id string) (map[string]interface{},
|
|
|
if infoid == nil {
|
|
|
p2["infoid"] = id
|
|
|
}
|
|
|
- if p2["budget"] != nil {
|
|
|
- budget = budget + p2["budget"].(float64)
|
|
|
- }
|
|
|
- if p2["bidamount"] != nil {
|
|
|
- bidamount = bidamount + p2["bidamount"].(float64)
|
|
|
- }
|
|
|
}
|
|
|
- return p2, budget, bidamount
|
|
|
+ return p2
|
|
|
}
|
|
|
|
|
|
-func PackageFormat(info *Info, project *ProjectInfo) (map[string]interface{}, float64, float64) {
|
|
|
- budget := 0.0
|
|
|
- bidamount := 0.0
|
|
|
+func PackageFormat(info *Info, project *ProjectInfo) map[string]interface{} {
|
|
|
+ budget := 0
|
|
|
+ bidamount := 0
|
|
|
p1 := map[string]interface{}{}
|
|
|
if project != nil && project.Package != nil && len(project.Package) > 0 {
|
|
|
- budget = project.Budget
|
|
|
- bidamount = project.Bidamount
|
|
|
p1 = project.Package
|
|
|
for k, v := range info.Package {
|
|
|
if v1, ok := v.(map[string]interface{}); ok {
|
|
|
v2 := map[string]interface{}{}
|
|
|
- v2, budget, bidamount = packageEle(v1, info.Id)
|
|
|
+ v2 = packageEle(v1, info.Id)
|
|
|
if v2["bidstatus"] == nil {
|
|
|
v2["bidstatus"] = info.SubType
|
|
|
}
|
|
|
+ if isCount(project, v2[""]) {
|
|
|
+
|
|
|
+ }
|
|
|
+ if v2["budget"] != nil {
|
|
|
+ budget = budget + v2["budget"].(float64)
|
|
|
+ }
|
|
|
+ if v2["bidamount"] != nil {
|
|
|
+ bidamount = bidamount + v2["bidamount"].(float64)
|
|
|
+ }
|
|
|
addFlag := false
|
|
|
for k1, v3 := range p1 {
|
|
|
if v4, ok := v3.([]map[string]interface{}); ok {
|
|
@@ -941,12 +961,76 @@ func PackageFormat(info *Info, project *ProjectInfo) (map[string]interface{}, fl
|
|
|
for k, v := range info.Package {
|
|
|
v1, _ := v.(map[string]interface{})
|
|
|
p2 := map[string]interface{}{}
|
|
|
- p2, budget, bidamount = packageEle(v1, info.Id)
|
|
|
+ p2 = packageEle(v1, info.Id)
|
|
|
if p2["bidstatus"] == nil {
|
|
|
p2["bidstatus"] = info.SubType
|
|
|
}
|
|
|
+ if p2["budget"] != nil {
|
|
|
+ budget = p2["budget"].(float64)
|
|
|
+ }
|
|
|
+ if p2["bidamount"] != nil {
|
|
|
+ bidamount = p2["bidamount"].(float64)
|
|
|
+ }
|
|
|
p1[k] = []map[string]interface{}{p2}
|
|
|
}
|
|
|
}
|
|
|
- return p1, budget, bidamount
|
|
|
+ info.Budget = budget
|
|
|
+ info.Bidamount = bidamount
|
|
|
+ return p1
|
|
|
+}
|
|
|
+
|
|
|
+//计算预算(budget)、中标金额(bidamount)
|
|
|
+func CountAmount(project *ProjectInfo, info *Info) {
|
|
|
+ //if project!= nil && project.Package != nil && len(project.Package) > 0 {
|
|
|
+ ////暂时未考虑太多情况,简单处理
|
|
|
+ //}
|
|
|
+
|
|
|
+ if info.Budget > 0 {
|
|
|
+ //项目中第一条招标信息是否是包/段项目
|
|
|
+ key := titleGetPc.FindStringSubmatch(project.ProjectName)
|
|
|
+ if len(key) > 0 {
|
|
|
+ //判断项目中是否已经计算过该包/段的预算
|
|
|
+ if !isCount(project, info.ProjectName) {
|
|
|
+ project.Budget = project.Budget + info.Budget
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ if project.Budget < info.Budget {
|
|
|
+ project.Budget = info.Budget
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //中标、成交、合同 处理中标金额(bidamount)
|
|
|
+ if info.SubType == "中标" || info.SubType == "成交" || info.SubType == "合同" {
|
|
|
+ if info.Bidamount > 0 {
|
|
|
+ key := titleGetPc.FindStringSubmatch(project.ProjectName)
|
|
|
+ if len(key) > 0 {
|
|
|
+ if !isCount(project, info.ProjectName) {
|
|
|
+ project.Bidamount = project.Bidamount + info.Bidamount
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ if project.Bidamount < project.Bidamount {
|
|
|
+ project.Bidamount = info.Bidamount
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //保存信息到IdStatusInfo
|
|
|
+ project.IdStatusInfo[info.Id] = map[string]interface{}{
|
|
|
+ "projectname": info.ProjectName,
|
|
|
+ "bidstatus": info.SubType,
|
|
|
+ "budget": info.Budget,
|
|
|
+ "bidamount": info.Bidamount,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func isCount(project *ProjectInfo, infoName string) bool {
|
|
|
+ if project.IdStatusInfo != nil && len(project.IdStatusInfo) > 0 {
|
|
|
+ for _, v := range project.IdStatusInfo{
|
|
|
+ if v["projectname"] == infoName {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false
|
|
|
}
|