|
|
@ -13,26 +13,22 @@ |
|
|
|
|
|
|
|
|
<!-- 搜索框 --> |
|
|
<!-- 搜索框 --> |
|
|
<div class="search-container"> |
|
|
<div class="search-container"> |
|
|
<el-input clearable class="compact-input" |
|
|
|
|
|
v-model="scanCode" |
|
|
|
|
|
placeholder="请扫描标签条码" |
|
|
|
|
|
prefix-icon="el-icon-search" |
|
|
|
|
|
@keyup.enter.native="handleScan" |
|
|
|
|
|
ref="scanInput" |
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
<el-input clearable class="compact-input" v-model="scanCode" placeholder="请扫描标签条码" prefix-icon="el-icon-search" |
|
|
|
|
|
@keyup.enter.native="handleScan" ref="scanInput" /> |
|
|
<div class="mode-switch"> |
|
|
<div class="mode-switch"> |
|
|
<el-switch |
|
|
|
|
|
class="custom-switch" |
|
|
|
|
|
v-model="isRemoveMode" |
|
|
|
|
|
active-color="#ff4949" |
|
|
|
|
|
inactive-color="#13ce66"> |
|
|
|
|
|
|
|
|
<el-switch class="custom-switch" v-model="isRemoveMode" active-color="#ff4949" inactive-color="#13ce66"> |
|
|
</el-switch> |
|
|
</el-switch> |
|
|
<span v-if="isRemoveMode" class="switch-text">{{ '移除' }}</span> |
|
|
<span v-if="isRemoveMode" class="switch-text">{{ '移除' }}</span> |
|
|
<span v-else class="switch-text2">{{ '添加' }}</span> |
|
|
<span v-else class="switch-text2">{{ '添加' }}</span> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<!-- 是否部分勾选框 --> |
|
|
|
|
|
<div class="partial-checkbox-container"> |
|
|
|
|
|
<el-checkbox v-model="isPartial" :disabled="labelList.length > 0">是否部分领料</el-checkbox> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- 出库单信息卡片 --> |
|
|
<!-- 出库单信息卡片 --> |
|
|
|
|
|
<div class="scrollable-content"> |
|
|
<div class="material-info-card" v-if="outboundNo"> |
|
|
<div class="material-info-card" v-if="outboundNo"> |
|
|
<div class="card-title"> |
|
|
<div class="card-title"> |
|
|
<span class="title-label">出库单号:{{ outboundInfo.outboundNo }}</span> |
|
|
<span class="title-label">出库单号:{{ outboundInfo.outboundNo }}</span> |
|
|
@ -72,9 +68,6 @@ |
|
|
<i class="el-icon-circle-check"></i> |
|
|
<i class="el-icon-circle-check"></i> |
|
|
<span>出库信息确认</span> |
|
|
<span>出库信息确认</span> |
|
|
</div> |
|
|
</div> |
|
|
<!-- <div class="title-right"> |
|
|
|
|
|
<span class="material-list-link" @click="showMaterialListDialog">物料清单</span> |
|
|
|
|
|
</div> --> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- 标签列表 --> |
|
|
<!-- 标签列表 --> |
|
|
@ -83,19 +76,20 @@ |
|
|
<div class="col-no">NO.</div> |
|
|
<div class="col-no">NO.</div> |
|
|
<div class="col-label">标签条码</div> |
|
|
<div class="col-label">标签条码</div> |
|
|
<div class="col-part">库位</div> |
|
|
<div class="col-part">库位</div> |
|
|
|
|
|
<div class="col-qty">剩余高度</div> |
|
|
<div class="col-qty">标签数量</div> |
|
|
<div class="col-qty">标签数量</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="list-body"> |
|
|
<div class="list-body"> |
|
|
<div |
|
|
|
|
|
v-for="(label, index) in labelList" |
|
|
|
|
|
:key="label.id" |
|
|
|
|
|
class="list-item" |
|
|
|
|
|
> |
|
|
|
|
|
|
|
|
<div v-for="(label, index) in labelList" :key="label.id" class="list-item" :class="{ clickable: isPartial }" |
|
|
|
|
|
@click="isPartial ? handleLabelClick(label, index) : null"> |
|
|
<div class="col-no">{{ labelList.length - index }}</div> |
|
|
<div class="col-no">{{ labelList.length - index }}</div> |
|
|
<div class="col-label">{{ label.labelCode }}</div> |
|
|
<div class="col-label">{{ label.labelCode }}</div> |
|
|
<div class="col-part">{{ label.locationId }}</div> |
|
|
<div class="col-part">{{ label.locationId }}</div> |
|
|
<div class="col-qty">{{ label.quantity }}</div> |
|
|
|
|
|
|
|
|
<div class="col-qty"> |
|
|
|
|
|
<span class="quantity-display">{{ label.quantity }}</span> |
|
|
|
|
|
<i v-if="isPartial" class="el-icon-edit edit-icon"></i> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- 空状态 --> |
|
|
<!-- 空状态 --> |
|
|
@ -104,6 +98,7 @@ |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- 底部操作按钮 --> |
|
|
<!-- 底部操作按钮 --> |
|
|
<div class="bottom-actions"> |
|
|
<div class="bottom-actions"> |
|
|
@ -117,64 +112,57 @@ |
|
|
取消 |
|
|
取消 |
|
|
</button> |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- 物料清单弹窗 --> |
|
|
|
|
|
<div v-if="showMaterialDialog" class="material-overlay"> |
|
|
|
|
|
<div class="material-modal"> |
|
|
|
|
|
|
|
|
<!-- 修改数量弹框 --> |
|
|
|
|
|
<div v-if="quantityDialogVisible" class="edit-overlay" @click.self="quantityDialogVisible = false"> |
|
|
|
|
|
<div class="edit-modal"> |
|
|
<div class="modal-header"> |
|
|
<div class="modal-header"> |
|
|
<span class="modal-title">物料清单</span> |
|
|
|
|
|
<i class="el-icon-close close-btn" @click="closeMaterialDialog"></i> |
|
|
|
|
|
|
|
|
<span class="modal-title">修改数量</span> |
|
|
|
|
|
<i class="el-icon-close close-btn" @click="quantityDialogVisible = false"></i> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="modal-body"> |
|
|
<div class="modal-body"> |
|
|
<!-- 加载状态 --> |
|
|
|
|
|
<div v-if="materialListLoading" class="loading-container"> |
|
|
|
|
|
<i class="el-icon-loading"></i> |
|
|
|
|
|
<span>加载中...</span> |
|
|
|
|
|
|
|
|
<div class="form-group"> |
|
|
|
|
|
<label class="form-label">标签条码</label> |
|
|
|
|
|
<el-input v-model="currentEditLabel.labelCode" disabled class="form-input" /> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- 物料表格 --> |
|
|
|
|
|
<div v-else-if="materialList.length > 0" class="material-table"> |
|
|
|
|
|
<div class="table-header"> |
|
|
|
|
|
<div class="col-no">NO.</div> |
|
|
|
|
|
<div class="col-material-code">物料编码</div> |
|
|
|
|
|
<div class="col-required-qty">需求数量</div> |
|
|
|
|
|
<div class="col-picked-qty">已领数量</div> |
|
|
|
|
|
|
|
|
<div class="form-group"> |
|
|
|
|
|
<label class="form-label">当前数量</label> |
|
|
|
|
|
<el-input v-model="currentEditLabel.quantity" disabled class="form-input" /> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="table-body"> |
|
|
|
|
|
<div |
|
|
|
|
|
v-for="(item, index) in materialList" |
|
|
|
|
|
:key="index" |
|
|
|
|
|
class="table-row" |
|
|
|
|
|
> |
|
|
|
|
|
<div class="col-no">{{ index + 1 }}</div> |
|
|
|
|
|
<div class="col-material-code">{{ item.materialCode || item.partNo }}</div> |
|
|
|
|
|
<div class="col-required-qty">{{ item.requiredQty || 0 }}</div> |
|
|
|
|
|
<div class="col-picked-qty">{{ item.pickedQty || 0 }}</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="form-group"> |
|
|
|
|
|
<label class="form-label">剩余高度(mm) <span class="required">*</span></label> |
|
|
|
|
|
<el-input-number v-model="editHeight" :min="0.001" :precision="3" :step="0.001" class="form-input" |
|
|
|
|
|
style="width: 100%;" :controls="false"> |
|
|
|
|
|
</el-input-number> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<!-- 空数据状态 --> |
|
|
|
|
|
<div v-else class="empty-material"> |
|
|
|
|
|
<i class="el-icon-document"></i> |
|
|
|
|
|
<p>暂无物料数据</p> |
|
|
|
|
|
|
|
|
<div class="form-group"> |
|
|
|
|
|
<label class="form-label">修改数量 <span class="required">*</span></label> |
|
|
|
|
|
<el-input-number v-model="editQuantity" :min="0.0001" :precision="4" :step="0.0001" class="form-input" |
|
|
|
|
|
style="width: 100%;" :controls="false" /> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="modal-footer"> |
|
|
<div class="modal-footer"> |
|
|
<button class="btn-close" @click="closeMaterialDialog">关闭</button> |
|
|
|
|
|
|
|
|
<button class="btn-cancel" @click="quantityDialogVisible = false">取消</button> |
|
|
|
|
|
<button class="btn-confirm" @click="confirmQuantityChange">确定</button> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
</template> |
|
|
</template> |
|
|
|
|
|
|
|
|
<script> |
|
|
<script> |
|
|
import { scanMaterialLabelIssue,getRequestMaterials,confirmProductionPicking } from '@/api/production/production-issue'; |
|
|
|
|
|
import moment from 'moment'; |
|
|
|
|
|
import { notify } from 'node-notifier'; |
|
|
|
|
|
|
|
|
import { |
|
|
|
|
|
scanMaterialLabelIssue, |
|
|
|
|
|
getRequestMaterials, |
|
|
|
|
|
confirmProductionPicking, |
|
|
|
|
|
} from '@/api/production/production-issue' |
|
|
|
|
|
import moment from 'moment' |
|
|
|
|
|
import { notify } from 'node-notifier' |
|
|
|
|
|
|
|
|
export default { |
|
|
export default { |
|
|
data() { |
|
|
data() { |
|
|
@ -188,33 +176,39 @@ export default { |
|
|
materialList: [], |
|
|
materialList: [], |
|
|
materialListLoading: false, |
|
|
materialListLoading: false, |
|
|
isRemoveMode: false, // 默认为添加模式 |
|
|
isRemoveMode: false, // 默认为添加模式 |
|
|
pickingLoading: false |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
pickingLoading: false, |
|
|
|
|
|
isPartial: false, |
|
|
|
|
|
quantityDialogVisible: false, |
|
|
|
|
|
currentEditLabel: {}, |
|
|
|
|
|
currentEditIndex: -1, |
|
|
|
|
|
editQuantity: 0, |
|
|
|
|
|
editHeight: 0, |
|
|
|
|
|
} |
|
|
}, |
|
|
}, |
|
|
computed: { |
|
|
computed: { |
|
|
totalScannedQty() { |
|
|
totalScannedQty() { |
|
|
return this.labelList.reduce( |
|
|
return this.labelList.reduce( |
|
|
(sum, l) => sum + (Number(l.quantity) || 0), |
|
|
(sum, l) => sum + (Number(l.quantity) || 0), |
|
|
0 |
|
|
0 |
|
|
); |
|
|
|
|
|
|
|
|
) |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
}, |
|
|
methods: { |
|
|
methods: { |
|
|
formatDate(date) { |
|
|
formatDate(date) { |
|
|
return date ? moment(date).format('YYYY-MM-DD') : ''; |
|
|
|
|
|
|
|
|
return date ? moment(date).format('YYYY-MM-DD') : '' |
|
|
}, |
|
|
}, |
|
|
// 处理扫描 |
|
|
// 处理扫描 |
|
|
handleScan() { |
|
|
handleScan() { |
|
|
if (!this.scanCode.trim()) { |
|
|
if (!this.scanCode.trim()) { |
|
|
return; |
|
|
|
|
|
|
|
|
return |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (this.isRemoveMode) { |
|
|
if (this.isRemoveMode) { |
|
|
this.removeLabelByCode(this.scanCode.trim()); |
|
|
|
|
|
|
|
|
this.removeLabelByCode(this.scanCode.trim()) |
|
|
} else { |
|
|
} else { |
|
|
this.validateAndAddLabel(this.scanCode.trim()); |
|
|
|
|
|
|
|
|
this.validateAndAddLabel(this.scanCode.trim()) |
|
|
} |
|
|
} |
|
|
this.scanCode = ''; |
|
|
|
|
|
|
|
|
this.scanCode = '' |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
// 验证标签并添加到列表 |
|
|
// 验证标签并添加到列表 |
|
|
@ -223,20 +217,23 @@ export default { |
|
|
scannedLabel: labelCode, |
|
|
scannedLabel: labelCode, |
|
|
notifyNo: this.outboundNo, |
|
|
notifyNo: this.outboundNo, |
|
|
site: localStorage.getItem('site'), |
|
|
site: localStorage.getItem('site'), |
|
|
componentPartNo: this.outboundInfo.componentPartNo |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
componentPartNo: this.outboundInfo.componentPartNo, |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
scanMaterialLabelIssue(params).then(({ data }) => { |
|
|
|
|
|
|
|
|
scanMaterialLabelIssue(params) |
|
|
|
|
|
.then(({ data }) => { |
|
|
if (data && data.code === 0) { |
|
|
if (data && data.code === 0) { |
|
|
// 检查是否已经扫描过 |
|
|
// 检查是否已经扫描过 |
|
|
const exists = this.labelList.find(item => item.labelCode === labelCode); |
|
|
|
|
|
|
|
|
const exists = this.labelList.find( |
|
|
|
|
|
(item) => item.labelCode === labelCode |
|
|
|
|
|
) |
|
|
if (exists) { |
|
|
if (exists) { |
|
|
this.$message.warning('该标签已扫描,请勿重复扫描'); |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
this.$message.warning('该标签已扫描,请勿重复扫描') |
|
|
|
|
|
return |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 添加到列表 |
|
|
// 添加到列表 |
|
|
this.labelList.push({ |
|
|
|
|
|
|
|
|
const newLabel = { |
|
|
id: Date.now(), |
|
|
id: Date.now(), |
|
|
labelCode: labelCode, |
|
|
labelCode: labelCode, |
|
|
partNo: data.labelInfo.partNo, |
|
|
partNo: data.labelInfo.partNo, |
|
|
@ -246,55 +243,107 @@ export default { |
|
|
locationId: data.labelInfo.locationId, |
|
|
locationId: data.labelInfo.locationId, |
|
|
warehouseId: data.labelInfo.warehouseId, |
|
|
warehouseId: data.labelInfo.warehouseId, |
|
|
wdrNo: data.labelInfo.wdrNo, |
|
|
wdrNo: data.labelInfo.wdrNo, |
|
|
|
|
|
height: data.labelInfo.height || 0, |
|
|
engChgLevel: data.labelInfo.engChgLevel, |
|
|
engChgLevel: data.labelInfo.engChgLevel, |
|
|
}); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
this.labelList.push(newLabel) |
|
|
|
|
|
|
|
|
|
|
|
this.$message.success('操作成功') |
|
|
|
|
|
|
|
|
this.$message.success('操作成功'); |
|
|
|
|
|
|
|
|
if (this.isPartial) { |
|
|
|
|
|
const newIndex = this.labelList.length - 1 |
|
|
|
|
|
this.$nextTick(() => { |
|
|
|
|
|
this.handleLabelClick(newLabel, newIndex) |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
this.$message.error(data.msg || '该标签与出库单不符,请检查'); |
|
|
|
|
|
|
|
|
this.$message.error(data.msg || '该标签与出库单不符,请检查') |
|
|
} |
|
|
} |
|
|
}).catch(error => { |
|
|
|
|
|
this.$message.error('操作失败'); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
}) |
|
|
|
|
|
.catch((error) => { |
|
|
|
|
|
this.$message.error('操作失败') |
|
|
|
|
|
}) |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
// 通过条码移除标签 |
|
|
// 通过条码移除标签 |
|
|
removeLabelByCode(labelCode) { |
|
|
removeLabelByCode(labelCode) { |
|
|
const index = this.labelList.findIndex(item => item.labelCode === labelCode); |
|
|
|
|
|
|
|
|
const index = this.labelList.findIndex( |
|
|
|
|
|
(item) => item.labelCode === labelCode |
|
|
|
|
|
) |
|
|
if (index !== -1) { |
|
|
if (index !== -1) { |
|
|
this.labelList.splice(index, 1); |
|
|
|
|
|
this.$message.success('操作成功'); |
|
|
|
|
|
|
|
|
this.labelList.splice(index, 1) |
|
|
|
|
|
this.$message.success('操作成功') |
|
|
} else { |
|
|
} else { |
|
|
this.$message.warning('未找到该标签'); |
|
|
|
|
|
|
|
|
this.$message.warning('未找到该标签') |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 处理标签点击(部分领料) |
|
|
|
|
|
handleLabelClick(label, index) { |
|
|
|
|
|
if (!this.isPartial) { |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
this.currentEditLabel = { ...label } |
|
|
|
|
|
this.currentEditIndex = index |
|
|
|
|
|
this.editHeight = label.height |
|
|
|
|
|
this.editQuantity = Number(label.quantity) || 0 |
|
|
|
|
|
this.quantityDialogVisible = true |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 确认修改数量 |
|
|
|
|
|
confirmQuantityChange() { |
|
|
|
|
|
if (this.editHeight < 0) { |
|
|
|
|
|
this.$message.warning('高度不能小于0') |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
if (this.editQuantity <= 0) { |
|
|
|
|
|
this.$message.warning('数量必须大于0') |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
if ( |
|
|
|
|
|
this.currentEditIndex >= 0 && |
|
|
|
|
|
this.currentEditIndex < this.labelList.length |
|
|
|
|
|
) { |
|
|
|
|
|
this.$set( |
|
|
|
|
|
this.labelList[this.currentEditIndex], |
|
|
|
|
|
'quantity', |
|
|
|
|
|
this.editQuantity |
|
|
|
|
|
) |
|
|
|
|
|
this.$set( |
|
|
|
|
|
this.labelList[this.currentEditIndex], |
|
|
|
|
|
'height', |
|
|
|
|
|
this.editHeight |
|
|
|
|
|
) |
|
|
|
|
|
this.$message.success('数量修改成功') |
|
|
|
|
|
this.quantityDialogVisible = false |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
// 确认出库 |
|
|
// 确认出库 |
|
|
confirmOutbound() { |
|
|
confirmOutbound() { |
|
|
if (this.labelList.length === 0) { |
|
|
if (this.labelList.length === 0) { |
|
|
this.$message.warning('请先扫描标签'); |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
this.$message.warning('请先扫描标签') |
|
|
|
|
|
return |
|
|
} |
|
|
} |
|
|
let qty = 0; |
|
|
|
|
|
|
|
|
let qty = 0 |
|
|
for (const label of this.labelList) { |
|
|
for (const label of this.labelList) { |
|
|
if (label.quantity <= 0) { |
|
|
if (label.quantity <= 0) { |
|
|
this.$message.warning(`标签 ${label.labelCode} 数量无效`); |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
this.$message.warning(`标签 ${label.labelCode} 数量无效`) |
|
|
|
|
|
return |
|
|
} |
|
|
} |
|
|
qty += label.quantity; |
|
|
|
|
|
|
|
|
qty += label.quantity |
|
|
} |
|
|
} |
|
|
if (qty > this.outboundInfo.qtyToIssue) { |
|
|
if (qty > this.outboundInfo.qtyToIssue) { |
|
|
this.$confirm('扫描标签总数量超过需求数量确定出库吗?', '提示', { |
|
|
this.$confirm('扫描标签总数量超过需求数量确定出库吗?', '提示', { |
|
|
confirmButtonText: '确定', |
|
|
confirmButtonText: '确定', |
|
|
cancelButtonText: '取消', |
|
|
cancelButtonText: '取消', |
|
|
type: 'warning' |
|
|
|
|
|
|
|
|
type: 'warning', |
|
|
}).then(() => { |
|
|
}).then(() => { |
|
|
this.confirmProductionPicking(); |
|
|
|
|
|
|
|
|
this.confirmProductionPicking() |
|
|
}) |
|
|
}) |
|
|
} else { |
|
|
} else { |
|
|
this.confirmProductionPicking(); |
|
|
|
|
|
|
|
|
this.confirmProductionPicking() |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
}, |
|
|
}, |
|
|
confirmProductionPicking() { |
|
|
confirmProductionPicking() { |
|
|
const params = { |
|
|
const params = { |
|
|
@ -307,6 +356,7 @@ export default { |
|
|
lineItemNo: this.outboundInfo.lineItemNo, |
|
|
lineItemNo: this.outboundInfo.lineItemNo, |
|
|
releaseNo: this.outboundInfo.releaseNo, |
|
|
releaseNo: this.outboundInfo.releaseNo, |
|
|
sequenceNo: this.outboundInfo.sequenceNo, |
|
|
sequenceNo: this.outboundInfo.sequenceNo, |
|
|
|
|
|
isPartial: this.isPartial, |
|
|
selectedMaterials: this.labelList.map((l, i) => ({ |
|
|
selectedMaterials: this.labelList.map((l, i) => ({ |
|
|
labelCode: l.labelCode, |
|
|
labelCode: l.labelCode, |
|
|
issueQty: l.quantity, |
|
|
issueQty: l.quantity, |
|
|
@ -315,42 +365,49 @@ export default { |
|
|
locationId: l.locationId, |
|
|
locationId: l.locationId, |
|
|
materialCode: l.materialCode, |
|
|
materialCode: l.materialCode, |
|
|
wdrNo: l.wdrNo, |
|
|
wdrNo: l.wdrNo, |
|
|
|
|
|
height: l.height, |
|
|
engChgLevel: l.engChgLevel, |
|
|
engChgLevel: l.engChgLevel, |
|
|
})), |
|
|
})), |
|
|
}; |
|
|
|
|
|
|
|
|
} |
|
|
this.pickingLoading = true |
|
|
this.pickingLoading = true |
|
|
confirmProductionPicking(params).then(({ data }) => { |
|
|
|
|
|
|
|
|
confirmProductionPicking(params) |
|
|
|
|
|
.then(({ data }) => { |
|
|
if (data && data.code === 0) { |
|
|
if (data && data.code === 0) { |
|
|
this.$message.success('操作成功'); |
|
|
|
|
|
|
|
|
this.$message.success('操作成功') |
|
|
// 设置标记,表示需要恢复productionPicking页面的状态 |
|
|
// 设置标记,表示需要恢复productionPicking页面的状态 |
|
|
sessionStorage.setItem('productionPicking_shouldRestore', 'true'); |
|
|
|
|
|
|
|
|
sessionStorage.setItem('productionPicking_shouldRestore', 'true') |
|
|
// 保存本次扫描的数量和物料信息,用于更新已发数量 |
|
|
// 保存本次扫描的数量和物料信息,用于更新已发数量 |
|
|
const issueInfo = { |
|
|
const issueInfo = { |
|
|
componentPartNo: this.outboundInfo.componentPartNo, |
|
|
componentPartNo: this.outboundInfo.componentPartNo, |
|
|
lineItemNo: this.outboundInfo.lineItemNo, |
|
|
lineItemNo: this.outboundInfo.lineItemNo, |
|
|
issueQty: this.totalScannedQty |
|
|
|
|
|
}; |
|
|
|
|
|
sessionStorage.setItem('productionPicking_issueInfo', JSON.stringify(issueInfo)); |
|
|
|
|
|
this.$router.back(); |
|
|
|
|
|
|
|
|
issueQty: this.totalScannedQty, |
|
|
|
|
|
} |
|
|
|
|
|
sessionStorage.setItem( |
|
|
|
|
|
'productionPicking_issueInfo', |
|
|
|
|
|
JSON.stringify(issueInfo) |
|
|
|
|
|
) |
|
|
|
|
|
this.$router.back() |
|
|
} else { |
|
|
} else { |
|
|
this.$message.error(data.msg || '操作失败'); |
|
|
|
|
|
|
|
|
this.$message.error(data.msg || '操作失败') |
|
|
} |
|
|
} |
|
|
}).catch(error => { |
|
|
|
|
|
console.error('出库确认失败:', error); |
|
|
|
|
|
this.$message.error('操作失败'); |
|
|
|
|
|
}).finally(() => { |
|
|
|
|
|
|
|
|
}) |
|
|
|
|
|
.catch((error) => { |
|
|
|
|
|
console.error('出库确认失败:', error) |
|
|
|
|
|
this.$message.error('操作失败') |
|
|
|
|
|
}) |
|
|
|
|
|
.finally(() => { |
|
|
this.pickingLoading = false |
|
|
this.pickingLoading = false |
|
|
}); |
|
|
|
|
|
|
|
|
}) |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
// 打印标签 |
|
|
// 打印标签 |
|
|
printLabels() { |
|
|
printLabels() { |
|
|
if (this.labelList.length === 0) { |
|
|
if (this.labelList.length === 0) { |
|
|
this.$message.warning('暂无标签可打印'); |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
this.$message.warning('暂无标签可打印') |
|
|
|
|
|
return |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
this.$message.warning('打印功能开发中...'); |
|
|
|
|
|
|
|
|
this.$message.warning('打印功能开发中...') |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
// 取消出库 |
|
|
// 取消出库 |
|
|
@ -359,67 +416,33 @@ export default { |
|
|
this.$confirm('取消后将清空已扫描的标签,确定取消吗?', '提示', { |
|
|
this.$confirm('取消后将清空已扫描的标签,确定取消吗?', '提示', { |
|
|
confirmButtonText: '确定', |
|
|
confirmButtonText: '确定', |
|
|
cancelButtonText: '取消', |
|
|
cancelButtonText: '取消', |
|
|
type: 'warning' |
|
|
|
|
|
}).then(() => { |
|
|
|
|
|
|
|
|
type: 'warning', |
|
|
|
|
|
}) |
|
|
|
|
|
.then(() => { |
|
|
// 设置标记,表示需要恢复productionPicking页面的状态 |
|
|
// 设置标记,表示需要恢复productionPicking页面的状态 |
|
|
sessionStorage.setItem('productionPicking_shouldRestore', 'true'); |
|
|
|
|
|
this.$router.back(); |
|
|
|
|
|
}).catch(() => { |
|
|
|
|
|
|
|
|
sessionStorage.setItem('productionPicking_shouldRestore', 'true') |
|
|
|
|
|
this.$router.back() |
|
|
|
|
|
}) |
|
|
|
|
|
.catch(() => { |
|
|
// 用户选择继续操作 |
|
|
// 用户选择继续操作 |
|
|
}); |
|
|
|
|
|
|
|
|
}) |
|
|
} else { |
|
|
} else { |
|
|
// 设置标记,表示需要恢复productionPicking页面的状态 |
|
|
// 设置标记,表示需要恢复productionPicking页面的状态 |
|
|
sessionStorage.setItem('productionPicking_shouldRestore', 'true'); |
|
|
|
|
|
this.$router.back(); |
|
|
|
|
|
|
|
|
sessionStorage.setItem('productionPicking_shouldRestore', 'true') |
|
|
|
|
|
this.$router.back() |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
// 处理返回操作(头部返回按钮) |
|
|
// 处理返回操作(头部返回按钮) |
|
|
handleBack() { |
|
|
handleBack() { |
|
|
// 设置标记,表示需要恢复productionPicking页面的状态 |
|
|
// 设置标记,表示需要恢复productionPicking页面的状态 |
|
|
sessionStorage.setItem('productionPicking_shouldRestore', 'true'); |
|
|
|
|
|
this.$router.back(); |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 显示物料清单弹窗 |
|
|
|
|
|
showMaterialListDialog() { |
|
|
|
|
|
this.showMaterialDialog = true; |
|
|
|
|
|
this.loadMaterialList(); |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 加载物料清单 |
|
|
|
|
|
loadMaterialList() { |
|
|
|
|
|
console.log('加载物料清单', this.outboundInfo, this.outboundNo); |
|
|
|
|
|
|
|
|
|
|
|
if (!localStorage.getItem('site') || !this.outboundNo) { |
|
|
|
|
|
this.$message.error('缺少必要参数,无法获取物料清单'); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
this.materialListLoading = true; |
|
|
|
|
|
const params = { |
|
|
|
|
|
site: localStorage.getItem('site'), |
|
|
|
|
|
outboundNo: this.outboundNo |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
getRequestMaterials(params).then(({ data }) => { |
|
|
|
|
|
this.materialListLoading = false; |
|
|
|
|
|
if (data && data.code === 0) { |
|
|
|
|
|
this.materialList = data.materials || []; |
|
|
|
|
|
} else { |
|
|
|
|
|
this.$message.error(data.msg || '获取物料清单失败'); |
|
|
|
|
|
this.materialList = []; |
|
|
|
|
|
} |
|
|
|
|
|
}).catch(error => { |
|
|
|
|
|
this.materialListLoading = false; |
|
|
|
|
|
this.$message.error('获取物料清单失败'); |
|
|
|
|
|
this.materialList = []; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
sessionStorage.setItem('productionPicking_shouldRestore', 'true') |
|
|
|
|
|
this.$router.back() |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
// 关闭物料清单弹窗 |
|
|
// 关闭物料清单弹窗 |
|
|
closeMaterialDialog() { |
|
|
closeMaterialDialog() { |
|
|
this.showMaterialDialog = false; |
|
|
|
|
|
|
|
|
this.showMaterialDialog = false |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
// 加载出库单详情 |
|
|
// 加载出库单详情 |
|
|
@ -427,8 +450,8 @@ export default { |
|
|
const params = { |
|
|
const params = { |
|
|
outboundNo: this.outboundNo, |
|
|
outboundNo: this.outboundNo, |
|
|
site: localStorage.getItem('site'), |
|
|
site: localStorage.getItem('site'), |
|
|
}; |
|
|
|
|
|
console.log('加载出库单详情参数:', params); |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
console.log('加载出库单详情参数:', params) |
|
|
|
|
|
|
|
|
/* getOutboundDetails(params).then(({ data }) => { |
|
|
/* getOutboundDetails(params).then(({ data }) => { |
|
|
if (data && data.code === 0) { |
|
|
if (data && data.code === 0) { |
|
|
@ -440,7 +463,7 @@ export default { |
|
|
console.error('获取出库单详情失败:', error); |
|
|
console.error('获取出库单详情失败:', error); |
|
|
this.$message.error('获取出库单详情失败'); |
|
|
this.$message.error('获取出库单详情失败'); |
|
|
}); */ |
|
|
}); */ |
|
|
} |
|
|
|
|
|
|
|
|
}, |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
mounted() { |
|
|
mounted() { |
|
|
@ -448,33 +471,32 @@ export default { |
|
|
this.outboundNo = this.$route.query.outboundNo |
|
|
this.outboundNo = this.$route.query.outboundNo |
|
|
this.outboundInfo.outboundNo = this.$route.query.outboundNo |
|
|
this.outboundInfo.outboundNo = this.$route.query.outboundNo |
|
|
this.outboundInfo.orderNo = this.$route.query.notifyInfo.orderNo |
|
|
this.outboundInfo.orderNo = this.$route.query.notifyInfo.orderNo |
|
|
this.outboundInfo.componentPartNo = this.$route.query.notifyInfo.componentPartNo |
|
|
|
|
|
|
|
|
this.outboundInfo.componentPartNo = |
|
|
|
|
|
this.$route.query.notifyInfo.componentPartNo |
|
|
this.outboundInfo.qtyToIssue = this.$route.query.notifyInfo.qtyToIssue |
|
|
this.outboundInfo.qtyToIssue = this.$route.query.notifyInfo.qtyToIssue |
|
|
this.outboundInfo.itemNo = this.$route.query.notifyInfo.itemNo |
|
|
this.outboundInfo.itemNo = this.$route.query.notifyInfo.itemNo |
|
|
this.outboundInfo.lineItemNo = this.$route.query.notifyInfo.lineItemNo |
|
|
this.outboundInfo.lineItemNo = this.$route.query.notifyInfo.lineItemNo |
|
|
this.outboundInfo.releaseNo = this.$route.query.notifyInfo.releaseNo |
|
|
this.outboundInfo.releaseNo = this.$route.query.notifyInfo.releaseNo |
|
|
this.outboundInfo.sequenceNo = this.$route.query.notifyInfo.sequenceNo |
|
|
this.outboundInfo.sequenceNo = this.$route.query.notifyInfo.sequenceNo |
|
|
console.log("路由参数:", this.$route.query.notifyInfo ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log('路由参数:', this.$route.query.notifyInfo) |
|
|
|
|
|
|
|
|
if (!this.outboundNo) { |
|
|
if (!this.outboundNo) { |
|
|
this.$message.error('参数错误'); |
|
|
|
|
|
this.$router.back(); |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
this.$message.error('参数错误') |
|
|
|
|
|
this.$router.back() |
|
|
|
|
|
return |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 聚焦扫描框 |
|
|
// 聚焦扫描框 |
|
|
this.$nextTick(() => { |
|
|
this.$nextTick(() => { |
|
|
if (this.$refs.scanInput) { |
|
|
if (this.$refs.scanInput) { |
|
|
this.$refs.scanInput.focus(); |
|
|
|
|
|
|
|
|
this.$refs.scanInput.focus() |
|
|
} |
|
|
} |
|
|
}); |
|
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
// 加载出库单详情 |
|
|
// 加载出库单详情 |
|
|
this.loadOutboundDetails(); |
|
|
|
|
|
|
|
|
this.loadOutboundDetails() |
|
|
|
|
|
}, |
|
|
} |
|
|
} |
|
|
}; |
|
|
|
|
|
</script> |
|
|
</script> |
|
|
|
|
|
|
|
|
<style scoped> |
|
|
<style scoped> |
|
|
@ -493,7 +515,7 @@ export default { |
|
|
justify-content: space-between; |
|
|
justify-content: space-between; |
|
|
align-items: center; |
|
|
align-items: center; |
|
|
padding: 8px 16px; |
|
|
padding: 8px 16px; |
|
|
background: #17B3A3; |
|
|
|
|
|
|
|
|
background: #17b3a3; |
|
|
color: white; |
|
|
color: white; |
|
|
height: 40px; |
|
|
height: 40px; |
|
|
min-height: 40px; |
|
|
min-height: 40px; |
|
|
@ -532,6 +554,24 @@ export default { |
|
|
margin-right: 12px; |
|
|
margin-right: 12px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.partial-checkbox { |
|
|
|
|
|
display: flex; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
margin-left: auto; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.partial-checkbox ::v-deep .el-checkbox__label { |
|
|
|
|
|
font-size: 14px; |
|
|
|
|
|
color: #333; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.partial-checkbox |
|
|
|
|
|
::v-deep |
|
|
|
|
|
.el-checkbox__input.is-disabled |
|
|
|
|
|
+ .el-checkbox__label { |
|
|
|
|
|
color: #c0c4cc; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/* 紧凑型输入框样式 */ |
|
|
/* 紧凑型输入框样式 */ |
|
|
.compact-input ::v-deep .el-input__inner { |
|
|
.compact-input ::v-deep .el-input__inner { |
|
|
height: 36px; |
|
|
height: 36px; |
|
|
@ -556,6 +596,23 @@ export default { |
|
|
.custom-switch { |
|
|
.custom-switch { |
|
|
transform: scale(1.3); |
|
|
transform: scale(1.3); |
|
|
} |
|
|
} |
|
|
|
|
|
.partial-checkbox-container { |
|
|
|
|
|
padding: 8px 16px; |
|
|
|
|
|
background: white; |
|
|
|
|
|
border-top: 1px solid #f0f0f0; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
} |
|
|
|
|
|
.partial-checkbox-container ::v-deep .el-checkbox__label { |
|
|
|
|
|
font-size: 14px; |
|
|
|
|
|
color: #333; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.scrollable-content { |
|
|
|
|
|
flex: 1; |
|
|
|
|
|
overflow-y: auto; |
|
|
|
|
|
min-height: 0; |
|
|
|
|
|
} |
|
|
/* 中间文字 */ |
|
|
/* 中间文字 */ |
|
|
.switch-text { |
|
|
.switch-text { |
|
|
position: absolute; |
|
|
position: absolute; |
|
|
@ -667,7 +724,7 @@ export default { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.detail-value .qualified { |
|
|
.detail-value .qualified { |
|
|
color: #17B3A3; |
|
|
|
|
|
|
|
|
color: #17b3a3; |
|
|
font-weight: 500; |
|
|
font-weight: 500; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -691,7 +748,7 @@ export default { |
|
|
margin: 0 10px; |
|
|
margin: 0 10px; |
|
|
margin-top: 4px; |
|
|
margin-top: 4px; |
|
|
border-radius: 8px 8px 0 0; |
|
|
border-radius: 8px 8px 0 0; |
|
|
border-bottom: 2px solid #17B3A3; |
|
|
|
|
|
|
|
|
border-bottom: 2px solid #17b3a3; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.title-left { |
|
|
.title-left { |
|
|
@ -700,13 +757,13 @@ export default { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.title-left i { |
|
|
.title-left i { |
|
|
color: #17B3A3; |
|
|
|
|
|
|
|
|
color: #17b3a3; |
|
|
font-size: 16px; |
|
|
font-size: 16px; |
|
|
margin-right: 8px; |
|
|
margin-right: 8px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.title-left span { |
|
|
.title-left span { |
|
|
color: #17B3A3; |
|
|
|
|
|
|
|
|
color: #17b3a3; |
|
|
font-size: 14px; |
|
|
font-size: 14px; |
|
|
font-weight: 500; |
|
|
font-weight: 500; |
|
|
} |
|
|
} |
|
|
@ -717,7 +774,7 @@ export default { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.material-list-link { |
|
|
.material-list-link { |
|
|
color: #17B3A3; |
|
|
|
|
|
|
|
|
color: #17b3a3; |
|
|
font-size: 14px; |
|
|
font-size: 14px; |
|
|
font-weight: 500; |
|
|
font-weight: 500; |
|
|
cursor: pointer; |
|
|
cursor: pointer; |
|
|
@ -737,7 +794,6 @@ export default { |
|
|
overflow: hidden; |
|
|
overflow: hidden; |
|
|
display: flex; |
|
|
display: flex; |
|
|
flex-direction: column; |
|
|
flex-direction: column; |
|
|
max-height: calc(100vh - 320px); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.list-header { |
|
|
.list-header { |
|
|
@ -752,7 +808,6 @@ export default { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.list-body { |
|
|
.list-body { |
|
|
overflow-y: auto; |
|
|
|
|
|
flex: 1; |
|
|
flex: 1; |
|
|
min-height: 0; |
|
|
min-height: 0; |
|
|
} |
|
|
} |
|
|
@ -767,6 +822,19 @@ export default { |
|
|
min-height: 40px; |
|
|
min-height: 40px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.list-item.clickable { |
|
|
|
|
|
cursor: pointer; |
|
|
|
|
|
transition: background-color 0.2s; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.list-item.clickable:hover { |
|
|
|
|
|
background-color: #f5f5f5; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.list-item.clickable:active { |
|
|
|
|
|
background-color: #e8e8e8; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
.list-item:last-child { |
|
|
.list-item:last-child { |
|
|
border-bottom: none; |
|
|
border-bottom: none; |
|
|
} |
|
|
} |
|
|
@ -799,6 +867,16 @@ export default { |
|
|
text-align: center; |
|
|
text-align: center; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.quantity-display { |
|
|
|
|
|
display: inline-block; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-icon { |
|
|
|
|
|
margin-left: 4px; |
|
|
|
|
|
color: #17b3a3; |
|
|
|
|
|
font-size: 14px; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
.empty-labels { |
|
|
.empty-labels { |
|
|
padding: 40px 20px; |
|
|
padding: 40px 20px; |
|
|
text-align: center; |
|
|
text-align: center; |
|
|
@ -822,9 +900,9 @@ export default { |
|
|
.action-btn { |
|
|
.action-btn { |
|
|
flex: 1; |
|
|
flex: 1; |
|
|
padding: 12px; |
|
|
padding: 12px; |
|
|
border: 1px solid #17B3A3; |
|
|
|
|
|
|
|
|
border: 1px solid #17b3a3; |
|
|
background: white; |
|
|
background: white; |
|
|
color: #17B3A3; |
|
|
|
|
|
|
|
|
color: #17b3a3; |
|
|
border-radius: 20px; |
|
|
border-radius: 20px; |
|
|
font-size: 14px; |
|
|
font-size: 14px; |
|
|
cursor: pointer; |
|
|
cursor: pointer; |
|
|
@ -832,7 +910,7 @@ export default { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.action-btn:hover { |
|
|
.action-btn:hover { |
|
|
background: #17B3A3; |
|
|
|
|
|
|
|
|
background: #17b3a3; |
|
|
color: white; |
|
|
color: white; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -868,7 +946,7 @@ export default { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.material-modal .modal-header { |
|
|
.material-modal .modal-header { |
|
|
background: #17B3A3; |
|
|
|
|
|
|
|
|
background: #17b3a3; |
|
|
color: white; |
|
|
color: white; |
|
|
padding: 5px 16px; |
|
|
padding: 5px 16px; |
|
|
display: flex; |
|
|
display: flex; |
|
|
@ -913,7 +991,7 @@ export default { |
|
|
display: flex; |
|
|
display: flex; |
|
|
background: #f8f9fa; |
|
|
background: #f8f9fa; |
|
|
padding: 10px 6px; |
|
|
padding: 10px 6px; |
|
|
border-bottom: 2px solid #17B3A3; |
|
|
|
|
|
|
|
|
border-bottom: 2px solid #17b3a3; |
|
|
font-size: 12px; |
|
|
font-size: 12px; |
|
|
color: #333; |
|
|
color: #333; |
|
|
font-weight: 600; |
|
|
font-weight: 600; |
|
|
@ -986,13 +1064,13 @@ export default { |
|
|
font-size: 14px; |
|
|
font-size: 14px; |
|
|
cursor: pointer; |
|
|
cursor: pointer; |
|
|
transition: all 0.2s; |
|
|
transition: all 0.2s; |
|
|
border: 1px solid #17B3A3; |
|
|
|
|
|
|
|
|
border: 1px solid #17b3a3; |
|
|
background: white; |
|
|
background: white; |
|
|
color: #17B3A3; |
|
|
|
|
|
|
|
|
color: #17b3a3; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.btn-close:hover { |
|
|
.btn-close:hover { |
|
|
background: #17B3A3; |
|
|
|
|
|
|
|
|
background: #17b3a3; |
|
|
color: white; |
|
|
color: white; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -1009,7 +1087,7 @@ export default { |
|
|
.loading-container i { |
|
|
.loading-container i { |
|
|
font-size: 24px; |
|
|
font-size: 24px; |
|
|
margin-bottom: 12px; |
|
|
margin-bottom: 12px; |
|
|
color: #17B3A3; |
|
|
|
|
|
|
|
|
color: #17b3a3; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.loading-container span { |
|
|
.loading-container span { |
|
|
@ -1037,6 +1115,146 @@ export default { |
|
|
font-size: 14px; |
|
|
font-size: 14px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* 修改数量弹框 */ |
|
|
|
|
|
.edit-overlay { |
|
|
|
|
|
position: fixed; |
|
|
|
|
|
top: 0; |
|
|
|
|
|
left: 0; |
|
|
|
|
|
right: 0; |
|
|
|
|
|
bottom: 0; |
|
|
|
|
|
background: rgba(0, 0, 0, 0.5); |
|
|
|
|
|
z-index: 10000; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
justify-content: center; |
|
|
|
|
|
padding: 20px; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal { |
|
|
|
|
|
background: white; |
|
|
|
|
|
border-radius: 12px; |
|
|
|
|
|
width: 100%; |
|
|
|
|
|
max-width: 400px; |
|
|
|
|
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); |
|
|
|
|
|
overflow: hidden; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
flex-direction: column; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .modal-header { |
|
|
|
|
|
background: #17b3a3; |
|
|
|
|
|
color: white; |
|
|
|
|
|
padding: 12px 16px; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
justify-content: space-between; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .modal-title { |
|
|
|
|
|
font-size: 16px; |
|
|
|
|
|
font-weight: 500; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .close-btn { |
|
|
|
|
|
font-size: 16px; |
|
|
|
|
|
cursor: pointer; |
|
|
|
|
|
color: white; |
|
|
|
|
|
transition: color 0.2s ease; |
|
|
|
|
|
padding: 4px; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
align-items: center; |
|
|
|
|
|
justify-content: center; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .close-btn:hover { |
|
|
|
|
|
color: #e0e0e0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .modal-body { |
|
|
|
|
|
padding: 20px; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .form-group { |
|
|
|
|
|
margin-bottom: 16px; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .form-label { |
|
|
|
|
|
display: block; |
|
|
|
|
|
font-size: 14px; |
|
|
|
|
|
color: #333; |
|
|
|
|
|
margin-bottom: 6px; |
|
|
|
|
|
font-weight: 500; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .required { |
|
|
|
|
|
color: #ff4949; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .form-input { |
|
|
|
|
|
width: 100%; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .form-input ::v-deep .el-input__inner, |
|
|
|
|
|
.edit-modal .form-input ::v-deep .el-input-number .el-input__inner { |
|
|
|
|
|
height: 40px; |
|
|
|
|
|
border: 2px solid #dcdfe6; |
|
|
|
|
|
border-radius: 6px; |
|
|
|
|
|
font-size: 14px; |
|
|
|
|
|
padding: 0 12px; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .form-input ::v-deep .el-input__inner:focus, |
|
|
|
|
|
.edit-modal .form-input ::v-deep .el-input-number .el-input__inner:focus { |
|
|
|
|
|
border-color: #17b3a3; |
|
|
|
|
|
outline: none; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .form-input ::v-deep .el-input__inner:disabled { |
|
|
|
|
|
background: #f5f7fa; |
|
|
|
|
|
color: #c0c4cc; |
|
|
|
|
|
border-color: #e4e7ed; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .modal-footer { |
|
|
|
|
|
padding: 16px 20px; |
|
|
|
|
|
display: flex; |
|
|
|
|
|
gap: 12px; |
|
|
|
|
|
justify-content: flex-end; |
|
|
|
|
|
border-top: 1px solid #f0f0f0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .btn-cancel { |
|
|
|
|
|
padding: 10px 20px; |
|
|
|
|
|
border-radius: 6px; |
|
|
|
|
|
font-size: 14px; |
|
|
|
|
|
cursor: pointer; |
|
|
|
|
|
transition: all 0.2s; |
|
|
|
|
|
border: 1px solid #dcdfe6; |
|
|
|
|
|
background: white; |
|
|
|
|
|
color: #606266; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .btn-cancel:hover { |
|
|
|
|
|
background: #f5f7fa; |
|
|
|
|
|
border-color: #c0c4cc; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .btn-confirm { |
|
|
|
|
|
padding: 10px 20px; |
|
|
|
|
|
border-radius: 6px; |
|
|
|
|
|
font-size: 14px; |
|
|
|
|
|
cursor: pointer; |
|
|
|
|
|
transition: all 0.2s; |
|
|
|
|
|
border: 1px solid #17b3a3; |
|
|
|
|
|
background: #17b3a3; |
|
|
|
|
|
color: white; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.edit-modal .btn-confirm:hover { |
|
|
|
|
|
background: #13998c; |
|
|
|
|
|
border-color: #13998c; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/* 响应式设计 */ |
|
|
/* 响应式设计 */ |
|
|
@media (max-width: 360px) { |
|
|
@media (max-width: 360px) { |
|
|
.header-bar { |
|
|
.header-bar { |
|
|
@ -1072,11 +1290,13 @@ export default { |
|
|
min-width: 50px; |
|
|
min-width: 50px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.list-header, .list-item { |
|
|
|
|
|
|
|
|
.list-header, |
|
|
|
|
|
.list-item { |
|
|
font-size: 11px; |
|
|
font-size: 11px; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.col-label, .col-part { |
|
|
|
|
|
|
|
|
.col-label, |
|
|
|
|
|
.col-part { |
|
|
flex: 1.5; |
|
|
flex: 1.5; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|