方法配置页面

main
wangyunfei 2 weeks ago
parent a84978c586
commit e50ebb04c6

@ -18,7 +18,7 @@
background-color: #fff; background-color: #fff;
.menuItem { .menuItem {
width: 180px; width: 140px;
height: 50px; height: 50px;
background-color: #FFFFFF; background-color: #FFFFFF;
border-radius: 4px; border-radius: 4px;

@ -1,74 +1,167 @@
import React from 'react'; import React from 'react';
import {Button} from 'antd'; import {Button, Select} from 'antd';
import ReactECharts from 'echarts-for-react';
import styles from './step02.less'; import styles from './step02.less';
const Step02 = () => { const Step02 = () => {
// 半圆形仪表盘配置
const gaugeOption = {
series: [
{
type: 'gauge',
startAngle: 180,
endAngle: 0,
min: 0,
max: 100,
splitNumber: 10,
radius: '80%',
center: ['50%', '75%'],
axisLine: {
lineStyle: {
width: 20,
color: [
[0.48, '#00FFE1'], // 已填充部分 - 青色
[1, 'rgba(180, 180, 220, 0.3)'] // 未填充部分 - 浅蓝紫色
]
}
},
splitLine: {
show: true,
length: 10,
lineStyle: {
color: 'rgba(180, 180, 220, 0.5)',
type: 'dashed',
width: 1
}
},
axisTick: {
show: false
},
axisLabel: {
show: false
},
pointer: {
show: true,
length: '65%',
width: 2,
itemStyle: {
color: '#00FFE1'
}
},
detail: {
show: true,
offsetCenter: [0, '10%'],
fontSize: 48,
fontWeight: 'bold',
color: '#000',
formatter: function(value) {
return value;
}
},
data: [
{
value: 48,
name: '当前分值',
title: {
offsetCenter: [0, '25%'],
fontSize: 14,
color: '#000'
}
}
]
}
]
};
return ( return (
<div className={`${styles.stepContent} ${styles.step02Layout}`}> <div className={`${styles.stepContent} ${styles.step02Layout}`}>
{/* A 区域:评估方法(左侧 60% */} {/* A 区域:评估方法(左侧 60% */}
<div className={styles.leftPanel}> <div className={styles.leftPanel}>
{/* 可滚动内容区域 */} {/* 第一行:评估方法标题 + 下拉选择框 */}
<div className={styles.methodHeaderRow}>
<span className={styles.methodTitle}>评估方法</span>
<Select
defaultValue="lec"
className={styles.methodSelect}
options={[
{ value: 'lec', label: 'LEC评价法' }
]}
/>
</div>
{/* 第二行LEC评价法说明块 */}
<div className={styles.methodDescBlock}>
<div className={styles.methodDescTitle}>LEC评价法</div>
<div className={styles.methodDescContent}>
<div>公式: 风险分值 D = L x E x C</div>
<div>描述: 该方法简单易用,通过三个维度的主观判断对风险进行半定量评估适用于对作业活动设备设施等进行初步的风险筛查和等级排序</div>
</div>
</div>
{/* 参数块区域 */}
<div className={styles.methodWrapper}> <div className={styles.methodWrapper}>
{/* 参数1 */} {/* 参数L事故发生可能性 */}
<div className={styles.paramBlock}> <div className={styles.paramBlock}>
<div className={styles.paramHeader}> <div className={styles.paramHeader}>
<span className={styles.paramTitle}>参数1事故发生可能性</span> <span className={styles.paramTitle}>参数L: 事故发生可能性</span>
<span className={styles.paramDesc}>结合历史事故数据设备状况管理水平等评估事故发生的几率</span> </div>
<div className={styles.paramSubtitle}>
结合历史数据设备状况管理水平,评估事故发生的几率
</div> </div>
<div className={styles.optionRow}> <div className={styles.optionRow}>
<div className={styles.optionCard}>极不可能发生<br/>0.1</div> <div className={styles.optionCard}>实际不可能<br/>0.1</div>
<div className={`${styles.optionCard} ${styles.optionActive}`}>很不可能<br/>0.5</div> <div className={styles.optionCard}>极不可能<br/>0.2</div>
<div className={styles.optionCard}>偶尔发生<br/>1</div> <div className={`${styles.optionCard} ${styles.optionActive}`}>很不可能 可以设想<br/>0.5</div>
<div className={styles.optionCard}>可能但不经常<br/>3</div> <div className={styles.optionCard}>可能性小 完全意外<br/>1</div>
<div className={styles.optionCard}>可能 但不经常<br/>3</div>
<div className={styles.optionCard}>相当可能<br/>6</div> <div className={styles.optionCard}>相当可能<br/>6</div>
<div className={styles.optionCard}>完全可能<br/>10</div> <div className={styles.optionCard}>完全意外 不可预料<br/>10</div>
</div> </div>
<div className={styles.sliderRow}> <div className={styles.sliderRow}>
<span className={styles.sliderLabel}>参数取值</span> <span className={styles.sliderLabel}>参数权重</span>
<div className={styles.sliderBar}/> <div className={styles.sliderBar}/>
<span className={styles.sliderValue}>0.8</span> <span className={styles.sliderValue}>0.8</span>
</div> </div>
</div> </div>
{/* 参数2 */} {/* 参数E暴露于危险环境的频繁程度 */}
<div className={styles.paramBlock}> <div className={styles.paramBlock}>
<div className={styles.paramHeader}> <div className={styles.paramHeader}>
<span className={styles.paramTitle}>参数2暴露于危险环境的频繁程度</span> <span className={styles.paramTitle}>参数E: 暴露于危险环境的频繁程度</span>
<span className={styles.paramDesc}>人员或设备在危险环境中出现的频率</span> </div>
<div className={styles.paramSubtitle}>
人员出现在此危险环境下的时间频率
</div> </div>
<div className={styles.optionRow}> <div className={styles.optionRow}>
<div className={styles.optionCard}>几乎不接触<br/>0.5</div> <div className={`${styles.optionCard} ${styles.optionActive}`}>非常罕见 地暴露<br/>0.5</div>
<div className={styles.optionCard}>每年数次<br/>1</div> <div className={styles.optionCard}>可能 但不经常<br/>1</div>
<div className={styles.optionCard}>每月数次<br/>2</div> <div className={styles.optionCard}>每月一次 暴露<br/>2</div>
<div className={styles.optionCard}>每周数次<br/>3</div> <div className={styles.optionCard}>每周一次 或偶然暴露<br/>3</div>
<div className={styles.optionCard}>每天一次<br/>6</div> <div className={styles.optionCard}>每天工作 时间内暴露<br/>6</div>
<div className={styles.optionCard}>持续暴露<br/>10</div> <div className={styles.optionCard}>续暴露<br/>10</div>
</div> </div>
<div className={styles.sliderRow}> <div className={styles.sliderRow}>
<span className={styles.sliderLabel}>参数取值</span> <span className={styles.sliderLabel}>参数权重</span>
<div className={styles.sliderBar}/> <div className={styles.sliderBar}/>
<span className={styles.sliderValue}>0.8</span> <span className={styles.sliderValue}>0.8</span>
</div> </div>
</div> </div>
{/* 参数3 */} {/* 参数C发生事故可能造成的后果 */}
<div className={styles.paramBlock}> <div className={styles.paramBlock}>
<div className={styles.paramHeader}> <div className={styles.paramHeader}>
<span className={styles.paramTitle}>参数3发生事故可能造成的后果</span> <span className={styles.paramTitle}>参数C: 发生事故可能造成的后果</span>
<span className={styles.paramDesc}>对人员设备及环境的影响程度</span>
</div> </div>
<div className={styles.optionRow}> <div className={styles.paramSubtitle}>
<div className={styles.optionCard}>人员轻微受伤<br/>1</div> 评估最可能发生的事故及其后果的严重性
<div className={styles.optionCard}>需要医疗处理<br/>3</div>
<div className={styles.optionCard}>需住院治疗<br/>7</div>
<div className={styles.optionCard}>致人重伤<br/>15</div>
<div className={styles.optionCard}>多人重伤或死亡<br/>40</div>
<div className={styles.optionCard}>多人死亡<br/>100</div>
</div> </div>
<div className={styles.sliderRow}> <div className={styles.optionRow}>
<span className={styles.sliderLabel}>参数取值</span> <div className={styles.optionCard}>引人注目 需要救护</div>
<div className={styles.sliderBar}/> <div className={styles.optionCard}>重大/致残/<br/>较小的环境影响</div>
<span className={styles.sliderValue}>0.8</span> <div className={styles.optionCard}>需上报的环境<br/>污染事件</div>
<div className={styles.optionCard}>一人死亡/造成<br/>局部环境污染</div>
<div className={styles.optionCard}>数人死亡/<br/>严重环境污染</div>
<div className={styles.optionCard}>多人死亡/<br/>重大环境污染</div>
</div> </div>
</div> </div>
</div> </div>
@ -78,15 +171,26 @@ const Step02 = () => {
<div className={styles.rightPanel}> <div className={styles.rightPanel}>
{/* 上块:仪表盘和公式说明 */} {/* 上块:仪表盘和公式说明 */}
<div className={styles.rightTop}> <div className={styles.rightTop}>
<div className={styles.gaugePanel}> {/* 第一行评估对象和LEC评价法标签 */}
<div className={styles.gaugeCircle}> <div className={styles.topHeader}>
<span className={styles.gaugeValue}>48</span> <span className={styles.evaluationObject}>评估对象: 第五车间</span>
<span className={styles.gaugeLabel}>当前分值</span> <span className={styles.lecLabel}>LEC评价法</span>
</div>
<div className={styles.gaugeFormula}>
D = L (x×x) × E (x×x) × C (x×x) 48
</div>
</div> </div>
{/* 第二行:半圆形仪表盘 */}
<div className={styles.gaugeContainer}>
<ReactECharts
option={gaugeOption}
style={{ width: '100%', height: '200px' }}
/>
</div>
{/* 第三行:公式 */}
<div className={styles.formulaText}>
D = L (xx*xx) x E (xx*xx) x C (xx*xx) = 48
</div>
{/* 第四行:建议措施 */}
<div className={styles.suggestionPanel}> <div className={styles.suggestionPanel}>
<div className={styles.suggestionTitle}>建议措施</div> <div className={styles.suggestionTitle}>建议措施</div>
<div className={styles.suggestionContent}>1需要注意</div> <div className={styles.suggestionContent}>1需要注意</div>
@ -100,47 +204,66 @@ const Step02 = () => {
</Button> </Button>
</div> </div>
{/* 下块:风险等级判标准 */} {/* 下块:风险等级标准 */}
<div className={styles.rightBottom}> <div className={styles.rightBottom}>
<div className={styles.riskHeader}>风险等级评判标准</div> <div className={styles.riskHeader}>风险等级判定标准</div>
<div className={styles.riskTable}> <table className={styles.riskTable}>
<div className={`${styles.riskRow} ${styles.riskRowHeader}`}> <thead>
<span>风险分值</span> <tr className={styles.riskRowHeader}>
<span>风险等级</span> <th>风险分值</th>
<span>表征颜色</span> <th>风险等级</th>
<span>应采取行动</span> <th>表征颜色</th>
</div> <th>应采取行动</th>
<div className={styles.riskRow}> </tr>
<span>{'>= 320'}</span> </thead>
<span>极其危险重大风险</span> <tbody>
<span className={`${styles.colorDot} ${styles.colorRed}`}/> <tr className={styles.riskRow}>
<span>立即停止作业整改</span> <td>{'> 320'}</td>
</div> <td>极其危险, 重大风险</td>
<div className={styles.riskRow}> <td>
<span>160 ~ 320</span> <span className={`${styles.colorDot} ${styles.colorRed}`}/>
<span>高度危险较大风险</span> <span className={styles.colorName}>红色</span>
<span className={`${styles.colorDot} ${styles.colorOrange}`}/> </td>
<span>制定期限和措施整改措施</span> <td>立即停止作业, 整改</td>
</div> </tr>
<div className={styles.riskRow}> <tr className={styles.riskRow}>
<span>70 ~ 159</span> <td>160 ~ 320</td>
<span>显著危险中等风险</span> <td>高度危险, 较大风险</td>
<span className={`${styles.colorDot} ${styles.colorYellow}`}/> <td>
<span>需要关注和改进</span> <span className={`${styles.colorDot} ${styles.colorOrange}`}/>
</div> <span className={styles.colorName}>橙色</span>
<div className={styles.riskRow}> </td>
<span>20 ~ 69</span> <td>需要立即采取措施整改</td>
<span>一般危险低风险</span> </tr>
<span className={`${styles.colorDot} ${styles.colorBlue}`}/> <tr className={styles.riskRow}>
<span>需要注意</span> <td>70 ~ 159</td>
</div> <td>显著危险, 一般风险</td>
<div className={styles.riskRow}> <td>
<span>{'< 20'}</span> <span className={`${styles.colorDot} ${styles.colorYellow}`}/>
<span>可容许危险低风险</span> <span className={styles.colorName}>黄色</span>
<span className={`${styles.colorDot} ${styles.colorGreen}`}/> </td>
<span>可以接受</span> <td>需要关注和整改</td>
</div> </tr>
</div> <tr className={styles.riskRow}>
<td>20 ~ 69</td>
<td>一般危险, 低风险</td>
<td>
<span className={`${styles.colorDot} ${styles.colorBlue}`}/>
<span className={styles.colorName}>蓝色</span>
</td>
<td>需要注意</td>
</tr>
<tr className={styles.riskRow}>
<td>{'< 20'}</td>
<td>稍有危险, 低风险</td>
<td>
<span className={`${styles.colorDot} ${styles.colorGreen}`}/>
<span className={styles.colorName}>绿色</span>
</td>
<td>可以接受</td>
</tr>
</tbody>
</table>
</div> </div>
</div> </div>
</div> </div>

@ -76,7 +76,6 @@
.contentArea { .contentArea {
flex: 1; flex: 1;
overflow-y: auto; overflow-y: auto;
background-color: #fff;
border-radius: 4px; border-radius: 4px;
margin: 0 6px 6px 6px; margin: 0 6px 6px 6px;
} }

@ -2,66 +2,130 @@
width: 100%; width: 100%;
height: 100%; height: 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 12px 16px;
/* 根容器同时挂了 stepContent + step02Layout 两个类,这里用 &.step02Layout 做层级组织 */
&.step02Layout { &.step02Layout {
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex; display: flex;
background-color: transparent;
gap: 10px; gap: 10px;
background-color: #f5f6fa;
/* 左侧 A 区域评估方法60% 宽度) */ /* 左侧 A 区域评估方法60% 宽度) */
.leftPanel { .leftPanel {
width: 60%; flex: 0 0 55%;
// width: 60%;
height: 100%; height: 100%;
background-color: #ffffff; background-color: #ffffff;
border-radius: 4px; border-radius: 4px;
padding: 16px; padding: 16px;
box-sizing: border-box; box-sizing: border-box;
overflow: auto; overflow: auto;
display: flex;
flex-direction: column;
gap: 15px;
/* 第一行:评估方法标题 + 下拉选择框 */
.methodHeaderRow {
display: flex;
align-items: center;
gap: 10px;
.methodTitle {
color: rgba(0, 0, 0, 1);
font-size: 14px;
}
.methodSelect {
flex: 0 0 auto;
min-width: 150px;
:global {
.ant-select-selector {
color: rgba(0, 0, 0, 0.85) !important;
}
.ant-select-selection-item {
color: rgba(0, 0, 0, 0.85) !important;
}
}
}
}
/* 第二行LEC评价法说明块 */
.methodDescBlock {
background-color: rgba(250, 250, 250, 1);
border-radius: 2px;
padding: 12px 16px;
box-sizing: border-box;
.methodDescTitle {
font-size: 14px;
font-weight: 450;
color: rgba(153, 153, 153, 1);
margin-bottom: 8px;
}
.methodDescContent {
font-size: 13px;
color: rgba(153, 153, 153, 1);
line-height: 1.6;
div {
margin-bottom: 4px;
&:last-child {
margin-bottom: 0;
}
}
}
}
.methodWrapper { .methodWrapper {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 16px; gap: 15px;
.paramBlock { .paramBlock {
background-color: #fafafa; border: 1px solid rgba(154, 154, 154, 0.2);
border-radius: 4px; border-radius: 2px;
padding: 12px 16px; padding: 12px 16px;
background-color: #ffffff;
.paramHeader { .paramHeader {
margin-bottom: 12px; margin-bottom: 8px;
font-size: 13px; font-size: 14px;
.paramTitle { .paramTitle {
font-weight: 600; font-weight: 450;
margin-right: 8px; color: rgba(0, 0, 0, 1);
} }
}
.paramDesc { .paramSubtitle {
color: #888; font-size: 13px;
} color: rgba(0, 185, 78, 1);
margin-bottom: 12px;
} }
.optionRow { .optionRow {
display: flex; display: flex;
gap: 10px; gap: 10px;
margin-bottom: 12px; margin-bottom: 12px;
flex-wrap: wrap;
.optionCard { .optionCard {
flex: 1; flex: 1;
min-width: 0; background-color: rgba(246, 246, 246, 1);
background-color: #ffffff;
border-radius: 4px; border-radius: 4px;
border: 1px solid #e5e5e5; border: 1px solid rgba(154, 154, 154, 0.2);
text-align: center; text-align: center;
color: rgba(150, 150, 150, 1);
padding: 8px 4px; padding: 8px 4px;
font-size: 12px; font-size: 12px;
line-height: 18px; line-height: 18px;
cursor: pointer; cursor: pointer;
box-sizing: border-box;
&.optionActive { &.optionActive {
border-color: #00d48a; border-color: #00d48a;
@ -78,7 +142,8 @@
.sliderLabel { .sliderLabel {
font-size: 12px; font-size: 12px;
color: #666; color: rgba(0, 0, 0, 0.85);
flex-shrink: 0;
} }
.sliderBar { .sliderBar {
@ -92,7 +157,11 @@
width: 40px; width: 40px;
text-align: right; text-align: right;
font-size: 12px; font-size: 12px;
color: #333; color: rgba(0, 0, 0, 0.85);
background-color: rgba(240, 240, 240, 1);
padding: 2px 6px;
border-radius: 2px;
flex-shrink: 0;
} }
} }
} }
@ -109,66 +178,71 @@
/* 上块:仪表盘与建议 */ /* 上块:仪表盘与建议 */
.rightTop { .rightTop {
background-color: #ffffff; background-color: #FFFFFF;
background-image: linear-gradient(180deg, rgba(69, 255, 174, 0.2) 0%, rgba(255, 255, 255, 0) 20.33%);
border-radius: 4px; border-radius: 4px;
padding: 16px; padding: 16px;
box-sizing: border-box; box-sizing: border-box;
display: flex; display: flex;
flex-direction: column;
gap: 16px; gap: 16px;
.gaugePanel { /* 第一行评估对象和LEC评价法标签 */
flex: 1; .topHeader {
display: flex; display: flex;
flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: space-between;
width: 100%;
.gaugeCircle {
width: 200px;
height: 200px;
border-radius: 50%;
border: 16px solid #e5f9f3;
border-top-color: #00d48a;
border-right-color: #00d48a;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #333;
.gaugeValue {
font-size: 40px;
font-weight: 600;
}
.gaugeLabel { .evaluationObject {
font-size: 14px; color: rgba(0, 0, 0, 1);
margin-top: 4px; font-size: 14px;
} background: transparent;
} }
.gaugeFormula { .lecLabel {
margin-top: 12px; color: #fff;
font-size: 12px; background: linear-gradient(92.78deg, #00FFE1 2.1%, #39C2EB 49.39%, #4570FF 100.47%);
color: #666; padding: 4px 16px;
border-radius: 20px;
font-size: 14px;
} }
} }
/* 第二行:半圆形仪表盘 */
.gaugeContainer {
width: 100%;
height: 200px;
display: flex;
align-items: center;
justify-content: center;
}
/* 第三行:公式 */
.formulaText {
color: rgba(0, 0, 0, 1);
font-size: 14px;
text-align: center;
width: 100%;
}
/* 第四行:建议措施 */
.suggestionPanel { .suggestionPanel {
width: 260px; width: 100%;
background-color: #f8f9ff; background-color: rgba(234, 246, 255, 1);
border-radius: 4px; border-radius: 4px;
padding: 12px 16px; padding: 12px 16px;
font-size: 13px; font-size: 13px;
box-sizing: border-box; box-sizing: border-box;
.suggestionTitle { .suggestionTitle {
color: rgba(0, 0, 0, 1);
font-weight: 600; font-weight: 600;
margin-bottom: 6px; margin-bottom: 6px;
} }
.suggestionContent { .suggestionContent {
color: #555; color: rgba(51, 51, 51, 1);
} }
} }
} }
@ -180,7 +254,7 @@
padding: 12px 16px; padding: 12px 16px;
box-sizing: border-box; box-sizing: border-box;
display: flex; display: flex;
justify-content: flex-end; justify-content: center;
.nextBtn { .nextBtn {
min-width: 120px; min-width: 120px;
@ -189,7 +263,7 @@
} }
} }
/* 下块:风险等级判标准 */ /* 下块:风险等级判标准 */
.rightBottom { .rightBottom {
background-color: #ffffff; background-color: #ffffff;
border-radius: 4px; border-radius: 4px;
@ -200,62 +274,114 @@
gap: 12px; gap: 12px;
.riskHeader { .riskHeader {
font-weight: 600; color: rgba(153, 153, 153, 1);
font-size: 14px;
} }
.riskTable { .riskTable {
border: 1px solid #e5e5e5; width: 100%;
border-radius: 4px; border-collapse: collapse;
overflow: hidden;
font-size: 12px; font-size: 12px;
.riskRow { thead {
display: grid; .riskRowHeader {
grid-template-columns: 120px 180px 80px auto; background-color: rgba(219, 232, 230, 0.59);
align-items: center;
padding: 6px 12px; th {
border-top: 1px solid #f0f0f0; color: rgba(102, 102, 102, 1);
padding: 8px 12px;
&.riskRowHeader { text-align: left;
background-color: #fafafa; font-weight: normal;
font-weight: 600; border-bottom: 1px solid rgba(0, 0, 0, 0.06);
&:first-child {
padding-left: 20px;
position: relative;
&::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 4px;
background-color: rgba(144, 238, 144, 0.5);
}
}
}
} }
}
&:first-child { tbody {
border-top: none; .riskRow {
color: rgba(153, 153, 153, 1);
border-bottom: 1px solid rgba(0, 0, 0, 0.06);
td {
padding: 8px 12px;
vertical-align: middle;
&:first-child {
padding-left: 20px;
position: relative;
&::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 4px;
background-color: rgba(144, 238, 144, 0.5);
}
}
&:nth-child(3) {
display: flex;
align-items: center;
gap: 8px;
}
}
&:last-child {
border-bottom: none;
}
} }
}
.colorDot { .colorDot {
display: inline-block; display: inline-block;
width: 16px; width: 16px;
height: 8px; height: 16px;
border-radius: 4px; border-radius: 2px;
flex-shrink: 0;
&.colorRed { &.colorRed {
background-color: #ff4d4f; background-color: #ff4d4f;
} }
&.colorOrange { &.colorOrange {
background-color: #fa8c16; background-color: #fa8c16;
} }
&.colorYellow { &.colorYellow {
background-color: #fadb14; background-color: #fadb14;
} }
&.colorBlue { &.colorBlue {
background-color: #40a9ff; background-color: #40a9ff;
} }
&.colorGreen { &.colorGreen {
background-color: #52c41a; background-color: #52c41a;
}
} }
} }
.colorName {
color: rgba(153, 153, 153, 1);
}
} }
} }
} }
} }
} }
Loading…
Cancel
Save