2024-11-23 17:50:32 +08:00
|
|
|
|
# flask_app/routes/test_zbparse.py
|
|
|
|
|
|
2024-11-26 11:32:24 +08:00
|
|
|
|
from flask import Blueprint, Response, stream_with_context, current_app, jsonify
|
2024-11-23 17:50:32 +08:00
|
|
|
|
import json
|
|
|
|
|
import time
|
|
|
|
|
|
2025-02-15 11:18:28 +08:00
|
|
|
|
from flask_app.ConnectionLimiter import require_execution_timeout
|
2024-11-26 11:32:24 +08:00
|
|
|
|
from flask_app.routes.utils import validate_and_setup_logger
|
|
|
|
|
|
2024-11-23 17:50:32 +08:00
|
|
|
|
test_zbparse_bp = Blueprint('test_zbparse', __name__)
|
|
|
|
|
|
2025-02-17 11:30:11 +08:00
|
|
|
|
@test_zbparse_bp.route('/test_zbparse', methods=['POST'])
|
2024-11-26 11:32:24 +08:00
|
|
|
|
@validate_and_setup_logger
|
2025-02-15 11:18:28 +08:00
|
|
|
|
@require_execution_timeout(timeout=1800)
|
2024-11-23 17:50:32 +08:00
|
|
|
|
def test_zbparse():
|
|
|
|
|
try:
|
2025-02-15 11:25:05 +08:00
|
|
|
|
return test_process_and_stream()
|
2024-11-23 17:50:32 +08:00
|
|
|
|
except Exception as e:
|
|
|
|
|
# 使用 Flask 应用的日志记录器
|
|
|
|
|
current_app.logger.error('Exception occurred: ' + str(e))
|
2025-02-15 11:25:05 +08:00
|
|
|
|
return jsonify({'error': str(e)})
|
2024-11-23 17:50:32 +08:00
|
|
|
|
|
|
|
|
|
def test_process_and_stream():
|
|
|
|
|
data_segments = [
|
|
|
|
|
{
|
|
|
|
|
"base_info": {
|
|
|
|
|
"基础信息": {
|
|
|
|
|
"project_name": "测试项目1",
|
|
|
|
|
"project_code": "TP001",
|
|
|
|
|
"project_manager": "张三",
|
|
|
|
|
"start_date": "2024-01-10",
|
|
|
|
|
"end_date": "2024-12-31"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"qualification_review": {
|
|
|
|
|
"资格审查": {
|
|
|
|
|
"review_criteria": ["公司资质", "过往业绩", "财务报表"],
|
|
|
|
|
"required_documents": ["营业执照", "资质证书", "近三年财务报告"],
|
|
|
|
|
"minimum_requirements": {
|
|
|
|
|
"company_age": "至少5年",
|
|
|
|
|
"past_projects": "至少3个大型项目"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"technical_standards": {
|
|
|
|
|
"技术标": {
|
|
|
|
|
"technical_requirements": ["设备质量要求", "施工工艺", "安全标准"],
|
|
|
|
|
"materials_list": ["钢筋", "水泥", "电缆"],
|
|
|
|
|
"equipment_specs": {
|
|
|
|
|
"excavator": "型号X123",
|
|
|
|
|
"concrete_mixer": "型号Y456"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"commercial_standards": {
|
|
|
|
|
"商务标": {
|
|
|
|
|
"pricing_method": "固定总价",
|
|
|
|
|
"payment_schedule": ["30%合同签订", "40%中期支付", "30%项目完成支付"],
|
|
|
|
|
"contract_conditions": {
|
|
|
|
|
"warranty_period": "2年",
|
|
|
|
|
"penalty_clauses": "延期每周罚款5%"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"invalid_requirements": {
|
|
|
|
|
"无效标与废标项": {
|
|
|
|
|
"common_issues": ["未按要求提交保证金", "技术标不达标"],
|
|
|
|
|
"invalidation_reasons": {
|
|
|
|
|
"missing_documents": "缺少必要文件",
|
|
|
|
|
"unqualified_technical_specs": "技术规格不合要求"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"bidding_documents_requirements": {
|
|
|
|
|
"投标文件要求": {
|
|
|
|
|
"file_format": "PDF",
|
|
|
|
|
"submission_deadline": "2024-08-01 17:00",
|
|
|
|
|
"submission_location": "北京市某某大厦5楼",
|
|
|
|
|
"required_sections": ["公司简介", "技术方案", "商务报价"]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"opening_bid": {
|
|
|
|
|
"开评定标流程": {
|
|
|
|
|
"bid_opening_time": "2024-09-01 10:00",
|
|
|
|
|
"location": "会议室A",
|
|
|
|
|
"evaluation_criteria": ["价格", "技术能力", "项目经验"],
|
|
|
|
|
"evaluation_process": {
|
|
|
|
|
"first_round": "资格审查",
|
|
|
|
|
"second_round": "技术评分",
|
|
|
|
|
"final_round": "商务报价评定"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
filename = "test_file.pdf"
|
|
|
|
|
|
|
|
|
|
for i, data in enumerate(data_segments, 1):
|
|
|
|
|
response = {
|
|
|
|
|
'message': f'Processing segment {i}',
|
|
|
|
|
'filename': filename,
|
|
|
|
|
'data': data
|
|
|
|
|
}
|
|
|
|
|
yield f"data: {json.dumps(response, ensure_ascii=False)}\n\n"
|
|
|
|
|
time.sleep(3) # 每隔3秒发送一段数据
|
|
|
|
|
|
|
|
|
|
combined_data = {}
|
|
|
|
|
for segment in data_segments:
|
|
|
|
|
for outer_key, inner_dict in segment.items():
|
|
|
|
|
inner_key, inner_value = next(iter(inner_dict.items()))
|
|
|
|
|
combined_data[inner_key] = inner_value
|
|
|
|
|
|
|
|
|
|
procurement_reqs = {
|
|
|
|
|
"采购项目": "混凝土",
|
|
|
|
|
"数量": "500立方米",
|
|
|
|
|
"规格": "C30"
|
|
|
|
|
}
|
|
|
|
|
tech_deviation_response = {
|
|
|
|
|
'message': 'procurement_reqs',
|
|
|
|
|
'filename': filename,
|
|
|
|
|
'data': json.dumps(procurement_reqs, ensure_ascii=False)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
zige_deviation_table = {
|
|
|
|
|
"资格性检查": ["具有独立承担民事责任的能力;", "具有良好的商业信誉和健全的财务会计制度;",
|
|
|
|
|
"具有履行合同所必需的设备和专业技术能力;", "有依法缴纳税收和社会保障资金的良好记录;",
|
|
|
|
|
"参加政府采购活动前三年内,在经营活动中没有重大违法记录;"]
|
|
|
|
|
}
|
|
|
|
|
fuhe_deviation_table = {
|
|
|
|
|
"符合性检查": ["符合竞争性磋商文件第一部分竞争性磋商公告“六、其它补充事宜”第 1、2 条要求。",
|
|
|
|
|
"响应性文件签字和盖章齐全。", "满足磋商有效期。",
|
|
|
|
|
"供应商所提交的报价表未出现两个或两个以上不同报价。"]
|
|
|
|
|
}
|
|
|
|
|
shangwu_deviation_table = {
|
|
|
|
|
"商务要求偏离表": ["交货期(工期):合同签订之日起 15 个日历天内完成,并通过项目验收。", "采购人指定地点",
|
|
|
|
|
"本项目报价须为固定总价,包含但不限于:采购、实施、调试、试运行、验收、运维等所有完成本项目相关的一切费用。",
|
|
|
|
|
"项目质保期为一年,服务内容包括项目所有硬件和软件,质保期自项目验收合格后起算。",
|
|
|
|
|
"中标人在合同约定时间内完成所供货物的安装集成并投入正常使用,经采购人组织验收(终验)合格后,按合同约定及相关规定支付货款。"]
|
|
|
|
|
}
|
|
|
|
|
shangwu_star_deviation_table = {
|
|
|
|
|
"商务带星要求偏离表": ["交货期(工期):合同签订之日起 15 个日历天内完成,并通过项目验收。", "采购人指定地点",
|
|
|
|
|
"本项目报价须为固定总价,包含但不限于:采购、实施、调试、试运行、验收、运维等所有完成本项目相关的一切费用。",
|
|
|
|
|
"项目质保期为一年,服务内容包括项目所有硬件和软件,质保期自项目验收合格后起算。",
|
|
|
|
|
"中标人在合同约定时间内完成所供货物的安装集成并投入正常使用,经采购人组织验收(终验)合格后,按合同约定及相关规定支付货款。"]
|
|
|
|
|
}
|
|
|
|
|
jishu_star_deviation_table = {
|
|
|
|
|
"高清数字枪机": ["6、▲补光距离:红外光最远可达 30 m,白光最远可达 30 m", "▲音频: 1个内置麦克风"],
|
|
|
|
|
"高清数字半球机": ["▲音频:内置 1个麦克风", "▲供电方式: DC:12 V ± 25%,支持防反接保护; PoE: 802.3af,Class 3"],
|
|
|
|
|
"网络硬盘录像机": ["▲可接入 1T、2T、3T、4T、6T、8T、10T、12TB、14TB、16TB、 18TB、20TB容量的 SATA接口硬盘;",
|
|
|
|
|
"▲样机可在预览界面随意选择一个或多个通道,在预警面板实 时展示此通道的目标抓拍信息,包括:事件名称、事件触发时间、 人脸抓图;针对人脸比对同时显示姓名、相似度;针对车辆报警 同时显示车牌;针对人体和车辆目标,可分别显示“人体”、“车 辆”。",
|
|
|
|
|
"▲具有存储安全保障功能,当存储压力过高或硬盘出现性能 不足时,可优先录像业务存储;"]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
zigefuhe_deviation_response = {
|
|
|
|
|
'message': 'zigefuhe_deviation',
|
|
|
|
|
'filename': filename,
|
|
|
|
|
'data': json.dumps(zige_deviation_table, ensure_ascii=False)
|
|
|
|
|
}
|
|
|
|
|
shangwu_deviation_response = {
|
|
|
|
|
'message': 'shangwu_deviation',
|
|
|
|
|
'filename': filename,
|
|
|
|
|
'data': json.dumps(shangwu_deviation_table, ensure_ascii=False)
|
|
|
|
|
}
|
|
|
|
|
shangwu_star_deviation_response = {
|
|
|
|
|
'message': 'shangwu_star_deviation',
|
|
|
|
|
'filename': filename,
|
|
|
|
|
'data': json.dumps(shangwu_star_deviation_table, ensure_ascii=False)
|
|
|
|
|
}
|
|
|
|
|
jishu_star_deviation_response = {
|
|
|
|
|
'message': 'jishu_star_deviation',
|
|
|
|
|
'filename': filename,
|
|
|
|
|
'data': json.dumps(jishu_star_deviation_table, ensure_ascii=False)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
yield f"data:{json.dumps(zigefuhe_deviation_response, ensure_ascii=False)}\n\n"
|
|
|
|
|
yield f"data:{json.dumps(shangwu_deviation_response, ensure_ascii=False)}\n\n"
|
|
|
|
|
yield f"data:{json.dumps(shangwu_star_deviation_response, ensure_ascii=False)}\n\n"
|
|
|
|
|
yield f"data:{json.dumps(jishu_star_deviation_response, ensure_ascii=False)}\n\n"
|
|
|
|
|
yield f"data: {json.dumps(tech_deviation_response, ensure_ascii=False)}\n\n"
|
|
|
|
|
|
|
|
|
|
complete_response = {
|
|
|
|
|
'message': 'Combined data',
|
|
|
|
|
'filename': filename,
|
|
|
|
|
'data': combined_data
|
|
|
|
|
}
|
|
|
|
|
yield f"data: {json.dumps(complete_response, ensure_ascii=False)}\n\n"
|
|
|
|
|
|
|
|
|
|
final_response = {
|
|
|
|
|
'message': 'File processed successfully',
|
|
|
|
|
'filename': filename,
|
|
|
|
|
'data': 'END'
|
|
|
|
|
}
|
|
|
|
|
yield f"data: {json.dumps(final_response, ensure_ascii=False)}\n\n"
|