Compare commits

..

2 Commits

Author SHA1 Message Date
砂糖
3b26b060db Merge branch '0.8.X' of http://49.232.154.205:10100/DeXun/klp-oa into 0.8.X 2026-03-16 13:15:57 +08:00
砂糖
b27f246fa0 feat(钢卷): 重构标签打印逻辑并添加合卷操作功能
重构钢卷标签打印逻辑,提取公共方法到coilPrint.js
添加合卷操作区功能,支持200-299操作类型
为合卷表单添加验证规则
2026-03-16 13:15:54 +08:00
7 changed files with 152 additions and 77 deletions

View File

@@ -157,6 +157,22 @@
</div>
</div>
<!-- 合卷操作区 -->
<div class="card-section" v-if="mergeTypes.length > 0">
<div class="section-title">合卷操作</div>
<div class="action-cards-row">
<div v-for="item in mergeTypes" :key="item.value" class="action-card"
:class="{ 'active': form.actionType == item.value }" @click="form.actionType = parseInt(item.value)">
<div class="card-icon">
<i :class="getActionIcon(item.value)"></i>
</div>
<div class="card-content">
<div class="card-title">{{ item.label }}</div>
<div class="card-desc">{{ item.remark || '钢卷操作' }}</div>
</div>
</div>
</div>
</div>
<!-- 其他操作区 -->
<div class="card-section" v-if="otherTypes.length > 0">
<div class="section-title">其他操作</div>
@@ -270,12 +286,20 @@ export default {
return value >= 100 && value <= 199;
});
},
// 合卷操作列表200-299
mergeTypes() {
if (!this.dict.type.action_type) return [];
return this.dict.type.action_type.filter(item => {
const value = parseInt(item.value);
return value >= 200 && value <= 299;
});
},
// 其他操作列表200-299等
otherTypes() {
if (!this.dict.type.action_type) return [];
return this.dict.type.action_type.filter(item => {
const value = parseInt(item.value);
return value < 100 || value > 199;
return value < 100 || value > 299;
});
}
},

View File

