From 804e1a8f2ba786871b844670916d8d0abf6bbdc4 Mon Sep 17 00:00:00 2001
From: xuan <1359774872@qq.com>
Date: Mon, 2 Nov 2026 14:24:06 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=87=BA=E4=BB=93?=
=?UTF-8?q?=E6=89=AB=E7=A0=81=E9=A1=B5=E5=B9=B6=E5=8D=87=E8=87=B31.1.18?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/storeFabricBusinessOut.js | 46 ++++-
.../storefabric/FabricOutSummaryTable.vue | 73 ++++++++
src/manifest.json | 4 +-
.../storefabric/storeFabricBusinessOutAdd.vue | 172 +++++-------------
.../storeFabricBusinessOutEdit.vue | 79 ++++----
.../storeFabricBusinessOutMixin.js | 35 +++-
.../storeFabricBusinessOutPage.scss | 41 +++++
7 files changed, 283 insertions(+), 167 deletions(-)
create mode 100644 src/components/storefabric/FabricOutSummaryTable.vue
diff --git a/src/common/storeFabricBusinessOut.js b/src/common/storeFabricBusinessOut.js
index 4b23c2b..a199283 100644
--- a/src/common/storeFabricBusinessOut.js
+++ b/src/common/storeFabricBusinessOut.js
@@ -125,7 +125,8 @@ export function getFineCodeDisplayWeight(fineCode) {
*/
export function normalizeOrder(order) {
if (!order) return null;
- const itemData = groupItemData((order.item_data || []).map((item) => normalizeItem(item)));
+ const normalizedItems = (order.item_data || []).map((item) => normalizeItem(item));
+ const itemData = groupItemData(normalizedItems);
return {
id: order.id,
order_no: order.order_no || '',
@@ -149,10 +150,52 @@ export function normalizeOrder(order) {
total_roll: formatRoll(order.total_roll),
total_weight: formatWeightKg(order.total_weight),
item_data: itemData,
+ summary_rows: buildSummaryRows(normalizedItems),
_raw: order,
};
}
+/** 扫码区下方汇总表列(与出仓明细表一致,可横向滑动) */
+export const SUMMARY_TABLE_COLUMNS = [
+ { label: '坯布编号', key: 'grey_fabric_code', width: 200 },
+ { label: '坯布名称', key: 'grey_fabric_name', width: 240 },
+ { label: '纱批', key: 'yarn_batch', width: 180 },
+ { label: '机台号', key: 'machine_number', width: 160 },
+ { label: '条数', key: 'roll', width: 140 },
+ { label: '重量', key: 'weight', width: 160 },
+];
+
+/** 汇总行归类:坯布编号 + 名称 + 纱批 + 机台号 */
+export function getSummaryGroupKey(item) {
+ return [
+ item.grey_fabric_code || '',
+ item.grey_fabric_name || '',
+ item.yarn_batch || '',
+ item.machine_number || '',
+ ].join('|');
+}
+
+/** 按坯布、纱批、机台号汇总条数和重量,供扫码区表格展示 */
+export function buildSummaryRows(items) {
+ const grouped = new Map();
+ (items || []).forEach((item) => {
+ const groupKey = getSummaryGroupKey(item);
+ const existing = grouped.get(groupKey);
+ if (!existing) {
+ grouped.set(groupKey, {
+ ...item,
+ group_key: groupKey,
+ fine_codes: [...(item.fine_codes || [])],
+ });
+ return;
+ }
+ existing.fine_codes.push(...(item.fine_codes || []));
+ existing.roll = Number((Number(existing.roll || 0) + Number(item.roll || 0)).toFixed(2));
+ existing.weight = Number((Number(existing.weight || 0) + Number(item.weight || 0)).toFixed(2));
+ });
+ return Array.from(grouped.values());
+}
+
/** 扫码详情区汇总维度(勾选后随扫码请求把对应 lock 字段传给后端) */
export const SCAN_GROUP_OPTIONS = [
{ key: 'produce_order_no', label: '合同' },
@@ -441,6 +484,7 @@ export function orderToFormFields(order) {
delivery_time: order.delivery_time,
remark: order.remark,
item_data: order.item_data,
+ summary_rows: order.summary_rows || [],
};
}
diff --git a/src/components/storefabric/FabricOutSummaryTable.vue b/src/components/storefabric/FabricOutSummaryTable.vue
new file mode 100644
index 0000000..25a4d3e
--- /dev/null
+++ b/src/components/storefabric/FabricOutSummaryTable.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+ 暂无数据~~
+
+
+
+
+
+
diff --git a/src/manifest.json b/src/manifest.json
index e81abce..db0eab7 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -2,8 +2,8 @@
"name" : "浩拓织厂",
"appid" : "__UNI__F79F300",
"description" : "周尚-浩拓织厂",
- "versionName" : "1.1.17",
- "versionCode" : 117,
+ "versionName" : "1.1.18",
+ "versionCode" : 118,
"transformPx" : false,
"app-plus" : {
"optimization" : {
diff --git a/src/pages/storefabric/storeFabricBusinessOutAdd.vue b/src/pages/storefabric/storeFabricBusinessOutAdd.vue
index f4a5b83..09a2453 100644
--- a/src/pages/storefabric/storeFabricBusinessOutAdd.vue
+++ b/src/pages/storefabric/storeFabricBusinessOutAdd.vue
@@ -1,79 +1,48 @@
-
-
-
-
-
-
-
-
- 出仓单号
-
-
-
-
-
-
-
- 出仓类型
-
- {{ getBillTypeName() }}
-
-
-
-
-
- 接收单位*
-
-
-
- {{ form.business_unit_name || '请选择' }}
-
-
-
+
+
+
-
-
-
- {{ dateLabel }}*
-
-
-
- {{ form.delivery_time }}
-
-
-
+
+ 出仓单号
+
+
+
+ 出仓类型
+ {{ getBillTypeName() }}
+
+
+ 接收单位*
+
+ {{ form.business_unit_name || '请选择' }}
+
+
+
+
+ {{ dateLabel }}*
+
+ {{ form.delivery_time }}
+
+
+
+ 单据备注
+
+
-
-
-
-
- 单据备注
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pages/storefabric/storeFabricBusinessOutEdit.vue b/src/pages/storefabric/storeFabricBusinessOutEdit.vue
index e3c1f0e..5dd33fc 100644
--- a/src/pages/storefabric/storeFabricBusinessOutEdit.vue
+++ b/src/pages/storefabric/storeFabricBusinessOutEdit.vue
@@ -1,35 +1,42 @@
-
-
-
- 出仓单号
- {{ form.order_no }}
-
-
- 出仓类型
- {{ getBillTypeName() }}
-
-
- 接收单位
- {{ form.business_unit_name || '-' }}
-
-
- {{ dateLabel }}
- {{ form.delivery_time }}
-
-
- 单据备注
- {{ form.remark || '-' }}
+
-
+
+
+
+ 出仓单号
+ {{ form.order_no }}
+
+
+ 出仓类型
+ {{ getBillTypeName() }}
+
+
+ 接收单位
+ {{ form.business_unit_name || '-' }}
+
+
+ {{ dateLabel }}
+ {{ form.delivery_time }}
+
+
+ 单据备注
+ {{ form.remark || '-' }}
+
+
+
+
-
+
+
@@ -67,9 +77,9 @@ import formMixin from './storeFabricBusinessOutMixin.js';
import FabricInfoPopup from '@/components/storefabric/FabricInfoPopup.vue';
import FineCodePopup from '@/components/storefabric/FineCodePopup.vue';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
-import FabricOutDetailList from '@/components/storefabric/FabricOutDetailList.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
import FabricOutScanDetail from '@/components/storefabric/FabricOutScanDetail.vue';
+import FabricOutSummaryTable from '@/components/storefabric/FabricOutSummaryTable.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import SearchSelectPopup from '@/components/storefabric/SearchSelectPopup.vue';
@@ -78,16 +88,23 @@ export default {
FabricInfoPopup,
FineCodePopup,
OrderStatusBar,
- FabricOutDetailList,
FabricOutScanBar,
FabricOutScanDetail,
+ FabricOutSummaryTable,
FabricOutFooter,
SearchSelectPopup,
},
mixins: [formMixin],
+ data() {
+ return {
+ pageMode: 'edit',
+ headerExpanded: false,
+ };
+ },
onLoad(e) {
uni.setNavigationBarTitle({ title: '编辑坯布出仓单' });
this.pageMode = 'edit';
+ this.headerExpanded = false;
if (e.id) {
this.loadOrder(Number(e.id), { rejectIfLocked: true });
}
diff --git a/src/pages/storefabric/storeFabricBusinessOutMixin.js b/src/pages/storefabric/storeFabricBusinessOutMixin.js
index d380848..4ba888e 100644
--- a/src/pages/storefabric/storeFabricBusinessOutMixin.js
+++ b/src/pages/storefabric/storeFabricBusinessOutMixin.js
@@ -4,9 +4,9 @@
* 业务说明:
* 1. 后端当前仅提供「坯布其他出货单」一种类型的接口,故出仓类型固定为 other,
* 表头保留接收单位(business_unit) / 出货日期 / 备注 等字段。
- * 2. 用户先填写表头并「提交保存」(addGfmOtherDeliveryOrder),拿到出仓单 id 后即可扫码;
+ * 2. 用户先填写表头并「提交保存」(addGfmOtherDeliveryOrder),拿到出仓单 id 后才显示扫码区和汇总表;
* 扫码新增/删除细码走 updateGfmOtherDeliveryOrder;勾选锁定维度时附带 *_lock 字段,操作后用返回的最新详情刷新。
- * 3. 后端没有「修改表头」接口,保存成功或编辑进入后表头变为只读,仅可扫码维护细码。
+ * 3. 后端没有「修改表头」接口,保存成功或编辑进入后表头变为只读,并默认收起,仅可扫码维护细码。
*/
import util from '@/common/util';
import scanMixin from '@/common/scanMixin.js';
@@ -42,6 +42,8 @@ export default {
orderId: 0,
form: this.getEmptyForm(),
headerSaved: false,
+ // 新增未保存时展开表头;保存后及编辑进入时收起
+ headerExpanded: true,
selectShow: false,
selectList: [],
selectType: '',
@@ -75,6 +77,14 @@ export default {
headerEditable() {
return this.pageMode === 'add' && !this.headerSaved;
},
+ /** 已保存或编辑页才提供收起/展开 */
+ showHeaderToggle() {
+ return this.pageMode === 'edit' || this.headerSaved;
+ },
+ /** 未保存只填表头;保存后才出现扫码区与汇总表 */
+ showScanSection() {
+ return this.headerSaved;
+ },
dateLabel() {
return '出货日期';
},
@@ -151,8 +161,13 @@ export default {
delivery_time: this.$u.timeFormat(new Date(), 'yyyy-mm-dd'),
remark: '',
item_data: [],
+ summary_rows: [],
};
},
+ toggleHeader() {
+ if (!this.showHeaderToggle) return;
+ this.headerExpanded = !this.headerExpanded;
+ },
loadOrder(id, options = {}) {
const { rejectIfLocked = false } = options;
return this.$u.api.gfmOtherDeliveryOrder.detail({ id })
@@ -242,6 +257,7 @@ export default {
const order = normalizeOrder(detail);
this.applyOrder(order);
this.headerSaved = true;
+ this.headerExpanded = false;
this.syncCanScanFromStatus(order.audit_status);
this.showSuccess('保存成功,可以扫码', '提交成功');
this.registerOrderScanBroadcast();
@@ -325,11 +341,13 @@ export default {
uni.hideLoading();
const order = normalizeOrder(detail);
this.form.item_data = order.item_data;
+ this.form.summary_rows = order.summary_rows || [];
this.auditStatus = order.audit_status;
this.applyScanDetail(scanCode, order, scanType);
if (refreshFineCodes) {
- const row = order.item_data.find((i) => (i.group_key || String(i.id)) === this.currentGroupKey);
- this.currentFineCodes = row ? [...row.fine_codes] : [];
+ const rows = order.summary_rows || [];
+ const row = rows.find((i) => i.group_key === this.currentGroupKey);
+ this.currentFineCodes = row ? [...(row.fine_codes || [])] : [];
}
this.BillDataMessage = scanType === 2 ? '删除成功' : '扫码出仓成功';
this.QRBarCode = '';
@@ -351,6 +369,15 @@ export default {
this.currentFineCodes = [...(row.fine_codes || [])];
this.fineCodeShow = true;
},
+ onSummaryCellClick(event) {
+ const row = event && event.lineData;
+ if (!row) return;
+ if (event.key === 'grey_fabric_code' || event.key === 'grey_fabric_name') {
+ this.openFabricInfo(row);
+ return;
+ }
+ this.openFineCode(row);
+ },
onDeleteFineCode(fineCode) {
if (this.isReadonly || !this.canScan) return;
const scanCode = getFineCodeScanCode(fineCode);
diff --git a/src/pages/storefabric/storeFabricBusinessOutPage.scss b/src/pages/storefabric/storeFabricBusinessOutPage.scss
index 7b50b23..7a807b1 100644
--- a/src/pages/storefabric/storeFabricBusinessOutPage.scss
+++ b/src/pages/storefabric/storeFabricBusinessOutPage.scss
@@ -6,6 +6,47 @@
.fabric-out-mt32 {
margin-top: 32rpx;
}
+.fabric-out-headerBar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ min-height: 100rpx;
+ padding: 16rpx 26rpx;
+ background: #fff;
+ border-bottom: 1rpx solid #f5f5f5;
+ box-sizing: border-box;
+}
+.fabric-out-headerBarMain {
+ display: flex;
+ align-items: center;
+ min-width: 0;
+ flex: 1;
+}
+.fabric-out-headerBarTitle {
+ font-size: 40rpx;
+ font-weight: bold;
+ color: #333;
+ flex-shrink: 0;
+}
+.fabric-out-headerBarSub {
+ margin-left: 16rpx;
+ font-size: 36rpx;
+ color: #666;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.fabric-out-headerBarAction {
+ display: flex;
+ align-items: center;
+ flex-shrink: 0;
+ margin-left: 16rpx;
+ font-size: 36rpx;
+ color: #2979ff;
+}
+.fabric-out-headerBarIcon {
+ margin-left: 8rpx;
+}
.fabric-out-page .flex-white-plr26,
.fabric-out-page .flex-white-plr26-column,
.fabric-out-page .flex-white-plr26 text,