军泰伟业
1.军泰伟业-库存管理增加库位
2.军泰伟业-销售产品增加物料号字段
3.军泰伟业-产品维护增加录入时间和修改时间的展示
4.军泰伟业-发货不需要审核流程了
已修改6个文件
283 ■■■■■ 文件已修改
src/views/basicData/product/index.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/dispatchLog/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/receiptManagement/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesQuotation/index.vue 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/product/index.vue
@@ -266,6 +266,11 @@
    minWidth: 100,
  },
  {
    label: "子项数量",
    prop: "subItemCount",
    minWidth: 100,
  },
  {
    label: "产品属性",
    prop: "productType",
    width: 100,
@@ -276,6 +281,16 @@
      return typeMap[String(v)] || "info";
    },
  },
    {
        label: "创建",
        prop: "createTime",
        minWidth: 120,
    },
    {
        label: "修改时间",
        prop: " updateTime",
        minWidth: 120,
    },
  {
    dataType: "action",
    label: "操作",
src/views/inventoryManagement/dispatchLog/index.vue
@@ -26,7 +26,7 @@
      type: 1
    },
    {
      label: '外购',
      label: '标准件',
      name: 'purchase',
      type: 2
    },
src/views/inventoryManagement/receiptManagement/index.vue
@@ -23,7 +23,7 @@
    type: 1
  },
  {
    label: '外购',
    label: '标准件',
    name: 'purchase',
    type: 2
  },
src/views/inventoryManagement/stockManagement/index.vue
@@ -24,7 +24,7 @@
    component: markRaw(StockRecord)
  },
  {
    label: '外购',
    label: '标准件',
    name: 'purchase',
    type: 2,
    component: markRaw(StockRecord)
src/views/salesManagement/salesLedger/index.vue
@@ -46,6 +46,7 @@
              <el-table-column align="center" label="序号" type="index"/>
              <el-table-column label="产品大类" prop="productCategory" />
              <el-table-column label="图纸编号" prop="specificationModel" />
                            <el-table-column label="物料号" prop="material" />
              <el-table-column label="单位" prop="unit" />
                            <el-table-column label="产品状态"
                                                             width="100px"
@@ -111,9 +112,7 @@
        <el-table-column fixed="right" label="操作" width="100" align="center">
          <template #default="scope">
            <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">编辑</el-button>
<!--            <el-button link type="primary" size="small" @click="openForm('view', scope.row)">详情</el-button>-->
            <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">附件</el-button>
<!--            <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)">发货</el-button>-->
          </template>
        </el-table-column>
      </el-table>
@@ -216,6 +215,7 @@
                    <el-table-column align="center" label="序号" type="index" width="60" />
                    <el-table-column label="产品大类" prop="productCategory" />
                    <el-table-column label="图纸编号" prop="specificationModel" />
                    <el-table-column label="物料号" prop="material" />
                    <el-table-column label="单位" prop="unit" />
                    <el-table-column label="数量" prop="quantity" />
                    <el-table-column label="税率(%)" prop="taxRate" />
@@ -340,6 +340,13 @@
                    <el-col :span="24">
                        <el-form-item label="图纸编号:" prop="specificationModel">
                            <el-input v-model="productForm.specificationModel" placeholder="请输入图纸编号" disabled />
                        </el-form-item>
                    </el-col>
                </el-row>
                <el-row :gutter="30">
                    <el-col :span="24">
                        <el-form-item label="物料号:" prop="material">
                            <el-input v-model="productForm.material" placeholder="请输入物料号" clearable />
                        </el-form-item>
                    </el-col>
                </el-row>
