pingtai_test/project_upload.py

258 lines
11 KiB
Python

import sys
import requests
import json
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
QLabel, QLineEdit, QPushButton, QTextEdit, QMessageBox,
QComboBox, QDateEdit, QFileDialog, QGroupBox)
from PyQt5.QtCore import Qt, QDate
from PyQt5.QtGui import QIntValidator
class ProjectAddWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("新增项目")
self.setGeometry(100, 100, 650, 900)
self.init_ui()
def init_ui(self):
# 主窗口部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout()
# 1. 基本信息分组
basic_info_group = QGroupBox("基本信息")
basic_layout = QVBoxLayout()
# 项目名称
self.project_name_input = self.create_label_input(basic_layout, "项目名称*:", QLineEdit())
# 项目经理ID
self.manager_id_input = self.create_label_input(basic_layout, "项目经理ID*:", QLineEdit())
# 项目状态
status_layout = QHBoxLayout()
status_layout.addWidget(QLabel("项目状态:"))
self.status_combo = QComboBox()
self.status_combo.addItems(["待施工 (0)", "施工中 (1)", "已完工 (2)", "已审核 (3)", "已验收 (4)"])
status_layout.addWidget(self.status_combo)
basic_layout.addLayout(status_layout)
# 项目规模
self.scale_input = self.create_label_input(basic_layout, "项目规模:", QLineEdit())
# 开始日期
start_date_layout = QHBoxLayout()
start_date_layout.addWidget(QLabel("开始日期:"))
self.start_date_input = QDateEdit()
self.start_date_input.setCalendarPopup(True)
self.start_date_input.setDate(QDate.currentDate())
self.start_date_input.setSpecialValueText("未设置")
self.start_date_input.setMinimumDate(QDate(1900, 1, 1))
start_date_layout.addWidget(self.start_date_input)
basic_layout.addLayout(start_date_layout)
# 结束日期
end_date_layout = QHBoxLayout()
end_date_layout.addWidget(QLabel("结束日期:"))
self.end_date_input = QDateEdit()
self.end_date_input.setCalendarPopup(True)
self.end_date_input.setDate(QDate.currentDate())
self.end_date_input.setSpecialValueText("未设置")
self.end_date_input.setMinimumDate(QDate(1900, 1, 1))
end_date_layout.addWidget(self.end_date_input)
basic_layout.addLayout(end_date_layout)
# 工期
self.duration_input = self.create_label_input(basic_layout, "工期(天):", QLineEdit())
self.duration_input.setValidator(QIntValidator(0, 9999))
# 项目封面
self.cover_url = ""
cover_layout = QHBoxLayout()
cover_layout.addWidget(QLabel("项目封面:"))
self.cover_label = QLabel("未选择封面图")
self.cover_label.setStyleSheet("color: #666; font-style: italic;")
cover_layout.addWidget(self.cover_label)
self.select_cover_btn = QPushButton("选择图片")
self.select_cover_btn.clicked.connect(self.select_cover_image)
cover_layout.addWidget(self.select_cover_btn)
basic_layout.addLayout(cover_layout)
basic_info_group.setLayout(basic_layout)
layout.addWidget(basic_info_group)
# 2. 委托方信息分组
client_group = QGroupBox("委托方信息")
client_layout = QVBoxLayout()
self.client_input = self.create_label_input(client_layout, "委托单位:", QLineEdit())
self.client_contact_input = self.create_label_input(client_layout, "联系人:", QLineEdit())
self.client_phone_input = self.create_label_input(client_layout, "联系电话:", QLineEdit())
client_group.setLayout(client_layout)
layout.addWidget(client_group)
# 3. 检查方信息分组
inspection_group = QGroupBox("检查方信息")
inspection_layout = QVBoxLayout()
self.inspection_unit_input = self.create_label_input(inspection_layout, "检查单位:", QLineEdit())
self.inspection_contact_input = self.create_label_input(inspection_layout, "联系人:", QLineEdit())
self.inspection_phone_input = self.create_label_input(inspection_layout, "联系电话:", QLineEdit())
inspection_group.setLayout(inspection_layout)
layout.addWidget(inspection_group)
# 4. 风场信息分组
farm_group = QGroupBox("风场信息")
farm_layout = QVBoxLayout()
self.farm_name_input = self.create_label_input(farm_layout, "风场名称*:", QLineEdit())
self.farm_address_input = self.create_label_input(farm_layout, "风场地址:", QLineEdit())
self.turbine_model_input = self.create_label_input(farm_layout, "风机型号:", QLineEdit())
farm_group.setLayout(farm_layout)
layout.addWidget(farm_group)
# 5. 项目团队分组
team_group = QGroupBox("项目团队")
team_layout = QVBoxLayout()
self.team_leader_input = self.create_label_input(team_layout, "施工组长ID:", QLineEdit())
self.constructors_input = self.create_label_input(team_layout, "施工人员ID:", QLineEdit())
self.constructors_input.setPlaceholderText("多人用英文逗号分隔")
self.quality_officer_input = self.create_label_input(team_layout, "质量员ID:", QLineEdit())
self.auditor_input = self.create_label_input(team_layout, "安全员ID:", QLineEdit())
team_group.setLayout(team_layout)
layout.addWidget(team_group)
# 提交按钮
button_layout = QHBoxLayout()
button_layout.addStretch()
self.submit_btn = QPushButton("提交")
self.submit_btn.setFixedWidth(100)
self.submit_btn.clicked.connect(self.submit_data)
button_layout.addWidget(self.submit_btn)
layout.addLayout(button_layout)
central_widget.setLayout(layout)
def create_label_input(self, layout, label_text, input_widget):
"""创建标签和输入框的组合"""
row_layout = QHBoxLayout()
row_layout.addWidget(QLabel(label_text))
row_layout.addWidget(input_widget)
layout.addLayout(row_layout)
return input_widget
def select_cover_image(self):
options = QFileDialog.Options()
file_path, _ = QFileDialog.getOpenFileName(
self, "选择项目封面图", "",
"图片文件 (*.jpg *.jpeg *.png *.gif);;所有文件 (*.*)",
options=options
)
if file_path:
self.cover_url = file_path
self.cover_label.setText(file_path.split('/')[-1])
self.cover_label.setStyleSheet("color: #333; font-style: normal;")
def validate_inputs(self):
if not self.project_name_input.text().strip():
QMessageBox.warning(self, "输入错误", "项目名称不能为空!")
return False
if not self.farm_name_input.text().strip():
QMessageBox.warning(self, "输入错误", "风场名称不能为空!")
return False
if not self.manager_id_input.text().strip():
QMessageBox.warning(self, "输入错误", "项目经理ID不能为空!")
return False
return True
def submit_data(self):
if not self.validate_inputs():
return
# 构造请求数据
project_data = {
# 基本信息
"projectName": self.project_name_input.text().strip(),
"projectManagerId": self.manager_id_input.text().strip(),
"status": self.status_combo.currentIndex(),
"scale": self.scale_input.text().strip(),
"startDate": self.start_date_input.date().toString(
"yyyy-MM-dd") if not self.start_date_input.date().isNull() else "",
"endDate": self.end_date_input.date().toString(
"yyyy-MM-dd") if not self.end_date_input.date().isNull() else "",
"duration": int(self.duration_input.text()) if self.duration_input.text().strip() else 0,
"coverUrl": self.cover_url,
# 委托方信息
"client": self.client_input.text().strip(),
"clientContact": self.client_contact_input.text().strip(),
"clientPhone": self.client_phone_input.text().strip(),
# 检查方信息
"inspectionUnit": self.inspection_unit_input.text().strip(),
"inspectionContact": self.inspection_contact_input.text().strip(),
"inspectionPhone": self.inspection_phone_input.text().strip(),
# 风场信息
"farmName": self.farm_name_input.text().strip(),
"farmAddress": self.farm_address_input.text().strip(),
"turbineModel": self.turbine_model_input.text().strip(),
# 项目团队
"constructionTeamLeaderId": self.team_leader_input.text().strip(),
"constructorIds": self.constructors_input.text().strip(),
"qualityOfficerId": self.quality_officer_input.text().strip(),
"auditorId": self.auditor_input.text().strip()
}
# 清理空值
project_data = {k: v for k, v in project_data.items() if v or isinstance(v, int)}
# 确认对话框
reply = QMessageBox.question(
self, '确认提交',
'确定要提交这些项目信息吗?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No
)
if reply == QMessageBox.No:
return
# 提交数据
url = "http://pms.dtyx.net:9158/project"
headers = {
"Authorization": "null",
"Content-Type": "application/json"
}
try:
response = requests.post(url, headers=headers, data=json.dumps(project_data))
response.raise_for_status()
result = response.json()
QMessageBox.information(
self, "提交成功",
f"项目信息提交成功!\n\n响应结果:\n{json.dumps(result, indent=2)}"
)
except Exception as e:
QMessageBox.critical(
self, "提交失败",
f"项目信息提交失败!\n\n错误信息:\n{str(e)}"
)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = ProjectAddWindow()
window.show()
sys.exit(app.exec_())