liding
2026-06-24 ec226b03fbd26bc178137ad20d7bd030ef2c5c8b
src/views/mock/dataCheck/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,241 @@
<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>