@@ -565,50 +572,16 @@
            @close="closeDeliveryDia"
        >
            <el-form :model="deliveryForm" label-width="120px" label-position="top" :rules="deliveryRules" ref="deliveryFormRef">
        <!-- 审批人选择(仿协同审批里的审批人节点选择) -->
        <el-row>
          <el-col :span="24">
            <el-form-item>
              <template #label>
                <span>审批人选择:</span>
                <el-button type="primary" @click="addApproverNode" style="margin-left: 8px;">新增节点</el-button>
              </template>
              <div style="display: flex; align-items: flex-end; flex-wrap: wrap;">
                <div
                  v-for="(node, index) in approverNodes"
                  :key="node.id"
                  style="margin-right: 20px; text-align: center; margin-bottom: 10px;"
                >
                  <div>
                    <span>审批人</span>
                    →
                  </div>
                  <el-select
                    v-model="node.userId"
                    placeholder="选择人员"
                    filterable
                    style="width: 140px; margin-bottom: 8px;"
                  >
                    <el-option
                      v-for="user in userList"
                      :key="user.userId"
                      :label="user.nickName"
                      :value="user.userId"
                    />
                  </el-select>
                  <div>
                    <el-button
                      type="danger"
                      size="small"
                      @click="removeApproverNode(index)"
                      v-if="approverNodes.length > 1"
                    >删除</el-button>
                  </div>
                </div>
              </div>
            </el-form-item>
          </el-col>
        </el-row>
                <el-row>
                    <el-col :span="24">
                        <el-alert
                            title="确认后将直接发货!"
                            type="warning"
                            :closable="false"
                            show-icon
                        />
                    </el-col>
                </el-row>
            </el-form>
            <template #footer>
                <div class="dialog-footer">
