Gsix.vue 49 KB

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