| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580 |
- <template>
- <div class="button_list">
- <div v-if="leftTabButton.length === 0" />
- <a-breadcrumb v-if="leftTabButton && leftTabButton.length" separator="|">
- <a-breadcrumb-item v-for="(item, index) in leftTabButton" :key="index">
- <a-button
- v-if="item.action === 'CREATE'"
- :icon="h(PlusSquareTwoTone)"
- @click="create"
- >
- {{ item.name }}
- </a-button>
- <a-button v-else-if="item.action === 'EDIT'" :icon="h(EditTwoTone)">
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'DELETE'"
- :icon="h(DeleteTwoTone)"
- @click="deleteData"
- >
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'RUN_PROCESS_REPORT'"
- :icon="h(ControlTwoTone)"
- >
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'OPEN_CUSTOMER_WINDOW'"
- :icon="h(BookTwoTone)"
- >
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'OPEN_HTML_WINDOW'"
- :icon="h(ContainerTwoTone)"
- >
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'EXPORT'"
- :icon="h(FileTextTwoTone)"
- @click="exportConfirm"
- >
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'REFRESH'"
- :icon="h(ReloadOutlined)"
- @click="refresh"
- >
- {{ item.name }}
- </a-button>
- <a-button v-else-if="item.action === 'NOTICE'" :icon="h(BellTwoTone)">
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'OPEN_REMOTE_COMPONENT_MODULE_IN_MODAL'"
- :icon="h(HddOutlined)"
- @click="openRemoteComponentModule(item)"
- >
- {{ item.name }}
- </a-button>
- <a-button v-else :icon="h(LayoutTwoTone)">{{ item.name }}</a-button>
- </a-breadcrumb-item>
- <!-- <a-breadcrumb-item>
- <GridColumnDef
- :window-no="windowNo"
- :tab-index="tabIndex"
- :tab-grid-fields="tabGridFields"
- @property-changed="propertyChanged($event)"
- />
- </a-breadcrumb-item> -->
- </a-breadcrumb>
- <a-breadcrumb separator="|">
- <a-breadcrumb-item v-for="(item, index) in rightTabButton" :key="index">
- <a-button
- v-if="item.action === 'CREATE'"
- :icon="h(PlusSquareTwoTone)"
- @click="create"
- >
- {{ item.name }}
- </a-button>
- <a-button v-else-if="item.action === 'EDIT'" :icon="h(EditTwoTone)">
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'DELETE'"
- :icon="h(DeleteTwoTone)"
- @click="deleteData"
- >
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'RUN_PROCESS_REPORT'"
- :icon="h(ControlTwoTone)"
- >
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'OPEN_CUSTOMER_WINDOW'"
- :icon="h(BookTwoTone)"
- >
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'OPEN_HTML_WINDOW'"
- :icon="h(ContainerTwoTone)"
- >
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'EXPORT'"
- :icon="h(FileTextTwoTone)"
- @click="exportConfirm"
- >
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'REFRESH'"
- :icon="h(ReloadOutlined)"
- @click="refresh"
- >
- {{ item.name }}
- </a-button>
- <a-button v-else-if="item.action === 'NOTICE'" :icon="h(BellTwoTone)">
- {{ item.name }}
- </a-button>
- <a-button
- v-else-if="item.action === 'OPEN_REMOTE_COMPONENT_MODULE_IN_MODAL'"
- :icon="h(HddOutlined)"
- @click="openRemoteComponentModule(item)"
- >
- {{ item.name }}
- </a-button>
- <a-button v-else :icon="h(LayoutTwoTone)">{{ item.name }}</a-button>
- </a-breadcrumb-item>
- </a-breadcrumb>
- </div>
- <Modal
- v-model:show="notificationModal"
- :show-canel-button="false"
- :show-ok-button="false"
- >
- <template #header>
- {{ $t("lang.tabButton.sendNotice") }}
- </template>
- <NotificationPanel ref="notificationPanel" />
- <template #footer>
- <button type="button" class="btn btn-default" @click="sendNotification">
- {{ $t("lang.tabButton.send") }}
- </button>
- <button type="button" class="btn btn-default" @click="cancelNotification">
- {{ $t("lang.tabButton.cancel") }}
- </button>
- </template>
- </Modal>
- <!-- <a-modal v-model:open="modal1Open"> -->
- <component :is="modal1Component" v-model:open="modal1Open" />
- <!-- </a-modal> -->
- </template>
- <script setup>
- import {
- ref,
- defineProps,
- defineEmits,
- watch,
- getCurrentInstance,
- defineAsyncComponent,
- h,
- } from 'vue';
- import Common from '../../common/Common';
- import DownloadService from '../../resource/file/DownloadService.js';
- import NotificationPanel from '../../customer/NotificationPanel.vue';
- import dayjs from 'dayjs';
- import GridColumnDefUtil from '../tabGridView/GridColumnDef.js';
- import GridColumnDef from '../tabGridView/GridColumnDef.vue';
- import { Spin as ASpin, Empty as AEmpty } from 'ant-design-vue';
- import { CssUtil } from 'pc-component-v3';
- import {
- PlusSquareTwoTone,
- DeleteTwoTone,
- EditTwoTone,
- BookTwoTone,
- BellTwoTone,
- HddOutlined,
- FileTextTwoTone,
- ContainerTwoTone,
- ControlTwoTone,
- ReloadOutlined,
- LayoutTwoTone,
- } from '@ant-design/icons-vue';
- const props = defineProps({
- window: {
- type: Object,
- default: () => ({}),
- },
- nowTab: {
- type: String,
- default: '',
- },
- curdWindowFunctionAccess: {
- type: Object,
- default: function () {
- return null;
- },
- },
- modelDatas: {
- type: Object,
- default: function () {
- return null;
- },
- },
- showTabDto: {
- type: Object,
- default: function () {
- return null;
- },
- },
- simpleFilterParams: {
- type: String,
- default: null,
- },
- complexFilterParams: {
- type: Array,
- default: () => {
- return [];
- },
- },
- viewType: {
- type: String,
- default: null,
- },
- uuid: {
- type: String,
- default: null,
- },
- });
- const emit = defineEmits([
- 'createRecordInWindowEdit',
- 'deleteRecords',
- 'refreshDatas',
- 'judgeIsHaveButtons',
- ]);
- const tabButtons = ref([]);
- const leftTabButton = ref([]);
- const rightTabButton = ref([]);
- const notificationModal = ref(false);
- const notificationPanel = ref(null);
- // 模态框的打开状态
- const modal1Open = ref(false);
- // 模态框的组件
- const modal1Component = ref(null);
- const { proxy } = getCurrentInstance(); //访问this
- // 新建数据
- const create = () => {
- emit('createRecordInWindowEdit');
- };
- // 删除数据
- const deleteData = () => {
- emit('deleteRecords');
- };
- // 刷新
- const refresh = () => {
- emit('refreshDatas', false);
- };
- const closeModal = () => {
- modal1Open.value = false;
- };
- /**
- * 导出确认
- */
- const exportConfirm = () => {
- if (
- props.curdWindowFunctionAccess.canExport != null &&
- props.curdWindowFunctionAccess.canExport === true
- ) {
- BootstrapDialog.show({
- title: proxy.$t('lang.TabButton.dataExport'), //title
- message: proxy.$t('lang.TabButton.DataExport'),
- buttons: [
- {
- label: proxy.$t('lang.TabButton.exportMasterTableData'),
- action: function (dialog) {
- exportData(false);
- dialog.close();
- },
- },
- {
- label: proxy.$t('lang.TabButton.exportAllData'),
- action: function (dialog) {
- exportData(true);
- dialog.close();
- },
- },
- {
- label: proxy.$t('lang.TabButton.cancel'),
- action: function (dialog) {
- dialog.close();
- },
- },
- ],
- });
- } else {
- Notify.error(
- proxy.$t('lang.tabButton.describe4'),
- proxy.$t('lang.tabButton.describe5'),
- false,
- );
- }
- };
- const exportData = exportSubTabData => {
- var token = localStorage.getItem('#token');
- var windowNo = props.window.no;
- var recordId = null;
- if (props.modelDatas != undefined) {
- recordId = props.modelDatas.id;
- }
- var obj = {
- windowNo: windowNo,
- tabIndex: props.showTabDto.tabIndex,
- recordId: recordId,
- token: token,
- simpleFilterCondition: props.simpleFilterParams,
- filterParams: props.complexFilterParams,
- };
- let url = null;
- if (recordId == null) {
- url = Common.getApiURL('exportResource/exportWindowData');
- } else {
- url = Common.getApiURL('exportResource/exportSingleWindowData');
- }
- url += '?exportSubTabData=' + exportSubTabData;
- let formParameterName = 'exportQueryParamStr';
- let formParameterValue = JSON.stringify(obj);
- var data = formParameterName + '=' + formParameterValue;
- var timeStr = dayjs().format('_YYYYMMDD_hhmmss');
- var fileName =
- props.showTabDto == null
- ? '导出数据' + timeStr + '.xlsx'
- : props.showTabDto.name + timeStr + '.xlsx';
- DownloadService.postDownloadFile(url, data, fileName);
- };
- // 发送通知
- const sendNotification = () => {
- var notification = notificationPanel.value.getNotification();
- var recordIds = [];
- if (props.viewType == 'Grid') {
- if (props.modelDatas && props.modelDatas.length > 0) {
- props.modelDatas.forEach(function (item) {
- if (item.select) {
- recordIds.push(item.id);
- }
- });
- }
- }
- if (recordIds.length == 0) {
- Notify.error(
- proxy.$t('lang.Notify.error'),
- proxy.$t('lang.tabButton.describe7'),
- true,
- );
- return;
- }
- if (notification.userIds == null || notification.userIds.length == 0) {
- Notify.error(
- proxy.$t('lang.Notify.error'),
- proxy.$t('lang.tabButton.describe8'),
- true,
- );
- return;
- }
- if (notification.theme == null || notification.theme.trim() == '') {
- Notify.error(
- proxy.$t('lang.Notify.error'),
- proxy.$t('lang.tabButton.describe9'),
- true,
- );
- return;
- }
- if (notification.content == null || notification.content.trim() == '') {
- Notify.error(
- proxy.$t('lang.Notify.error'),
- proxy.$t('lang.tabButton.describe10'),
- true,
- );
- return;
- }
- var windowNo = props.window.no;
- var tabIndex = props.showTabDto.tabIndex;
- notification.windowNo = windowNo;
- notification.tabIndex = tabIndex;
- notification.recordIds = recordIds;
- notification.className = props.showTabDto.className;
- $.ajax({
- url: Common.getApiURL('notificationResource/send'),
- type: 'post',
- beforeSend: function (request) {
- Common.addTokenToRequest(request);
- },
- contentType: 'application/json',
- data: JSON.stringify(notification),
- success: function (data) {
- notificationModal.value = false;
- Notify.success(
- proxy.$t('lang.tabButton.describe11'),
- proxy.$t('lang.tabButton.describe12'),
- true,
- );
- },
- error: function (XMLHttpRequest, textStatus, errorThrown) {
- Common.processException(XMLHttpRequest, textStatus, errorThrown);
- },
- });
- };
- // 取消发送
- const cancelNotification = () => {
- notificationModal.value = false;
- };
- // 获取表头按钮分组值,如果没有分组则使用页签按钮
- watch(
- () => props.window,
- newVal => {
- if (newVal.tabs && newVal.tabs.length) {
- const mapTabButtonDtos = JSON.parse(
- JSON.stringify(newVal.tabs[0].tabGridView.mapTabButtonDtos),
- );
- if (isEmpty(mapTabButtonDtos)) {
- tabButtons.value = newVal.tabs[0].tabGridView.tabButtons;
- tabButtonsHandler();
- } else {
- tabButtons.value = newVal.tabs[0].tabGridView.mapTabButtonDtos;
- }
- }
- },
- { deep: true, immediate: true },
- );
- watch(
- () => props.nowTab,
- (newVal, oldVal) => {
- if (newVal !== oldVal) {
- let nowTabButtons;
- if (tabButtons.value) {
- for (let key in tabButtons.value) {
- if (key === newVal) {
- nowTabButtons = tabButtons.value[key];
- tabButtonsHandler(nowTabButtons);
- }
- }
- }
- }
- },
- { deep: true, immediate: true },
- );
- const tabButtonsHandler = nowTabButtons => {
- let buttons;
- if (nowTabButtons) {
- buttons = JSON.parse(JSON.stringify(nowTabButtons));
- } else {
- buttons = JSON.parse(JSON.stringify(tabButtons.value));
- }
- rightTabButton.value = [];
- leftTabButton.value = [];
- buttons.forEach(item => {
- if (item.buttonLocation === 'TABLE_HEADER_RIGHT') {
- rightTabButton.value.push(item);
- } else {
- leftTabButton.value.push(item);
- }
- });
- if (leftTabButton.value.length > 0 && rightTabButton.value.length > 0) {
- emit('judgeIsHaveButtons', true);
- } else {
- emit('judgeIsHaveButtons', false);
- }
- };
- // 用来判断分组的表头按钮是否有值
- const isEmpty = obj => {
- if (typeof obj !== 'object' || obj === null) {
- return true;
- }
- if (Object.keys(obj).length === 0) {
- return true;
- }
- };
- /**
- * 获取字符串的哈希值
- * @param input
- */
- const getHash = function (input) {
- let hash = 0;
- if (input.length === 0) {
- return hash;
- }
- for (let i = 0; i < input.length; i++) {
- const char = input.charCodeAt(i);
- hash = (hash << 5) - hash + char;
- hash = hash & hash; // 确保返回值是一个32位有符号整数
- }
- return Math.abs(hash).toString();
- };
- /**
- * 远程加载ES VUE组件模块,并在模态框中打开。
- * @param jsUrl js路径
- * @param cssUrl css路径
- */
- const openRemoteComponentModule = async function (tabButton) {
- let jsUrl = tabButton.remoteComponentModuleJsUrl;
- let cssUrl = tabButton.remoteComponentModuleCssUrl;
- // 显示模态框
- // 异步的加载js组件
- //let jsUrl = './static/client-eam-module-v3/dist/AssetCheckCreate.js';
- //let cssUrl = './static/client-eam-module-v3/dist/AssetCheckCreate.css';
- if (cssUrl != null && cssUrl.length > 0) {
- let cssUrlHash = getHash(cssUrl);
- CssUtil.dynamicLoadCss(cssUrl, cssUrlHash);
- }
- // webpackIgnore:设置为 true 时,禁用动态导入解析。
- // const testAsyncRemoteComponent = await import(/* webpackIgnore: true */ jsUrl);
- // console.log(testAsyncRemoteComponent);
- if (jsUrl != null && jsUrl.length > 0) {
- const testAsyncRemoteComponent = defineAsyncComponent({
- // 加载函数
- loader: () => {
- return import(/* webpackIgnore: true */ jsUrl);
- },
- // 加载异步组件时使用的组件
- loadingComponent: ASpin,
- // 展示加载组件前的延迟时间,默认为 200ms
- delay: 200,
- // 加载失败后展示的组件
- errorComponent: AEmpty,
- // 如果提供了一个 timeout 时间限制,并超时了
- // 也会显示这里配置的报错组件,默认值是:Infinity
- timeout: 3000,
- });
- modal1Component.value = testAsyncRemoteComponent;
- modal1Open.value = true;
- console.log(modal1Component.value);
- }
- };
- </script>
- <style scoped>
- .button_list {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-right: 6px;
- }
- .ant-btn {
- padding: 4px 10px;
- }
- </style>
|