258 lines
11 KiB
Python
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_()) |