瀏覽代碼

feat(forecast-form): 添加下载模板功能并简化物料管理

yz 1 月之前
父節點
當前提交
2c9a906a60
共有 2 個文件被更改,包括 53 次插入36 次删除
  1. 44 4
      src/components/forecast-form/forecast-form-mixin.js
  2. 9 32
      src/components/forecast-form/index.vue

+ 44 - 4
src/components/forecast-form/forecast-form-mixin.js

@@ -59,7 +59,7 @@
 
 // API接口导入
 import { addForecast, updateForecast, getForecastDetail } from '@/api/forecast'
-import { addSalesForecastMain, updateSalesForecastMain, getSalesForecastSummaryByMonth } from '@/api/forecast/forecast-summary'
+import { addSalesForecastMain, updateSalesForecastMain, getSalesForecastSummaryByMonth, exportSalesForecastTemplate } from '@/api/forecast/forecast-summary'
 import { getUserLinkGoods } from '@/api/order/sales-order'
 
 // 常量和枚举导入
@@ -212,6 +212,9 @@ export default {
       /** 表单加载状态 */
       formLoading: false,
 
+      /** 模板下载加载状态 */
+      templateLoading: false,
+
       /** 客户选项列表
        * @type {Array<CustomerOption>}
        */
@@ -1317,6 +1320,44 @@ export default {
     },
 
     /**
+     * 下载销售预测模板
+     * @returns {Promise<void>}
+     * @this {ForecastFormMixinComponent & Vue}
+     */
+    async handleDownloadTemplate() {
+      try {
+        this.templateLoading = true
+
+        const res = await exportSalesForecastTemplate()
+
+        // 处理文件名:优先取响应头,其次回退默认名
+        const disposition = res?.headers?.['content-disposition'] || res?.headers?.['Content-Disposition']
+        let filename = '销售预测模板.xlsx'
+        if (disposition) {
+          const utf8Match = /filename\*=UTF-8''([^;\n]+)/i.exec(disposition)
+          const plainMatch = /filename="?([^;\n"]+)"?/i.exec(disposition)
+          const raw = utf8Match ? decodeURIComponent(utf8Match[1]) : (plainMatch ? plainMatch[1] : '')
+          if (raw) filename = raw
+        }
+
+        const blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
+        const url = window.URL.createObjectURL(blob)
+        const a = document.createElement('a')
+        a.href = url
+        a.download = filename
+        document.body.appendChild(a)
+        a.click()
+        document.body.removeChild(a)
+        window.URL.revokeObjectURL(url)
+      } catch (e) {
+        console.error('下载模板失败:', e)
+        this.$message && this.$message.error('下载模板失败,请稍后重试')
+      } finally {
+        this.templateLoading = false
+      }
+    },
+
+    /**
      * 导入所选物料到下方表格
      * @description 仅在点击"导入物料"按钮后,将选择的物料行添加到表格,默认预测数量为 1
      * @returns {void}
@@ -1381,7 +1422,7 @@ export default {
           return
         }
 
-        await this.$confirm('确认删除该物料吗?删除后可重新通过上方选择器导入。', '提示', {
+        await this.$confirm('确认删除该物料吗?', '提示', {
           type: 'warning',
           confirmButtonText: '删除',
           cancelButtonText: '取消'
@@ -1504,7 +1545,7 @@ export default {
           return
         }
 
-        await this.$confirm('确认删除已选中的物料吗?删除后可重新通过上方选择器导入。', '提示', {
+        await this.$confirm('确认删除已选中的物料吗?', '提示', {
           type: 'warning',
           confirmButtonText: '删除',
           cancelButtonText: '取消'
@@ -1734,4 +1775,3 @@ export default {
     },
   }
 }
-

+ 9 - 32
src/components/forecast-form/index.vue

@@ -56,37 +56,15 @@
         <!-- 物料表格区域 -->
         <div class="forecast-goods-table">
           <div class="table-title">物料列表</div>
-          <!-- 选择并导入物料工具栏 -->
+          <!-- 工具栏:下载模板 -->
           <div class="table-toolbar">
-            <el-select
-              v-model="selectedStockId"
-              filterable
-              clearable
-              :disabled="stockSelectOptions.length === 0"
-              placeholder="物料名称"
-              style="width: 360px"
-            >
-              <el-option
-                v-for="opt in stockSelectOptions"
-                :key="opt.value"
-                :label="opt.label"
-                :value="opt.value"
-              />
-            </el-select>
             <el-button
               type="primary"
-              :disabled="!selectedStockId"
-              style="margin-left: 8px"
-              @click="handleImportSelectedStock"
-            >添加物料</el-button>
-            <!-- 批量删除按钮:始终展示,无选中或加载中禁用 -->
-            <el-button
-              type="danger"
-              icon="el-icon-delete"
-              :disabled="tableLoading || !hasSelection"
-              style="margin-left: 8px"
-              @click="handleBatchDelete"
-            >批量删除</el-button>
+              size="small"
+              icon="el-icon-download"
+              :loading="templateLoading"
+              @click="handleDownloadTemplate"
+            >下载模板</el-button>
           </div>
 
           <el-table
@@ -97,10 +75,7 @@
             height="360"
             v-loading="tableLoading"
             :row-key="getRowUniqueKey"
-            :reserve-selection="true"
-            @selection-change="handleSelectionChange"
           >
-            <el-table-column type="selection" width="48" />
             <el-table-column prop="code" label="物料编码" min-width="140" show-overflow-tooltip />
             <el-table-column prop="cname" label="物料名称" min-width="160" show-overflow-tooltip />
             <el-table-column prop="brandName" label="品牌名称" min-width="120" show-overflow-tooltip />
@@ -149,7 +124,7 @@
             />
           </div>
 
-          <div class="table-tip">提示:先在上方选择物料并点击“导入物料”,导入后的数据将显示在表格并参与保存流程。</div>
+          <div class="table-tip">提示:可下载模板用于批量维护物料预测数据;表格内也支持直接修改预测数量。</div>
         </div>
       </div>
     </div>
@@ -240,6 +215,8 @@ export default {
 }
 .table-toolbar {
   margin-bottom: 8px;
+  display: flex;
+  justify-content: flex-end;
 }
 .table-tip {
   margin-top: 8px;