@@ -715,6 +688,7 @@
const productFormData = reactive({
    productForm: {
        productCategory: "",
        material: "",
        specificationModel: "",
        unit: "",
        quantity: "",
@@ -776,16 +750,6 @@
  deliveryRules: {},
});
const { deliveryForm, deliveryRules } = toRefs(deliveryFormData);
// 发货审批人节点(仿协同审批 infoFormDia.vue)
const approverNodes = ref([{ id: 1, userId: null }]);
let nextApproverId = 2;
const addApproverNode = () => {
  approverNodes.value.push({ id: nextApproverId++, userId: null });
};
const removeApproverNode = (index) => {
  approverNodes.value.splice(index, 1);
};
// 导入相关
const importUploadRef = ref(null);
@@ -1122,6 +1086,7 @@
        return {
            // 台账字段
            productCategory: p.product || p.productName || "",
            material: p.material || "",
            specificationModel: p.specification || "",
            unit: p.unit || "",
            quantity: quantity,
@@ -1339,6 +1304,7 @@
    if (selectedProducts && selectedProducts.length > 0) {
        const product = selectedProducts[0];
        productForm.value.productCategory = product.productName;
        productForm.value.material = product.material || "";
        productForm.value.specificationModel = product.model;
        productForm.value.unit = product.unit;
    }
@@ -2138,9 +2104,6 @@
  deliveryForm.value = {
    type: "货车",
  };
  // 重置审批人节点(默认一个空节点)
  approverNodes.value = [{ id: 1, userId: null }];
  nextApproverId = 2;
    deliveryFormVisible.value = true;
};
@@ -2148,20 +2111,12 @@
const submitDelivery = () => {
  proxy.$refs["deliveryFormRef"].validate((valid) => {
    if (valid) {
      // 审批人必填校验(所有节点都要选人)
      const hasEmptyApprover = approverNodes.value.some(node => !node.userId);
      if (hasEmptyApprover) {
        proxy.$modal.msgError("请为所有审批节点选择审批人!");
        return;
      }
      const approveUserIds = approverNodes.value.map(node => node.userId).join(",");
      const currentExpandedKeys = [...expandedRowKeys.value];
      const salesLedgerId = currentDeliveryRow.value.salesLedgerId;
      addShippingInfo({
        salesLedgerId: salesLedgerId,
        salesLedgerProductId: currentDeliveryRow.value.id,
        shippingTotal: currentDeliveryRow.value.quantity,
        approveUserIds,
      })
        .then(() => {
          proxy.$modal.msgSuccess("发货成功");
src/views/salesManagement/salesQuotation/index.vue
@@ -229,40 +229,14 @@
          </template>
          <div class="form-content">
            <el-table :data="form.products" border style="width: 100%" class="product-table" v-if="form.products.length > 0">
            <el-table-column prop="product" label="产品名称" width="200">
            <el-table-column prop="product" label="产品名称" width="220">
              <template #default="scope">
                <el-form-item :prop="`products.${scope.$index}.productId`" class="product-table-form-item">
                  <el-tree-select
                    v-model="scope.row.productId"
                    placeholder="请选择"
                    clearable
                    check-strictly
                    @change="getModels($event, scope.row)"
                    :data="productOptions"
                    :render-after-expand="false"
                    style="width: 100%"
                  />
                </el-form-item>
                <span>{{ scope.row.product || scope.row.productName || '--' }}</span>
              </template>
            </el-table-column>
            <el-table-column prop="specification" label="图纸编号" width="200">
            <el-table-column prop="specification" label="图纸编号" width="220">
              <template #default="scope">
                <el-form-item :prop="`products.${scope.$index}.specificationId`" class="product-table-form-item">
                  <el-select
                    v-model="scope.row.specificationId"
                    placeholder="请选择"
                    clearable
                    @change="getProductModel($event, scope.row)"
                    style="width: 100%"
                  >
                    <el-option
                      v-for="item in scope.row.modelOptions || []"
                      :key="item.id"
                      :label="item.model"
                      :value="item.id"
                    />
                  </el-select>
                </el-form-item>
                <span>{{ scope.row.specification || '--' }}</span>
              </template>
            </el-table-column>
            <el-table-column prop="unit" label="单位">
@@ -275,7 +249,7 @@
            <el-table-column prop="unitPrice" label="单价">
              <template #default="scope">
                <el-form-item :prop="`products.${scope.$index}.unitPrice`" class="product-table-form-item">
                  <el-input-number v-model="scope.row.unitPrice" :min="0" :precision="2" style="width: 100%" />
                  <el-input-number v-model="scope.row.unitPrice" :min="0.01" :precision="2" :step="0.01" style="width: 100%" />
                </el-form-item>
              </template>
            </el-table-column>
@@ -313,6 +287,12 @@
      </el-form>
      </div>
    </FormDialog>
    <ProductSelectDialog
      v-model="productSelectVisible"
      :single="true"
      @confirm="handleProductSelectConfirm"
    />
    <!-- 查看详情对话框 -->
    <el-dialog v-model="viewDialogVisible" title="报价详情" width="800px">
@@ -359,6 +339,7 @@
import { Search, Document, UserFilled, Box, EditPen, Plus, ArrowRight, Delete } from '@element-plus/icons-vue'
import Pagination from '@/components/PIMTable/Pagination.vue'
import FormDialog from '@/components/Dialog/FormDialog.vue'
import ProductSelectDialog from '@/views/basicData/product/ProductSelectDialog.vue'
import {getQuotationList,addQuotation,updateQuotation,deleteQuotation} from '@/api/salesManagement/salesQuotation.js'
import {userListNoPage} from "@/api/system/user.js";
import {customerList} from "@/api/salesManagement/salesLedger.js";
@@ -374,7 +355,6 @@
const quotationList = ref([])
const productOptions = ref([]);
const modelOptions = ref([]);
const pagination = reactive({
  total: 3,
  currentPage: 1,
@@ -383,6 +363,8 @@
const dialogVisible = ref(false)
const viewDialogVisible = ref(false)
const productSelectVisible = ref(false)
const activeProductIndex = ref(-1)
const dialogTitle = ref('新增报价')
const form = reactive({
  quotationNo: '',
@@ -541,65 +523,6 @@
    }
    return null;
}
const getModels = (value, row) => {
    if (!row) return;
    // 如果清空选择,则清空相关字段
    if (!value) {
        row.productId = '';
        row.product = '';
        row.modelOptions = [];
        row.specificationId = '';
        row.specification = '';
        row.unit = '';
        return;
    }
    // 更新 productId(v-model 已经自动更新,这里确保一致性)
    row.productId = value;
    // 找到对应的 label 并赋值给 row.product
    const label = findNodeById(productOptions.value, value);
    if (label) {
        row.product = label;
    }
    // 获取规格型号列表,设置到当前行的 modelOptions
    modelList({ id: value }).then((res) => {
        row.modelOptions = res || [];
    });
};
const getProductModel = (value, row) => {
    if (!row) return;
    // 如果清空选择,则清空相关字段
    if (!value) {
        row.specificationId = '';
        row.specification = '';
        row.unit = '';
        return;
    }
    // 更新 specificationId(v-model 已经自动更新,这里确保一致性)
    row.specificationId = value;
    const modelOptions = row.modelOptions || [];
    const index = modelOptions.findIndex((item) => item.id === value);
    if (index !== -1) {
        row.specification = modelOptions[index].model;
        row.unit = modelOptions[index].unit;
    } else {
        row.specification = '';
        row.unit = '';
    }
};
const findNodeById = (nodes, productId) => {
    for (let i = 0; i < nodes.length; i++) {
        if (nodes[i].value === productId) {
            return nodes[i].label; // 找到节点,返回 label
        }
        if (nodes[i].children && nodes[i].children.length > 0) {
            const foundLabel = findNodeById(nodes[i].children, productId);
            if (foundLabel) {
                return foundLabel; // 在子节点中找到,返回 label
            }
        }
    }
    return null; // 没有找到节点,返回null
};
const handleView = (row) => {
  // 只复制需要的字段,避免将组件引用放入响应式对象
  currentQuotation.value = {
@@ -755,23 +678,51 @@
}
const addProduct = () => {
  form.products.push({
    productId: '',
    product: '',
    productName: '',
    specificationId: '',
    specification: '',
    quantity: 1,
    unit: '',
    unitPrice: 0,
    amount: 0,
    modelOptions: [] // 为每行添加独立的规格型号列表
  })
  activeProductIndex.value = -1
  productSelectVisible.value = true
}
const removeProduct = (index) => {
  form.products.splice(index, 1)
  calculateSubtotal()
}
const handleProductSelectConfirm = (rows) => {
  if (!rows || rows.length === 0 || activeProductIndex.value < 0) {
    if (!rows || rows.length === 0) {
      return
    }
    const selected = rows[0]
    form.products.push({
      productId: selected.id,
      product: selected.productName || '',
      productName: selected.productName || '',
      specificationId: selected.id,
      specification: selected.model || '',
      quantity: 1,
      unit: selected.unit || '',
    unitPrice: 0.01,
      amount: 0,
      modelOptions: [],
    })
    calculateSubtotal()
    activeProductIndex.value = -1
    return
  }
  const row = form.products[activeProductIndex.value]
  if (!row) {
    return
  }
  const selected = rows[0]
  row.productId = selected.id
  row.product = selected.productName || ''
  row.productName = selected.productName || ''
  row.specificationId = selected.id
  row.specification = selected.model || ''
  row.unit = selected.unit || row.unit || ''
  calculateAmount(row)
}
const calculateAmount = (product) => {
@@ -801,15 +752,17 @@
        return
      }
      // 审批人必填校验
      const hasEmptyApprover = approverNodes.value.some(node => !node.userId)
      if (hasEmptyApprover) {
        ElMessage.error('请为所有审批节点选择审批人!')
      const hasInvalidPrice = form.products.some(product => Number(product.unitPrice) <= 0)
      if (hasInvalidPrice) {
        ElMessage.error('单价必须大于0')
        return
      }
      // 收集所有节点的审批人id
      form.approveUserIds = approverNodes.value.map(node => node.userId).join(',')
      // 收集所有节点的审批人id,允许为空
      form.approveUserIds = approverNodes.value
        .map(node => node.userId)
        .filter(userId => userId !== null && userId !== undefined && userId !== '')
        .join(',')
      
      // 计算所有产品的单价总和
      form.totalAmount = form.products.reduce((sum, product) => {