更新录入合卷分卷添加选择分类

This commit is contained in:
2025-11-03 13:16:04 +08:00
parent 7db5cfb29f
commit 797292bd31
3 changed files with 1402 additions and 0 deletions

View File

@@ -0,0 +1,643 @@
<template>
<div class="split-coil-container">
<!-- 顶部操作栏 -->
<div class="header-bar">
<div class="header-title">
<i class="el-icon-s-operation"></i>
<span>钢卷分卷</span>
</div>
<div class="header-actions">
<el-button type="primary" size="small" @click="handleSave" :loading="loading">保存分卷</el-button>
<el-button size="small" @click="handleCancel" :disabled="loading">取消</el-button>
</div>
</div>
<!-- 流程图区域 -->
<div class="flow-container">
<!-- 左侧母卷信息 -->
<div class="flow-left">
<div class="flow-section-title">
<span>母卷信息</span>
<el-button type="text" size="mini" @click="showCoilSelector" icon="el-icon-search">选择母卷</el-button>
</div>
<div class="coil-card mother-coil">
<div class="coil-header">
<i class="el-icon-s-grid"></i>
<span class="coil-id">{{ motherCoil.currentCoilNo || '—' }}</span>
</div>
<div class="coil-body">
<div class="coil-info-row">
<span class="label">钢种</span>
<span class="value">{{ motherCoil.grade || '—' }}</span>
</div>
<div class="coil-info-row">
<span class="label">厚度</span>
<span class="value">{{ motherCoil.thickness || '—' }} mm</span>
</div>
<div class="coil-info-row">
<span class="label">宽度</span>
<span class="value">{{ motherCoil.width || '—' }} mm</span>
</div>
<div class="coil-info-row">
<span class="label">重量</span>
<span class="value highlight">{{ motherCoil.weight || '—' }} t</span>
</div>
</div>
</div>
</div>
<!-- 中间流程箭头 -->
<div class="flow-middle">
<div class="flow-arrow-container">
<div class="arrow-line" v-for="(item, index) in splitList" :key="index">
<div class="arrow-start"></div>
<div class="arrow-body"></div>
<div class="arrow-end"></div>
</div>
</div>
<div class="flow-label">
<i class="el-icon-d-arrow-right"></i>
<span>分割</span>
</div>
</div>
<!-- 右侧子卷列表 -->
<div class="flow-right">
<div class="flow-section-title">
<span>子卷列表</span>
<el-button type="text" size="mini" @click="addSplitItem" icon="el-icon-plus">添加子卷</el-button>
</div>
<div class="split-list">
<div class="sub-coil-card" v-for="(item, index) in splitList" :key="index">
<div class="sub-coil-header">
<span class="sub-coil-number">{{ index + 1 }}</span>
<el-button
type="text"
size="mini"
icon="el-icon-delete"
@click="removeSplitItem(index)"
class="btn-remove"
></el-button>
</div>
<div class="sub-coil-body">
<el-form size="small" label-width="70px">
<el-form-item label="卷号">
<el-input v-model="item.currentCoilNo" placeholder="输入子卷卷号"></el-input>
</el-form-item>
<el-form-item label="重量(t)">
<el-input-number
v-model="item.weight"
:min="0"
:precision="2"
controls-position="right"
style="width: 100%"
></el-input-number>
</el-form-item>
<el-form-item label="长度(m)">
<el-input-number
v-model="item.length"
:min="0"
:precision="2"
controls-position="right"
style="width: 100%"
></el-input-number>
</el-form-item>
</el-form>
</div>
</div>
</div>
<!-- 汇总信息 -->
<div class="summary-card">
<div class="summary-item">
<span class="summary-label">子卷数量</span>
<span class="summary-value">{{ splitList.length }}</span>
</div>
<div class="summary-item">
<span class="summary-label">总重量</span>
<span class="summary-value" :class="{ 'error': totalWeight > motherCoil.weight }">
{{ totalWeight.toFixed(2) }} t
</span>
</div>
<div class="summary-item">
<span class="summary-label">剩余重量</span>
<span class="summary-value" :class="{ 'error': remainWeight < 0 }">
{{ remainWeight.toFixed(2) }} t
</span>
</div>
</div>
</div>
</div>
<!-- 钢卷选择器 -->
<coil-selector
:visible.sync="coilSelectorVisible"
@select="handleCoilSelect"
/>
</div>
</template>
<script>
import { getMaterialCoil, splitMaterialCoil } from '@/api/wms/coil';
import CoilSelector from '@/components/CoilSelector';
export default {
name: 'SplitCoil',
components: {
CoilSelector
},
data() {
return {
// 母卷信息
motherCoil: {
coilId: null,
currentCoilNo: '',
grade: '',
thickness: null,
width: null,
weight: null,
warehouseId: null,
team: null,
itemType: null,
itemId: null,
enterCoilNo: '',
supplierCoilNo: ''
},
// 子卷列表
splitList: [
{ currentCoilNo: '', weight: 0, length: 0 }
],
loading: false,
// 钢卷选择器可见性
coilSelectorVisible: false
};
},
computed: {
// 子卷总重量
totalWeight() {
return this.splitList.reduce((sum, item) => sum + (Number(item.weight) || 0), 0);
},
// 剩余重量
remainWeight() {
return (Number(this.motherCoil.weight) || 0) - this.totalWeight;
}
},
created() {
// 如果URL中有coilId参数则加载母卷信息
const coilId = this.$route.query.coilId;
if (coilId) {
this.loadMotherCoil(coilId);
}
},
methods: {
// 显示钢卷选择器
showCoilSelector() {
this.coilSelectorVisible = true;
},
// 钢卷选择回调
handleCoilSelect(coil) {
this.motherCoil = {
coilId: coil.coilId,
currentCoilNo: coil.currentCoilNo || '',
grade: coil.grade || '',
thickness: coil.thickness,
width: coil.width,
weight: coil.weight,
warehouseId: coil.warehouseId,
team: coil.team,
itemType: coil.itemType,
itemId: coil.itemId,
enterCoilNo: coil.enterCoilNo || '',
supplierCoilNo: coil.supplierCoilNo || ''
};
this.$message.success('母卷选择成功');
},
// 加载母卷信息
async loadMotherCoil(coilId) {
try {
this.loading = true;
const response = await getMaterialCoil(coilId);
if (response.code === 200 && response.data) {
const data = response.data;
this.motherCoil = {
coilId: data.coilId,
currentCoilNo: data.currentCoilNo || '',
grade: data.grade || '',
thickness: data.thickness,
width: data.width,
weight: data.weight,
warehouseId: data.warehouseId,
team: data.team,
itemType: data.itemType,
itemId: data.itemId,
enterCoilNo: data.enterCoilNo || '',
supplierCoilNo: data.supplierCoilNo || ''
};
}
} catch (error) {
this.$message.error('加载母卷信息失败');
console.error(error);
} finally {
this.loading = false;
}
},
// 添加子卷
addSplitItem() {
this.splitList.push({
currentCoilNo: '',
weight: 0,
length: 0
});
},
// 删除子卷
removeSplitItem(index) {
if (this.splitList.length > 1) {
this.splitList.splice(index, 1);
} else {
this.$message.warning('至少保留一个子卷');
}
},
// 保存分卷
async handleSave() {
// 验证母卷信息
if (!this.motherCoil.coilId) {
this.$message.error('请先选择母卷');
return;
}
// 验证子卷数量
if (this.splitList.length < 1) {
this.$message.error('至少需要一个子卷');
return;
}
// 验证重量
if (this.remainWeight < 0) {
this.$message.error('子卷总重量不能超过母卷重量');
return;
}
// 验证子卷信息
for (let i = 0; i < this.splitList.length; i++) {
const item = this.splitList[i];
if (!item.currentCoilNo || item.currentCoilNo.trim() === '') {
this.$message.error(`${i + 1}个子卷的卷号不能为空`);
return;
}
if (!item.weight || item.weight <= 0) {
this.$message.error(`${i + 1}个子卷的重量必须大于0`);
return;
}
}
try {
this.loading = true;
// 构造分卷数据
const splitData = {
coilId: this.motherCoil.coilId,
currentCoilNo: this.motherCoil.currentCoilNo,
hasMergeSplit: 1, // 1表示分卷
newCoils: this.splitList.map(item => ({
currentCoilNo: item.currentCoilNo,
weight: item.weight,
length: item.length,
hasMergeSplit: 1,
// 继承母卷的基本信息
grade: this.motherCoil.grade,
thickness: this.motherCoil.thickness,
width: this.motherCoil.width,
warehouseId: this.motherCoil.warehouseId,
team: this.motherCoil.team,
itemType: this.motherCoil.itemType,
itemId: this.motherCoil.itemId
}))
};
const response = await splitMaterialCoil(splitData);
if (response.code === 200) {
this.$message.success('分卷保存成功');
// 延迟返回,让用户看到成功提示
setTimeout(() => {
this.$router.back();
}, 1000);
} else {
this.$message.error(response.msg || '分卷保存失败');
}
} catch (error) {
this.$message.error('分卷保存失败');
console.error(error);
} finally {
this.loading = false;
}
},
// 取消操作
handleCancel() {
this.$router.back();
}
}
};
</script>
<style scoped lang="scss">
.split-coil-container {
padding: 20px;
background: #f5f7fa;
min-height: calc(100vh - 84px);
}
/* 顶部操作栏 */
.header-bar {
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
padding: 16px 20px;
margin-bottom: 20px;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.header-title {
font-size: 18px;
font-weight: 500;
color: #303133;
display: flex;
align-items: center;
gap: 8px;
i {
color: #0066cc;
font-size: 20px;
}
}
/* 流程图容器 */
.flow-container {
display: flex;
gap: 40px;
background: #fff;
padding: 30px;
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
min-height: 600px;
}
.flow-left {
flex: 0 0 300px;
}
.flow-middle {
flex: 0 0 120px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
position: relative;
}
.flow-right {
flex: 1;
min-width: 0;
}
.flow-section-title {
font-size: 16px;
font-weight: 500;
color: #303133;
margin-bottom: 16px;
padding-left: 12px;
border-left: 4px solid #0066cc;
display: flex;
justify-content: space-between;
align-items: center;
.el-button--text {
font-size: 12px;
}
}
/* 母卷卡片 */
.mother-coil {
border: 2px solid #0066cc;
box-shadow: 0 4px 12px rgba(0, 102, 204, 0.15);
}
.coil-card {
background: #fff;
border: 1px solid #e4e7ed;
border-radius: 8px;
overflow: hidden;
}
.coil-header {
background: #0066cc;
color: #fff;
padding: 16px 20px;
display: flex;
align-items: center;
gap: 10px;
i {
font-size: 20px;
}
.coil-id {
font-size: 16px;
font-weight: 600;
letter-spacing: 1px;
}
}
.coil-body {
padding: 20px;
}
.coil-info-row {
display: flex;
align-items: center;
margin-bottom: 12px;
&:last-child {
margin-bottom: 0;
}
.label {
color: #909399;
font-size: 14px;
min-width: 70px;
}
.value {
color: #303133;
font-size: 14px;
font-weight: 500;
&.highlight {
color: #0066cc;
font-size: 16px;
font-weight: 600;
}
}
}
/* 流程箭头 */
.flow-arrow-container {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: 100%;
}
.arrow-line {
position: relative;
height: 3px;
margin: 20px 0;
display: flex;
align-items: center;
}
.arrow-start {
width: 8px;
height: 8px;
background: #0066cc;
border-radius: 50%;
}
.arrow-body {
flex: 1;
height: 3px;
background: #0066cc;
}
.arrow-end {
width: 0;
height: 0;
border-left: 12px solid #0066cc;
border-top: 8px solid transparent;
border-bottom: 8px solid transparent;
}
.flow-label {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
background: #ecf5ff;
color: #0066cc;
padding: 8px 16px;
border-radius: 20px;
font-size: 14px;
font-weight: 500;
display: flex;
align-items: center;
gap: 6px;
border: 1px solid #d9ecff;
}
/* 子卷列表 */
.split-list {
max-height: 500px;
overflow-y: auto;
margin-bottom: 20px;
padding-right: 10px;
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-thumb {
background: #dcdfe6;
border-radius: 3px;
}
}
.sub-coil-card {
background: #fff;
border: 1px solid #e4e7ed;
border-radius: 8px;
margin-bottom: 16px;
transition: all 0.3s;
&:hover {
border-color: #0066cc;
box-shadow: 0 2px 8px rgba(0, 102, 204, 0.15);
}
}
.sub-coil-header {
background: #f5f7fa;
padding: 12px 16px;
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #e4e7ed;
}
.sub-coil-number {
font-size: 16px;
font-weight: 600;
color: #0066cc;
width: 32px;
height: 32px;
border-radius: 50%;
background: #ecf5ff;
display: flex;
align-items: center;
justify-content: center;
}
.btn-remove {
color: #f56c6c;
padding: 0;
&:hover {
color: #f56c6c;
}
}
.sub-coil-body {
padding: 16px;
}
/* 汇总卡片 */
.summary-card {
background: #ecf5ff;
border: 1px solid #d9ecff;
border-radius: 8px;
padding: 16px 20px;
display: flex;
justify-content: space-around;
}
.summary-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
}
.summary-label {
font-size: 13px;
color: #606266;
}
.summary-value {
font-size: 20px;
font-weight: 600;
color: #0066cc;
&.error {
color: #f56c6c;
}
}
</style>