@@ -415,6 +415,7 @@ import ActualWarehouseSelect from "@/components/KLPService/ActualWarehouseSelect
import ProductSelect from "@/components/KLPService/ProductSelect";
import RawMaterialSelect from "@/components/KLPService/RawMaterialSelect";
import CoilTraceResult from "../panels/CoilTraceResult.vue";
import { getCoilTagPrintType } from '@/views/wms/coil/js/coilPrint'
export default {
name: 'DoPage',
@@ -753,10 +754,8 @@ export default {
/** 预览标签 */
handlePreviewLabel(row) {
this.labelRender.visible = true;
const item = row.itemType === 'product' ? row.product : row.rawMaterial;
const itemName = row.itemType === 'product' ? item?.productName || '' : item?.rawMaterialName || '';
this.labelRender.type = row.itemType === 'product' ? '3' : '2'
const type = getCoilTagPrintType(row);
this.labelRender.type = type;
this.labelRender.data = {
...row,
itemName: itemName,

View File

@@ -107,7 +107,8 @@
<el-table-column label="完成时间" align="center" prop="completeTime" width="220" :show-overflow-tooltip="true">
<template slot-scope="scope">
<el-date-picker @change="handleProcessTimeChange(scope.row)" value-format="yyyy-MM-dd HH:mm:ss" style="width: 200px" v-model="scope.row.completeTime" type="datetime" placeholder="选择完成时间" />
<el-date-picker @change="handleProcessTimeChange(scope.row)" value-format="yyyy-MM-dd HH:mm:ss"
style="width: 200px" v-model="scope.row.completeTime" type="datetime" placeholder="选择完成时间" />
</template>
</el-table-column>
@@ -129,8 +130,10 @@
</template> -->
<!-- 已完成或已取消状态显示删除按钮 -->
<template v-if="scope.row.actionStatus === 2 || scope.row.actionStatus === 3">
<el-button v-if="scope.row.delFlag == 0" size="mini" type="danger" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button>
<el-button v-if="scope.row.delFlag == 2" size="mini" type="success" icon="el-icon-refresh" @click="handleRestore(scope.row)">还原</el-button>
<el-button v-if="scope.row.delFlag == 0" size="mini" type="danger" icon="el-icon-delete"
@click="handleDelete(scope.row)">删除</el-button>
<el-button v-if="scope.row.delFlag == 2" size="mini" type="success" icon="el-icon-refresh"
@click="handleRestore(scope.row)">还原</el-button>
</template>
</template>
</el-table-column>
@@ -165,6 +168,23 @@
</div>
</div>
<!-- 合卷操作区 -->
<div class="card-section" v-if="mergeTypes.length > 0">
<div class="section-title">合卷操作</div>
<div class="action-cards-row">
<div v-for="item in mergeTypes" :key="item.value" class="action-card"
:class="{ 'active': form.actionType == item.value }" @click="form.actionType = parseInt(item.value)">
<div class="card-icon">
<i :class="getActionIcon(item.value)"></i>
</div>
<div class="card-content">
<div class="card-title">{{ item.label }}</div>
<div class="card-desc">{{ item.remark || '钢卷操作' }}</div>
</div>
</div>
</div>
</div>
<!-- 其他操作区 -->
<div class="card-section" v-if="otherTypes.length > 0">
<div class="section-title">其他操作</div>
@@ -195,7 +215,8 @@
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm" :disabled="buttonLoading" v-loading="buttonLoading"> </el-button>
<el-button type="primary" @click="submitForm" :disabled="buttonLoading" v-loading="buttonLoading">
</el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
@@ -279,12 +300,20 @@ export default {
return value >= 100 && value <= 199;
});
},
// 合卷操作列表200-299
mergeTypes() {
if (!this.dict.type.action_type) return [];
return this.dict.type.action_type.filter(item => {
const value = parseInt(item.value);
return value >= 200 && value <= 299;
});
},
// 其他操作列表200-299等
otherTypes() {
if (!this.dict.type.action_type) return [];
return this.dict.type.action_type.filter(item => {
const value = parseInt(item.value);
return value < 100 || value > 199;
return value < 100 || value > 299;
});
}
},
@@ -472,7 +501,7 @@ export default {
}
else if (actionType < 100) {
path = '/wms/typing';
}
}
// 其他操作类型
else {
this.$message.error('特殊操作请到专门的页面进行处理');
@@ -754,6 +783,3 @@ export default {
}
}
</style>

View File

@@ -0,0 +1,46 @@
const ECoilPrintType = {
'原料标签': '2',
'成品标签': '3',
'镀锌成品': '4',
'镀铬成品': 'ge',
'镀锌原料': '5',
'脱脂原料': '6'
}
/**
* 根据钢卷信息获取打印的标签类型
* @param {*} coil 钢卷信息
* @returns 打印的标签类型
*/
export const getCoilTagPrintType = (coil) => {
const item = coil.itemType === 'product' ? coil.product : coil.rawMaterial;
const itemName = coil.itemType === 'product' ? item?.productName || '' : item?.rawMaterialName || '';
const itemType = coil.itemType || '';
const warehouseId = coil.warehouseId || '';
let type = '2'
// 在镀锌颜料库的卷使用镀锌原料标签
if (itemType == 'raw_material' && (warehouseId == '1988150263284953089' || warehouseId == '1988150487185289217')) {
type = ECoilPrintType['镀锌原料'];
}
// 脱脂原料库
else if (itemType == 'raw_material' && (warehouseId == '1988150545175736322')) {
type = ECoilPrintType['脱脂原料'];
}
else if (itemType == 'raw_material') {
type = ECoilPrintType['原料标签'];
} else if (itemType == 'product' && itemName == '冷硬卷') {
type = ECoilPrintType['成品标签'];
} else if (itemType == 'product' && itemName == '热轧卷板') {
type = ECoilPrintType['成品标签'];
} else if (itemType == 'product' && itemName == '镀锌卷') {
type = ECoilPrintType['镀锌成品'];
} else if (itemType == 'product' && itemName == '冷轧卷') {
type = ECoilPrintType['成品标签'];
} else if (itemType == 'product' && itemName == '镀铬卷') {
type = ECoilPrintType['镀铬成品'];
} else {
type = ECoilPrintType['成品标签'];
}
return type
}

