284 lines
12 KiB
Python
284 lines
12 KiB
Python
# 文档处理工具
|
|
from tools.document_tools import (
|
|
create_document, add_documents,add_table_and_replace,
|
|
add_table_to_document,add_dynamic_table,
|
|
process_server_images_table,add_header,add_landscape_section,
|
|
merge_documents,add_table,add_defect_info_table
|
|
)
|
|
|
|
# 内容处理工具
|
|
from tools.content_tools import (
|
|
add_picture,split_table_by_row_content,
|
|
search_and_replace
|
|
)
|
|
|
|
from tools.get_pictures import (
|
|
process_picture_data,get_records_with_pic
|
|
)
|
|
|
|
from tools.Get_Json import (
|
|
get_project_info,get_jizu_info,
|
|
get_jizu_shigong_info,get_defect_detail,
|
|
get_part_picture,get_yepian_xiangqing,
|
|
check_pic_url,get_full_picture_url,
|
|
get_defect_record_list
|
|
)
|
|
|
|
from tools.dataproccess import (
|
|
caculate_work_days,get_year_month,
|
|
merge_info,get_defect_str,get_defect_json,
|
|
safe_get,get_resource_path,get_defedct_info,
|
|
)
|
|
|
|
from tools.json_to_docx import json_to_docx
|
|
|
|
|
|
from core.tables import fill_tables
|
|
|
|
from tools.defines import *
|
|
import os, re, datetime
|
|
|
|
async def generate_jf_report(base_info, baogao_info):
|
|
#获取模板编号、模板名称
|
|
num_to_chinese = {1 : '一', 2 : '二', 3 : '三', 4 : '四', 5 : '五', 6 : '六', 7 : '七', 8 : '八', 9 : '九', 10 : '十', 11 : '十一', 12 : '十二'}
|
|
cover_encode = "encode"
|
|
cover_project = "project"
|
|
baogao_name1 = "baogaoname1"
|
|
baogao_name2 = "baogaoname2"
|
|
company_name_yi = "company_name_yi"
|
|
cover_date = "time"
|
|
TITLE_OF_REPORT = "companyencode"
|
|
jiegou_xuhao = 'num'
|
|
|
|
print(f"获取到参数:基本信息:{base_info}\n\n报告信息:{baogao_info}")
|
|
|
|
try:
|
|
base_info = merge_info(base_info, DEFAULT_BASE_INFO)
|
|
turbine_id = base_info['turbine_id']
|
|
|
|
jizu_data = get_jizu_info(turbine_id)
|
|
project_data = get_project_info(jizu_data['projectId'])
|
|
shigong_data = get_jizu_shigong_info(turbine_id)
|
|
|
|
fengchang_name = project_data['farmName']
|
|
Yi_company = project_data['inspectionUnit']
|
|
yi_fuzeren = project_data['inspectionContact']
|
|
yi_phone = project_data['inspectionPhone']
|
|
fengchang_location = project_data['farmAddress']
|
|
Jia_company = project_data['client']
|
|
jia_fuzeren = project_data['clientContact']
|
|
jia_phone = project_data['clientPhone']
|
|
jizu_num = project_data['scale']
|
|
jizu_xinghao = project_data['turbineModel']
|
|
jizu_manufacture = project_data.get('turbineManufacturer', "")
|
|
project_name = project_data['projectName']
|
|
jizu_bianhao = jizu_data["turbineName"]
|
|
start_date = project_data['startDate']
|
|
end_date = project_data['endDate']
|
|
cover_url = project_data['coverUrl']
|
|
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)
|
|
|
|
key_words= re.compile('|'.join(map(re.escape, baogao_info['key_words'].split(',')))) #关键字
|
|
|
|
shengcheng_dir = baogao_info['shengcheng_dir'] #路径
|
|
if shengcheng_dir == "":
|
|
print("未配置生成路径,请检查配置")
|
|
return
|
|
if_waibu = baogao_info["if_waibu"]
|
|
if_neibu = baogao_info["if_neibu"]
|
|
if_fanglei = baogao_info["if_fanglei"]
|
|
|
|
quexian_type = baogao_info['quexian_enum']
|
|
|
|
dianxing_type = baogao_info['dianxing_enum']
|
|
|
|
other_type = baogao_info["other_enum"]
|
|
|
|
jiancha_renyuan = baogao_info['jiancha_renyuan'] #检查人员,目前是从命令行参数获取,需要完善
|
|
check_date = baogao_info['check_date']
|
|
if check_date == None:
|
|
check_date = "未获取"
|
|
baogao_bianzhi = baogao_info["userName"]
|
|
baogao_shenghe = baogao_info["baogaoCheck"]
|
|
Jiancha_date = baogao_info["check_date"]
|
|
data_processor = baogao_info["data_processor"]
|
|
coverurl = baogao_info["coverurl"]
|
|
|
|
|
|
#数据库拉取信息
|
|
# Jiancha_date = shigong_data["startTime"].replace("T", " ") #检查日期
|
|
# image_count = shigong_data['imageCount'] #从施工方案获取的图片数量,待定!!!
|
|
# temperature = shigong_data['temperature'] #温度
|
|
# wind_speed = shigong_data['windSpeed'] #风速
|
|
# weather = get_weather(shigong_data["weatherCode"]) #天气 不从此接口获取,待定!!!
|
|
|
|
#拉取部件、图片数据
|
|
part_data, picture_data, Yepians = get_part_picture(turbine_id)
|
|
|
|
print(Yepians)
|
|
Y1_info = get_yepian_xiangqing(Yepians[0]["partId"])
|
|
Y_Code = [yepian["partCode"] for yepian in Yepians]
|
|
partType = Y1_info["partType"]
|
|
partManufacturer = Y1_info["partManufacturer"]
|
|
print(f"找到叶片号{Y_Code},厂商{partManufacturer}")
|
|
|
|
image_source_to_find = []
|
|
baogao_label = []
|
|
renyuan_peizhi = []
|
|
gongzuo_neirong = []
|
|
shigong_fangan = []
|
|
shebei_peizhi = []
|
|
beizhu = []
|
|
jiancha = []
|
|
neirong = []
|
|
neirong2 = []
|
|
#获取对应枚举字段
|
|
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) + f"共{len(Y_Code)}支叶片的前缘、后缘、迎风面、背风面。")
|
|
neirong2.append("前缘、后缘、迎风面、背风面。")
|
|
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) + f"共{len(Y_Code)}支叶片的内部导雷卡、腹板、透光、人孔盖版、叶根盖板...")
|
|
neirong2.append("内部导雷卡、腹板、透光、人孔盖版、叶根盖板...")
|
|
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"轮毂至塔基导通、内部导线线阻、外部导线线阻...")
|
|
neirong2.append("轮毂至塔基导通、内部导线线阻、外部导线线阻...")
|
|
|
|
#获取缺陷图列表和典型图列表
|
|
filtered_picture_data, total_picture_num = process_picture_data(picture_data, image_source_to_find)
|
|
#获取所有缺陷记录
|
|
defect_records = get_defect_record_list()
|
|
#获取缺陷记录中对应图片的记录
|
|
defect_records_with_pic, error_pic_with_no_record = get_records_with_pic(defect_records, filtered_picture_data, quexian_type)
|
|
if len(error_pic_with_no_record) > 0:
|
|
print(f"!!!有部分缺陷图片没有对应的缺陷记录,将不会生成这些图片的缺陷表:{error_pic_with_no_record} ")
|
|
print(f"对应缺陷图的缺陷记录列表:{defect_records_with_pic}")
|
|
except Exception as e:
|
|
print(f"报告基本信息获取失败:{e}")
|
|
return
|
|
|
|
#检查参数合法性
|
|
if not if_fanglei or not if_neibu or not if_waibu:
|
|
print("请至少选择一种检查项目")
|
|
return
|
|
if not os.path.exists(shengcheng_dir):
|
|
print(f"生成路径{shengcheng_dir}不存在")
|
|
return
|
|
|
|
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):
|
|
if version != 1:
|
|
output_dir = output_dir.replace(f"版{version - 1}",f"版{version}")
|
|
else:
|
|
output_dir = output_dir.replace("版",f"版{version}")
|
|
version += 1
|
|
add_list = [
|
|
get_resource_path(MUBAN_DIR + '/jf_fengmian.png'),
|
|
get_resource_path(MUBAN_DIR + '/jf_fengmian1.png'),
|
|
get_resource_path(MUBAN_DIR + '/jinfeng_fengmian_name.docx'),
|
|
get_resource_path(MUBAN_DIR + '/jf_fengmian2.png'),
|
|
get_resource_path(MUBAN_DIR + '/jinfeng_fengmian_renyuan.docx'),
|
|
get_resource_path(MUBAN_DIR + '/jf_fengmian2.png'),
|
|
get_resource_path(MUBAN_DIR + '/jinfeng_fengmian_riqi.docx'),
|
|
get_resource_path(MUBAN_DIR + '/jf_fengmian1.png'),
|
|
get_resource_path(MUBAN_DIR + '/jinfeng_fengmian_luokuan.docx'),
|
|
get_resource_path(MUBAN_DIR + '/jf_fengmian3.png'),
|
|
]
|
|
print(await create_document(output_dir, section_args={
|
|
"page_height" : JF_HEIGHT,
|
|
"page_width" : JF_WIDTH,
|
|
"left_margin" : JF_L_MARGIN,
|
|
"right_margin" : JF_R_MARGIN,
|
|
"top_margin" : JF_T_MARGIN,
|
|
"bottom_margin" : JF_B_MARGIN,
|
|
}))
|
|
merge_documents(output_dir, add_list)
|
|
|
|
add_header(output_dir, TEMPLATE_HEADER.JINFENG_HEADER.ENUM)
|
|
|
|
print(add_documents(output_dir, get_resource_path(MUBAN_DIR + '/jf_table_title.docx')))
|
|
total_table_num = 0
|
|
print(add_table(output_dir, get_resource_path(MUBAN_DIR + '/jinfeng_table.docx')))
|
|
total_picture_num += 1
|
|
list_to_replace = {
|
|
'jia_company_name' : Jia_company,
|
|
'fengchang_name' : fengchang_name,
|
|
'jizu_hao' : jizu_bianhao,
|
|
'bianzhi_renyuan': baogao_bianzhi,
|
|
'bianzhi_riqi': baogao_date,
|
|
'fengchang_name' : fengchang_name,
|
|
'jizu_hao' : jizu_bianhao,
|
|
'fengchang_location' : fengchang_location,
|
|
'kehu_company' : Yi_company,
|
|
'xiangmuguige' : jizu_num,
|
|
'kehu_fuzeren' : yi_fuzeren,
|
|
'yezhu_phone' : yi_phone,
|
|
'shigong_company' : JINFENG_COMPANY,
|
|
'shigong_date' : "未填写",#shigong_date,
|
|
'shigong_fuzeren' : "未填写",
|
|
'shigong_phone' : "未填写",
|
|
'zhengji_changjia' : jizu_manufacture,
|
|
'yepian_changjia' : partManufacturer,
|
|
'jizu_type' : jizu_xinghao,
|
|
'yepian_type' : partType,
|
|
'jiancha_fangshi' : '、'.join(jiancha),
|
|
'jiancha_renyuan' : jiancha_renyuan
|
|
}
|
|
for find_text, replace_text in list_to_replace.items():
|
|
print(search_and_replace(output_dir, find_text, replace_text))
|
|
print(f"静态内容生成完毕,开始生成动态内容")
|
|
|
|
defect_info = get_defedct_info(defect_records_with_pic)
|
|
|
|
total_picture_num = add_defect_info_table(output_dir, defect_info, get_resource_path(MUBAN_DIR + '/quexian_liebiao.docx'), total_table_num)
|
|
|
|
# defect_json = get_defect_json(defect_info, Y_Code, jizu_bianhao)
|
|
|
|
# print(f"{defect_json} {type(defect_json)}")
|
|
|
|
# doc = json_to_docx(defect_json)
|
|
|
|
# doc.save(output_dir) |