feat: 单据收起汇总明细,CDN改新地址并升至1.1.18

This commit is contained in:
2026-11-06 20:27:03 +08:00
parent 69608b92d7
commit 5557819e64
29 changed files with 662 additions and 524 deletions
+4 -4
View File
@@ -125,14 +125,14 @@ node scripts/upload-apk.js --file D:\path\你的.apk --target test
| 参数 | 说明 |
|---|---|
| `--target test` | 测试 CDN:`https://testhcscm.cdn.zzfzyc.com` |
| `--target prod` | 正式 CDN:`https://hcscm.cdn.zzfzyc.com` |
| `--target test` | 测试 CDN:`https://zsfzcdn.yushangfangzhi.com` |
| `--target prod` | 正式 CDN:`https://zsfzcdn.yushangfangzhi.com` |
| `--mode` | 默认 `zhoushang`。可选 `zhoushang`、`zhisheng`、`mes`、`cjt` |
| `--version` | 可选。不传则用 `src/manifest.json` 的 `versionName` |
场景值取对应 `.env.{mode}` 里的 `VUE_APP_UPGRADE_NAME`。保存路径为 `/version/{场景值}/{版本号}.apk`。版本包上传成功后,同一份安装包会再传到 `/version/{场景值}/latest.apk`。本分支默认场景是 `.env.zhoushang` 的 `erp_pda_zhoushang`,上传成功后会打印完整下载地址,例如:
```
https://testhcscm.cdn.zzfzyc.com/version/erp_pda_zhoushang/1.1.9.apk
https://testhcscm.cdn.zzfzyc.com/version/erp_pda_zhoushang/latest.apk
https://zsfzcdn.yushangfangzhi.com/version/erp_pda_zhoushang/1.1.9.apk
https://zsfzcdn.yushangfangzhi.com/version/erp_pda_zhoushang/latest.apk
```
+2 -2
View File
@@ -24,8 +24,8 @@ const ROOT = path.resolve(__dirname, '..');
const API_BASE = 'https://hcscmtest.zzfzyc.com/hcscm';
const UPYUN_API = 'https://v0.api.upyun.com';
const CDN_HOST = {
test: 'https://testhcscm.cdn.zzfzyc.com',
prod: 'https://hcscm.cdn.zzfzyc.com',
test: 'https://zsfzcdn.yushangfangzhi.com',
prod: 'https://zsfzcdn.yushangfangzhi.com',
};
const MODE_ENV = {
@@ -1,36 +1,157 @@
<template>
<view>
<view class="fabric-out-sectionTitle">{{ title }}</view>
<view class="summary-title">{{ title }}</view>
<slot name="before-list" />
<view class="fabric-out-detailList">
<view
v-for="row in list"
:key="row.group_key || row.id"
class="fabric-out-detailCard"
>
<view class="fabric-out-detailRow" @click="$emit('fabric-info', row)">
<text>{{ row.grey_fabric_code }}#{{ row.grey_fabric_name }}</text>
<u-icon name="arrow-right" size="32" color="#888" />
<view class="summary-wrap">
<scroll-view scroll-x class="summary-scroll">
<view class="summary-table" :style="{ width: tableWidth }">
<view class="summary-row summary-head">
<view
v-for="col in columns"
:key="col.key"
class="summary-cell"
:style="cellStyle(col)"
>{{ col.label }}</view>
</view>
<view v-if="!list.length" class="summary-empty">暂无出仓明细</view>
<view
v-for="row in list"
:key="row.group_key || row.id"
class="summary-row"
@click="$emit('fabric-info', row)"
>
<view class="summary-cell" :style="cellStyle(columns[0])">{{ row.grey_fabric_code || '-' }}</view>
<view class="summary-cell" :style="cellStyle(columns[1])">{{ row.grey_fabric_name || '-' }}</view>
<view class="summary-cell" :style="cellStyle(columns[2])">{{ displayNum(row.roll) }}</view>
<view class="summary-cell" :style="cellStyle(columns[3])">{{ displayNum(row.weight) }}</view>
<view
class="summary-cell summary-action"
:style="cellStyle(columns[4])"
@click.stop="$emit('fine-code', row)"
>细码</view>
</view>
<view v-if="list.length" class="summary-row summary-total">
<view class="summary-cell" :style="cellStyle(columns[0])">合计</view>
<view class="summary-cell" :style="cellStyle(columns[1])"></view>
<view class="summary-cell" :style="cellStyle(columns[2])">{{ totalRoll }}</view>
<view class="summary-cell" :style="cellStyle(columns[3])">{{ totalWeight }}</view>
<view class="summary-cell" :style="cellStyle(columns[4])"></view>
</view>
</view>
<view class="fabric-out-detailMeta">
<text>匹数:{{ row.roll }}</text>
<text>重量:{{ row.weight }}KG</text>
<u-button type="primary" size="mini" @click="$emit('fine-code', row)">细码</u-button>
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
const COLUMNS = [
{ key: 'grey_fabric_code', label: '坯布编号', width: 220 },
{ key: 'grey_fabric_name', label: '坯布名称', width: 260 },
{ key: 'roll', label: '匹数', width: 140 },
{ key: 'weight', label: '重量', width: 160 },
{ key: 'action', label: '操作', width: 140 },
];
export default {
props: {
list: { type: Array, default: () => [] },
title: { type: String, default: '出仓细码' },
},
computed: {
columns() {
return COLUMNS;
},
tableWidth() {
const total = COLUMNS.reduce((sum, col) => sum + col.width, 0);
return `${total}rpx`;
},
totalRoll() {
return this.sumField('roll');
},
totalWeight() {
return this.sumField('weight');
},
},
methods: {
cellStyle(col) {
return {
width: `${col.width}rpx`,
minWidth: `${col.width}rpx`,
maxWidth: `${col.width}rpx`,
};
},
displayNum(val) {
if (val === 0) return '0';
return val != null && val !== '' ? val : '-';
},
sumField(key) {
const total = (this.list || []).reduce((sum, row) => sum + Number(row[key] || 0), 0);
return Number(total.toFixed(2));
},
},
};
</script>
<style scoped lang="scss">
@import '@/pages/storefabric/storeFabricBusinessOutPage.scss';
@import '@/common/pda-typography.scss';
.summary-title {
font-size: $pda-font-body;
font-weight: bold;
padding: 24rpx 26rpx 12rpx;
border-left: 6rpx solid #007AFF;
margin: 20rpx 26rpx 0;
}
.summary-wrap {
margin: 0 26rpx 16rpx;
background: #fff;
border-radius: 12rpx;
overflow: hidden;
}
.summary-scroll {
width: 100%;
}
.summary-row {
display: flex;
align-items: stretch;
border-bottom: 1rpx solid #f0f0f0;
}
.summary-row:last-child {
border-bottom: none;
}
.summary-head {
background: #f7f8fa;
}
.summary-total {
background: #fff7e6;
}
.summary-cell {
box-sizing: border-box;
display: flex;
align-items: center;
min-height: $pda-row-min-height;
padding: 12rpx 16rpx;
font-size: $pda-font-body;
color: #333;
border-right: 1rpx solid #f0f0f0;
word-break: break-all;
}
.summary-head .summary-cell,
.summary-total .summary-cell {
font-weight: bold;
}
.summary-head .summary-cell {
color: #666;
}
.summary-cell:last-child {
border-right: none;
}
.summary-action {
color: #2979ff;
}
.summary-empty {
padding: 28rpx 16rpx;
font-size: $pda-font-placeholder;
color: #999;
}
</style>
@@ -0,0 +1,60 @@
<template>
<view class="order-header-fold">
<view class="order-header-fold__bar" @click="toggle">
<text class="order-header-fold__title">单据信息</text>
<text v-if="value && summary" class="order-header-fold__summary">{{ summary }}</text>
<text class="order-header-fold__action">{{ value ? '展开' : '收起' }}</text>
</view>
<view v-show="!value">
<slot />
</view>
</view>
</template>
<script>
export default {
props: {
value: { type: Boolean, default: false },
summary: { type: String, default: '' },
},
methods: {
toggle() {
this.$emit('input', !this.value);
},
},
};
</script>
<style scoped lang="scss">
@import '@/common/pda-typography.scss';
.order-header-fold__bar {
display: flex;
align-items: center;
min-height: $pda-row-min-height;
margin: 16rpx 26rpx 0;
padding: 0 24rpx;
background: #fff;
border-radius: 12rpx;
}
.order-header-fold__title {
font-size: $pda-font-body;
font-weight: bold;
color: #1a1a1a;
}
.order-header-fold__summary {
flex: 1;
margin-left: 16rpx;
font-size: $pda-font-action;
color: #666;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.order-header-fold__action {
margin-left: auto;
padding-left: 16rpx;
font-size: $pda-font-action;
color: #2979ff;
}
</style>
@@ -0,0 +1,326 @@
<template>
<view>
<view class="summary-title">{{ title }}</view>
<slot name="before-list" />
<view class="summary-wrap">
<scroll-view scroll-x class="summary-scroll">
<view class="summary-table" :style="{ width: tableWidth }">
<view class="summary-row summary-head">
<view
v-for="col in columns"
:key="col.key"
class="summary-cell"
:style="cellStyle(col)"
>{{ col.label }}</view>
</view>
<view v-if="!rows.length" class="summary-empty">{{ emptyText }}</view>
<view
v-for="row in rows"
:key="row.group_key"
class="summary-row"
:class="{ 'summary-row--open': expandedKey === row.group_key }"
@click="toggleRow(row.group_key)"
>
<view
v-for="col in columns"
:key="col.key"
class="summary-cell"
:style="cellStyle(col)"
>{{ formatCell(row, col.key) }}</view>
</view>
<view v-if="rows.length" class="summary-row summary-total">
<view
v-for="col in columns"
:key="col.key"
class="summary-cell"
:style="cellStyle(col)"
>{{ totalCell(col.key) }}</view>
</view>
</view>
</scroll-view>
<view v-if="expandedRow" class="summary-fine">
<view class="summary-fineTitle">
细码({{ expandedRow.fine_codes.length }})
<text class="summary-fineHint">{{ expandedKey ? '点击行收起' : '' }}</text>
</view>
<view v-if="!expandedRow.fine_codes.length" class="summary-empty">暂无细码</view>
<scroll-view v-else scroll-x class="summary-scroll">
<view class="summary-table" :style="{ width: fineTableWidth }">
<view class="summary-row summary-head">
<view
v-for="col in fineCols"
:key="col.key"
class="summary-cell"
:style="cellStyle(col)"
>{{ col.label }}</view>
</view>
<view
v-for="(fc, fcIndex) in expandedRow.fine_codes"
:key="fc.id || fcIndex"
class="summary-row"
>
<view
v-for="col in fineCols"
:key="col.key"
class="summary-cell"
:class="{ 'summary-action': col.key === 'action' }"
:style="cellStyle(col)"
@click="onFineCellTap(col.key, fc)"
>{{ formatFineCell(fc, col.key) }}</view>
</view>
</view>
</scroll-view>
<view v-if="deletable && expandedRow.fine_codes.length" class="summary-tip">
点击「删除」移除对应细码
</view>
</view>
</view>
</view>
</template>
<script>
const SUMMARY_COLUMNS = [
{ label: '成品编号', key: 'product_code', width: 260 },
{ label: '色号', key: 'product_color_code', width: 220 },
{ label: '匹数', key: 'roll', width: 140 },
{ label: '数量', key: 'weight', width: 160 },
{ label: '染整单', key: 'quote_order_no', width: 260 },
{ label: '缸号', key: 'dye_factory_dyelot_number', width: 220 },
];
const FINE_COLUMNS = [
{ label: '卷号', key: 'volume_number', width: 140 },
{ label: '外部卷号', key: 'extern_volume_number', width: 180 },
{ label: '匹数', key: 'roll', width: 120 },
{ label: '数量', key: 'weight', width: 150 },
{ label: '仓位', key: 'warehouse_bin_name', width: 180 },
{ label: '缸号', key: 'dye_factory_dyelot_number', width: 200 },
];
const TARE_COLUMNS = [
{ label: '纸筒重量', key: 'paper_tube_weight', width: 180 },
{ label: '包装重量', key: 'package_weight', width: 180 },
];
export default {
props: {
groups: { type: Array, default: () => [] },
title: { type: String, default: '明细' },
emptyText: { type: String, default: '暂无明细' },
rollKey: { type: String, default: 'in_roll' },
weightKey: { type: String, default: 'in_weight' },
deletable: { type: Boolean, default: false },
showTareColumns: { type: Boolean, default: false },
showBarCode: { type: Boolean, default: false },
},
data() {
return {
expandedKey: '',
};
},
computed: {
columns() {
return SUMMARY_COLUMNS;
},
rows() {
const rows = [];
(this.groups || []).forEach((product) => {
(product.colors || []).forEach((color) => {
rows.push({
group_key: color.group_key,
product_code: product.product_code || '',
product_name: product.product_name || '',
product_color_code: color.product_color_code || '',
product_color_name: color.product_color_name || '',
quote_order_no: color.quote_order_no || '',
dye_factory_dyelot_number: color.dye_factory_dyelot_number || '',
roll: color[this.rollKey],
weight: color[this.weightKey],
fine_codes: color.fine_codes || [],
});
});
});
return rows;
},
expandedRow() {
return this.rows.find((row) => row.group_key === this.expandedKey) || null;
},
fineCols() {
const cols = [...FINE_COLUMNS];
if (this.showBarCode) {
const idx = cols.findIndex((col) => col.key === 'weight');
cols.splice(idx + 1, 0, { label: '条码', key: 'bar_code', width: 280 });
}
if (this.showTareColumns) {
const idx = cols.findIndex((col) => col.key === 'weight');
cols.splice(idx + 1, 0, ...TARE_COLUMNS);
}
if (this.deletable) {
cols.push({ label: '操作', key: 'action', width: 120 });
}
return cols;
},
tableWidth() {
return this.sumWidth(this.columns);
},
fineTableWidth() {
return this.sumWidth(this.fineCols);
},
totalRoll() {
return this.sumField('roll');
},
totalWeight() {
return this.sumField('weight');
},
},
watch: {
rows() {
if (this.expandedKey && !this.rows.some((row) => row.group_key === this.expandedKey)) {
this.expandedKey = '';
}
},
},
methods: {
sumWidth(cols) {
const total = cols.reduce((sum, col) => sum + (col.width || 120), 0);
return `${total}rpx`;
},
sumField(key) {
const total = this.rows.reduce((sum, row) => sum + Number(row[key] || 0), 0);
return Number(total.toFixed(2));
},
cellStyle(col) {
return {
width: `${col.width}rpx`,
minWidth: `${col.width}rpx`,
maxWidth: `${col.width}rpx`,
};
},
joinName(code, name) {
const main = code || '-';
return name ? `${main} ${name}` : main;
},
formatCell(row, key) {
if (key === 'product_code') return this.joinName(row.product_code, row.product_name);
if (key === 'product_color_code') return this.joinName(row.product_color_code, row.product_color_name);
if (key === 'roll' || key === 'weight') {
const val = row[key];
if (val === 0) return '0';
return val != null && val !== '' ? val : '-';
}
const val = row[key];
if (val === 0) return '0';
return val != null && val !== '' ? val : '-';
},
totalCell(key) {
if (key === 'product_code') return '合计';
if (key === 'roll') return this.totalRoll;
if (key === 'weight') return this.totalWeight;
return '';
},
toggleRow(key) {
this.expandedKey = this.expandedKey === key ? '' : key;
},
formatFineCell(fc, key) {
if (key === 'action') return '删除';
const val = fc[key];
if (val === 0) return '0';
return val != null && val !== '' ? val : '-';
},
onFineCellTap(key, fc) {
if (!this.deletable || key !== 'action') return;
this.$emit('delete', fc);
},
},
};
</script>
<style scoped lang="scss">
@import '@/common/pda-typography.scss';
.summary-title {
font-size: $pda-font-body;
font-weight: bold;
padding: 24rpx 26rpx 12rpx;
border-left: 6rpx solid #007AFF;
margin: 20rpx 26rpx 0;
}
.summary-wrap {
margin: 0 26rpx 16rpx;
background: #fff;
border-radius: 12rpx;
overflow: hidden;
}
.summary-scroll {
width: 100%;
}
.summary-table {
border-bottom: 1rpx solid #eee;
}
.summary-row {
display: flex;
align-items: stretch;
border-bottom: 1rpx solid #f0f0f0;
}
.summary-row:last-child {
border-bottom: none;
}
.summary-head {
background: #f7f8fa;
}
.summary-row--open {
background: #f0f7ff;
}
.summary-total {
background: #fff7e6;
}
.summary-cell {
box-sizing: border-box;
display: flex;
align-items: center;
min-height: $pda-row-min-height;
padding: 12rpx 16rpx;
font-size: $pda-font-body;
color: #333;
border-right: 1rpx solid #f0f0f0;
word-break: break-all;
}
.summary-head .summary-cell {
font-weight: bold;
color: #666;
}
.summary-total .summary-cell {
font-weight: bold;
}
.summary-cell:last-child {
border-right: none;
}
.summary-empty {
padding: 28rpx 16rpx;
font-size: $pda-font-placeholder;
color: #999;
}
.summary-fine {
padding: 8rpx 0 16rpx;
}
.summary-fineTitle {
display: flex;
justify-content: space-between;
padding: 12rpx 16rpx 8rpx;
font-size: $pda-font-action;
color: #2979ff;
}
.summary-fineHint {
color: #999;
font-size: $pda-font-popup-sub;
}
.summary-action {
color: #f5222d;
}
.summary-tip {
padding: 8rpx 16rpx 0;
font-size: $pda-font-popup-sub;
color: #999;
}
</style>
+15 -241
View File
@@ -1,261 +1,35 @@
<template>
<view>
<view class="fabric-out-sectionTitle">{{ title }}</view>
<slot name="before-list" />
<view class="fabric-out-detailList">
<dataNull
v-if="!groups.length"
src="/src/static/img/chahua/gjNull.png"
title="暂无进仓明细"
title1="扫码后将在此展示"
/>
<view
v-for="product in groups"
:key="product.group_key"
class="fabric-out-detailCard process-in-productCard"
>
<view class="process-in-productHead">
<text class="process-in-productTitle">
{{ product.product_code || '-' }}<text v-if="product.product_name" class="process-in-subText">{{ ' ' + product.product_name }}</text>
</text>
<text class="process-in-productSum">
匹数 {{ product.in_roll }} / 数量 {{ product.in_weight }}
</text>
</view>
<view
v-for="color in product.colors"
:key="color.group_key"
class="process-in-colorBlock"
>
<view class="process-in-colorHead">
<text class="process-in-colorTitle">
色号 {{ color.product_color_code || '-' }}<text v-if="color.product_color_name" class="process-in-subText">{{ ' ' + color.product_color_name }}</text>
</text>
<text class="process-in-colorSum">
匹数 {{ color.in_roll }} / 数量 {{ color.in_weight }}
</text>
</view>
<view class="process-in-colorMeta">
<text>染整单:{{ color.quote_order_no || '-' }}</text>
<text>缸号:{{ color.dye_factory_dyelot_number || '-' }}</text>
</view>
<view class="process-in-fcTitle">细码({{ color.fine_codes.length }})</view>
<view v-if="!color.fine_codes.length" class="process-in-fcEmpty">暂无细码</view>
<scroll-view v-else scroll-x class="process-in-fcScroll">
<view class="process-in-fcTable" :style="{ width: fineTableWidth }">
<view class="process-in-fcRow process-in-fcHead">
<view
v-for="col in fineColumns"
:key="col.key"
class="process-in-fcCell"
:style="cellStyle(col)"
>{{ col.label }}</view>
</view>
<view
v-for="(fc, fcIndex) in color.fine_codes"
:key="fc.id || fcIndex"
class="process-in-fcRow"
>
<view
v-for="col in fineColumns"
:key="col.key"
class="process-in-fcCell"
:class="{ 'process-in-fcAction': col.key === 'action' }"
:style="cellStyle(col)"
@click="onCellTap(col.key, fc)"
>{{ formatFineCell(fc, col.key) }}</view>
</view>
</view>
</scroll-view>
<view v-if="deletable && color.fine_codes.length" class="process-in-fcTip">
勾选上方「删除」后扫码,或点击「删除」列移除细码
</view>
</view>
</view>
</view>
</view>
<FineCodeSummaryTable
:groups="groups"
:title="title"
:empty-text="emptyText"
roll-key="in_roll"
weight-key="in_weight"
:deletable="deletable"
:show-tare-columns="showTareColumns"
@delete="$emit('delete', $event)"
>
<slot name="before-list" slot="before-list" />
</FineCodeSummaryTable>
</template>
<script>
import FineCodeSummaryTable from '@/components/storegoods/FineCodeSummaryTable.vue';
import { buildItemGroups } from '@/common/storeGoodsProcessIn';
const FINE_COLUMNS = [
{ label: '卷号', key: 'volume_number', width: 110 },
{ label: '外部卷号', key: 'extern_volume_number', width: 140 },
{ label: '匹数', key: 'roll', width: 100 },
{ label: '数量', key: 'weight', width: 130 },
{ label: '仓位', key: 'warehouse_bin_name', width: 140 },
{ label: '缸号', key: 'dye_factory_dyelot_number', width: 160 },
];
const TARE_COLUMNS = [
{ label: '纸筒重量', key: 'paper_tube_weight', width: 140 },
{ label: '包装重量', key: 'package_weight', width: 140 },
];
export default {
components: { FineCodeSummaryTable },
props: {
list: { type: Array, default: () => [] },
title: { type: String, default: '进仓明细' },
emptyText: { type: String, default: '暂无进仓明细' },
deletable: { type: Boolean, default: false },
/** 加工/采购进仓:细码行展示扫码时提交的纸筒、包装重量 */
showTareColumns: { type: Boolean, default: false },
},
computed: {
groups() {
return buildItemGroups(this.list);
},
fineColumns() {
const cols = [...FINE_COLUMNS];
if (this.showTareColumns) {
const idx = cols.findIndex((col) => col.key === 'weight');
cols.splice(idx + 1, 0, ...TARE_COLUMNS);
}
if (this.deletable) {
cols.push({ label: '操作', key: 'action', width: 100 });
}
return cols;
},
fineTableWidth() {
const total = this.fineColumns.reduce((sum, col) => sum + (col.width || 100), 0);
return `${total}rpx`;
},
},
methods: {
cellStyle(col) {
return {
width: `${col.width}rpx`,
minWidth: `${col.width}rpx`,
maxWidth: `${col.width}rpx`,
};
},
formatFineCell(fc, key) {
if (key === 'action') return '删除';
const val = fc[key];
if (val === 0) return '0';
return val != null && val !== '' ? val : '-';
},
onCellTap(key, fc) {
if (!this.deletable || key !== 'action') return;
this.$emit('delete', fc);
},
},
};
</script>
<style scoped lang="scss">
@import '@/pages/storefabric/storeFabricBusinessOutPage.scss';
.process-in-productCard {
padding: 0;
overflow: hidden;
}
.process-in-productHead {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx;
background: #f0f7ff;
border-bottom: 1rpx solid #e6f0ff;
}
.process-in-productTitle {
font-size: 32rpx;
font-weight: bold;
color: #1a1a1a;
flex: 1;
padding-right: 16rpx;
}
.process-in-productSum,
.process-in-colorSum {
font-size: 28rpx;
color: #666;
flex-shrink: 0;
}
.process-in-subText {
font-weight: normal;
color: #666;
font-size: 28rpx;
}
.process-in-colorBlock {
padding: 16rpx 20rpx 20rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.process-in-colorBlock:last-child {
border-bottom: none;
}
.process-in-colorHead {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8rpx;
}
.process-in-colorTitle {
font-size: 30rpx;
font-weight: bold;
color: #333;
flex: 1;
padding-right: 12rpx;
}
.process-in-colorMeta {
display: flex;
flex-wrap: wrap;
gap: 16rpx 24rpx;
font-size: 28rpx;
color: #888;
margin-bottom: 12rpx;
}
.process-in-fcTitle {
font-size: 28rpx;
color: #2979ff;
margin-bottom: 8rpx;
}
.process-in-fcEmpty {
font-size: 28rpx;
color: #bbb;
padding: 8rpx 0;
}
.process-in-fcScroll {
width: 100%;
}
.process-in-fcTable {
border: 1rpx solid #eee;
border-radius: 8rpx;
overflow: hidden;
}
.process-in-fcRow {
display: flex;
align-items: stretch;
border-bottom: 1rpx solid #f0f0f0;
}
.process-in-fcRow:last-child {
border-bottom: none;
}
.process-in-fcHead {
background: #fafafa;
}
.process-in-fcCell {
box-sizing: border-box;
padding: 14rpx 10rpx;
font-size: 28rpx;
color: #333;
border-right: 1rpx solid #f0f0f0;
word-break: break-all;
}
.process-in-fcHead .process-in-fcCell {
font-weight: bold;
color: #666;
}
.process-in-fcCell:last-child {
border-right: none;
}
.process-in-fcAction {
color: #f5222d;
}
.process-in-fcTip {
margin-top: 8rpx;
font-size: 26rpx;
color: #999;
}
</style>
@@ -1,97 +1,24 @@
<template>
<view>
<view class="fabric-out-sectionTitle">{{ title }}</view>
<slot name="before-list" />
<view class="fabric-out-detailList">
<dataNull
v-if="!groups.length"
src="/src/static/img/chahua/gjNull.png"
title="暂无出仓明细"
title1="扫码后将在此展示"
/>
<view
v-for="product in groups"
:key="product.group_key"
class="fabric-out-detailCard process-in-productCard"
>
<view class="process-in-productHead">
<text class="process-in-productTitle">
{{ product.product_code || '-' }}<text v-if="product.product_name" class="process-in-subText">{{ ' ' + product.product_name }}</text>
</text>
<text class="process-in-productSum">
匹数 {{ product.out_roll }} / 数量 {{ product.out_weight }}
</text>
</view>
<view
v-for="color in product.colors"
:key="color.group_key"
class="process-in-colorBlock"
>
<view class="process-in-colorHead">
<text class="process-in-colorTitle">
色号 {{ color.product_color_code || '-' }}<text v-if="color.product_color_name" class="process-in-subText">{{ ' ' + color.product_color_name }}</text>
</text>
<text class="process-in-colorSum">
匹数 {{ color.out_roll }} / 数量 {{ color.out_weight }}
</text>
</view>
<view class="process-in-colorMeta">
<text>染整单:{{ color.quote_order_no || '-' }}</text>
<text>缸号:{{ color.dye_factory_dyelot_number || '-' }}</text>
</view>
<view class="process-in-fcTitle">细码({{ color.fine_codes.length }})</view>
<view v-if="!color.fine_codes.length" class="process-in-fcEmpty">暂无细码</view>
<scroll-view v-else scroll-x class="process-in-fcScroll">
<view class="process-in-fcTable" :style="{ width: fineTableWidth }">
<view class="process-in-fcRow process-in-fcHead">
<view
v-for="col in fineColumns"
:key="col.key"
class="process-in-fcCell"
:style="cellStyle(col)"
>{{ col.label }}</view>
</view>
<view
v-for="(fc, fcIndex) in color.fine_codes"
:key="fc.id || fcIndex"
class="process-in-fcRow"
>
<view
v-for="col in fineColumns"
:key="col.key"
class="process-in-fcCell"
:class="{ 'process-in-fcAction': col.key === 'action' }"
:style="cellStyle(col)"
@click="onCellTap(col.key, fc)"
>{{ formatFineCell(fc, col.key) }}</view>
</view>
</view>
</scroll-view>
<view v-if="deletable && color.fine_codes.length" class="process-in-fcTip">
勾选上方「删除」后扫码,或点击「删除」列移除细码
</view>
</view>
</view>
</view>
</view>
<FineCodeSummaryTable
:groups="groups"
:title="title"
empty-text="暂无出仓明细"
roll-key="out_roll"
weight-key="out_weight"
:deletable="deletable"
show-bar-code
@delete="$emit('delete', $event)"
>
<slot name="before-list" slot="before-list" />
</FineCodeSummaryTable>
</template>
<script>
import FineCodeSummaryTable from '@/components/storegoods/FineCodeSummaryTable.vue';
import { buildItemGroups } from '@/common/storeGoodsProcessOut';
const FINE_COLUMNS = [
{ label: '卷号', key: 'volume_number', width: 110 },
{ label: '外部卷号', key: 'extern_volume_number', width: 140 },
{ label: '匹数', key: 'roll', width: 100 },
{ label: '数量', key: 'weight', width: 130 },
{ label: '条码', key: 'bar_code', width: 260 },
{ label: '仓位', key: 'warehouse_bin_name', width: 140 },
{ label: '缸号', key: 'dye_factory_dyelot_number', width: 160 },
];
export default {
components: { FineCodeSummaryTable },
props: {
list: { type: Array, default: () => [] },
title: { type: String, default: '出仓明细' },
@@ -101,148 +28,6 @@ export default {
groups() {
return buildItemGroups(this.list);
},
fineColumns() {
if (!this.deletable) return FINE_COLUMNS;
return [...FINE_COLUMNS, { label: '操作', key: 'action', width: 100 }];
},
fineTableWidth() {
const total = this.fineColumns.reduce((sum, col) => sum + (col.width || 100), 0);
return `${total}rpx`;
},
},
methods: {
cellStyle(col) {
return {
width: `${col.width}rpx`,
minWidth: `${col.width}rpx`,
maxWidth: `${col.width}rpx`,
};
},
formatFineCell(fc, key) {
if (key === 'action') return '删除';
const val = fc[key];
if (val === 0) return '0';
return val != null && val !== '' ? val : '-';
},
onCellTap(key, fc) {
if (!this.deletable || key !== 'action') return;
this.$emit('delete', fc);
},
},
};
</script>
<style scoped lang="scss">
@import '@/pages/storefabric/storeFabricBusinessOutPage.scss';
.process-in-productCard {
padding: 0;
overflow: hidden;
}
.process-in-productHead {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx;
background: #f0f7ff;
border-bottom: 1rpx solid #e6f0ff;
}
.process-in-productTitle {
font-size: 32rpx;
font-weight: bold;
color: #1a1a1a;
flex: 1;
padding-right: 16rpx;
}
.process-in-productSum,
.process-in-colorSum {
font-size: 28rpx;
color: #666;
flex-shrink: 0;
}
.process-in-subText {
font-weight: normal;
color: #666;
font-size: 28rpx;
}
.process-in-colorBlock {
padding: 16rpx 20rpx 20rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.process-in-colorBlock:last-child {
border-bottom: none;
}
.process-in-colorHead {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8rpx;
}
.process-in-colorTitle {
font-size: 30rpx;
font-weight: bold;
color: #333;
flex: 1;
padding-right: 12rpx;
}
.process-in-colorMeta {
display: flex;
flex-wrap: wrap;
gap: 16rpx 24rpx;
font-size: 28rpx;
color: #888;
margin-bottom: 12rpx;
}
.process-in-fcTitle {
font-size: 28rpx;
color: #2979ff;
margin-bottom: 8rpx;
}
.process-in-fcEmpty {
font-size: 28rpx;
color: #bbb;
padding: 8rpx 0;
}
.process-in-fcScroll {
width: 100%;
}
.process-in-fcTable {
border: 1rpx solid #eee;
border-radius: 8rpx;
overflow: hidden;
}
.process-in-fcRow {
display: flex;
align-items: stretch;
border-bottom: 1rpx solid #f0f0f0;
}
.process-in-fcRow:last-child {
border-bottom: none;
}
.process-in-fcHead {
background: #fafafa;
}
.process-in-fcCell {
box-sizing: border-box;
padding: 14rpx 10rpx;
font-size: 28rpx;
color: #333;
border-right: 1rpx solid #f0f0f0;
word-break: break-all;
}
.process-in-fcHead .process-in-fcCell {
font-weight: bold;
color: #666;
}
.process-in-fcCell:last-child {
border-right: none;
}
.process-in-fcAction {
color: #f5222d;
}
.process-in-fcTip {
margin-top: 8rpx;
font-size: 26rpx;
color: #999;
}
</style>
+2 -2
View File
@@ -2,8 +2,8 @@
"name" : "浩拓ERP",
"appid" : "__UNI__F79F300",
"description" : "浩拓ERP",
"versionName" : "1.1.17",
"versionCode" : 117,
"versionName" : "1.1.18",
"versionCode" : 118,
"transformPx" : false,
"app-plus" : {
"optimization" : {
@@ -2,6 +2,8 @@
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="form.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="displayAuditStatus" :name="displayAuditStatusName" />
@@ -60,6 +62,8 @@
</view>
</OrderHeaderFold>
<FabricOutDetailList
@@ -144,6 +148,8 @@ import FineCodePopup from '@/components/storefabric/FineCodePopup.vue';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutDetailList from '@/components/storefabric/FabricOutDetailList.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
@@ -164,6 +170,8 @@ export default {
OrderStatusBar,
OrderHeaderFold,
FabricOutDetailList,
FabricOutScanBar,
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="form.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="displayAuditStatus" :name="displayAuditStatusName" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -22,6 +23,7 @@
<text class="mr26">单据备注</text>
<text>{{ form.remark || '-' }}</text>
</view>
</OrderHeaderFold>
<FabricOutDetailList
:list="form.item_data"
@@ -62,6 +64,7 @@ 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 OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutDetailList from '@/components/storefabric/FabricOutDetailList.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
import FabricOutScanDetail from '@/components/storefabric/FabricOutScanDetail.vue';
@@ -72,12 +75,18 @@ export default {
FabricInfoPopup,
FineCodePopup,
OrderStatusBar,
OrderHeaderFold,
FabricOutDetailList,
FabricOutScanBar,
FabricOutScanDetail,
FabricOutFooter,
},
mixins: [formMixin],
data() {
return {
headerCollapsed: true,
};
},
onLoad(e) {
uni.setNavigationBarTitle({ title: '编辑坯布出仓单' });
this.pageMode = 'edit';
@@ -45,6 +45,7 @@ export default {
orderId: 0,
form: this.getEmptyForm(),
headerSaved: false,
headerCollapsed: false,
selectShow: false,
selectList: [],
selectType: '',
@@ -183,6 +184,7 @@ export default {
this.orderId = order.id;
this.auditStatus = order.audit_status;
this.headerSaved = true;
this.headerCollapsed = true;
this.form = orderToFormFields(order);
this.refreshScanDetailTotals(order);
this.syncCanScanFromStatus(order.audit_status);
@@ -247,6 +249,7 @@ export default {
const order = normalizeOrder(detail);
this.applyOrder(order);
this.headerSaved = true;
this.headerCollapsed = true;
this.syncCanScanFromStatus(order.audit_status);
this.showSuccess('保存成功,可以扫码', '保存成功', { voiceOnly: true });
this.registerOrderScanBroadcast();
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="order.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="order.audit_status" :name="order.audit_status_name" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -25,6 +26,7 @@
<view v-if="order.auditer_name" class="flex-white-plr26 ptb20 bdb_f5">
<text class="mr26">审核人</text><text>{{ order.auditer_name }} {{ formatTime(order.audit_time, 'YYYY-MM-DD') }}</text>
</view>
</OrderHeaderFold>
<FabricOutDetailList
:title="detailTitle"
@@ -45,6 +47,7 @@ import util from '@/common/util';
import FabricInfoPopup from '@/components/storefabric/FabricInfoPopup.vue';
import FineCodePopup from '@/components/storefabric/FineCodePopup.vue';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutDetailList from '@/components/storefabric/FabricOutDetailList.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import {
@@ -56,9 +59,10 @@ import {
} from '@/common/storeFabricBusinessOut';
export default {
components: { FabricInfoPopup, FineCodePopup, OrderStatusBar, FabricOutDetailList, FabricOutFooter },
components: { FabricInfoPopup, FineCodePopup, OrderStatusBar, OrderHeaderFold, FabricOutDetailList, FabricOutFooter },
data() {
return {
headerCollapsed: true,
orderId: 0,
order: {},
billTypeName: (BILL_TYPES[0] || {}).label || '坯布其他出货单',
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="form.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="displayAuditStatus" :name="displayAuditStatusName" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -62,6 +63,7 @@
<view style="margin-bottom: 8rpx;"><text>单据备注</text></view>
<u-input v-model="form.remark" :disabled="!headerEditable" type="textarea" :border="true" :height="100" :auto-height="true" />
</view>
</OrderHeaderFold>
<ProcessInBinBar
:can-scan="canScan"
@@ -114,6 +116,7 @@
<script>
import formMixin from './storeGoodsProcessInMixin.js';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessInScanDetail from '@/components/storegoods/ProcessInScanDetail.vue';
@@ -123,6 +126,7 @@ import ProcessInBinBar from '@/components/storegoods/ProcessInBinBar.vue';
export default {
components: {
OrderStatusBar,
OrderHeaderFold,
FabricOutScanBar,
FabricOutFooter,
ProcessInScanDetail,
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="form.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="displayAuditStatus" :name="displayAuditStatusName" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -50,6 +51,7 @@
<text class="mr26">单据备注</text>
<text>{{ form.remark || '-' }}</text>
</view>
</OrderHeaderFold>
<ProcessInBinBar
:can-scan="canScan"
@@ -92,6 +94,7 @@
<script>
import formMixin from './storeGoodsProcessInMixin.js';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessInScanDetail from '@/components/storegoods/ProcessInScanDetail.vue';
@@ -101,6 +104,7 @@ import ProcessInBinBar from '@/components/storegoods/ProcessInBinBar.vue';
export default {
components: {
OrderStatusBar,
OrderHeaderFold,
FabricOutScanBar,
FabricOutFooter,
ProcessInScanDetail,
@@ -110,6 +114,7 @@ export default {
mixins: [formMixin],
data() {
return {
headerCollapsed: true,
weightInputStyle: {
fontSize: '36rpx',
},
@@ -45,6 +45,7 @@ export default {
orderId: 0,
form: this.getEmptyForm(),
headerSaved: false,
headerCollapsed: false,
selectShow: false,
selectList: [],
selectType: '',
@@ -407,6 +408,7 @@ export default {
this.orderId = order.id;
this.auditStatus = order.audit_status;
this.headerSaved = true;
this.headerCollapsed = true;
this.form = orderToFormFields(order);
this.clearWarehouseBin();
this.syncCanScanFromStatus(order.audit_status);
@@ -494,6 +496,7 @@ export default {
const order = normalizeOrder(detail);
this.applyOrder(order, { keepWeights: true });
this.headerSaved = true;
this.headerCollapsed = true;
this.clearWarehouseBin();
this.syncCanScanFromStatus(order.audit_status);
this.showSuccess('保存成功,请先扫描仓位', '保存成功', { voiceOnly: true });
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="order.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="order.audit_status" :name="order.audit_status_name" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -44,6 +45,7 @@
<text class="mr26">审核人</text>
<text>{{ order.auditor_name }} {{ formatTime(order.audit_time, 'YYYY-MM-DD') }}</text>
</view>
</OrderHeaderFold>
<ProcessInDetailList
:title="detailTitle"
@@ -58,6 +60,7 @@
<script>
import util from '@/common/util';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessInDetailList from '@/components/storegoods/ProcessInDetailList.vue';
import {
@@ -68,10 +71,11 @@ import {
} from '@/common/storeGoodsProcessIn';
export default {
components: { OrderStatusBar, FabricOutFooter, ProcessInDetailList },
components: { OrderStatusBar, OrderHeaderFold, FabricOutFooter, ProcessInDetailList },
data() {
return {
orderId: 0,
headerCollapsed: true,
order: { item_data: [] },
};
},
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="form.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="displayAuditStatus" :name="displayAuditStatusName" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -31,6 +32,7 @@
<view style="margin-bottom: 8rpx;"><text>单据备注</text></view>
<u-input v-model="form.remark" :disabled="!headerEditable" type="textarea" :border="true" :height="100" :auto-height="true" />
</view>
</OrderHeaderFold>
<FabricOutScanBar
:can-scan="showQrScanBar"
@@ -71,6 +73,7 @@
<script>
import formMixin from './storeGoodsProcessOutMixin.js';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessOutScanDetail from '@/components/storegoods/ProcessOutScanDetail.vue';
@@ -79,6 +82,7 @@ import ProcessOutDetailList from '@/components/storegoods/ProcessOutDetailList.v
export default {
components: {
OrderStatusBar,
OrderHeaderFold,
FabricOutScanBar,
FabricOutFooter,
ProcessOutScanDetail,
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="form.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="displayAuditStatus" :name="displayAuditStatusName" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -22,6 +23,7 @@
<text class="mr26">单据备注</text>
<text>{{ form.remark || '-' }}</text>
</view>
</OrderHeaderFold>
<FabricOutScanBar
:can-scan="showQrScanBar"
@@ -52,6 +54,7 @@
<script>
import formMixin from './storeGoodsProcessOutMixin.js';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessOutScanDetail from '@/components/storegoods/ProcessOutScanDetail.vue';
@@ -60,12 +63,18 @@ import ProcessOutDetailList from '@/components/storegoods/ProcessOutDetailList.v
export default {
components: {
OrderStatusBar,
OrderHeaderFold,
FabricOutScanBar,
FabricOutFooter,
ProcessOutScanDetail,
ProcessOutDetailList,
},
mixins: [formMixin],
data() {
return {
headerCollapsed: true,
};
},
onLoad(e) {
uni.setNavigationBarTitle({ title: '编辑加工出仓单' });
this.pageMode = 'edit';
@@ -41,6 +41,7 @@ export default {
orderId: 0,
form: this.getEmptyForm(),
headerSaved: false,
headerCollapsed: false,
selectShow: false,
selectList: [],
selectType: '',
@@ -274,6 +275,7 @@ export default {
this.orderId = order.id;
this.auditStatus = order.audit_status;
this.headerSaved = true;
this.headerCollapsed = true;
this.form = orderToFormFields(order);
this.syncCanScanFromStatus(order.audit_status);
if (this.canScan) this.registerOrderScanBroadcast();
@@ -366,6 +368,7 @@ export default {
const order = normalizeOrder(detail);
this.applyOrder(order);
this.headerSaved = true;
this.headerCollapsed = true;
this.syncCanScanFromStatus(order.audit_status);
this.showSuccess('保存成功,请开始扫码', '保存成功', { voiceOnly: true });
this.registerOrderScanBroadcast();
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="order.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="order.audit_status" :name="order.audit_status_name" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -30,6 +31,7 @@
<text class="mr26">审核人</text>
<text>{{ order.auditor_name }} {{ formatTime(order.audit_time, 'YYYY-MM-DD') }}</text>
</view>
</OrderHeaderFold>
<ProcessOutDetailList
:title="detailTitle"
@@ -43,6 +45,7 @@
<script>
import util from '@/common/util';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessOutDetailList from '@/components/storegoods/ProcessOutDetailList.vue';
import {
@@ -53,10 +56,11 @@ import {
} from '@/common/storeGoodsProcessOut';
export default {
components: { OrderStatusBar, FabricOutFooter, ProcessOutDetailList },
components: { OrderStatusBar, OrderHeaderFold, FabricOutFooter, ProcessOutDetailList },
data() {
return {
orderId: 0,
headerCollapsed: true,
order: { item_data: [] },
};
},
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="form.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="displayAuditStatus" :name="displayAuditStatusName" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -28,6 +29,7 @@
<view style="margin-bottom: 8rpx;"><text>单据备注</text></view>
<u-input v-model="form.remark" :disabled="!headerEditable" type="textarea" :border="true" :height="100" :auto-height="true" />
</view>
</OrderHeaderFold>
<ProcessInBinBar
:can-scan="canScan"
@@ -79,6 +81,7 @@
<script>
import formMixin from './storeGoodsProcessReturnInMixin.js';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessInScanDetail from '@/components/storegoods/ProcessInScanDetail.vue';
@@ -88,6 +91,7 @@ import ProcessInBinBar from '@/components/storegoods/ProcessInBinBar.vue';
export default {
components: {
OrderStatusBar,
OrderHeaderFold,
FabricOutScanBar,
FabricOutFooter,
ProcessInScanDetail,
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="form.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="displayAuditStatus" :name="displayAuditStatusName" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -22,6 +23,7 @@
<text class="mr26">单据备注</text>
<text>{{ form.remark || '-' }}</text>
</view>
</OrderHeaderFold>
<ProcessInBinBar
:can-scan="canScan"
@@ -63,6 +65,7 @@
<script>
import formMixin from './storeGoodsProcessReturnInMixin.js';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessInScanDetail from '@/components/storegoods/ProcessInScanDetail.vue';
@@ -72,6 +75,7 @@ import ProcessInBinBar from '@/components/storegoods/ProcessInBinBar.vue';
export default {
components: {
OrderStatusBar,
OrderHeaderFold,
FabricOutScanBar,
FabricOutFooter,
ProcessInScanDetail,
@@ -79,6 +83,11 @@ export default {
ProcessInBinBar,
},
mixins: [formMixin],
data() {
return {
headerCollapsed: true,
};
},
onLoad(e) {
uni.setNavigationBarTitle({ title: '编辑加工退货进仓单' });
this.pageMode = 'edit';
@@ -40,6 +40,7 @@ export default {
orderId: 0,
form: this.getEmptyForm(),
headerSaved: false,
headerCollapsed: false,
selectShow: false,
selectList: [],
selectType: '',
@@ -345,6 +346,7 @@ export default {
this.orderId = order.id;
this.auditStatus = order.audit_status;
this.headerSaved = true;
this.headerCollapsed = true;
this.form = orderToFormFields(order);
this.clearWarehouseBin();
this.syncCanScanFromStatus(order.audit_status);
@@ -417,6 +419,7 @@ export default {
const order = normalizeOrder(detail);
this.applyOrder(order);
this.headerSaved = true;
this.headerCollapsed = true;
this.clearWarehouseBin();
this.syncCanScanFromStatus(order.audit_status);
this.showSuccess('保存成功,请先扫描仓位', '保存成功', { voiceOnly: true });
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="order.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="order.audit_status" :name="order.audit_status_name" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -30,6 +31,7 @@
<text class="mr26">审核人</text>
<text>{{ order.auditor_name }} {{ formatTime(order.audit_time, 'YYYY-MM-DD') }}</text>
</view>
</OrderHeaderFold>
<ProcessInDetailList
:title="detailTitle"
@@ -43,6 +45,7 @@
<script>
import util from '@/common/util';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessInDetailList from '@/components/storegoods/ProcessInDetailList.vue';
import {
@@ -53,10 +56,11 @@ import {
} from '@/common/storeGoodsProcessReturnIn';
export default {
components: { OrderStatusBar, FabricOutFooter, ProcessInDetailList },
components: { OrderStatusBar, OrderHeaderFold, FabricOutFooter, ProcessInDetailList },
data() {
return {
orderId: 0,
headerCollapsed: true,
order: { item_data: [] },
};
},
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="form.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="displayAuditStatus" :name="displayAuditStatusName" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -62,6 +63,7 @@
<view style="margin-bottom: 8rpx;"><text>单据备注</text></view>
<u-input v-model="form.remark" :disabled="!headerEditable" type="textarea" :border="true" :height="100" :auto-height="true" />
</view>
</OrderHeaderFold>
<ProcessInBinBar
:can-scan="canScan"
@@ -114,6 +116,7 @@
<script>
import formMixin from './storeGoodsPurchaseInMixin.js';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessInScanDetail from '@/components/storegoods/ProcessInScanDetail.vue';
@@ -123,6 +126,7 @@ import ProcessInBinBar from '@/components/storegoods/ProcessInBinBar.vue';
export default {
components: {
OrderStatusBar,
OrderHeaderFold,
FabricOutScanBar,
FabricOutFooter,
ProcessInScanDetail,
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="form.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="displayAuditStatus" :name="displayAuditStatusName" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -50,6 +51,7 @@
<text class="mr26">单据备注</text>
<text>{{ form.remark || '-' }}</text>
</view>
</OrderHeaderFold>
<ProcessInBinBar
:can-scan="canScan"
@@ -92,6 +94,7 @@
<script>
import formMixin from './storeGoodsPurchaseInMixin.js';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutScanBar from '@/components/storefabric/FabricOutScanBar.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessInScanDetail from '@/components/storegoods/ProcessInScanDetail.vue';
@@ -101,6 +104,7 @@ import ProcessInBinBar from '@/components/storegoods/ProcessInBinBar.vue';
export default {
components: {
OrderStatusBar,
OrderHeaderFold,
FabricOutScanBar,
FabricOutFooter,
ProcessInScanDetail,
@@ -110,6 +114,7 @@ export default {
mixins: [formMixin],
data() {
return {
headerCollapsed: true,
weightInputStyle: {
fontSize: '36rpx',
},
@@ -47,6 +47,7 @@ export default {
orderId: 0,
form: this.getEmptyForm(),
headerSaved: false,
headerCollapsed: false,
selectShow: false,
selectList: [],
selectType: '',
@@ -411,6 +412,7 @@ export default {
this.orderId = order.id;
this.auditStatus = order.audit_status;
this.headerSaved = true;
this.headerCollapsed = true;
this.form = orderToFormFields(order);
this.clearWarehouseBin();
this.syncCanScanFromStatus(order.audit_status);
@@ -499,6 +501,7 @@ export default {
const order = normalizeOrder(detail);
this.applyOrder(order, { keepWeights: true });
this.headerSaved = true;
this.headerCollapsed = true;
this.clearWarehouseBin();
this.syncCanScanFromStatus(order.audit_status);
this.showSuccess('保存成功,请先扫描仓位', '保存成功', { voiceOnly: true });
@@ -1,5 +1,6 @@
<template>
<view class="fabric-out-page">
<OrderHeaderFold v-model="headerCollapsed" :summary="order.order_no">
<OrderStatusBar class="fabric-out-mt32" :status="order.audit_status" :name="order.audit_status_name" />
<view class="flex-white-plr26 ptb10 bdb_f5">
@@ -44,6 +45,7 @@
<text class="mr26">审核人</text>
<text>{{ order.auditor_name }} {{ formatTime(order.audit_time, 'YYYY-MM-DD') }}</text>
</view>
</OrderHeaderFold>
<ProcessInDetailList
:title="detailTitle"
@@ -58,6 +60,7 @@
<script>
import util from '@/common/util';
import OrderStatusBar from '@/components/storefabric/OrderStatusBar.vue';
import OrderHeaderFold from '@/components/storefabric/OrderHeaderFold.vue';
import FabricOutFooter from '@/components/storefabric/FabricOutFooter.vue';
import ProcessInDetailList from '@/components/storegoods/ProcessInDetailList.vue';
import {
@@ -68,10 +71,11 @@ import {
} from '@/common/storeGoodsPurchaseIn';
export default {
components: { OrderStatusBar, FabricOutFooter, ProcessInDetailList },
components: { OrderStatusBar, OrderHeaderFold, FabricOutFooter, ProcessInDetailList },
data() {
return {
orderId: 0,
headerCollapsed: true,
order: { item_data: [] },
};
},
-24
View File
@@ -111,7 +111,6 @@
<view class="version-info">
<text class="version-text">版本: {{ appVersion }}</text>
<text class="env-text" v-if="envName">({{ envName }})</text>
<text class="check-upgrade-btn" @click="checkUpgrade">{{ checkingUpgrade ? '检查中...' : '检查更新' }}</text>
</view>
</view>
</template>
@@ -139,7 +138,6 @@ export default {
password: ""
},
showApiUrlPicker: false,
checkingUpgrade: false,
// 登录默认正式环境,本地已选过的地址仍会在 onShow 里恢复
selectedApiUrl: (config.devApiUrlOptions.find(item => item.label === '正式环境') || {}).value || config.productionApiUrl,
customApiUrl: 'http://192.168.1.66:50002/hcscm/pda/v1',
@@ -433,19 +431,8 @@ export default {
autoCheckUpgrade() {
this.runUpgradeCheck({ silentWhenLatest: true });
},
// 手动检查版本更新
checkUpgrade() {
if (this.checkingUpgrade) return;
// #ifndef APP-PLUS
this.$u.toast('小程序端或H5端已是最新版,无需检查更新!');
// #endif
// #ifdef APP-PLUS
this.runUpgradeCheck({ silentWhenLatest: false });
// #endif
},
runUpgradeCheck({ silentWhenLatest }) {
const self = this;
this.checkingUpgrade = true;
app_upgrade(async () => {
try {
const appInfo = await new Promise((resolve) => {
@@ -474,8 +461,6 @@ export default {
self.$u.toast('检查更新失败,请稍后重试');
}
return { status: 0 };
} finally {
self.checkingUpgrade = false;
}
}, 1);
},
@@ -639,15 +624,6 @@ export default {
color: #5473e8;
margin-left: 10rpx;
}
.check-upgrade-btn {
font-size: 34rpx;
color: #5473e8;
margin-left: 24rpx;
padding: 16rpx 8rpx;
min-height: 64rpx;
line-height: 64rpx;
}
</style>
<style lang="scss" scoped>
.login-env-picker {