| src/api/salesManagement/salesLedger.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/procurementManagement/procurementLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/salesManagement/salesLedger.js
@@ -116,4 +116,13 @@ method: "get", params: query, }); } // 根据销售合同号查询销售详情 export function getSalesByCode(query) { return request({ url: "/sales/ledger/getSalesByCode", method: "get", params: query, }); } src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
@@ -49,7 +49,7 @@ </el-form-item> </el-col> </el-row> <el-row v-if="!isPurchaseApproval"> <el-row v-if="!isPurchaseApproval && !isSalesApproval"> <el-col :span="24"> <el-form-item label="审批事由:" prop="approveReason"> <el-input v-model="form.approveReason" placeholder="请输入" clearable type="textarea" disabled/> @@ -119,6 +119,53 @@ <div style="margin-top: 20px;"> <h4>产品明细</h4> <el-table :data="purchaseProducts" 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> </el-skeleton> </div> <div v-if="isSalesApproval" style="margin: 10px 0 18px;"> <el-divider content-position="left">销售详情</el-divider> <el-skeleton :loading="salesLoading" 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="!salesDetail || !salesDetail.salesContractNo" description="未查询到对应销售详情" /> <template v-else> <el-descriptions :column="2" border> <el-descriptions-item label="销售合同号">{{ salesDetail.salesContractNo }}</el-descriptions-item> <el-descriptions-item label="客户合同号">{{ salesDetail.customerContractNo }}</el-descriptions-item> <el-descriptions-item label="客户名称">{{ salesDetail.customerName }}</el-descriptions-item> <el-descriptions-item label="业务员">{{ salesDetail.salesman }}</el-descriptions-item> <el-descriptions-item label="项目名称">{{ salesDetail.projectName }}</el-descriptions-item> <el-descriptions-item label="付款方式">{{ salesDetail.paymentMethod }}</el-descriptions-item> <el-descriptions-item label="录入人">{{ salesEntryPersonDisplay }}</el-descriptions-item> <el-descriptions-item label="录入日期">{{ salesDetail.entryDate }}</el-descriptions-item> <el-descriptions-item label="签订日期">{{ salesDetail.executionDate }}</el-descriptions-item> <el-descriptions-item label="合同金额" :span="2"> <span style="font-size: 18px; color: #e6a23c; font-weight: bold;"> ¥{{ Number(salesDetail.contractAmount ?? 0).toFixed(2) }} </span> </el-descriptions-item> </el-descriptions> <div style="margin-top: 20px;"> <h4>产品明细</h4> <el-table :data="salesProducts" border style="width: 100%"> <el-table-column prop="productCategory" label="产品名称" /> <el-table-column prop="specificationModel" label="规格型号" /> <el-table-column prop="unit" label="单位" /> @@ -216,6 +263,7 @@ updateApproveNode } from "@/api/collaborativeApproval/approvalProcess.js"; import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js"; import { getSalesByCode } from "@/api/salesManagement/salesLedger.js"; import useUserStore from "@/store/modules/user.js"; import {userListNoPageByTenantId} from "@/api/system/user.js"; import { WarningFilled, Edit, Check, MoreFilled } from '@element-plus/icons-vue' @@ -233,10 +281,34 @@ const purchaseLoading = ref(false) const currentPurchase = ref({}) const isPurchaseApproval = computed(() => Number(props.approveType) === 5) const salesLoading = ref(false) const currentSales = ref({}) const isSalesApproval = computed(() => Number(props.approveType) === 6) const purchaseDetail = computed(() => currentPurchase.value?.data || currentPurchase.value || {}) const purchaseProducts = computed(() => { const detail = purchaseDetail.value || {} return detail.productData || detail.products || detail.children || [] }) const salesDetail = computed(() => currentSales.value?.data || currentSales.value || {}) const salesProducts = computed(() => { const detail = salesDetail.value || {} return detail.productData || detail.products || detail.children || [] }) /** 销售详情:录入人(接口可能只返 entryPerson 用户ID,需用 userList 反查昵称) */ const salesEntryPersonDisplay = computed(() => { const d = salesDetail.value || {} if (d.entryPersonName) return d.entryPersonName if (d.recorderName) return d.recorderName if (d.createByName) return d.createByName if (d.createUserName) return d.createUserName const id = d.entryPerson if (id != null && id !== "" && userList.value?.length) { const u = userList.value.find( (x) => x.userId == id || String(x.userId) === String(id) ) if (u) return u.nickName } return id != null && id !== "" ? String(id) : "-" }) const data = reactive({ form: { @@ -297,6 +369,7 @@ operationType.value = type; dialogFormVisible.value = true; currentPurchase.value = {} currentSales.value = {} userListNoPageByTenantId().then((res) => { userList.value = res.data; }); @@ -313,6 +386,19 @@ proxy.$modal.msgError("查询采购详情失败") }).finally(() => { purchaseLoading.value = false }) } } if (isSalesApproval.value) { const salesContractNo = row?.approveReason if (salesContractNo) { salesLoading.value = true getSalesByCode({ salesContractNo }).then((res) => { currentSales.value = res || {} }).catch(() => { proxy.$modal.msgError("查询销售详情失败") }).finally(() => { salesLoading.value = false }) } } @@ -424,6 +510,8 @@ dialogFormVisible.value = false; purchaseLoading.value = false currentPurchase.value = {} salesLoading.value = false currentSales.value = {} emit('close') }; defineExpose({ src/views/procurementManagement/procurementLedger/index.vue
@@ -118,6 +118,31 @@ width="420" show-overflow-tooltip /> <el-table-column label="审批状态" width="140"> <template #default="scope"> <el-tag v-if="(scope.row.approveStatus ?? scope.row.approvalStatus ?? scope.row.auditStatus) == 0" type="warning" >待审核</el-tag> <el-tag v-else-if="(scope.row.approveStatus ?? scope.row.approvalStatus ?? scope.row.auditStatus) == 1" type="primary" >审核中</el-tag> <el-tag v-else-if="(scope.row.approveStatus ?? scope.row.approvalStatus ?? scope.row.auditStatus) == 2" type="success" >审核完成</el-tag> <el-tag v-else-if="(scope.row.approveStatus ?? scope.row.approvalStatus ?? scope.row.auditStatus) == 3" type="danger" >审核未通过</el-tag> <el-tag v-else-if="(scope.row.approveStatus ?? scope.row.approvalStatus ?? scope.row.auditStatus) == 4" type="info" >已重新提交</el-tag> <el-tag v-else type="info">-</el-tag> </template> </el-table-column> <el-table-column label="付款方式" width="100" src/views/salesManagement/salesLedger/index.vue
@@ -70,6 +70,40 @@ <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 /> <el-table-column label="审核状态" width="140"> <template #default="scope"> <template v-if="scope.row.salesType !== '紧急'"> <el-tag v-if="(scope.row.approveStatus ?? scope.row.approvalStatus) == 0" type="warning" >待审核</el-tag> <el-tag v-else-if="(scope.row.approveStatus ?? scope.row.approvalStatus) == 1" type="primary" >审核中</el-tag> <el-tag v-else-if="(scope.row.approveStatus ?? scope.row.approvalStatus) == 2" type="success" >审核完成</el-tag> <el-tag v-else-if="(scope.row.approveStatus ?? scope.row.approvalStatus) == 3" type="danger" >审核未通过</el-tag> <el-tag v-else-if="(scope.row.approveStatus ?? scope.row.approvalStatus) == 4" type="info" >已重新提交</el-tag> <el-tag v-else type="info">-</el-tag> </template> </template> </el-table-column> <el-table-column label="销售类型" width="120"> <template #default="scope"> <el-tag :type="scope.row.salesType === '紧急' ? 'danger' : 'info'" >{{ scope.row.salesType || '-' }}</el-tag> </template> </el-table-column> <el-table-column label="付款方式" prop="paymentMethod" show-overflow-tooltip /> <el-table-column label="合同金额(元)" prop="contractAmount" width="220" show-overflow-tooltip :formatter="formattedNumber" /> @@ -156,6 +190,62 @@ <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-col :span="12"> <el-form-item label="销售类型:" prop="salesType"> <el-select v-model="form.salesType" placeholder="请选择" clearable :disabled="operationType === 'view'" style="width: 100%" > <el-option label="普通" value="普通" /> <el-option label="紧急" value="紧急" /> </el-select> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="24"> <el-form-item v-if="operationType !== 'view'"> <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: 30px; text-align: center; margin-bottom: 10px;" > <div> <span>审批人</span> → </div> <el-select v-model="node.userId" placeholder="选择人员" 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> @@ -505,6 +595,8 @@ }); const total = ref(0); const fileList = ref([]); const approverNodes = ref([{ id: 1, userId: null }]); let nextApproverId = 2; // 用户信息表单弹框数据 const operationType = ref(""); @@ -531,8 +623,10 @@ productData: [], executionDate: "", paymentMethod: "", salesType: "普通", }, rules: { salesType: [{ required: true, message: "请选择销售类型", trigger: "change" }], salesman: [{ required: true, message: "请选择", trigger: "change" }], customerContractNo: [ { required: true, message: "请输入", trigger: "blur" }, @@ -546,6 +640,12 @@ }); const { form, rules } = toRefs(data); const { form: searchForm } = useFormData(data.searchForm); const addApproverNode = () => { approverNodes.value.push({ id: nextApproverId++, userId: null }); }; const removeApproverNode = (index) => { approverNodes.value.splice(index, 1); }; // 产品表单弹框数据 const productFormVisible = ref(false); const productOperationType = ref(""); @@ -759,6 +859,8 @@ operationType.value = type; form.value = {}; productData.value = []; approverNodes.value = [{ id: 1, userId: null }]; nextApproverId = 2; let userLists = await userListNoPage(); userList.value = userLists.data; customerList().then((res) => { @@ -770,8 +872,22 @@ getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => { form.value = { ...res }; form.value.entryPerson = Number(res.entryPerson); if (!form.value.salesType) { form.value.salesType = "普通"; } productData.value = form.value.productData; fileList.value = form.value.salesLedgerFiles; const approveUserIds = form.value.approveUserIds || form.value.approverIds; if (approveUserIds) { const ids = String(approveUserIds) .split(",") .map((id) => Number(id.trim())) .filter((id) => !Number.isNaN(id)); if (ids.length > 0) { approverNodes.value = ids.map((id, idx) => ({ id: idx + 1, userId: id })); nextApproverId = ids.length + 1; } } }); } // let userAll = await userStore.getInfo() @@ -781,6 +897,9 @@ // } // }); form.value.entryDate = getCurrentDate(); // 设置默认录入日期为当前日期 if (type === "add") { form.value.salesType = "普通"; } dialogFormVisible.value = true; }; function changs(val) { @@ -826,6 +945,14 @@ const submitForm = () => { proxy.$refs["formRef"].validate((valid) => { if (valid) { if (operationType.value !== "view") { const hasEmptyApprover = approverNodes.value.some((node) => !node.userId); if (hasEmptyApprover) { proxy.$modal.msgWarning("请为所有审批节点选择审批人"); return; } form.value.approveUserIds = approverNodes.value.map((node) => node.userId).join(","); } console.log('productData.value--', productData.value) if (productData.value !== null && productData.value.length > 0) { form.value.productData = proxy.HaveJson(productData.value);