Elmentui实现订单拆单功能

news/2024/11/22 19:32:32/

Elmentui实现订单拆分开票功能

需求

订单在开票时候,允许按照订单明细行和数量拆分开票,一个订单需要一次性完成全部明细行拆分才能提交开票

思路

实现一个订单拆单的功能,支持按照行和数量拆分,使用elementui
首先有一个table显示全部订单行明细,table下面有tabs默认有一个tab,通过点击添加和删除按钮新增tab,tab中也有新增和删除按钮,用于选择第一个tab中的明细行,直到全部明细拆分完成

示例代码

html"><template><div><el-table :data="orderDetails" border style="width: 100%"><el-table-column prop="productName" label="产品名称" width="150"></el-table-column><el-table-column prop="quantity" label="数量" width="100"><template slot-scope="scope"><el-input-numberv-model="scope.row.quantity":min="0"@change="handleQuantityChange(scope.row)"></el-input-number></template></el-table-column><el-table-column prop="price" label="单价" width="100"></el-table-column><el-table-column prop="total" label="总价" width="100"></el-table-column></el-table><el-tabs v-model="activeTabIndex" type="card" @tab-remove="handleTabRemove"><el-tab-pane v-for="(tab, index) in splitTabs" :key="index" :label="'拆单' + (index + 1)"><el-table :data="tab.selectedDetails" border style="width: 100%"><el-table-column prop="productName" label="产品名称" width="150"></el-table-column><el-table-column prop="quantity" label="数量" width="100"><template slot-scope="scope"><el-input-numberv-model="scope.row.quantity":min="0"@change="handleSelectedQuantityChange(tab, scope.row)"></el-input-number></template></el-table-column><el-table-column prop="price" label="单价" width="100"></el-table-column><el-table-column prop="total" label="总价" width="100"></el-table-column><el-table-column label="操作"><template slot-scope="scope"><el-buttontype="danger"size="mini"@click="handleRemoveSelectedRow(tab, scope.$index)">删除</el-button></template></el-table-column></el-table><el-row><el-col :span="12"><el-select v-model="selectedProduct" placeholder="选择产品"><el-optionv-for="product in orderDetails":key="product.productName":label="product.productName":value="product.productName"></el-option></el-select></el-col><el-col :span="12"><el-input-number v-model="selectedQuantity" :min="0" placeholder="输入数量"></el-input-number></el-col><el-button type="primary" @click="handleAddSelectedRow(splitTabs[activeTabIndex])">添加明细</el-button></el-row></el-tab-pane></el-tabs><el-button type="primary" @click="handleAddTab">添加拆单Tab</el-button></div>
</template><script>
export default {data() {return {orderDetails: [{productName: '产品A',quantity: 10,price: 100,total: 1000},{productName: '产品B',quantity: 5,price: 200,total: 1000},{productName: '产品C',quantity: 8,price: 150,total: 1200}],splitTabs: [{selectedDetails: []}],activeTabIndex: 0,selectedProduct: '',selectedQuantity: 0}},methods: {handleAddTab() {this.splitTabs.push({selectedDetails: []});},handleTabRemove(targetName) {const index = this.splitTabs.findIndex(tab => tab.label === targetName);if (index!== -1) {this.splitTabs.splice(index, 1);if (this.activeTabIndex === index && this.splitTabs.length > 0) {this.activeTabIndex = Math.min(this.activeTabIndex, this.splitTabs.length - 1);}}},handleAddSelectedRow(tab) {const product = this.orderDetails.find(item => item.productName === this.selectedProduct);if (product) {tab.selectedDetails.push({...product,quantity: this.selectedQuantity});this.selectedProduct = '';this.selectedQuantity = 0;}},handleRemoveSelectedRow(tab, rowIndex) {const removedRow = tab.selectedDetails[rowIndex];this.returnQuantityToOriginal(removedRow);tab.selectedDetails.splice(rowIndex, 1);},handleQuantityChange(row) {const currentQuantity = row.quantity;const index = this.orderDetails.findIndex(item => item.productName === row.productName);if (index!== -1) {this.orderDetails[index].quantity = currentQuantity;}},handleSelectedQuantityChange(tab, row) {const currentQuantity = row.quantity;const sourceIndex = this.orderDetails.findIndex(item => item.productName === row.productName);if (sourceIndex!== -1) {const quantityDiff = this.orderDetails[sourceIndex].quantity - currentQuantity;this.orderDetails[sourceIndex].quantity = currentQuantity;this.updateQuantityInTabs(tab, row.productName, quantityDiff);}},updateQuantityInTabs(tab, productName, quantityDiff) {tab.selectedDetails.forEach(item => {if (item.productName === productName) {item.quantity += quantityDiff;}});},returnQuantityToOriginal(removedRow) {const index = this.orderDetails.findIndex(item => item.productName === removedRow.productName);if (index!== -1) {this.orderDetails[index].quantity += removedRow.quantity;}}}
}
</script>

