| | |
| | | <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-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 } from "vue"; |
| | | 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"]); |
| | | 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) { |
| | |
| | | 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> |
| | | <style scoped></style> |