View File

@@ -102,11 +102,11 @@
<div class="target-coil-body">
<el-form size="small" label-width="80px" :model="targetCoil" :rules="rules">
<div class="form-row">
<el-form-item label="卷号" class="form-item-half">
<el-form-item label="卷号" class="form-item-half" prop="currentCoilNo">
<el-input v-model="targetCoil.currentCoilNo" placeholder="输入目标卷号" :disabled="readonly"></el-input>
<current-coil-no :current-coil-no="targetCoil.currentCoilNo" />
</el-form-item>
<el-form-item label="班组" class="form-item-half">
<el-form-item label="班组" class="form-item-half" prop="team">
<el-select v-model="targetCoil.team" placeholder="请选择班组" style="width: 100%" :disabled="readonly">
<el-option key="甲" label="甲" value="甲" />
<el-option key="乙" label="乙" value="乙" />
@@ -115,14 +115,14 @@
</div>
<div class="form-row">
<el-form-item label="材料类型" class="form-item-half">
<el-form-item label="材料类型" class="form-item-half" prop="materialType">
<el-select v-model="targetCoil.materialType" placeholder="请选择材料类型" style="width: 100%"
:disabled="readonly" @change="handleMaterialTypeChange">
<el-option label="原料" value="原料" />
<el-option label="成品" value="成品" />
</el-select>
</el-form-item>
<el-form-item :label="getItemLabel" class="form-item-half">
<el-form-item :label="getItemLabel" class="form-item-half" prop="itemId">
<raw-material-selector v-if="targetCoil.materialType === '原料'" v-model="targetCoil.itemId"
placeholder="请选择原料" style="width: 100%" clearable
:disabled="readonly || !targetCoil.materialType" />
@@ -166,13 +166,13 @@
</div>
<div class="form-row">
<el-form-item label="毛重(t)" class="form-item-half">
<el-form-item label="毛重(t)" prop="grossWeight" class="form-item-half">
<el-input-number precision="3" :controls="false" v-model="targetCoil.grossWeight" placeholder="请输入毛重"
type="number" :step="0.01" :disabled="readonly">
<template slot="append"></template>
</el-input-number>
</el-form-item>
<el-form-item label="净重(t)" class="form-item-half">
<el-form-item label="净重(t)" prop="netWeight" class="form-item-half">
<el-input-number precision="3" :controls="false" v-model="targetCoil.netWeight" placeholder="请输入净重"
type="number" :step="0.01" :disabled="readonly">
<template slot="append"></template>
@@ -181,7 +181,7 @@
</div>
<div class="form-row">
<el-form-item label="长度(m)" class="form-item-half">
<el-form-item label="长度(m)" prop="length" class="form-item-half">
<el-input-number :controls="false" v-model="targetCoil.length" placeholder="请输入长度" type="number"
:step="0.01" :disabled="readonly">
<template slot="append"></template>
@@ -211,7 +211,7 @@
<el-form-item label="镀层种类" prop="coatingType" class="form-item-half">
<MemoInput storageKey="coatingType" v-model="targetCoil.coatingType" placeholder="请输入镀层种类" />
</el-form-item>
<el-form-item label="逻辑库区" class="form-item-half">
<el-form-item label="逻辑库区" prop="warehouseId" class="form-item-half">
<WarehouseSelect v-model="targetCoil.warehouseId" placeholder="请选择逻辑库区" :disabled="readonly" />
</el-form-item>
</div>
@@ -272,7 +272,35 @@ export default {
actualWidth: undefined,
},
rules: {
currentCoilNo: [
{ required: true, message: "当前钢卷号不能为空", trigger: "blur" },
{
// 当前钢卷号必须大于等于10位
validator: (rule, value, callback) => {
if (value.length < 10) {
callback(new Error('当前钢卷号必须大于等于10位'));
} else {
callback();
}
}, trigger: 'blur'
},
],
team: [
{ required: true, message: "班组不能为空", trigger: "change" }
],
materialType: [
{ required: true, message: "材料类型不能为空", trigger: "change" }
],
itemId: [
{ required: true, message: "物品ID不能为空", trigger: "blur" }
],
itemType: [
{ required: true, message: "物品类型不能为空", trigger: "change" }
],
// 净重和毛重
netWeight: [
{ required: true, message: "净重不能为空", trigger: "blur" }
],
},
buttonLoading: false,
loading: false,

