style
parent
d74349355a
commit
f2c03e879e
|
|
@ -32,7 +32,7 @@ const CustomerDetailModal = ({ open, customerId, onCancel, ...props }) => {
|
||||||
loading={customerDetailLoading}
|
loading={customerDetailLoading}
|
||||||
onCancel={onCancel}
|
onCancel={onCancel}
|
||||||
footer={<Button onClick={onCancel}>关闭</Button>}
|
footer={<Button onClick={onCancel}>关闭</Button>}
|
||||||
width={700}
|
width={900}
|
||||||
destroyOnHidden
|
destroyOnHidden
|
||||||
>
|
>
|
||||||
{detail && (
|
{detail && (
|
||||||
|
|
@ -41,7 +41,9 @@ const CustomerDetailModal = ({ open, customerId, onCancel, ...props }) => {
|
||||||
column={2}
|
column={2}
|
||||||
bordered
|
bordered
|
||||||
size="small"
|
size="small"
|
||||||
style={{ marginBottom: 16 }}
|
labelStyle={{
|
||||||
|
width: '120px'
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<Descriptions.Item label="客户名称">
|
<Descriptions.Item label="客户名称">
|
||||||
{detail.customerName}
|
{detail.customerName}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import { createPortal } from "react-dom";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将节点传送到 PageLayout footer 插槽(配合 footer={<div id="page-footer-slot" />} 使用)
|
||||||
|
* @param {String} [slotId] - 插槽节点 id
|
||||||
|
* @param {ReactNode} children - 底部按钮等内容,为空时不渲染
|
||||||
|
*/
|
||||||
|
const LayoutFooterPortal = ({ slotId = "page-footer-slot", children }) => {
|
||||||
|
const [slot, setSlot] = useState(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setSlot(document.getElementById(slotId));
|
||||||
|
}, [slotId]);
|
||||||
|
|
||||||
|
return slot && children ? createPortal(children, slot) : null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default LayoutFooterPortal;
|
||||||
|
|
@ -11,13 +11,14 @@
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border: 1px solid #e2e8f0;
|
border: 1px solid #e2e8f0;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
padding: 12px;
|
padding: 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
||||||
.stat-info {
|
.stat-info {
|
||||||
.stat-label {
|
.stat-label {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
|
||||||
color: #64748b;
|
color: #64748b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import {
|
||||||
Input,
|
Input,
|
||||||
Select,
|
Select,
|
||||||
ConfigProvider,
|
ConfigProvider,
|
||||||
|
Tag,
|
||||||
message,
|
message,
|
||||||
Upload,
|
Upload,
|
||||||
} from "antd";
|
} from "antd";
|
||||||
|
|
@ -18,6 +19,7 @@ import { AntdTableFuncControl } from "@cqsjjb/jjb-common-decorator/antd";
|
||||||
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
||||||
import { NS_INSP_NOTICE } from "~/enumerate/namespace";
|
import { NS_INSP_NOTICE } from "~/enumerate/namespace";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
|
import StatCardGroup from "~/components/StatCardGroup";
|
||||||
import "./index.less";
|
import "./index.less";
|
||||||
|
|
||||||
const { TextArea } = Input;
|
const { TextArea } = Input;
|
||||||
|
|
@ -113,12 +115,12 @@ const PROCESS_TYPE_OPTIONS = [
|
||||||
{ label: "查看办结结果", value: "查看办结结果" },
|
{ label: "查看办结结果", value: "查看办结结果" },
|
||||||
];
|
];
|
||||||
|
|
||||||
const statusTagClass = (code) => {
|
const statusTagColor = (code) => {
|
||||||
if (code === 1) return "inst-tag-danger";
|
if (code === 1) return "error";
|
||||||
if (code === 2) return "inst-tag-warning";
|
if (code === 2) return "warning";
|
||||||
if (code === 3) return "inst-tag-info";
|
if (code === 3) return "processing";
|
||||||
if (code === 4) return "inst-tag-success";
|
if (code === 4) return "success";
|
||||||
return "";
|
return undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
const statusDisplayName = (code, name) => {
|
const statusDisplayName = (code, name) => {
|
||||||
|
|
@ -135,11 +137,11 @@ const noticeTypeLabel = (record) => {
|
||||||
return record.inspTypeName || "监督检查通知";
|
return record.inspTypeName || "监督检查通知";
|
||||||
};
|
};
|
||||||
|
|
||||||
const noticeTypeTagClass = (record) => {
|
const noticeTypeTagColor = (record) => {
|
||||||
if (record.statusCode === 4) return "inst-tag-success";
|
if (record.statusCode === 4) return "success";
|
||||||
if (record.statusCode === 1) return "inst-tag-danger";
|
if (record.statusCode === 1) return "error";
|
||||||
if (record.statusCode === 3) return "inst-tag-info";
|
if (record.statusCode === 3) return "processing";
|
||||||
return "inst-tag-warning";
|
return "warning";
|
||||||
};
|
};
|
||||||
|
|
||||||
const formatDate = (val) => {
|
const formatDate = (val) => {
|
||||||
|
|
@ -428,23 +430,23 @@ const InstitutionInspectionNotice = (props) => {
|
||||||
title: "通知编号",
|
title: "通知编号",
|
||||||
dataIndex: "noticeNo",
|
dataIndex: "noticeNo",
|
||||||
width: 140,
|
width: 140,
|
||||||
render: (t) => <span className="inst-mono">{t || "-"}</span>,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "通知类型",
|
title: "通知类型",
|
||||||
dataIndex: "inspTypeName",
|
dataIndex: "inspTypeName",
|
||||||
width: 110,
|
width: 110,
|
||||||
render: (_, record) => (
|
render: (_, record) => (
|
||||||
<span className={`inst-tag ${noticeTypeTagClass(record)}`}>
|
<Tag color={noticeTypeTagColor(record)}>
|
||||||
{noticeTypeLabel(record)}
|
{noticeTypeLabel(record)}
|
||||||
</span>
|
</Tag>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "来源预警",
|
title: "来源预警",
|
||||||
dataIndex: "sourceRefNo",
|
dataIndex: "sourceRefNo",
|
||||||
width: 140,
|
width: 140,
|
||||||
render: (t) => t || "-",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "来源字段",
|
title: "来源字段",
|
||||||
|
|
@ -452,13 +454,9 @@ const InstitutionInspectionNotice = (props) => {
|
||||||
width: 180,
|
width: 180,
|
||||||
render: (_, record) => (
|
render: (_, record) => (
|
||||||
<div className="inst-source-list">
|
<div className="inst-source-list">
|
||||||
{record.sourceTypeName ? (
|
<Tag>{record.sourceTypeName || "监督检查"}</Tag>
|
||||||
<span className="inst-source-pill">{record.sourceTypeName}</span>
|
|
||||||
) : (
|
|
||||||
<span className="inst-source-pill">监督检查</span>
|
|
||||||
)}
|
|
||||||
{record.inspTypeName ? (
|
{record.inspTypeName ? (
|
||||||
<span className="inst-source-pill">{record.inspTypeName}</span>
|
<Tag>{record.inspTypeName}</Tag>
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
|
|
@ -480,9 +478,9 @@ const InstitutionInspectionNotice = (props) => {
|
||||||
dataIndex: "statusCode",
|
dataIndex: "statusCode",
|
||||||
width: 110,
|
width: 110,
|
||||||
render: (code, record) => (
|
render: (code, record) => (
|
||||||
<span className={`inst-tag ${statusTagClass(code)}`}>
|
<Tag color={statusTagColor(code)}>
|
||||||
{statusDisplayName(code, record.statusName)}
|
{statusDisplayName(code, record.statusName)}
|
||||||
</span>
|
</Tag>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
@ -531,40 +529,50 @@ const InstitutionInspectionNotice = (props) => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="inst-metrics">
|
<StatCardGroup
|
||||||
<div className="inst-metric-card">
|
items={[
|
||||||
<div>
|
{
|
||||||
<div className="label">监管消息总数</div>
|
key: "total",
|
||||||
<div className="value">{metrics.total}</div>
|
title: "监管消息总数",
|
||||||
<div className="hint">来源:监管端风险预警中心</div>
|
value: metrics.total,
|
||||||
</div>
|
valueColor: "#1e293b",
|
||||||
<div className="icon">✉️</div>
|
hint: "来源:监管端风险预警中心",
|
||||||
</div>
|
iconBg: "#eef2ff",
|
||||||
<div className="inst-metric-card">
|
iconColor: "#4f46e5",
|
||||||
<div>
|
iconText: "✉️",
|
||||||
<div className="label">待处理</div>
|
},
|
||||||
<div className="value danger">{metrics.pending}</div>
|
{
|
||||||
<div className="hint">需机构直接处理</div>
|
key: "pending",
|
||||||
</div>
|
title: "待处理",
|
||||||
<div className="icon">待</div>
|
value: metrics.pending,
|
||||||
</div>
|
valueColor: "#ff4d4f",
|
||||||
<div className="inst-metric-card">
|
hint: "需机构直接处理",
|
||||||
<div>
|
iconBg: "#fff1f0",
|
||||||
<div className="label">待监管复核</div>
|
iconColor: "#ff4d4f",
|
||||||
<div className="value warning">{metrics.feedback}</div>
|
iconText: "待",
|
||||||
<div className="hint">材料已提交</div>
|
},
|
||||||
</div>
|
{
|
||||||
<div className="icon">审</div>
|
key: "feedback",
|
||||||
</div>
|
title: "待监管复核",
|
||||||
<div className="inst-metric-card">
|
value: metrics.feedback,
|
||||||
<div>
|
valueColor: "#faad14",
|
||||||
<div className="label">已办结</div>
|
hint: "材料已提交",
|
||||||
<div className="value success">{metrics.closed}</div>
|
iconBg: "#fffbe6",
|
||||||
<div className="hint">办结消息可归档</div>
|
iconColor: "#faad14",
|
||||||
</div>
|
iconText: "审",
|
||||||
<div className="icon">结</div>
|
},
|
||||||
</div>
|
{
|
||||||
</div>
|
key: "closed",
|
||||||
|
title: "已办结",
|
||||||
|
value: metrics.closed,
|
||||||
|
valueColor: "#52c41a",
|
||||||
|
hint: "办结消息可归档",
|
||||||
|
iconBg: "#f6ffed",
|
||||||
|
iconColor: "#52c41a",
|
||||||
|
iconText: "结",
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
|
||||||
<div className="inst-note">
|
<div className="inst-note">
|
||||||
<strong>消息来源:</strong>
|
<strong>消息来源:</strong>
|
||||||
|
|
|
||||||
|
|
@ -41,76 +41,9 @@
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.inst-metrics {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
||||||
gap: 12px;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 1100px) {
|
|
||||||
.inst-metrics {
|
|
||||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-metric-card {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: flex-start;
|
|
||||||
gap: 8px;
|
|
||||||
padding: 14px 16px;
|
|
||||||
border: 1px solid #e2e8f0;
|
|
||||||
border-radius: 10px;
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-metric-card .label {
|
|
||||||
font-size: 16px;
|
|
||||||
color: #64748b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-metric-card .value {
|
|
||||||
font-size: 20px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #0f172a;
|
|
||||||
margin: 4px 0;
|
|
||||||
line-height: 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-metric-card .value.danger {
|
|
||||||
color: #dc2626;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-metric-card .value.warning {
|
|
||||||
color: #d97706;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-metric-card .value.success {
|
|
||||||
color: #059669;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-metric-card .hint {
|
|
||||||
font-size: 16px;
|
|
||||||
color: #94a3b8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-metric-card .icon {
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
border-radius: 8px;
|
|
||||||
background: #f1f5f9;
|
|
||||||
color: #64748b;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
font-size: 14px;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-note {
|
.inst-note {
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
padding: 10px 12px;
|
padding: 6px 12px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
background: #f8fafc;
|
background: #f8fafc;
|
||||||
border: 1px solid #e2e8f0;
|
border: 1px solid #e2e8f0;
|
||||||
|
|
@ -124,7 +57,7 @@
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
margin-bottom: 12px;
|
margin-bottom: 6px;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -145,38 +78,6 @@
|
||||||
color: #999;
|
color: #999;
|
||||||
}
|
}
|
||||||
|
|
||||||
.inst-tag {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 2px 8px;
|
|
||||||
border-radius: 999px;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 500;
|
|
||||||
background: #f1f5f9;
|
|
||||||
color: #475569;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-tag-success {
|
|
||||||
background: #d1fae5;
|
|
||||||
color: #065f46;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-tag-info {
|
|
||||||
background: #dbeafe;
|
|
||||||
color: #1e40af;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-tag-warning {
|
|
||||||
background: #fef3c7;
|
|
||||||
color: #92400e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-tag-danger {
|
|
||||||
background: #fee2e2;
|
|
||||||
color: #991b1b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.inst-modal-section {
|
.inst-modal-section {
|
||||||
border: 1px solid #e2e8f0;
|
border: 1px solid #e2e8f0;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
|
|
@ -272,16 +173,6 @@
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.inst-source-pill {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 0 6px;
|
|
||||||
border-radius: 999px;
|
|
||||||
font-size: 14px;
|
|
||||||
background: #eff6ff;
|
|
||||||
color: #1d4ed8;
|
|
||||||
border: 1px solid #bfdbfe;
|
|
||||||
}
|
|
||||||
|
|
||||||
.inst-upload-tip {
|
.inst-upload-tip {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #64748b;
|
color: #64748b;
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ export default function ChangeHistoryModal({ open, filingId, onCancel }) {
|
||||||
<Modal
|
<Modal
|
||||||
open={open}
|
open={open}
|
||||||
title="备案变更记录"
|
title="备案变更记录"
|
||||||
width={560}
|
width={790}
|
||||||
destroyOnHidden
|
destroyOnHidden
|
||||||
cancelText="关闭"
|
cancelText="关闭"
|
||||||
okButtonProps={{ style: { display: "none" } }}
|
okButtonProps={{ style: { display: "none" } }}
|
||||||
|
|
@ -55,7 +55,7 @@ export default function ChangeHistoryModal({ open, filingId, onCancel }) {
|
||||||
columns={[
|
columns={[
|
||||||
{ title: "序号", width: 60, render: (_, __, index) => index + 1 },
|
{ title: "序号", width: 60, render: (_, __, index) => index + 1 },
|
||||||
{ title: "变更事项", dataIndex: "changeItemName" },
|
{ title: "变更事项", dataIndex: "changeItemName" },
|
||||||
{ title: "变更时间", dataIndex: "changeTime", width: 120 },
|
{ title: "变更时间", dataIndex: "changeTime", width: 200 },
|
||||||
{ title: "操作人", dataIndex: "operatorName", width: 100, render: (val) => val || "-" },
|
{ title: "操作人", dataIndex: "operatorName", width: 100, render: (val) => val || "-" },
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -393,7 +393,7 @@ const CustomerManage = (props) => {
|
||||||
</Row>
|
</Row>
|
||||||
|
|
||||||
<Form.Item label="经营地址">
|
<Form.Item label="经营地址">
|
||||||
<Flex>
|
<Flex align="center" gap={10}>
|
||||||
<Form.Item name="businessAddress" noStyle>
|
<Form.Item name="businessAddress" noStyle>
|
||||||
<Input placeholder="请输入经营地址" disabled maxLength={200} />
|
<Input placeholder="请输入经营地址" disabled maxLength={200} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ import { tools } from "@cqsjjb/jjb-common-lib";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import {EVAL_TYPE_OPTIONS} from '~/enumerate/constant';
|
import {EVAL_TYPE_OPTIONS} from '~/enumerate/constant';
|
||||||
import {QUALIFICATION_INDUSTRY_OPTIONS} from '~/enumerate/enterpriseOptions';
|
import {QUALIFICATION_INDUSTRY_OPTIONS} from '~/enumerate/enterpriseOptions';
|
||||||
|
import StatCardGroup from "~/components/StatCardGroup";
|
||||||
|
|
||||||
import "./index.less";
|
import "./index.less";
|
||||||
|
|
||||||
|
|
@ -719,29 +720,35 @@ const EvalReportLibrary = (props) => {
|
||||||
];
|
];
|
||||||
|
|
||||||
const summaryItems = [
|
const summaryItems = [
|
||||||
{ key: "totalCount", label: "报告总数", value: statData.totalCount },
|
{
|
||||||
|
key: "totalCount",
|
||||||
|
title: "报告总数",
|
||||||
|
value: statData.totalCount,
|
||||||
|
valueColor: "#1e293b",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key: "recentThreeYearCount",
|
key: "recentThreeYearCount",
|
||||||
label: "近三年报告",
|
title: "近三年报告",
|
||||||
value: statData.recentThreeYearCount,
|
value: statData.recentThreeYearCount,
|
||||||
|
valueColor: "#1e293b",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "submittedCount",
|
key: "submittedCount",
|
||||||
label: "已报送监管",
|
title: "已报送监管",
|
||||||
value: statData.submittedCount,
|
value: statData.submittedCount,
|
||||||
color: "#059669",
|
valueColor: "#059669",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "incompleteCount",
|
key: "incompleteCount",
|
||||||
label: "待完善分类",
|
title: "待完善分类",
|
||||||
value: statData.incompleteCount,
|
value: statData.incompleteCount,
|
||||||
color: "#d97706",
|
valueColor: "#d97706",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "spotcheckingCount",
|
key: "spotcheckingCount",
|
||||||
label: "监管抽查中",
|
title: "监管抽查中",
|
||||||
value: statData.spotcheckingCount,
|
value: statData.spotcheckingCount,
|
||||||
color: "#2563eb",
|
valueColor: "#2563eb",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -784,16 +791,7 @@ const EvalReportLibrary = (props) => {
|
||||||
上传过去三年已执行项目的正式报告,按年度、评价类型、行业和企业分类管理,并可报送监管端抽查。
|
上传过去三年已执行项目的正式报告,按年度、评价类型、行业和企业分类管理,并可报送监管端抽查。
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="erl-summary">
|
<StatCardGroup items={summaryItems} />
|
||||||
{summaryItems.map((item) => (
|
|
||||||
<div key={item.key} className="erl-summary-item">
|
|
||||||
<span>{item.label}</span>
|
|
||||||
<strong style={item.color ? { color: item.color } : undefined}>
|
|
||||||
{item.value ?? "-"}
|
|
||||||
</strong>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<SearchForm
|
<SearchForm
|
||||||
form={searchForm}
|
form={searchForm}
|
||||||
|
|
|
||||||
|
|
@ -15,39 +15,6 @@
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 顶栏汇总 - 原型 .report-library-summary>div { border-radius: 6px } */
|
|
||||||
.erl-summary {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(5, minmax(0, 1fr));
|
|
||||||
gap: 11px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.erl-summary-item {
|
|
||||||
padding: 13px;
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #dce4ec;
|
|
||||||
border-radius: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.erl-summary-item span,
|
|
||||||
.erl-summary-item strong {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.erl-summary-item span {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #64748b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.erl-summary-item strong {
|
|
||||||
font-size: 19px;
|
|
||||||
margin-top: 2px;
|
|
||||||
color: #0f172a;
|
|
||||||
font-weight: 600;
|
|
||||||
line-height: 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 报告名称文件图标 - 原型 .report-file-cell i { border-radius: 4px } */
|
/* 报告名称文件图标 - 原型 .report-file-cell i { border-radius: 4px } */
|
||||||
.erl-file-cell {
|
.erl-file-cell {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
@ -350,18 +317,7 @@
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 1200px) {
|
|
||||||
.erl-summary {
|
|
||||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
/* 原型 media:.report-library-summary { grid-template-columns: repeat(2,1fr) } */
|
|
||||||
.erl-summary {
|
|
||||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
||||||
}
|
|
||||||
|
|
||||||
.erl-upload-box-inner {
|
.erl-upload-box-inner {
|
||||||
grid-template-columns: 54px 1fr;
|
grid-template-columns: 54px 1fr;
|
||||||
}
|
}
|
||||||
|
|
@ -372,9 +328,3 @@
|
||||||
justify-self: start;
|
justify-self: start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 480px) {
|
|
||||||
.erl-summary {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ import dayjs from "dayjs";
|
||||||
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
||||||
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
||||||
import { tools } from "@cqsjjb/jjb-common-lib";
|
import { tools } from "@cqsjjb/jjb-common-lib";
|
||||||
|
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
||||||
|
|
||||||
const { router } = tools;
|
const { router } = tools;
|
||||||
|
|
||||||
|
|
@ -193,23 +194,20 @@ const ArchiveContent = ({ readOnly, ...props }) => {
|
||||||
</Row>
|
</Row>
|
||||||
</Form>
|
</Form>
|
||||||
|
|
||||||
<Flex
|
|
||||||
justify="space-between"
|
|
||||||
align="center"
|
|
||||||
style={{ marginTop: 12, paddingBottom: 16 }}
|
|
||||||
>
|
|
||||||
{!readOnly && (
|
{!readOnly && (
|
||||||
|
<LayoutFooterPortal slotId="pf-footer-slot">
|
||||||
|
<Flex justify="flex-end" gap={8}>
|
||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
onClick={handleArchive}
|
onClick={handleArchive}
|
||||||
loading={props.safetyEvalBusiness?.processControlArchiveLoading}
|
loading={props.safetyEvalBusiness?.processControlArchiveLoading}
|
||||||
disabled={!canArchive || archiveFlag}
|
disabled={!canArchive || archiveFlag}
|
||||||
|
|
||||||
>
|
>
|
||||||
{archiveFlag ? '已归档' : '双方签字并确认入库'}
|
{archiveFlag ? '已归档' : '双方签字并确认入库'}
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
|
||||||
</Flex>
|
</Flex>
|
||||||
|
</LayoutFooterPortal>
|
||||||
|
)}
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import { district } from "~/enumerate/constant";
|
||||||
import { phoneRule } from "~/utils/validators";
|
import { phoneRule } from "~/utils/validators";
|
||||||
import { tools } from "@cqsjjb/jjb-common-lib";
|
import { tools } from "@cqsjjb/jjb-common-lib";
|
||||||
import AttachmentUpload from "~/components/AttachmentUpload";
|
import AttachmentUpload from "~/components/AttachmentUpload";
|
||||||
|
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
||||||
|
|
||||||
const { router } = tools;
|
const { router } = tools;
|
||||||
const { TextArea } = Input;
|
const { TextArea } = Input;
|
||||||
|
|
@ -530,8 +531,9 @@ const ContractContent = ({ readOnly, ...props }) => {
|
||||||
</Form>
|
</Form>
|
||||||
|
|
||||||
{!readOnly && (
|
{!readOnly && (
|
||||||
|
<LayoutFooterPortal slotId="pf-footer-slot">
|
||||||
<Flex justify="flex-end" gap={8}>
|
<Flex justify="flex-end" gap={8}>
|
||||||
<Button onClick={() => props.history.goBack()}>取消</Button>
|
|
||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
onClick={handleSave}
|
onClick={handleSave}
|
||||||
|
|
@ -540,6 +542,7 @@ const ContractContent = ({ readOnly, ...props }) => {
|
||||||
完成合同录入并保存
|
完成合同录入并保存
|
||||||
</Button>
|
</Button>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
</LayoutFooterPortal>
|
||||||
)}
|
)}
|
||||||
</Card>
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import { CheckCircleFilled } from "@ant-design/icons";
|
||||||
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
||||||
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
||||||
import { tools } from "@cqsjjb/jjb-common-lib";
|
import { tools } from "@cqsjjb/jjb-common-lib";
|
||||||
|
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
||||||
|
|
||||||
const { TextArea } = Input;
|
const { TextArea } = Input;
|
||||||
const { router } = tools;
|
const { router } = tools;
|
||||||
|
|
@ -266,18 +267,6 @@ const ControlContent = ({ readOnly, ...props }) => {
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
<Flex justify="flex-end" gap={8} style={{ padding: "12px 0" }}>
|
|
||||||
{!readOnly && (
|
|
||||||
<Button
|
|
||||||
type="primary"
|
|
||||||
disabled={ ["dispatched", 'completed'].includes(processControl?.reviewerSignatureTaskStatus)}
|
|
||||||
onClick={() => handleConfirm("passed")}
|
|
||||||
loading={props.safetyEvalBusiness?.processControlConfirmLoading}
|
|
||||||
>
|
|
||||||
{reviewerSignatureTaskStatusMap[processControl?.reviewerSignatureTaskStatus] || '过程控制签字提交'}
|
|
||||||
</Button>
|
|
||||||
)}
|
|
||||||
</Flex>
|
|
||||||
</Card>
|
</Card>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|
@ -373,6 +362,21 @@ const ControlContent = ({ readOnly, ...props }) => {
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{step === 1 && !readOnly && (
|
||||||
|
<LayoutFooterPortal slotId="pf-footer-slot">
|
||||||
|
<Flex justify="flex-end" gap={8}>
|
||||||
|
<Button
|
||||||
|
type="primary"
|
||||||
|
disabled={ ["dispatched", 'completed'].includes(processControl?.reviewerSignatureTaskStatus)}
|
||||||
|
onClick={() => handleConfirm("passed")}
|
||||||
|
loading={props.safetyEvalBusiness?.processControlConfirmLoading}
|
||||||
|
>
|
||||||
|
{reviewerSignatureTaskStatusMap[processControl?.reviewerSignatureTaskStatus] || '过程控制签字提交'}
|
||||||
|
</Button>
|
||||||
|
</Flex>
|
||||||
|
</LayoutFooterPortal>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ import {
|
||||||
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
||||||
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
||||||
import { tools } from "@cqsjjb/jjb-common-lib";
|
import { tools } from "@cqsjjb/jjb-common-lib";
|
||||||
|
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
||||||
|
|
||||||
const { TextArea } = Input;
|
const { TextArea } = Input;
|
||||||
const { router } = tools;
|
const { router } = tools;
|
||||||
|
|
@ -317,7 +318,8 @@ const InternalReviewContent = ({ readOnly, ...props }) => {
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
{!readOnly && (
|
{!readOnly && (
|
||||||
<Flex justify="flex-end" gap={8} style={{ marginTop: 16 }}>
|
<LayoutFooterPortal slotId="pf-footer-slot">
|
||||||
|
<Flex justify="flex-end" gap={8}>
|
||||||
<Button
|
<Button
|
||||||
loading={props.safetyEvalBusiness?.internalReviewConfirmLoading}
|
loading={props.safetyEvalBusiness?.internalReviewConfirmLoading}
|
||||||
onClick={() => handleConfirm("not_passed")}
|
onClick={() => handleConfirm("not_passed")}
|
||||||
|
|
@ -332,6 +334,7 @@ const InternalReviewContent = ({ readOnly, ...props }) => {
|
||||||
确认修改并提交技审
|
确认修改并提交技审
|
||||||
</Button>
|
</Button>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
</LayoutFooterPortal>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ import {EVAL_TYPE_OPTIONS} from '~/enumerate/constant';
|
||||||
import { QUALIFICATION_INDUSTRY_OPTIONS } from "~/enumerate/enterpriseOptions";
|
import { QUALIFICATION_INDUSTRY_OPTIONS } from "~/enumerate/enterpriseOptions";
|
||||||
import { tools } from "@cqsjjb/jjb-common-lib";
|
import { tools } from "@cqsjjb/jjb-common-lib";
|
||||||
import AttachmentUpload from "~/components/AttachmentUpload";
|
import AttachmentUpload from "~/components/AttachmentUpload";
|
||||||
|
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
||||||
|
|
||||||
const { router } = tools;
|
const { router } = tools;
|
||||||
const { TextArea } = Input;
|
const { TextArea } = Input;
|
||||||
|
|
@ -543,7 +544,8 @@ const RiskAnalysisContent = ({ readOnly, ...props }) => {
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
{!readOnly && (
|
{!readOnly && (
|
||||||
<Flex justify="flex-end" gap={8} style={{marginTop: '8px'}}>
|
<LayoutFooterPortal slotId="pf-footer-slot">
|
||||||
|
<Flex justify="flex-end" gap={8}>
|
||||||
<Button
|
<Button
|
||||||
onClick={() => handleSave(1)}
|
onClick={() => handleSave(1)}
|
||||||
loading={riskAnalysisSaveLoading}
|
loading={riskAnalysisSaveLoading}
|
||||||
|
|
@ -559,6 +561,7 @@ const RiskAnalysisContent = ({ readOnly, ...props }) => {
|
||||||
完成分析并保存
|
完成分析并保存
|
||||||
</Button>
|
</Button>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
</LayoutFooterPortal>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</Spin>
|
</Spin>
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
||||||
import { tools } from "@cqsjjb/jjb-common-lib";
|
import { tools } from "@cqsjjb/jjb-common-lib";
|
||||||
import AttachmentUpload from "~/components/AttachmentUpload";
|
import AttachmentUpload from "~/components/AttachmentUpload";
|
||||||
import {ROLE_DEFINITIONS_MAP} from '~/enumerate/constant'
|
import {ROLE_DEFINITIONS_MAP} from '~/enumerate/constant'
|
||||||
|
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
||||||
import "./index.less";
|
import "./index.less";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
|
|
||||||
|
|
@ -353,7 +354,8 @@ const SurveyContent = ({ readOnly, ...props }) => {
|
||||||
</div>
|
</div>
|
||||||
</Form>
|
</Form>
|
||||||
|
|
||||||
<Flex justify="flex-end" gap={8} style={{ marginTop: 16 }}>
|
<LayoutFooterPortal slotId="pf-footer-slot">
|
||||||
|
<Flex justify="flex-end" gap={8}>
|
||||||
{!isFirst && <Button onClick={goPrev} disabled={evalSurveySaveAttachLoading}>上一步</Button>}
|
{!isFirst && <Button onClick={goPrev} disabled={evalSurveySaveAttachLoading}>上一步</Button>}
|
||||||
{isLast ? (
|
{isLast ? (
|
||||||
!readOnly && <Button type="primary" onClick={handleSave} loading={evalSurveySaveAttachLoading}>保存</Button>
|
!readOnly && <Button type="primary" onClick={handleSave} loading={evalSurveySaveAttachLoading}>保存</Button>
|
||||||
|
|
@ -361,6 +363,7 @@ const SurveyContent = ({ readOnly, ...props }) => {
|
||||||
<Button type="primary" onClick={goNext} disabled={evalSurveySaveAttachLoading}>下一步</Button>
|
<Button type="primary" onClick={goNext} disabled={evalSurveySaveAttachLoading}>下一步</Button>
|
||||||
)}
|
)}
|
||||||
</Flex>
|
</Flex>
|
||||||
|
</LayoutFooterPortal>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
||||||
import { tools } from "@cqsjjb/jjb-common-lib";
|
import { tools } from "@cqsjjb/jjb-common-lib";
|
||||||
import { ROLE_DEFINITIONS } from "~/enumerate/constant";
|
import { ROLE_DEFINITIONS } from "~/enumerate/constant";
|
||||||
import StatCardGroup from "~/components/StatCardGroup";
|
import StatCardGroup from "~/components/StatCardGroup";
|
||||||
|
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
||||||
|
|
||||||
const { router } = tools;
|
const { router } = tools;
|
||||||
|
|
||||||
|
|
@ -342,8 +343,9 @@ const TeamContent = ({ readOnly, ...props }) => {
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<Flex justify="flex-end" gap={8} className="pf-bottom-actions">
|
|
||||||
{!readOnly && (
|
{!readOnly && (
|
||||||
|
<LayoutFooterPortal slotId="pf-footer-slot">
|
||||||
|
<Flex justify="flex-end" gap={8}>
|
||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
loading={memberSaveLoading}
|
loading={memberSaveLoading}
|
||||||
|
|
@ -351,8 +353,9 @@ const TeamContent = ({ readOnly, ...props }) => {
|
||||||
>
|
>
|
||||||
确认项目组
|
确认项目组
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
|
||||||
</Flex>
|
</Flex>
|
||||||
|
</LayoutFooterPortal>
|
||||||
|
)}
|
||||||
|
|
||||||
<Modal
|
<Modal
|
||||||
title="添加项目人员与角色"
|
title="添加项目人员与角色"
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ import {
|
||||||
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
import { Connect } from "@cqsjjb/jjb-dva-runtime";
|
||||||
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
import { NS_SAFETY_EVAL_BUSINESS } from "~/enumerate/namespace";
|
||||||
import { tools } from "@cqsjjb/jjb-common-lib";
|
import { tools } from "@cqsjjb/jjb-common-lib";
|
||||||
|
import LayoutFooterPortal from "~/components/LayoutFooterPortal";
|
||||||
|
|
||||||
const { TextArea } = Input;
|
const { TextArea } = Input;
|
||||||
const { router } = tools;
|
const { router } = tools;
|
||||||
|
|
@ -316,7 +317,8 @@ const TechnicalReviewContent = ({ readOnly, ...props }) => {
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
{!readOnly && (
|
{!readOnly && (
|
||||||
<Flex justify="flex-end" gap={8} style={{ marginTop: 16 }}>
|
<LayoutFooterPortal slotId="pf-footer-slot">
|
||||||
|
<Flex justify="flex-end" gap={8}>
|
||||||
<Button
|
<Button
|
||||||
loading={props.safetyEvalBusiness?.techReviewConfirmLoading}
|
loading={props.safetyEvalBusiness?.techReviewConfirmLoading}
|
||||||
onClick={() => handleConfirm("not_passed")}
|
onClick={() => handleConfirm("not_passed")}
|
||||||
|
|
@ -331,6 +333,7 @@ const TechnicalReviewContent = ({ readOnly, ...props }) => {
|
||||||
确认技审并提交过程控制
|
确认技审并提交过程控制
|
||||||
</Button>
|
</Button>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
</LayoutFooterPortal>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -247,6 +247,7 @@ const ProjectFlow = (props) => {
|
||||||
<PageLayout
|
<PageLayout
|
||||||
history={props.history}
|
history={props.history}
|
||||||
previous
|
previous
|
||||||
|
footer={<div id="pf-footer-slot" />}
|
||||||
title={
|
title={
|
||||||
<div>
|
<div>
|
||||||
<span>项目工作台</span>
|
<span>项目工作台</span>
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,11 @@
|
||||||
padding-top: 0px;
|
padding-top: 0px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// footer 插槽为空时隐藏 PageLayout 底栏
|
||||||
|
[class*="-lay-container-bottom"]:has(> #pf-footer-slot:empty) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
.pf {
|
.pf {
|
||||||
|
|
||||||
// 区块头部
|
// 区块头部
|
||||||
|
|
@ -207,11 +212,6 @@
|
||||||
line-height: 1.55;
|
line-height: 1.55;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 项目组 - 底部操作行
|
|
||||||
&-bottom-actions {
|
|
||||||
margin-top: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 弹窗 - 提示文字
|
// 弹窗 - 提示文字
|
||||||
&-modal-hint {
|
&-modal-hint {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,11 @@ export default class Container extends React.Component {
|
||||||
theme={{
|
theme={{
|
||||||
token: this.token,
|
token: this.token,
|
||||||
algorithm: this.algorithm,
|
algorithm: this.algorithm,
|
||||||
|
components: {
|
||||||
|
Tag: {
|
||||||
|
fontSizeSM: 13,
|
||||||
|
},
|
||||||
|
},
|
||||||
}}
|
}}
|
||||||
locale={language}
|
locale={language}
|
||||||
prefixCls={window.process.env.app.antd["ant-prefix"]}
|
prefixCls={window.process.env.app.antd["ant-prefix"]}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
color: rgba(0, 0, 0, 0.45);
|
color: rgba(0, 0, 0, 0.45);
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
line-height: 22px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
.micro-temp-page-header-heading-left{
|
.micro-temp-page-header-heading-left{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue