diff --git a/packages/order-system/src/views/dashboard/components/rebate/OrderDetailList.vue b/packages/order-system/src/views/dashboard/components/rebate/OrderDetailList.vue index 2b40a0b37..c73cef239 100644 --- a/packages/order-system/src/views/dashboard/components/rebate/OrderDetailList.vue +++ b/packages/order-system/src/views/dashboard/components/rebate/OrderDetailList.vue @@ -16,7 +16,10 @@ export default { data() { return { loading: false, + // 最终选中的“明细行”列表(与之前保持一致:emit 给父组件的是明细数组) selectedList: [], + // 按 ordersNo 记录已选明细,用于 expand 展开后回显 + selectedByOrdersNo: {}, queryParams: { pageNum: 1, pageSize: 20 @@ -24,14 +27,66 @@ export default { }; }, computed: { - // 选择的货物列表 - filterSelectedList() { - return this.orderDetailList; + /** + * 将接口返回的订单明细按 ordersNo 合并为“同车一行”,明细放在 details 中 + * - ordersNo 相同:认为同一车/同一订单组 + * - 保留首条记录的公共字段用于汇总展示 + */ + groupedOrderList() { + const list = this.orderDetailList || []; + const map = {}; + const keyOrder = []; + + list.forEach(item => { + const key = item && item.ordersNo ? String(item.ordersNo) : '未知订单'; + if (!map[key]) { + map[key] = { + ordersNo: key, + orderDate: item?.orderDate, + customer: item?.customer, + supplier: item?.supplier, + levelName: item?.levelName, + countingUnit: item?.countingUnit, + details: [] + }; + keyOrder.push(key); + } + map[key].details.push(item); + }); + + return keyOrder.map(key => { + const group = map[key]; + return { + ...group, + detailCount: (group.details || []).length + }; + }); + } + }, + watch: { + // 数据源变化(重新查询/翻页)时,保持与旧行为一致:清空选择 + orderDetailList() { + this.selectedList = []; + this.selectedByOrdersNo = {}; } }, methods: { - handleSelectionChange(selection) { - this.selectedList = selection; + // 明细选择变化:按 ordersNo 维护,再汇总到 selectedList + handleInnerSelectionChange(ordersNo, selection) { + const key = ordersNo ? String(ordersNo) : '未知订单'; + this.$set(this.selectedByOrdersNo, key, selection || []); + const all = Object.keys(this.selectedByOrdersNo).reduce((acc, k) => { + return acc.concat(this.selectedByOrdersNo[k] || []); + }, []); + // 去重(同一明细不会重复,但防御性处理) + const uniqMap = {}; + this.selectedList = all.filter(item => { + const id = item && item.id; + if (id === null || id === undefined) return false; + if (uniqMap[id]) return false; + uniqMap[id] = true; + return true; + }); }, submitSelectOrderDetail() { this.$emit('handleSelect', this.selectedList); @@ -39,6 +94,21 @@ export default { // 对货物进行查询和筛选 handleQuery() { this.$emit('handleQuery', this.queryParams); + }, + // 展开行变化后回显已选明细 + handleExpandChange(row, expandedRows) { + const ordersNo = row?.ordersNo ? String(row.ordersNo) : '未知订单'; + this.$nextTick(() => { + const ref = this.$refs[`innerTable_${ordersNo}`]; + const table = Array.isArray(ref) ? ref[0] : ref; + if (!table) return; + + const selected = this.selectedByOrdersNo[ordersNo] || []; + table.clearSelection(); + (selected || []).forEach(item => { + table.toggleRowSelection(item, true); + }); + }); } } }; @@ -72,7 +142,7 @@ export default { v-horizontal-scroll="'always'" v-loading="loading" border - :data="filterSelectedList" + :data="groupedOrderList" :cell-style=" () => { return { padding: '.5px' }; @@ -80,32 +150,57 @@ export default { " max-height="700" size="mini" - @selection-change="handleSelectionChange" + row-key="ordersNo" + @expand-change="handleExpandChange" > - - - - - - - - - - - - - - - - + - - + + + + + + + +