This commit is contained in:
2026-04-02 15:29:09 +08:00
9 changed files with 180 additions and 80 deletions

View File

@@ -0,0 +1,9 @@
import { post } from '@/api/request';
const env = import.meta.env;
const PREFIX = env.VITE_API_PREFIX_SYSTEM;
// 同步利元亨的工种
export const syncLyricUsersApi = () => {
return post(`${PREFIX}lyricUser/syncLyricUsers`);
};

View File

@@ -97,3 +97,7 @@ export const getSimulationPoolTaskApi = (params: {
}) => {
return get(`${PREFIX}taskpool/getSimulationPoolTask`, params);
};
export const updateTaskPoolBriefApi = (params: any) => {
return post(`${PREFIX}taskpool/updateTaskPoolBrief`, params);
};

View File

@@ -770,11 +770,23 @@ const createTaskPoolFun = async (formData: any) => {
const wrappedNodes = wrapWithVirtualNodeFun(nodes);
const pickedNodes = transformTreeToPoolNodes(wrappedNodes);
const poolBrief = {
poolName: currentPoolBrief.value.poolName,
tenantId: currentPoolBrief.value.tenantId,
};
Object.keys(currentPoolBrief.value).forEach((key) => {
if (key !== 'poolName' && key !== 'tenantId' && key !== 'versions') {
poolBrief[key] = currentPoolBrief.value[key];
}
});
if (formData.poolBriefData) {
Object.assign(poolBrief, formData.poolBriefData);
}
const req = {
poolBrief: {
poolName: currentPoolBrief.value.poolName,
tenantId: currentPoolBrief.value.tenantId,
},
poolBrief,
nodes: pickedNodes,
bApprove: formData.bApprove,
approveTemplateId: formData.approveTemplateId,

View File

@@ -145,6 +145,7 @@ export const poolNodePropPickMap = {
'days',
'flowTemplate',
'standard',
'exceptionFile',
'reportTemplate',
'analyseTarget',
'confidence',

View File

@@ -5,33 +5,40 @@
show-cancel-button
show-confirm-button
:confirm-closable="false"
:diaTitle="mode === 'add' ? $t('知识库.新增') : $t('知识库.编辑')"
:diaTitle="mode === 'add' ? $t('通用.新增') : $t('通用.编辑')"
:width="500"
>
<template #default>
<el-form ref="formRef" :rules="rules" :model="form" labelWidth="80">
<el-form-item :label="$t('知识库.名称')" prop="name">
<el-input v-model="form.name" />
</el-form-item>
</el-form>
<TableForm
ref="tableFormRef"
:tableName="TABLE_NAME.TASK_POOL_CARD_LIST"
v-model:data="formData"
:formAttrs="{ poolName: { disabled: mode === 'edit' } }"
/>
</template>
<template #footer>
<div>
<el-button @click="onCancelFun">{{ $t('通用.取消') }}</el-button>
<el-button type="primary" @click="onConfirmFun">{{ $t('通用.确定') }}</el-button>
<el-button type="primary" :loading="loading" @click="onConfirmFun">
{{ $t('通用.确定') }}
</el-button>
</div>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ref, onMounted, computed, reactive, watchEffect, watch } from 'vue';
import { ref, computed, watch } from 'vue';
import { ElMessage } from 'element-plus';
import Dialog from '@/components/common/dialog/index.vue';
import type { FormInstance, FormRules } from 'element-plus';
import TableForm from '@/components/common/table/tableForm.vue';
import { useI18n } from 'vue-i18n';
import { TABLE_NAME } from '@/utils/enum/tableName';
import { updateTaskPoolBriefApi } from '@/api/task/taskpool';
import type { Pool } from './types';
const { t } = useI18n();
interface Props {
modelValue: boolean;
detail: any;
@@ -47,78 +54,70 @@ const props = withDefaults(defineProps<Props>(), {
});
const emits = defineEmits(['update:modelValue', 'confirm']);
const form = ref({
name: '',
});
const visible = computed({
get: () => props.modelValue,
set: (val) => emits('update:modelValue', val),
});
watchEffect(() => {
if (props.detail && props.mode === 'edit') {
form.value.name = props.detail.originalName;
} else {
form.value.name = '';
}
});
const tableFormRef = ref();
const formData = ref<any>({});
const loading = ref(false);
watch(
() => props.modelValue,
(val) => {
if (val) {
resetFun();
if (props.detail && props.mode === 'edit') {
form.value.name = props.detail.originalName;
if (props.mode === 'edit' && props.detail) {
formData.value = { ...props.detail };
} else {
form.value.name = '';
formData.value = {};
}
}
}
);
const resetFun = () => {
if (!formRef.value) {
return;
}
formRef.value.resetFields();
};
const formRef = ref<FormInstance>();
interface RuleForm {
name: string;
}
const rules = reactive<FormRules<RuleForm>>({
name: [
{ required: true, message: t('知识库.请输入名称'), trigger: 'blur' },
{
validator: (rule: any, value: any, callback: any) => {
if (props.poolList && props.poolList.length > 0) {
const isExist = props.poolList.some((item: Pool) => item.poolName === value);
if (isExist) {
callback(new Error('名称已存在'));
} else {
callback();
}
} else {
callback();
}
},
trigger: 'blur',
},
],
});
const onCancelFun = () => {
visible.value = false;
};
const onConfirmFun = async () => {
if (!formRef.value) {
if (!tableFormRef.value) {
return;
}
await formRef.value.validate((valid) => {
if (valid) {
emits('confirm', form.value);
const valid = await tableFormRef.value.validateFun();
if (!valid) {
return;
}
const formValues = formData.value;
if (props.mode === 'add' && props.poolList && props.poolList.length > 0) {
const isExist = props.poolList.some((item: Pool) => item.poolName === formValues.poolName);
if (isExist) {
ElMessage.warning('名称已存在');
return;
}
});
}
if (props.mode === 'edit') {
loading.value = true;
try {
const res: any = await updateTaskPoolBriefApi(formValues);
if (res && res.code === 200) {
ElMessage.success(res.message || t('通用.操作成功'));
emits('confirm', formValues);
visible.value = false;
}
} catch (error) {
console.error('更新工况库失败', error);
} finally {
loading.value = false;
}
} else {
emits('confirm', formValues);
visible.value = false;
}
};
onMounted(async () => {});
</script>

View File

@@ -1,6 +1,10 @@
<template>
<div class="pool-card" @click="cardClickFun">
<img class="cover-img" :src="index % 2 !== 0 ? projectBlue : projectGreen" alt="" />
<img
class="cover-img"
:src="coverImgMap[pool.iconFile ? 'custom' : index % 2 !== 0 ? 'blue' : 'green']"
alt=""
/>
<div class="overlay-text">
<div class="pool-title" :title="pool.poolName">{{ pool.poolName }}</div>
</div>
@@ -36,8 +40,9 @@
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { computed, ref } from 'vue';
import { MoreFilled } from '@element-plus/icons-vue';
import { FileUtil } from '@/utils/file';
import projectBlue from '@/assets/imgs/projectList/project-blue.png';
import projectGreen from '@/assets/imgs/projectList/project-green.png';
@@ -55,6 +60,15 @@ const props = withDefaults(defineProps<Props>(), {
const emit = defineEmits(['cardClick', 'actionClick']);
const coverImgMap = computed(() => {
const firstIconFile = props.pool.iconFile ? props.pool.iconFile.split(',')[0] : '';
return {
custom: FileUtil.getFilePreviewImgPathUrl(firstIconFile),
blue: projectBlue,
green: projectGreen,
};
});
const isDropdownVisible = ref(false);
const cardClickFun = () => {

View File

@@ -31,7 +31,7 @@
</span>
</template>
<template #leftOptions>
<el-button type="primary" icon="plus" @click="addPoolModalVisible = true">
<el-button type="primary" icon="plus" @click="openAddPoolFun">
{{ $t('工况库.创建地图库') }}
</el-button>
</template>
@@ -49,8 +49,8 @@
/>
<AddPoolModal
v-model="addPoolModalVisible"
mode="add"
:detail="{}"
:mode="poolModalMode"
:detail="editPoolData"
:poolList="poolListData"
@confirm="onAddPoolConfirmFun"
/>
@@ -83,6 +83,13 @@ const actionList = ref([
cardClickFun(row);
},
},
{
title: '编辑',
type: 'primary',
click: (row: any) => {
openEditPoolFun(row);
},
},
{
title: '删除',
type: 'danger',
@@ -148,15 +155,35 @@ const onDelPoolConfirmFun = () => {
const addPoolModalVisible = ref(false);
const poolListData = ref<any[]>([]);
const editPoolData = ref<any>(null);
const poolModalMode = ref<'add' | 'edit'>('add');
const openAddPoolFun = () => {
editPoolData.value = null;
poolModalMode.value = 'add';
addPoolModalVisible.value = true;
};
const openEditPoolFun = (row: any) => {
editPoolData.value = row;
poolModalMode.value = 'edit';
addPoolModalVisible.value = true;
};
const onAddPoolConfirmFun = (formData: any) => {
addPoolModalVisible.value = false;
jumpPage({
path: `${route.path}/detail`,
query: {
poolName: formData.name,
isNew: 'true',
},
});
if (poolModalMode.value === 'edit') {
baseTableRef.value?.resetFun();
} else {
jumpPage({
path: `${route.path}/detail`,
query: {
poolName: formData.poolName,
isNew: 'true',
poolBriefData: JSON.stringify(formData),
},
});
}
};
</script>

View File

@@ -543,11 +543,24 @@ const createTaskPoolFun = async (formData: any) => {
const columns = getVxeRef()?.getColumns();
const nodes = cloneDeep(fullData);
const pickedNodes = transformTreeToPoolNodes(nodes);
const poolBrief = {
poolName: currentPoolBrief.value.poolName,
tenantId: currentPoolBrief.value.tenantId,
};
Object.keys(currentPoolBrief.value).forEach((key) => {
if (key !== 'poolName' && key !== 'tenantId' && key !== 'versions') {
poolBrief[key] = currentPoolBrief.value[key];
}
});
if (formData.poolBriefData) {
Object.assign(poolBrief, formData.poolBriefData);
}
const req = {
poolBrief: {
poolName: currentPoolBrief.value.poolName,
tenantId: currentPoolBrief.value.tenantId,
},
poolBrief,
nodes: pickedNodes,
bApprove: formData.bApprove,
approveTemplateId: formData.approveTemplateId,
@@ -1288,11 +1301,22 @@ const onListTableFilterConfirmFun = (params: any) => {
const initPageDataFun = async () => {
const queryPoolName = route.query?.poolName as string;
const isNewPool = route.query?.isNew === 'true';
const poolBriefDataStr = route.query?.poolBriefData as string;
if (isNewPool && queryPoolName) {
let poolBriefData = {};
if (poolBriefDataStr) {
try {
poolBriefData = JSON.parse(poolBriefDataStr);
} catch (error) {
console.error('解析 poolBriefData 失败', error);
}
}
const newPool = {
tenantId,
poolName: queryPoolName,
...poolBriefData,
};
const { pools } = await getEarlyPoolData(true);
poolList.value = pools;

View File

@@ -10,7 +10,7 @@
:hide-pagination="true"
>
<template #leftOptions>
<!-- <el-button type="primary">同步</el-button> -->
<el-button type="primary" @click="syncFun">同步</el-button>
<el-button type="primary" @click="openDialog('add')">新增</el-button>
</template>
</BaseTable>
@@ -53,6 +53,7 @@ import {
} from '@/api/system/systemData';
import { ElMessage } from 'element-plus';
import { cloneDeep } from 'lodash-es';
import { syncLyricUsersApi } from '@/api/system/lyricUser';
const tableData = ref<any>([]);
const isEditDialog = ref(false);
@@ -169,6 +170,15 @@ const updateDataFun = async () => {
} catch {}
};
const syncFun = async () => {
try {
const res: any = await syncLyricUsersApi();
if (res && res.code === 200) {
await getTableDataFun();
}
} catch {}
};
onMounted(async () => {
await getTableDataFun();
});