17 小时以前 3838266e5b352349ed0ddfc7d1e01ea634c3d4eb
ai自动生成数据
已添加3个文件
已修改2个文件
618 ■■■■■ 文件已修改
doc/mock_data_check.md 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/mock_data_generate.md 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/mock/generate.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mock/dataCheck/index.vue 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vite.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/mock_data_check.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,183 @@
# æ•°æ®æ¨¡æ‹Ÿ - åŸºç¡€æ•°æ®æ£€æµ‹
## æ¶‰åŠé¡µé¢
- æ•°æ®æ¨¡æ‹Ÿæ“ä½œé¡µé¢ï¼ˆæ–°å¢žï¼‰
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | /mock/dataCheck | æ£€æµ‹æŒ‡å®šæ¨¡å—的基础数据是否就绪 |
**请求参数:**
| å‚æ•° | ç±»åž‹ | å¿…å¡« | è¯´æ˜Ž |
|------|------|------|------|
| modules | List\<String\> | æ˜¯ | è¦æ£€æµ‹çš„æ¨¡å—列表,可选值:sales(销售)、purchase(采购)、quality(质量)、production(生产) |
请求体示例:
```json
{ "modules": ["sales", "purchase", "quality", "production"] }
```
**响应:**
```json
{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "totalItems": 6,
    "passedItems": 3,
    "items": [
      {
        "module": "common",
        "itemName": "产品数据",
        "minRequired": 1,
        "currentCount": 5,
        "passed": true,
        "message": "通过"
      },
      {
        "module": "sales",
        "itemName": "客户数据",
        "minRequired": 1,
        "currentCount": 0,
        "passed": false,
        "message": "缺少客户数据,请先在【基础数据-客户管理】中添加至少1条客户"
      }
    ]
  }
}
```
## æ£€æµ‹è§„则
### é”€å”®æ¨¡å— (sales)
| æ£€æµ‹é¡¹ | æœ€ä½Žæ•°é‡ | æœªé€šè¿‡æç¤º |
|--------|----------|------------|
| äº§å“æ•°æ® | 1 | ç¼ºå°‘产品数据,请先在【基础数据-产品管理】中添加至少1条产品 |
| å®¢æˆ·æ•°æ® | 1 | ç¼ºå°‘客户数据,请先在【基础数据-客户管理】中添加至少1条客户 |
| æŠ¥ä»·å®¡æ‰¹æ¨¡æ¿ | 1 | ç¼ºå°‘报价审批模板,请先在【系统管理-审批模板】中创建报价审批模板 |
| å‘货审批模板 | 1 | ç¼ºå°‘发货审批模板,请先在【系统管理-审批模板】中创建发货审批模板 |
### é‡‡è´­æ¨¡å— (purchase)
| æ£€æµ‹é¡¹ | æœ€ä½Žæ•°é‡ | æœªé€šè¿‡æç¤º |
|--------|----------|------------|
| äº§å“æ•°æ® | 1 | ç¼ºå°‘产品数据,请先在【基础数据-产品管理】中添加至少1条产品 |
| ä¾›åº”商数据 | 1 | ç¼ºå°‘供应商数据,请先在【基础数据-供应商管理】中添加至少1条供应商 |
| é‡‡è´­å®¡æ‰¹æ¨¡æ¿ | 1 | ç¼ºå°‘采购审批模板,请先在【系统管理-审批模板】中创建采购审批模板 |
### ç”Ÿäº§æ¨¡å— (production)
| æ£€æµ‹é¡¹ | æœ€ä½Žæ•°é‡ | æœªé€šè¿‡æç¤º |
|--------|----------|------------|
| äº§å“æ•°æ® | 1 | ç¼ºå°‘产品数据,请先在【基础数据-产品管理】中添加至少1条产品 |
| äº§å“è§„æ ¼ | 1 | ç¼ºå°‘产品规格,请先在【基础数据-产品管理】中为产品添加规格型号 |
| å·¥åº | 1 | ç¼ºå°‘工序,请先在【工艺设计-工序管理】中创建工序 |
| BOM | 1 | ç¼ºå°‘BOM,请先在【工艺设计-BOM管理】中创建BOM |
| BOM产品结构 | 1 | ç¼ºå°‘BOM产品结构,请先在【工艺设计-BOM管理】中为BOM添加产品结构节点 |
| å·¥è‰ºè·¯çº¿ | 1 | ç¼ºå°‘工艺路线,请先在【工艺设计-工艺路线】中创建工艺路线 |
| å·¥è‰ºè·¯çº¿å·¥åº | 1 | ç¼ºå°‘工艺路线工序,请先在【工艺设计-工艺路线】中为工艺路线添加工序 |
| äº§å“-工艺路线关联 | â‰¥1 | éƒ¨åˆ†äº§å“è§„格未关联工艺路线,请先在【工艺设计-工艺路线】中为产品规格创建工艺路线 |
| å·¥è‰ºè·¯çº¿-工序关联 | â‰¥1 | éƒ¨åˆ†å·¥è‰ºè·¯çº¿æœªæ·»åŠ å·¥åºï¼Œè¯·å…ˆåœ¨ã€å·¥è‰ºè®¾è®¡-工艺路线】中为工艺路线添加工序 |
| BOM-产品结构关联 | â‰¥1 | éƒ¨åˆ†BOM未添加产品结构,请先在【工艺设计-BOM管理】中为BOM添加产品结构节点 |
### è´¨é‡æ¨¡å— (quality)
| æ£€æµ‹é¡¹ | æœ€ä½Žæ•°é‡ | æœªé€šè¿‡æç¤º |
|--------|----------|------------|
| äº§å“æ•°æ® | 1 | ç¼ºå°‘产品数据,请先在【基础数据-产品管理】中添加至少1条产品 |
| æ£€æµ‹æ ‡å‡† | 1 | ç¼ºå°‘检测标准,请先在【质量管理-检测标准】中创建检测标准 |
| æŒ‡æ ‡ç»‘定 | 1 | ç¼ºå°‘指标绑定,请先在【质量管理-检测标准绑定】中将检测标准与产品绑定 |
## å‰ç«¯ä¿®æ”¹ç‚¹
### 1. æ•°æ®æ¨¡æ‹Ÿé¡µé¢å…¥å£
在左侧菜单新增"数据模拟"菜单项,路由 `/mock`。
### 2. æ•°æ®æ£€æµ‹åŒºåŸŸ
```html
<template>
  <div class="mock-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>
      <el-button type="primary" @click="handleCheck" :loading="checking">
        å¼€å§‹æ£€æµ‹
      </el-button>
    </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">
        <el-table-column prop="module" label="模块" width="100" />
        <el-table-column prop="itemName" label="检测项" width="160" />
        <el-table-column prop="minRequired" label="最低要求" width="80" />
        <el-table-column prop="currentCount" label="当前数量" width="80" />
        <el-table-column label="状态" width="80">
          <template #default="{ row }">
            <el-tag :type="row.passed ? 'success' : 'danger'">
              {{ row.passed ? '通过' : '未通过' }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="message" label="提示" />
      </el-table>
    </el-card>
  </div>
</template>
```
### 3. data æ•°æ®
```js
data() {
  return {
    selectedModules: ['sales', 'purchase', 'quality', 'production'],
    checking: false,
    checkResult: null,
  }
}
```
### 4. æ–¹æ³•
```js
import request from '@/utils/request'
methods: {
  async handleCheck() {
    if (this.selectedModules.length === 0) {
      this.$message.warning('请至少选择一个模块')
      return
    }
    this.checking = true
    try {
      const res = await request.post('/mock/dataCheck', {
        modules: this.selectedModules
      })
      this.checkResult = res.data
    } finally {
      this.checking = false
    }
  }
}
```
## æ³¨æ„äº‹é¡¹
- äº§å“æ•°æ®ï¼ˆå…¬å…±åŸºç¡€ï¼‰åœ¨å¤šä¸ªæ¨¡å—间共享,检测结果中只出现一次,不会重复展示
- æ£€æµ‹ä»…做只读查询,不写入任何数据
- æ¨¡å—参数为空数组时返回空检测列表
- å»ºè®®åœ¨æ•°æ®æ¨¡æ‹Ÿå¼€å§‹å‰å…ˆè°ƒç”¨æ­¤æŽ¥å£ç¡®è®¤åŸºç¡€æ•°æ®å°±ç»ª
- ç”Ÿäº§æ¨¡å—除了检测数据量,还会检测关联性(产品-工艺路线、工艺路线-工序、BOM-产品结构),确保工艺设计数据完整
doc/mock_data_generate.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,243 @@
# æ•°æ®æ¨¡æ‹Ÿ - 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. æ•°æ®ç”ŸæˆåŒºåŸŸï¼ˆåœ¨æ•°æ®æ£€æµ‹åŒºåŸŸä¸‹æ–¹ï¼‰
```html
<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 æ•°æ®
```js
data() {
  return {
    generateForm: {
      modules: [],
      industries: [],
      countRange: [3, 10],
      dateRange: [],
      additionalInfo: '',
    },
    generating: false,
    generateResult: null,
  }
}
```
### 4. æ–¹æ³•
```js
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 ç­‰å­—段
src/api/mock/generate.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
import request from "@/utils/request";
// AI ç”Ÿæˆæ¨¡æ‹Ÿæ•°æ®ï¼ˆå«å‰ç½®åŸºç¡€æ•°æ®æ£€æµ‹ï¼‰
export function mockGenerate(data) {
  return request({
    url: "/mock/generate",
    method: "post",
    data,
  });
}
src/views/mock/dataCheck/index.vue
@@ -5,6 +5,7 @@
        <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">
@@ -35,17 +36,144 @@
        <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) {
@@ -60,6 +188,54 @@
    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>
vite.config.js
@@ -8,7 +8,7 @@
  const { VITE_APP_ENV } = env;
  const baseUrl =
      env.VITE_APP_ENV === "development"
          ? "http://1.15.17.182:9048"
          ? "http://localhost:7005"
          : env.VITE_BASE_API;
  const javaUrl =
      env.VITE_APP_ENV === "development"