Gsix.vue 49 KB

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