2026-07-02 16:58:07 +08:00
|
|
|
|
import React, { useState, useEffect } from "react";
|
2026-07-02 15:01:19 +08:00
|
|
|
|
import { Button, Tag, Space, Modal, Select, Input, Form, Spin } from "antd";
|
2026-06-30 15:59:15 +08:00
|
|
|
|
import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout";
|
|
|
|
|
|
import { REVIEW_STATUS_MAP } from "~/enumerate/constant";
|
2026-07-02 15:01:19 +08:00
|
|
|
|
import { tools } from "@cqsjjb/jjb-common-lib";
|
|
|
|
|
|
import {
|
2026-07-02 16:58:07 +08:00
|
|
|
|
|
2026-07-02 15:01:19 +08:00
|
|
|
|
LEGAL_STATUS_STYLE,
|
2026-07-02 16:58:07 +08:00
|
|
|
|
} from "~/enumerate/constant";
|
2026-07-02 15:01:19 +08:00
|
|
|
|
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
|
|
|
|
|
import { NS_QUAL_REVIEW } from "~/enumerate/namespace";
|
2026-06-30 15:59:15 +08:00
|
|
|
|
import FilingTabs from "../FilingTabs";
|
|
|
|
|
|
import "./indes.less";
|
|
|
|
|
|
|
|
|
|
|
|
const { TextArea } = Input;
|
2026-07-02 15:01:19 +08:00
|
|
|
|
const {router}=tools;
|
2026-06-30 15:59:15 +08:00
|
|
|
|
|
|
|
|
|
|
const QualReviewForm = (props) => {
|
2026-07-02 16:58:07 +08:00
|
|
|
|
const { queryComplianceCheck, qualReview, fetchQualFilingDetail } = props;
|
|
|
|
|
|
const { qualReviewLoading, complianceCheckItems, fetchQualFilingDetailLoading, qualFilingDetail } = qualReview;
|
2026-07-01 09:25:31 +08:00
|
|
|
|
const [form] = Form.useForm();
|
2026-06-30 15:59:15 +08:00
|
|
|
|
const [compliance, setCompliance] = useState({});
|
|
|
|
|
|
const [reviewVisible, setReviewVisible] = useState(false);
|
2026-07-02 16:58:07 +08:00
|
|
|
|
|
|
|
|
|
|
const statusConfig = REVIEW_STATUS_MAP[qualFilingDetail.filingStatusCode];
|
2026-06-30 15:59:15 +08:00
|
|
|
|
|
2026-07-02 16:58:07 +08:00
|
|
|
|
const legalPassCount = complianceCheckItems.filter(
|
|
|
|
|
|
(i) => i.status === "PASS",
|
2026-07-02 15:01:19 +08:00
|
|
|
|
).length;
|
2026-07-02 16:58:07 +08:00
|
|
|
|
const legalFailCount = complianceCheckItems.filter(
|
|
|
|
|
|
(i) => i.status === "NOT_PASS",
|
2026-07-02 15:01:19 +08:00
|
|
|
|
).length;
|
2026-06-30 15:59:15 +08:00
|
|
|
|
|
|
|
|
|
|
const handleSubmit = (action) => {
|
2026-07-01 09:25:31 +08:00
|
|
|
|
form.validateFields().then((values) => {
|
|
|
|
|
|
console.log("审核提交:", { action, ...values, compliance });
|
|
|
|
|
|
setReviewVisible(false);
|
|
|
|
|
|
});
|
2026-06-30 15:59:15 +08:00
|
|
|
|
};
|
2026-07-02 15:01:19 +08:00
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
queryComplianceCheck({id: router.query.id});
|
2026-07-02 16:58:07 +08:00
|
|
|
|
fetchQualFilingDetail({id: router.query.id});
|
2026-07-02 15:01:19 +08:00
|
|
|
|
}, []);
|
2026-06-30 15:59:15 +08:00
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
|
<PageLayout
|
|
|
|
|
|
title={
|
|
|
|
|
|
<Space>
|
|
|
|
|
|
<span>资质备案审核</span>
|
2026-07-02 15:01:19 +08:00
|
|
|
|
{statusConfig && (
|
|
|
|
|
|
<Tag color={statusConfig.color}>{statusConfig.label}</Tag>
|
|
|
|
|
|
)}
|
2026-06-30 15:59:15 +08:00
|
|
|
|
</Space>
|
|
|
|
|
|
}
|
|
|
|
|
|
history={props.history}
|
|
|
|
|
|
previous
|
2026-07-02 15:01:19 +08:00
|
|
|
|
footer={
|
|
|
|
|
|
<Button type="primary" onClick={() => setReviewVisible(true)}>
|
|
|
|
|
|
审核操作
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
}
|
2026-06-30 15:59:15 +08:00
|
|
|
|
>
|
2026-07-02 16:58:07 +08:00
|
|
|
|
<Spin spinning={qualReviewLoading || fetchQualFilingDetailLoading}>
|
2026-07-02 15:01:19 +08:00
|
|
|
|
<div className="qual-review-form">
|
|
|
|
|
|
<div className="legal-check-bar">
|
|
|
|
|
|
<div className="legal-check-title">法律规定内容</div>
|
|
|
|
|
|
<div className="legal-check-grid">
|
|
|
|
|
|
{complianceCheckItems.map((item) => {
|
2026-07-02 16:58:07 +08:00
|
|
|
|
const style = LEGAL_STATUS_STYLE[item.status] || {};
|
2026-07-02 15:01:19 +08:00
|
|
|
|
return (
|
|
|
|
|
|
<div
|
2026-07-02 16:58:07 +08:00
|
|
|
|
key={item.title}
|
2026-07-02 15:01:19 +08:00
|
|
|
|
className="legal-check-item"
|
|
|
|
|
|
style={{
|
|
|
|
|
|
borderLeft: `3px solid ${style.borderColor}`,
|
|
|
|
|
|
background: style.bg,
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<span>{style.icon}</span>
|
|
|
|
|
|
<div>
|
|
|
|
|
|
<div style={{ fontWeight: 500 }}>{item.title}</div>
|
|
|
|
|
|
<div className="legal-check-item-desc">{item.description}</div>
|
|
|
|
|
|
</div>
|
2026-06-30 15:59:15 +08:00
|
|
|
|
</div>
|
2026-07-02 15:01:19 +08:00
|
|
|
|
);
|
|
|
|
|
|
})}
|
|
|
|
|
|
</div>
|
2026-06-30 15:59:15 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-07-02 15:01:19 +08:00
|
|
|
|
<FilingTabs
|
2026-07-02 16:58:07 +08:00
|
|
|
|
detail={qualFilingDetail}
|
2026-07-02 15:01:19 +08:00
|
|
|
|
isReview
|
|
|
|
|
|
compliance={compliance}
|
|
|
|
|
|
onComplianceChange={(id, v) =>
|
|
|
|
|
|
setCompliance((prev) => ({ ...prev, [id]: v }))
|
|
|
|
|
|
}
|
|
|
|
|
|
/>
|
2026-06-30 15:59:15 +08:00
|
|
|
|
|
2026-07-02 15:01:19 +08:00
|
|
|
|
<Modal
|
|
|
|
|
|
title="审核操作"
|
|
|
|
|
|
open={reviewVisible}
|
|
|
|
|
|
onCancel={() => setReviewVisible(false)}
|
|
|
|
|
|
width={580}
|
|
|
|
|
|
footer={
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{ display: "flex", justifyContent: "flex-end", gap: 8 }}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Button onClick={() => setReviewVisible(false)}>取消</Button>
|
|
|
|
|
|
<Button type="primary" onClick={() => handleSubmit("submit")}>
|
|
|
|
|
|
提交
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
<Button
|
|
|
|
|
|
type="primary"
|
|
|
|
|
|
style={{ background: "#52c41a", borderColor: "#52c41a" }}
|
|
|
|
|
|
onClick={() => handleSubmit("pass")}
|
|
|
|
|
|
>
|
|
|
|
|
|
通过
|
|
|
|
|
|
</Button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
background: "#f8fafc",
|
|
|
|
|
|
border: "1px solid #d9d9d9",
|
|
|
|
|
|
borderRadius: 6,
|
|
|
|
|
|
padding: "0.75rem",
|
|
|
|
|
|
marginBottom: "1rem",
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontSize: "0.88rem",
|
|
|
|
|
|
fontWeight: 600,
|
|
|
|
|
|
marginBottom: "0.5rem",
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
评价分析
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
display: "grid",
|
|
|
|
|
|
gridTemplateColumns: "1fr 1fr 1fr 1fr",
|
|
|
|
|
|
gap: "0.4rem",
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
<div style={statStyle}>
|
|
|
|
|
|
<div style={statLabelStyle}>已核验材料</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontSize: "1.1rem",
|
|
|
|
|
|
fontWeight: 700,
|
|
|
|
|
|
color: "#1677ff",
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{legalPassCount + legalFailCount}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div style={statStyle}>
|
|
|
|
|
|
<div style={statLabelStyle}>符合</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontSize: "1.1rem",
|
|
|
|
|
|
fontWeight: 700,
|
|
|
|
|
|
color: "#059669",
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{legalPassCount}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div style={statStyle}>
|
|
|
|
|
|
<div style={statLabelStyle}>不符合</div>
|
|
|
|
|
|
<div
|
|
|
|
|
|
style={{
|
|
|
|
|
|
fontSize: "1.1rem",
|
|
|
|
|
|
fontWeight: 700,
|
|
|
|
|
|
color: "#dc2626",
|
|
|
|
|
|
}}
|
|
|
|
|
|
>
|
|
|
|
|
|
{legalFailCount}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2026-06-30 15:59:15 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-07-02 15:01:19 +08:00
|
|
|
|
<Form form={form} layout="vertical" style={{ marginTop: "0.5rem" }}>
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
label="审核结果"
|
|
|
|
|
|
name="reviewResult"
|
|
|
|
|
|
rules={[{ required: true, message: "请选择审核结果" }]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Select placeholder="请选择">
|
|
|
|
|
|
<Select.Option value="pass">通过</Select.Option>
|
|
|
|
|
|
<Select.Option value="pending">待定</Select.Option>
|
|
|
|
|
|
<Select.Option value="reject">不通过</Select.Option>
|
|
|
|
|
|
</Select>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
label="指派专家"
|
|
|
|
|
|
name="expert"
|
|
|
|
|
|
rules={[{ required: true, message: "请选择专家" }]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<Select placeholder="— 请选择 —">
|
|
|
|
|
|
<Select.Option value="chen">陈教授(化工安全)</Select.Option>
|
|
|
|
|
|
<Select.Option value="li">李教授(矿山安全)</Select.Option>
|
|
|
|
|
|
<Select.Option value="wang">王高工(建筑施工)</Select.Option>
|
|
|
|
|
|
</Select>
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
<Form.Item
|
|
|
|
|
|
label="综合审核意见"
|
|
|
|
|
|
name="remark"
|
|
|
|
|
|
rules={[{ required: true, message: "请输入综合审核意见" }]}
|
|
|
|
|
|
>
|
|
|
|
|
|
<TextArea rows={3} placeholder="请输入综合审核意见..." />
|
|
|
|
|
|
</Form.Item>
|
|
|
|
|
|
</Form>
|
|
|
|
|
|
</Modal>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</Spin>
|
2026-06-30 15:59:15 +08:00
|
|
|
|
</PageLayout>
|
|
|
|
|
|
);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-07-02 15:01:19 +08:00
|
|
|
|
const statStyle = {
|
|
|
|
|
|
background: "#fff",
|
|
|
|
|
|
border: "1px solid #d9d9d9",
|
|
|
|
|
|
borderRadius: 6,
|
|
|
|
|
|
padding: "0.4rem",
|
|
|
|
|
|
textAlign: "center",
|
|
|
|
|
|
};
|
2026-06-30 15:59:15 +08:00
|
|
|
|
const statLabelStyle = { fontSize: "0.7rem", color: "rgba(0,0,0,0.45)" };
|
|
|
|
|
|
|
2026-07-02 15:01:19 +08:00
|
|
|
|
export default Connect(
|
|
|
|
|
|
[NS_QUAL_REVIEW],
|
|
|
|
|
|
true,
|
|
|
|
|
|
)(QualReviewForm);
|