process-diagram.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. <template>
  2. <div class="process-diagram-container">
  3. <div class="diagram-header">
  4. <h2>燃烧与热回收系统工艺流程图</h2>
  5. </div>
  6. <div class="diagram-content">
  7. <svg
  8. width="1400"
  9. height="900"
  10. viewBox="0 0 1400 900"
  11. class="process-svg"
  12. @click="handleSvgClick"
  13. >
  14. <!-- 背景 -->
  15. <rect width="100%" height="100%" fill="#f8f9fa"/>
  16. <!-- 汽包 (左侧中央) -->
  17. <ellipse
  18. cx="200" cy="450"
  19. rx="60" ry="100"
  20. fill="#87CEEB"
  21. stroke="#4682B4"
  22. stroke-width="3"
  23. @click="handleComponentClick('steam-drum', $event)"
  24. />
  25. <text x="200" y="450" text-anchor="middle" class="component-label">汽包</text>
  26. <!-- 垂直热交换器堆栈 (右侧) -->
  27. <rect
  28. x="1000" y="100"
  29. width="150" height="600"
  30. fill="none"
  31. stroke="#333"
  32. stroke-width="3"
  33. />
  34. <!-- FPH-1 -->
  35. <rect
  36. x="1010" y="110"
  37. width="130" height="50"
  38. fill="#87CEEB"
  39. stroke="#4682B4"
  40. stroke-width="2"
  41. @click="handleComponentClick('FPH-1', $event)"
  42. />
  43. <text x="1075" y="140" text-anchor="middle" class="component-label">FPH-1</text>
  44. <!-- FPH-2 -->
  45. <rect
  46. x="1010" y="170"
  47. width="130" height="50"
  48. fill="#87CEEB"
  49. stroke="#4682B4"
  50. stroke-width="2"
  51. @click="handleComponentClick('FPH-2', $event)"
  52. />
  53. <text x="1075" y="200" text-anchor="middle" class="component-label">FPH-2</text>
  54. <!-- BFW -->
  55. <rect
  56. x="1010" y="230"
  57. width="130" height="50"
  58. fill="#87CEEB"
  59. stroke="#4682B4"
  60. stroke-width="2"
  61. @click="handleComponentClick('BFW', $event)"
  62. />
  63. <text x="1075" y="260" text-anchor="middle" class="component-label">BFW</text>
  64. <!-- MSH-1 -->
  65. <rect
  66. x="1010" y="290"
  67. width="130" height="50"
  68. fill="#87CEEB"
  69. stroke="#4682B4"
  70. stroke-width="2"
  71. @click="handleComponentClick('MSH-1', $event)"
  72. />
  73. <text x="1075" y="320" text-anchor="middle" class="component-label">MSH-1</text>
  74. <!-- HPSS-1 -->
  75. <rect
  76. x="1010" y="350"
  77. width="130" height="50"
  78. fill="#87CEEB"
  79. stroke="#4682B4"
  80. stroke-width="2"
  81. @click="handleComponentClick('HPSS-1', $event)"
  82. />
  83. <text x="1075" y="380" text-anchor="middle" class="component-label">HPSS-1</text>
  84. <!-- HPSS-2 -->
  85. <rect
  86. x="1010" y="410"
  87. width="130" height="50"
  88. fill="#87CEEB"
  89. stroke="#4682B4"
  90. stroke-width="2"
  91. @click="handleComponentClick('HPSS-2', $event)"
  92. />
  93. <text x="1075" y="440" text-anchor="middle" class="component-label">HPSS-2</text>
  94. <!-- MSH-2 -->
  95. <rect
  96. x="1010" y="470"
  97. width="130" height="50"
  98. fill="#87CEEB"
  99. stroke="#4682B4"
  100. stroke-width="2"
  101. @click="handleComponentClick('MSH-2', $event)"
  102. />
  103. <text x="1075" y="500" text-anchor="middle" class="component-label">MSH-2</text>
  104. <!-- MSH-3 -->
  105. <rect
  106. x="1010" y="530"
  107. width="130" height="50"
  108. fill="#87CEEB"
  109. stroke="#4682B4"
  110. stroke-width="2"
  111. @click="handleComponentClick('MSH-3', $event)"
  112. />
  113. <text x="1075" y="560" text-anchor="middle" class="component-label">MSH-3</text>
  114. <!-- 排气扇 -->
  115. <circle
  116. cx="1075" cy="80"
  117. r="12"
  118. fill="#666"
  119. stroke="#333"
  120. stroke-width="2"
  121. @click="handleComponentClick('exhaust-fan', $event)"
  122. />
  123. <!-- 急冷器 (右侧中央) -->
  124. <polygon
  125. points="1200,350 1300,400 1200,450 1100,400"
  126. fill="#87CEEB"
  127. stroke="#4682B4"
  128. stroke-width="3"
  129. @click="handleComponentClick('quench-cooler', $event)"
  130. />
  131. <text x="1150" y="400" text-anchor="middle" class="component-label">急冷器</text>
  132. <!-- 燃烧室1 (底部左侧) -->
  133. <rect
  134. x="150" y="650"
  135. width="80" height="60"
  136. fill="#FF6B6B"
  137. stroke="#D63031"
  138. stroke-width="2"
  139. @click="handleComponentClick('fire-box-1', $event)"
  140. />
  141. <text x="190" y="685" text-anchor="middle" class="component-label">Fire box</text>
  142. <!-- 燃烧室2 (底部右侧) -->
  143. <rect
  144. x="250" y="650"
  145. width="80" height="60"
  146. fill="#FF6B6B"
  147. stroke="#D63031"
  148. stroke-width="2"
  149. @click="handleComponentClick('fire-box-2', $event)"
  150. />
  151. <text x="290" y="685" text-anchor="middle" class="component-label">Fire box</text>
  152. <!-- SLE-1 -->
  153. <rect
  154. x="150" y="580"
  155. width="80" height="50"
  156. fill="#87CEEB"
  157. stroke="#4682B4"
  158. stroke-width="2"
  159. @click="handleComponentClick('SLE-1', $event)"
  160. />
  161. <text x="190" y="610" text-anchor="middle" class="component-label">SLE</text>
  162. <!-- SLE-2 -->
  163. <rect
  164. x="250" y="580"
  165. width="80" height="50"
  166. fill="#87CEEB"
  167. stroke="#4682B4"
  168. stroke-width="2"
  169. @click="handleComponentClick('SLE-2', $event)"
  170. />
  171. <text x="290" y="610" text-anchor="middle" class="component-label">SLE</text>
  172. <!-- 风门调节器 -->
  173. <line x1="150" y1="720" x2="330" y2="720" stroke="#333" stroke-width="2"/>
  174. <text x="240" y="740" text-anchor="middle" class="system-label">风门调节器</text>
  175. <!-- 水/蒸汽管道 (蓝色) -->
  176. <!-- 汽包到SLE -->
  177. <line x1="200" y1="550" x2="190" y2="580" stroke="#4682B4" stroke-width="4"
  178. @click="handleLineClick('steam-drum-to-SLE-1', $event)"/>
  179. <line x1="200" y1="550" x2="290" y2="580" stroke="#4682B4" stroke-width="4"
  180. @click="handleLineClick('steam-drum-to-SLE-2', $event)"/>
  181. <!-- SLE到MSH-3 -->
  182. <line x1="190" y1="580" x2="1010" y2="580" stroke="#4682B4" stroke-width="4"
  183. @click="handleLineClick('SLE-to-MSH-3', $event)"/>
  184. <line x1="290" y1="580" x2="1075" y2="580" stroke="#4682B4" stroke-width="4"
  185. @click="handleLineClick('SLE-to-MSH-3-2', $event)"/>
  186. <!-- 汽包到HPSS -->
  187. <line x1="260" y1="400" x2="1010" y2="375" stroke="#4682B4" stroke-width="4"
  188. @click="handleLineClick('steam-drum-to-HPSS-1', $event)"/>
  189. <line x1="260" y1="400" x2="1075" y2="435" stroke="#4682B4" stroke-width="4"
  190. @click="handleLineClick('steam-drum-to-HPSS-2', $event)"/>
  191. <!-- BFW到急冷器 -->
  192. <line x1="1075" y1="255" x2="1150" y2="350" stroke="#4682B4" stroke-width="4"
  193. @click="handleLineClick('BFW-to-quench-cooler', $event)"/>
  194. <!-- MSH-1到急冷器 -->
  195. <line x1="1075" y1="315" x2="1150" y2="360" stroke="#4682B4" stroke-width="4"
  196. @click="handleLineClick('MSH-1-to-quench-cooler', $event)"/>
  197. <!-- 热气体/烟气管道 (黄色) -->
  198. <!-- 燃烧室到SLE -->
  199. <line x1="190" y1="650" x2="190" y2="630" stroke="#FFD700" stroke-width="4"
  200. @click="handleLineClick('fire-box-1-to-SLE-1', $event)"/>
  201. <line x1="290" y1="650" x2="290" y2="630" stroke="#FFD700" stroke-width="4"
  202. @click="handleLineClick('fire-box-2-to-SLE-2', $event)"/>
  203. <!-- SLE到热交换器堆栈 -->
  204. <line x1="190" y1="580" x2="1010" y2="650" stroke="#FFD700" stroke-width="4"
  205. @click="handleLineClick('SLE-1-to-heat-stack', $event)"/>
  206. <line x1="290" y1="580" x2="1075" y2="650" stroke="#FFD700" stroke-width="4"
  207. @click="handleLineClick('SLE-2-to-heat-stack', $event)"/>
  208. <!-- 热交换器堆栈内部流动 -->
  209. <line x1="1075" y1="650" x2="1075" y2="100" stroke="#FFD700" stroke-width="4"
  210. @click="handleLineClick('heat-stack-flow', $event)"/>
  211. <!-- 热交换器到急冷器 -->
  212. <line x1="1075" y1="315" x2="1150" y2="370" stroke="#FFD700" stroke-width="4"
  213. @click="handleLineClick('heat-stack-to-quench-cooler', $event)"/>
  214. <!-- 燃料气管道 (红色) -->
  215. <!-- 燃料气供应 -->
  216. <line x1="50" y1="680" x2="150" y2="680" stroke="#FF4444" stroke-width="4"
  217. @click="handleLineClick('fuel-gas-supply', $event)"/>
  218. <line x1="50" y1="680" x2="250" y2="680" stroke="#FF4444" stroke-width="4"
  219. @click="handleLineClick('fuel-gas-supply-2', $event)"/>
  220. <!-- 燃料气到燃烧室 -->
  221. <line x1="150" y1="680" x2="190" y2="650" stroke="#FF4444" stroke-width="4"
  222. @click="handleLineClick('fuel-to-fire-box-1', $event)"/>
  223. <line x1="250" y1="680" x2="290" y2="650" stroke="#FF4444" stroke-width="4"
  224. @click="handleLineClick('fuel-to-fire-box-2', $event)"/>
  225. <!-- 阀门和控制元件 -->
  226. <!-- 主燃料切断阀 -->
  227. <circle cx="100" cy="680" r="6" fill="#666" stroke="#333" stroke-width="2"
  228. @click="handleComponentClick('main-fuel-valve', $event)"/>
  229. <!-- 燃料气控制阀PCV -->
  230. <circle cx="120" cy="680" r="6" fill="#666" stroke="#333" stroke-width="2"
  231. @click="handleComponentClick('fuel-control-valve', $event)"/>
  232. <!-- 流量计 -->
  233. <circle cx="1075" cy="255" r="8" fill="#87CEEB" stroke="#4682B4" stroke-width="2"
  234. @click="handleComponentClick('flow-meter-1', $event)"/>
  235. <text x="1075" y="260" text-anchor="middle" class="flow-meter-label">8</text>
  236. <circle cx="1150" cy="350" r="8" fill="#87CEEB" stroke="#4682B4" stroke-width="2"
  237. @click="handleComponentClick('flow-meter-2', $event)"/>
  238. <text x="1150" y="355" text-anchor="middle" class="flow-meter-label">8</text>
  239. <!-- 汽包输入标签 -->
  240. <text x="50" y="200" class="system-label">SS放空</text>
  241. <text x="50" y="220" class="system-label">SS并网阀</text>
  242. <text x="50" y="240" class="system-label">间排</text>
  243. <text x="50" y="260" class="system-label">磷酸盐</text>
  244. <text x="50" y="280" class="system-label">N130</text>
  245. <text x="50" y="300" class="system-label">DS</text>
  246. <text x="50" y="320" class="system-label">原料扫线</text>
  247. <text x="50" y="340" class="system-label">原料根部阀</text>
  248. <text x="50" y="360" class="system-label">原料切断阀</text>
  249. <text x="50" y="380" class="system-label">原料控制阀</text>
  250. <text x="50" y="400" class="system-label">烧焦空气</text>
  251. <text x="50" y="420" class="system-label">DS扫线</text>
  252. <text x="50" y="440" class="system-label">连排</text>
  253. <!-- 急冷器标签 -->
  254. <text x="1200" y="500" class="system-label">工艺水</text>
  255. <text x="1200" y="520" class="system-label">急冷油</text>
  256. <text x="1200" y="540" class="system-label">开工放空</text>
  257. <text x="1200" y="560" class="system-label">减温水</text>
  258. <!-- 电动阀标签 -->
  259. <text x="1200" y="580" class="system-label">电动阀 1301</text>
  260. <text x="1200" y="600" class="system-label">HV1302</text>
  261. <text x="1200" y="620" class="system-label">电动阀 1303</text>
  262. <!-- 文丘里标签 -->
  263. <text x="100" y="700" class="system-label">文丘里</text>
  264. <text x="200" y="700" class="system-label">文丘里</text>
  265. </svg>
  266. </div>
  267. <!-- 信息面板 -->
  268. <div class="info-panel" v-if="selectedComponent">
  269. <h3>{{ selectedComponent.name }}</h3>
  270. <p>{{ selectedComponent.description }}</p>
  271. <div class="component-details">
  272. <h4>技术参数:</h4>
  273. <ul>
  274. <li v-for="param in selectedComponent.parameters" :key="param">
  275. {{ param }}
  276. </li>
  277. </ul>
  278. </div>
  279. </div>
  280. </div>
  281. </template>
  282. <script>
  283. export default {
  284. name: 'ProcessDiagram',
  285. data() {
  286. return {
  287. svgWidth: 1400,
  288. svgHeight: 900,
  289. selectedComponent: null,
  290. componentData: {
  291. 'steam-drum': {
  292. name: '汽包',
  293. description: '蒸汽锅炉的核心组件,用于储存和分离蒸汽与水',
  294. parameters: [
  295. '工作压力: 1.0-2.5 MPa',
  296. '工作温度: 180-250°C',
  297. '容量: 50-200 m³',
  298. '材质: 碳钢/不锈钢'
  299. ]
  300. },
  301. 'fire-box-1': {
  302. name: '燃烧室1',
  303. description: '燃料燃烧产生热量的主要设备',
  304. parameters: [
  305. '燃烧温度: 800-1200°C',
  306. '燃料消耗: 100-500 m³/h',
  307. '热效率: 85-95%',
  308. '燃烧方式: 强制通风'
  309. ]
  310. },
  311. 'fire-box-2': {
  312. name: '燃烧室2',
  313. description: '燃料燃烧产生热量的主要设备',
  314. parameters: [
  315. '燃烧温度: 800-1200°C',
  316. '燃料消耗: 100-500 m³/h',
  317. '热效率: 85-95%',
  318. '燃烧方式: 强制通风'
  319. ]
  320. },
  321. 'quench-cooler': {
  322. name: '急冷器',
  323. description: '用于快速冷却高温气体的设备',
  324. parameters: [
  325. '冷却能力: 1000-5000 kW',
  326. '冷却介质: 水/油',
  327. '出口温度: 50-100°C',
  328. '压力损失: <0.1 MPa'
  329. ]
  330. },
  331. 'FPH-1': {
  332. name: 'FPH-1 热交换器',
  333. description: '第一级热交换器,用于预热给水',
  334. parameters: [
  335. '换热面积: 500-2000 m²',
  336. '传热系数: 1000-3000 W/m²·K',
  337. '压降: <0.05 MPa',
  338. '材质: 不锈钢'
  339. ]
  340. },
  341. 'FPH-2': {
  342. name: 'FPH-2 热交换器',
  343. description: '第二级热交换器,用于预热给水',
  344. parameters: [
  345. '换热面积: 500-2000 m²',
  346. '传热系数: 1000-3000 W/m²·K',
  347. '压降: <0.05 MPa',
  348. '材质: 不锈钢'
  349. ]
  350. },
  351. 'BFW': {
  352. name: '锅炉给水',
  353. description: '向锅炉系统提供处理过的给水',
  354. parameters: [
  355. '给水温度: 100-150°C',
  356. '给水压力: 2.0-4.0 MPa',
  357. '水质要求: 除氧水',
  358. '流量: 50-200 m³/h'
  359. ]
  360. },
  361. 'MSH-1': {
  362. name: 'MSH-1 过热器',
  363. description: '第一级过热器,提高蒸汽温度',
  364. parameters: [
  365. '过热温度: 300-400°C',
  366. '过热压力: 1.5-2.5 MPa',
  367. '换热面积: 300-1000 m²',
  368. '材质: 合金钢'
  369. ]
  370. },
  371. 'MSH-2': {
  372. name: 'MSH-2 过热器',
  373. description: '第二级过热器,进一步提高蒸汽温度',
  374. parameters: [
  375. '过热温度: 350-450°C',
  376. '过热压力: 1.5-2.5 MPa',
  377. '换热面积: 300-1000 m²',
  378. '材质: 合金钢'
  379. ]
  380. },
  381. 'MSH-3': {
  382. name: 'MSH-3 过热器',
  383. description: '第三级过热器,最终蒸汽温度控制',
  384. parameters: [
  385. '过热温度: 400-500°C',
  386. '过热压力: 1.5-2.5 MPa',
  387. '换热面积: 300-1000 m²',
  388. '材质: 合金钢'
  389. ]
  390. },
  391. 'HPSS-1': {
  392. name: 'HPSS-1 高压过热器',
  393. description: '第一级高压过热器',
  394. parameters: [
  395. '工作压力: 2.0-4.0 MPa',
  396. '工作温度: 400-500°C',
  397. '换热面积: 200-800 m²',
  398. '材质: 高温合金'
  399. ]
  400. },
  401. 'HPSS-2': {
  402. name: 'HPSS-2 高压过热器',
  403. description: '第二级高压过热器',
  404. parameters: [
  405. '工作压力: 2.0-4.0 MPa',
  406. '工作温度: 450-550°C',
  407. '换热面积: 200-800 m²',
  408. '材质: 高温合金'
  409. ]
  410. },
  411. 'SLE-1': {
  412. name: 'SLE-1 单元',
  413. description: '第一级蒸汽发生单元',
  414. parameters: [
  415. '蒸汽产量: 10-50 t/h',
  416. '工作压力: 1.0-2.5 MPa',
  417. '工作温度: 180-250°C',
  418. '热效率: 90-95%'
  419. ]
  420. },
  421. 'SLE-2': {
  422. name: 'SLE-2 单元',
  423. description: '第二级蒸汽发生单元',
  424. parameters: [
  425. '蒸汽产量: 10-50 t/h',
  426. '工作压力: 1.0-2.5 MPa',
  427. '工作温度: 180-250°C',
  428. '热效率: 90-95%'
  429. ]
  430. },
  431. 'exhaust-fan': {
  432. name: '排气扇',
  433. description: '排出燃烧废气的风机',
  434. parameters: [
  435. '风量: 1000-5000 m³/h',
  436. '风压: 1000-3000 Pa',
  437. '功率: 10-50 kW',
  438. '转速: 1000-3000 rpm'
  439. ]
  440. },
  441. 'main-fuel-valve': {
  442. name: '主燃料切断阀',
  443. description: '控制主燃料供应的安全切断阀',
  444. parameters: [
  445. '公称压力: 1.6-4.0 MPa',
  446. '公称通径: DN50-DN200',
  447. '阀体材质: 碳钢/不锈钢',
  448. '密封材质: 软密封/硬密封'
  449. ]
  450. },
  451. 'fuel-control-valve': {
  452. name: '燃料气控制阀 (PCV)',
  453. description: '压力控制阀,调节燃料气压力',
  454. parameters: [
  455. '控制压力: 0.1-1.0 MPa',
  456. '控制精度: ±1%',
  457. '响应时间: <1s',
  458. '材质: 不锈钢'
  459. ]
  460. },
  461. 'flow-meter-1': {
  462. name: '流量计1',
  463. description: '测量BFW流量的仪表',
  464. parameters: [
  465. '测量范围: 0-200 m³/h',
  466. '精度等级: ±0.5%',
  467. '工作压力: 0-4.0 MPa',
  468. '工作温度: -20-150°C'
  469. ]
  470. },
  471. 'flow-meter-2': {
  472. name: '流量计2',
  473. description: '测量急冷器进水流量的仪表',
  474. parameters: [
  475. '测量范围: 0-100 m³/h',
  476. '精度等级: ±0.5%',
  477. '工作压力: 0-2.0 MPa',
  478. '工作温度: -20-100°C'
  479. ]
  480. }
  481. }
  482. }
  483. },
  484. methods: {
  485. handleComponentClick(componentId, event) {
  486. event.stopPropagation()
  487. this.selectedComponent = this.componentData[componentId]
  488. this.$message({
  489. message: `已选择组件: ${this.componentData[componentId].name}`,
  490. type: 'info'
  491. })
  492. },
  493. handleLineClick(lineId, event) {
  494. event.stopPropagation()
  495. const lineNames = {
  496. 'steam-drum-to-SLE-1': '汽包到SLE-1蒸汽管道',
  497. 'steam-drum-to-SLE-2': '汽包到SLE-2蒸汽管道',
  498. 'SLE-to-MSH-3': 'SLE到MSH-3给水管道',
  499. 'SLE-to-MSH-3-2': 'SLE到MSH-3给水管道2',
  500. 'steam-drum-to-HPSS-1': '汽包到HPSS-1蒸汽管道',
  501. 'steam-drum-to-HPSS-2': '汽包到HPSS-2蒸汽管道',
  502. 'BFW-to-quench-cooler': 'BFW到急冷器给水管道',
  503. 'MSH-1-to-quench-cooler': 'MSH-1到急冷器减温水管道',
  504. 'fire-box-1-to-SLE-1': '燃烧室1到SLE-1烟气管道',
  505. 'fire-box-2-to-SLE-2': '燃烧室2到SLE-2烟气管道',
  506. 'SLE-1-to-heat-stack': 'SLE-1到热交换器堆栈烟气管道',
  507. 'SLE-2-to-heat-stack': 'SLE-2到热交换器堆栈烟气管道',
  508. 'heat-stack-flow': '热交换器堆栈内部烟气流动',
  509. 'heat-stack-to-quench-cooler': '热交换器堆栈到急冷器烟气管道',
  510. 'fuel-gas-supply': '燃料气供应管道',
  511. 'fuel-gas-supply-2': '燃料气供应管道2',
  512. 'fuel-to-fire-box-1': '燃料气到燃烧室1管道',
  513. 'fuel-to-fire-box-2': '燃料气到燃烧室2管道'
  514. }
  515. this.$message({
  516. message: `已选择管道: ${lineNames[lineId]}`,
  517. type: 'success'
  518. })
  519. },
  520. handleSvgClick() {
  521. this.selectedComponent = null
  522. }
  523. }
  524. }
  525. </script>
  526. <style scoped>
  527. .process-diagram-container {
  528. padding: 20px;
  529. background-color: #f5f5f5;
  530. min-height: 100vh;
  531. }
  532. .diagram-header {
  533. text-align: center;
  534. margin-bottom: 20px;
  535. padding: 15px;
  536. background: white;
  537. border-radius: 8px;
  538. box-shadow: 0 2px 4px rgba(0,0,0,0.1);
  539. }
  540. .diagram-header h2 {
  541. margin: 0;
  542. color: #333;
  543. font-size: 24px;
  544. }
  545. .diagram-content {
  546. background: white;
  547. border-radius: 8px;
  548. padding: 20px;
  549. box-shadow: 0 2px 4px rgba(0,0,0,0.1);
  550. overflow: auto;
  551. }
  552. .process-svg {
  553. border: 1px solid #ddd;
  554. border-radius: 4px;
  555. cursor: crosshair;
  556. }
  557. .component-label {
  558. font-size: 12px;
  559. font-weight: bold;
  560. fill: #333;
  561. pointer-events: none;
  562. }
  563. .system-label {
  564. font-size: 10px;
  565. fill: #666;
  566. pointer-events: none;
  567. }
  568. .flow-meter-label {
  569. font-size: 10px;
  570. font-weight: bold;
  571. fill: #333;
  572. pointer-events: none;
  573. }
  574. /* 悬停效果 */
  575. .process-svg rect:hover,
  576. .process-svg ellipse:hover,
  577. .process-svg polygon:hover,
  578. .process-svg circle:hover {
  579. filter: drop-shadow(0 0 8px rgba(64, 158, 255, 0.6));
  580. cursor: pointer;
  581. }
  582. .process-svg line:hover {
  583. stroke-width: 6;
  584. cursor: pointer;
  585. }
  586. /* 信息面板 */
  587. .info-panel {
  588. position: fixed;
  589. top: 20px;
  590. right: 20px;
  591. width: 350px;
  592. background: white;
  593. border-radius: 8px;
  594. padding: 20px;
  595. box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  596. z-index: 1000;
  597. max-height: 80vh;
  598. overflow-y: auto;
  599. }
  600. .info-panel h3 {
  601. margin: 0 0 10px 0;
  602. color: #333;
  603. border-bottom: 2px solid #409eff;
  604. padding-bottom: 5px;
  605. }
  606. .info-panel p {
  607. margin: 0 0 15px 0;
  608. color: #666;
  609. line-height: 1.5;
  610. }
  611. .component-details h4 {
  612. margin: 15px 0 8px 0;
  613. color: #333;
  614. font-size: 14px;
  615. }
  616. .component-details ul {
  617. margin: 0;
  618. padding-left: 20px;
  619. }
  620. .component-details li {
  621. margin: 5px 0;
  622. color: #666;
  623. font-size: 13px;
  624. }
  625. /* 响应式设计 */
  626. @media (max-width: 768px) {
  627. .info-panel {
  628. position: relative;
  629. width: 100%;
  630. margin-top: 20px;
  631. }
  632. .process-svg {
  633. width: 100%;
  634. height: auto;
  635. }
  636. }
  637. </style>