Gsix.vue 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406
  1. <!-- 一致性对比结果的画图 -->
  2. <script setup>
  3. import { nextTick, onMounted, ref, watch } from "vue";
  4. import { compResult } from "@/api/scdCheck/scdCheck2";
  5. import squer from "@/assets/image/CID/squer.png";
  6. import del0 from "@/assets/image/CID/del0.png";
  7. import modify0 from "@/assets/image/CID/modify0.png";
  8. import newly0 from "@/assets/image/CID/newly0.png";
  9. import LeaderLine from "../../../../public/leader-line.min.js";
  10. import AnimEvent from "../../../../public/anim-event.min.js";
  11. import { hiddenLine2, hiddenLineDialog } from "@/utils/linesPosition";
  12. import jiantou from "@/assets/image/CID/jiantou.png";
  13. const props = defineProps({
  14. clickRowDatas: {
  15. type: Object,
  16. default: () => {},
  17. },
  18. iedRelation: {
  19. type: Object,
  20. default: () => {},
  21. },
  22. clickList: {
  23. type: Object,
  24. default: () => {},
  25. },
  26. clickCodeValue: {
  27. type: String,
  28. default: "",
  29. },
  30. });
  31. const clickRow = ref(props.clickRowDatas);
  32. let tagList = ref(null); //左侧更改的设备列表
  33. //对比文件:头部对比的单个数据
  34. watch(
  35. () => props.clickRowDatas,
  36. (newValue) => {
  37. if (newValue) {
  38. clickRow.value = newValue;
  39. }
  40. }
  41. );
  42. //点击装置列表的数据变化
  43. watch(
  44. () => props.clickList,
  45. (newValue) => {
  46. if (newValue) {
  47. tagList.value = newValue;
  48. clickLineResult();
  49. clickLineResultMain();
  50. getData();
  51. nextTick(() => {
  52. setTimeout(() => {
  53. setLeaderlineMain();
  54. }, 300);
  55. if (cClickCode.value == "scd.ied") {
  56. setTimeout(() => {
  57. setLeaderlines("UpLeftBasic");
  58. newPositionLine2(leaderLineShow.value);
  59. }, 300);
  60. }
  61. });
  62. }
  63. }
  64. );
  65. const cClickCode = ref(props.clickCodeValue); //点击侧边栏差异项的code
  66. watch(
  67. () => props.clickCodeValue,
  68. (newValue) => {
  69. if (newValue) {
  70. isDiffdesc.value = false; //点击侧边栏的时候站控层的这个先置为空
  71. cClickCode.value = newValue;
  72. CodeImg(newValue); //找到差异项对应的图片进行展示
  73. clickLineResult(); //重置
  74. clickLineResultMain(); //重置
  75. loading.value = true;
  76. getData();
  77. nextTick(() => {
  78. //一来左右两侧展示的线条
  79. setTimeout(() => {
  80. setLeaderlineMain();
  81. }, 300);
  82. //如果是基本信息则不用点击图片直接调用画线
  83. if (newValue == "scd.ied") {
  84. setTimeout(() => {
  85. setLeaderlines("UpLeftBasic");
  86. newPositionLine2(leaderLineShow.value);
  87. }, 300);
  88. }
  89. });
  90. }
  91. }
  92. );
  93. const mapList = ref(null);
  94. //IED版本数据,diff_opt中u是修改,i是新增,d是删除
  95. const leftI = ref([]); //新增
  96. const dataU = ref([]); //修改
  97. const rightD = ref([]); //删除
  98. const loading = ref(true);
  99. const dones = () => {
  100. //重置
  101. leftI.value = [];
  102. dataU.value = [];
  103. rightD.value = [];
  104. };
  105. const mianItem = ref(null);
  106. const heights = ref(0);
  107. const middleLine = ref(null);
  108. const IorDClick = ref({}); //点击或默认显示的连线数据
  109. const rightStartDom = ref(null); //右侧图片带差异名字大板块的dom
  110. const leftStartDom = ref(null); //左侧图片带差异名字大板块的dom
  111. const middleMain = ref(null);
  112. const isDiffdesc = ref(false); //判断是否是数组,如果是数组并且又是修改,那么修改的数据显示需要重新处理
  113. const getData = async () => {
  114. dones();
  115. const ids = clickRow.value ? clickRow.value.id : "";
  116. const names = tagList.value ? tagList.value.ied_name : "";
  117. const res = await compResult({
  118. comp_id: ids,
  119. ied_name: names,
  120. comptype: "u",
  121. itemcode: cClickCode.value,
  122. });
  123. if (res.data && cClickCode.value != "scd.ied") {
  124. res.data.forEach((item) => {
  125. let text;
  126. text = item.diff_desc.replace(/[\r|\n|\t]/g, ""); //处理返回的数据中换行等,整理好规整数据
  127. item.diff_desc = JSON.parse(text);
  128. isDiffdesc.value = false;
  129. switch (item.diff_opt) {
  130. case "i": //新增
  131. leftI.value.push(item);
  132. break;
  133. case "d":
  134. rightD.value.push(item);
  135. break;
  136. case "u": //修改
  137. dataU.value.push(item);
  138. break;
  139. }
  140. });
  141. } else {
  142. }
  143. mapList.value = res.data;
  144. nextTick(() => {
  145. middleLine.value.style.height = 0;
  146. middleLine.value.style.height = mianItem.value.scrollHeight + "px";
  147. });
  148. // loading.value = false;
  149. };
  150. //点击新增或删除的图片
  151. const DelClick = ref({});
  152. const clickTypeImg = (item, event) => {
  153. clickLineResult();
  154. domListAdd.value = event.target;
  155. setTimeout(() => {
  156. setLeaderlines("add");
  157. newPositionLine2(leaderLineShow.value);
  158. }, 100);
  159. comonTypeImg(item, event);
  160. };
  161. const clickTypeImgDel = (item, event) => {
  162. clickLineResult();
  163. domListDel.value = event.target;
  164. setTimeout(() => {
  165. setLeaderlines("del");
  166. newPositionLine2(leaderLineShow.value);
  167. }, 100);
  168. comonTypeImg(item, event, 2);
  169. };
  170. const clickReset = () => {
  171. DelClick.value = {};
  172. mapList.value = null;
  173. IorDClick.value = {};
  174. newrightData.value = {};
  175. newleftData.value = {};
  176. newrightDataMiddle.value = {};
  177. newleftDataMiddle.value = {};
  178. leaderLineShow.value = [];
  179. if (addDiff.value && delDiff.value) {
  180. addDiff.value.style.top = 0;
  181. delDiff.value.style.top = 0;
  182. }
  183. };
  184. const addDiff = ref(0);
  185. const delDiff = ref(0);
  186. const comonTypeImg = (item, event, num) => {
  187. clickLineResult();
  188. setTopDiffName(event);
  189. newrightData.value = null;
  190. newleftData.value = null;
  191. for (let key in item.diff_desc) {
  192. if (item.diff_desc.hasOwnProperty(key)) {
  193. const value = item.diff_desc[key];
  194. if (
  195. typeof value === "string" ||
  196. typeof value === "boolean" ||
  197. typeof value === "number"
  198. ) {
  199. if (num == 2) {
  200. DelClick.value[key] = value;
  201. } else {
  202. IorDClick.value[key] = value;
  203. }
  204. }
  205. }
  206. }
  207. };
  208. //点击修改的图片
  209. const newleftData = ref(null);
  210. const newrightData = ref(null);
  211. const clickUpIdDomName = ref(null); //点击的name
  212. const Communication = (arr, list) => {
  213. //站控层数据特殊处理
  214. if (
  215. Array.isArray(arr) &&
  216. list.diff_opt == "u" &&
  217. cClickCode.value == "scd.ied.Communication.S1"
  218. ) {
  219. //如果是站控层,数据要从新处理并且是数组
  220. isDiffdesc.value = true;
  221. } else {
  222. isDiffdesc.value = false;
  223. }
  224. };
  225. const clickUpTypeImgLeft = (arr, event, name, list) => {
  226. clickLineResult();
  227. Communication(arr, list);
  228. clickUpIdDomName.value = name.replace(/[^\w\s]/g, ""); //如果有冒号query查找会报错,所以替换 成了点
  229. domListUpLeft.value = event.target;
  230. setTimeout(() => {
  231. setLeaderlines("UpLeft");
  232. newPositionLine2(leaderLineShow.value);
  233. }, 100);
  234. if (!isDiffdesc.value && arr.length > 0) {
  235. //如果不是修改数据并且diff_desc不是数组
  236. clickUpTypeImg(arr, event);
  237. } else if (isDiffdesc.value) {
  238. //修改里面包含新增和删除
  239. clickUpTypeImgUpdate(arr, event);
  240. }
  241. };
  242. const clickUpTypeImgRight = (arr, event, name, list) => {
  243. clickLineResult();
  244. Communication(arr, list);
  245. clickUpIdDomName.value = name.replace(/[^\w\s]/g, "");
  246. domListUpRight.value = event.target;
  247. setTimeout(() => {
  248. setLeaderlines("UpRight");
  249. newPositionLine2(leaderLineShow.value);
  250. }, 100);
  251. if (!isDiffdesc.value && arr.length > 0) {
  252. clickUpTypeImg(arr, event);
  253. } else if (isDiffdesc.value) {
  254. //修改里面包含新增和删除
  255. clickUpTypeImgUpdate(arr, event);
  256. }
  257. };
  258. const CommunicationS1 = ref([]); //站控层的修改时有新增和修改的数据
  259. const clickUpTypeImgUpdate = (arr, event) => {
  260. //点击修改的图片
  261. console.log("arr-----", arr);
  262. clickLineResult();
  263. setTopDiffName(event);
  264. if (arr.length && arr.length > 0) {
  265. arr[0].P.forEach((item1) => {
  266. let foundMatch = false;
  267. for (let item2 of arr[1].P) {
  268. if (item1.Type === item2.Type) {
  269. foundMatch = true;
  270. // 正则是为了删除所有的空格
  271. if (
  272. item1.InnerText.replace(/\s+/g, "") !=
  273. item2.InnerText.replace(/\s+/g, "")
  274. ) {
  275. CommunicationS1.value.unshift({
  276. InnerText: item1.InnerText,
  277. Type: item1.Type,
  278. nnerTextRight: item2.InnerText,
  279. });
  280. }
  281. break;
  282. }
  283. }
  284. if (!foundMatch) {
  285. CommunicationS1.value.unshift({
  286. InnerText: item1.InnerText,
  287. Type: item1.Type,
  288. nnerTextRight: "空",
  289. });
  290. }
  291. });
  292. }
  293. CommunicationS1.value.forEach(item=>{
  294. if(item.nnerTextRight == ''){
  295. item.add = true;
  296. CommunicationS1.value.push(item)
  297. }
  298. })
  299. console.log(" CommunicationS1.value", CommunicationS1.value);
  300. // const data = [
  301. // {
  302. // P: [
  303. // { InnerText: "255.255.0.0", Type: "IP-SUBNET" },
  304. // { nnerText: "255.255.0.0", Type: "IP-GATEWAY" },
  305. // { nnerText: "00 01", Type: "OSI-TSEL" },
  306. // { nnerText: "00 01", Type: "OSI-SSEL" },
  307. // { InnerText: "00 00 00 01", Type: "OSI-PSEL" },
  308. // { nnerText: "OSI-NSAP", Type: "OSI-NSAP" },
  309. // { nnerText: "1 3 9999 33", Type: "OSI-AP-Title" },
  310. // { nnerText: "OSI-AP-Invoke", Type: "OSI-AP-Invoke" },
  311. // { nnerText: "33", Type: "OSI-AE-Qualifier" },
  312. // { nnerText: "OSI-AE-Invoke", Type: "OSI-AE-Invoke" },
  313. // { nnerText: "172.20.11.2", Type: "IP" },
  314. // ],
  315. // },
  316. // {
  317. // P: [
  318. // { nnerText: "198.120.0.58", Type: "IP" },
  319. // { nnerText: "255.255.0.0", Type: "IP-SUBNET" },
  320. // ],
  321. // },
  322. // ];
  323. // // data中[0]的属性的数组中的Type值等于了data中[1]的属性的数组中的Type值,并且nnerText值也相同就不用放在newdata新数组中
  324. // // 如果data中[0]的属性的数组中的Type值等于了data中[1]的属性的数组中的Type值并且nnerText值不 相同,
  325. // // 那么把data中[1]中的Type相等的nnerText值赋给data中[0]的nnerTextRight,如果data中[0]的Type值,data[1]中没有,那么data中[0]属性nnerTextRight的值为 空 字符串
  326. // //nnerText是展示在左侧的数据,nnerTextRight是展示在右侧的数据,如果nnerTextRight为空,那么同时展示在左侧最下方表示新增
  327. // // 示例结果
  328. // const newdata = [
  329. // { nnerText: "255.255.0.0", Type: "IP-GATEWAY", nnerTextRight: "空" },
  330. // { nnerText: "00 01", Type: "OSI-TSEL", nnerTextRight: "空" },
  331. // { nnerText: "00 01", Type: "OSI-SSEL", nnerTextRight: "空" },
  332. // { InnerText: "00 00 00 01", Type: "OSI-PSEL", nnerTextRight: "空" },
  333. // { nnerText: "OSI-NSAP", Type: "OSI-NSAP", nnerTextRight: "空" },
  334. // { nnerText: "1 3 9999 33", Type: "OSI-AP-Title", nnerTextRight: "空" },
  335. // { nnerText: "OSI-AP-Invoke", Type: "OSI-AP-Invoke", nnerTextRight: "空" },
  336. // { nnerText: "33", Type: "OSI-AE-Qualifier", nnerTextRight: "空" },
  337. // { nnerText: "OSI-AE-Invoke", Type: "OSI-AE-Invoke", nnerTextRight: "空" },
  338. // { nnerText: "172.20.11.2", Type: "IP", nnerTextRight: "198.120.0.58" },
  339. // ];
  340. };
  341. const setTopDiffName = (event) => {
  342. const dom1Rect = rightStartDom.value.getBoundingClientRect();
  343. const dom2Rect = leftStartDom.value.getBoundingClientRect();
  344. //设置差异位置
  345. nextTick(() => {
  346. const evt = event.target.getBoundingClientRect();
  347. let keyCount = newrightData.value
  348. ? Object.keys(newrightData.value).length
  349. : 0;
  350. let keyCount2 = newrightData.value
  351. ? Object.keys(newleftData.value).length
  352. : 0;
  353. if ((keyCount != 0 && keyCount < 3) || (keyCount != 0 && keyCount2 < 3)) {
  354. const nums = evt.top - dom2Rect.top + 160 + "px";
  355. const numsR = evt.top - dom1Rect.top + 160 + "px";
  356. addDiff.value.style.top = nums;
  357. delDiff.value.style.top = numsR;
  358. middleMain.value.style.top = nums;
  359. } else {
  360. const nums2 = evt.top - dom2Rect.top + 60 + "px";
  361. const numsR = evt.top - dom1Rect.top + 60 + "px";
  362. addDiff.value.style.top = nums2;
  363. delDiff.value.style.top = numsR;
  364. middleMain.value.style.top = nums2;
  365. }
  366. });
  367. };
  368. const newleftDataMiddle = ref(null); //处理修改居中展示的数据
  369. const newrightDataMiddle = ref(null);
  370. const clickUpTypeImg = (arr, event) => {
  371. clickLineResult();
  372. setTopDiffName(event);
  373. let newleft = {};
  374. let newright = {};
  375. for (let key in arr[0]) {
  376. //检查当前属性是否存在于两个输入对象中,并且它们的值是否不同。
  377. if (
  378. arr[0].hasOwnProperty(key) &&
  379. arr[1].hasOwnProperty(key) &&
  380. arr[0][key] !== arr[1][key]
  381. ) {
  382. if (typeof arr[0][key] === "object") {
  383. // 如果当前属性的值是另一个对象,则进一步检查
  384. for (let subKey in arr[0][key]) {
  385. //遍历当前对象的所有子属性。
  386. // 检查子属性是否存在于两个输入对象中,并且它们的值是否不同。
  387. if (
  388. arr[0][key].hasOwnProperty(subKey) &&
  389. arr[1][key].hasOwnProperty(subKey) &&
  390. arr[0][key][subKey] !== arr[1][key][subKey]
  391. ) {
  392. // 如果满足上述条件,则将子属性添加到 newleft 对象中。
  393. // 同时将子属性添加到 newright 对象中。
  394. newleft[key] = {
  395. ...newleft[key],
  396. [subKey]: arr[0][key][subKey],
  397. };
  398. newright[key] = {
  399. ...newright[key],
  400. [subKey]: arr[1][key][subKey],
  401. };
  402. }
  403. }
  404. } else {
  405. // 如果当前属性的值不是另一个对象,则直接将它们添加到对应的输出对象中。
  406. newleft[key] = arr[0][key];
  407. newright[key] = arr[1][key];
  408. }
  409. } else if (!arr[1].hasOwnProperty(key)) {
  410. // 如果第二个输入对象没有当前属性,则将该属性添加到 newleft 对象中。
  411. newleft[key] = arr[0][key];
  412. } else if (!arr[0].hasOwnProperty(key)) {
  413. // 如果第一个输入对象没有当前属性,则将该属性添加到 newright 对象中。
  414. newright[key] = arr[1][key];
  415. }
  416. }
  417. newrightData.value = newright;
  418. newleftData.value = newleft;
  419. //处理中间展示的数据===
  420. newrightDataMiddle.value = flattenObject(newright);
  421. newleftDataMiddle.value = flattenObject(newleft);
  422. };
  423. function flattenObject(obj, prefix = "") {
  424. const flattenedObj = {};
  425. //函数会遍历对象的属性,并根据属性的类型将其拆分成扁平的形式。
  426. for (let key in obj) {
  427. //如果属性的值是一个对象,并且不为nul,则递归调用 flattenobiect 函数来处理嵌套对象,同时更新前缀。
  428. if (typeof obj[key] === "object" && obj[key] !== null) {
  429. const nestedObj = flattenObject(obj[key], `${prefix}${key}.`);
  430. Object.assign(flattenedObj, nestedObj);
  431. } else {
  432. flattenedObj[`${prefix}${key}`] = obj[key];
  433. }
  434. }
  435. console.log("flattenedObj", flattenedObj);
  436. return flattenedObj;
  437. }
  438. //动态处理点击右侧code左右侧大板块图片
  439. const codeImg = ref(null);
  440. const codeImgs = {
  441. "scd.ied.ExtRef": require("@/assets/image/CID/b_get4.png"),
  442. "scd.ied.FCDA": require("@/assets/image/CID/b_go5.png"),
  443. "scd.ied.GSEControl": require("@/assets/image/CID/b_goose2.png"),
  444. "scd.ied.Communication.GSE": require("@/assets/image/CID/b_goose2.png"),
  445. "scd.ied.DatSet": require("@/assets/image/CID/b_navicat_plus17.png"),
  446. "scd.ied.DatSetMeber": require("@/assets/image/CID/b_navicat16.png"),
  447. "scd.ied": require("@/assets/image/CID/b_pole6.png"),
  448. "scd.ied.ReportControl": require("@/assets/image/CID/b_report14.png"),
  449. "scd.ied.LogControl": require("@/assets/image/CID/b_setting15.png"),
  450. "scd.ied.YC": require("@/assets/image/CID/b_speed9.png"),
  451. "scd.ied.Communication.S1": require("@/assets/image/CID/b_stand1.png"),
  452. "scd.ied.DZ": require("@/assets/image/CID/b_stknum11.png"),
  453. "scd.ied.SampledValueControl": require("@/assets/image/CID/b_sv3.png"),
  454. "scd.ied.YX": require("@/assets/image/CID/b_wifi7.png"),
  455. "scd.ied.Communication": require("@/assets/image/CID/b_wifi7.png"),
  456. "scd.ied.YM": require("@/assets/image/CID/bb10.png"),
  457. "scd.ied.YK": require("@/assets/image/CID/btn8.png"),
  458. };
  459. const CodeImg = (val) => {
  460. if (val) {
  461. codeImg.value = codeImgs[val];
  462. }
  463. };
  464. //处理中间展示的数据===
  465. // 连线====
  466. const leaderLineShow = ref([]); //控制线条显示
  467. // 新增差异名字dom
  468. const domListAdd = ref(null); //获取左侧点击新增图片的dom
  469. const domListDel = ref(null); //获取右侧点击删除图片的dom
  470. const domListUpLeft = ref(null); //获取左侧侧点击修改图片的dom
  471. const domListUpRight = ref(null); //获取右侧侧点击修改图片的dom
  472. const domListAddName = ref(new Map()); //获取所有新增差异名字
  473. const domListAddValue = ref(new Map()); //获取所有新增差异属性
  474. const domListDelName = ref(new Map()); //获取所有删除差异名字
  475. const domListDelValue = ref(new Map()); //获取所有删除差异属性
  476. const domListLeftMain = ref(new Map()); //获取左侧所有图片的dom
  477. const domListRightMain = ref(new Map()); //获取右侧所有图片的dom
  478. const domListUpLeftName = ref(new Map()); //获取点击左侧属性名差异名字
  479. const domListUpMiddleName = ref(new Map()); //获取点击修改中间属性
  480. const domListUpRightName = ref(new Map()); //获取点击右侧属性名差异名字
  481. const setdomAddName = (el, item) => {
  482. //左侧点击新增差异名字dom
  483. if (el) {
  484. domListAddName.value.set(item, el);
  485. }
  486. };
  487. const setdomAddValue = (el, item) => {
  488. //左侧点击新增差异值dom
  489. if (el) {
  490. domListAddValue.value.set(item, el);
  491. }
  492. };
  493. const setdomDelName = (el, item) => {
  494. //左侧点击删除差异名字dom
  495. if (el) {
  496. domListDelName.value.set(item, el);
  497. }
  498. };
  499. const setdomDelValue = (el, item) => {
  500. //左侧点击删除差异值dom
  501. if (el) {
  502. domListDelValue.value.set(item, el);
  503. }
  504. };
  505. const setdomLeftMain = (el, item) => {
  506. //左侧侧灰色一对多主连线
  507. if (el) {
  508. domListLeftMain.value.set(item, el);
  509. }
  510. };
  511. const setdomRightMain = (el, item) => {
  512. //右侧灰色一对多主连线
  513. if (el) {
  514. domListRightMain.value.set(item, el);
  515. }
  516. };
  517. const setdomUPLeftName = (el, item) => {
  518. //左侧点击修改差异名字dom
  519. if (el) {
  520. domListUpLeftName.value.set(item, el);
  521. }
  522. };
  523. const setdomUPMiddleName = (el, item) => {
  524. //左侧点击修改差异名字dom
  525. if (el) {
  526. domListUpMiddleName.value.set(item, el);
  527. }
  528. };
  529. const setdomUpRightName = (el, item) => {
  530. //左侧点击修改差异值dom
  531. if (el) {
  532. domListUpRightName.value.set(item, el);
  533. }
  534. };
  535. const lineStyleAdd = {
  536. color: "#134bea",
  537. size: 2,
  538. path: "grid",
  539. endPlug: "behind",
  540. startSocket: "right",
  541. endSocket: "left",
  542. };
  543. const lineStyleDel = {
  544. color: "#FF0000",
  545. size: 2,
  546. path: "grid",
  547. endPlug: "behind",
  548. startSocket: "right",
  549. endSocket: "left",
  550. };
  551. //左右两侧一来显示的连线
  552. const leaderLineMain = ref([]);
  553. const setLeaderlineMain = () => {
  554. const lineStyleLeftMain = {
  555. ...lineStyleAdd,
  556. color: "#C8D4E2",
  557. };
  558. const lineStyleRightMain = {
  559. ...lineStyleAdd,
  560. color: "#C8D4E2",
  561. startSocket: "right",
  562. endSocket: "left",
  563. };
  564. const mainLeftStartDom = document.getElementById("leftMainDom");
  565. const mainRightStartDom = document.getElementById("rightMainDom");
  566. if (domListLeftMain.value.size > 0) {
  567. for (const [key, value] of domListLeftMain.value) {
  568. let line;
  569. line = new LeaderLine(mainLeftStartDom, value, lineStyleLeftMain);
  570. leaderLineMain.value.push(line);
  571. hiddenLineDialog();
  572. }
  573. }
  574. if (domListRightMain.value.size > 0) {
  575. for (const [key, value] of domListRightMain.value) {
  576. let lines;
  577. lines = new LeaderLine(value, mainRightStartDom, lineStyleRightMain);
  578. leaderLineMain.value.push(lines);
  579. hiddenLineDialog();
  580. }
  581. }
  582. loading.value = false;
  583. };
  584. //左右两侧点击图片显示的连线
  585. const setLeaderlines = (types) => {
  586. const lineStyleAdd2 = {
  587. ...lineStyleAdd,
  588. path: "straight",
  589. };
  590. const lineStyleDel2 = {
  591. ...lineStyleDel,
  592. path: "straight",
  593. startSocket: "right",
  594. endSocket: "left",
  595. };
  596. if (types == "add" && domListAddName.value.size > 0) {
  597. //新增
  598. for (const [key, value] of domListAddName.value) {
  599. for (const [key2, value2] of domListAddValue.value) {
  600. if (key == key2) {
  601. const startDom = domListAdd.value;
  602. let line;
  603. line = new LeaderLine(startDom, value, lineStyleAdd);
  604. leaderLineShow.value.push(line);
  605. let lineValue;
  606. lineValue = new LeaderLine(value, value2, lineStyleAdd2);
  607. leaderLineShow.value.push(lineValue);
  608. //弹窗打开后使得线条在指定区域中
  609. hiddenLine2();
  610. }
  611. }
  612. }
  613. } else if (types == "del" && domListDelName.value.size > 0) {
  614. //删除
  615. for (const [key, value] of domListDelName.value) {
  616. for (const [key2, value2] of domListDelValue.value) {
  617. if (key == key2) {
  618. const startDom = domListDel.value;
  619. let line;
  620. line = new LeaderLine(value, startDom, lineStyleDel);
  621. leaderLineShow.value.push(line);
  622. let lineValue;
  623. lineValue = new LeaderLine(value, value2, lineStyleDel2);
  624. leaderLineShow.value.push(lineValue);
  625. //弹窗打开后使得线条在指定区域中
  626. hiddenLine2();
  627. }
  628. }
  629. }
  630. } else if (
  631. (types == "UpLeft" && domListUpLeft.value) ||
  632. (types == "UpLeftBasic" && cClickCode.value == "scd.ied")
  633. ) {
  634. const startDom =
  635. types == "UpLeft"
  636. ? domListUpLeft.value
  637. : document.getElementById("leftBasic");
  638. console.log(
  639. "first",
  640. document.querySelectorAll(`#${clickUpIdDomName.value}`)
  641. );
  642. const doms =
  643. types == "UpLeftBasic"
  644. ? domListUpRight.value
  645. : document.querySelectorAll(`#${clickUpIdDomName.value}`);
  646. let sameDom;
  647. if (types == "UpLeft") {
  648. sameDom = doms && doms.length > 1 ? doms[1] : doms[0]; //点击修改左侧或右侧每点击相同名字的dom
  649. } else {
  650. sameDom = document.getElementById("rightBasic"); //相同名字的dom
  651. }
  652. const lineStylUp = {
  653. ...lineStyleAdd,
  654. color: "#FFA011",
  655. };
  656. const lineStylSame = {
  657. ...lineStyleAdd,
  658. color: "#FFA011",
  659. startSocket: "right",
  660. endSocket: "left",
  661. };
  662. //左侧点击修改数据
  663. for (const [key, value] of domListUpLeftName.value) {
  664. for (const [key2, value2] of domListUpMiddleName.value) {
  665. for (const [key3, value3] of domListUpRightName.value) {
  666. if (key == key2 && key2 == key3) {
  667. let line; //从左往右的线条
  668. line = new LeaderLine(startDom, value, lineStylUp);
  669. leaderLineShow.value.push(line);
  670. let lineValue;
  671. lineValue = new LeaderLine(value, value2, lineStylUp);
  672. leaderLineShow.value.push(lineValue);
  673. let lineValue3;
  674. lineValue3 = new LeaderLine(value2, value3, lineStylUp);
  675. leaderLineShow.value.push(lineValue3);
  676. let lineValue4;
  677. lineValue4 = new LeaderLine(value3, sameDom, lineStylUp);
  678. leaderLineShow.value.push(lineValue4);
  679. //弹窗打开后使得线条在指定区域中
  680. hiddenLine2();
  681. }
  682. }
  683. }
  684. }
  685. } else if (types == "UpRight" && domListUpRight.value) {
  686. const startDom = domListUpRight.value;
  687. const sameDom = document.querySelectorAll(`#${clickUpIdDomName.value}`); //点击修改左侧或右侧每点击相同名字的dom
  688. const lineStylUp = {
  689. ...lineStyleAdd,
  690. color: "#FFA011",
  691. };
  692. const lineStylSame = {
  693. ...lineStyleAdd,
  694. color: "#FFA011",
  695. startSocket: "left",
  696. endSocket: "right",
  697. };
  698. //左侧点击修改数据
  699. for (const [key, value] of domListUpRightName.value) {
  700. for (const [key2, value2] of domListUpMiddleName.value) {
  701. for (const [key3, value3] of domListUpLeftName.value) {
  702. if (key == key2 && key2 == key3) {
  703. let line; //从左往右的线条
  704. line = new LeaderLine(value, startDom, lineStylUp);
  705. leaderLineShow.value.push(line);
  706. let lineValue;
  707. lineValue = new LeaderLine(value2, value, lineStylUp);
  708. leaderLineShow.value.push(lineValue);
  709. let lineValue3;
  710. lineValue3 = new LeaderLine(value3, value2, lineStylUp);
  711. leaderLineShow.value.push(lineValue3);
  712. let lineValue4;
  713. lineValue4 = new LeaderLine(sameDom[0], value3, lineStylUp);
  714. leaderLineShow.value.push(lineValue4);
  715. //弹窗打开后使得线条在指定区域中
  716. hiddenLine2();
  717. }
  718. }
  719. }
  720. }
  721. }
  722. // else if(types=='UpLeftBasic'&&cClickCode.value=='scd.ied'){
  723. // console.log('domListUpLeftName.value', domListUpLeftName.value)
  724. // }
  725. };
  726. //滚动时重定位线条
  727. const newPositionLine2 = (diffline) => {
  728. document.getElementById("wrapper").addEventListener(
  729. "scroll",
  730. AnimEvent.add(() => {
  731. leaderLineMain.value.forEach((line) => {
  732. if (line) {
  733. hiddenLineDialog();
  734. line.position();
  735. line.positionByWindowResize = false;
  736. }
  737. });
  738. leaderLineShow.value.forEach((line) => {
  739. if (line) {
  740. hiddenLine2();
  741. line.position();
  742. line.positionByWindowResize = false;
  743. }
  744. });
  745. //中间展示图片的
  746. }),
  747. false
  748. );
  749. document.getElementById("treedomCid").addEventListener(
  750. "resize",
  751. AnimEvent.add(function () {
  752. leaderLineMain.value.forEach((line) => {
  753. hiddenLineDialog();
  754. line.position();
  755. line.positionByWindowResize = false;
  756. });
  757. leaderLineShow.value.forEach((line) => {
  758. hiddenLine2();
  759. line.position();
  760. line.positionByWindowResize = false;
  761. });
  762. }),
  763. false
  764. );
  765. };
  766. const removeLine2 = () => {
  767. const elmWrapper = document.getElementById("wrapper");
  768. if (elmWrapper) {
  769. elmWrapper.querySelectorAll("#wrapper .leader-line").forEach((node) => {
  770. // elmWrapper.removeChild(node);
  771. node.remove();
  772. });
  773. }
  774. };
  775. //点击的线条重置
  776. const clickLineResult = () => {
  777. clickReset();
  778. CommunicationS1.value = [];
  779. domListAddName.value.clear();
  780. domListAddValue.value.clear();
  781. domListDelName.value.clear();
  782. domListDelValue.value.clear();
  783. domListUpLeftName.value.clear();
  784. domListUpRightName.value.clear();
  785. domListUpMiddleName.value.clear();
  786. leaderLineShow.value = [];
  787. removeLine2();
  788. };
  789. //主线条重置
  790. const clickLineResultMain = () => {
  791. domListRightMain.value.clear();
  792. domListLeftMain.value.clear();
  793. leaderLineMain.value = [];
  794. document.body.querySelectorAll("body .leader-line").forEach((node) => {
  795. node.remove();
  796. // elmWrapper.removeChild(node);
  797. });
  798. };
  799. watch(
  800. () => mapList.value,
  801. (newValue) => {
  802. if (newValue) {
  803. setTimeout(() => {
  804. setLeaderlineMain();
  805. newPositionLine2(leaderLineMain.value);
  806. }, 300);
  807. }
  808. }
  809. );
  810. //连线===
  811. onMounted(() => {
  812. CodeImg(props.clickCodeValue);
  813. if (props.iedRelation) {
  814. tagList.value = Object.values(props.iedRelation)[0];
  815. }
  816. getData();
  817. });
  818. </script>
  819. <template>
  820. <div
  821. class="main"
  822. ref="mianItem"
  823. v-loading="loading"
  824. id="treedomCid"
  825. element-loading-text="数据加载中..."
  826. >
  827. <!-- 左侧 -->
  828. <div class="left-main" v-if="(leftI && leftI.length) || dataU">
  829. <!-- 名称 -->
  830. <div class="ied-name" id="leftMainDom">
  831. <img :src="squer" alt="" />
  832. <div v-if="tagList">{{ tagList.ied_name }}</div>
  833. </div>
  834. <!-- 各个图片数据版块 -->
  835. <div
  836. class="left-item-min"
  837. :class="{
  838. 'left-item-max':
  839. leftI.length > 5 ||
  840. dataU.length > 5 ||
  841. leftI.length + dataU.length > 5,
  842. }"
  843. ref="leftStartDom"
  844. >
  845. <!-- 左侧修改 -->
  846. <div v-if="dataU.length > 0 && cClickCode != 'scd.ied'">
  847. <div
  848. v-for="(item, index) in dataU"
  849. :key="index"
  850. class="left-item-cont"
  851. @click="
  852. clickUpTypeImgLeft(
  853. item.diff_desc,
  854. $event,
  855. item.diff_object_name,
  856. item
  857. )
  858. "
  859. :ref="(el) => setdomLeftMain(el, item.diff_object_name)"
  860. :id="item.diff_object_name.replace(/[^\w\s]/g, '')"
  861. >
  862. <div class="item-img">
  863. <img :src="codeImg" alt="" class="type-img" />
  864. <img :src="modify0" alt="" class="type-img-mini" />
  865. </div>
  866. <div class="wraps">{{ item.diff_object_name }}</div>
  867. </div>
  868. </div>
  869. <div v-else-if="cClickCode == 'scd.ied'">
  870. <div
  871. class="left-item-cont"
  872. :ref="(el) => setdomLeftMain(el, 'leftmain')"
  873. id="leftBasic"
  874. >
  875. <div class="item-img">
  876. <img :src="codeImg" alt="" class="type-img" />
  877. <img :src="modify0" alt="" class="type-img-mini" />
  878. </div>
  879. <div class="wraps">基本信息</div>
  880. </div>
  881. </div>
  882. <!-- 新增 -->
  883. <div v-show="leftI.length > 0">
  884. <div
  885. v-for="(item, index) in leftI"
  886. :key="index"
  887. class="left-item-cont"
  888. @click="clickTypeImg(item, $event)"
  889. :ref="(el) => setdomLeftMain(el, item.diff_object_name)"
  890. >
  891. <div class="item-img">
  892. <img :src="codeImg" alt="" class="type-img" />
  893. <img :src="newly0" alt="" class="type-img-mini" />
  894. </div>
  895. <div class="wraps">{{ item.diff_object_name }}</div>
  896. </div>
  897. </div>
  898. </div>
  899. <!-- 左侧新增差异名字 -->
  900. <div class="left-difference" v-if="IorDClick" ref="addDiff">
  901. <!-- key是键,value是值,循环的是对象 -->
  902. <div v-for="(value, key) in IorDClick" :key="key">
  903. <div class="type-text" :ref="(el) => setdomAddName(el, key)">
  904. {{ key }}
  905. </div>
  906. <div :ref="(el) => setdomAddValue(el, key)" class="add-type">
  907. <div class="type-text add-type-text wraps" v-if="value">
  908. {{ value }}
  909. </div>
  910. <div class="type-text add-type-text wraps" v-else>【空】</div>
  911. </div>
  912. </div>
  913. </div>
  914. </div>
  915. <div class="middle-line" ref="middleLine"></div>
  916. <!-- 右侧 -->
  917. <div class="right-main" v-if="(rightD && rightD.length) || dataU">
  918. <!-- 名称 -->
  919. <div class="ied-name" id="rightMainDom">
  920. <img :src="squer" alt="" />
  921. <div v-if="tagList">{{ tagList.ied_name }}</div>
  922. </div>
  923. <!-- 各个图片数据版块 -->
  924. <div
  925. ref="rightStartDom"
  926. class="right-item-min"
  927. :class="{
  928. 'right-item-max':
  929. rightD.length > 5 ||
  930. dataU.length > 5 ||
  931. rightD.length + dataU.length > 5,
  932. }"
  933. >
  934. <!-- 修改 -->
  935. <div v-if="dataU.length > 0 && cClickCode != 'scd.ied'">
  936. <div
  937. v-for="(item, index) in dataU"
  938. :key="index"
  939. class="left-item-cont"
  940. @click="
  941. clickUpTypeImgRight(
  942. item.diff_desc,
  943. $event,
  944. item.diff_object_name,
  945. item
  946. )
  947. "
  948. :id="item.diff_object_name.replace(/[^\w\s]/g, '')"
  949. :ref="(el) => setdomRightMain(el, item.diff_object_name)"
  950. >
  951. <div class="item-img">
  952. <img :src="codeImg" alt="" class="type-img" />
  953. <img :src="modify0" alt="" class="type-img-mini" />
  954. </div>
  955. <div class="wraps">{{ item.diff_object_name }}</div>
  956. </div>
  957. </div>
  958. <div v-else-if="cClickCode == 'scd.ied'">
  959. <div
  960. class="left-item-cont"
  961. :ref="(el) => setdomRightMain(el, 'rightmain')"
  962. id="rightBasic"
  963. >
  964. <div class="item-img">
  965. <img :src="codeImg" alt="" class="type-img" />
  966. <img :src="modify0" alt="" class="type-img-mini" />
  967. </div>
  968. <div class="wraps">基本信息</div>
  969. </div>
  970. </div>
  971. <!-- 删除 -->
  972. <div v-show="rightD.length">
  973. <div
  974. v-for="(item, index) in rightD"
  975. :key="index"
  976. class="left-item-cont"
  977. @click="clickTypeImgDel(item, $event)"
  978. :ref="(el) => setdomRightMain(el, item.diff_object_name)"
  979. >
  980. <div class="item-img">
  981. <img :src="codeImg" alt="" class="type-img" />
  982. <img :src="del0" alt="" class="type-img-mini" />
  983. </div>
  984. <div class="wraps">{{ item.diff_object_name }}</div>
  985. </div>
  986. </div>
  987. </div>
  988. <!-- 右侧删除差异名字 -->
  989. <div class="right-difference" v-if="DelClick" ref="delDiff">
  990. <!-- key是键,value是值,循环的是对象 -->
  991. <div v-for="(value, key) in DelClick" :key="key">
  992. <div :ref="(el) => setdomDelValue(el, key)" class="del-type">
  993. <div class="type-text del-type-text wraps" v-if="value">
  994. {{ value }}
  995. </div>
  996. <div class="type-text del-type-text wraps" v-else>【空】</div>
  997. </div>
  998. <div class="type-text" :ref="(el) => setdomDelName(el, key)">
  999. {{ key }}
  1000. </div>
  1001. </div>
  1002. </div>
  1003. </div>
  1004. <div
  1005. class="middle-main"
  1006. :class="{ 'middle-main-basic': cClickCode == 'scd.ied' }"
  1007. ref="middleMain"
  1008. >
  1009. <!-- 修改中间数据的名字 -->
  1010. <div v-if="cClickCode != 'scd.ied' && !isDiffdesc">
  1011. <div v-for="(value, key) in newleftDataMiddle" :key="key">
  1012. <div
  1013. v-for="(value2, key2) in newrightDataMiddle"
  1014. :key="key2"
  1015. class="middle-frame"
  1016. >
  1017. <div
  1018. v-if="key == key2"
  1019. class="middle-type-text"
  1020. :ref="(el) => setdomUPLeftName(el, key)"
  1021. >
  1022. {{ key }}
  1023. </div>
  1024. <div
  1025. v-if="key == key2"
  1026. class="middle-item"
  1027. :ref="(el) => setdomUPMiddleName(el, key)"
  1028. >
  1029. <div class="middle-left">
  1030. <div class="type-text up-type-text wraps middle-up-type-text">
  1031. <span v-if="value">{{ value }}</span>
  1032. <span v-else>【空】</span>
  1033. </div>
  1034. </div>
  1035. <img :src="jiantou" alt="" style="width: 40px" />
  1036. <div class="middle-right">
  1037. <div class="type-text up-type-text wraps middle-up-type-text">
  1038. <span v-if="value2">{{ value2 }}</span>
  1039. <span v-else>【空】</span>
  1040. </div>
  1041. </div>
  1042. </div>
  1043. <div
  1044. v-if="key == key2"
  1045. class="middle-type-text"
  1046. :ref="(el) => setdomUpRightName(el, key)"
  1047. >
  1048. {{ key2 }}
  1049. </div>
  1050. </div>
  1051. </div>
  1052. </div>
  1053. <!-- 站控层通信参数 -->
  1054. <div v-else-if="cClickCode != 'scd.ied' && isDiffdesc">
  1055. <!-- 11111CommunicationS1 -->
  1056. <div
  1057. v-for="(value, key) in CommunicationS1"
  1058. :key="key"
  1059. class="middle-frame"
  1060. >
  1061. <!-- !value.add 是修改的,否则是新增的 -->
  1062. <div
  1063. v-if="!value.add"
  1064. class="middle-type-text"
  1065. :ref="(el) => setdomUPLeftName(el, key)"
  1066. >
  1067. <!-- 左侧类型修改 -->
  1068. {{ value.Type }}
  1069. </div>
  1070. <div
  1071. v-if="value.add"
  1072. class="middle-type-text"
  1073. :ref="(el) => setdomUPLeftName(el, key)"
  1074. >
  1075. <!-- 左侧类型修改 -->
  1076. {{ value.Type }}
  1077. </div>
  1078. <!-- 类型的值 -->
  1079. <div class="middle-item" :ref="(el) => setdomUPMiddleName(el, key)" v-if="!value.add">
  1080. <div class="middle-left">
  1081. <div class="type-text up-type-text wraps middle-up-type-text">
  1082. <span v-if="value.InnerText">{{ value.InnerText }}</span>
  1083. <span v-else>【空】</span>
  1084. </div>
  1085. </div>
  1086. <img :src="jiantou" alt="" style="width: 40px" />
  1087. <div class="middle-right">
  1088. <div class="type-text up-type-text wraps middle-up-type-text">
  1089. <span v-if="value.nnerTextRight != '空'">{{
  1090. value.nnerTextRight
  1091. }}</span>
  1092. <span v-else>【空】</span>
  1093. </div>
  1094. </div>
  1095. </div>
  1096. <!-- <div
  1097. v-if="value.nnerTextRight == '空'"
  1098. class="middle-type-text"
  1099. :ref="(el) => setdomUPLeftName(el, key)"
  1100. >
  1101. 左侧类型新增的值
  1102. {{ value.InnerText }}
  1103. </div> -->
  1104. <!-- 右侧类型 -->
  1105. <div
  1106. v-if="!value.add"
  1107. class="middle-type-text"
  1108. :ref="(el) => setdomUpRightName(el, key)"
  1109. >
  1110. {{ value.Type }}
  1111. </div>
  1112. </div>
  1113. </div>
  1114. <!-- 装置信息基本信息修改 -->
  1115. <div v-else-if="mapList && mapList.length > 0 && cClickCode == 'scd.ied'">
  1116. <div v-for="(value, key) in mapList[0]" :key="key">
  1117. <div
  1118. v-for="(value2, key2) in mapList[1]"
  1119. :key="key2"
  1120. class="middle-frame"
  1121. >
  1122. <div
  1123. v-if="
  1124. key == key2 &&
  1125. key != 'lineno' &&
  1126. key != 'name' &&
  1127. key != 'node_id'
  1128. "
  1129. class="middle-type-text"
  1130. :ref="(el) => setdomUPLeftName(el, key)"
  1131. >
  1132. {{
  1133. key == "config_version"
  1134. ? "配置版本"
  1135. : key == "desc"
  1136. ? "装置描述"
  1137. : key == "manufacturer"
  1138. ? "厂商"
  1139. : "装置类型"
  1140. }}
  1141. </div>
  1142. <div
  1143. v-if="
  1144. key == key2 &&
  1145. key != 'lineno' &&
  1146. key != 'name' &&
  1147. key != 'node_id'
  1148. "
  1149. class="middle-item"
  1150. :ref="(el) => setdomUPMiddleName(el, key)"
  1151. >
  1152. <div class="middle-left">
  1153. <div class="type-text up-type-text wraps middle-up-type-text">
  1154. <span v-if="value">{{ value }}</span>
  1155. <span v-else>【空】</span>
  1156. </div>
  1157. </div>
  1158. <img :src="jiantou" alt="" style="width: 40px" />
  1159. <div class="middle-right">
  1160. <div class="type-text up-type-text wraps middle-up-type-text">
  1161. <span v-if="value2">{{ value2 }}</span>
  1162. <span v-else>【空】</span>
  1163. </div>
  1164. </div>
  1165. </div>
  1166. <div
  1167. v-if="
  1168. key == key2 &&
  1169. key != 'lineno' &&
  1170. key != 'name' &&
  1171. key != 'node_id'
  1172. "
  1173. class="middle-type-text"
  1174. :ref="(el) => setdomUpRightName(el, key)"
  1175. >
  1176. {{
  1177. key2 == "config_version"
  1178. ? "配置版本"
  1179. : key2 == "desc"
  1180. ? "装置描述"
  1181. : key2 == "manufacturer"
  1182. ? "厂商"
  1183. : "装置类型"
  1184. }}
  1185. </div>
  1186. </div>
  1187. </div>
  1188. </div>
  1189. </div>
  1190. <div id="wrapper"></div>
  1191. <div id="dilogwrapper"></div>
  1192. </div>
  1193. </template>
  1194. <style scoped lang="scss">
  1195. @mixin size {
  1196. width: 80px;
  1197. height: 80px;
  1198. }
  1199. .bigBox {
  1200. height: calc(100vh - 230px) !important;
  1201. }
  1202. .main {
  1203. height: 90%;
  1204. display: flex;
  1205. position: relative;
  1206. overflow-y: auto;
  1207. }
  1208. .ied-name {
  1209. width: 80px;
  1210. height: 110px;
  1211. text-align: center;
  1212. & > img {
  1213. @include size;
  1214. }
  1215. }
  1216. .left-main {
  1217. .ied-name {
  1218. position: absolute;
  1219. top: 50%;
  1220. transform: translateY(-100%);
  1221. left: 5%;
  1222. }
  1223. .left-item-min {
  1224. position: absolute;
  1225. top: 50%;
  1226. transform: translateY(-50%);
  1227. left: 15%;
  1228. }
  1229. .left-item-max {
  1230. position: absolute;
  1231. top: 60px;
  1232. transform: translateY(0%);
  1233. left: 15% !important;
  1234. }
  1235. }
  1236. .right-main {
  1237. .ied-name {
  1238. position: absolute;
  1239. top: 50%;
  1240. transform: translateY(-50%);
  1241. right: 5%;
  1242. }
  1243. .right-item-min {
  1244. position: absolute;
  1245. top: 50%;
  1246. transform: translateY(-50%);
  1247. right: 15%;
  1248. }
  1249. .right-item-max {
  1250. position: absolute;
  1251. top: 60px;
  1252. transform: translateY(0%);
  1253. right: 15%;
  1254. }
  1255. }
  1256. .left-item-max,
  1257. .right-item-max,
  1258. .left-item-min,
  1259. .right-item-min {
  1260. .left-item-cont {
  1261. cursor: pointer;
  1262. text-align: center;
  1263. width: 110px;
  1264. height: 120px;
  1265. & > div {
  1266. color: #255ce7;
  1267. font-size: 12px;
  1268. }
  1269. }
  1270. .type-img {
  1271. @include size;
  1272. }
  1273. .item-img {
  1274. position: relative;
  1275. .type-img-mini {
  1276. width: 20px;
  1277. height: 20px;
  1278. position: absolute;
  1279. top: 24px;
  1280. right: 21px;
  1281. }
  1282. }
  1283. }
  1284. .middle-line {
  1285. position: absolute;
  1286. left: 50%;
  1287. border: 1px solid #e0e7f0;
  1288. }
  1289. //差异项
  1290. .left-difference {
  1291. position: absolute;
  1292. left: 28%;
  1293. & > div {
  1294. display: flex;
  1295. justify-content: space-around;
  1296. align-items: center;
  1297. }
  1298. .type-text {
  1299. width: 80px;
  1300. border: 1px solid #134bea;
  1301. color: #134bea;
  1302. text-align: center;
  1303. margin-bottom: 47px;
  1304. padding: 3px;
  1305. font-size: 14px;
  1306. }
  1307. .add-type {
  1308. margin-left: 40px;
  1309. margin-bottom: 47px;
  1310. .add-type-text {
  1311. margin-bottom: 0;
  1312. border: 2px dashed #134bea;
  1313. color: #134bea;
  1314. width: 113px;
  1315. padding: 12px 8px;
  1316. }
  1317. }
  1318. .up-type-text {
  1319. border: 1px solid #ffa011;
  1320. color: #ffa011;
  1321. }
  1322. }
  1323. .middle-type-text {
  1324. border: 1px solid #ffa011;
  1325. color: #ffa011;
  1326. display: flex;
  1327. align-items: center;
  1328. justify-content: center;
  1329. margin-bottom: 45px;
  1330. width: 120px;
  1331. height: 23px;
  1332. }
  1333. .right-difference {
  1334. position: absolute;
  1335. right: 28%;
  1336. .type-text {
  1337. width: 80px;
  1338. border: 1px solid #ff0000;
  1339. color: #ff0000;
  1340. text-align: center;
  1341. margin-bottom: 47px;
  1342. padding: 3px;
  1343. font-size: 14px;
  1344. }
  1345. & > div {
  1346. display: flex;
  1347. justify-content: space-around;
  1348. align-items: center;
  1349. }
  1350. .del-type {
  1351. margin-right: 40px;
  1352. margin-bottom: 47px;
  1353. .del-type-text {
  1354. margin-bottom: 0;
  1355. border: 2px dashed #ff0000;
  1356. color: #ff0000;
  1357. width: 113px;
  1358. padding: 12px 8px;
  1359. }
  1360. }
  1361. }
  1362. .middle-up-type-text {
  1363. width: 100px;
  1364. }
  1365. // 文字换行
  1366. .wraps {
  1367. word-wrap: break-word;
  1368. }
  1369. .middle-main,
  1370. .middle-main-basic {
  1371. width: 50%;
  1372. position: absolute;
  1373. left: 50%;
  1374. transform: translateX(-50%);
  1375. .middle-frame {
  1376. display: flex;
  1377. justify-content: space-around;
  1378. align-items: center;
  1379. }
  1380. .middle-item {
  1381. border: 2px dashed #ffa011;
  1382. color: #09162c;
  1383. font-size: 13px;
  1384. // margin-bottom: 47px;
  1385. display: flex;
  1386. justify-content: center;
  1387. align-items: center;
  1388. text-align: center;
  1389. padding: 10px 10px;
  1390. margin-bottom: 45px;
  1391. }
  1392. }
  1393. .middle-main-basic {
  1394. top: 50% !important;
  1395. transform: translate(-50%, -50%);
  1396. }
  1397. </style>