feat: 认定vsOA增加一般类对比(超规+一般双维度差额)

This commit is contained in:
大师 2026-06-09 03:58:22 +08:00
parent 422a80c3d9
commit 631ae3f8b0
5 changed files with 24 additions and 13 deletions

View File

@ -1,8 +1,8 @@
项目名称,认定_危大方案总数,认定_超规数,所属国别,平台_匹配项目,平台_方案总数,平台_超规数,差额,匹配状态
沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,5,2,沙特,沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,3,1,-2,
沙特吉赞基础下游工业城3区1巷独栋别墅一期项目,1,0,沙特,沙特吉赞基础下游工业城3区1巷独栋别墅一期项目,3,2,2,
沙特达曼港第一和第二集装箱码头升级改造工程项目,1,1,沙特,沙特达曼港第一和第二集装箱码头升级改造工程,3,2,2,
阿联酋沙迦卡尔巴摩托艇码头项目,2,0,阿联酋,阿联酋沙迦卡尔巴摩托艇港开发项目,3,1,1,
阿联酋迪拜马克图姆国际机场地下结构工程项目,31,12,阿联酋,阿联酋迪拜马克图姆国际机场地下结构工程项目,35,13,4,
阿联酋阿布扎比哈里发港EGA泊位翻新项目,1,0,阿联酋,阿联酋阿布扎比哈里发港EGA泊位翻新工程项目,1,0,0,
阿联酋阿布扎比马斯努阿岛水工项目,2,1,阿联酋,阿联酋阿布扎比马斯努阿岛水工项目,0,0,-2,
项目名称,认定_危大方案总数,认定_超规数,所属国别,认定_一般数,平台_匹配项目,平台_方案总数,平台_超规数,平台_一般数,差额_超规,差额_一般,差额_合计,匹配状态
沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,5,2,沙特,3,沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目,3,1,2,-1,-1,-2,
沙特吉赞基础下游工业城3区1巷独栋别墅一期项目,1,0,沙特,1,沙特吉赞基础下游工业城3区1巷独栋别墅一期项目,3,2,1,2,0,2,
沙特达曼港第一和第二集装箱码头升级改造工程项目,1,1,沙特,0,沙特达曼港第一和第二集装箱码头升级改造工程,3,2,1,1,1,2,
阿联酋沙迦卡尔巴摩托艇码头项目,2,0,阿联酋,2,阿联酋沙迦卡尔巴摩托艇港开发项目,3,1,2,1,0,1,
阿联酋迪拜马克图姆国际机场地下结构工程项目,31,12,阿联酋,19,阿联酋迪拜马克图姆国际机场地下结构工程项目,35,13,22,1,3,4,
阿联酋阿布扎比哈里发港EGA泊位翻新项目,1,0,阿联酋,1,阿联酋阿布扎比哈里发港EGA泊位翻新工程项目,1,0,1,0,0,0,
阿联酋阿布扎比马斯努阿岛水工项目,2,1,阿联酋,1,阿联酋阿布扎比马斯努阿岛水工项目,0,0,0,-1,-1,-2,

1 项目名称 认定_危大方案总数 认定_超规数 所属国别 认定_一般数 平台_匹配项目 平台_方案总数 差额 平台_超规数 平台_一般数 差额_超规 差额_一般 差额_合计 匹配状态
2 沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目 5 2 沙特 3 沙特利雅得德拉伊耶门二期多功能场馆及办公楼房建项目 3 -2 1 2 -1 -1 -2
3 沙特吉赞基础下游工业城3区1巷独栋别墅一期项目 1 0 沙特 1 沙特吉赞基础下游工业城3区1巷独栋别墅一期项目 3 2 2 1 2 0 2
4 沙特达曼港第一和第二集装箱码头升级改造工程项目 1 1 沙特 0 沙特达曼港第一和第二集装箱码头升级改造工程 3 2 2 1 1 1 2
5 阿联酋沙迦卡尔巴摩托艇码头项目 2 0 阿联酋 2 阿联酋沙迦卡尔巴摩托艇港开发项目 3 1 1 2 1 0 1
6 阿联酋迪拜马克图姆国际机场地下结构工程项目 31 12 阿联酋 19 阿联酋迪拜马克图姆国际机场地下结构工程项目 35 4 13 22 1 3 4
7 阿联酋阿布扎比哈里发港EGA泊位翻新项目 1 0 阿联酋 1 阿联酋阿布扎比哈里发港EGA泊位翻新工程项目 1 0 0 1 0 0 0
8 阿联酋阿布扎比马斯努阿岛水工项目 2 1 阿联酋 1 阿联酋阿布扎比马斯努阿岛水工项目 0 -2 0 0 -1 -1 -2

