diff --git a/data/2026-06-08/cleaned/危大方案看板数据工作簿.xlsx b/data/2026-06-08/cleaned/危大方案看板数据工作簿.xlsx index c40b370..2f1a8f2 100644 Binary files a/data/2026-06-08/cleaned/危大方案看板数据工作簿.xlsx and b/data/2026-06-08/cleaned/危大方案看板数据工作簿.xlsx differ diff --git a/data/认定数据/2026/certified_schemes.csv b/data/认定数据/2026/certified_schemes.csv index da740a7..4e85e04 100644 --- a/data/认定数据/2026/certified_schemes.csv +++ b/data/认定数据/2026/certified_schemes.csv @@ -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,✅ diff --git a/data/认定数据/2026/certified_schemes.parquet b/data/认定数据/2026/certified_schemes.parquet index 4fcf880..ef874d6 100644 Binary files a/data/认定数据/2026/certified_schemes.parquet and b/data/认定数据/2026/certified_schemes.parquet differ diff --git a/src/clean_certified.py b/src/clean_certified.py index fc60772..4d9cca8 100644 --- a/src/clean_certified.py +++ b/src/clean_certified.py @@ -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) diff --git a/src/gen_workbook.py b/src/gen_workbook.py index 952f094..65377b4 100644 --- a/src/gen_workbook.py +++ b/src/gen_workbook.py @@ -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}'