编辑 | blame | 历史 | 原始文档

数据模拟 - AI 数据生成

涉及页面

  • 数据模拟操作页面(新增/修改)

API

方法 路径 说明
POST /mock/generate AI 生成模拟数据(含前置基础数据检测)

请求参数:

参数 类型 必填 说明
modules List<String> 要生成数据的模块:sales(销售)、purchase(采购)、quality(质量)、production(生产)、stock(库存)
industries List<String> 行业,如:["机械制造", "食品加工", "电子装配"]
countMin int 每个实体生成条数最小值,默认 3
countMax int 每个实体生成条数最大值,默认 10
dateStart String 时间范围开始(yyyy-MM-dd)
dateEnd String 时间范围结束(yyyy-MM-dd)
additionalInfo String 其他补充描述,如"产品以金属零部件为主"

请求体示例:
json { "modules": ["sales", "purchase", "quality"], "industries": ["机械制造", "电子装配"], "countMin": 3, "countMax": 8, "dateStart": "2026-01-01", "dateEnd": "2026-06-01", "additionalInfo": "产品以金属零部件和电子元器件为主" }

响应(成功):
json { "code": 200, "msg": "操作成功", "data": { "status": "SUCCESS", "totalGenerated": 24, "moduleSummaries": [ { "module": "sales", "entityName": "客户", "generatedCount": 5, "successCount": 5, "failCount": 0 }, { "module": "sales", "entityName": "销售台账", "generatedCount": 5, "successCount": 5, "failCount": 0 }, { "module": "purchase", "entityName": "供应商", "generatedCount": 4, "successCount": 4, "failCount": 0 }, { "module": "purchase", "entityName": "采购台账", "generatedCount": 4, "successCount": 4, "failCount": 0 }, { "module": "quality", "entityName": "检测标准", "generatedCount": 3, "successCount": 3, "failCount": 0 }, { "module": "quality", "entityName": "指标绑定", "generatedCount": 3, "successCount": 3, "failCount": 0 } ], "errors": [], "checkResult": null } }

响应(基础数据不足,前置检测未通过):
json { "code": 500, "msg": "基础数据不足,请先补充后再生成", "data": { "status": "CHECK_FAILED", "checkResult": { "totalItems": 6, "passedItems": 3, "items": [ { "module": "common", "itemName": "产品数据", "passed": true, "message": "通过" }, { "module": "sales", "itemName": "客户数据", "passed": false, "message": "缺少客户数据,请先..." } ] } } }

工作流程

  1. 用户在页面选择模块 + 填写行业/数量/时间等信息
  2. 调用 POST /mock/generate
  3. 后端首先调用 POST /mock/dataCheck 检测基础数据是否就绪
  4. 若基础数据不足,返回检测结果,提示用户先补齐
  5. 若基础数据就绪,调用 AI 大模型生成符合行业特征的 JSON 数据
  6. 按依赖顺序创建数据(客户→销售台账、供应商→采购台账、检测标准→指标绑定...)
  7. 返回生成摘要

前端修改点

1. 数据生成区域(在数据检测区域下方)

<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"
          />
        </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>

3. data 数据

data() {
  return {
    generateForm: {
      modules: [],
      industries: [],
      countRange: [3, 10],
      dateRange: [],
      additionalInfo: '',
    },
    generating: false,
    generateResult: null,
  }
}

4. 方法

methods: {
  // 直接生成(内部自动检测)
  async handleGenerate() {
    if (this.generateForm.modules.length === 0) {
      this.$message.warning('请至少选择一个模块')
      return
    }
    this.generating = true
    try {
      const res = await request.post('/mock/generate', {
        modules: this.generateForm.modules,
        industries: this.generateForm.industries,
        countMin: this.generateForm.countRange[0],
        countMax: this.generateForm.countRange[1],
        dateStart: this.generateForm.dateRange[0] || null,
        dateEnd: this.generateForm.dateRange[1] || null,
        additionalInfo: this.generateForm.additionalInfo,
      })
      if (res.code === 200) {
        this.generateResult = res.data
        this.$message.success(`成功生成 ${res.data.totalGenerated} 条数据`)
      } else {
        // 基础数据不足
        this.generateResult = res.data
        this.checkResult = res.data.checkResult
        this.$message.warning(res.msg)
      }
    } finally {
      this.generating = false
    }
  },

  // 先检测再生成
  async handleCheckFirst() {
    await this.handleCheck()
    if (this.checkResult && this.checkResult.passedItems === this.checkResult.totalItems) {
      await this.handleGenerate()
    } else {
      this.$message.warning('请先补齐基础数据后再生成')
    }
  },
}

注意事项

  • POST /mock/generate 内部会自动调用数据检测,不需要手动分两步走
  • AI 生成的数据会尽量符合行业特征,但建议生成后检查关键数据的合理性
  • 生产模块和库存模块依赖产品数据(Product/ProductModel),请确保基础数据中有产品
  • 销售台账的合同金额由产品明细自动计算,AI 只需生成产品行的单价和数量
  • 产生的数据通过服务层创建,会自动填充 tenantId/deptId/createUser 等字段