diff --git a/src/views/manualStaticOut.vue b/src/views/manualStaticOut.vue
index cda9e8b..329eed9 100644
--- a/src/views/manualStaticOut.vue
+++ b/src/views/manualStaticOut.vue
@@ -41,11 +41,17 @@
-
- 查询
-
+ @clear="handleClearProduct" class="scan-input" />
+
+
+ 查询
+
+
+ 查询静置产品
+
+
@@ -118,18 +124,6 @@
本次标准
{{ displayMinutes(scanResult.minStaticMinutes) }}
-
- PLC申请上线
-
- {{ scanResult.partLoad ? '已申请' : '未申请' }}
-
-
-
- 后端判定
-
- {{ scanResult.canConfirm ? '允许确认' : '禁止确认' }}
-
-
@@ -196,6 +190,40 @@
+
+
+
+
+
+
+
+
+
+ {{ row.静置结束时间 ? '已出库' : '未出库' }}
+
+
+
+
+
+
+
+
@@ -238,6 +266,9 @@ const scanLoading = ref(false)
const confirmLoading = ref(false)
const confirmedSuccess = ref(false)
const standardDialog = reactive({ visible: false, value: DEFAULT_STANDARD_MINUTES })
+const staticRecordLoading = ref(false)
+const staticRecordList = ref([])
+const staticRecordDialog = reactive({ visible: false, status: 'all', packCode: '' })
const scanResult = reactive({
success: false,
@@ -491,6 +522,8 @@ const handleScanReply = (result) => {
scanResult.success = true
scanResult.productCode = fields[1] || productCode.value
+ // 扫箱体码时后端会返回最终 PACK 码,后续确认上线必须使用 PACK 码。
+ productCode.value = scanResult.productCode
scanResult.orderNo = fields[2] || ''
scanResult.productType = fields[3] || ''
scanResult.machineCode = fields[4] || ''
@@ -546,6 +579,28 @@ const handleScanQuery = async () => {
}
}
+const queryStaticRecords = async () => {
+ staticRecordLoading.value = true
+ try {
+ const param = []
+ param[0] = ['状态', staticRecordDialog.status]
+ param[1] = ['PACK码', staticRecordDialog.packCode]
+ const data = CreateData('11', '线下手动静置_记录查询', param)
+ const response = await ExecDatabase(data)
+ staticRecordList.value = Array.isArray(response.data) ? response.data.slice(0, 100) : []
+ } catch (e) {
+ staticRecordList.value = []
+ ElMessage.error('查询静置产品失败')
+ } finally {
+ staticRecordLoading.value = false
+ }
+}
+
+const openStaticRecordDialog = async () => {
+ staticRecordDialog.visible = true
+ await queryStaticRecords()
+}
+
const handleConfirmClick = () => {
if (!canConfirmOnline.value) {
ElMessage.warning(scanResult.message || '当前状态不允许确认上线')
@@ -798,7 +853,7 @@ onBeforeUnmount(() => {
.operation-section,
.info-section,
.action-section {
- padding: 12px 24px 0;
+ padding: 10px 24px 0;
}
.info-section {
@@ -810,7 +865,7 @@ onBeforeUnmount(() => {
.card {
background: white;
border-radius: 8px;
- padding: 16px;
+ padding: 14px 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
}
@@ -827,20 +882,34 @@ onBeforeUnmount(() => {
}
.scan-row {
- display: flex;
+ display: grid;
+ grid-template-columns: 96px minmax(260px, 1fr) auto;
align-items: center;
gap: 12px;
}
.form-label {
- width: 96px;
- flex-shrink: 0;
text-align: right;
color: #606266;
font-size: 16px;
font-weight: 500;
}
+.scan-input {
+ min-width: 0;
+}
+
+.scan-actions {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ white-space: nowrap;
+}
+
+.scan-actions :deep(.el-button) {
+ min-width: 118px;
+}
+
.result-summary {
display: flex;
align-items: center;
@@ -874,6 +943,14 @@ onBeforeUnmount(() => {
color: #606266;
}
+.summary-tags {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+}
+
.section-title {
display: flex;
align-items: center;
@@ -893,7 +970,7 @@ onBeforeUnmount(() => {
.info-item,
.metric-item {
- min-height: 58px;
+ min-height: 56px;
padding: 10px 12px;
border-radius: 8px;
background: #f8fafc;
@@ -971,6 +1048,25 @@ onBeforeUnmount(() => {
color: #606266;
}
+.record-toolbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ margin-bottom: 12px;
+}
+
+.record-search {
+ display: grid;
+ grid-template-columns: minmax(220px, 320px) 140px;
+ gap: 12px;
+ align-items: center;
+}
+
+.record-search :deep(.el-button) {
+ width: 100%;
+}
+
@media (max-width: 1200px) {
.header-actions {
flex-wrap: wrap;
@@ -982,22 +1078,43 @@ onBeforeUnmount(() => {
}
}
-@media (max-width: 768px) {
- .scan-row,
+@media (max-width: 640px) {
+ .scan-row {
+ grid-template-columns: 1fr;
+ gap: 8px;
+ }
+
.action-card {
flex-direction: column;
align-items: stretch;
}
.form-label {
- width: auto;
text-align: left;
}
+ .scan-actions {
+ width: 100%;
+ }
+
+ .scan-actions :deep(.el-button) {
+ flex: 1;
+ min-width: 0;
+ }
+
.info-grid,
.metric-grid {
grid-template-columns: 1fr;
}
+
+ .record-toolbar {
+ align-items: stretch;
+ flex-direction: column;
+ }
+
+ .record-search {
+ grid-template-columns: 1fr;
+ }
}
@media (orientation: portrait) {