| src/api/procurementManagement/procurementLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/collaborativeApproval/approvalProcess/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/deliveryLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/procurementManagement/procurementLedger.js
@@ -115,3 +115,11 @@ data: id, }); } // 查询采购详情 export function getPurchaseByCode(id) { return request({ url: "/purchase/ledger/getPurchaseByCode", method: "get", params: id, }); } src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
@@ -2,7 +2,7 @@ <div> <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '新增审批流程' : '编辑审批流程'" :title="operationType === 'approval' ? '审批' : '详情'" width="700px" @close="closeDia" > @@ -32,9 +32,9 @@ </el-form-item> </el-col> </el-row> <el-row v-if="!isQuotationApproval"> <el-row v-if="!isQuotationApproval && !isPurchaseApproval"> <el-col :span="24"> <el-form-item label="审批事由:" prop="approveReason"> <el-form-item :label="props.approveType == 5 ? '采购合同号:' : '审批事由:'" prop="approveReason"> <el-input v-model="form.approveReason" placeholder="请输入" clearable type="textarea" disabled/> </el-form-item> </el-col> @@ -74,7 +74,7 @@ </el-row> </el-form> <!-- 报价审批:展示报价详情(复用销售报价“查看详情对话框”内容结构) --> <!-- 报价审批:展示报价详情(复用销售报价"查看详情对话框"内容结构) --> <div v-if="isQuotationApproval" style="margin: 10px 0 18px;"> <el-divider content-position="left">报价详情</el-divider> <el-skeleton :loading="quotationLoading" animated> @@ -104,7 +104,7 @@ <h4>产品明细</h4> <el-table :data="currentQuotation.products || []" border style="width: 100%"> <el-table-column prop="product" label="产品名称" /> <el-table-column prop="specification" label="规格型号" /> <el-table-column prop="specificationModel" label="规格型号" /> <el-table-column prop="unit" label="单位" /> <el-table-column prop="unitPrice" label="单价"> <template #default="scope">¥{{ Number(scope.row.unitPrice ?? 0).toFixed(2) }}</template> @@ -115,6 +115,53 @@ <div v-if="currentQuotation.remark" style="margin-top: 20px;"> <h4>备注</h4> <p>{{ currentQuotation.remark }}</p> </div> </template> </template> </el-skeleton> </div> <!-- 采购审批:展示采购详情 --> <div v-if="isPurchaseApproval" style="margin: 10px 0 18px;"> <el-divider content-position="left">采购详情</el-divider> <el-skeleton :loading="purchaseLoading" animated> <template #template> <el-skeleton-item variant="h3" style="width: 30%" /> <el-skeleton-item variant="text" style="width: 100%" /> <el-skeleton-item variant="text" style="width: 100%" /> </template> <template #default> <el-empty v-if="!currentPurchase || !currentPurchase.purchaseContractNumber" description="未查询到对应采购详情" /> <template v-else> <el-descriptions :column="2" border> <el-descriptions-item label="采购合同号">{{ currentPurchase.purchaseContractNumber }}</el-descriptions-item> <el-descriptions-item label="供应商名称">{{ currentPurchase.supplierName }}</el-descriptions-item> <el-descriptions-item label="项目名称">{{ currentPurchase.projectName }}</el-descriptions-item> <el-descriptions-item label="销售合同号">{{ currentPurchase.salesContractNo }}</el-descriptions-item> <el-descriptions-item label="签订日期">{{ currentPurchase.executionDate }}</el-descriptions-item> <el-descriptions-item label="录入日期">{{ currentPurchase.entryDate }}</el-descriptions-item> <el-descriptions-item label="付款方式">{{ currentPurchase.paymentMethod }}</el-descriptions-item> <el-descriptions-item label="合同金额" :span="2"> <span style="font-size: 18px; color: #e6a23c; font-weight: bold;"> ¥{{ Number(currentPurchase.contractAmount ?? 0).toFixed(2) }} </span> </el-descriptions-item> </el-descriptions> <div style="margin-top: 20px;"> <h4>产品明细</h4> <el-table :data="currentPurchase.productData || []" border style="width: 100%"> <el-table-column prop="productCategory" label="产品名称" /> <el-table-column prop="specificationModel" label="规格型号" /> <el-table-column prop="unit" label="单位" /> <el-table-column prop="quantity" label="数量" /> <el-table-column prop="taxInclusiveUnitPrice" label="含税单价"> <template #default="scope">¥{{ Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2) }}</template> </el-table-column> <el-table-column prop="taxInclusiveTotalPrice" label="含税总价"> <template #default="scope">¥{{ Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2) }}</template> </el-table-column> </el-table> </div> </template> </template> @@ -188,6 +235,7 @@ import {userListNoPageByTenantId} from "@/api/system/user.js"; import { WarningFilled, Edit, Check, MoreFilled } from '@element-plus/icons-vue' import { getQuotationList } from "@/api/salesManagement/salesQuotation.js"; import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js"; const emit = defineEmits(['close']) const { proxy } = getCurrentInstance() @@ -207,7 +255,10 @@ const userList = ref([]) const quotationLoading = ref(false) const currentQuotation = ref({}) const purchaseLoading = ref(false) const currentPurchase = ref({}) const isQuotationApproval = computed(() => Number(props.approveType) === 6) const isPurchaseApproval = computed(() => Number(props.approveType) === 5) const data = reactive({ form: { @@ -247,6 +298,7 @@ operationType.value = type; dialogFormVisible.value = true; currentQuotation.value = {} currentPurchase.value = {} userListNoPageByTenantId().then((res) => { userList.value = res.data; }); @@ -277,7 +329,7 @@ }); }); // 报价审批:用审批事由字段承载的“报价单号”去查报价列表 // 报价审批:用审批事由字段承载的"报价单号"去查报价列表 if (isQuotationApproval.value) { const quotationNo = row?.approveReason; if (quotationNo) { @@ -287,6 +339,22 @@ currentQuotation.value = records[0] || {} }).finally(() => { quotationLoading.value = false }) } } // 采购审批:用审批事由字段承载的"采购合同号"去查采购详情 if (isPurchaseApproval.value) { const purchaseContractNumber = row?.approveReason; if (purchaseContractNumber) { purchaseLoading.value = true getPurchaseByCode({ purchaseContractNumber }).then((res) => { currentPurchase.value = res }).catch((err) => { console.error('查询采购详情失败:', err) proxy.$modal.msgError('查询采购详情失败') }).finally(() => { purchaseLoading.value = false }) } } @@ -341,6 +409,8 @@ dialogFormVisible.value = false; quotationLoading.value = false currentQuotation.value = {} purchaseLoading.value = false currentPurchase.value = {} emit('close') }; defineExpose({ src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
@@ -35,7 +35,7 @@ </el-row> <el-row> <el-col :span="24"> <el-form-item :label="props.approveType == 5 ? '采购说明:' : '审批事由:'" prop="approveReason"> <el-form-item :label="props.approveType == 5 ? '采购合同号:' : '审批事由:'" prop="approveReason"> <el-input v-model="form.approveReason" placeholder="请输入" clearable type="textarea" /> </el-form-item> </el-col> src/views/collaborativeApproval/approvalProcess/index.vue
@@ -113,6 +113,7 @@ const isLeaveType = currentApproveType.value === 2; // 请假管理 const isReimburseType = currentApproveType.value === 4; // 报销管理 const isQuotationType = currentApproveType.value === 6; // 报价审批 const isPurchaseType = currentApproveType.value === 5; // 采购审批 // 基础列配置 const baseColumns = [ @@ -159,7 +160,7 @@ width: 220 }, { label: isQuotationType ? "报价单号" : "审批事由", label: isQuotationType ? "报价单号" : isPurchaseType ? "采购合同号" : "审批事由", prop: "approveReason", width: 200 }, src/views/salesManagement/deliveryLedger/index.vue
@@ -51,13 +51,13 @@ link type="primary" size="small" :disabled="!isApproved(scope.row.status)" :disabled="isApproving(scope.row.status)" @click="openForm('edit', scope.row)">编辑</el-button> <el-button link type="danger" size="small" :disabled="!isApproved(scope.row.status)" :disabled="isApproving(scope.row.status)" @click="handleDeleteSingle(scope.row)">删除</el-button> </template> </el-table-column> @@ -284,9 +284,9 @@ // 打开弹框 const openForm = async (type, row) => { // 编辑时检查审核状态 if (type === 'edit' && row && !isApproved(row.status)) { proxy.$modal.msgWarning("只能编辑审核通过的数据"); // 编辑时检查审核状态,只有审核中不能编辑 if (type === 'edit' && row && isApproving(row.status)) { proxy.$modal.msgWarning("审核中的数据不能编辑"); return; } @@ -430,10 +430,10 @@ return; } // 检查选中的行是否都是"审核通过"状态 const notApprovedRows = selectedRows.value.filter(row => !isApproved(row.status)); if (notApprovedRows.length > 0) { proxy.$modal.msgWarning("只能删除审核通过的数据"); // 检查选中的行是否有"审核中"状态 const approvingRows = selectedRows.value.filter(row => isApproving(row.status)); if (approvingRows.length > 0) { proxy.$modal.msgWarning("审核中的数据不能删除"); return; } @@ -456,9 +456,9 @@ // 单个删除 const handleDeleteSingle = (row) => { // 检查是否为"审核通过"状态 if (!isApproved(row.deliveryLedger)) { proxy.$modal.msgWarning("只能删除审核通过的数据"); // 检查是否为"审核中"状态 if (isApproving(row.status)) { proxy.$modal.msgWarning("审核中的数据不能删除"); return; } @@ -635,6 +635,20 @@ return statusStr === '审核通过' || statusStr === '3'; }; // 检查审核状态是否为"审核中" const isApproving = (status) => { if (status === null || status === undefined || status === '') { return false; } // 如果是数字,1 表示审核中 if (typeof status === 'number') { return status === 1; } // 如果是字符串 const statusStr = String(status).trim(); return statusStr === '审核中' || statusStr === '1'; }; onMounted(() => { getList(); }); src/views/salesManagement/salesLedger/index.vue
@@ -6,10 +6,6 @@ <el-input v-model="searchForm.customerName" placeholder="请输入" clearable prefix-icon="Search" @change="handleQuery" /> </el-form-item> <el-form-item label="客户合同号:"> <el-input v-model="searchForm.customerContractNo" placeholder="请输入" clearable prefix-icon="Search" @change="handleQuery" /> </el-form-item> <el-form-item label="销售合同号:"> <el-input v-model="searchForm.salesContractNo" placeholder="请输入" clearable prefix-icon="Search" @change="handleQuery" /> @@ -61,14 +57,20 @@ type="danger">不足</el-tag> </template> </el-table-column> <el-table-column label="发货状态" prop="shippingStatus" width="140" align="center" show-overflow-tooltip /> <el-table-column label="发货状态" width="140" align="center"> <template #default="scope"> <el-tag :type="getShippingStatusType(scope.row)" size="small"> {{ getShippingStatusText(scope.row) }} </el-tag> </template> </el-table-column> <el-table-column label="快递公司" prop="expressCompany" show-overflow-tooltip /> <el-table-column label="快递单号" prop="expressNumber" show-overflow-tooltip /> <el-table-column label="发货车牌" minWidth="100px" align="center"> <template #default="scope"> <div> <el-tag type="success" v-if="scope.row.shippingCarNumber">{{ scope.row.shippingCarNumber }}</el-tag> <el-tag v-else type="info">未发货</el-tag> <el-tag v-else type="info">-</el-tag> </div> </template> </el-table-column> @@ -95,7 +97,7 @@ link type="primary" size="small" :disabled="scope.row.approveStatus !== 1 || !!scope.row.shippingDate || !!scope.row.shippingCarNumber" :disabled="!canShip(scope.row)" @click="openDeliveryForm(scope.row)"> 发货 </el-button> @@ -106,7 +108,6 @@ </el-table-column> <el-table-column align="center" label="序号" type="index" width="60" /> <el-table-column label="销售合同号" prop="salesContractNo" width="180" show-overflow-tooltip /> <el-table-column label="客户合同号" prop="customerContractNo" width="180" show-overflow-tooltip /> <el-table-column label="客户名称" prop="customerName" width="300" show-overflow-tooltip /> <el-table-column label="业务员" prop="salesman" width="100" show-overflow-tooltip /> <el-table-column label="项目名称" prop="projectName" width="180" show-overflow-tooltip /> @@ -148,11 +149,6 @@ </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="客户合同号:" prop="customerContractNo"> <el-input v-model="form.customerContractNo" placeholder="请输入" clearable :disabled="operationType === 'view'"/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="客户名称:" prop="customerId"> <el-select v-model="form.customerId" placeholder="请选择" clearable :disabled="operationType === 'view'"> <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id"> @@ -163,17 +159,22 @@ </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="项目名称:" prop="projectName"> <el-input v-model="form.projectName" placeholder="请输入" clearable :disabled="operationType === 'view'" /> </el-form-item> </el-col> </el-row> <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="签订日期:" prop="executionDate"> <el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="请选择" clearable :disabled="operationType === 'view'" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="付款方式"> <el-input v-model="form.paymentMethod" placeholder="请输入" clearable :disabled="operationType === 'view'" /> </el-form-item> </el-col> </el-row> @@ -195,7 +196,6 @@ </el-form-item> </el-col> </el-row> <el-row> <el-form-item label="产品信息:" prop="entryDate"> <el-button v-if="operationType !== 'view'" type="primary" @click="openProductForm('add')">添加</el-button> @@ -1882,6 +1882,92 @@ isCalculating.value = false; }; /** * 获取发货状态文本 * @param row 行数据 */ const getShippingStatusText = (row) => { // 如果已发货(有发货日期或车牌号),显示"已发货" if (row.shippingDate || row.shippingCarNumber) { return '已发货'; } // 获取发货状态字段 const status = row.shippingStatus; // 如果状态为空或未定义,默认为"待发货" if (status === null || status === undefined || status === '') { return '待发货'; } // 状态是字符串 const statusStr = String(status).trim(); const statusTextMap = { '待发货': '待发货', '待审核': '待审核', '审核中': '审核中', '审核拒绝': '审核拒绝', '审核通过': '审核通过', '已发货': '已发货' }; return statusTextMap[statusStr] || '待发货'; }; /** * 获取发货状态标签类型(颜色) * @param row 行数据 */ const getShippingStatusType = (row) => { // 如果已发货(有发货日期或车牌号),显示绿色 if (row.shippingDate || row.shippingCarNumber) { return 'success'; } // 获取发货状态字段 const status = row.shippingStatus; // 如果状态为空或未定义,默认为灰色(待发货) if (status === null || status === undefined || status === '') { return 'info'; } // 状态是字符串 const statusStr = String(status).trim(); const typeTextMap = { '待发货': 'info', '待审核': 'info', '审核中': 'warning', '审核拒绝': 'danger', '审核通过': 'success', '已发货': 'success' }; return typeTextMap[statusStr] || 'info'; }; /** * 判断是否可以发货 * 只有在产品状态是充足,发货状态是待发货和审核拒绝的时候才可以发货 * @param row 行数据 */ const canShip = (row) => { // 产品状态必须是充足(approveStatus === 1) if (row.approveStatus !== 1) { return false; } // 获取发货状态 const shippingStatus = row.shippingStatus; // 如果已发货(有发货日期或车牌号),不能再次发货 if (row.shippingDate || row.shippingCarNumber) { return false; } // 发货状态必须是"待发货"或"审核拒绝" const statusStr = shippingStatus ? String(shippingStatus).trim() : ''; return statusStr === '待发货' || statusStr === '审核拒绝'; }; /** * 下载文件 * * @param row 下载文件的相关信息对象 @@ -1898,15 +1984,12 @@ // 打开发货弹框 const openDeliveryForm = (row) => { // 校验:只有产品状态为充足且未发货时才能发货 if (row.approveStatus !== 1) { proxy.$modal.msgWarning("产品状态不足,无法发货"); // 检查是否可以发货 if (!canShip(row)) { proxy.$modal.msgWarning("只有在产品状态是充足,发货状态是待发货或审核拒绝的时候才可以发货"); return; } if (row.shippingDate || row.shippingCarNumber) { proxy.$modal.msgWarning("该产品已发货,无法重复发货"); return; } currentDeliveryRow.value = row; deliveryForm.value = { type: "货车",