<template>
<template v-if="syncToApp || syncToLocal">
<JThirdAppDropdown v-if="enabledTypes.wechatEnterprise" type="wechatEnterprise" name="企微" v-bind="bindAttrs" v-on="bindEvents" />
<JThirdAppDropdown v-if="enabledTypes.dingtalk" type="dingtalk" name="钉钉" v-bind="bindAttrs" v-on="bindEvents" />
</template>
<template v-else>未设置任何同步方向</template>
</template>
<script lang="ts" setup>
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { ref, computed, createVNode, h, resolveComponent } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { backEndUrl, getEnabledTypes, doSyncThirdApp } from './jThirdApp.api';
import { Modal, Input } from 'ant-design-vue';
import JThirdAppDropdown from './JThirdAppDropdown.vue';
import { useMessage } from '/@/hooks/web/useMessage';
const { createMessage, createWarningModal } = useMessage();
const props = defineProps({
// 同步类型,可以是 user、depart
bizType: {
type: String,
required: true,
},
// 是否允许同步到第三方APP
syncToApp: Boolean,
// 是否允许第三方APP同步到本地
syncToLocal: Boolean,
// 选择的行
selectedRowKeys: Array,
});
// 声明Emits
const emit = defineEmits(['sync-ok', 'sync-error', 'sync-finally']);
const enabledTypes = ref({});
// 绑定属性
const bindAttrs = computed(() => {
return {
syncToApp: props.syncToApp,
syncToLocal: props.syncToLocal,
};
});
// 绑定方法
const bindEvents = computed(() => {
return {
'to-app': onToApp,
'to-local': onToLocal,
};
});
// 同步到第三方App
function onToApp(e) {
doSync(e.type, '/toApp');
}
// 同步到本地
function onToLocal(e) {
doSync(e.type, '/toLocal');
}
// 获取启用的第三方App
async function loadEnabledTypes() {
enabledTypes.value = await getEnabledTypes();
}
// 开始同步第三方App
function doSync(type, direction) {
let urls = backEndUrl[type];
if (!(urls && urls[props.bizType])) {
console.warn('配置出错');
return;
}
let url = urls[props.bizType] + direction;
let selectedRowKeys = props.selectedRowKeys;
let content = '确定要开始同步全部数据吗?可能花费较长时间!';
if (Array.isArray(selectedRowKeys) && selectedRowKeys.length > 0) {
content = `确定要开始同步这 ${selectedRowKeys.length} 项吗?`;
} else {
selectedRowKeys = [];
}
return new Promise((resolve, reject) => {
const model = Modal.confirm({
icon: createVNode(ExclamationCircleOutlined),
title: '同步',
content,
onOk: () => {
model.update({
keyboard: false,
okText: '同步中…',
cancelButtonProps: { disabled: true },
});
let params = { ids: selectedRowKeys.join(',') };
return defHttp
.get({ url, params }, { isTransformResponse: false })
.then((res) => {
let options = {};
if (res.result) {
options = {
width: 600,
title: res.message,
content: () => {
let nodes;
let successInfo = [`成功信息如下:`, renderTextarea(h, res.result.successInfo.map((v, i) => `${i + 1}. ${v}`).join('\n'))];
if (res.success) {
nodes = [...successInfo, h('br'), `无失败信息!`];
} else {
nodes = [
`失败信息如下:`,
renderTextarea(h, res.result.failInfo.map((v, i) => `${i + 1}. ${v}`).join('\n')),
h('br'),
...successInfo,
];
}
return nodes;
},
};
}
if (res.success) {
if (options != null) {
Modal.success(options);
} else {
createMessage.warning(res.message);
}
emit('sync-ok');
} else {
if (options != null) {
Modal.warning(options);
} else {
createMessage.warning(res.message);
}
emit('sync-error');
}
})
.catch(() => model.destroy())
.finally(() => {
resolve();
emit('sync-finally', {
type,
direction,
isToApp: direction === '/toApp',
isToLocal: direction === '/toLocal',
});
});
},
onCancel() {
resolve();
},
});
});
}
function renderTextarea(h, value) {
return h(
'div',
{
id: 'box',
style: {
minHeight: '100px',
border: '1px solid #d9d9d9',
fontSize: '14px',
maxHeight: '250px',
whiteSpace: 'pre',
overflow: 'auto',
padding: '10px',
},
},
value
);
}
// 获取启用的第三方App
loadEnabledTypes();
</script>
<style scoped>
#box:hover {
border-color: #40a9ff;
}
</style>