| src/views/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/procurementManagement/paymentEntry/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/procurementManagement/procurementLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/views/index.vue
@@ -18,126 +18,126 @@ </div> </div> </div> <div class="data-cards"> <div class="data-card sales"> <div class="data-title">销售数据</div> <div class="data-num"> <div> <div class="data-desc">本月销售额/元</div> <div class="data-value">{{businessInfo.monthSaleMoney}}</div> </div> <div> <div class="data-desc">未开票金额/元</div> <div class="data-value">{{businessInfo.monthSaleHaveMoney}}</div> </div> </div> </div> <div class="data-card purchase"> <div class="data-title">采购数据</div> <div class="data-num"> <div> <div class="data-desc">本月采购额/元</div> <div class="data-value">{{businessInfo.monthPurchaseMoney}}</div> </div> <div> <div class="data-desc">待付款金额/元</div> <div class="data-value">{{businessInfo.monthPurchaseHaveMoney}}</div> </div> </div> </div> <div class="data-card inventory"> <div class="data-title">库存数据</div> <div class="data-num"> <div> <div class="data-desc">当前库存总量/件</div> <div class="data-value">{{businessInfo.inventoryNum}}</div> </div> <div> <div class="data-desc">今日入库/件</div> <div class="data-value">{{businessInfo.todayInventoryNum}}</div> </div> </div> </div> </div> <!-- <div class="data-cards">--> <!-- <div class="data-card sales">--> <!-- <div class="data-title">销售数据</div>--> <!-- <div class="data-num">--> <!-- <div>--> <!-- <div class="data-desc">本月销售额/元</div>--> <!-- <div class="data-value">{{businessInfo.monthSaleMoney}}</div>--> <!-- </div>--> <!-- <div>--> <!-- <div class="data-desc">未开票金额/元</div>--> <!-- <div class="data-value">{{businessInfo.monthSaleHaveMoney}}</div>--> <!-- </div>--> <!-- </div>--> <!-- --> <!-- </div>--> <!-- <div class="data-card purchase">--> <!-- <div class="data-title">采购数据</div>--> <!-- <div class="data-num">--> <!-- <div>--> <!-- <div class="data-desc">本月采购额/元</div>--> <!-- <div class="data-value">{{businessInfo.monthPurchaseMoney}}</div>--> <!-- </div>--> <!-- <div>--> <!-- <div class="data-desc">待付款金额/元</div>--> <!-- <div class="data-value">{{businessInfo.monthPurchaseHaveMoney}}</div>--> <!-- </div>--> <!-- </div>--> <!-- </div>--> <!-- <div class="data-card inventory">--> <!-- <div class="data-title">库存数据</div>--> <!-- <div class="data-num">--> <!-- <div>--> <!-- <div class="data-desc">当前库存总量/件</div>--> <!-- <div class="data-value">{{businessInfo.inventoryNum}}</div>--> <!-- </div>--> <!-- <div>--> <!-- <div class="data-desc">今日入库/件</div>--> <!-- <div class="data-value">{{businessInfo.todayInventoryNum}}</div>--> <!-- </div>--> <!-- </div>--> <!-- </div>--> <!-- </div>--> </div> <!-- 右:待办事项 --> <div class="todo-panel"> <div class="section-title">待办事项</div> <ul class="todo-list" v-if="todoList.length > 0"> <li v-for="item in todoList" :key="item.id"> <div style="display: flex;flex-direction: column;justify-content: space-between;width: 100%;gap: 20px"> <div style="display: flex;justify-content: space-between;align-items: center;"> <div class="todo-title">流程编号:{{item.approveId}}</div> <div class="todo-division">申请部门:{{item.approveDeptName}}</div> <div class="todo-time">{{item.approveTime}}</div> </div> <div class="todo-division">审批事由:{{item.approveReason}}</div> </div> </li> </ul> <div v-else style="text-align: center"> 暂无数据 </div> </div> </div> <!-- 中部横向两栏 --> <div class="dashboard-row"> <div class="main-panel"> <div class="section-title">客户合同金额分析</div> <div class="contract-summary"> <div class="contract-info"> <img src="../assets/images/khtitle.png" alt="" style="width: 42px"/> <div class="contract-card"> <div class="contract-name">总合同金额(元)</div> <div class="contract-meta"> <div class="main-amount">{{sum}}</div> <div>周同比: <span class="up">{{yny}}% </span> 日环比: <span class="up">{{chain}}% </span></div> </div> </div> </div> </div> <div style="display: flex;align-items: center;gap: 20px;justify-content: space-evenly;height: 180px;margin-top: 20px"> <div> <Echarts ref="chart" :legend="pieLegend" :chartStyle="chartStylePie" :series="materialPieSeries" :tooltip="pieTooltip"></Echarts> </div> <ul class="contract-list"> <li v-for="item in materialPieSeries[0].data" :key="item.name"> <div style="display: flex;align-items: center;justify-content: space-between;width: 100%"> <div class="line" :style="{color: item.itemStyle.color}">●{{item.name}}</div> <div style="width: 70px">{{item.rate}}%</div> <div>¥{{item.value}}</div> </div> </li> </ul> </div> </div> <div class="main-panel"> <div style="display: flex;justify-content: space-between;"> <div class="section-title">应收应付统计</div> <!-- <el-radio-group v-model="radio1" size="large" @change="statisticsReceivable">--> <!-- <el-radio-button label="按周" :value="1" />--> <!-- <el-radio-button label="按月" :value="2" />--> <!-- <el-radio-button label="按季度" :value="3" />--> <!-- </el-radio-group>--> </div> <Echarts ref="chart" :color="barColors2" :chartStyle="chartStyle" :grid="grid" :series="barSeries" :tooltip="tooltip" :xAxis="xAxis" :yAxis="yAxis" style="height: 260px"></Echarts> </div> </div> <!-- <div class="todo-panel">--> <!-- <div class="section-title">待办事项</div>--> <!-- <ul class="todo-list" v-if="todoList.length > 0">--> <!-- <li v-for="item in todoList" :key="item.id">--> <!-- <div style="display: flex;flex-direction: column;justify-content: space-between;width: 100%;gap: 20px">--> <!-- <div style="display: flex;justify-content: space-between;align-items: center;">--> <!-- <div class="todo-title">流程编号:{{item.approveId}}</div>--> <!-- <div class="todo-division">申请部门:{{item.approveDeptName}}</div>--> <!-- <div class="todo-time">{{item.approveTime}}</div>--> <!-- </div>--> <!-- <div class="todo-division">审批事由:{{item.approveReason}}</div>--> <!-- </div>--> <!-- </li>--> <!-- </ul>--> <!-- <div v-else style="text-align: center">--> <!-- 暂无数据--> <!-- </div>--> <!-- </div>--> <!-- </div>--> <!-- --> <!-- <!– 中部横向两栏 –>--> <!-- <div class="dashboard-row">--> <!-- <div class="main-panel">--> <!-- <div class="section-title">客户合同金额分析</div>--> <!-- <div class="contract-summary">--> <!-- <div class="contract-info">--> <!-- <img src="../assets/images/khtitle.png" alt="" style="width: 42px"/>--> <!-- <div class="contract-card">--> <!-- <div class="contract-name">总合同金额(元)</div>--> <!-- <div class="contract-meta">--> <!-- <div class="main-amount">{{sum}}</div>--> <!-- <div>周同比: <span class="up">{{yny}}% </span> 日环比: <span class="up">{{chain}}% </span></div>--> <!-- </div>--> <!-- </div>--> <!-- </div>--> <!-- </div>--> <!-- <div style="display: flex;align-items: center;gap: 20px;justify-content: space-evenly;height: 180px;margin-top: 20px">--> <!-- <div>--> <!-- <Echarts ref="chart" :legend="pieLegend" :chartStyle="chartStylePie"--> <!-- :series="materialPieSeries"--> <!-- :tooltip="pieTooltip"></Echarts>--> <!-- </div>--> <!-- <ul class="contract-list">--> <!-- <li v-for="item in materialPieSeries[0].data" :key="item.name">--> <!-- <div style="display: flex;align-items: center;justify-content: space-between;width: 100%">--> <!-- <div class="line" :style="{color: item.itemStyle.color}">●{{item.name}}</div>--> <!-- <div style="width: 70px">{{item.rate}}%</div>--> <!-- <div>¥{{item.value}}</div>--> <!-- </div>--> <!-- </li>--> <!-- </ul>--> <!-- </div>--> <!-- </div>--> <!-- <div class="main-panel">--> <!-- <div style="display: flex;justify-content: space-between;">--> <!-- <div class="section-title">应收应付统计</div>--> <!--<!– <el-radio-group v-model="radio1" size="large" @change="statisticsReceivable">–>--> <!--<!– <el-radio-button label="按周" :value="1" />–>--> <!--<!– <el-radio-button label="按月" :value="2" />–>--> <!--<!– <el-radio-button label="按季度" :value="3" />–>--> <!--<!– </el-radio-group>–>--> <!-- </div>--> <!-- <Echarts ref="chart"--> <!-- :color="barColors2"--> <!-- :chartStyle="chartStyle"--> <!-- :grid="grid"--> <!-- :series="barSeries"--> <!-- :tooltip="tooltip"--> <!-- :xAxis="xAxis"--> <!-- :yAxis="yAxis"--> <!-- style="height: 260px"></Echarts>--> <!-- </div>--> <!-- </div>--> <!-- 底部横向两栏 --> <div class="dashboard-row"> <!-- <div class="dashboard-row">--> <!-- <div class="main-panel">--> <!-- <div class="section-title">质量统计</div>--> <!-- <div class="quality-cards">--> @@ -155,11 +155,11 @@ <!-- :yAxis="yAxis1"--> <!-- style="height: 260px"></Echarts>--> <!-- </div>--> <div class="main-panel"> <div class="section-title">回款与开票分析</div> <Echarts ref="chart" :chartStyle="chartStyle" :grid="grid" :legend="lineLegend" :series="lineSeries" :tooltip="tooltipLine" :xAxis="xAxis2" :yAxis="yAxis2" style="height: 270px;"></Echarts> </div> <!-- <div class="main-panel">--> <!-- <div class="section-title">回款与开票分析</div>--> <!-- <Echarts ref="chart" :chartStyle="chartStyle" :grid="grid" :legend="lineLegend" :series="lineSeries"--> <!-- :tooltip="tooltipLine" :xAxis="xAxis2" :yAxis="yAxis2" style="height: 270px;"></Echarts>--> <!-- </div>--> </div> </div> </template> @@ -507,7 +507,7 @@ min-width: 0; background-color: #EFF2FB; /* 使用指定的背景颜色 */ background-image: url("../assets/images/denglu.png"); background-size: cover; background-size: 100% 260%; background-position: center; background-repeat: no-repeat; border-radius: 12px; src/views/procurementManagement/paymentEntry/index.vue
@@ -83,15 +83,12 @@ </el-table-column> <el-table-column label="付款方式" prop="paymentMethod"> <template #default="scope"> <el-select <el-input :disabled="!scope.row.editType" v-model="scope.row.paymentMethod" placeholder="请选择" placeholder="请输入" clearable > <el-option label="电汇" value="电汇" /> <el-option label="承兑" value="承兑" /> </el-select> /> </template> </el-table-column> <el-table-column label="登记人" prop="registrant" /> @@ -212,14 +209,11 @@ <el-row :gutter="30"> <el-col :span="12"> <el-form-item label="付款方式:" prop="paymentMethod"> <el-select <el-input v-model="form.paymentMethod" placeholder="请选择" placeholder="请输入" clearable > <el-option label="电汇" value="电汇" /> <el-option label="承兑" value="承兑" /> </el-select> /> </el-form-item> </el-col> <el-col :span="12"> src/views/procurementManagement/procurementInvoiceLedger/Form/EditForm.vue
@@ -23,7 +23,7 @@ </el-col> <el-col :span="12"> <el-form-item label="发票号:"> <el-input disabled v-model="form.invoiceNumber" /> <el-input v-model="form.invoiceNumber" /> </el-form-item> </el-col> <el-col :span="12"> @@ -53,7 +53,10 @@ defineOptions({ name: "来票台账表单", }); const temFutureTickets = ref(0) const temFutureTickets = ref(0) // 初始未来票数 const initialTicketsNum = ref(0) // 初始来票数 const initialTicketsAmount = ref(0) // 初始来票金额 const quantity = ref(0) // 总数量 const { form, resetForm } = useFormData({ id: undefined, purchaseContractNumber: undefined, // 采购合同号 @@ -63,6 +66,7 @@ ticketsNum: undefined, // 来票数 ticketsAmount: undefined, // 来票金额 taxInclusiveUnitPrice: undefined, // 含税单价 ticketRegistrationId: undefined, // 含税单价 }); const load = async (id) => { @@ -74,10 +78,15 @@ form.createdAt = data.createdAt; form.invoiceNumber = data.invoiceNumber; form.ticketsNum = data.ticketsNum; form.ticketsAmount = data.ticketsAmount.toFixed(2); form.ticketsAmount = data.ticketsAmount ? Number(data.ticketsAmount).toFixed(2) : 0; form.taxInclusiveUnitPrice = data.taxInclusiveUnitPrice; form.futureTickets = data.futureTickets; temFutureTickets.value = data.futureTickets; initialTicketsNum.value = data.ticketsNum || 0; initialTicketsAmount.value = data.ticketsAmount || 0; form.ticketRegistrationId = data.ticketRegistrationId; // 获取总数量,如果数据中有 quantity 字段则使用,否则使用来票数+未来票数 quantity.value = data.quantity || (Number(data.ticketsNum || 0) + Number(data.futureTickets || 0)); } }; @@ -87,15 +96,44 @@ proxy.$modal.msgWarning("含税单价不能为零或未定义"); return; } if (Number(form.ticketsNum) > Number(temFutureTickets.value)) { proxy.$modal.msgWarning("开票数不得大于未开票数"); form.ticketsNum = temFutureTickets.value const newTicketsNum = Number(form.ticketsNum) || 0; const currentTicketsNum = Number(initialTicketsNum.value) || 0; // 计算新增的来票数 const addedTicketsNum = newTicketsNum - currentTicketsNum; // 计算新的未来票数 = 初始未来票数 - 新增的来票数 const newFutureTickets = Number(temFutureTickets.value) - addedTicketsNum; // 验证:新的来票数 + 新的未来票数 ≤ quantity if (newTicketsNum + newFutureTickets > Number(quantity.value)) { proxy.$modal.msgWarning(`来票数+未来票数不能大于总数量(${quantity.value})`); // 限制来票数,使其满足:来票数 + 未来票数 ≤ quantity // 最大来票数 = quantity - 初始未来票数 + 初始来票数 const maxTicketsNum = Number(quantity.value) - Number(temFutureTickets.value) + Number(initialTicketsNum.value); form.ticketsNum = Math.max(0, Math.min(maxTicketsNum, newTicketsNum)); // 重新计算 const recalculatedAddedTicketsNum = Number(form.ticketsNum) - Number(initialTicketsNum.value); const recalculatedFutureTickets = Number(temFutureTickets.value) - recalculatedAddedTicketsNum; form.futureTickets = Number(recalculatedFutureTickets.toFixed(2)); const ticketsAmount = Number(form.ticketsNum) * Number(form.taxInclusiveUnitPrice); form.ticketsAmount = Number(ticketsAmount.toFixed(2)); return; } // 检查新增的来票数是否大于初始未来票数 if (addedTicketsNum > Number(temFutureTickets.value)) { proxy.$modal.msgWarning("新增开票数不得大于未开票数"); form.ticketsNum = Number(initialTicketsNum.value) + Number(temFutureTickets.value); } // 确保所有数值都转换为数字类型进行计算 const ticketsAmount = Number(form.ticketsNum) * Number(form.taxInclusiveUnitPrice); const futureTickets = Number(temFutureTickets.value) - Number(form.ticketsNum); form.futureTickets = Number(futureTickets.toFixed(2)); const finalTicketsNum = Number(form.ticketsNum) || 0; const finalAddedTicketsNum = finalTicketsNum - Number(initialTicketsNum.value); const finalFutureTickets = Number(temFutureTickets.value) - finalAddedTicketsNum; const ticketsAmount = finalTicketsNum * Number(form.taxInclusiveUnitPrice); form.futureTickets = Number(finalFutureTickets.toFixed(2)); form.ticketsAmount = Number(ticketsAmount.toFixed(2)); }; const inputTicketsAmount = (val) => { @@ -105,17 +143,47 @@ return; } if (Number(val) > Number(form.futureTickets*form.taxInclusiveUnitPrice)) { proxy.$modal.msgWarning("本次来票金额不得大于总金额"); form.ticketsAmount = (form.futureTickets*form.taxInclusiveUnitPrice).toFixed(2) const ticketsNum = Number(form.ticketsAmount) / Number(form.taxInclusiveUnitPrice); form.ticketsNum = Number(ticketsNum.toFixed(2)) const newTicketsAmount = Number(val) || 0; // 计算新的来票数 const newTicketsNum = newTicketsAmount / Number(form.taxInclusiveUnitPrice); const currentTicketsNum = Number(initialTicketsNum.value) || 0; // 计算新增的来票数 const addedTicketsNum = newTicketsNum - currentTicketsNum; // 计算新的未来票数 = 初始未来票数 - 新增的来票数 const newFutureTickets = Number(temFutureTickets.value) - addedTicketsNum; // 验证:新的来票数 + 新的未来票数 ≤ quantity if (newTicketsNum + newFutureTickets > Number(quantity.value)) { proxy.$modal.msgWarning(`来票数+未来票数不能大于总数量(${quantity.value})`); // 限制来票数,使其满足:来票数 + 未来票数 ≤ quantity const maxTicketsNum = Number(quantity.value) - Number(temFutureTickets.value) + Number(initialTicketsNum.value); form.ticketsNum = Math.max(0, Math.min(maxTicketsNum, newTicketsNum)); form.ticketsAmount = Number((form.ticketsNum * Number(form.taxInclusiveUnitPrice)).toFixed(2)); const recalculatedAddedTicketsNum = Number(form.ticketsNum) - Number(initialTicketsNum.value); const recalculatedFutureTickets = Number(temFutureTickets.value) - recalculatedAddedTicketsNum; form.futureTickets = Number(recalculatedFutureTickets.toFixed(2)); return; } // 检查新增的来票金额是否大于初始未来票数对应的金额 const maxAddedAmount = Number(temFutureTickets.value * form.taxInclusiveUnitPrice); if (addedTicketsNum > 0 && addedTicketsNum * Number(form.taxInclusiveUnitPrice) > maxAddedAmount) { proxy.$modal.msgWarning("新增来票金额不得大于未开票金额"); form.ticketsAmount = Number((initialTicketsAmount.value + maxAddedAmount).toFixed(2)); form.ticketsNum = Number((currentTicketsNum + Number(temFutureTickets.value)).toFixed(2)); form.futureTickets = 0; return; } // 确保所有数值都转换为数字类型进行计算 const ticketsNum = Number(val) / Number(form.taxInclusiveUnitPrice); form.ticketsNum = Number(ticketsNum.toFixed(2)); const finalTicketsNum = Number(newTicketsNum.toFixed(2)); const finalAddedTicketsNum = finalTicketsNum - Number(initialTicketsNum.value); const finalFutureTickets = Number(temFutureTickets.value) - finalAddedTicketsNum; form.ticketsNum = finalTicketsNum; form.futureTickets = Number(finalFutureTickets.toFixed(2)); }; defineExpose({ src/views/procurementManagement/procurementLedger/index.vue
@@ -39,7 +39,6 @@ <div class="table_list"> <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;"> <el-button type="primary" @click="openForm('add')">新增台账</el-button> <el-button type="success" @click="openScanAddDialog">扫码新增</el-button> <el-button @click="handleOut">导出</el-button> <el-button type="danger" plain @click="handleDelete">删除</el-button> </div> @@ -148,7 +147,7 @@ <el-table-column fixed="right" label="操作" min-width="150" min-width="100" align="center" > <template #default="scope"> @@ -160,14 +159,6 @@ :disabled="scope.row.receiptPaymentAmount>0 || scope.row.recorderName !== userStore.nickName" >编辑</el-button > <el-button link type="success" size="small" @click="showQRCode(scope.row)" >生成二维码</el-button > </template> </el-table-column> </el-table> @@ -204,20 +195,12 @@ </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="销售合同号:" prop="salesLedgerId"> <el-select v-model="form.salesLedgerId" placeholder="请选择" <el-form-item label="销售合同号:" prop="salesContractNo"> <el-input v-model="form.salesContractNo" placeholder="请输入" clearable @change="salesLedgerChange" > <el-option v-for="item in salesContractList" :key="item.id" :label="item.salesContractNo" :value="item.id" /> </el-select> </el-form-item> </el-col> </el-row> @@ -551,221 +534,6 @@ </div> </template> </el-dialog> <!-- 二维码显示对话框 --> <el-dialog v-model="qrCodeDialogVisible" title="采购合同号二维码" width="400px" center > <div style="text-align: center;"> <img :src="qrCodeUrl" alt="二维码" style="width:200px;height:200px;" /> <div style="margin: 20px;"> <el-button type="primary" @click="downloadQRCode">下载二维码图片</el-button> </div> </div> </el-dialog> <!-- 扫码新增对话框 --> <el-dialog v-model="scanAddDialogVisible" title="扫码新增采购台账" width="70%" @close="closeScanAddDialog" > <el-form :model="scanAddForm" label-width="140px" label-position="top" :rules="scanAddRules" ref="scanAddFormRef" > <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="扫码内容:"> <el-input v-model="scanAddForm.scanContent" type="textarea" :rows="3" placeholder="请扫描二维码或手动输入采购合同信息" @input="parseScanContent" /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="采购合同号:" prop="purchaseContractNumber"> <el-input v-model="scanAddForm.purchaseContractNumber" placeholder="请输入" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="供应商名称:" prop="supplierName"> <el-input v-model="scanAddForm.supplierName" placeholder="请输入" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="项目名称:" prop="projectName"> <el-input v-model="scanAddForm.projectName" placeholder="请输入" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="合同金额(元):" prop="contractAmount"> <el-input-number v-model="scanAddForm.contractAmount" :precision="2" :step="0.1" clearable style="width: 100%" placeholder="请输入" /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="付款方式:"> <el-input v-model="scanAddForm.paymentMethod" placeholder="请输入" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="录入人:"> <el-input v-model="scanAddForm.recorderName" disabled /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="备注:"> <el-input v-model="scanAddForm.remark" type="textarea" :rows="2" placeholder="请输入备注信息" clearable /> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitScanAdd">确认新增</el-button> <el-button @click="closeScanAddDialog">取消</el-button> </div> </template> </el-dialog> <!-- 扫码登记对话框 --> <el-dialog v-model="scanDialogVisible" title="扫码登记" width="60%" @close="closeScanDialog" > <el-form :model="scanForm" label-width="120px" label-position="left" :rules="scanRules" ref="scanFormRef" > <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="采购合同号:"> <el-input v-model="scanForm.purchaseContractNumber" disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="供应商名称:"> <el-input v-model="scanForm.supplierName" disabled /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="项目名称:"> <el-input v-model="scanForm.projectName" disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="扫码时间:"> <el-input v-model="scanForm.scanTime" disabled /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="扫码人:"> <el-input v-model="scanForm.scannerName" disabled /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="扫码状态:"> <el-tag :type="scanForm.scanStatus === '已扫码' ? 'success' : 'warning'"> {{ scanForm.scanStatus }} </el-tag> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="扫码备注:"> <el-input v-model="scanForm.scanRemark" type="textarea" :rows="3" placeholder="请输入扫码备注信息" /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="扫码记录:"> <el-table :data="scanRecords" border style="width: 100%" stripe> <el-table-column label="序号" type="index" width="60" align="center" /> <el-table-column label="扫码时间" prop="scanTime" width="180" /> <el-table-column label="扫码人" prop="scannerName" width="120" /> <el-table-column label="扫码状态" prop="scanStatus" width="100"> <template #default="scope"> <el-tag :type="scope.row.scanStatus === '已扫码' ? 'success' : 'warning'"> {{ scope.row.scanStatus }} </el-tag> </template> </el-table-column> <el-table-column label="备注" prop="scanRemark" /> </el-table> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitScan">确认扫码</el-button> <el-button @click="closeScanDialog">取消</el-button> </div> </template> </el-dialog> </div> </template> @@ -781,12 +549,10 @@ addOrUpdateSalesLedgerProduct, delProduct, delLedgerFile, getProductInfoByContractNo, } from "@/api/salesManagement/salesLedger.js"; import { addOrEditPurchase, delPurchase, getSalesNo, purchaseListPage, productList, getPurchaseById, @@ -794,7 +560,6 @@ createPurchaseNo, } from "@/api/procurementManagement/procurementLedger.js"; import useFormData from "@/hooks/useFormData.js"; import QRCode from "qrcode"; const { proxy } = getCurrentInstance(); const tableData = ref([]); const productData = ref([]); @@ -803,7 +568,6 @@ const modelOptions = ref([]); const userList = ref([]); const productOptions = ref([]); const salesContractList = ref([]); const supplierList = ref([]); const tableLoading = ref(false); const page = reactive({ @@ -817,10 +581,6 @@ import dayjs from "dayjs"; const userStore = useUserStore(); // 二维码相关变量 const qrCodeDialogVisible = ref(false); const qrCodeUrl = ref(""); // 用户信息表单弹框数据 const operationType = ref(""); @@ -840,7 +600,7 @@ }, form: { purchaseContractNumber: "", salesLedgerId: "", salesContractNo: "", projectName: "", recorderId: "", entryDate: "", @@ -1018,9 +778,6 @@ } userListNoPage().then((res) => { userList.value = res.data; }); getSalesNo().then((res) => { salesContractList.value = res; }); getOptions().then((res) => { supplierList.value = res.data; @@ -1364,212 +1121,6 @@ } } }; // 销售合同选择改变方法 const salesLedgerChange = async (row) => { console.log("row", row); var index = salesContractList.value.findIndex((item) => item.id == row); console.log("index", index); if (index > -1) { form.value.projectName = salesContractList.value[index].projectName; await querygProductInfoByContractNo(); } }; const querygProductInfoByContractNo = async () => { const { code, data } = await getProductInfoByContractNo({ contractNo: form.value.salesLedgerId, }); if (code == 200) { productData.value = data; } }; // 显示二维码 const showQRCode = async (row) => { try { // 构建二维码内容,只包含采购合同号(纯文本) const qrContent = row.purchaseContractNumber || ''; // 检查内容是否为空 if (!qrContent || qrContent.trim() === '') { proxy.$modal.msgWarning("该行没有采购合同号,无法生成二维码"); return; } qrCodeUrl.value = await QRCode.toDataURL(qrContent, { width: 200, margin: 2, color: { dark: '#000000', light: '#FFFFFF' } }); qrCodeDialogVisible.value = true; } catch (error) { console.error('生成二维码失败:', error); proxy.$modal.msgError("生成二维码失败:" + error.message); } }; // 下载二维码 const downloadQRCode = () => { if (!qrCodeUrl.value) { proxy.$modal.msgWarning("二维码未生成"); return; } const a = document.createElement('a'); a.href = qrCodeUrl.value; a.download = `采购合同号二维码_${new Date().getTime()}.png`; document.body.appendChild(a); a.click(); document.body.removeChild(a); proxy.$modal.msgSuccess("下载成功"); }; // 扫码新增对话框相关变量 const scanAddDialogVisible = ref(false); const scanAddForm = reactive({ scanContent: "", purchaseContractNumber: "", supplierName: "", projectName: "", contractAmount: "", paymentMethod: "", recorderName: "", scanRemark: "", }); const scanAddRules = { purchaseContractNumber: [{ required: true, message: "请输入采购合同号", trigger: "blur" }], supplierName: [{ required: true, message: "请输入供应商名称", trigger: "blur" }], projectName: [{ required: true, message: "请输入项目名称", trigger: "blur" }], }; // 扫码登记对话框相关变量 const scanDialogVisible = ref(false); const scanForm = reactive({ purchaseContractNumber: "", supplierName: "", projectName: "", scanTime: "", scannerName: "", scanStatus: "未扫码", scanRemark: "", }); const scanRules = { scanRemark: [{ required: true, message: "请输入扫码备注", trigger: "blur" }], }; const scanRecords = ref([]); // 打开扫码新增对话框 const openScanAddDialog = () => { scanAddForm.scanContent = ""; scanAddForm.purchaseContractNumber = ""; scanAddForm.supplierName = ""; scanAddForm.projectName = ""; scanAddForm.contractAmount = ""; scanAddForm.paymentMethod = ""; scanAddForm.recorderName = userStore.nickName; scanAddForm.scanRemark = ""; scanAddDialogVisible.value = true; }; // 解析扫码内容(模拟解析二维码数据) const parseScanContent = (content) => { if (!content) return; // 模拟解析二维码内容,这里可以根据实际需求调整解析逻辑 // 假设扫码内容格式为:合同号|供应商|项目|金额|付款方式 const parts = content.split('|'); if (parts.length >= 3) { scanAddForm.purchaseContractNumber = parts[0] || ""; scanAddForm.supplierName = parts[1] || ""; scanAddForm.projectName = parts[2] || ""; scanAddForm.contractAmount = parts[3] || ""; scanAddForm.paymentMethod = parts[4] || ""; } }; // 关闭扫码新增对话框 const closeScanAddDialog = () => { scanAddDialogVisible.value = false; proxy.resetForm("scanAddFormRef"); }; // 提交扫码新增 const submitScanAdd = () => { proxy.$refs["scanAddFormRef"].validate((valid) => { if (valid) { // 构建新增数据 const newData = { purchaseContractNumber: scanAddForm.purchaseContractNumber, supplierName: scanAddForm.supplierName, projectName: scanAddForm.projectName, contractAmount: scanAddForm.contractAmount, paymentMethod: scanAddForm.paymentMethod, recorderName: scanAddForm.recorderName, entryDate: getCurrentDate(), remark: scanAddForm.scanRemark, type: 2 }; // 模拟新增成功 proxy.$modal.msgSuccess("扫码新增成功!"); closeScanAddDialog(); // 可以选择是否刷新列表 // getList(); } }); }; // 打开扫码登记对话框 const openScanDialog = (row) => { scanForm.purchaseContractNumber = row.purchaseContractNumber; scanForm.supplierName = row.supplierName; scanForm.projectName = row.projectName; scanForm.scanTime = getCurrentDateTime(); scanForm.scannerName = userStore.nickName; scanForm.scanStatus = "未扫码"; scanForm.scanRemark = ""; scanRecords.value = []; scanDialogVisible.value = true; }; // 关闭扫码登记对话框 const closeScanDialog = () => { scanDialogVisible.value = false; proxy.resetForm("scanFormRef"); }; // 提交扫码登记 const submitScan = () => { proxy.$refs["scanFormRef"].validate((valid) => { if (valid) { // 添加扫码记录 scanRecords.value.push({ ...scanForm, id: Date.now(), // 模拟ID scanTime: getCurrentDateTime(), }); scanForm.scanStatus = "已扫码"; scanForm.scanRemark = scanForm.scanRemark || "无"; proxy.$modal.msgSuccess("扫码登记成功!"); closeScanDialog(); } }); }; // 获取当前日期时间 function getCurrentDateTime() { const now = new Date(); const year = now.getFullYear(); const month = String(now.getMonth() + 1).padStart(2, "0"); const day = String(now.getDate()).padStart(2, "0"); const hours = String(now.getHours()).padStart(2, "0"); const minutes = String(now.getMinutes()).padStart(2, "0"); const seconds = String(now.getSeconds()).padStart(2, "0"); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } onMounted(() => {