View File

@ -220,18 +220,26 @@ if PLATFORM_PARQUET.exists():
if ratio > best_ratio:
best_ratio = ratio; best_match = plat_name
row_dict = cert_row.to_dict()
# 认定一般数 = 总数 - 超规
row_dict['认定_一般数'] = row_dict['认定_危大方案总数'] - row_dict['认定_超规数']
if best_match and best_ratio >= 0.75:
prow = platform_counts[platform_counts['项目名称'] == best_match].iloc[0]
row_dict['平台_匹配项目'] = best_match
row_dict['平台_方案总数'] = int(prow['平台_方案总数'])
row_dict['平台_超规数'] = int(prow['平台_超规数'])
row_dict['差额'] = int(prow['平台_方案总数']) - row_dict['认定_危大方案总数']
row_dict['平台_一般数'] = int(prow['平台_方案总数']) - int(prow['平台_超规数'])
row_dict['差额_超规'] = int(prow['平台_超规数']) - row_dict['认定_超规数']
row_dict['差额_一般'] = row_dict['平台_一般数'] - row_dict['认定_一般数']
row_dict['差额_合计'] = int(prow['平台_方案总数']) - row_dict['认定_危大方案总数']
row_dict['匹配状态'] = ''
else:
row_dict['平台_匹配项目'] = ''
row_dict['平台_方案总数'] = 0
row_dict['平台_超规数'] = 0
row_dict['差额'] = -row_dict['认定_危大方案总数']
row_dict['平台_一般数'] = 0
row_dict['差额_超规'] = -row_dict['认定_超规数']
row_dict['差额_一般'] = -row_dict['认定_一般数']
row_dict['差额_合计'] = -row_dict['认定_危大方案总数']
row_dict['匹配状态'] = '⚠️ 未匹配'
matched.append(row_dict)
df_result = pd.DataFrame(matched)

View File

@ -110,17 +110,20 @@ write_data_sheet(s3,cert_valid.reset_index(drop=True),
# ════════ S4: 认定vsOA ════════
s4=wb.create_sheet('认定vsOA')
COMP_COLS=['项目名称','认定_危大方案总数','认定_超规数','所属国别','平台_方案总数','平台_超规数','差额','匹配状态']
COMP_COLS=['项目名称','认定_危大方案总数','认定_超规数','认定_一般数',
'平台_方案总数','平台_超规数','平台_一般数',
'差额_超规','差额_一般','差额_合计','匹配状态']
ncol_c=len(COMP_COLS)
s4.merge_cells(start_row=1,start_column=1,end_row=1,end_column=ncol_c)
s4.cell(1,1,f'认定 vs OA登记 项目级对比({REPORT_DATE}').font=TITLE_F; s4.cell(1,1).border=GOLD_BD
hdr_row(s4,3,COMP_COLS)
for ri,(_,row) in enumerate(cert_comp.iterrows()):
for ci,col in enumerate(COMP_COLS):
v=row[col]
v=row.get(col,'')
if pd.isna(v): v=''
cell=s4.cell(ri+4,ci+1,v); cell.font=DATA_F; cell.border=BORDER
if col=='差额' and isinstance(v,(int,float)) and v!=0:
# 差额高亮
if col.startswith('差额_') and isinstance(v,(int,float)) and v!=0:
cell.font=RED_F if v<0 else GREEN_F
if col=='匹配状态': cell.font=GREEN_F if '' in str(v) else DATA_F
s4.auto_filter.ref=f'A3:{get_column_letter(ncol_c)}{len(cert_comp)+3}'