Compare commits
2 Commits
b751f4aed7
...
109de00181
Author | SHA1 | Date |
---|---|---|
|
109de00181 | |
|
d9ed613e48 |
|
@ -20,6 +20,8 @@ VITE_GLOB_API_URL_PREFIX=
|
|||
#微前端qiankun应用,命名必须以VITE_APP_SUB_开头,jeecg-app-1为子应用的项目名称,也是子应用的路由父路径
|
||||
VITE_APP_SUB_jeecg-app-1 = '//localhost:8092'
|
||||
|
||||
# 试验田机构编码
|
||||
VITE_SYTJGBM = '101'
|
||||
|
||||
# 填写后将作为乾坤子应用启动,主应用注册时AppName需保持一致(放开 VITE_GLOB_QIANKUN_MICRO_APP_NAME 参数表示jeecg-vue3将以乾坤子应用模式启动)
|
||||
#VITE_GLOB_QIANKUN_MICRO_APP_NAME=jeecg-vue3
|
||||
|
|
|
@ -21,6 +21,8 @@ VITE_GLOB_DOMAIN_URL=https://www.focusnu.com/nursing-unit
|
|||
# 接口父路径前缀
|
||||
VITE_GLOB_API_URL_PREFIX=
|
||||
|
||||
# 试验田机构编码
|
||||
VITE_SYTJGBM = '101'
|
||||
|
||||
# 填写后将作为乾坤子应用启动,主应用注册时AppName需保持一致(放开 VITE_GLOB_QIANKUN_MICRO_APP_NAME 参数表示jeecg-vue3将以乾坤子应用模式启动)
|
||||
#VITE_GLOB_QIANKUN_MICRO_APP_NAME=jeecg-vue3
|
||||
|
|
|
@ -16,6 +16,7 @@ enum Api {
|
|||
getTableList = '/sys/user/queryUserComponentData',
|
||||
getCategoryData = '/sys/category/loadAllData',
|
||||
getNuList = '/iot/cameraInfo/nuList', //后期调整
|
||||
getOrgInfo = '/api/common/getOrgInfo',//根据机构编码获取机构信息
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -164,3 +165,11 @@ export const getFileblob = (url, parameter) => {
|
|||
export const uploadMyFile = (url, data) => {
|
||||
return defHttp.uploadMyFile(url, data);
|
||||
};
|
||||
|
||||
/**
|
||||
* 根据机构编码获取机构信息
|
||||
* @param params orgCode
|
||||
*/
|
||||
export const getOrgInfo = (params) => {
|
||||
return defHttp.get({ url: Api.getOrgInfo, params });
|
||||
};
|
|
@ -125,15 +125,15 @@
|
|||
<a-row>
|
||||
<a-col :span="sourceScreenSpan">
|
||||
<div style="height: 16px;margin-left: 15px;">
|
||||
<a-tag color="#87d068">源数据</a-tag>
|
||||
<a-tag color="#2DB7F5">源数据</a-tag>
|
||||
<a-radio-group v-model:value="viewType" size="small" style="margin-left: 10px;"
|
||||
@change="emit('viewTypeChanged', viewType)">
|
||||
<a-radio-button value="all">全部</a-radio-button>
|
||||
<a-radio-button value="selected">已选择</a-radio-button>
|
||||
<a-radio-button value="unselected">未选择</a-radio-button>
|
||||
</a-radio-group>
|
||||
<slot name="sourceTableSlot"></slot>
|
||||
</div>
|
||||
<slot name="sourceTableSlot"></slot>
|
||||
</a-col>
|
||||
<a-col :span="selectedScreenSpan">
|
||||
<div style="height: 31px;margin-left: 4px;">
|
||||
|
@ -145,14 +145,14 @@
|
|||
</a-tag>
|
||||
</div>
|
||||
<a-card size="small" :bordered="false" class="selected-list-container">
|
||||
<slot name="businessTableSlot">111</slot>
|
||||
<slot name="businessTableSlot"></slot>
|
||||
</a-card>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-card>
|
||||
</a-tab-pane>
|
||||
<a-tab-pane key="asyncHistory" tab="同步历史">
|
||||
<AsyncListComponent ref="asyncHistoryRef"></AsyncListComponent>
|
||||
<AsyncListComponent ref="asyncHistoryRef" :orgCode="orgData.orgCode"></AsyncListComponent>
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
<div class="toggle-button-container">
|
||||
|
@ -168,7 +168,7 @@
|
|||
<a-button type="primary" size="small" @click="handleSelectAll" v-show="tabActiveKey == 'dataAsync'"
|
||||
style="margin-left: 8px">全部添加</a-button>
|
||||
<a-divider type="vertical" style="background-color: #CDCDCF" v-show="tabActiveKey == 'dataAsync'" />
|
||||
<a-button type="error" size="small" @click="handleRemoveAll" v-show="tabActiveKey == 'dataAsync'"
|
||||
<a-button type="primary" size="small" @click="handleRemoveAll" v-show="tabActiveKey == 'dataAsync'"
|
||||
style="margin-left: 8px">全部移除</a-button>
|
||||
<a-divider type="vertical" style="background-color: #CDCDCF" v-show="tabActiveKey == 'dataAsync'" />
|
||||
<a-button type="primary" size="small" @click.stop="handleRestore"
|
||||
|
@ -207,20 +207,19 @@
|
|||
</template>
|
||||
|
||||
<script lang="ts" name="synchronization-directive" setup>
|
||||
import { ref, onMounted, computed, onBeforeMount, reactive } from 'vue';
|
||||
import { initDictOptions } from '/@/utils/dict';
|
||||
import { ref, onMounted, computed } from 'vue';
|
||||
|
||||
import { queryDepartTreeSync } from '/@/api/common/api';
|
||||
import { Empty } from 'ant-design-vue';
|
||||
import { Modal } from 'ant-design-vue';
|
||||
import { useMessage } from "/@/hooks/web/useMessage";
|
||||
import AsyncListComponent from '@/components/dataAsync/AsyncMainList.vue'
|
||||
import { number } from 'vue-types';
|
||||
|
||||
const props = defineProps({
|
||||
selectedSize: 0
|
||||
selectedSize: 0,
|
||||
hasSearchConditions: false,
|
||||
});
|
||||
const emit = defineEmits(['changeShowJMCom', 'viewTypeChanged', 'sourceOrgCodeChanged', 'orgChanged']);
|
||||
const emit = defineEmits(['viewTypeChanged', 'orgChanged', 'handleAsync', 'handleAddAll', 'handleRemoveAll']);
|
||||
|
||||
interface OrganizationData {
|
||||
id?: string;
|
||||
|
@ -235,12 +234,6 @@ interface OrganizationData {
|
|||
address?: string;
|
||||
}
|
||||
|
||||
onBeforeMount(async () => {
|
||||
const dictData = await initDictOptions('org_code')
|
||||
emit('sourceOrgCodeChanged', dictData.filter(d => d.text == 'shi_yan_tian')[0].value)
|
||||
emit('changeShowJMCom', true)
|
||||
})
|
||||
const initialDataIds = ref<Array<string | number>>([]);
|
||||
const { createMessage } = useMessage();
|
||||
const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
|
||||
const toggleSearchStatus = ref<boolean>(true);
|
||||
|
@ -251,8 +244,6 @@ const orgTable = ref<OrganizationData[]>([]);
|
|||
const orgData = ref<OrganizationData | null>(null);
|
||||
const showVideoModal = ref(false);
|
||||
const videoUrl = ref('');
|
||||
const selectedItems = ref(new Map<string | number, any>());
|
||||
const listComRef = ref();
|
||||
const orgSelectedCon = ref(true)
|
||||
const tabActiveKey = ref('dataAsync')
|
||||
const asyncHistoryRef = ref(null)
|
||||
|
@ -295,6 +286,7 @@ const handleOrgSelected = async (org) => {
|
|||
cancelText: '取消',
|
||||
onOk: async () => {
|
||||
await loadOrgData(org);
|
||||
refreshHistory()
|
||||
},
|
||||
});
|
||||
} else {
|
||||
|
@ -305,7 +297,6 @@ const handleOrgSelected = async (org) => {
|
|||
const loadOrgData = async (org) => {
|
||||
// 更新机构数据
|
||||
orgData.value = org;
|
||||
|
||||
emit('orgChanged', org)
|
||||
};
|
||||
|
||||
|
@ -326,41 +317,15 @@ const handleAsync = () => {
|
|||
okText: '确认',
|
||||
cancelText: '取消',
|
||||
onOk: async () => {
|
||||
let idStr = Array.from(selectedItems.value.keys()).join(',')
|
||||
if (!idStr) {
|
||||
createMessage.warning("未选择数据!");
|
||||
return
|
||||
}
|
||||
let izInc = true
|
||||
if (!!orgData.value?.operationStartTime) izInc = new Date() >= new Date(orgData.value?.operationStartTime)
|
||||
let params = {
|
||||
orgCode: orgData.value?.orgCode,
|
||||
izInc,
|
||||
idStr
|
||||
}
|
||||
await asyncFunc(params)
|
||||
|
||||
//处理右侧列表数据移除是否可用 如果已到运营时间则禁用
|
||||
if (!orgData.value?.operationStartTime || new Date() >= new Date(orgData.value?.operationStartTime)) {
|
||||
// 获取当前同步的ID数组
|
||||
const syncedIds = Array.from(selectedItems.value.keys());
|
||||
// 只添加initialDataIds中不存在的ID
|
||||
syncedIds.forEach(id => {
|
||||
if (!initialDataIds.value.includes(id)) {
|
||||
initialDataIds.value.push(id);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//刷新历史数据
|
||||
refreshHistory()
|
||||
createMessage.success("同步结果请在同步历史中查看!");
|
||||
// 通知父组件执行同步
|
||||
emit('handleAsync', null);
|
||||
},
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
//刷新同步历史数据
|
||||
const refreshHistory = () => {
|
||||
asyncHistoryRef.value?.searchQuery()
|
||||
}
|
||||
|
||||
|
||||
|
@ -369,74 +334,22 @@ const viewType = ref('all')
|
|||
|
||||
// 全部选择功能
|
||||
const handleSelectAll = async () => {
|
||||
// if (!orgData.value) {
|
||||
// createMessage.warning("请先选择机构");
|
||||
// return;
|
||||
// }
|
||||
|
||||
// try {
|
||||
// // 调用子组件的方法获取所有数据(不分页)
|
||||
// const allData = await listComRef.value?.getAllData?.(queryParam.value);
|
||||
|
||||
// if (allData && allData.length > 0) {
|
||||
// // 过滤掉已经存在的项
|
||||
// const newItems = allData.filter(item => !selectedItems.value.has(item.id));
|
||||
|
||||
// if (newItems.length === 0) {
|
||||
// createMessage.info("没有新的数据可以添加");
|
||||
// return;
|
||||
// }
|
||||
|
||||
// // 添加新项到已选择列表
|
||||
// newItems.forEach(item => {
|
||||
// selectedItems.value.set(item.id, item);
|
||||
// });
|
||||
|
||||
// // 更新子组件的选中状态
|
||||
// listComRef.value?.updateSelection?.(Array.from(selectedItems.value.values()));
|
||||
|
||||
// createMessage.success(`已添加 ${newItems.length} 条数据`);
|
||||
// } else {
|
||||
// createMessage.info("没有查询到数据");
|
||||
// }
|
||||
// } catch (error) {
|
||||
// createMessage.error("获取全部数据失败");
|
||||
// console.error("获取全部数据失败:", error);
|
||||
// }
|
||||
if (!orgData.value) {
|
||||
createMessage.warning("请先选择机构");
|
||||
return;
|
||||
}
|
||||
emit('handleAddAll', null)
|
||||
};
|
||||
|
||||
// 全部移除功能
|
||||
const handleRemoveAll = () => {
|
||||
if (selectedItems.value.size === 0) {
|
||||
createMessage.info("当前没有已选数据");
|
||||
return;
|
||||
}
|
||||
|
||||
Modal.confirm({
|
||||
title: '确认移除',
|
||||
content: '确定要移除所有已选数据吗?',
|
||||
okText: '确认',
|
||||
cancelText: '取消',
|
||||
onOk: () => {
|
||||
// 清空已选择的数据
|
||||
if (!orgData.value?.operationStartTime || new Date() >= new Date(orgData.value?.operationStartTime)) {
|
||||
// 创建新的Map只保留初始数据
|
||||
const newSelectedItems = new Map();
|
||||
// 遍历当前选择项,只保留初始数据
|
||||
selectedItems.value.forEach((value, key) => {
|
||||
if (initialDataIds.value.includes(key)) {
|
||||
newSelectedItems.set(key, value);
|
||||
}
|
||||
});
|
||||
selectedItems.value = newSelectedItems;
|
||||
listComRef.value?.updateSelection?.(Array.from(newSelectedItems.values()));
|
||||
} else {
|
||||
selectedItems.value.clear();
|
||||
listComRef.value?.updateSelection?.([]);
|
||||
}
|
||||
|
||||
|
||||
createMessage.success("已移除所有已选数据");
|
||||
emit('handleRemoveAll', null)
|
||||
}
|
||||
});
|
||||
};
|
||||
|
@ -466,13 +379,7 @@ const handleRestore = async () => {
|
|||
});
|
||||
};
|
||||
|
||||
// 计算当前搜索条件的函数
|
||||
const hasSearchConditions = computed(() => {
|
||||
return true
|
||||
// return Object.keys(queryParam.value).some(key =>
|
||||
// key !== 'viewType' && queryParam.value[key] !== undefined && queryParam.value[key] !== ''
|
||||
// );
|
||||
});
|
||||
|
||||
|
||||
onMounted(() => {
|
||||
queryDepartTreeSync({ platType: 'ywjg' }).then(res => {
|
||||
|
@ -482,7 +389,8 @@ onMounted(() => {
|
|||
|
||||
defineExpose({
|
||||
orgData,
|
||||
resetOrgSelectedCon
|
||||
resetOrgSelectedCon,
|
||||
refreshHistory,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
@ -497,7 +405,7 @@ defineExpose({
|
|||
}
|
||||
|
||||
.selected-list-container {
|
||||
height: calc(100vh - 350px);
|
||||
height: calc(100vh - 310px);
|
||||
overflow: auto;
|
||||
|
||||
:deep(.ant-table) {
|
||||
|
@ -786,4 +694,11 @@ defineExpose({
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 机构选取卡片各项值的容器padding
|
||||
.org-card {
|
||||
:deep(.ant-descriptions-item-content) {
|
||||
padding: 20px;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -51,6 +51,9 @@ import { asyncMaincolumns, asyncStatusColumns } from './AsyncMain.data';
|
|||
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './AsyncMain.api';
|
||||
import AsyncMainModal from './components/AsyncMainModal.vue'
|
||||
|
||||
const props = defineProps({
|
||||
orgCode: 'orgCode'
|
||||
});
|
||||
const queryParam = reactive<any>({});
|
||||
const registerModal = ref();
|
||||
//注册table数据
|
||||
|
@ -65,6 +68,7 @@ const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
|
|||
showActionColumn: false,
|
||||
beforeFetch: async (params) => {
|
||||
queryParam.type = 'directive'
|
||||
queryParam.orgCode = props.orgCode
|
||||
return Object.assign(params, queryParam);
|
||||
},
|
||||
},
|
||||
|
|
|
@ -1,16 +1,17 @@
|
|||
import { defHttp } from '/@/utils/http/axios';
|
||||
import { useMessage } from "/@/hooks/web/useMessage";
|
||||
import { useMessage } from '/@/hooks/web/useMessage';
|
||||
|
||||
const { createConfirm } = useMessage();
|
||||
|
||||
enum Api {
|
||||
list = '/mediamanage/mediaManage/list',
|
||||
save='/mediamanage/mediaManage/add',
|
||||
edit='/mediamanage/mediaManage/edit',
|
||||
save = '/mediamanage/mediaManage/add',
|
||||
edit = '/mediamanage/mediaManage/edit',
|
||||
deleteOne = '/mediamanage/mediaManage/delete',
|
||||
deleteBatch = '/mediamanage/mediaManage/deleteBatch',
|
||||
importExcel = '/mediamanage/mediaManage/importExcel',
|
||||
exportXls = '/mediamanage/mediaManage/exportXls',
|
||||
getUrl = '/mediamanage/mediaManage/getUrl',
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -35,11 +36,11 @@ export const list = (params) => defHttp.get({ url: Api.list, params });
|
|||
* @param params
|
||||
* @param handleSuccess
|
||||
*/
|
||||
export const deleteOne = (params,handleSuccess) => {
|
||||
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
|
||||
export const deleteOne = (params, handleSuccess) => {
|
||||
return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true }).then(() => {
|
||||
handleSuccess();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 批量删除
|
||||
|
@ -54,12 +55,12 @@ export const batchDelete = (params, handleSuccess) => {
|
|||
okText: '确认',
|
||||
cancelText: '取消',
|
||||
onOk: () => {
|
||||
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
|
||||
return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => {
|
||||
handleSuccess();
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 保存或者更新
|
||||
|
@ -69,4 +70,10 @@ export const batchDelete = (params, handleSuccess) => {
|
|||
export const saveOrUpdate = (params, isUpdate) => {
|
||||
let url = isUpdate ? Api.edit : Api.save;
|
||||
return defHttp.post({ url: url, params }, { isTransformResponse: false });
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取协议、域名
|
||||
* @param params
|
||||
*/
|
||||
export const getUrl = () => defHttp.get({ url: Api.getUrl });
|
||||
|
|
|
@ -15,6 +15,11 @@ export const columns: BasicColumn[] = [
|
|||
align: "center",
|
||||
dataIndex: 'descr'
|
||||
},
|
||||
{
|
||||
title: '系统功能',
|
||||
align: "center",
|
||||
dataIndex: 'sysFunc_dictText'
|
||||
},
|
||||
{
|
||||
title: '文件类型',
|
||||
align: "center",
|
||||
|
|
|
@ -8,7 +8,14 @@
|
|||
<a-col :lg="6">
|
||||
<a-form-item name="name">
|
||||
<template #label><span title="名称">名称</span></template>
|
||||
<JInput v-model:value="queryParam.name" placeholder="请输入名称"/>
|
||||
<JInput v-model:value="queryParam.name" placeholder="请输入名称" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :lg="6">
|
||||
<a-form-item name="sysFunc">
|
||||
<template #label><span title="系统功能">系统功能</span></template>
|
||||
<j-dict-select-tag type='list' v-model:value="queryParam.sysFunc" dictCode="sys_function"
|
||||
placeholder="请选择系统功能" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :lg="6">
|
||||
|
@ -55,25 +62,45 @@
|
|||
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
|
||||
</template>
|
||||
<template v-slot:bodyCell="{ column, record, index, text }">
|
||||
<template v-if="column.dataIndex === 'filePath'">
|
||||
<!-- 图片 -->
|
||||
<img style="max-width: 120px; max-height: 80px;" v-if="record.fileType === 'image'"
|
||||
:src="transPreviewUrl(record)" :alt="record.fileName || 'Image'">
|
||||
|
||||
<!-- 音频 -->
|
||||
<audio style="max-width: 120px; max-height: 80px;" v-if="record.fileType === 'audio'" controls
|
||||
:src="transPreviewUrl(record)">
|
||||
您的浏览器不支持 audio 标签。
|
||||
</audio>
|
||||
|
||||
<!-- 视频 -->
|
||||
<video style="max-width: 120px; max-height: 80px;" v-if="record.fileType === 'video'" controls
|
||||
:src="transPreviewUrl(record)">
|
||||
您的浏览器不支持 video 标签。
|
||||
</video>
|
||||
|
||||
<!-- 文档 -->
|
||||
<span v-if="record.fileType === 'document'">-</span>
|
||||
</template>
|
||||
</template>
|
||||
</BasicTable>
|
||||
<!-- 表单区域 -->
|
||||
<MediaManageModal ref="registerModal" @success="handleSuccess"></MediaManageModal>
|
||||
<MediaManageModal ref="registerModal" :urlPrefix="urlPrefix" @success="handleSuccess"></MediaManageModal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" name="mediamanage-mediaManage" setup>
|
||||
import { ref, reactive } from 'vue';
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { BasicTable, useTable, TableAction } from '/@/components/Table';
|
||||
import { useListPage } from '/@/hooks/system/useListPage';
|
||||
import { columns, superQuerySchema } from './MediaManage.data';
|
||||
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './MediaManage.api';
|
||||
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl, getUrl } from './MediaManage.api';
|
||||
import { downloadFile } from '/@/utils/common/renderUtils';
|
||||
import MediaManageModal from './components/MediaManageModal.vue'
|
||||
import { useUserStore } from '/@/store/modules/user';
|
||||
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
|
||||
import JSelectMultiple from '/@/components/Form/src/jeecg/components/JSelectMultiple.vue';
|
||||
import JInput from "/@/components/Form/src/jeecg/components/JInput.vue";
|
||||
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
|
||||
|
||||
const formRef = ref();
|
||||
const queryParam = reactive<any>({});
|
||||
|
@ -117,7 +144,7 @@ const wrapperCol = reactive({
|
|||
xs: 24,
|
||||
sm: 20,
|
||||
});
|
||||
|
||||
const urlPrefix = ref('')//协议+域名
|
||||
// 高级查询配置
|
||||
const superQueryConfig = reactive(superQuerySchema);
|
||||
|
||||
|
@ -226,9 +253,23 @@ function searchReset() {
|
|||
reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* 转化资源路径
|
||||
* @param url_ 路径
|
||||
*/
|
||||
function transPreviewUrl(record) {
|
||||
if (record.izNetUrl == 'net') {
|
||||
return urlPrefix.value + record.filePath
|
||||
} else {
|
||||
return record.filePath
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
onMounted(() => {
|
||||
getUrl().then(res => {
|
||||
urlPrefix.value = res
|
||||
})
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
|
|
|
@ -15,6 +15,12 @@
|
|||
<a-textarea v-model:value="formData.descr" :rows="4" placeholder="请输入备注" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24">
|
||||
<a-form-item label="系统功能" v-bind="validateInfos.sysFunc" id="MediaManageForm-sysFunc" name="sysFunc">
|
||||
<j-dict-select-tag type='list' v-model:value="formData.sysFunc" @change="sysFuncChanged"
|
||||
dictCode="sys_function" placeholder="请选择系统功能" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24">
|
||||
<a-form-item label="文件类型" v-bind="validateInfos.fileType" id="MediaManageForm-fileType" name="fileType">
|
||||
<j-dict-select-tag type='list' v-model:value="formData.fileType" dictCode="file_type"
|
||||
|
@ -22,26 +28,45 @@
|
|||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24">
|
||||
<a-form-item label="文件上传" v-bind="validateInfos.filePath" id="MediaManageForm-filePath">
|
||||
<a-form-item label="资源类型" v-bind="validateInfos.izNetUrl" id="MediaManageForm-izNetUrl" name="izNetUrl">
|
||||
<j-dict-select-tag type='radio' v-model:value="formData.izNetUrl" dictCode="iz_net_url" allowClear
|
||||
:disabled="formData.sysFunc == 'directive'" @change="handleFileTypeChange" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24">
|
||||
<a-form-item :label="handleFileUploadLableName(formData.izNetUrl)" v-bind="validateInfos.filePath"
|
||||
id="MediaManageForm-filePath">
|
||||
<div v-if="formData.fileType && formData.izNetUrl == 'net'"
|
||||
style="color: #999; margin-bottom: 8px; padding-left: 8px;">
|
||||
当前协议域名为{{ urlPrefix }}
|
||||
</div>
|
||||
<a-textarea v-if="formData.fileType && (formData.izNetUrl == 'net' || formData.izNetUrl == 'full_url')"
|
||||
v-model:value="formData.filePath" :rows="2" placeholder="请输入资源地址" style="margin-bottom: 10px;" />
|
||||
<!-- 未选择文件类型时的提示 -->
|
||||
<div v-if="!formData.fileType" class="upload-tip">
|
||||
<span style="color: red; line-height: 32px;">请先选择文件类型</span>
|
||||
</div>
|
||||
|
||||
<!-- 图片上传组件 -->
|
||||
<j-image-upload v-if="formData.fileType === 'image'" v-model:value="formData.filePath" :number="1"
|
||||
<template v-if="formData.fileType === 'image'">
|
||||
<j-image-upload v-if="formData.izNetUrl == 'local'" v-model:value="formData.filePath" :number="1"
|
||||
multiple="1" :fileSize="10" accept=".png,.jpg,.jpeg" @change="handleFileChange">
|
||||
</j-image-upload>
|
||||
<!-- 图片预览 -->
|
||||
<div v-if="formData.filePath && formData.izNetUrl != 'local'" class="media-preview">
|
||||
<img :src="transUrl(formData)" style="max-width: 100%; max-height: 300px;">
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- 视频上传组件 -->
|
||||
<template v-if="formData.fileType === 'video'">
|
||||
<j-upload v-model:value="formData.filePath" :fileSize="100" :multiple="false" :maxCount="1"
|
||||
accept=".mp4" @change="handleFileChange">
|
||||
<j-upload v-if="formData.izNetUrl == 'local'" v-model:value="formData.filePath" :fileSize="100"
|
||||
:multiple="false" :maxCount="1" accept=".mp4" @change="handleFileChange">
|
||||
</j-upload>
|
||||
<!-- 视频预览 -->
|
||||
<div v-if="formData.filePath" class="media-preview">
|
||||
<div v-if="formData.filePath && previewShow" class="media-preview">
|
||||
<video controls style="max-width: 100%; max-height: 300px;">
|
||||
<source :src="getFileAccessHttpUrl(formData.filePath)" type="video/mp4">
|
||||
<source :src="transUrl(formData)" type="video/mp4">
|
||||
您的浏览器不支持视频播放
|
||||
</video>
|
||||
</div>
|
||||
|
@ -49,13 +74,13 @@
|
|||
|
||||
<!-- 音频上传组件 -->
|
||||
<template v-if="formData.fileType === 'audio'">
|
||||
<j-upload v-model:value="formData.filePath" :fileSize="50" :multiple="false" :maxCount="1"
|
||||
accept=".mp3" @change="handleFileChange">
|
||||
<j-upload v-if="formData.izNetUrl == 'local'" v-model:value="formData.filePath" :fileSize="50"
|
||||
:multiple="false" :maxCount="1" accept=".mp3" @change="handleFileChange">
|
||||
</j-upload>
|
||||
<!-- 音频预览 -->
|
||||
<div v-if="formData.filePath" class="media-preview">
|
||||
<div v-if="formData.filePath && previewShow" class="media-preview">
|
||||
<audio controls style="width: 100%;">
|
||||
<source :src="getFileAccessHttpUrl(formData.filePath)" type="audio/mpeg">
|
||||
<source :src="transUrl(formData)" type="audio/mpeg">
|
||||
您的浏览器不支持音频播放
|
||||
</audio>
|
||||
</div>
|
||||
|
@ -76,7 +101,7 @@
|
|||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref, reactive, defineExpose, nextTick, defineProps, computed } from 'vue';
|
||||
import { ref, reactive, defineExpose, nextTick, defineProps, computed, watch } from 'vue';
|
||||
import { defHttp } from '/@/utils/http/axios';
|
||||
import { useMessage } from '/@/hooks/web/useMessage';
|
||||
import { getValueType } from '/@/utils';
|
||||
|
@ -91,7 +116,8 @@ import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
|
|||
const props = defineProps({
|
||||
formDisabled: { type: Boolean, default: false },
|
||||
formData: { type: Object, default: () => ({}) },
|
||||
formBpm: { type: Boolean, default: true }
|
||||
formBpm: { type: Boolean, default: true },
|
||||
urlPrefix: { type: String, default: '' },
|
||||
});
|
||||
const formRef = ref();
|
||||
const useForm = Form.useForm;
|
||||
|
@ -100,17 +126,19 @@ const formData = reactive<Record<string, any>>({
|
|||
id: '',
|
||||
name: '',
|
||||
descr: '',
|
||||
sysFunc: '',
|
||||
fileType: '',
|
||||
filePath: '',
|
||||
izNetUrl: 'local',
|
||||
});
|
||||
const { createMessage } = useMessage();
|
||||
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
|
||||
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 6 } });
|
||||
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
|
||||
const confirmLoading = ref<boolean>(false);
|
||||
//表单验证
|
||||
const validatorRules = reactive({
|
||||
fileType: [{ required: true, message: '请输入文件类型!' },],
|
||||
filePath: [{ required: true, message: '请输入文件预览!' },],
|
||||
filePath: [{ required: true, message: '请上传文件/填写资源路径' },],
|
||||
});
|
||||
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: false });
|
||||
|
||||
|
@ -195,6 +223,18 @@ async function submitForm() {
|
|||
}
|
||||
}
|
||||
}
|
||||
//如果是相对网络路径 需要根据机构中配置的协议+域名结尾是否有斜杠处理filePath
|
||||
if (model.izNetUrl == 'net') {
|
||||
if (props.urlPrefix.endsWith('/')) {
|
||||
if (model.filePath.startsWith('/')) {
|
||||
model.filePath = model.filePath.replace('/', '')
|
||||
}
|
||||
} else {
|
||||
if (!model.filePath.startsWith('/')) {
|
||||
model.filePath = '/' + model.filePath
|
||||
}
|
||||
}
|
||||
}
|
||||
await saveOrUpdate(model, isUpdate.value)
|
||||
.then((res) => {
|
||||
if (res.success) {
|
||||
|
@ -209,6 +249,52 @@ async function submitForm() {
|
|||
});
|
||||
}
|
||||
|
||||
function handleFileUploadLableName(v_) {
|
||||
if (v_ == 'local') {
|
||||
return '文件上传'
|
||||
} else if (v_ == 'net') {
|
||||
return '网络资源路径(不包含协议域名)'
|
||||
} else if (v_ == 'full_url') {
|
||||
return '完整网络资源地址'
|
||||
} else {
|
||||
return '文件上传'
|
||||
}
|
||||
|
||||
}
|
||||
const previewShow = ref(false)
|
||||
watch(
|
||||
() => formData.filePath,
|
||||
(newVal, oldVal) => {
|
||||
previewShow.value = false
|
||||
setTimeout(() => {
|
||||
previewShow.value = true
|
||||
}, 500)
|
||||
},
|
||||
{
|
||||
immediate: false,
|
||||
deep: true
|
||||
}
|
||||
);
|
||||
|
||||
function transUrl(record) {
|
||||
if (record.izNetUrl == 'local') {
|
||||
return getFileAccessHttpUrl(record.filePath)
|
||||
} else if (record.izNetUrl == 'net') {
|
||||
return props.urlPrefix + record.filePath
|
||||
} else {
|
||||
return record.filePath
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 系统功能变更
|
||||
*/
|
||||
function sysFuncChanged() {
|
||||
if (formData.sysFunc == 'directive') {
|
||||
formData.izNetUrl = 'net'
|
||||
}
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
add,
|
||||
edit,
|
||||
|
|
|
@ -1,77 +1,83 @@
|
|||
<template>
|
||||
<j-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
|
||||
<MediaManageForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></MediaManageForm>
|
||||
<j-modal :title="title" :width="width" :visible="visible" @ok="handleOk"
|
||||
:okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
|
||||
<MediaManageForm ref="registerForm" :urlPrefix="urlPrefix" @ok="submitCallback" :formDisabled="disableSubmit"
|
||||
:formBpm="false" v-if="visible">
|
||||
</MediaManageForm>
|
||||
</j-modal>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref, nextTick, defineExpose } from 'vue';
|
||||
import MediaManageForm from './MediaManageForm.vue'
|
||||
import JModal from '/@/components/Modal/src/JModal/JModal.vue';
|
||||
import { ref, nextTick, defineExpose, defineProps } from 'vue';
|
||||
import MediaManageForm from './MediaManageForm.vue'
|
||||
import JModal from '/@/components/Modal/src/JModal/JModal.vue';
|
||||
|
||||
const title = ref<string>('');
|
||||
const width = ref<number>(800);
|
||||
const visible = ref<boolean>(false);
|
||||
const disableSubmit = ref<boolean>(false);
|
||||
const registerForm = ref();
|
||||
const emit = defineEmits(['register', 'success']);
|
||||
const props = defineProps({
|
||||
urlPrefix: { type: String, default: '' },
|
||||
});
|
||||
const title = ref<string>('');
|
||||
const width = ref<number>(1000);
|
||||
const visible = ref<boolean>(false);
|
||||
const disableSubmit = ref<boolean>(false);
|
||||
const registerForm = ref();
|
||||
const emit = defineEmits(['register', 'success']);
|
||||
|
||||
/**
|
||||
/**
|
||||
* 新增
|
||||
*/
|
||||
function add() {
|
||||
function add() {
|
||||
title.value = '新增';
|
||||
visible.value = true;
|
||||
nextTick(() => {
|
||||
registerForm.value.add();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* 编辑
|
||||
* @param record
|
||||
*/
|
||||
function edit(record) {
|
||||
function edit(record) {
|
||||
title.value = disableSubmit.value ? '详情' : '编辑';
|
||||
visible.value = true;
|
||||
nextTick(() => {
|
||||
registerForm.value.edit(record);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* 确定按钮点击事件
|
||||
*/
|
||||
function handleOk() {
|
||||
function handleOk() {
|
||||
registerForm.value.submitForm();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* form保存回调事件
|
||||
*/
|
||||
function submitCallback() {
|
||||
function submitCallback() {
|
||||
handleCancel();
|
||||
emit('success');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* 取消按钮回调事件
|
||||
*/
|
||||
function handleCancel() {
|
||||
function handleCancel() {
|
||||
visible.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
defineExpose({
|
||||
add,
|
||||
edit,
|
||||
disableSubmit,
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
/**隐藏样式-modal确定按钮 */
|
||||
.jee-hidden {
|
||||
/**隐藏样式-modal确定按钮 */
|
||||
.jee-hidden {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style lang="less" scoped></style>
|
||||
|
|
|
@ -1,67 +1,72 @@
|
|||
import {BasicColumn} from '/@/components/Table';
|
||||
import {FormSchema} from '/@/components/Table';
|
||||
import { rules} from '/@/utils/helper/validator';
|
||||
import { BasicColumn } from '/@/components/Table';
|
||||
import { FormSchema } from '/@/components/Table';
|
||||
import { rules } from '/@/utils/helper/validator';
|
||||
import { render } from '/@/utils/common/renderUtils';
|
||||
import { getWeekMonthQuarterYear } from '/@/utils';
|
||||
//列表数据
|
||||
export const columns: BasicColumn[] = [
|
||||
{
|
||||
title: '审批状态',
|
||||
align: "center",
|
||||
dataIndex: 'status_dictText'
|
||||
},
|
||||
{
|
||||
title: '咨询人姓名',
|
||||
align: "center",
|
||||
dataIndex: 'name'
|
||||
align: 'center',
|
||||
dataIndex: 'name',
|
||||
},
|
||||
{
|
||||
title: '性别',
|
||||
align: "center",
|
||||
dataIndex: 'sex'
|
||||
align: 'center',
|
||||
dataIndex: 'sex',
|
||||
},
|
||||
{
|
||||
title: '联系电话',
|
||||
align: "center",
|
||||
dataIndex: 'tel'
|
||||
align: 'center',
|
||||
dataIndex: 'tel',
|
||||
},
|
||||
{
|
||||
title: '申请日期',
|
||||
align: "center",
|
||||
dataIndex: 'createTime'
|
||||
align: 'center',
|
||||
dataIndex: 'createTime',
|
||||
},
|
||||
{
|
||||
title: '机构地址',
|
||||
align: "center",
|
||||
dataIndex: 'orgAddress'
|
||||
align: 'center',
|
||||
dataIndex: 'orgAddress',
|
||||
},
|
||||
{
|
||||
title: '机构负责人电话',
|
||||
align: "center",
|
||||
dataIndex: 'orgLeaderPhone'
|
||||
align: 'center',
|
||||
dataIndex: 'orgLeaderPhone',
|
||||
},
|
||||
{
|
||||
title: '机构房屋性质',
|
||||
align: "center",
|
||||
dataIndex: 'orgPropertyType'
|
||||
align: 'center',
|
||||
dataIndex: 'orgPropertyType',
|
||||
},
|
||||
{
|
||||
title: '机构建筑面积',
|
||||
align: "center",
|
||||
dataIndex: 'orgBuildingArea'
|
||||
align: 'center',
|
||||
dataIndex: 'orgBuildingArea',
|
||||
},
|
||||
{
|
||||
title: '审批状态',
|
||||
align: 'center',
|
||||
dataIndex: 'status_dictText',
|
||||
},
|
||||
{
|
||||
title: '审批备注',
|
||||
align: 'center',
|
||||
dataIndex: 'content',
|
||||
},
|
||||
];
|
||||
|
||||
// 高级查询数据
|
||||
export const superQuerySchema = {
|
||||
tel: {title: '联系电话',order: 2,view: 'text', type: 'string',},
|
||||
status: {title: '状态 1审核中 2审核完成 3驳回 ',order: 3,view: 'list', type: 'string',dictCode: '',},
|
||||
createTime: {title: '创建日期',order: 5,view: 'datetime', type: 'string',},
|
||||
izEntry: {title: '机构是否入驻0否 1是(是否入驻过)',order: 7,view: 'list', type: 'string',dictCode: '',},
|
||||
name: {title: '咨询人姓名',order: 8,view: 'text', type: 'string',},
|
||||
sex: {title: '性别',order: 9,view: 'text', type: 'string',},
|
||||
orgAddress: {title: '机构地址',order: 24,view: 'text', type: 'string',},
|
||||
orgLeaderPhone: {title: '机构负责人电话',order: 27,view: 'text', type: 'string',},
|
||||
orgPropertyType: {title: '机构房屋性质',order: 29,view: 'text', type: 'string',},
|
||||
orgBuildingArea: {title: '机构建筑面积',order: 30,view: 'number', type: 'number',},
|
||||
tel: { title: '联系电话', order: 2, view: 'text', type: 'string' },
|
||||
status: { title: '状态 1审核中 2审核完成 3驳回 ', order: 3, view: 'list', type: 'string', dictCode: '' },
|
||||
createTime: { title: '创建日期', order: 5, view: 'datetime', type: 'string' },
|
||||
izEntry: { title: '机构是否入驻0否 1是(是否入驻过)', order: 7, view: 'list', type: 'string', dictCode: '' },
|
||||
name: { title: '咨询人姓名', order: 8, view: 'text', type: 'string' },
|
||||
sex: { title: '性别', order: 9, view: 'text', type: 'string' },
|
||||
orgAddress: { title: '机构地址', order: 24, view: 'text', type: 'string' },
|
||||
orgLeaderPhone: { title: '机构负责人电话', order: 27, view: 'text', type: 'string' },
|
||||
orgPropertyType: { title: '机构房屋性质', order: 29, view: 'text', type: 'string' },
|
||||
orgBuildingArea: { title: '机构建筑面积', order: 30, view: 'number', type: 'number' },
|
||||
};
|
||||
|
|
|
@ -187,7 +187,8 @@ function getTableAction(record) {
|
|||
{
|
||||
label: '审批',
|
||||
onClick: handleEdit.bind(null, record),
|
||||
auth: 'orgapplyinfo:nu_org_apply_info:edit'
|
||||
auth: 'orgapplyinfo:nu_org_apply_info:edit',
|
||||
disabled: record.status == '0' || record.status == '2'
|
||||
},
|
||||
];
|
||||
}
|
||||
|
|
|
@ -111,13 +111,13 @@
|
|||
<a-col :span="12">
|
||||
<a-form-item label="身份证正面" v-bind="validateInfos.cardZmPath" id="OrgApplyInfoForm-cardZmPath"
|
||||
name="cardZmPath">
|
||||
<a-input v-model:value="formData.cardZmPath" placeholder="请输入身份证正面" allow-clear></a-input>
|
||||
<JImageUpload :fileMax="1" v-model:value="formData.cardZmPath"></JImageUpload>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="身份证反面" v-bind="validateInfos.cardFmPath" id="OrgApplyInfoForm-cardFmPath"
|
||||
name="cardFmPath">
|
||||
<a-input v-model:value="formData.cardFmPath" placeholder="请输入身份证反面" allow-clear></a-input>
|
||||
<JImageUpload :fileMax="1" v-model:value="formData.cardFmPath"></JImageUpload>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24">
|
||||
|
@ -126,7 +126,7 @@
|
|||
<a-col :span="12">
|
||||
<a-form-item label="营业执照照片" v-bind="validateInfos.comBusinessLicense"
|
||||
id="OrgApplyInfoForm-comBusinessLicense" name="comBusinessLicense">
|
||||
<a-input v-model:value="formData.comBusinessLicense" placeholder="请输入营业执照照片" allow-clear></a-input>
|
||||
<JImageUpload :fileMax="1" v-model:value="formData.comBusinessLicense"></JImageUpload>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
|
@ -179,12 +179,12 @@
|
|||
<a-input v-model:value="formData.orgLeaderPhone" placeholder="请输入机构负责人电话" allow-clear></a-input>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<!-- <a-col :span="12">
|
||||
<a-form-item label="机构楼宇牌号" v-bind="validateInfos.orgBuildingNumber"
|
||||
id="OrgApplyInfoForm-orgBuildingNumber" name="orgBuildingNumber">
|
||||
<a-input v-model:value="formData.orgBuildingNumber" placeholder="请输入机构楼宇牌号" allow-clear></a-input>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</a-col> -->
|
||||
<a-col :span="12">
|
||||
<a-form-item label="机构房屋性质" v-bind="validateInfos.orgPropertyType" id="OrgApplyInfoForm-orgPropertyType"
|
||||
name="orgPropertyType">
|
||||
|
@ -217,6 +217,7 @@ import { saveOrUpdate } from '../OrgApplyInfo.api';
|
|||
import { Form } from 'ant-design-vue';
|
||||
import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
|
||||
import TencentMap from '/@/components/TencentMap/TencentMap.vue';
|
||||
import JImageUpload from '/@/components/Form/src/jeecg/components/JImageUpload.vue';
|
||||
|
||||
const props = defineProps({
|
||||
formDisabled: { type: Boolean, default: false },
|
||||
|
|
|
@ -69,50 +69,11 @@ export const columns: BasicColumn[] = [
|
|||
}
|
||||
},
|
||||
},
|
||||
// {
|
||||
// title: '收费价格',
|
||||
// align: 'center',
|
||||
// dataIndex: 'tollPrice',
|
||||
// width: 100,
|
||||
// },
|
||||
// {
|
||||
// title: '提成价格',
|
||||
// align: "center",
|
||||
// dataIndex: 'comPrice'
|
||||
// },
|
||||
// {
|
||||
// title: '医保报销',
|
||||
// align: 'center',
|
||||
// dataIndex: 'izReimbursement_dictText',
|
||||
// width: 100,
|
||||
// },
|
||||
// {
|
||||
// title: '机构优惠',
|
||||
// align: 'center',
|
||||
// dataIndex: 'izPreferential_dictText',
|
||||
// width: 100,
|
||||
// },
|
||||
// {
|
||||
// title: '收费频次',
|
||||
// align: 'center',
|
||||
// dataIndex: 'chargingFrequency_dictText',
|
||||
// },
|
||||
{
|
||||
title: '周期类型',
|
||||
align: 'center',
|
||||
dataIndex: 'cycleType_dictText',
|
||||
},
|
||||
// {
|
||||
// title: '排序',
|
||||
// align: "center",
|
||||
// sorter: true,
|
||||
// dataIndex: 'sort'
|
||||
// },
|
||||
// {
|
||||
// title: '服务说明',
|
||||
// align: "center",
|
||||
// dataIndex: 'serviceContent'
|
||||
// },
|
||||
{
|
||||
title: '服务时长(分钟)',
|
||||
align: 'center',
|
||||
|
@ -125,49 +86,15 @@ export const columns: BasicColumn[] = [
|
|||
dataIndex: 'izEnabled_dictText',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '语音文件',
|
||||
align: 'center',
|
||||
dataIndex: 'mp3File',
|
||||
},
|
||||
{
|
||||
title: '视频文件',
|
||||
align: 'center',
|
||||
dataIndex: 'mp4File',
|
||||
},
|
||||
// {
|
||||
// title: '创建人',
|
||||
// align: "center",
|
||||
// dataIndex: 'createBy'
|
||||
// },
|
||||
// {
|
||||
// title: '创建日期',
|
||||
// align: "center",
|
||||
// sorter: true,
|
||||
// dataIndex: 'createTime'
|
||||
// },
|
||||
// {
|
||||
// title: '更新人',
|
||||
// align: "center",
|
||||
// dataIndex: 'updateBy'
|
||||
// },
|
||||
// {
|
||||
// title: '更新日期',
|
||||
// align: "center",
|
||||
// sorter: true,
|
||||
// dataIndex: 'updateTime'
|
||||
// },
|
||||
{
|
||||
title: '预览图片',
|
||||
align: 'center',
|
||||
dataIndex: 'previewFile',
|
||||
customRender: render.renderImage,
|
||||
dataIndex: 'previewFileMedia',
|
||||
},
|
||||
{
|
||||
title: '即时指令图片',
|
||||
align: 'center',
|
||||
dataIndex: 'immediateFile',
|
||||
customRender: render.renderImage,
|
||||
dataIndex: 'immediateFileMedia',
|
||||
},
|
||||
];
|
||||
|
||||
|
|
|
@ -8,22 +8,18 @@
|
|||
</template>
|
||||
|
||||
<template v-slot:bodyCell="{ column, record, index, text }">
|
||||
<template v-if="column.dataIndex === 'mp3File'">
|
||||
<template v-if="column.dataIndex === 'previewFileMedia'">
|
||||
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||
<audio controls v-else style="width: 100%; max-width: 300px; height: 40px;">
|
||||
<source :src="getFileAccessHttpUrl(text)">
|
||||
</audio>
|
||||
<img v-else :src="testOrgInfo.url + text" style="max-height: 50px;max-width: 80px;">
|
||||
</template>
|
||||
<template v-if="column.dataIndex === 'mp4File'">
|
||||
<template v-if="column.dataIndex === 'immediateFileMedia'">
|
||||
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||
<template v-else>
|
||||
<a-button type="primary" @click="openVideoModal(text)">播放视频</a-button>
|
||||
</template>
|
||||
<img v-else :src="testOrgInfo.url + text" style="max-height: 50px;max-width: 80px;">
|
||||
</template>
|
||||
</template>
|
||||
</BasicTable>
|
||||
|
||||
<ConfigServiceDirectiveModal ref="registerModal" @success="handleSuccess"></ConfigServiceDirectiveModal>
|
||||
<ConfigServiceDirectiveModal ref="registerModal" :testOrgInfo="testOrgInfo" @success="handleSuccess"></ConfigServiceDirectiveModal>
|
||||
|
||||
<a-modal v-model:visible="showVideoModal" title="视频播放" :footer="null" @cancel="closeVideoModal"
|
||||
:bodyStyle="{ padding: '0', maxHeight: '80vh', overflow: 'auto' }">
|
||||
|
@ -52,6 +48,10 @@ const props = defineProps({
|
|||
initialDataIds: { // 初始化数据ID
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
testOrgInfo: {//试验田机构信息
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -126,7 +126,7 @@ const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
|
|||
},
|
||||
beforeFetch: async (params) => {
|
||||
Object.assign(params, props.queryParams);
|
||||
params.dataSourceCode = 'A002';
|
||||
params.dataSourceCode = import.meta.env.VITE_SYTJGBM;
|
||||
params.column = 'createTime'
|
||||
params.order = 'desc'
|
||||
params.selectedRowIds = Array.from(selectedRowIds.value)
|
||||
|
@ -222,8 +222,8 @@ const getAllData = async (queryParams) => {
|
|||
const params = {
|
||||
...queryParams,
|
||||
pageNo: 1,
|
||||
pageSize: 9999, // 设置一个足够大的数获取所有数据
|
||||
dataSourceCode: 'A002',
|
||||
pageSize: -1,
|
||||
dataSourceCode: import.meta.env.VITE_SYTJGBM,
|
||||
column: 'createTime',
|
||||
order: 'desc'
|
||||
};
|
||||
|
|
|
@ -8,15 +8,14 @@
|
|||
<a-col :span="12">
|
||||
<a-form-item label="分类标签" v-bind="validateInfos.instructionTagId"
|
||||
id="ConfigServiceDirectiveForm-instructionTagId" name="instructionTagId">
|
||||
<j-dict-select-tag v-model:value="formData.instructionTagId" v-if="showJMCom" :orgCode="orgCodeParam"
|
||||
<j-dict-select-tag v-model:value="formData.instructionTagId" :orgCode="orgCodeParam"
|
||||
dictCode="instruction_tag" placeholder="请选择分类标签" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="服务类别" v-bind="validateInfos.categoryId" id="ConfigServiceDirectiveForm-categoryId"
|
||||
name="categoryId">
|
||||
<j-dict-select-tag type="list" v-model:value="formData.categoryId" v-if="showJMCom"
|
||||
:orgCode="orgCodeParam"
|
||||
<j-dict-select-tag type="list" v-model:value="formData.categoryId" :orgCode="orgCodeParam"
|
||||
:dictCode="`nu_config_service_category,category_name,id,del_flag = 0 order by sort asc`"
|
||||
placeholder="请选择服务类别" allow-clear />
|
||||
</a-form-item>
|
||||
|
@ -24,7 +23,7 @@
|
|||
<a-col :span="12">
|
||||
<a-form-item label="服务类型" v-bind="validateInfos.typeId" id="ConfigServiceDirectiveForm-typeId"
|
||||
name="typeId">
|
||||
<j-dict-select-tag type="list" v-model:value="formData.typeId" :dictCode="typeDictCode" v-if="showJMCom"
|
||||
<j-dict-select-tag type="list" v-model:value="formData.typeId" :dictCode="typeDictCode"
|
||||
:orgCode="orgCodeParam" placeholder="请选择服务类型" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
|
@ -51,22 +50,22 @@
|
|||
<a-col :span="12">
|
||||
<a-form-item label="医保报销" v-bind="validateInfos.izReimbursement"
|
||||
id="ConfigServiceDirectiveForm-izReimbursement" name="izReimbursement">
|
||||
<j-dict-select-tag type='radio' v-model:value="formData.izReimbursement" v-if="showJMCom"
|
||||
:orgCode="orgCodeParam" dictCode="med_ins_reimb" allowClear />
|
||||
<j-dict-select-tag type='radio' v-model:value="formData.izReimbursement" :orgCode="orgCodeParam"
|
||||
dictCode="med_ins_reimb" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="机构优惠" v-bind="validateInfos.izPreferential"
|
||||
id="ConfigServiceDirectiveForm-izPreferential" name="izPreferential">
|
||||
<j-dict-select-tag type='radio' v-model:value="formData.izPreferential" v-if="showJMCom"
|
||||
:orgCode="orgCodeParam" dictCode="institutional_discount" allowClear />
|
||||
<j-dict-select-tag type='radio' v-model:value="formData.izPreferential" :orgCode="orgCodeParam"
|
||||
dictCode="institutional_discount" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="周期类型" v-bind="validateInfos.cycleType" id="ConfigServiceDirectiveForm-cycleType"
|
||||
name="cycleType">
|
||||
<j-dict-select-tag type="list" v-model:value="formData.cycleType" v-if="showJMCom"
|
||||
:orgCode="orgCodeParam" dictCode="period_type" placeholder="请选择周期类型" allowClear />
|
||||
<j-dict-select-tag type="list" v-model:value="formData.cycleType" :orgCode="orgCodeParam"
|
||||
dictCode="period_type" placeholder="请选择周期类型" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
|
@ -84,81 +83,40 @@
|
|||
</a-col>
|
||||
</a-row>
|
||||
<a-row>
|
||||
<!-- <a-col :span="12">
|
||||
<a-form-item label="排序" v-bind="validateInfos.sort" id="ConfigServiceDirectiveForm-sort" name="sort">
|
||||
<a-input-number v-model:value="formData.sort" placeholder="请输入排序" style="width: 100%" />
|
||||
</a-form-item>
|
||||
</a-col> -->
|
||||
<a-col :span="24">
|
||||
<a-form-item label="体型标签" id="ConfigServiceDirectiveForm-typeId" :labelCol="labelCol2"
|
||||
:wrapperCol="wrapperCol2" name="typeId">
|
||||
<JCheckbox v-model:value="formData.bodyTags" v-if="showJMCom" :orgCode="orgCodeParam"
|
||||
<JCheckbox v-model:value="formData.bodyTags" :orgCode="orgCodeParam"
|
||||
:dictCode="`nu_config_body_tag,tag_name,id,del_flag = 0 order by sort asc`" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24">
|
||||
<a-form-item label="情绪标签" :labelCol="labelCol2" :wrapperCol="wrapperCol2" name="emoTags">
|
||||
<JCheckbox v-model:value="formData.emotionTags" v-if="showJMCom" :orgCode="orgCodeParam"
|
||||
<JCheckbox v-model:value="formData.emotionTags" :orgCode="orgCodeParam"
|
||||
:dictCode="`nu_config_emotion_tag,tag_name,id,del_flag = 0 order by sort asc`" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="是否启用" v-bind="validateInfos.izEnabled" id="ConfigServiceDirectiveForm-izEnabled"
|
||||
name="izEnabled">
|
||||
<j-dict-select-tag type='radio' v-model:value="formData.izEnabled" v-if="showJMCom"
|
||||
:orgCode="orgCodeParam" dictCode="iz_enabled" placeholder="请选择是否启用" allowClear />
|
||||
<j-dict-select-tag type='radio' v-model:value="formData.izEnabled" :orgCode="orgCodeParam"
|
||||
dictCode="iz_enabled" placeholder="请选择是否启用" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<!-- <a-col :span="12">
|
||||
<a-form-item label="创建人" v-bind="validateInfos.createBy" id="ConfigServiceDirectiveForm-createBy"
|
||||
name="createBy">
|
||||
<a-input v-model:value="formData.createBy" placeholder="请输入创建人" disabled allow-clear></a-input>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="创建日期" v-bind="validateInfos.createTime" id="ConfigServiceDirectiveForm-createTime"
|
||||
name="createTime">
|
||||
<a-date-picker placeholder="请选择创建日期" v-model:value="formData.createTime" showTime
|
||||
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" disabled allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="更新人" v-bind="validateInfos.updateBy" id="ConfigServiceDirectiveForm-updateBy"
|
||||
name="updateBy">
|
||||
<a-input v-model:value="formData.updateBy" placeholder="请输入更新人" disabled allow-clear></a-input>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="更新日期" v-bind="validateInfos.updateTime" id="ConfigServiceDirectiveForm-updateTime"
|
||||
name="updateTime">
|
||||
<a-date-picker placeholder="请选择更新日期" v-model:value="formData.updateTime" showTime
|
||||
value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" disabled allow-clear />
|
||||
</a-form-item>
|
||||
</a-col> -->
|
||||
</a-row>
|
||||
<a-row>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="预览图片" v-bind="validateInfos.previewFile">
|
||||
<JImageUpload :fileMax="1" v-model:value="formData.previewFile"></JImageUpload>
|
||||
<a-form-item label="预览图片">
|
||||
<span v-if="!formData.previewFileMedia" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||
<img v-else :src="testOrgInfo.url + formData.previewFileMedia"
|
||||
style="max-height: 100px;max-width: 100px;">
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="即时指令图片" v-bind="validateInfos.immediateFile">
|
||||
<JImageUpload :fileMax="1" v-model:value="formData.immediateFile"></JImageUpload>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
<a-row>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="语音文件" v-bind="validateInfos.mp3File" id="ConfigServiceDirectiveForm-mp3File"
|
||||
name="mp3File">
|
||||
<j-upload v-model:value="formData.mp3File" accept=".mp3" :disabled="true" :maxCount="1"></j-upload>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="视频文件" v-bind="validateInfos.mp4File" id="ConfigServiceDirectiveForm-mp4File"
|
||||
name="mp4File">
|
||||
<j-upload v-model:value="formData.mp4File" accept=".mp4" :disabled="true" :maxCount="1"></j-upload>
|
||||
<span v-if="!formData.immediateFileMedia" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||
<img v-else :src="testOrgInfo.url + formData.immediateFileMedia"
|
||||
style="max-height: 100px;max-width: 100px;">
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
</a-row>
|
||||
|
@ -170,17 +128,17 @@
|
|||
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol"
|
||||
name="ConfigServiceDirectiveForm">
|
||||
<a-row>
|
||||
<a-col :span="12" v-if="!!formData.mp3File">
|
||||
<a-form-item label="语音预览" id="ConfigServiceDirectiveForm-mp3File" name="mp3File">
|
||||
<a-col :span="12" v-if="!!formData.mp3FileMedia">
|
||||
<a-form-item label="语音预览">
|
||||
<audio controls disabled="false">
|
||||
<source :src="getFileAccessHttpUrl(formData.mp3File)">
|
||||
<source :src="testOrgInfo.url + formData.mp3FileMedia">
|
||||
</audio>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12" v-if="!!formData.mp4File" :push="!!formData.mp3File ? 0 : 12">
|
||||
<a-form-item label="视频预览" id="ConfigServiceDirectiveForm-mp4File" name="mp4File">
|
||||
<a-col :span="12" v-if="!!formData.mp4FileMedia" :push="!!formData.mp3FileMedia ? 0 : 12">
|
||||
<a-form-item label="视频预览">
|
||||
<video controls>
|
||||
<source :src="getFileAccessHttpUrl(formData.mp4File)">
|
||||
<source :src="testOrgInfo.url + formData.mp4FileMedia">
|
||||
</video>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
|
@ -192,8 +150,7 @@
|
|||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted, watch, onBeforeMount } from 'vue';
|
||||
import { initDictOptions } from '/@/utils/dict';
|
||||
import { ref, reactive, defineExpose, nextTick, defineProps, computed, watch } from 'vue';
|
||||
import { useMessage } from '/@/hooks/web/useMessage';
|
||||
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
|
||||
import { JCheckbox } from '/@/components/Form';
|
||||
|
@ -205,18 +162,16 @@ import { Form } from 'ant-design-vue';
|
|||
import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
|
||||
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
|
||||
|
||||
const orgCodeParam = ref('')
|
||||
const showJMCom = ref(false)
|
||||
onBeforeMount(async () => {
|
||||
const dictData = await initDictOptions('org_code')
|
||||
orgCodeParam.value = dictData.filter(d => d.text == 'shi_yan_tian')[0].value
|
||||
showJMCom.value = true
|
||||
})
|
||||
const orgCodeParam = import.meta.env.VITE_SYTJGBM
|
||||
|
||||
const props = defineProps({
|
||||
formDisabled: { type: Boolean, default: false },
|
||||
formData: { type: Object, default: () => ({}) },
|
||||
formBpm: { type: Boolean, default: true }
|
||||
formBpm: { type: Boolean, default: true },
|
||||
testOrgInfo: {//试验田机构信息
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
});
|
||||
const formRef = ref();
|
||||
const useForm = Form.useForm;
|
||||
|
@ -245,6 +200,10 @@ const formData = reactive<Record<string, any>>({
|
|||
mp4File: '',
|
||||
previewFile: '',
|
||||
immediateFile: '',
|
||||
previewFileMedia: '',
|
||||
immediateFileMedia: '',
|
||||
mp3FileMedia: '',
|
||||
mp4FileMedia: '',
|
||||
});
|
||||
const { createMessage } = useMessage();
|
||||
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 6 } });
|
||||
|
|
|
@ -1,78 +1,87 @@
|
|||
<template>
|
||||
<j-modal :title="title" width="70vw" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭" :maskClosable="false">
|
||||
<ConfigServiceDirectiveForm ref="registerForm" v-if="visible" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></ConfigServiceDirectiveForm>
|
||||
<j-modal :title="title" width="70vw" :visible="visible" @ok="handleOk"
|
||||
:okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭"
|
||||
:maskClosable="false">
|
||||
<ConfigServiceDirectiveForm ref="registerForm" v-if="visible" :testOrgInfo="testOrgInfo" @ok="submitCallback"
|
||||
:formDisabled="disableSubmit" :formBpm="false"></ConfigServiceDirectiveForm>
|
||||
</j-modal>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { ref, nextTick, defineExpose } from 'vue';
|
||||
import ConfigServiceDirectiveForm from './ConfigServiceDirectiveForm.vue'
|
||||
import JModal from '/@/components/Modal/src/JModal/JModal.vue';
|
||||
import { ref, nextTick, defineExpose } from 'vue';
|
||||
import ConfigServiceDirectiveForm from './ConfigServiceDirectiveForm.vue'
|
||||
import JModal from '/@/components/Modal/src/JModal/JModal.vue';
|
||||
import { array } from 'vue-types';
|
||||
|
||||
const title = ref<string>('');
|
||||
const visible = ref<boolean>(false);
|
||||
const disableSubmit = ref<boolean>(false);
|
||||
const registerForm = ref();
|
||||
const emit = defineEmits(['register', 'success']);
|
||||
const title = ref<string>('');
|
||||
const visible = ref<boolean>(false);
|
||||
const disableSubmit = ref<boolean>(false);
|
||||
const registerForm = ref();
|
||||
const emit = defineEmits(['register', 'success']);
|
||||
|
||||
const props = defineProps({
|
||||
testOrgInfo: {//试验田机构信息
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
/**
|
||||
* 新增
|
||||
*/
|
||||
function add() {
|
||||
function add() {
|
||||
title.value = '新增';
|
||||
visible.value = true;
|
||||
nextTick(() => {
|
||||
registerForm.value.add();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* 编辑
|
||||
* @param record
|
||||
*/
|
||||
function edit(record) {
|
||||
function edit(record) {
|
||||
title.value = disableSubmit.value ? '详情' : '编辑';
|
||||
visible.value = true;
|
||||
nextTick(() => {
|
||||
registerForm.value.edit(record);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* 确定按钮点击事件
|
||||
*/
|
||||
function handleOk() {
|
||||
function handleOk() {
|
||||
registerForm.value.submitForm();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* form保存回调事件
|
||||
*/
|
||||
function submitCallback() {
|
||||
function submitCallback() {
|
||||
handleCancel();
|
||||
emit('success');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* 取消按钮回调事件
|
||||
*/
|
||||
function handleCancel() {
|
||||
function handleCancel() {
|
||||
visible.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
defineExpose({
|
||||
add,
|
||||
edit,
|
||||
disableSubmit,
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="less">
|
||||
/**隐藏样式-modal确定按钮 */
|
||||
.jee-hidden {
|
||||
/**隐藏样式-modal确定按钮 */
|
||||
.jee-hidden {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style lang="less" scoped></style>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,327 +0,0 @@
|
|||
<template>
|
||||
<SyncComponent ref="syncComRef" :selectedSize="Array.from(selectedItems.values()).length"
|
||||
@changeShowJMCom="changeShowJMCom" @sourceOrgCodeChanged="sourceOrgCodeChanged"
|
||||
@viewTypeChanged="viewTypeChanged" @orgChanged="orgChanged">
|
||||
<!-- 表单 -->
|
||||
<template #searchFormSlot>
|
||||
<a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol"
|
||||
:wrapper-col="wrapperCol">
|
||||
<a-row :gutter="24">
|
||||
<a-col :lg="6">
|
||||
<a-form-item name="categoryId">
|
||||
<template #label><span title="服务类别">服务类别</span></template>
|
||||
<j-dict-select-tag type="list" v-model:value="queryParam.categoryId" v-if="showJMCom"
|
||||
:orgCode="sourceOrgCode"
|
||||
:dictCode="`nu_config_service_category,category_name,id,del_flag = 0 order by sort asc`"
|
||||
:ignoreDisabled="true" placeholder="请选择服务类别" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :lg="6">
|
||||
<a-form-item name="typeId">
|
||||
<template #label><span title="服务类型">服务类型</span></template>
|
||||
<j-dict-select-tag type="list" v-model:value="queryParam.typeId" v-if="showJMCom"
|
||||
:orgCode="sourceOrgCode"
|
||||
:dictCode="`nu_config_service_type,type_name,id,del_flag = 0 order by sort asc`"
|
||||
placeholder="请选择服务类型" :ignoreDisabled="true" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<!-- <template v-if="toggleSearchStatus"> -->
|
||||
<a-col :lg="6">
|
||||
<a-form-item name="directiveName">
|
||||
<template #label><span title="服务指令">服务指令</span></template>
|
||||
<JInput v-model:value="queryParam.directiveName" placeholder="请输入服务指令名称" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :lg="6">
|
||||
<a-form-item name="instructionTagId">
|
||||
<template #label><span title="分类标签">分类标签</span></template>
|
||||
<j-dict-select-tag v-model:value="queryParam.instructionTagId" v-if="showJMCom"
|
||||
:orgCode="sourceOrgCode" dictCode="instruction_tag" :ignoreDisabled="true"
|
||||
placeholder="请选分类标签" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :lg="6">
|
||||
<a-form-item name="bodyTags">
|
||||
<template #label><span title="体型标签">体型标签</span></template>
|
||||
<JSelectMultiple type="list" v-model:value="queryParam.bodyTags" v-if="showJMCom"
|
||||
:orgCode="sourceOrgCode"
|
||||
:dictCode="`nu_config_body_tag,tag_name,id,del_flag = '0' order by sort asc`"
|
||||
:ignoreDisabled="true" placeholder="请选择体型标签" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :lg="6">
|
||||
<a-form-item name="emotionTags">
|
||||
<template #label><span title="情绪标签">情绪标签</span></template>
|
||||
<JSelectMultiple type="list" v-model:value="queryParam.emotionTags" v-if="showJMCom"
|
||||
:orgCode="sourceOrgCode"
|
||||
:dictCode="`nu_config_emotion_tag,tag_name,id,del_flag = '0' order by sort asc`"
|
||||
:ignoreDisabled="true" placeholder="请选择情绪标签" allowClear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :xl="6" :lg="7" :md="8" :sm="24">
|
||||
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
|
||||
<a-col :lg="6">
|
||||
<a-button type="primary" preIcon="ant-design:search-outlined"
|
||||
@click="searchQuery">查询</a-button>
|
||||
<a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset"
|
||||
style="margin-left: 8px">重置</a-button>
|
||||
</a-col>
|
||||
</span>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-form>
|
||||
</template>
|
||||
|
||||
<!-- 试验田数据列表 -->
|
||||
<template #sourceTableSlot>
|
||||
<ConfigServiceDirectiveList @select-change="handleSelectChange" ref="listComRef" :queryParams="queryParam"
|
||||
:initialDataIds="initialDataIds" />
|
||||
</template>
|
||||
|
||||
<!-- 需要同步的机构的数据列表 -->
|
||||
<template #businessTableSlot>
|
||||
<a-table size="small" :columns="selectedColumns" :dataSource="Array.from(selectedItems.values())"
|
||||
:pagination="false" :scroll="{ y: '55vh' }">
|
||||
<template #bodyCell="{ column, record }">
|
||||
<template v-if="column.dataIndex === 'action'">
|
||||
<a-popconfirm placement="left" ok-text="确认" cancel-text="取消"
|
||||
@confirm="handleRemoveFromRight(record.id)">
|
||||
<template #title>
|
||||
<span>是否确认移除</span>
|
||||
</template>
|
||||
<a-button type="link" danger size="small"
|
||||
:disabled="initialDataIds.includes(record.id)">移除</a-button>
|
||||
</a-popconfirm>
|
||||
</template>
|
||||
<template v-else-if="column.dataIndex === 'mp3File'">
|
||||
<span v-if="!record.mp3File" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||
<audio controls v-else style="width: 100%; max-width: 300px; height: 40px;">
|
||||
<source :src="getFileAccessHttpUrl(record.mp3File)">
|
||||
</audio>
|
||||
</template>
|
||||
<template v-else-if="column.dataIndex === 'mp4File'">
|
||||
<span v-if="!record.mp4File" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||
<a-button v-else type="primary" size="small" @click="openVideoModal(record.mp4File)">
|
||||
播放视频
|
||||
</a-button>
|
||||
</template>
|
||||
<template v-else-if="column.dataIndex === 'bodyTagList'">
|
||||
<span v-if="!record.bodyTagList || record.bodyTagList.length === 0"
|
||||
style="font-size: 12px;font-style: italic;">-</span>
|
||||
<template v-else>
|
||||
{{record.bodyTagList.map(item => item.tagName).join('、')}}
|
||||
</template>
|
||||
</template>
|
||||
<template v-else-if="column.dataIndex === 'emotionTagList'">
|
||||
<span v-if="!record.emotionTagList || record.emotionTagList.length === 0"
|
||||
style="font-size: 12px;font-style: italic;">-</span>
|
||||
<template v-else>
|
||||
{{record.emotionTagList.map(item => item.tagName).join('、')}}
|
||||
</template>
|
||||
</template>
|
||||
<template v-else-if="column.dataIndex === 'previewFile'">
|
||||
<span v-if="!record.previewFile" style="font-size: 12px;font-style: italic;">无图片</span>
|
||||
<img v-else :src="getFileAccessHttpUrl(record.previewFile)"
|
||||
style="max-width: 100px; max-height: 60px;" />
|
||||
</template>
|
||||
<template v-else-if="column.dataIndex === 'immediateFile'">
|
||||
<span v-if="!record.immediateFile" style="font-size: 12px;font-style: italic;">无图片</span>
|
||||
<img v-else :src="getFileAccessHttpUrl(record.immediateFile)"
|
||||
style="max-width: 100px; max-height: 60px;" />
|
||||
</template>
|
||||
</template>
|
||||
</a-table>
|
||||
</template>
|
||||
</SyncComponent>
|
||||
|
||||
<a-modal v-model:visible="showVideoModal" title="视频播放" :footer="null" @cancel="closeVideoModal"
|
||||
:bodyStyle="{ padding: '0', maxHeight: '80vh', overflow: 'auto' }">
|
||||
<video controls style="width: 100%; max-height: '70vh'; display: block; margin: 0 auto;">
|
||||
<source :src="videoUrl">
|
||||
您的浏览器不支持视频播放。
|
||||
</video>
|
||||
</a-modal>
|
||||
</template>
|
||||
|
||||
<script setup name="synchronization-directive2" lang="ts">
|
||||
// ↓↓↓↓↓ 组件自带
|
||||
import { ref, reactive } from 'vue'
|
||||
import SyncComponent from '/@/components/Sync/SyncComponent.vue'
|
||||
import JInput from "/@/components/Form/src/jeecg/components/JInput.vue";
|
||||
import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue';
|
||||
import JSelectMultiple from '/@/components/Form/src/jeecg/components/JSelectMultiple.vue';
|
||||
import { useMessage } from "/@/hooks/web/useMessage";
|
||||
// ↑↑↑↑↑ 组件自带
|
||||
// ↓↓↓↓↓ 服务指令用
|
||||
import { list, asyncFunc } from '@/views/services/serviceDirective/ConfigServiceDirective.api';
|
||||
import ConfigServiceDirectiveList from '@/views/services/serviceDirective/ConfigServiceDirectiveList.vue'
|
||||
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils'
|
||||
import { selectedColumns } from './org.data';
|
||||
// ↑↑↑↑↑ 服务指令用
|
||||
|
||||
// >>>>>>>>>>>>>组件:无需处理代码
|
||||
const { createMessage } = useMessage();
|
||||
const syncComRef = ref(null)
|
||||
const sourceOrgCode = ref('')
|
||||
const showJMCom = ref(false)
|
||||
const labelCol = reactive({
|
||||
xs: 24,
|
||||
sm: 4,
|
||||
xl: 6,
|
||||
xxl: 5
|
||||
});
|
||||
const wrapperCol = reactive({
|
||||
xs: 24,
|
||||
sm: 20,
|
||||
});
|
||||
|
||||
/**
|
||||
* 获取到了试验田的机构编码
|
||||
* @param v_
|
||||
*/
|
||||
const sourceOrgCodeChanged = (v_) => {
|
||||
sourceOrgCode.value = v_
|
||||
}
|
||||
/**
|
||||
* 是否展示设计dict的cj框架封装的组件(因为需要获取的是对应试验田的数据字典,当接口数据请求未返回时如果展示组件会报错)
|
||||
* 跟sourceOrgCodeChanged方法相配合
|
||||
* @param v_
|
||||
*/
|
||||
const changeShowJMCom = (v_) => {
|
||||
showJMCom.value = v_
|
||||
}
|
||||
// <<<<<<<<<<<<<组件:无需处理代码
|
||||
/**
|
||||
* 机构变更
|
||||
*/
|
||||
const orgChanged = async (org) => {
|
||||
// 清空当前选择
|
||||
selectedItems.value.clear();
|
||||
// 清空初始化数据
|
||||
initialDataIds.value = [];
|
||||
try {
|
||||
// 加载新机构数据
|
||||
const res = await list({ dataSourceCode: org.orgCode, pageNo: 1, pageSize: -1 });
|
||||
// 如果有数据,更新右侧列表
|
||||
if (res.records && res.records.length > 0) {
|
||||
const newRecords = res.records;
|
||||
newRecords.forEach(record => {
|
||||
selectedItems.value.set(record.id, record);
|
||||
if (!syncComRef.value.orgData.value?.operationStartTime || new Date() >= new Date(syncComRef.value.orgData.value?.operationStartTime)) {
|
||||
initialDataIds.value.push(record.id);
|
||||
}
|
||||
});
|
||||
|
||||
// 更新左侧列表的选中状态
|
||||
listComRef.value?.updateSelection?.(newRecords);
|
||||
} else {
|
||||
// 没有数据时也确保清空
|
||||
selectedItems.value.clear();
|
||||
listComRef.value?.updateSelection?.([]);
|
||||
}
|
||||
|
||||
// 切换视图
|
||||
syncComRef.value.resetOrgSelectedCon(false);
|
||||
|
||||
console.log("🌊 ~ orgChanged ~ selectedItems.value:", selectedItems.value)
|
||||
} catch (err) {
|
||||
console.error('机构数据查询失败:', err);
|
||||
createMessage.error('机构数据查询失败');
|
||||
// 失败时也确保清空状态
|
||||
selectedItems.value.clear();
|
||||
listComRef.value?.updateSelection?.([]);
|
||||
}
|
||||
}
|
||||
// >>>>>>>>>>>>>组件:需要处理代码
|
||||
// <<<<<<<<<<<<<组件:需要处理代码
|
||||
|
||||
// >>>>>>>>>>>>>非组件代码
|
||||
const listComRef = ref();
|
||||
const selectedItems = ref(new Map<string | number, any>());
|
||||
const queryParam = ref({ viewType: 'all' })//源数据查询参数
|
||||
const initialDataIds = ref<string[]>([]);
|
||||
const showVideoModal = ref(false);
|
||||
const videoUrl = ref('');
|
||||
|
||||
/**
|
||||
* 查询
|
||||
*/
|
||||
function searchQuery() {
|
||||
listComRef.value.reload();
|
||||
}
|
||||
/**
|
||||
* 重置
|
||||
*/
|
||||
function searchReset() {
|
||||
let vt = queryParam.value.viewType
|
||||
queryParam.value = { viewType: vt }
|
||||
listComRef.value?.reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* 源数据的全部、已选择、未选择变更时触发
|
||||
* @param v_ all、selected、unselected
|
||||
*/
|
||||
const viewTypeChanged = (v_) => {
|
||||
queryParam.value.viewType = v_
|
||||
//组件内部监听了queryParam值的变化,自动刷新
|
||||
}
|
||||
const handleSelectChange = (items: Map<string | number, any>) => {
|
||||
selectedItems.value = new Map(items);
|
||||
};
|
||||
|
||||
const handleRemoveFromRight = (key: string | number) => {
|
||||
selectedItems.value.delete(key);
|
||||
listComRef.value?.removeSelectedItem?.(key);
|
||||
};
|
||||
|
||||
const openVideoModal = (url: string) => {
|
||||
videoUrl.value = getFileAccessHttpUrl(url);
|
||||
showVideoModal.value = true;
|
||||
};
|
||||
|
||||
const closeVideoModal = () => {
|
||||
showVideoModal.value = false;
|
||||
videoUrl.value = '';
|
||||
};
|
||||
// <<<<<<<<<<<<<非组件代码
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.jeecg-basic-table-form-container {
|
||||
padding: 0;
|
||||
|
||||
.table-page-search-submitButtons {
|
||||
display: block;
|
||||
margin-bottom: 24px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.query-group-cust {
|
||||
min-width: 100px !important;
|
||||
}
|
||||
|
||||
.query-group-split-cust {
|
||||
width: 30px;
|
||||
display: inline-block;
|
||||
text-align: center
|
||||
}
|
||||
|
||||
.ant-form-item:not(.ant-form-item-with-help) {
|
||||
margin-bottom: 16px;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
:deep(.ant-picker),
|
||||
:deep(.ant-input-number) {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.selected-list-container {
|
||||
:deep(.ant-table) {
|
||||
width: 100% !important;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -55,28 +55,16 @@ export const selectedColumns = [
|
|||
dataIndex: 'izEnabled_dictText',
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '语音文件',
|
||||
align: 'center',
|
||||
dataIndex: 'mp3File',
|
||||
width: 200, // 添加固定宽度
|
||||
},
|
||||
{
|
||||
title: '视频文件',
|
||||
align: 'center',
|
||||
dataIndex: 'mp4File',
|
||||
width: 120, // 添加固定宽度
|
||||
},
|
||||
{
|
||||
title: '预览图片',
|
||||
align: 'center',
|
||||
dataIndex: 'previewFile',
|
||||
dataIndex: 'previewFileMedia',
|
||||
width: 120, // 添加固定宽度
|
||||
},
|
||||
{
|
||||
title: '即时指令图片',
|
||||
align: 'center',
|
||||
dataIndex: 'immediateFile',
|
||||
dataIndex: 'immediateFileMedia',
|
||||
width: 150, // 添加固定宽度
|
||||
},
|
||||
{
|
||||
|
|
|
@ -74,10 +74,18 @@ const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data
|
|||
field: 'orgCode',
|
||||
show: false,
|
||||
},
|
||||
{
|
||||
field: 'url',
|
||||
show: !isChild,
|
||||
},
|
||||
{
|
||||
field: 'orgCategory',
|
||||
componentProps: { options: categoryOptions },
|
||||
},
|
||||
{
|
||||
field: 'payableAmount',
|
||||
show: !isChild,
|
||||
},
|
||||
]);
|
||||
|
||||
let record = unref(data?.record);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<a-card :bordered="false" style="height: 100%">
|
||||
<div class="j-table-operator" style="width: 100%">
|
||||
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="onAddDepart">新增机构</a-button>
|
||||
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="onAddChildDepart()">新增区域</a-button>
|
||||
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="onAddChildDepart()">新增部门</a-button>
|
||||
<!-- <a-upload name="file" :showUploadList="false" :customRequest="onImportXls">
|
||||
<a-button type="primary" preIcon="ant-design:import-outlined">导入</a-button>
|
||||
</a-upload>
|
||||
|
|
|
@ -3,31 +3,34 @@ import { FormSchema } from '/@/components/Form';
|
|||
// 部门基础表单
|
||||
export function useBasicFormSchema() {
|
||||
const basicFormSchema: FormSchema[] = [
|
||||
{
|
||||
field: 'departName',
|
||||
label: '名称',
|
||||
component: 'Input',
|
||||
componentProps: {
|
||||
placeholder: '请输入机构/部门名称',
|
||||
},
|
||||
rules: [{ required: true, message: '机构名称不能为空' }],
|
||||
},
|
||||
{
|
||||
field: 'parentId',
|
||||
label: '上级',
|
||||
component: 'TreeSelect',
|
||||
ifShow: (v_) => {
|
||||
return !!v_.values.parentId;
|
||||
},
|
||||
componentProps: {
|
||||
treeData: [],
|
||||
placeholder: '无',
|
||||
dropdownStyle: { maxHeight: '200px', overflow: 'auto' },
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'departName',
|
||||
label: '名称',
|
||||
component: 'Input',
|
||||
componentProps: {
|
||||
placeholder: '请输入名称',
|
||||
},
|
||||
rules: [{ required: true, message: '名称不能为空' }],
|
||||
},
|
||||
{
|
||||
field: 'orgCode',
|
||||
label: '编码',
|
||||
component: 'Input',
|
||||
componentProps: {
|
||||
placeholder: '请输入机构编码',
|
||||
placeholder: '请输入编码',
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -36,41 +39,83 @@ export function useBasicFormSchema() {
|
|||
component: 'RadioButtonGroup',
|
||||
componentProps: { options: [] },
|
||||
},
|
||||
{
|
||||
field: 'url',
|
||||
label: '协议域名',
|
||||
component: 'Input',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
componentProps: {
|
||||
placeholder: '请输入协议域名',
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'province',
|
||||
label: '省份',
|
||||
component: 'Input',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
slot: 'province',
|
||||
},
|
||||
{
|
||||
field: 'city',
|
||||
label: '城市',
|
||||
component: 'Input',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
slot: 'city',
|
||||
},
|
||||
{
|
||||
field: 'district',
|
||||
label: '区县',
|
||||
component: 'Input',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
slot: 'district',
|
||||
},
|
||||
{
|
||||
field: 'platType',
|
||||
label: '业务平台类型',
|
||||
defaultValue:'ywjg',
|
||||
defaultValue: 'ywjg',
|
||||
component: 'JDictSelectTag',
|
||||
componentProps: {
|
||||
dictCode: 'iz_test_site'
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
rules:[{
|
||||
componentProps: {
|
||||
dictCode: 'iz_test_site',
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请选择平台类型'
|
||||
}]
|
||||
message: '请选择平台类型',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'payableAmount',
|
||||
label: '入住应缴金额',
|
||||
component: 'InputNumber',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
required: true,
|
||||
message: '请填写护理单元长者入住应缴金额',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
field: 'operationStartTime',
|
||||
label: '运营开始时间',
|
||||
component: 'DatePicker',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD',
|
||||
style: {
|
||||
|
@ -82,6 +127,9 @@ export function useBasicFormSchema() {
|
|||
field: 'operationEndTime',
|
||||
label: '运营到期时间',
|
||||
component: 'DatePicker',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD',
|
||||
style: {
|
||||
|
@ -93,6 +141,9 @@ export function useBasicFormSchema() {
|
|||
field: 'contractStartTime',
|
||||
label: '合同开始时间',
|
||||
component: 'DatePicker',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD',
|
||||
style: {
|
||||
|
@ -104,6 +155,9 @@ export function useBasicFormSchema() {
|
|||
field: 'contractEndTime',
|
||||
label: '合同到期时间',
|
||||
component: 'DatePicker',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
componentProps: {
|
||||
valueFormat: 'YYYY-MM-DD',
|
||||
style: {
|
||||
|
@ -131,6 +185,9 @@ export function useBasicFormSchema() {
|
|||
field: 'address',
|
||||
label: '地址',
|
||||
component: 'Input',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
componentProps: {
|
||||
placeholder: '请输入地址',
|
||||
},
|
||||
|
@ -153,6 +210,9 @@ export function useBasicFormSchema() {
|
|||
field: 'picUrl',
|
||||
label: '机构图片',
|
||||
component: 'JImageUpload',
|
||||
ifShow: (v_) => {
|
||||
return !v_.values.parentId;
|
||||
},
|
||||
},
|
||||
];
|
||||
return { basicFormSchema };
|
||||
|
@ -163,9 +223,7 @@ export const orgCategoryOptions = {
|
|||
// 一级部门
|
||||
root: [{ value: '1', label: '机构' }],
|
||||
// 子级部门
|
||||
child: [
|
||||
{ value: '2', label: '区域' },
|
||||
],
|
||||
child: [{ value: '2', label: '部门' }],
|
||||
};
|
||||
|
||||
export const tplinkUseFormSchema: FormSchema[] = [
|
||||
|
@ -180,7 +238,7 @@ export const tplinkUseFormSchema: FormSchema[] = [
|
|||
label: '所属机构',
|
||||
component: 'Input',
|
||||
required: true,
|
||||
dynamicDisabled: true
|
||||
dynamicDisabled: true,
|
||||
},
|
||||
{
|
||||
field: 'tumsProjectId',
|
||||
|
@ -194,7 +252,7 @@ export const tplinkUseFormSchema: FormSchema[] = [
|
|||
label: '所属项目',
|
||||
component: 'Input',
|
||||
required: true,
|
||||
dynamicDisabled: true
|
||||
dynamicDisabled: true,
|
||||
},
|
||||
{
|
||||
field: 'tumsUsername',
|
||||
|
@ -213,7 +271,8 @@ export const tplinkUseFormSchema: FormSchema[] = [
|
|||
message: '请输入登录密码',
|
||||
},
|
||||
{
|
||||
pattern: /^(?!.*(.)\1{2})(?=(?:.*[0-9].*[A-Z])|(?:.*[0-9].*[a-z])|(?:.*[0-9].*[~!@#$%^&*()_+={[}\]|\\:;'"<,>.?/ -])|(?:.*[A-Z].*[a-z])|(?:.*[A-Z].*[~!@#$%^&*()_+={[}\]|\\:;'"<,>.?/ -])|(?:.*[a-z].*[~!@#$%^&*()_+={[}\]|\\:;'"<,>.?/ -]))[0-9A-Za-z~!@#$%^&*()_+={[}\]|\\:;'"<,>.?/ -]{8,64}$/,
|
||||
pattern:
|
||||
/^(?!.*(.)\1{2})(?=(?:.*[0-9].*[A-Z])|(?:.*[0-9].*[a-z])|(?:.*[0-9].*[~!@#$%^&*()_+={[}\]|\\:;'"<,>.?/ -])|(?:.*[A-Z].*[a-z])|(?:.*[A-Z].*[~!@#$%^&*()_+={[}\]|\\:;'"<,>.?/ -])|(?:.*[a-z].*[~!@#$%^&*()_+={[}\]|\\:;'"<,>.?/ -]))[0-9A-Za-z~!@#$%^&*()_+={[}\]|\\:;'"<,>.?/ -]{8,64}$/,
|
||||
message: '密码由8位数字、大小写字母和特殊符号组成!',
|
||||
},
|
||||
],
|
||||
|
|
Loading…
Reference in New Issue