获取了部件/图片的结构化信息

This commit is contained in:
Voge1imkafig 2025-07-08 18:17:02 +08:00
parent 44a797c59b
commit e28007f5b0
12 changed files with 316 additions and 213 deletions

View File

@ -16,10 +16,16 @@ from tools.get_pictures import (
process_picture_data
)
from tools.Get_Json import (get_project_info,get_jizu_info,
get_jizu_shigong_info,get_weather,
get_picture)
from tools.Get_Json import (
get_project_info,get_jizu_info,
get_jizu_shigong_info,get_weather,
get_part_picture
)
from tools.dataproccess import (
caculate_work_days,add_dynamic_table,
get_year_month,merge_info,
)
import asyncio
@ -29,91 +35,6 @@ from tools.defines import *
import os, re, datetime
from pathlib import Path
async def add_dynamic_table(output_doc, output_dir, table_num, TABLES, JIANCHA_XIANGQING_DIR, PICTURES, row, col, i, FLAG, xuhao):
"""创建动态表
Args:
output_doc (Document): 文档对象
output_dir (str): 输出目录
table_num (int): 表格序号
TABLES (list): 表格数据
JIANCHA_XIANGQING_DIR (str): 检查详情表目录
PICTURES (dict): 图片数据字典键为表索引值为图片路径列表
row (int): 行数
col (int): 列数
i (int): 表格序号
FLAG: 其他标志
Returns:
tuple: (i, table_num) 更新后的表格序号和表格数量
"""
for table_idx, Table in enumerate(TABLES):
print(Table)
output_doc, message = await add_table_to_document(output_dir, JIANCHA_XIANGQING_DIR, row, col, i, Table, FLAG)
print(message)
# 获取当前表格对应的图片
current_table_pictures = PICTURES.get(table_idx, [])
print(f"开始处理图片列表: {current_table_pictures}")
for picturedir in current_table_pictures:
try:
print(f"添加 {picturedir} {type(picturedir)}到表格{table_idx}")
resize_and_reduce_quality(picturedir, picturedir)
await add_picture_to_table(output_doc, output_dir, 4, 0, picturedir, i, 4.7232)
except Exception as e:
print(f"添加图片失败:{e}")
print(await search_and_replace(output_dir, 'tupian_xuhao', f'{xuhao}'))
table_num += 1
i += 1
xuhao += 1
return i, table_num, xuhao
def get_year_month(date):
"""根据格式化date字符串获取年月 'date': '二〇二一年十二月十日 9:00'
Args: date (str): 日期字符串
Returns: 年月字符串 '二〇二一年十二月'
"""
unit_map = {'1' : '', '2' : '', '3' : '', '4' : '', '5' : '', '6' : '', '7' : '', '8' : '', '9' : '', '0' : ''}
unit_map_month = {1 : '', 2 : '', 3 : '', 4 : '', 5 : '', 6 : '', 7 : '', 8 : '', 9 : '', 10 : '', 11 : '十一', 12 : '十二'}
year = date.split('')[0]
month = date.split('')[1].split('')[0]
year = ''.join([unit_map[i] for i in year])
month = unit_map_month[int(month)]
return f"{year}{month}"
def merge_info(frontend_info, default_info):
"""
合并前端传入的 info 和默认 info
规则如果前端传入的值为空None 或空字符串则使用默认值
Args:
frontend_info: 前端传入的字典
default_info: 默认的完整字典
Returns:
合并后的完整字典
"""
if not isinstance(frontend_info, dict) or frontend_info is None:
return default_info.copy()
merged_info = {}
for key, default_value in default_info.items():
# 获取前端传入的值
frontend_value = frontend_info.get(key)
# 判断前端值是否为空None 或空字符串)
if frontend_value is None or frontend_value == "":
merged_info[key] = default_value
else:
merged_info[key] = frontend_value
return merged_info
async def generate_report(base_info, baogao_info):
#获取模板编号、模板名称
num_to_chinese = {1 : '', 2 : '', 3 : '', 4 : '', 5 : '', 6 : '', 7 : '', 8 : '', 9 : '', 10 : '', 11 : '十一', 12 : '十二'}
@ -130,6 +51,7 @@ async def generate_report(base_info, baogao_info):
jizu_data = get_jizu_info(turbine_id)
project_data = get_project_info(jizu_data['projectId'])
shigong_data = get_jizu_shigong_info(turbine_id)
try:
fengchang_name = project_data['farmName']
Yi_company = project_data['inspectionUnit']
@ -141,13 +63,18 @@ async def generate_report(base_info, baogao_info):
jia_phone = project_data['clientPhone']
jizu_num = project_data['scale']
jizu_xinghao = project_data['turbineModel']
project_name = project_data['projectName']
jizu_bianhao = jizu_data["turbineName"]
start_date = project_data['startDate']
end_date = project_data['endDate']
gongqi = caculate_work_days(start_date, end_date)
except Exception as e:
print(f"数据库的项目-机组基本信息获取失败:{e}")
return
try:
baogao_date = datetime.datetime.now().strftime("%Y年%m月%d%H:%M") #现在的时间
date_year_month = get_year_month(baogao_date)
#前端信息
baogao_info = merge_info(baogao_info, DEFAULT_BAOGAO_INFO)
@ -160,14 +87,6 @@ async def generate_report(base_info, baogao_info):
if_waibu = baogao_info["if_waibu"]
if_neibu = baogao_info["if_neibu"]
if_fanglei = baogao_info["if_fanglei"]
image_source_to_find = []
#获取对应枚举字段
if if_waibu:
image_source_to_find.append(baogao_info['waibu_enum'])
if if_neibu:
image_source_to_find.append(baogao_info['neibu_enum'])
if if_fanglei:
image_source_to_find.append(baogao_info['fanglei_enum'])
quexian_type = baogao_info['quexian_enum']
@ -176,58 +95,100 @@ async def generate_report(base_info, baogao_info):
#数据库拉取信息
Jiancha_date = shigong_data["startTime"].replace("T", " ") #检查日期
image_count = shigong_data['imageCount'] #从施工方案获取的图片数量,待定
image_count = shigong_data['imageCount'] #从施工方案获取的图片数量,待定!!!
temperature = shigong_data['temperature'] #温度
wind_speed = shigong_data['windSpeed'] #风速
weather = get_weather(shigong_data["weatherCode"]) #天气
#拉取图片数据
picture_data = get_picture(turbine_id)
weather = get_weather(shigong_data["weatherCode"]) #天气 不从此接口获取,待定!!!
#拉取部件、图片数据
part_data, picture_data = get_part_picture(turbine_id)
#获取叶片信息
print(part_data)
Yepians = []
yepian_to_find = ["叶片1","叶片2","叶片3"]
#依次获取叶片123的信息未考虑多个同叶片的信息情况正常情况下不会发生
for name in yepian_to_find:
# 找到第一个匹配的部件并添加到列表中
for part in part_data:
if part['partName'] == name:
Yepians.append(part)
print(Yepians)
print(f"找到叶片号{[yepian["partCode"] for yepian in Yepians]}")
Y_Code = [yepian["partCode"] for yepian in Yepians]
image_source_to_find = []
baogao_label = []
renyuan_peizhi = []
gongzuo_neirong = []
shigong_fangan = []
shebei_peizhi = []
beizhu = []
jiancha = []
neirong = []
#获取对应枚举字段
if if_waibu:
baogao_label.append("外观")
image_source_to_find.append(baogao_info['waibu_enum'])
if baogao_info["shigong_fangan"] == "None":
print("未传入施工方案,使用已有枚举")
renyuan_peizhi.append(SHIGONG_FANGAN_ENUM.WAIBU.RENYUAN_PEIZHI)
gongzuo_neirong.append(SHIGONG_FANGAN_ENUM.WAIBU.GONGZUO_NEIRONG)
shebei_peizhi.append(SHIGONG_FANGAN_ENUM.WAIBU.SHEBEI_PEIZHI)
shigong_fangan.append(SHIGONG_FANGAN_ENUM.WAIBU.SHIGONG_FANGAN)
else:
pass #待添加如果从平台传入枚举,但目前没必要,如果这种枚举标准信息库有更好的优化则可以实现
jiancha.append("无人机近距离外观检查")
neirong.append(f"".join(Y_Code) + "三支叶片的前缘、后缘、迎风面、背风面。")
if if_neibu:
baogao_label.append("内部")
image_source_to_find.append(baogao_info['neibu_enum'])
if baogao_info["shigong_fangan"] == "None":
renyuan_peizhi.append(SHIGONG_FANGAN_ENUM.NEIBU.RENYUAN_PEIZHI)
gongzuo_neirong.append(SHIGONG_FANGAN_ENUM.NEIBU.GONGZUO_NEIRONG)
shebei_peizhi.append(SHIGONG_FANGAN_ENUM.NEIBU.SHEBEI_PEIZHI)
shigong_fangan.append(SHIGONG_FANGAN_ENUM.NEIBU.SHIGONG_FANGAN)
else:
pass
jiancha.append("人工内部拍摄")
neirong.append(f"".join(Y_Code) + "三支叶片的内部导雷卡、腹板、透光、人孔盖版、叶根盖板...")
if if_fanglei:
baogao_label.append("防雷")
image_source_to_find.append(baogao_info['fanglei_enum'])
if baogao_info["shigong_fangan"] == "None":
renyuan_peizhi.append(SHIGONG_FANGAN_ENUM.FANGLEI.YEPIAN.RENYUAN_PEIZHI)
gongzuo_neirong.append(SHIGONG_FANGAN_ENUM.FANGLEI.YEPIAN.GONGZUO_NEIRONG)
shebei_peizhi.append(SHIGONG_FANGAN_ENUM.FANGLEI.YEPIAN.SHEBEI_PEIZHI)
shigong_fangan.append(SHIGONG_FANGAN_ENUM.FANGLEI.YEPIAN.SHIGONG_FANGAN)
else:
pass
jiancha.append("人工防雷")
neirong.append(f"轮毂至塔基导通、内部导线线阻、外部导线线阻...")
#获取缺陷图列表和典型图列表
defect_pictures, typical_pictures = process_picture_data(picture_data, image_source_to_find)
#处理图片数据
defect_pictures, typical_pictures = process_picture_data(picture_data, image_source_to_find, quexian_type, dianxing_type)
print(f"\n\n\n缺陷图片列表:{defect_pictures}\n\n\n典型图片列表:{typical_pictures}\n\n\n")
#处理图片数据待完成,图片绑定施工后
defect_pictures_id = [pic for pic in defect_pictures]
date_year_month = get_year_month(baogao_date)
project_number = baogao_info['jizu_type']
baogao_type = baogao_info['baogao_type']
Jiancha_renyuan = baogao_info['jiancha_renyuan']
shebei_peizhi = baogao_info['shebei_peizhi']
shigong_fangan = baogao_info['shigong_fangan']
renyuan_peizhi = baogao_info['renyuan_peizhi']
gongzuo_neirong = baogao_info['gongzuo_neirong']
beizhu = baogao_info['beizhu']
Jiancha_location = baogao_info['jiancha_location']
Jiancha_fangshi = baogao_info['jiancha_fangshi']
Changjia = baogao_info['yepian_changjia']
yezhu_renyuan = baogao_info['yezhu_renyuan']
changjia_renyuan = baogao_info['changjia_renyuan']
data_process = baogao_info['date_process']
baogao_bianzhi = baogao_info['baogao_bianzhi']
baogao_shenghe = baogao_info['baogao_shenghe']
shenghe_date = baogao_info['shenghe_date']
Y1_jiancha = baogao_info['Y1_jiancha_neirong']
Y2_jiancha = baogao_info['Y2_jiancha_neirong']
Y3_jiancha = baogao_info['Y3_jiancha_neirong']
baogao_bianzhi = baogao_info["userName"]
baogao_shenghe = baogao_info["baogaoCheck"]
except Exception as e:
print(f"报告基本信息获取失败:{e}")
return
normal_picture_num = 0
Y1 = "t"
Y2 = "t"
Y3 = "t"
output_doc = None
head_num = 1
###封面创建###
cover_dirs = [os.path.join(muban_dir,"fengmian1.docx"),os.path.join(muban_dir,"fengmian.jpg"),os.path.join(muban_dir,"fengmian2.docx")]
#输出目录
output_dir = os.path.normpath(f"{shengcheng_dir}/{fengchang_name}项目{baogao_type}{project_number}{baogao_date.split(' ')[0]}版.docx")
baogao_name = "叶片" + "".join(baogao_label)
output_dir = os.path.normpath(f"{shengcheng_dir}/{project_name}项目{baogao_name}{jizu_bianhao}{baogao_date.split(' ')[0]}版.docx")
version = 1
while os.path.exists(output_dir):
@ -237,19 +198,7 @@ async def generate_report(base_info, baogao_info):
output_dir = output_dir.replace("",f"{version}")
version += 1
ifwaibu = baogao_info['waibu_jiancha']
ifneibu = baogao_info['neibu_jiancha']
iffanglei = baogao_info['fanglei_jiancha']
parts = []
if ifwaibu:
parts.append("叶片外观")
if ifneibu:
parts.append("叶片内部")
if iffanglei:
parts.append("叶片防雷")
if not parts:
print("前端未指定检查内容")
mianzhe_shengming = f"本报告仅涵盖{''.join(parts)}检测内容"
mianzhe_shengming = f"本报告仅涵盖{''.join(baogao_label)}检测内容"
#创建文档、添加封面
print(await create_document(output_dir))
@ -259,12 +208,12 @@ async def generate_report(base_info, baogao_info):
print("封面创建成功")
#更改文档信息
print(await search_and_replace(output_dir, TITLE_OF_REPORT, project_number))
print(await search_and_replace(output_dir, baogao_name1, baogao_type))
print(await search_and_replace(output_dir, baogao_name2, baogao_type))
print(await search_and_replace(output_dir, TITLE_OF_REPORT, jizu_bianhao))
print(await search_and_replace(output_dir, baogao_name1, baogao_name))
print(await search_and_replace(output_dir, baogao_name2, baogao_name))
print(await search_and_replace(output_dir, company_name_yi, Yi_company))
print(await search_and_replace(output_dir, cover_project, fengchang_name))
print(await search_and_replace(output_dir, cover_encode, project_number))
print(await search_and_replace(output_dir, cover_encode, jizu_bianhao))
print(await search_and_replace(output_dir, cover_date, date_year_month))
print(await search_and_replace(output_dir, 'bianzhi', baogao_bianzhi))
print(await search_and_replace(output_dir, 'shenghe', baogao_shenghe))
@ -279,20 +228,22 @@ async def generate_report(base_info, baogao_info):
company_name_jia = Jia_company
fuzeren = yi_fuzeren
phone_fuzeren = yi_phone
jizu_bianhao = project_number
xiangmuguige = jizu_num
Yi_company = Yi_company
XIANGMU_GAIKUO = list(list("" for i in range(5)) for j in range(5))
XIANGMU_GAIKUO = list(list("" for i in range(6)) for j in range(5))
XIANGMU_GAIKUO[0][1] = fengchang_name
#XIANGMU_GAIKUO[0][3]=XIANGMU_GAIKUO[0][4] = "盐城市滨海县"
XIANGMU_GAIKUO[0][3] = project_location
XIANGMU_GAIKUO[0][4] = project_location
#XIANGMU_GAIKUO[1][1]=XIANGMU_GAIKUO[2,1]=XIANGMU_GAIKUO[3,1] = "国家电投集团滨海风力发电有限公司"
XIANGMU_GAIKUO[1][1] = company_name_jia
XIANGMU_GAIKUO[1][3] = Yi_company
XIANGMU_GAIKUO[2][3] = fuzeren
XIANGMU_GAIKUO[3][4] = phone_fuzeren
XIANGMU_GAIKUO[1][4] = Yi_company
XIANGMU_GAIKUO[2][1] = jia_fuzeren
XIANGMU_GAIKUO[2][4] = fuzeren
XIANGMU_GAIKUO[3][2] = jia_phone
XIANGMU_GAIKUO[3][5] = phone_fuzeren
XIANGMU_GAIKUO[4][1] = jizu_xinghao
XIANGMU_GAIKUO[4][4] = xiangmuguige
XIANGMU_GAIKUO[4][3] = xiangmuguige
XIANGMU_GAIKUO[4][5] = gongqi
print("建立表结构完毕,开始插入模板")
#添加项目概况表
print(f"输出路径:{output_dir},模板路径:{XIANG_MU_GAI_KUANG},插入数据:{XIANGMU_GAIKUO}")
@ -306,10 +257,10 @@ async def generate_report(base_info, baogao_info):
#检查方案描述
FANGAN_JIANCHA_DIR = os.path.join(muban_dir,"checkmethod.docx")
list_to_replace = {
'renyuan_peizhi' : renyuan_peizhi,
'shebei_peizhi' : shebei_peizhi,
'shigong_fangan' : shigong_fangan,
'gongzuo_neirong' : gongzuo_neirong,
'renyuan_peizhi' : "\n".join(renyuan_peizhi),
'shebei_peizhi' : "\n".join(shebei_peizhi),
'shigong_fangan' : "\n".join(shigong_fangan),
'gongzuo_neirong' : "\n".join(gongzuo_neirong),
'beizhu' : beizhu,
'num' : num_to_chinese[head_num],
}
@ -318,30 +269,19 @@ async def generate_report(base_info, baogao_info):
total_table_num += 1
head_num += 1
jiancha = []
neirong = []
if ifwaibu:
jiancha.append("无人机外部高精度飞行")
neirong.append(f"{Y1}{Y2}{Y3}三支叶片的前缘、后缘、迎风面、背风面。")
if ifneibu:
jiancha.append("人工内部拍摄")
neirong.append(f"{Y1}{Y2}{Y3}三支叶片的内部导雷卡、腹板、透光、人孔盖版、叶根盖板...")
if iffanglei:
jiancha.append("人工防雷")
neirong.append(f"轮毂至塔基导通、内部导线线阻、外部导线线阻...")
JIANCHA_XINGXI_DIR = os.path.join(muban_dir,"checkinfo.docx")
JIANCHA_XINGXI = list(list("" for i in range(4)) for j in range(9))
JIANCHA_XINGXI[0][1] = Jiancha_renyuan
JIANCHA_XINGXI[0][1] = ""
JIANCHA_XINGXI[1][1] = Jiancha_date.split(' ')[0]
JIANCHA_XINGXI[1][3] = project_number
JIANCHA_XINGXI[2][1] = Jiancha_location
JIANCHA_XINGXI[2][3] = Jiancha_fangshi
JIANCHA_XINGXI[3][2] = Changjia
JIANCHA_XINGXI[4][1] = '机组编号:' + project_number + '机组'
JIANCHA_XINGXI[5][1] = Y1
JIANCHA_XINGXI[6][1] = Y2
JIANCHA_XINGXI[7][1] = Y3
JIANCHA_XINGXI[1][3] = jizu_bianhao
JIANCHA_XINGXI[2][1] = "风力发电机组" + baogao_name
JIANCHA_XINGXI[2][3] = "".join(jiancha)
JIANCHA_XINGXI[3][2] = ""#需要使用查看叶片详情接口获取,待完成
JIANCHA_XINGXI[4][1] = '机组编号:' + jizu_bianhao+ '机组'
JIANCHA_XINGXI[5][1] = Y_Code[0]
JIANCHA_XINGXI[6][1] = Y_Code[1] if len(Y_Code) > 1 else ""
JIANCHA_XINGXI[7][1] = Y_Code[2] if len(Y_Code) > 2 else ""
JIANCHA_XINGXI[8][0] = "本次" + "".join(_ for _ in jiancha) + f"检查,采集叶片图片{normal_picture_num}张,内容覆盖" + ";".join(_ for _ in neirong)
# if total_picture_dir == "":
# Thumbnail_Picture = await make_Thumbnail(Picture_dir, Picture_dir)#添加图片
@ -540,6 +480,44 @@ def main():
json_data2 = {
'shengcheng_dir': r".\output",
'muban_dir': r".\muban",
# "shigong_fangan_enum" : { #可能放入标准信息库?但不论如何,修改了这个枚举的话,报告生成逻辑也要修改,待优化!
# "SHIGONG_FANGAN_ENUM": {
# "WAIBU": {
# "GONGZUO_NEIRONG": "无人机叶片外观巡检",
# "RENYUAN_PEIZHI": "1人主检飞手1人",
# "SHEBEI_PEIZHI": "1、大疆无人机1台M350rtkM300rtkM30TM30精灵4PRO2、大疆精灵4PRO+索尼A7R2机身+索尼200-600mm镜头/适马150-600mm镜头",
# "SHIGONG_FANGAN": None
# },
# "NEIBU": {
# "GONGZUO_NEIRONG": "叶片内部检查",
# "RENYUAN_PEIZHI": "2人轮毂作业检查2人",
# "SHEBEI_PEIZHI": "1、人工检查照明设备2套视频记录手机2台含氧量监测仪1台电动扳手2套卷尺1个。2、爬壁机器人检查无人作业校车+视频图传1套照明设备2套含氧量监测仪1台电动扳手2套卷尺1个。",
# "SHIGONG_FANGAN": None
# },
# "FANGLEI": {
# "YEPIAN": {
# "GONGZUO_NEIRONG": "无人机叶片防雷导通测试",
# "RENYUAN_PEIZHI": "2人主检飞手1人副检抄表1人",
# "SHEBEI_PEIZHI": "1四轴电阻无人机1套电子微欧计1台视频记录手机1台",
# "SHIGONG_FANGAN": None
# },
# "DIAOLAN": {
# "GONGZUO_NEIRONG": "无人吊篮叶片导通测试(含机舱设备、)",
# "RENYUAN_PEIZHI": "3人轮毂机舱作业1人揽风绳作业1人无人设备操作员及抄表1人",
# "SHEBEI_PEIZHI": "无人吊篮系统1套爬绳器+接触平台、电子微欧计1套视频记录手机1台对讲机2台",
# "SHIGONG_FANGAN": None
# },
# "SHESHI": {
# "GONGZUO_NEIRONG": "风机基础、办公楼、变电站防雷接地检测及浪涌保护器测试",
# "RENYUAN_PEIZHI": "1人抄表人员1人检测人员1人监护1人。",
# "SHEBEI_PEIZHI": "接地电阻测试仪1套、SPD测试仪1套、对讲机2个、",
# "SHIGONG_FANGAN": None
# },
# "FEISHOURENYUAN_PEIZHI": "1人主检飞手1人",
# "LUNGUZUOYERENYUAN_PEIZHI": "2人轮毂作业检查2人"
# }
# }
# },
}
asyncio.run(generate_report(json_data1,json_data2))
print('文档生成完毕')

