| src/views/basicData/product/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/dispatchLog/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/receiptManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/stockManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/salesQuotation/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | 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) => {