View File

@@ -446,6 +446,7 @@ import { PDFDocument } from 'pdf-lib';
import { listUser } from "@/api/system/user";
import AbnormalList from "./abnormal.vue";
import LogTable from "@/views/wms/warehouse/components/LogTable.vue";
import { getCoilTagPrintType } from '@/views/wms/coil/js/coilPrint'
export default {
name: "MaterialCoil",
@@ -811,33 +812,8 @@ export default {
},
// 打印标签
handlePrintLabel(row) {
const item = row.itemType === 'product' ? row.product : row.rawMaterial;
const itemName = row.itemType === 'product' ? item?.productName || '' : item?.rawMaterialName || '';
const itemType = row.itemType || '';
const warehouseId = row.warehouseId || '';
// 在镀锌颜料库的卷使用镀锌原料标签
if (itemType == 'raw_material' && (warehouseId == '1988150263284953089' || warehouseId == '1988150487185289217')) {
this.labelRender.type = '5';
}
// 脱脂原料库
else if (itemType == 'raw_material' && (warehouseId == '1988150545175736322')) {
this.labelRender.type = '6';
}
else if (itemType == 'raw_material') {
this.labelRender.type = '2';
} else if (itemType == 'product' && itemName == '冷硬卷') {
this.labelRender.type = '3';
} else if (itemType == 'product' && itemName == '热轧卷板') {
this.labelRender.type = '3';
} else if (itemType == 'product' && itemName == '镀锌卷') {
this.labelRender.type = '4';
} else if (itemType == 'product' && itemName == '冷轧卷') {
this.labelRender.type = '3';
} else if (itemType == 'product' && itemName == '镀铬卷') {
this.labelRender.type = 'ge';
} else {
this.labelRender.type = '3';
}
const type = getCoilTagPrintType(row);
this.labelRender.type = type;
this.labelRender.data = {
...row,
itemName: itemName,

View File

@@ -494,6 +494,7 @@ import RawMaterialInfo from '@/components/KLPService/Renderer/RawMaterialInfo'
import { addCoilAbnormal } from '@/api/wms/coilAbnormal'
import LabelRender from './LabelRender/index.vue'
import StepSplit from './stepSplit.vue'
import { getCoilTagPrintType } from '@/views/wms/coil/js/coilPrint'
export default {
name: 'DoPage',
@@ -715,33 +716,8 @@ export default {
parseTime,
// 打印标签
handlePrintLabel(row) {
const item = row.itemType === 'product' ? row.product : row.rawMaterial;
const itemName = row.itemType === 'product' ? item?.productName || '' : item?.rawMaterialName || '';
const itemType = row.itemType || '';
const warehouseId = row.warehouseId || '';
// 在镀锌颜料库的卷使用镀锌原料标签
if (itemType == 'raw_material' && (warehouseId == '1988150263284953089' || warehouseId == '1988150487185289217')) {
this.labelRender.type = '5';
}
// 脱脂原料库
else if (itemType == 'raw_material' && (warehouseId == '1988150545175736322')) {
this.labelRender.type = '6';
}
else if (itemType == 'raw_material') {
this.labelRender.type = '2';
} else if (itemType == 'product' && itemName == '冷硬卷') {
this.labelRender.type = '3';
} else if (itemType == 'product' && itemName == '热轧卷板') {
this.labelRender.type = '3';
} else if (itemType == 'product' && itemName == '镀锌卷') {
this.labelRender.type = '4';
} else if (itemType == 'product' && itemName == '冷轧卷') {
this.labelRender.type = '3';
} else if (itemType == 'product' && itemName == '镀铬卷') {
this.labelRender.type = 'ge';
} else {
this.labelRender.type = '3';
}
const type = getCoilTagPrintType(row);
this.labelRender.type = type;
this.labelRender.data = {
...row,
itemName: itemName,