<template>
|
<div class="app-container">
|
<el-card header="基础数据检测">
|
<el-checkbox-group v-model="selectedModules">
|
<el-checkbox label="sales">销售模块</el-checkbox>
|
<el-checkbox label="purchase">采购模块</el-checkbox>
|
<el-checkbox label="quality">质量模块</el-checkbox>
|
<el-checkbox label="production">生产模块</el-checkbox>
|
</el-checkbox-group>
|
<div style="margin-top: 16px">
|
<el-button type="primary" @click="handleCheck" :loading="checking">
|
开始检测
|
</el-button>
|
</div>
|
</el-card>
|
|
<el-card v-if="checkResult" header="检测结果" style="margin-top: 16px">
|
<el-alert
|
:title="`通过 ${checkResult.passedItems} / ${checkResult.totalItems} 项`"
|
:type="checkResult.passedItems === checkResult.totalItems ? 'success' : 'warning'"
|
:closable="false"
|
show-icon
|
/>
|
<el-table :data="checkResult.items" style="margin-top: 12px" border>
|
<el-table-column prop="module" label="模块" width="100" />
|
<el-table-column prop="itemName" label="检测项" width="160" />
|
<el-table-column prop="minRequired" label="最低要求" width="80" align="center" />
|
<el-table-column prop="currentCount" label="当前数量" width="80" align="center" />
|
<el-table-column label="状态" width="80" align="center">
|
<template #default="{ row }">
|
<el-tag :type="row.passed ? 'success' : 'danger'">
|
{{ row.passed ? "通过" : "未通过" }}
|
</el-tag>
|
</template>
|
</el-table-column>
|
<el-table-column prop="message" label="提示" min-width="200" />
|
</el-table>
|
</el-card>
|
|
<!-- AI 数据生成 -->
|
<el-card header="AI 数据生成" style="margin-top: 16px">
|
<el-form :model="generateForm" label-width="100px">
|
<el-form-item label="选择模块">
|
<el-checkbox-group v-model="generateForm.modules">
|
<el-checkbox label="sales">销售</el-checkbox>
|
<el-checkbox label="purchase">采购</el-checkbox>
|
<el-checkbox label="quality">质量</el-checkbox>
|
<el-checkbox label="production">生产</el-checkbox>
|
<el-checkbox label="stock">库存</el-checkbox>
|
</el-checkbox-group>
|
</el-form-item>
|
|
<el-form-item label="行业">
|
<el-select
|
v-model="generateForm.industries"
|
multiple
|
filterable
|
allow-create
|
placeholder="输入或选择行业"
|
>
|
<el-option label="机械制造" value="机械制造" />
|
<el-option label="食品加工" value="食品加工" />
|
<el-option label="电子装配" value="电子装配" />
|
<el-option label="汽车零部件" value="汽车零部件" />
|
<el-option label="医疗器械" value="医疗器械" />
|
<el-option label="化工材料" value="化工材料" />
|
<el-option label="纺织服装" value="纺织服装" />
|
<el-option label="家具制造" value="家具制造" />
|
</el-select>
|
</el-form-item>
|
|
<el-row :gutter="16">
|
<el-col :span="12">
|
<el-form-item label="生成条数">
|
<el-slider
|
v-model="generateForm.countRange"
|
range
|
:min="1"
|
:max="50"
|
:marks="{ 1: '1', 10: '10', 20: '20', 50: '50' }"
|
/>
|
</el-form-item>
|
</el-col>
|
<el-col :span="12">
|
<el-form-item label="时间范围">
|
<el-date-picker
|
v-model="generateForm.dateRange"
|
type="daterange"
|
range-separator="至"
|
start-placeholder="开始日期"
|
end-placeholder="结束日期"
|
value-format="YYYY-MM-DD"
|
unlink-panels
|
/>
|
</el-form-item>
|
</el-col>
|
</el-row>
|
|
<el-form-item label="补充信息">
|
<el-input
|
v-model="generateForm.additionalInfo"
|
type="textarea"
|
:rows="2"
|
placeholder="如:产品以金属零部件为主,客户集中在华东地区"
|
/>
|
</el-form-item>
|
|
<el-form-item>
|
<el-button type="primary" @click="handleGenerate" :loading="generating">
|
开始生成
|
</el-button>
|
<el-button @click="handleCheckFirst" :loading="checking">
|
先检测再生成
|
</el-button>
|
</el-form-item>
|
</el-form>
|
</el-card>
|
|
<!-- 生成结果 -->
|
<el-card v-if="generateResult" header="生成结果" style="margin-top: 16px">
|
<el-alert
|
:title="`共生成 ${generateResult.totalGenerated} 条数据`"
|
type="success"
|
:closable="false"
|
show-icon
|
/>
|
<el-table :data="generateResult.moduleSummaries" style="margin-top: 12px" border>
|
<el-table-column prop="module" label="模块" width="100" />
|
<el-table-column prop="entityName" label="实体名称" width="160" />
|
<el-table-column prop="generatedCount" label="生成条数" width="80" align="center" />
|
<el-table-column prop="successCount" label="成功" width="80" align="center">
|
<template #default="{ row }">
|
<el-tag type="success">{{ row.successCount }}</el-tag>
|
</template>
|
</el-table-column>
|
<el-table-column prop="failCount" label="失败" width="80" align="center">
|
<template #default="{ row }">
|
<el-tag v-if="row.failCount > 0" type="danger">{{ row.failCount }}</el-tag>
|
<span v-else>0</span>
|
</template>
|
</el-table-column>
|
</el-table>
|
<div v-if="generateResult.errors && generateResult.errors.length > 0" style="margin-top: 12px">
|
<el-alert
|
v-for="(err, i) in generateResult.errors"
|
:key="i"
|
:title="err"
|
type="error"
|
:closable="false"
|
style="margin-bottom: 4px"
|
/>
|
</div>
|
</el-card>
|
</div>
|
</template>
|
|
<script setup>
|
import { ref, reactive } from "vue";
|
import { ElMessage } from "element-plus";
|
import { dataCheck } from "@/api/mock/dataCheck.js";
|
import { mockGenerate } from "@/api/mock/generate.js";
|
|
const selectedModules = ref(["sales", "purchase", "quality", "production"]);
|
const checking = ref(false);
|
const checkResult = ref(null);
|
|
const generateForm = reactive({
|
modules: [],
|
industries: [],
|
countRange: [3, 10],
|
dateRange: [],
|
additionalInfo: "",
|
});
|
|
const generating = ref(false);
|
const generateResult = ref(null);
|
|
const handleCheck = async () => {
|
if (selectedModules.value.length === 0) {
|
ElMessage.warning("请至少选择一个模块");
|
return;
|
}
|
checking.value = true;
|
try {
|
const res = await dataCheck(selectedModules.value);
|
checkResult.value = res.data;
|
} finally {
|
checking.value = false;
|
}
|
};
|
|
// 直接生成(内部自动检测)
|
const handleGenerate = async () => {
|
if (generateForm.modules.length === 0) {
|
ElMessage.warning("请至少选择一个模块");
|
return;
|
}
|
generating.value = true;
|
try {
|
const res = await mockGenerate({
|
modules: generateForm.modules,
|
industries: generateForm.industries,
|
countMin: generateForm.countRange[0],
|
countMax: generateForm.countRange[1],
|
dateStart: generateForm.dateRange[0] || null,
|
dateEnd: generateForm.dateRange[1] || null,
|
additionalInfo: generateForm.additionalInfo,
|
});
|
generateResult.value = res.data;
|
ElMessage.success(`成功生成 ${res.data.totalGenerated} 条数据`);
|
} catch (err) {
|
// code 500 时响应拦截器会弹错误提示,此处不再重复提示
|
// 若需要展示检测结果,需要后端在非200时也返回数据,此处暂不处理
|
} finally {
|
generating.value = false;
|
}
|
};
|
|
// 先检测再生成
|
const handleCheckFirst = async () => {
|
if (generateForm.modules.length === 0) {
|
ElMessage.warning("请至少选择一个模块");
|
return;
|
}
|
checking.value = true;
|
try {
|
const res = await dataCheck(generateForm.modules);
|
const result = res.data;
|
if (result.passedItems === result.totalItems) {
|
await handleGenerate();
|
} else {
|
checkResult.value = result;
|
ElMessage.warning("请先补齐基础数据后再生成");
|
}
|
} finally {
|
checking.value = false;
|
}
|
};
|
</script>
|
|
<style scoped></style>
|