VersionComparison.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. <template>
  2. <a-layout id="VersionPage">
  3. <div class="version-top">
  4. <div>
  5. <span>图层选择:</span>
  6. <span class="version-text">{{oldVersion}}</span>
  7. <span class="version-tree">
  8. <a-tree-select style="width: 100%" :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" placeholder="请选择楼层" :tree-data="treeDataOld" :replaceFields="{
  9. children:'children',
  10. label:'name',
  11. value: 'glid',
  12. key: 'glid'
  13. }" @change="LayerOldSelection" v-model="layerOldSelectionValue">
  14. <!-- <template #title="{ value: val, title }">
  15. <b v-if="val === 'parent 1-1'" style="color: #08c">sss</b>
  16. <template v-else>{{ title }}</template>
  17. </template> -->
  18. </a-tree-select>
  19. </span>
  20. <span class="version-text">{{newVersion}}</span>
  21. <span class="version-tree">
  22. <a-tree-select style="width: 100%" :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" placeholder="请选择楼层" :tree-data="treeDataNew" :replaceFields="{
  23. children:'children',
  24. label:'name',
  25. value: 'glid',
  26. key: 'glid'
  27. }" @change="LayerNewSelection" v-model="layerNewSelectionValue">
  28. <!-- <template #title="{ value: val, title }">
  29. <b v-if="val === 'parent 1-1'" style="color: #08c">sss</b>
  30. <template v-else>{{ title }}</template>
  31. </template> -->
  32. </a-tree-select>
  33. </span>
  34. <a-button type="primary" @click="StartComparison" :loading="openComparison">开始对比</a-button>
  35. </div>
  36. <div>
  37. <a-switch v-model="modelLinkage" checked-children="模型联动" un-checked-children="模型联动" />
  38. </div>
  39. </div>
  40. <a-layout-content>
  41. <div class="version-list">
  42. <a-radio-group v-model="versionType" button-style="solid" @change="VersionStateChange">
  43. <a-radio-button value="new">版本新增</a-radio-button>
  44. <a-radio-button value="revise">版本修改</a-radio-button>
  45. <a-radio-button value="delete">版本去除</a-radio-button>
  46. </a-radio-group>
  47. <div class="version-table">
  48. <a-table v-if="versionType == 'new'" size="middle" :bordered="false" :columns="columns" :data-source="newlyAdded" :scroll="{ y: 'calc(100vh - 320px)' }" :pagination="false" :rowSelection="{ selectedRowKeys:selectedVersionNewlyKeys, onChange:handleVersionNewlyChange, columnTitle: '选择',hideSelectAll: true }">
  49. <span slot="newlySerial" slot-scope="text, record, index">{{ index + 1 }}</span>
  50. <span slot="versionName" slot-scope="text, record" @click="ComponentIdClick(record)">{{record.id}}</span>
  51. </a-table>
  52. <a-table v-else-if="versionType == 'revise'" size="middle" :bordered="false" :columns="columns" :data-source="modifyAdded" :scroll="{ y: 'calc(100vh - 320px)' }" :pagination="false" :rowSelection="{ selectedRowKeys:selectedVersionModifyKeys, onChange:handleVersionModifyChange,columnTitle: '选择', hideSelectAll: true }">
  53. <span slot="newlySerial" slot-scope="text, record, index">{{ index + 1 }}</span>
  54. <span slot="versionName" slot-scope="text, record" @click="ComponentIdClick(record)">{{record.id}}</span>
  55. </a-table>
  56. <a-table v-else-if="versionType == 'delete'" size="middle" :bordered="false" :columns="columns" :data-source="deleteAdded" :scroll="{ y: 'calc(100vh - 320px)' }" :pagination="false" :rowSelection="{ selectedRowKeys:selectedVersionDeleteKeys, onChange:handleVersionDeleteChange, columnTitle: '选择',hideSelectAll: true }">
  57. <span slot="newlySerial" slot-scope="text, record, index">{{ index + 1 }}</span>
  58. <span slot="versionName" slot-scope="text, record" @click="ComponentIdClick(record)">{{record.id}}</span>
  59. </a-table>
  60. </div>
  61. <div class="save-btn">
  62. <a-button type="primary" @click="SaveProblem">保存问题</a-button>
  63. </div>
  64. </div>
  65. <div id="cesiumContainer_1">
  66. <div class="page-version">版本:{{oldVersion}}</div>
  67. </div>
  68. <div id="cesiumContainer_2">
  69. <div class="page-version">版本:{{newVersion}}</div>
  70. </div>
  71. </a-layout-content>
  72. </a-layout>
  73. </template>
  74. <script>
  75. import Vue from 'vue'
  76. import { mapGetters } from 'vuex'
  77. import { getPartTreeList, getModelVersion, getModelVersionData, setModelVersionData } from '@/api/model'
  78. export default {
  79. name: 'Version',
  80. computed: {
  81. ...mapGetters(['currProject']),
  82. },
  83. props: {
  84. versionId: {
  85. type: String
  86. }
  87. },
  88. data () {
  89. return {
  90. projectMessage: {},
  91. versionType: 'new',
  92. newlyAdded: [],
  93. modifyAdded: [],
  94. deleteAdded: [],
  95. pagination: {
  96. current: 0,
  97. total: 0,
  98. skipCount: 0,
  99. pageSize: 10, //每页中显示10条数据
  100. showTotal: (total) => `共 ${total} 条`, //分页中显示总的数据
  101. },
  102. columns: [
  103. {
  104. title: '序号',
  105. align: 'center',
  106. scopedSlots: { customRender: 'newlySerial' },
  107. },
  108. {
  109. title: '名称',
  110. dataIndex: 'name',
  111. key: 'name',
  112. align: 'center',
  113. scopedSlots: { customRender: 'versionName' },
  114. },
  115. ],
  116. selectedVersionNewlyKeys: [],
  117. selectedVersionNewlyLists: [],
  118. selectedVersionModifyKeys: [],
  119. selectedVersionModifyLists: [],
  120. selectedVersionDeleteKeys: [],
  121. selectedVersionDeleteLists: [],
  122. treeDataNew: [],
  123. treeDataOld: [],
  124. oldVersion: '',
  125. newVersion: '',
  126. modelLinkage: true,
  127. versionList: [],
  128. layerNewSelectionValue: '',
  129. layerOldSelectionValue: '',
  130. listHeight: 'calc(100vh - 320px)',
  131. lastFeatureId: '',
  132. openComparison: false
  133. }
  134. },
  135. async mounted () {
  136. const that = this
  137. await getModelVersion(that.versionId).then((res) => {
  138. that.versionList = [res.sourceDocVer, res.destinationDocVer]
  139. that.GetTreeFloor(that.versionList[0].modelName, ['0'], 'old')
  140. that.GetTreeFloor(that.versionList[1].modelName, ['0'], 'new')
  141. })
  142. that.$nextTick(() => {
  143. //初始化模型加载
  144. const defaults = { ...that.$store.state.bim.defaults }
  145. defaults.container = 'cesiumContainer_1'
  146. window.$api_1 = new API(defaults)
  147. defaults.container = 'cesiumContainer_2'
  148. window.$api_2 = new API(defaults)
  149. for (let i = 0; i < that.versionList.length; i++) {
  150. i == 0 ? that.oldVersion = that.versionList[i].docVer : that.newVersion = that.versionList[i].docVer
  151. that.AddModel({
  152. name: that.versionList[i].modelName,
  153. id: that.versionList[i].id,
  154. }, i == 0 ? 'old' : 'new') //初始加载模型
  155. }
  156. })
  157. },
  158. methods: {
  159. GetTreeFloor (modelName, data, type) {
  160. getPartTreeList({ modelName: modelName }, data).then((res) => {
  161. if (data[0] == '0') {
  162. let gilds = []
  163. for (let i = 0; i < res.length; i++) {
  164. gilds.push(res[i].glid)
  165. }
  166. this.GetTreeFloor(modelName, gilds, type)
  167. } else {
  168. type == 'old' ? this.treeDataOld = res : this.treeDataNew = res
  169. }
  170. });
  171. },
  172. AddModel (data, type) {
  173. //加载模型
  174. const that = this
  175. var url = `${that.$store.getters.modelUrl}/tools/output/model/${data.name}/root.glt`
  176. if (data.suffix === '.osgb') {
  177. url = `${that.$store.getters.modelUrl}/tools/output/model/${data.name}/tileset.json`
  178. }
  179. if (type == 'old') {
  180. window.$api_1.Model.AddModel(
  181. url,
  182. data.id,
  183. null,
  184. (res) => { },
  185. {
  186. flyto: true,
  187. osgbEdit: true,
  188. }
  189. )
  190. } else {
  191. window.$api_2.Model.AddModel(
  192. url,
  193. data.id,
  194. null,
  195. (res) => {
  196. },
  197. {
  198. flyto: true,
  199. osgbEdit: true,
  200. }
  201. )
  202. }
  203. },
  204. handleVersionNewlyChange (selectedRowKeys, selectedRows) {
  205. this.selectedVersionNewlyKeys = selectedRowKeys
  206. this.selectedVersionNewlyLists = selectedRows
  207. },
  208. handleVersionModifyChange (selectedRowKeys, selectedRows) {
  209. this.selectedVersionModifyKeys = selectedRowKeys
  210. this.selectedVersionModifyLists = selectedRows
  211. },
  212. handleVersionDeleteChange (selectedRowKeys, selectedRows) {
  213. this.selectedVersionDeleteKeys = selectedRowKeys
  214. this.selectedVersionDeleteLists = selectedRows
  215. },
  216. VersionStateChange (e) {
  217. this.clearPage();
  218. },
  219. ComponentIdClick (val) {
  220. this.lastFeatureId = val.id;
  221. let index_1 = window.$api_1.Feature.zoomTo(this.versionList[0].id + "^" + val.id, this.versionList[0].id, true, 1);
  222. let index_2 = window.$api_2.Feature.zoomTo(this.versionList[1].id + "^" + val.id, this.versionList[1].id, true, 1);
  223. setTimeout(() => {
  224. if (this.modelLinkage) {
  225. if (index_1 == -1 && index_2 != -1) {
  226. let visualAngle = window.$api_2.Camera.getViewPort()
  227. window.$api_1.Camera.setViewPort(visualAngle.position, visualAngle.heading, visualAngle.pitch);
  228. } else if (index_2 == -1 && index_1 != -1) {
  229. let visualAngle = window.$api_1.Camera.getViewPort()
  230. window.$api_2.Camera.setViewPort(visualAngle.position, visualAngle.heading, visualAngle.pitch);
  231. }
  232. }
  233. }, 500)
  234. },
  235. LayerOldSelection (value, label, extra) {
  236. this.layerNewSelectionValue = ''
  237. if (extra.triggerNode.dataRef.level == 1) {
  238. let item = this.getChidlren(extra.triggerNode.$parent._props.dataRef.name, this.treeDataNew, extra.triggerNode.dataRef.name)
  239. if (item) {
  240. this.layerNewSelectionValue = item.glid
  241. }
  242. } else {
  243. for (let i = 0; i < this.treeDataNew.length; i++) {
  244. if (this.treeDataNew[i].name == extra.triggerNode.dataRef.name) {
  245. this.layerNewSelectionValue = this.treeDataNew[i].glid
  246. }
  247. }
  248. }
  249. },
  250. LayerNewSelection (value, label, extra) {
  251. this.layerOldSelectionValue = ''
  252. if (extra.triggerNode.dataRef.level == 1) {
  253. let item = this.getChidlren(extra.triggerNode.$parent._props.dataRef.name, this.treeDataOld, extra.triggerNode.dataRef.name)
  254. if (item) {
  255. this.layerOldSelectionValue = item.glid
  256. }
  257. } else {
  258. for (let i = 0; i < this.treeDataOld.length; i++) {
  259. if (this.treeDataOld[i].name == extra.triggerNode.dataRef.name) {
  260. this.layerOldSelectionValue = this.treeDataOld[i].glid
  261. }
  262. }
  263. }
  264. },
  265. StartComparison () {
  266. if (this.layerNewSelectionValue == "" && this.layerOldSelectionValue == "") {
  267. this.$message.warning('请先选择楼层数据再进行对比!')
  268. return false
  269. }
  270. this.openComparison = true;
  271. window.$api_1.Feature.original(this.versionList[0].id + "^" + this.lastFeatureId)
  272. window.$api_1.Public.clearBOX23line();
  273. window.$api_2.Feature.original(this.versionList[1].id + "^" + this.lastFeatureId)
  274. window.$api_2.Public.clearBOX23line();
  275. this.lastFeatureId = ''
  276. this.versionType = 'new'
  277. this.clearPage()
  278. getModelVersionData(
  279. this.versionId,
  280. {
  281. glid: this.layerOldSelectionValue,
  282. newglid: this.layerNewSelectionValue
  283. }
  284. ).then((res) => {
  285. this.openComparison = false;
  286. this.PartModel('old', this.versionList[0], res.sourceMetadata.externalIdList.join("#"));
  287. this.PartModel('new', this.versionList[1], res.destinationMetadata.externalIdList.join("#"));
  288. for (let i = 0; i < res.addMetadata.externalIdList.length; i++) {
  289. res.addMetadata.externalIdList[i] = { id: res.addMetadata.externalIdList[i] }
  290. }
  291. this.newlyAdded = res.addMetadata.externalIdList;
  292. for (let i = 0; i < res.updateMetadata.externalIdList.length; i++) {
  293. res.updateMetadata.externalIdList[i] = { id: res.updateMetadata.externalIdList[i] }
  294. }
  295. this.modifyAdded = res.updateMetadata.externalIdList;
  296. for (let i = 0; i < res.deleteMetadata.externalIdList.length; i++) {
  297. res.deleteMetadata.externalIdList[i] = { id: res.deleteMetadata.externalIdList[i] }
  298. }
  299. this.deleteAdded = res.deleteMetadata.externalIdList;
  300. })
  301. },
  302. PartModel (type, item, data) {
  303. const that = this
  304. var url = `${that.$store.getters.modelUrl}/tools/output/model/${item.name}/root.glt`
  305. if (data.suffix === '.osgb') {
  306. url = `${that.$store.getters.modelUrl}/tools/output/model/${item.name}/tileset.json`
  307. }
  308. if (type == 'old') {
  309. window.$api_1.Model.addPart(url, item.id, data);
  310. if (that.modelLinkage) {
  311. window.$api_1.Model.location(item.id);
  312. }
  313. } else {
  314. window.$api_2.Model.addPart(url, item.id, data);
  315. if (that.modelLinkage) {
  316. window.$api_2.Model.location(item.id);
  317. }
  318. }
  319. },
  320. getChidlren (parentname, data, name) {
  321. var hasFound = false, // 表示是否有找到id值
  322. result = null;
  323. var fn = function(data) {
  324. if (Array.isArray(data) && !hasFound) { // 判断是否是数组并且没有的情况下,
  325. data.forEach(item => {
  326. if (item.name === parentname) { // 数据循环每个子项,并且判断子项下边是否有id值
  327. for (let i = 0; i < item.children.length; i++) {
  328. if (item.children[i].name == name) {
  329. result = item.children[i]; // 返回的结果等于每一项
  330. hasFound = true; // 并且找到id值
  331. }
  332. }
  333. } else if (item.children) {
  334. fn(item.children); // 递归调用下边的子项
  335. }
  336. })
  337. }
  338. }
  339. fn(data); // 调用一下
  340. return result;
  341. },
  342. SaveProblem () {
  343. const that = this;
  344. that.$confirm({
  345. title: '确认修改?',
  346. content: '提交后' + (that.versionType == 'new' ? "版本新增" : that.versionType == 'revise' ? '版本修改' : '版本去除') + '内容将发生改变',
  347. onOk () {
  348. let type = that.versionType == 'new' ? 1 : that.versionType == 'revise' ? 2 : 3
  349. let list = that.versionType == 'new' ? that.selectedVersionNewlyLists : that.versionType == 'revise' ? that.selectedVersionModifyLists : that.selectedVersionDeleteLists
  350. let externalIdList = []
  351. list.forEach(item => {
  352. externalIdList.push(item.id)
  353. })
  354. setModelVersionData(that.versionId, {
  355. "method": type
  356. }, {
  357. "guid": that.layerOldSelectionValue + "#" + that.layerNewSelectionValue,
  358. "externalIdList": externalIdList
  359. }).then((res) => {
  360. if (res) {
  361. that.versionType == 'new' ? that.newlyAdded = that.selectedVersionNewlyLists : that.versionType == 'revise' ? that.modifyAdded = that.selectedVersionModifyLists : that.deleteAdded = that.selectedVersionDeleteLists
  362. that.selectedVersionNewlyKeys = []
  363. that.selectedVersionModifyKeys = []
  364. that.selectedVersionDeleteKeys = []
  365. }
  366. })
  367. },
  368. onCancel () {
  369. },
  370. class: 'test',
  371. });
  372. },
  373. clearPage () {
  374. this.selectedVersionNewlyKeys = []
  375. this.selectedVersionModifyKeys = []
  376. this.selectedVersionDeleteKeys = []
  377. this.selectedVersionNewlyLists = [];
  378. this.selectedVersionModifyLists = [];
  379. this.selectedVersionModifyLists = [];
  380. }
  381. }
  382. }
  383. </script>
  384. <style lang="less" scoped>
  385. #VersionPage {
  386. position: relative;
  387. height: calc(100vh - 112px);
  388. > .ant-layout-content {
  389. display: flex;
  390. #cesiumContainer_1 {
  391. border-right: 1px dashed #bbbdbf;
  392. position: relative;
  393. }
  394. #cesiumContainer_2 {
  395. position: relative;
  396. }
  397. .page-version {
  398. position: absolute;
  399. top: 6px;
  400. left: 10px;
  401. z-index: 99;
  402. color: rgba(0, 0, 0, 0.65);
  403. }
  404. .version-list {
  405. width: 220px;
  406. height: 100%;
  407. .ant-radio-group {
  408. width: 100%;
  409. text-align: center;
  410. margin: 10px 0;
  411. .ant-radio-button-wrapper {
  412. padding: 0 6px;
  413. height: 28px;
  414. line-height: 26px;
  415. }
  416. .ant-radio-button-wrapper:first-child {
  417. border-top-left-radius: 15px;
  418. border-bottom-left-radius: 15px;
  419. }
  420. .ant-radio-button-wrapper:last-child {
  421. border-top-right-radius: 15px;
  422. border-bottom-right-radius: 15px;
  423. }
  424. }
  425. .save-btn {
  426. text-align: center;
  427. margin: 10px;
  428. }
  429. .version-table {
  430. /deep/.ant-table-middle > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th {
  431. padding: 8px;
  432. }
  433. /deep/.ant-table-row {
  434. cursor: pointer;
  435. }
  436. }
  437. }
  438. > div:not(:first-child) {
  439. width: calc((100% - 220px) / 2);
  440. }
  441. }
  442. .version-top {
  443. display: flex;
  444. justify-content: space-between;
  445. padding: 5px 10px;
  446. align-items: center;
  447. border-bottom: 1px solid #bbbdbf;
  448. > div:first-child {
  449. display: flex;
  450. align-items: center;
  451. .version-text {
  452. margin: 0 6px;
  453. }
  454. .version-tree {
  455. width: 250px;
  456. }
  457. button {
  458. margin: 0 10px;
  459. }
  460. }
  461. }
  462. // 滚动条背景颜色
  463. /deep/.ant-table-body::-webkit-scrollbar,
  464. .info::-webkit-scrollbar {
  465. height: 9px;
  466. width: 3px;
  467. background-color: #f0f2f5;
  468. }
  469. // 滚动条颜色
  470. /deep/.ant-table-body::-webkit-scrollbar-thumb,
  471. .info::-webkit-scrollbar-thumb {
  472. border-radius: 9px;
  473. background-color: #05a081;
  474. }
  475. }
  476. </style>