InfoWindow.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <template>
  2. <div>
  3. <component
  4. :is="componentName"
  5. v-if="componentName != null && componentName != '' && componentLoadedCount > 0"
  6. :key="componentName + '-' + componentLoadedCount"
  7. ref="infoComponent"
  8. :field-value="fieldValue"
  9. :info-window="infoWindowDto"
  10. :where-clause-source="whereClauseSource"
  11. :is-search-widget="isSearchWidget"
  12. :parent-model-data="parentModelData"
  13. :model-data="modelData"
  14. :multiple="multiple"
  15. :window-no="infoWindowNo"
  16. @data-selected="dataSelected"
  17. @delete-selected="deleteSelected"
  18. />
  19. <Loading v-if="loading" />
  20. </div>
  21. </template>
  22. <script>
  23. import { defineComponent } from 'vue';
  24. import Common from '../../common/Common.js';
  25. import Notify from '../../common/Notify.js';
  26. import CssUtil from '../../common/CssUtil.js';
  27. import QueryPage from './QueryPage.vue';
  28. import Loading from '../../loading/src/Loading.vue';
  29. import ClientOrganization from '../../client-organization/src/ClientOrganization.vue';
  30. export default defineComponent({
  31. name: 'InfoWindow',
  32. components: {
  33. QueryPage,
  34. Loading,
  35. 'ClientOrganization': ClientOrganization,
  36. },
  37. props: {
  38. 'whereClauseSource': {
  39. type: Object,
  40. default(){
  41. return null;
  42. },
  43. },
  44. 'isSearchWidget': {
  45. type: Boolean,
  46. default: false,
  47. },
  48. 'parentModelData': {
  49. type: Object,
  50. default(){
  51. return null;
  52. },
  53. },
  54. 'modelData': {
  55. type: Object,
  56. default(){
  57. return null;
  58. },
  59. },
  60. 'fieldValue': {
  61. type: Object,
  62. default(){
  63. return null;
  64. },
  65. },
  66. /**
  67. * 查询窗口编号
  68. */
  69. 'infoWindowNo': {
  70. type: String,
  71. default: null,
  72. },
  73. /**
  74. * 是否多选
  75. */
  76. 'multiple': {
  77. type: Boolean,
  78. default: false,
  79. },
  80. },
  81. emits: ['dataSelected', 'valueChanged', 'deleteSelected'],
  82. data: function () {
  83. return {
  84. infoWindowDto: {},
  85. componentName: '', // 显示部件名称
  86. loading: false,
  87. componentLoadedCount: 0, // 异步组件加载成功的数量
  88. };
  89. },
  90. watch: {
  91. 'infoWindowNo': {
  92. handler: function (newValue, oldValue) {
  93. let _self = this;
  94. if (newValue != oldValue) {
  95. this.$nextTick(function () {
  96. _self.loadData();
  97. });
  98. }
  99. },
  100. immediate: true,
  101. },
  102. },
  103. mounted: function () {
  104. },
  105. methods: {
  106. /**
  107. * 加载数据
  108. */
  109. loadData: function () {
  110. if (this.infoWindowNo == null || this.infoWindowNo.length == 0) {
  111. return;
  112. }
  113. var _self = this;
  114. _self.loading = true;
  115. $.ajax({
  116. url: Common.getApiURL('InfoWindowResource/uniqueByNo'),
  117. type: 'GET',
  118. dataType: 'json',
  119. data: { 'infoWindowNo': _self.infoWindowNo },
  120. beforeSend: function (request) {
  121. Common.addTokenToRequest(request);
  122. },
  123. success: function (data) {
  124. _self.loading = false;
  125. console.log(data);
  126. _self.infoWindowDto = data;
  127. // 计算显示的部件
  128. if (_self.infoWindowDto.componentName != undefined && _self.infoWindowDto.componentName != '') {
  129. _self.componentName = _self.infoWindowDto.componentName;
  130. _self.dynamicInit();
  131. } else if (_self.infoWindowDto.infoWindowType == undefined || _self.infoWindowDto.infoWindowType == 'TableGrid'
  132. || _self.infoWindowDto.infoWindowType == 'NONE') {
  133. _self.componentName = 'QueryPage';
  134. }
  135. if(_self.componentName === 'QueryPage' || _self.componentName === 'ClientOrganization'){
  136. _self.componentLoadedCount ++;
  137. }
  138. _self.$nextTick(function () {
  139. if (_self.infoWindowDto.componentName == undefined || _self.infoWindowDto.componentName == '') {
  140. if (_self.infoWindowDto.infoWindowType == undefined || _self.infoWindowDto.infoWindowType == 'TableGrid' || _self.infoWindowDto.infoWindowType == 'NONE') {
  141. _self.$refs.infoComponent.initWidget(data);
  142. } else {
  143. _self.$refs.infoComponent.initWidget(data);
  144. }
  145. }
  146. });
  147. },
  148. error: function (XMLHttpRequest, textStatus, errorThrown) {
  149. _self.loading = false;
  150. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  151. },
  152. });
  153. },
  154. /**
  155. * 动态初始化仪表盘
  156. */
  157. dynamicInit: function () {
  158. let _self = this;
  159. const componentName = _self.infoWindowDto.componentName;
  160. const cssUrl = _self.infoWindowDto.cssUrl;
  161. if(cssUrl != null && cssUrl != undefined){
  162. CssUtil.dynamicLoadCss(cssUrl, componentName);
  163. }
  164. const jsUrl = _self.infoWindowDto.jsUrl;
  165. if(jsUrl != null && jsUrl != undefined){
  166. let promise = new Promise((resolve, reject) => {
  167. import(/* webpackIgnore: true */ jsUrl).then(remoteComponent => {
  168. resolve(remoteComponent);
  169. }).catch(error => {
  170. reject(error);
  171. });
  172. });
  173. promise.then(remoteComponent => {
  174. console.log('remoteComponent:' + remoteComponent.default.name);
  175. if(componentName !== remoteComponent.default.name){
  176. let errorMessage = '数据字典-查询窗口自定义组件部件名称定义的是' + componentName + ',但是程序中name定义的是' + remoteComponent.default.name + ',两者必须相同。';
  177. console.error(errorMessage);
  178. Notify.error('查询窗口自定义组件定义错误', errorMessage, false);
  179. }
  180. window.app.component(componentName, remoteComponent.default);
  181. _self.componentLoadedCount ++;
  182. }, errorData => {
  183. console.error(errorData);
  184. });
  185. }
  186. },
  187. /**
  188. * 数据选择事件
  189. */
  190. dataSelected: function (data) {
  191. this.$emit('dataSelected', data);
  192. },
  193. valueChanged: function (fieldValue) {
  194. this.$emit('valueChanged', fieldValue);
  195. },
  196. /**
  197. * 数据删除事件
  198. */
  199. deleteSelected: function (data) {
  200. this.$emit('deleteSelected', data);
  201. },
  202. /**
  203. * 获取选择的数据
  204. */
  205. getSelectedModelDatas: function (data) {
  206. var _self = this;
  207. return _self.$refs.infoComponent.getSelectedModelDatas();
  208. },
  209. refresh: function () {
  210. var _self = this;
  211. if (_self.$refs.infoComponent != undefined) {
  212. if (_self.componentName == 'QueryPage') {
  213. _self.$refs.infoComponent.pageSearch();
  214. } else if (_self.componentName == 'ClientOrganization') {
  215. _self.$refs.infoComponent.refresh();
  216. }
  217. }
  218. },
  219. },
  220. });
  221. </script>