最终效果

在这里插入图片描述

点击添加拆单tab新增一个tab
添加明细,选择产品,输入数量,在当前tab新增一行

样式和交互暂时未做处理


http://www.ppmy.cn/news/1549113.html

相关文章

『ZJUBCA 赛事回顾』波卡黑客松总决赛-求是联盟的辉煌征程

2024 求是创新 ZJUBCA Sponsored by the ALCOVE Community TIME&#xff1a;2024/11/16 ADD&#xff1a;曼谷 01 活动介绍/Overview 2024 年 Polkadot 黑客松&#xff08;Polkadot Hackathon 2024&#xff09;在曼谷举行&#xff0c;这是区块链和 Web3 开发领域的一项重要活动。…

软件测试—— Selenium 常用函数(一)

前一篇文章&#xff1a;软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中&#xff0c;我们介绍了自动化的一些基础知识&a…

【CSS in Depth 2 精译_058】第九章 CSS 的模块化与作用域 + 9.1 CSS 模块的定义(下)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第三部分 现代 CSS 代码组织】【第九章 CSS 的模块化与作用域】 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体 ✔️9.1.4 多元素模块 ✔️ 9.2 将模块组合为更…

uniapp页面样式和布局和nvue教程详解

uniapp页面样式和布局和nvue教程 尺寸单位 uni-app 支持的通用 css 单位包括 px、rpx px 即屏幕像素。rpx 即响应式px&#xff0c;一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准&#xff0c;750rpx恰好为屏幕宽度。屏幕变宽&#xff0c;rpx 实际显示效果会等比放大…

Linux - 弯路系列4:安装Torque、PBS作业系统及遇到的问题

系统&#xff1a;Anolis8&#xff08;离线&#xff09;&#xff0c;所有命令在root账户下进行 目录 1、安装步骤2、问题汇总&#xff08;1&#xff09;socket_connect_unix failed: 15137 / could not connect to trqauthd&#xff08;2&#xff09;cannot connect to server …

2.13 转换矩阵

转换矩阵引用了库nalgebra&#xff0c;使用时研究具体实现。 use std::ops;use nalgebra::Perspective3;use crate::Scalar;use super::{Aabb, LineSegment, Point, Triangle, Vector};/// An affine transform #[repr(C)] #[derive(Debug, Clone, Copy, Default)] pub struct…

【Ubuntu下离线安装docker】

一、前言 国内无法安装docker&#xff0c;因为无法连接docker官网&#xff0c;所以写下此教程二、环境 1、虚拟机下的Ubuntu22.04 2、科学上网工具,用于下载docker离线包三、下载docker离线包 1、查看Ubuntu22.04环境 rootapq-virtual-machine:/home/apq# lsb_release -a No…

【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段

文章目录 一、MyBatis-Plus简介二、快速入门1、环境准备2、将mybatis项目改造成mybatis-plus项目&#xff08;1&#xff09;引入MybatisPlus依赖&#xff0c;代替MyBatis依赖&#xff08;2&#xff09;配置Mapper包扫描路径&#xff08;3&#xff09;定义Mapper接口并继承BaseM…