Binary file not shown.

View File

@ -47,18 +47,19 @@ def get_part_list(turbineId : str) -> dict:
"turbineId" : turbineId
}
result = get_data(parturl, params = params)
result = [item["partId"] for item in result]
print(f"获取到部件{result}")
return result
return result, [item["partId"] for item in result]
def get_picture(turbineId : str) -> list[dict]:
def get_part_picture(turbineId : str) -> tuple[list[dict], list[dict]]:
"""获取对应机组所有图片
Args:
turbineId (str): 机组ID
Return:
list: 包含所有对应机组的部件信息的列表
list: 包含所有图片信息的列表(按部件分list)
[
{
@ -90,7 +91,7 @@ def get_picture(turbineId : str) -> list[dict]:
]
"""
picturerul = DTURL + GETPICTURELIST
part_list = get_part_list(turbineId)
part_data, part_list = get_part_list(turbineId)
result = []
for part_id in part_list:
params = {
@ -99,7 +100,7 @@ def get_picture(turbineId : str) -> list[dict]:
for images in get_data(picturerul, params = params):
result.append(images)
print(f"图片数据获取成功:{result}")
return result
return part_data, result
def find_defect_record(defect_pictures : list[dict]):
"""查找缺陷图片的缺陷记录

Binary file not shown.

106
tools/dataproccess.py Normal file
View File

@ -0,0 +1,106 @@
from tools.content_tools import add_picture_to_table
from tools.document_tools import add_table_to_document,search_and_replace
from tools.get_pictures import resize_and_reduce_quality
def caculate_work_days(start_date : str, end_date : str) -> str:
"""根据起止日期计算工期
Args:
start_date (str): 格式: yyyy-mm-ddThh:mm:ss
end_date (str): 格式: yyyy-mm-ddThh:mm:ss
Returns:
str: 计算出来的总工期单位为天
"""
import datetime
if start_date == None or end_date == None:
return f"开始时间{start_date} ---- 结束时间{end_date} 日期格式错误"
start_date = datetime.datetime.strptime(start_date, '%Y-%m-%dT%H:%M:%S')
end_date = datetime.datetime.strptime(end_date, '%Y-%m-%dT%H:%M:%S')
return (end_date - start_date).days
async def add_dynamic_table(output_doc, output_dir, table_num, TABLES, JIANCHA_XIANGQING_DIR, PICTURES, row, col, i, FLAG, xuhao):
"""创建动态表
Args:
output_doc (Document): 文档对象
output_dir (str): 输出目录
table_num (int): 表格序号
TABLES (list): 表格数据
JIANCHA_XIANGQING_DIR (str): 检查详情表目录
PICTURES (dict): 图片数据字典键为表索引值为图片路径列表
row (int): 行数
col (int): 列数
i (int): 表格序号
FLAG: 其他标志
Returns:
tuple: (i, table_num) 更新后的表格序号和表格数量
"""
for table_idx, Table in enumerate(TABLES):
print(Table)
output_doc, message = await add_table_to_document(output_dir, JIANCHA_XIANGQING_DIR, row, col, i, Table, FLAG)
print(message)
# 获取当前表格对应的图片
current_table_pictures = PICTURES.get(table_idx, [])
print(f"开始处理图片列表: {current_table_pictures}")
for picturedir in current_table_pictures:
try:
print(f"添加 {picturedir} {type(picturedir)}到表格{table_idx}")
resize_and_reduce_quality(picturedir, picturedir)
await add_picture_to_table(output_doc, output_dir, 4, 0, picturedir, i, 4.7232)
except Exception as e:
print(f"添加图片失败:{e}")
print(await search_and_replace(output_dir, 'tupian_xuhao', f'{xuhao}'))
table_num += 1
i += 1
xuhao += 1
return i, table_num, xuhao
def get_year_month(date):
"""根据格式化date字符串获取年月 'date': '二〇二一年十二月十日 9:00'
Args: date (str): 日期字符串
Returns: 年月字符串 '二〇二一年十二月'
"""
unit_map = {'1' : '', '2' : '', '3' : '', '4' : '', '5' : '', '6' : '', '7' : '', '8' : '', '9' : '', '0' : ''}
unit_map_month = {1 : '', 2 : '', 3 : '', 4 : '', 5 : '', 6 : '', 7 : '', 8 : '', 9 : '', 10 : '', 11 : '十一', 12 : '十二'}
year = date.split('')[0]
month = date.split('')[1].split('')[0]
year = ''.join([unit_map[i] for i in year])
month = unit_map_month[int(month)]
return f"{year}{month}"
def merge_info(frontend_info, default_info):
"""
合并前端传入的 info 和默认 info
规则如果前端传入的值为空None 或空字符串则使用默认值
Args:
frontend_info: 前端传入的字典
default_info: 默认的完整字典
Returns:
合并后的完整字典
"""
if not isinstance(frontend_info, dict) or frontend_info is None:
return default_info.copy()
merged_info = {}
for key, default_value in default_info.items():
# 获取前端传入的值
frontend_value = frontend_info.get(key)
# 判断前端值是否为空None 或空字符串)
if frontend_value is None or frontend_value == "":
merged_info[key] = default_value
else:
merged_info[key] = frontend_value
return merged_info

View File

@ -26,30 +26,49 @@ DEFAULT_BAOGAO_INFO = {
"if_waibu" : True,
"if_neibu" : True,
"if_fanglei" : True,
"userName" : "admin",
"baogaoCheck" : "未审核",
'key_words': '缺,损,裂,脱,污', #关键字,用于汇总图的名字包含缺陷时标红,匹配逻辑为正则匹配单个字则为红 后续可优化
#检查方案
'beizhu': '',
'renyuan_peizhi': '''2人主检飞手1人副检抄表1人
3轮毂机舱作业1人揽风绳作业1人无人设备操作员及抄表1人
1抄表人员1人检测人员1人监护1人
1主检飞手1人
2轮毂作业检查2人''',
'gongzuo_neirong': '''无人机叶片防雷导通测
无人吊篮叶片导通测试含机舱设备
风机基础办公楼变电站防雷接地检测及浪涌保护器测试
无人机叶片外观巡检
叶片内部检查''',
'shigong_fangan': '',
'shebei_peizhi': '''1四轴电阻无人机1套电子微欧计1台视频记录手机1台
无人吊篮系统1套爬绳器+接触平台电子微欧计1套视频记录手机1台对讲机2台
接地电阻测试仪1套SPD测试仪1套对讲机2个
1大疆无人机1台M350rtkM300rtkM30TM30精灵4PRO2大疆精灵4PRO+索尼A7R2机身+索尼200-600mm镜头/适马150-600mm镜头
1人工检查照明设备2套视频记录手机2台含氧量监测仪1台电动扳手2套卷尺1个2爬壁机器人检查无人作业校车+视频图传1套照明设备2套含氧量监测仪1台电动扳手2套卷尺1个''',
"shigong_fangan" : "None",
'jiancha_renyuan': '张三',
}
class JIANCHA_ENUM :
class WAIBU:
PART = "无人机外部高精度飞行"
#NEIRONG =
class SHIGONG_FANGAN_ENUM :
class WAIBU:
GONGZUO_NEIRONG = "无人机叶片外观巡检"
RENYUAN_PEIZHI = "1人主检飞手1人"
SHEBEI_PEIZHI = "1、大疆无人机1台M350rtkM300rtkM30TM30精灵4PRO2、大疆精灵4PRO+索尼A7R2机身+索尼200-600mm镜头/适马150-600mm镜头"
SHIGONG_FANGAN = ""
class NEIBU:
GONGZUO_NEIRONG = "叶片内部检查"
RENYUAN_PEIZHI = "2人轮毂作业检查2人"
SHEBEI_PEIZHI = "1、人工检查照明设备2套视频记录手机2台含氧量监测仪1台电动扳手2套卷尺1个。2、爬壁机器人检查无人作业校车+视频图传1套照明设备2套含氧量监测仪1台电动扳手2套卷尺1个。"
SHIGONG_FANGAN = ""
class FANGLEI:
class YEPIAN:
GONGZUO_NEIRONG = "无人机叶片防雷导通测试"
RENYUAN_PEIZHI = "2人主检飞手1人副检抄表1人"
SHEBEI_PEIZHI = "1四轴电阻无人机1套电子微欧计1台视频记录手机1台"
SHIGONG_FANGAN = ""
class DIAOLAN:
GONGZUO_NEIRONG = "无人吊篮叶片导通测试(含机舱设备、)"
RENYUAN_PEIZHI = "3人轮毂机舱作业1人揽风绳作业1人无人设备操作员及抄表1人"
SHEBEI_PEIZHI = "无人吊篮系统1套爬绳器+接触平台、电子微欧计1套视频记录手机1台对讲机2台"
SHIGONG_FANGAN = ""
class SHESHI:
GONGZUO_NEIRONG = "风机基础、办公楼、变电站防雷接地检测及浪涌保护器测试"
RENYUAN_PEIZHI = "1人抄表人员1人检测人员1人监护1人。"
SHEBEI_PEIZHI = "接地电阻测试仪1套、SPD测试仪1套、对讲机2个、"
SHIGONG_FANGAN = ""
FEISHOURENYUAN_PEIZHI = "1人主检飞手1人"
LUNGUZUOYERENYUAN_PEIZHI = "2人轮毂作业检查2人"
DEFAULT_BASE_INFO = { #项目基本信息
#项目概况
'jituan_jianxie': '甲方集团',
@ -83,15 +102,15 @@ oneproject = {
"auditorId": "ca37c4337df8673a5c045b6c25acf74a",
"qualityOfficerId": "862e027910c2562d2b67d88ec33d77ba",
"projectManagerId": "fbaa9e0aecf2ce287138c38a4b654085",
"constructionTeamLeaderId": None,
"constructionTeamLeaderId": "",
"status": 0,
"startDate": None,
"endDate": None,
"constructorName": None,
"startDate": "",
"endDate": "",
"constructorName": "",
"auditorName": "李四",
"qualityOfficerName": "辛奇",
"projectManagerName": "张三",
"constructionTeamLeaderName": None,
"constructionTeamLeaderName": "",
"statusLabel": "待施工"
},
"msg": "",
@ -147,4 +166,3 @@ yepian = {
"code": 200,
"success": True
}

View File

@ -246,8 +246,8 @@ def process_picture_data(picture_data : list[dict],
dianxing_type (str): 典型类型枚举值
Returns:
tuple(
defct_pictures, 缺陷图列表
dianxing_pictures 典型图列表
defct_pictures, 缺陷图列表
dianxing_pictures 典型图列表
)
"""
#过滤目标来源的图片数据