maven
2025-09-22 02f95a1596a6cc64df2b6e305672dc9f57cf0d2b
yys  采购价格管理
已修改3个文件
313 ■■■■■ 文件已修改
src/api/procurementManagement/procurementPlan.js 110 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/advancedPriceManagement/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/procurementPlan/index.vue 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/procurementManagement/procurementPlan.js
@@ -1,127 +1,47 @@
import request from "@/utils/request";
// 分页查询采购计划列表
export function getProcurementPlanList(query) {
export function listPage(query) {
  return request({
    url: "/procurement/plan/list",
    url: "/procurementPlan/listPage",
    method: "get",
    params: query,
  });
}
// 新增采购计划
export function addProcurementPlan(data) {
export function add(data) {
  return request({
    url: "/procurement/plan/add",
    url: "/procurementPlan/add",
    method: "post",
    data: data,
    data,
  });
}
// 修改采购计划
export function updateProcurementPlan(data) {
export function update(data) {
  return request({
    url: "/procurement/plan/update",
    method: "put",
    data: data,
    url: "/procurementPlan/update",
    method: "post",
    data,
  });
}
// 删除采购计划
export function deleteProcurementPlan(ids) {
export function del(data) {
  return request({
    url: "/procurement/plan/delete",
    url: "/procurementPlan/del",
    method: "delete",
    data: ids,
    data,
  });
}
// 根据ID获取采购计划详情
export function getProcurementPlanById(id) {
// 删除采购计划
export function listPageCopy(query) {
  return request({
    url: `/procurement/plan/${id}`,
    method: "get",
  });
}
// 执行采购计划计算
export function calculateProcurementPlan(data) {
  return request({
    url: "/procurement/plan/calculate",
    method: "post",
    data: data,
  });
}
// 获取产品现有库存信息
export function getProductExistingStock(productIds) {
  return request({
    url: "/inventory/existingStock/productInfo",
    method: "post",
    data: productIds,
  });
}
// 获取产品安全库存信息
export function getProductSafetyStock(productIds) {
  return request({
    url: "/inventory/safetyStock/productInfo",
    method: "post",
    data: productIds,
  });
}
// 获取产品预计出库信息
export function getProductExpectedOutbound(productIds) {
  return request({
    url: "/inventory/expectedOutbound/productInfo",
    method: "post",
    data: productIds,
  });
}
// 获取产品预计入库信息
export function getProductExpectedInbound(productIds) {
  return request({
    url: "/inventory/expectedInbound/productInfo",
    method: "post",
    data: productIds,
  });
}
// 导出采购计划
export function exportProcurementPlan(query) {
  return request({
    url: "/procurement/plan/export",
    url: "/stockin/listPageCopy",
    method: "get",
    params: query,
    responseType: "blob",
  });
}
// 生成采购订单
export function generatePurchaseOrder(data) {
  return request({
    url: "/procurement/plan/generateOrder",
    method: "post",
    data: data,
  });
}
// 验证计算公式
export function validateFormula(formula) {
  return request({
    url: "/procurement/plan/validateFormula",
    method: "post",
    data: { formula },
  });
}
// 获取计算公式模板
export function getFormulaTemplates() {
  return request({
    url: "/procurement/plan/formulaTemplates",
    method: "get",
  });
}
src/views/procurementManagement/advancedPriceManagement/index.vue
@@ -361,7 +361,7 @@
// 分页
const pagination = reactive({
  current: 1,
  size: 20
  size: 10
})
src/views/procurementManagement/procurementPlan/index.vue
@@ -9,7 +9,7 @@
        <el-form-item label="状态">
          <el-select v-model="searchForm.status" placeholder="请选择状态" clearable style="width: 150px">
            <el-option label="启用" value="active" />
            <el-option label="禁用" value="inactive" />
            <el-option label="禁用" value="disabled" />
          </el-select>
        </el-form-item>
        <el-form-item>
@@ -63,7 +63,7 @@
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="lastCalculateTime" label="最后计算时间" width="160" />
        <el-table-column prop="updateTime" label="最后计算时间" width="160" />
        <el-table-column label="操作" width="200" fixed="right" align="center">
          <template #default="{ row }">
            <el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
@@ -79,7 +79,7 @@
          v-model:current-page="pagination.current"
          v-model:page-size="pagination.size"
          :page-sizes="[10, 20, 50, 100]"
          :total="pagination.total"
          :total="total"
          layout="total, sizes, prev, pager, next, jumper"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
@@ -128,11 +128,10 @@
            <el-row :gutter="20">
              <el-col :span="12">
                <el-form-item label="数据状态" prop="dataStatus">
                  <el-select v-model="formData.dataStatus" placeholder="请选择状态" style="width: 100%">
                    <el-option label="草稿" value="draft" />
                    <el-option label="已审核" value="approved" />
                    <el-option label="已禁用" value="disabled" />
                <el-form-item label="状态" prop="status">
                  <el-select v-model="formData.status" placeholder="请选择状态" style="width: 100%">
                    <el-option label="启用" value="active" />
                    <el-option label="禁用" value="disabled" />
                  </el-select>
                </el-form-item>
              </el-col>
@@ -152,7 +151,7 @@
            <el-tab-pane label="需求参数" name="demand">
              <div class="checkbox-group">
                <el-checkbox v-model="formData.considerExistingStock">考虑现有库存</el-checkbox>
                <el-checkbox v-model="formData.warehouseMRPControl">仓库运行MRP的控制</el-checkbox>
                <el-checkbox v-model="formData.warehouseControl">仓库运行MRP的控制</el-checkbox>
                <el-checkbox v-model="formData.calculateTotalDemand">计算总需求</el-checkbox>
                <el-checkbox v-model="formData.considerSafetyStock">考虑安全库存</el-checkbox>
                <el-checkbox v-model="formData.considerLockedStock">考虑锁库</el-checkbox>
@@ -163,7 +162,7 @@
            <el-tab-pane label="计算参数" name="calculation">
              <div class="checkbox-group">
                <el-checkbox v-model="formData.considerExistingStock">考虑现有库存</el-checkbox>
                <el-checkbox v-model="formData.warehouseMRPControl">仓库运行MRP的控制</el-checkbox>
                <el-checkbox v-model="formData.warehouseControl">仓库运行MRP的控制</el-checkbox>
                <el-checkbox v-model="formData.calculateTotalDemand">计算总需求</el-checkbox>
                <el-checkbox v-model="formData.considerSafetyStock">考虑安全库存</el-checkbox>
                <el-checkbox v-model="formData.considerLockedStock">考虑锁库</el-checkbox>
@@ -240,12 +239,12 @@
          style="width: 100%; margin-top: 20px;"
        >
          <el-table-column type="selection" width="55" />
          <el-table-column prop="productName" label="产品名称" min-width="150" />
          <el-table-column prop="productCode" label="产品编码" width="120" />
          <el-table-column prop="existingStock" label="现有库存" width="100" align="right" />
          <el-table-column prop="safetyStock" label="安全库存" width="100" align="right" />
          <el-table-column prop="expectedOutbound" label="预计出库" width="100" align="right" />
          <el-table-column prop="expectedInbound" label="预计入库" width="100" align="right" />
          <el-table-column prop="productCategory" label="产品大类" min-width="150" />
          <el-table-column prop="specificationModel" label="产品规格" width="120" />
          <el-table-column prop="inboundNum0" label="现有库存" width="100" align="right" />
          <el-table-column prop="inboundNum" label="安全库存" width="100" align="right" />
          <el-table-column prop="inboundNum" label="预计出库" width="100" align="right" />
          <el-table-column prop="inboundNum0" label="预计入库" width="100" align="right" />
        </el-table>
      </div>
@@ -279,12 +278,12 @@
        </el-alert>
        <el-table :data="calculateResult" stripe border style="width: 100%; margin-top: 20px;">
          <el-table-column prop="productName" label="产品名称" min-width="150" />
          <el-table-column prop="productCode" label="产品编码" width="120" />
          <el-table-column prop="existingStock" label="现有库存" width="100" align="right" />
          <el-table-column prop="safetyStock" label="安全库存" width="100" align="right" />
          <el-table-column prop="expectedOutbound" label="预计出库数量" width="120" align="right" />
          <el-table-column prop="expectedInbound" label="预计入库数量" width="120" align="right" />
          <el-table-column prop="productCategory" label="产品大类" min-width="150" />
          <el-table-column prop="specificationModel" label="产品规格" width="120" />
          <el-table-column prop="inboundNum0" label="现有库存" width="100" align="right" />
          <el-table-column prop="inboundNum" label="安全库存" width="100" align="right" />
          <el-table-column prop="inboundNum" label="预计出库数量" width="120" align="right" />
          <el-table-column prop="inboundNum0" label="预计入库数量" width="120" align="right" />
          <el-table-column prop="weeklyNetDemand" label="按周净需求" width="120" align="right">
            <template #default="{ row }">
              <el-tag :type="row.weeklyNetDemand > 0 ? 'warning' : 'success'" size="small">
@@ -305,7 +304,7 @@
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="calculateDialogVisible = false">关闭</el-button>
          <el-button type="primary" @click="handleCreatePurchaseOrder">生成采购订单</el-button>
          <el-button type="primary" @click="handleCreatePurchaseOrder">确认</el-button>
        </div>
      </template>
    </el-dialog>
@@ -313,9 +312,10 @@
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import {ref, reactive, onMounted, getCurrentInstance} from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { Search, Refresh, Plus, Download } from '@element-plus/icons-vue'
import {listPage,add,update,del,listPageCopy} from "@/api/procurementManagement/procurementPlan.js"
// 响应式数据
const loading = ref(false)
@@ -337,8 +337,7 @@
// 分页数据
const pagination = reactive({
  current: 1,
  size: 20,
  total: 0
  size: 20
})
// 表单数据
@@ -346,12 +345,12 @@
  code: '',
  planName: '',
  description: '',
  dataStatus: '',
  status: '',
  isSystemPreset: false,
  formula: '',
  // 计算参数
  considerExistingStock: false,
  warehouseMRPControl: false,
  warehouseControl: false,
  calculateTotalDemand: false,
  considerSafetyStock: false,
  considerLockedStock: false,
@@ -371,8 +370,8 @@
  planName: [
    { required: true, message: '请输入计划名称', trigger: 'blur' }
  ],
  dataStatus: [
    { required: true, message: '请选择数据状态', trigger: 'change' }
  status: [
    { required: true, message: '请选择状态', trigger: 'change' }
  ],
  formula: [
    { required: true, message: '请输入计算公式', trigger: 'blur' }
@@ -380,56 +379,10 @@
}
// 表格数据
const tableData = ref([
  {
    id: 1,
    planName: '常规产品采购计划',
    description: '基于历史销售数据的常规产品采购计划',
    formula: '预计出库数量 - 现有库存 + 安全库存 - 预计入库数量',
    status: 'active',
    lastCalculateTime: '2024-12-01 10:30:00',
    remark: '适用于常规产品'
  },
  {
    id: 2,
    planName: '季节性产品采购计划',
    description: '考虑季节因素的季节性产品采购计划',
    formula: '预计出库数量 - 现有库存 + 安全库存 * 1.2 - 预计入库数量',
    status: 'active',
    lastCalculateTime: '2024-11-28 15:20:00',
    remark: '适用于季节性产品'
  }
])
const tableData = ref([])
// 产品列表数据
const productList = ref([
  {
    id: 1,
    productName: '产品A',
    productCode: 'PA001',
    existingStock: 100,
    safetyStock: 50,
    expectedOutbound: 200,
    expectedInbound: 30
  },
  {
    id: 2,
    productName: '产品B',
    productCode: 'PB002',
    existingStock: 80,
    safetyStock: 30,
    expectedOutbound: 150,
    expectedInbound: 20
  },
  {
    id: 3,
    productName: '产品C',
    productCode: 'PC003',
    existingStock: 120,
    safetyStock: 60,
    expectedOutbound: 180,
    expectedInbound: 25
  },
  {
    id: 4,
    productName: '产品D',
@@ -462,7 +415,7 @@
    suggestedPurchase: 120
  }
])
const total = ref(0)
// 方法
const handleSearch = () => {
  pagination.current = 1
@@ -479,11 +432,13 @@
const loadData = () => {
  loading.value = true
  // 模拟API调用
  setTimeout(() => {
    pagination.total = tableData.value.length
  listPage({...searchForm,...pagination}).then(res => {
    if(res.code === 200){
      tableData.value = res.data.records
      total.value = res.data.total
    loading.value = false
  }, 500)
    }
  })
}
const handleAdd = () => {
@@ -507,13 +462,13 @@
      cancelButtonText: '取消',
      type: 'warning'
    })
    const index = tableData.value.findIndex(item => item.id === row.id)
    if (index > -1) {
      tableData.value.splice(index, 1)
    let ids = [row.id]
    del(ids).then(res =>{
     if(res.code === 200){
      ElMessage.success('删除成功')
      loadData()
    }
   })
  } catch {
    // 用户取消删除
  }
@@ -530,25 +485,25 @@
    submitLoading.value = true
    if (dialogType.value === 'add') {
      // 新增
      const newItem = {
        ...formData,
        id: Date.now(),
        lastCalculateTime: '-'
      }
      tableData.value.unshift(newItem)
      add(formData).then(res => {
        if(res.code === 200){
      ElMessage.success('新增成功')
    } else {
      // 编辑
      const index = tableData.value.findIndex(item => item.id === formData.id)
      if (index > -1) {
        tableData.value[index] = { ...formData }
        ElMessage.success('编辑成功')
      }
    }
    dialogVisible.value = false
    loadData()
        }
      })
    } else {
      // 编辑
      update(formData).then(res => {
        if(res.code === 200){
          ElMessage.success('编辑成功')
          dialogVisible.value = false
          loadData()
        }
      })
    }
  } catch (error) {
    ElMessage.error('操作失败')
  } finally {
@@ -561,12 +516,12 @@
    code: '',
    planName: '',
    description: '',
    dataStatus: '',
    status: '',
    isSystemPreset: false,
    formula: '',
    formula: '预计出库数量 - 现有库存 + 安全库存 - 预计入库数量',
    // 计算参数
    considerExistingStock: false,
    warehouseMRPControl: false,
    warehouseControl: false,
    calculateTotalDemand: false,
    considerSafetyStock: false,
    considerLockedStock: false,
@@ -597,9 +552,12 @@
const loadProductList = () => {
  productLoading.value = true
  // 模拟加载产品数据
  setTimeout(() => {
  listPageCopy({size:-1}).then(res => {
    if(res.code === 200){
      productList.value = res.data.records
    productLoading.value = false
  }, 500)
    }
  })
}
const handleProductSelectionChange = (selection) => {
@@ -621,21 +579,18 @@
const calculateWithSelectedProducts = () => {
  // 模拟计算过程
  setTimeout(() => {
    // 根据选择的产品更新计算结果
    const result = selectedProducts.value.map(product => {
      // 这里应该根据实际的计算公式进行计算
      // 示例:预计出库数量 - 现有库存 + 安全库存 - 预计入库数量
      const weeklyNetDemand = product.expectedOutbound - product.existingStock + product.safetyStock - product.expectedInbound
    const weeklyNetDemand = product.inboundNum - product.inboundNum0 + product.inboundNum - product.inboundNum0
      const suggestedPurchase = Math.max(0, weeklyNetDemand)
      
      return {
        productName: product.productName,
        productCode: product.productCode,
        existingStock: product.existingStock,
        safetyStock: product.safetyStock,
        expectedOutbound: product.expectedOutbound,
        expectedInbound: product.expectedInbound,
      productCategory: product.productCategory,
      specificationModel: product.specificationModel,
      inboundNum0: product.inboundNum0,
      inboundNum: product.inboundNum,
        weeklyNetDemand: weeklyNetDemand,
        suggestedPurchase: suggestedPurchase
      }
@@ -643,17 +598,25 @@
    
    calculateResult.value = result
    calculateDialogVisible.value = true
  }, 1000)
}
const handleCreatePurchaseOrder = () => {
  ElMessage.success('正在生成采购订单...')
  calculateDialogVisible.value = false
}
const { proxy } = getCurrentInstance();
const handleExport = () => {
  ElMessage.success('正在导出数据...')
  ElMessageBox.confirm("内容将被导出,是否确认导出?", "导出", {
    confirmButtonText: "确认",
    cancelButtonText: "取消",
    type: "warning",
  })
      .then(() => {
        proxy.download("/procurementPlan/export", {}, "采购计划.xlsx");
      })
      .catch(() => {
        proxy.$modal.msg("已取消");
      });
}