Ver Fonte

Merge branch 'master' of http://222.243.138.146:2000/hmy/hnyz_dcs

HMY há 8 meses atrás
pai
commit
dbf13e38b8

+ 2 - 0
admin/src/main/java/com/dcs/hnyz/service/IEquipmentParamService.java

@@ -125,6 +125,8 @@ public interface IEquipmentParamService
      */
     List<EquipmentParam> getAllSetParam(String code);
 
+    String importEquipment(List<EquipmentParam> equipmentList, boolean updateSupport, String operName);
+
     /**
      * 根据设备名的变化 更新寄存器名称
      * @param equipment

+ 3 - 0
ui/src/assets/dcs/controlRouter/24PinArrow.svg

@@ -0,0 +1,3 @@
+<svg width="12" height="57" viewBox="0 0 12 57" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6 57L11.7735 47H0.226498L6 57ZM6 0L5 0V3.5625H6H7V0L6 0ZM6 10.6875H5V17.8125H6H7V10.6875H6ZM6 24.9375H5V32.0625H6H7V24.9375H6ZM6 39.1875H5V46.3125H6H7V39.1875H6Z" fill="#6EDC4D"/>
+</svg>

+ 3 - 0
ui/src/assets/dcs/controlRouter/24PinToFanyin.svg

@@ -0,0 +1,3 @@
+<svg width="70" height="92" viewBox="0 0 70 92" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M-0.000216946 -2.31174e-05L1.39225 11.4627L10.623 4.52544L-0.000216946 -2.31174e-05ZM68.3896 91L69.1891 90.3992L66.7466 87.1492L65.9472 87.75L65.1477 88.3508L67.5902 91.6008L68.3896 91ZM61.0622 81.25L61.8616 80.6492L56.9766 74.1492L56.1772 74.75L55.3778 75.3508L60.2628 81.8508L61.0622 81.25ZM51.2922 68.25L52.0916 67.6492L47.2066 61.1492L46.4072 61.75L45.6078 62.3508L50.4928 68.8508L51.2922 68.25ZM41.5222 55.25L42.3216 54.6492L37.4366 48.1492L36.6372 48.75L35.8378 49.3508L40.7228 55.8508L41.5222 55.25ZM31.7522 42.25L32.5516 41.6492L27.6666 35.1492L26.8672 35.75L26.0678 36.3508L30.9528 42.8508L31.7522 42.25ZM21.9822 29.25L22.7816 28.6492L17.8967 22.1492L17.0972 22.75L16.2978 23.3508L21.1828 29.8508L21.9822 29.25ZM12.2123 16.25L13.0117 15.6492L8.12668 9.14919L7.32727 9.74998L6.52786 10.3508L11.4128 16.8508L12.2123 16.25Z" fill="#6EDC4D"/>
+</svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 1 - 0
ui/src/assets/dcs/controlRouter/24PinTomuye.svg


Diff do ficheiro suprimidas por serem muito extensas
+ 1 - 0
ui/src/assets/dcs/controlRouter/G3ToG1.svg


Diff do ficheiro suprimidas por serem muito extensas
+ 1 - 0
ui/src/assets/dcs/controlRouter/G3至24平箭头.svg


Diff do ficheiro suprimidas por serem muito extensas
+ 17 - 0
ui/src/assets/dcs/controlRouter/S6罐.svg


+ 76 - 0
ui/src/assets/dcs/controlRouter/流化干包.svg

@@ -0,0 +1,76 @@
+<svg width="127" height="163" viewBox="0 0 127 163" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_i_19_62)">
+<path d="M4 3H123V110H4V3Z" fill="url(#paint0_linear_19_62)"/>
+</g>
+<path d="M35.4149 129L35.4152 156.5H34.0001V157.915H44.1888V156.217H42.7737L42.7734 129H35.4149Z" fill="#4C4C4C"/>
+<path d="M82.415 129L82.4151 156.585H81V158H91.1887V156.302H89.7736L89.7735 129H82.415Z" fill="#4C4C4C"/>
+<g filter="url(#filter1_i_19_62)">
+<g clip-path="url(#paint1_angular_19_62_clip_path)" data-figma-skip-parse="true"><g transform="matrix(1.52209e-09 -0.061875 -0.176314 -1.52405e-09 63.5 154.433)"><foreignObject x="-750.427" y="-750.427" width="1500.85" height="1500.85"><div xmlns="http://www.w3.org/1999/xhtml" style="background:conic-gradient(from 90deg,rgba(91, 119, 146, 1) 0deg,rgba(128, 159, 183, 1) 30.6937deg,rgba(91, 119, 146, 1) 360deg);height:100%;width:100%;opacity:1"></div></foreignObject></g></g><path d="M123 109H4L63.5 157L123 109Z" data-figma-gradient-fill="{&#34;type&#34;:&#34;GRADIENT_ANGULAR&#34;,&#34;stops&#34;:[{&#34;color&#34;:{&#34;r&#34;:0.50282418727874756,&#34;g&#34;:0.62685173749923706,&#34;b&#34;:0.71852463483810425,&#34;a&#34;:1.0},&#34;position&#34;:0.085260204970836639},{&#34;color&#34;:{&#34;r&#34;:0.36072567105293274,&#34;g&#34;:0.46742522716522217,&#34;b&#34;:0.57412487268447876,&#34;a&#34;:1.0},&#34;position&#34;:1.0}],&#34;stopsVar&#34;:[{&#34;color&#34;:{&#34;r&#34;:0.50282418727874756,&#34;g&#34;:0.62685173749923706,&#34;b&#34;:0.71852463483810425,&#34;a&#34;:1.0},&#34;position&#34;:0.085260204970836639},{&#34;color&#34;:{&#34;r&#34;:0.36072567105293274,&#34;g&#34;:0.46742522716522217,&#34;b&#34;:0.57412487268447876,&#34;a&#34;:1.0},&#34;position&#34;:1.0}],&#34;transform&#34;:{&#34;m00&#34;:3.0441881335718790e-06,&#34;m01&#34;:-352.62863159179688,&#34;m02&#34;:239.81431579589844,&#34;m10&#34;:-123.75002288818359,&#34;m11&#34;:-3.0480991881631780e-06,&#34;m12&#34;:216.30770874023438},&#34;opacity&#34;:1.0,&#34;blendMode&#34;:&#34;NORMAL&#34;,&#34;visible&#34;:true}"/>
+</g>
+<g filter="url(#filter2_i_19_62)">
+<rect width="127" height="5" fill="url(#paint2_linear_19_62)"/>
+</g>
+<rect x="0.5" y="0.5" width="126" height="4" stroke="#3F78A5"/>
+<path d="M23.2859 163V162.137H12.0742V163H23.2859Z" fill="#4C4C4C"/>
+<path d="M15.6895 112.505V112.666L18.0254 114.162V114.229H22.3369V161.304H23.2861V162.138H12.0742V161.304H13.4648V111.254L15.6895 112.505Z" fill="url(#paint3_linear_19_62)"/>
+<path d="M99.0003 163V162.137H110.212V163H99.0003Z" fill="#4C4C4C"/>
+<path d="M106.597 112.505V112.665L104.261 114.162V114.229H99.9482V161.304H99V162.138H110.212V161.304H108.821V111.254L106.597 112.505Z" fill="url(#paint4_linear_19_62)"/>
+<defs>
+<filter id="filter0_i_19_62" x="4" y="3" width="119" height="107" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="6.9"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.405854 0 0 0 0 0.567179 0 0 0 0 0.64194 0 0 0 0.68 0"/>
+<feBlend mode="normal" in2="shape" result="effect1_innerShadow_19_62"/>
+</filter>
+<filter id="filter1_i_19_62" x="4" y="109" width="119" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="2.25"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.588159 0 0 0 0 0.817803 0 0 0 0 0.916222 0 0 0 0.21 0"/>
+<feBlend mode="normal" in2="shape" result="effect1_innerShadow_19_62"/>
+</filter>
+<clipPath id="paint1_angular_19_62_clip_path"><path d="M123 109H4L63.5 157L123 109Z"/></clipPath><filter id="filter2_i_19_62" x="0" y="0" width="127" height="5" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="6.9"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.405854 0 0 0 0 0.567179 0 0 0 0 0.64194 0 0 0 0.68 0"/>
+<feBlend mode="normal" in2="shape" result="effect1_innerShadow_19_62"/>
+</filter>
+<linearGradient id="paint0_linear_19_62" x1="123" y1="56.5" x2="4" y2="56.5" gradientUnits="userSpaceOnUse">
+<stop stop-color="#859FC0"/>
+<stop offset="0.514423" stop-color="#B9D5ED"/>
+<stop offset="0.745192" stop-color="#C4DBEE"/>
+<stop offset="1" stop-color="#83A3BE"/>
+</linearGradient>
+<linearGradient id="paint2_linear_19_62" x1="127" y1="2.5" x2="0" y2="2.5" gradientUnits="userSpaceOnUse">
+<stop stop-color="#859FC0"/>
+<stop offset="0.53066" stop-color="#B9D5ED"/>
+<stop offset="0.745192" stop-color="#DBEFFF"/>
+<stop offset="1" stop-color="#83A3BE"/>
+</linearGradient>
+<linearGradient id="paint3_linear_19_62" x1="22.3494" y1="136.816" x2="13.2238" y2="136.816" gradientUnits="userSpaceOnUse">
+<stop stop-color="#2B4B69"/>
+<stop offset="0.427885" stop-color="#9DB5D0"/>
+<stop offset="0.576923" stop-color="#A6C5E0"/>
+<stop offset="0.711538" stop-color="#8FAEC8"/>
+<stop offset="1" stop-color="#2B4B69"/>
+</linearGradient>
+<linearGradient id="paint4_linear_19_62" x1="99.9368" y1="136.816" x2="109.062" y2="136.816" gradientUnits="userSpaceOnUse">
+<stop stop-color="#2B4B69"/>
+<stop offset="0.427885" stop-color="#9DB5D0"/>
+<stop offset="0.576923" stop-color="#A6C5E0"/>
+<stop offset="0.711538" stop-color="#8FAEC8"/>
+<stop offset="1" stop-color="#2B4B69"/>
+</linearGradient>
+</defs>
+</svg>

+ 52 - 0
ui/src/assets/dcs/controlRouter/罐区.svg

@@ -0,0 +1,52 @@
+<svg width="107" height="156" viewBox="0 0 107 156" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_i_37_324)">
+<path d="M106.05 134.58H105.918C104.736 146.045 81.5137 155.191 53.0396 155.191C23.8095 155.191 0.114226 145.552 0.11377 133.662C0.11377 133.253 0.142435 132.847 0.197754 132.443V23.3448H106.05V134.58Z" fill="url(#paint0_linear_37_324)"/>
+</g>
+<g filter="url(#filter1_i_37_324)">
+<path d="M105.967 22.8619C105.967 35.4882 82.2451 45.7239 52.9833 45.7239C23.7214 45.7239 0 35.4882 0 22.8619C0 10.2356 23.7214 0 52.9833 0C82.2451 0 105.967 10.2356 105.967 22.8619Z" fill="url(#paint1_radial_37_324)"/>
+</g>
+<g filter="url(#filter2_i_37_324)">
+<path d="M31.0591 16.0289C38.1221 16.0289 43.8478 19.3041 43.8481 23.3444C43.8481 27.3848 38.1223 30.6608 31.0591 30.6608C23.9959 30.6608 18.27 27.3848 18.27 23.3444C18.2704 19.3041 23.9961 16.0289 31.0591 16.0289ZM72.1665 17.858C76.7071 17.858 80.3882 19.905 80.3882 22.4303C80.3881 24.9555 76.7071 27.0026 72.1665 27.0026C67.626 27.0025 63.9449 24.9555 63.9448 22.4303C63.9448 19.9051 67.626 17.8581 72.1665 17.858Z" fill="#BBC4CB"/>
+</g>
+<defs>
+<filter id="filter0_i_37_324" x="0.11377" y="23.3448" width="105.937" height="131.847" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="6.9"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.405854 0 0 0 0 0.567179 0 0 0 0 0.64194 0 0 0 0.68 0"/>
+<feBlend mode="normal" in2="shape" result="effect1_innerShadow_37_324"/>
+</filter>
+<filter id="filter1_i_37_324" x="0" y="0" width="105.967" height="45.7239" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="6.9"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.405854 0 0 0 0 0.567179 0 0 0 0 0.64194 0 0 0 0.68 0"/>
+<feBlend mode="normal" in2="shape" result="effect1_innerShadow_37_324"/>
+</filter>
+<filter id="filter2_i_37_324" x="18.27" y="16.0289" width="62.1182" height="14.6318" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="-1"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.333333 0 0 0 0 0.378717 0 0 0 0 0.416667 0 0 0 1 0"/>
+<feBlend mode="normal" in2="shape" result="effect1_innerShadow_37_324"/>
+</filter>
+<linearGradient id="paint0_linear_37_324" x1="106.05" y1="89.4832" x2="-0.000117674" y2="89.4832" gradientUnits="userSpaceOnUse">
+<stop stop-color="#859FC0"/>
+<stop offset="0.514423" stop-color="#B9D5ED"/>
+<stop offset="0.745192" stop-color="#C4DBEE"/>
+<stop offset="1" stop-color="#83A3BE"/>
+</linearGradient>
+<radialGradient id="paint1_radial_37_324" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(47.5441 12.5588) rotate(26.565) scale(52.153 29.5677)">
+<stop stop-color="#ABC5E5"/>
+<stop offset="1" stop-color="#9CB8D1"/>
+</radialGradient>
+</defs>
+</svg>

+ 3 - 0
ui/src/assets/dcs/controlRouter/返回.svg

@@ -0,0 +1,3 @@
+<svg width="124" height="40" viewBox="0 0 124 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M9 1.5H30.5L33.5 7.5H94.5V1.5H110.5L122 24.5L113 38.5H15L2 15L9 1.5Z" fill="#04193F" stroke="#356E96" stroke-width="2" stroke-linecap="square"/>
+</svg>

BIN
ui/src/assets/dcs/header.jpg


+ 15 - 3
ui/src/assets/styles/dcs/hnyzConfiguratePage.scss

@@ -1,7 +1,19 @@
+.preview {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    overflow: hidden;
+    position: relative;
+    flex-direction: column;
+    height: 100vh;
+    width: 100vw;
+    background-color: #101731;
+}
+
 .page {
-    // width: 1920px;
-    // height: 1080px;
-    // background-color: #0b172c;
+    width: 1920px;
+    height: 1080px;
+    background-color: #0b172c;
     // overflow: hidden;
 
     &::before {

+ 366 - 107
ui/src/views/controlPage/flowSelect/index.vue

@@ -1,128 +1,387 @@
 <template>
-    <div class="dcs">
-        <HeaderComponent :title="'硫酸钠工序流程'" />
-
-        <div class="flow_select">
-            <!-- MGM 测试按钮 -->
-            <div class="flow_btn mgm" @click="$router.push('/controlPage/flowSelect/mgm')">
-                <div class="flow_title">MGM</div>
-            </div>
-
-            <!-- 正式按钮 -->
-            <div class="flow_btn reaction" @click="$router.push('/controlPage/flowSelect/reaction')">反应</div>
-            <div class="flow_btn separation">第一次固液分离</div>
-            <div class="flow_btn filter">24平带式过滤</div>
-
-            <!-- 箭头组件 -->
-            <!-- 反应 → 第一次固液分离 -->
-            <ArrowComponent class="arrow arrow1" :specialCondition="{ arrowRotate: 0 }" />
-
-            <!-- 反应 → 24平带式过滤 -->
-            <ArrowComponent class="arrow arrow2" :specialCondition="{ arrowRotate: 0 }" />
-
-            <!-- 第一次固液分离 → 24平带式过滤 -->
-            <ArrowComponent class="arrow arrow3" :specialCondition="{ arrowRotate: 0 }" />
-        </div>
+  <div class="dcs page">
+    <HeaderComponent :title="'硫酸钠自动化工艺模块'" />
+
+    <div class="flow_select" ref="flowRef">
+      <div class="back_button" @click="$router.push('/index')">
+        <img class="back_img" :src="backButton" alt="返回"/>
+        <div class="back_text">返回</div>
+      </div>
+      <!-- 六边形模块 -->
+      <div class="module frame module-reaction" data-key="reaction" :style="getModuleStyle('reaction')"
+        @click="$router.push('/controlPage/flowSelect/reaction')">
+        <img class="module-img" :src="imgReaction" alt="反应模块" />
+        <div class="module-title">反应模块</div>
+      </div>
+
+      <div class="module frame module-24" data-key="m24" :style="getModuleStyle('m24')"
+        @click="$router.push('/controlPage/flowSelect/flatBeltFiltration')">
+        <img class="module-img" :src="img24" alt="24平过滤" />
+        <div class="module-title">24平过滤</div>
+      </div>
+
+      <div class="module frame module-g1" data-key="g1" :style="getModuleStyle('g1')"
+        @click="$router.push('/controlPage/flowSelect/G1Decomposition')">
+        <img class="module-img" :src="imgG1" alt="G1分解" />
+        <div class="module-title">G1分解</div>
+      </div>
+
+      <div class="module frame module-g3" data-key="g3" :style="getModuleStyle('g3')"
+        @click="$router.push('/controlPage/flowSelect/G3Decomposition')">
+        <img class="module-img" :src="imgG3" alt="G3分解" />
+        <div class="module-title">G3分离</div>
+      </div>
+
+      <div class="module module-lhgb" data-key="lhgb" :style="getModuleStyle('lhgb')">
+        <img class="module-img" :src="lhgb" alt="流化干包" />
+        <div class="module-title">流化干包</div>
+      </div>
+
+      <div class="module module-s6" data-key="s6" :style="getModuleStyle('s6')">
+        <img class="module-img" :src="s6" alt="S6罐" />
+        <div class="module-title">S6罐</div>
+      </div>
+
+      <div class="module module-muye" data-key="muye" :style="getModuleStyle('muye')">
+        <img class="module-img" :src="tank" alt="母液罐" />
+        <div class="module-title">母液罐</div>
+      </div>
+
+      <div class="module module-guanqu" data-key="guanqu" :style="getModuleStyle('guanqu')">
+        <img class="module-img" :src="tank" alt="罐区" />
+        <div class="module-title">罐区</div>
+      </div>
+
+      <!-- 箭头连线:自动计算样式(left/top/width/rotate) -->
+      <img :src="arrowSvg" class="img-arrow" :style="getArrowStyle('reaction', 'm24')" alt="arrow" />
+      <img :src="arrowSvg" class="img-arrow" :style="getArrowStyle('m24', 'g1')" alt="arrow" />
+      <img :src="arrowSvg" class="img-arrow" :style="getArrowStyle('g1', 'g3')" alt="arrow" />
+      <img :src="arrowSvg" class="img-arrow" :style="getArrowStyle('s6', 'g1')" alt="arrow" />
+      <img :src="arrowSvg" class="img-arrow" :style="getArrowStyle('g3', 'lhgb')" alt="arrow" />
+      <img :src="arrowSvg" class="img-arrow" :style="getArrowStyle('g3', 'guanqu')" alt="arrow" />
+      <img :src="G3To24" class="arrow" alt="arrow" style="top: 670px; left: 774px;" />
+      <img :src="G3ToG1" class="arrow" alt="arrow" style="top: 816PX; left: 992PX;" />
+      <img :src="PinArrow" class="arrow" alt="arrow" style="top: 558PX; left: 465PX;" />
+      <img :src="PinToFanyin" class="arrow" alt="arrow" style="top: 426PX; left: 307PX;" />
+      <img :src="PinTomuye" class="arrow" alt="arrow" style="top: 236PX; left: 699PX;" />
     </div>
+  </div>
 </template>
 
 <script setup>
 import HeaderComponent from '@/components/DCS/HeaderComponent.vue'
-import ArrowComponent from '@/components/GeneralComponents/ArrowComponent.vue'
+import img24 from '@/assets/dcs/controlRouter/24平过滤.png'
+import imgG1 from '@/assets/dcs/controlRouter/G1分解.png'
+import imgG3 from '@/assets/dcs/controlRouter/G3分解.png'
+import imgReaction from '@/assets/dcs/controlRouter/反应模块.png'
+import arrowSvg from '@/assets/dcs/controlRouter/arrow.svg'
+import lhgb from '@/assets/dcs/controlRouter/流化干包.svg'
+import s6 from '@/assets/dcs/controlRouter/S6罐.svg'
+import tank from '@/assets/dcs/controlRouter/罐区.svg'
+import G3To24 from '@/assets/dcs/controlRouter/G3至24平箭头.svg'
+import G3ToG1 from '@/assets/dcs/controlRouter/G3ToG1.svg'
+import PinArrow from '@/assets/dcs/controlRouter/24PinArrow.svg'
+import PinTomuye from '@/assets/dcs/controlRouter/24PinTomuye.svg'
+import PinToFanyin from '@/assets/dcs/controlRouter/24PinToFanyin.svg'
+import backButton from '@/assets/dcs/controlRouter/返回.svg'
+import { reactive, ref, onMounted, onBeforeUnmount } from 'vue'
+// import { useRouter } from 'vue-router'
+
+// const router = useRouter()
+
+// 模块定位(像素,可根据实际截图继续微调)
+const moduleSize = { width: 233, height: 249 }
+const HEADER_HEIGHT = 81
+const pos = reactive({
+  reaction: { top: 227, left: 98 },
+  m24: { top: 388, left: 407 },
+  g1: { top: 572, left: 696 },
+  g3: { top: 643, left: 1057 },
+  lhgb: { top: 592, left: 1350 },
+  s6: { top: 366, left: 798 },
+  muye: { top: 123, left: 900 },
+  guanqu: { top: 257, left: 1272 },
+})
+
+// 根据 pos 生成模块的定位样式,并扣除头部高度
+function getModuleStyle(key) {
+  const p = pos[key]
+  if (!p) return {}
+  return {
+    left: `${p.left}px`,
+    top: `${p.top - HEADER_HEIGHT}px`,
+    width: `${moduleSize.width}px`,
+    height: `${moduleSize.height}px`,
+  }
+}
+
+// DOM 参考,使用实际渲染矩形计算边缘到边缘的箭头
+const flowRef = ref(null)
+
+function getElRect(key) {
+  const root = flowRef.value
+  if (!root) return null
+  // 优先使用模块内的首个图片作为定位参考,避免是否带边框导致的偏差
+  const img = root.querySelector(`.module[data-key="${key}"] .module-img`)
+  const el = img || root.querySelector(`.module[data-key="${key}"]`)
+  if (!el) return null
+  const rootRect = root.getBoundingClientRect()
+  const r = el.getBoundingClientRect()
+  return {
+    left: r.left - rootRect.left,
+    top: r.top - rootRect.top,
+    width: r.width,
+    height: r.height,
+  }
+}
+
+function edgeIntersection(fromRect, toRect) {
+  const fromCenter = {
+    x: fromRect.left + fromRect.width / 2,
+    y: fromRect.top + fromRect.height / 2,
+  }
+  const toCenter = {
+    x: toRect.left + toRect.width / 2,
+    y: toRect.top + toRect.height / 2,
+  }
+  const dx = toCenter.x - fromCenter.x
+  const dy = toCenter.y - fromCenter.y
+  const len = Math.hypot(dx, dy)
+  if (len === 0) return { start: fromCenter, end: toCenter, len, angle: 0, ux: 0, uy: 0 }
+  const ux = dx / len
+  const uy = dy / len
+
+  // 椭圆近似模块外形,减少不同方向上的系统性偏差
+  const margin = 12 // 略缩内切,避免压到边框描边
+  const rxFrom = Math.max(0, fromRect.width / 2 - margin)
+  const ryFrom = Math.max(0, fromRect.height / 2 - margin)
+  const rxTo = Math.max(0, toRect.width / 2 - margin)
+  const ryTo = Math.max(0, toRect.height / 2 - margin)
+
+  // 椭圆交点缩放系数 s = 1 / sqrt((ux^2/rx^2) + (uy^2/ry^2))
+  const sFrom = 1 / Math.sqrt((ux * ux) / ((rxFrom || 1e-6) * (rxFrom || 1e-6)) + (uy * uy) / ((ryFrom || 1e-6) * (ryFrom || 1e-6)))
+  const sTo = 1 / Math.sqrt((ux * ux) / ((rxTo || 1e-6) * (rxTo || 1e-6)) + (uy * uy) / ((ryTo || 1e-6) * (ryTo || 1e-6)))
+
+  const start = { x: fromCenter.x + ux * sFrom, y: fromCenter.y + uy * sFrom }
+  const end = { x: toCenter.x - ux * sTo, y: toCenter.y - uy * sTo }
+  const segLen = Math.hypot(end.x - start.x, end.y - start.y)
+  const angleDeg = Math.atan2(dy, dx) * 180 / Math.PI
+  return { start, end, len: segLen, angle: angleDeg, ux, uy }
+}
+
+// 箭头自动计算参数
+const ARROW_BASE_ANGLE = -135.77 // 资源基准朝向校正
+const LONG_WIDTH = 100
+const MIN_WIDTH = 40
+const LONG_THRESHOLD = 260 // 线段长度阈值(保留但不强制使用)
+
+function computeShortWidth(fromKey, toKey) {
+  const a = pos[fromKey]
+  const b = pos[toKey]
+  if (!a || !b) return 71
+  const gapX = Math.max(0, Math.abs(b.left - a.left) - moduleSize.width)
+  const gapY = Math.max(0, Math.abs(b.top - a.top) - moduleSize.height)
+  const shortLen = Math.hypot(gapX, gapY)
+  return Math.max(0, Math.min(shortLen, LONG_WIDTH))
+}
+
+// 针对个别连线的屏幕坐标微调(像素),默认不偏移
+function getEdgeOffsetPx(fromKey, toKey) {
+  const key = `${fromKey}>${toKey}`
+  switch (key) {
+    case 's6>g1':
+      return { dx: 0, dy: -30 }
+    default:
+      return { dx: 0, dy: 0 }
+  }
+}
+
+function getArrowStyle(fromKey, toKey) {
+  const fromRect = getElRect(fromKey)
+  const toRect = getElRect(toKey)
+  if (!fromRect || !toRect) return {}
+  const { start, end, len, angle, ux, uy } = edgeIntersection(fromRect, toRect)
+  // 宽度按两模块净间距计算,并夹在 [40, 100]
+  const width = Math.max(MIN_WIDTH, Math.min(LONG_WIDTH, computeShortWidth(fromKey, toKey)))
+  // 箭头放在连线中心,结合 CSS translate(-50%, -50%) 居中
+  // 放在连线中心(去除方向性偏置)
+  const cx = (start.x + end.x) / 2
+  const cy = (start.y + end.y) / 2
+
+  // 按连线法线方向做统一偏移,补偿箭头资源的视觉中心
+  // 取法线方向为 (uy, -ux),确保 S6->G1 等下行箭头向下偏移
+  const nx = uy
+  const ny = -ux
+  const adjX = cx + nx
+  const adjY = cy + ny
+
+  const { dx, dy } = getEdgeOffsetPx(fromKey, toKey)
+  return {
+    left: `${adjX + dx}px`,
+    top: `${adjY + dy}px`,
+    width: `${width}px`,
+    transform: `translate(-50%, -50%) rotate(${angle + ARROW_BASE_ANGLE}deg)`
+  }
+}
+
+onMounted(() => { })
+onBeforeUnmount(() => { })
 </script>
 
 <style lang="scss" scoped>
+@import '@/assets/styles/dcs/hnyzConfiguratePage.scss';
+
 .dcs {
+  position: relative;
+  width: 1920px;
+  height: 1080px;
+  overflow: hidden;
+
+  // &::before {
+  //     content: '';
+  //     position: absolute;
+  //     inset: 0;
+  //     background-image: url('@/assets/dcs/flowBg.jpeg');
+  //     background-size: cover;
+  //     background-position: center;
+  //     background-repeat: no-repeat;
+  //     filter: blur(2px);
+  //     z-index: 0;
+  // }
+
+  .flow_select {
     position: relative;
-    width: 1920px;
-    height: 1080px;
-    overflow: hidden;
+    width: 100%;
+    height: 100%;
+    z-index: 1;
+
+    .back_button {
+      position: relative;
+      left: 64px;
+      top: 114.5px - 81px;
+      flex-shrink: 0;
+      width: 124px;
+
+      .back_text {
+        position: absolute;
+        top: 11px;
+        color: #fff;
+        left: 48px;
+        user-select: none;
+      }
+
+      &:hover {
+        transform: scale(1.04);
+      }
+      // .back_img {
+      // width: 1920px;
+      // }
+    }
+
+    // 六边形模块通用样式
+    .module {
+      position: absolute;
+      width: v-bind('moduleSize.width + "px"');
+      height: v-bind('moduleSize.height + "px"');
+
+      // 默认无边框
+      &::before {
+        display: none;
+      }
 
-    &::before {
+      &.frame::before {
         content: '';
         position: absolute;
         inset: 0;
-        background-image: url('@/assets/dcs/flowBg.jpeg');
-        background-size: cover;
-        background-position: center;
-        background-repeat: no-repeat;
-        filter: blur(2px);
-        z-index: 0;
-    }
+        background: url('@/assets/dcs/controlRouter/模块框.svg') no-repeat center/contain;
+        filter: drop-shadow(0 0 12px rgba(0, 173, 255, .35));
+        pointer-events: none;
+        display: block;
+      }
+
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      cursor: pointer;
+      transition: transform .25s ease;
+
+      &:hover {
+        transform: scale(1.04);
+      }
+
+      .module-img {
+        // 1920*1080
+        width: 192px;
+        height: 100px;
+        // margin-top: 26px; // 让图片位于标题下方
+        filter: drop-shadow(0 0 8px rgba(0, 0, 0, .4));
+      }
 
-    .flow_select {
-        position: relative;
-        width: 100%;
-        height: 100%;
+      .module-title {
+        position: absolute;
+        top: 40px; // 放在六边形内部,位于图片上方
+        left: 50%;
+        transform: translateX(-50%);
+        color: #8ad0ff;
+        font-size: 16px;
+        line-height: 1;
+        letter-spacing: 1px;
+        text-shadow: 0 2px 6px rgba(0, 0, 0, .6);
         z-index: 1;
+        pointer-events: none;
+      }
+
+      .sample {
+        position: absolute;
+        bottom: -18px;
+        left: 50%;
+        transform: translateX(-50%);
+        color: #ff5ec7;
+        font-size: 16px;
+      }
+    }
+
+    // 定位由脚本中的 getModuleStyle(pos) 生成
+
+    // 箭头
+    .img-arrow {
+      position: absolute;
+      width: 220px;
+      filter: drop-shadow(0 0 6px rgba(0, 255, 255, .35));
+      z-index: 2; // 箭头在模块之上
+      pointer-events: none;
+      transform-origin: center center;
+    }
+
+    // 固定箭头样式(按需启用)
+    // .img-arrow-reaction-m24 {
+    //     left: 385px;
+    //     top: 336px;
+    //     width: 71px;
+    //     transform: rotate(-110.5211deg);
+    // }
+    // .img-arrow-m24-g1 {
+    //     left: 671.905px;
+    //     top: 518.432px;
+    //     width: 71px;
+    //     transform: rotate(-100.516deg);
+    // }
+    // .img-arrow-g1-g3 {
+    //     left: 1021.868px;
+    //     top: 639.764px;
+    //     width: 100px;
+    //     transform: rotate(-126.873deg);
+    // }
+    .arrow {
+      position: absolute;
+      z-index: 2; // 箭头在模块之上
+      pointer-events: none;
+      transform-origin: center center;
+    }
 
-        .flow_btn {
-            position: absolute;
-            width: 260px;
-            height: 160px;
-            background-color: rgba(255, 255, 255, 0.06);
-            border: 2px solid #e18a3b;
-            border-radius: 16px;
-            box-shadow: 0 0 15px rgba(255, 153, 0, 0.4);
-            padding: 20px;
-            display: flex;
-            justify-content: center;
-            align-items: center;
-            color: #ffd180;
-            font-size: 30px;
-            font-weight: bold;
-            cursor: pointer;
-            transition: all 0.3s ease;
-
-            &:hover {
-                background-color: rgba(255, 255, 255, 0.12);
-                transform: scale(1.05);
-                box-shadow: 0 0 25px rgba(255, 153, 0, 0.8);
-            }
-        }
-
-        .mgm {
-            top: 40px;
-            left: 60px;
-        }
-
-        .reaction {
-            top: 277px;
-            left: 400px;
-        }
-
-        .separation {
-            top: 100px;
-            left: 800px;
-        }
-
-        .filter {
-            top: 460px;
-            left: 800px;
-        }
-
-        .arrow {
-            position: absolute;
-            z-index: 2;
-        }
-
-        .arrow1 {
-            top: 230px;
-            left: 750px;
-            transform: translate(-50%, -50%) rotate(-35deg);
-        }
-
-        .arrow2 {
-            top: 490px;
-            left: 750px;
-            transform: translate(-50%, -50%) rotate(35deg);
-        }
-
-        .arrow3 {
-            top: 365px;
-            left: 920px;
-            transform: translate(-50%, -50%) rotate(90deg);
-        }
+    .arrow_line {
+      border: 2px greenyellow dashed;
     }
+  }
 }
 </style>

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff