Browse Source

2025-12-11

过站采集-》车间工作平台->材料清单新增【材料暂存】【材料拼卷】操作
master
fengyuan_yang 1 month ago
parent
commit
53fe484c55
  1. 7
      src/api/yieldReport/com_material_loss.js
  2. 7
      src/api/yieldReport/com_material_roll_up.js
  3. 4
      src/views/modules/qc/OQCResultEntry.vue
  4. 616
      src/views/modules/yieldReport/com_material_loss.vue
  5. 616
      src/views/modules/yieldReport/com_material_roll_up.vue
  6. 49
      src/views/modules/yieldReport/com_produce_report_normal.vue

7
src/api/yieldReport/com_material_loss.js

@ -0,0 +1,7 @@
import { createAPI } from '@/utils/httpRequest.js'
/**
* 材料损耗调用 MaterialProcessLoss 存储过程
*/
export const materialProcessLoss = data => createAPI(`/pms/yieldReportCommons/materialProcessLoss`, 'post', data)

7
src/api/yieldReport/com_material_roll_up.js

@ -0,0 +1,7 @@
import { createAPI } from '@/utils/httpRequest.js'
/**
* 材料接卷调用 MaterialProcessRollUp 存储过程
*/
export const materialProcessRollUp = data => createAPI(`/pms/yieldReportCommons/materialProcessRollUp`, 'post', data)

4
src/views/modules/qc/OQCResultEntry.vue

@ -1872,7 +1872,8 @@
responsiblePersonName: '', responsiblePersonName: '',
passQty: '', passQty: '',
notPassQty: '', notPassQty: '',
spec: ''
spec: '',
state: ''
}, },
detailInformationFlag: false, detailInformationFlag: false,
detailList: [], detailList: [],
@ -2815,6 +2816,7 @@
this.detailData.operatorName = row.operatorName this.detailData.operatorName = row.operatorName
this.detailData.responsiblePerson = row.responsiblePerson this.detailData.responsiblePerson = row.responsiblePerson
this.detailData.responsiblePersonName = row.responsiblePersonName this.detailData.responsiblePersonName = row.responsiblePersonName
this.detailData.state = row.state
this.detailData.spec = row.spec this.detailData.spec = row.spec
if (row.state === '待检验') { if (row.state === '待检验') {
this.detailData.passQty = row.samplingQty this.detailData.passQty = row.samplingQty

616
src/views/modules/yieldReport/com_material_loss.vue

@ -0,0 +1,616 @@
<template>
<div class="customer-css">
<el-dialog :title="titleCon" v-drag v-bind="$attrs" v-on="$listeners"
width="600px" class="material-dialog">
<div class="material-content">
<el-form :model="pageData" label-position="top" label-width="100px">
<!-- 材料信息卡片 -->
<div class="material-info-card">
<div class="info-header">
<i class="el-icon-document"></i>
<span>材料信息</span>
</div>
<div class="info-content">
<el-row :gutter="15">
<el-col :span="12">
<div class="info-row">
<label class="info-label">材料卷号</label>
<span class="info-value">{{ pageData.rmRollNo || '-' }}</span>
</div>
</el-col>
<el-col :span="12">
<div class="info-row">
<label class="info-label">零部件编码</label>
<span class="info-value">{{ pageData.partNo || '-' }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="24">
<div class="info-row">
<label class="info-label">零部件名称</label>
<span class="info-value">{{ pageData.partDesc || '-' }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="12">
<div class="info-row">
<label class="info-label">规格型号</label>
<span class="info-value">{{ pageData.spec || '-' }}</span>
</div>
</el-col>
</el-row>
</div>
</div>
<!-- 损耗设置区域 -->
<div class="return-settings">
<el-row :gutter="15">
<el-col :span="8">
<el-form-item label="上机数量" class="form-item-enhanced">
<el-input
v-model="displayOnMachineQty"
disabled
size="large"
style="width: 100%">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="暂存数量" class="form-item-enhanced">
<el-input class="inlineNumber numInput"
v-model="pageData.returnQty"
type="number"
placeholder="请输入暂存数量"
size="large"
@input="calculateRemainQty"
style="width: 100%">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="剩余数量" class="form-item-enhanced">
<el-input
v-model="displayRemainQty"
disabled
size="large"
:class="{'remain-negative': pageData.remainQty < 0}"
style="width: 100%">
</el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 备注 -->
<el-row style="margin-bottom: 30px">
<el-col :span="24">
<el-form-item label="备注" >
<el-input
v-model="pageData.remark"
type="textarea"
:rows="3"
placeholder="请输入备注"
show-word-limit>
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<button class="action-btn secondary" @click="submitMaterialLoss">
{{ buttons.confirmButton }}
</button>
<button class="action-btn secondary" @click="closeDialog">
{{ buttons.closeButton }}
</button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
materialProcessLoss
} from '@/api/yieldReport/com_material_loss.js';
import getLodop from '@/utils/LodopFuncs.js'; //
import labelPrintTemplates from '@/mixins/labelPrintTemplates.js'; // mixin
var functionId = 'C10000019';
export default {
mixins: [labelPrintTemplates], // mixin
data() {
return {
titleCon: '材料暂存',
scheduleData: {
site: this.$store.state.user.site,
username: this.$store.state.user.name,
seqNo: '',
orderNo: '',
itemNo: 0,
},
pageData: {
site: this.$store.state.user.site,
orderNo: '',
itemNo: '',
seqNo: '',
rollNo: '',
rmRollNo: '',
partNo: '',
partDesc: '',
spec: '',
onMachineQty: 0, //
returnQty: 0, //
remainQty: 0, //
remark: '', //
histSeqNo: '',
operatorId: '',
},
operatorData: {
site: this.$store.state.user.site,
username: this.$store.state.user.name,
operatorId: '',
operatorName: '',
},
buttons: {
confirmButton: '确定',
closeButton: '关闭',
},
}
},
computed: {
// 0
displayOnMachineQty() {
return this.pageData.onMachineQty || this.pageData.onMachineQty === 0 ? String(this.pageData.onMachineQty) : '';
},
// 0
displayRemainQty() {
return this.pageData.remainQty || this.pageData.remainQty === 0 ? String(this.pageData.remainQty) : '';
}
},
methods: {
//
init(scheduleData, operatorData, materialRow) {
//
this.scheduleData = scheduleData;
this.operatorData = JSON.parse(JSON.stringify(operatorData));
//
this.pageData.orderNo = scheduleData.orderNo;
this.pageData.itemNo = scheduleData.itemNo;
this.pageData.seqNo = scheduleData.seqNo;
this.pageData.rollNo = scheduleData.rollNo;
this.pageData.operatorId = operatorData.operatorId;
//
this.pageData.rmRollNo = materialRow.rmRollNo || '';
this.pageData.partNo = materialRow.partNo || '';
this.pageData.partDesc = materialRow.partDesc || '';
this.pageData.spec = materialRow.spec || '';
this.pageData.histSeqNo = materialRow.histSeqNo || '';
// transQty
const transQty = parseFloat(materialRow.transQty);
this.pageData.onMachineQty = isNaN(transQty) ? 0 : transQty;
//
this.pageData.returnQty = 0;
this.pageData.remainQty = this.pageData.onMachineQty;
this.pageData.remark = '';
this.titleCon = '材料暂存';
},
/*关闭modal*/
closeDialog(){
//
this.$emit('refreshPageData');
//
this.$emit('update:visible', false);
},
/*计算剩余数量*/
calculateRemainQty() {
const onMachineQty = parseFloat(this.pageData.onMachineQty) || 0;
const returnQty = parseFloat(this.pageData.returnQty) || 0;
this.pageData.remainQty = onMachineQty - returnQty;
},
/*提交损耗*/
submitMaterialLoss() {
// 0
if (!this.pageData.returnQty || this.pageData.returnQty === '' || this.pageData.returnQty < 0) {
this.pageData.returnQty = 0;
}
//
this.calculateRemainQty();
// 0
if (this.pageData.remainQty < 0) {
this.$message.warning('暂存数量不能大于上机数量!');
return false;
}
//
const submitData = {
site: this.pageData.site,
orderNo: this.pageData.orderNo,
itemNo: this.pageData.itemNo,
seqNo: this.pageData.seqNo,
rollNo: this.pageData.rmRollNo,
returnQty: this.pageData.returnQty,
histSeqNo: this.pageData.histSeqNo,
operatorId: this.pageData.operatorId,
remark: this.pageData.remark || '' //
};
// API MaterialProcessLoss
materialProcessLoss(submitData).then(({data}) => {
//
if(data.code == 500 || data.code == 400){
this.$message.error(data.msg || data.message);
} else if (data.code == 201) {
// code=201
this.$message.success(data.msg || '操作成功');
// printData
if (data.printData) {
//
const printDataList = [data.printData];
this.executePrint(printDataList);
} else {
console.warn('未获取到打印参数');
}
//
this.closeDialog();
} else {
//
this.$message.success(data.msg || data.message || '操作成功');
//
this.closeDialog();
}
}).catch((error) => {
this.$message.error('操作失败:' + (error.message || '未知错误'));
});
},
/**
* 执行打印直接使用存储过程返回的打印参数
* @param {Array} printDataList - 存储过程返回的打印数据列表
*/
executePrint(printDataList) {
try {
// 1. LODOP
const LODOP = getLodop();
if (!LODOP) {
this.$message.warning('无法连接到打印控件,跳过打印');
return;
}
// 2.
const printerCount = LODOP.GET_PRINTER_COUNT();
if (printerCount === 0) {
this.$message.warning('未检测到打印机,跳过打印');
return;
}
const defaultPrinterName = LODOP.GET_PRINTER_NAME(0);
// 3. labelNo
if (!printDataList || printDataList.length === 0) {
console.warn('打印数据为空');
return;
}
// labelNo
const labelNo = printDataList[0].labelNo;
if (!labelNo) {
console.warn('未找到标签模板编号');
return;
}
// 4.
this.executePrintWithTemplate(LODOP, printDataList, labelNo, defaultPrinterName);
this.$message.success('标签打印任务已发送!');
} catch (error) {
console.error('打印失败:', error);
this.$message.warning('打印失败: ' + error.message);
}
},
/**
* 执行模板打印
* @param {Object} LODOP - 打印控件对象
* @param {Array} printDataList - 打印数据列表
* @param {String} labelNo - 标签模板编号 (A001/A002/A003)
* @param {String} printerName - 打印机名称
*/
executePrintWithTemplate(LODOP, printDataList, labelNo, printerName) {
LODOP.PRINT_INIT('材料暂存标签打印');
//
LODOP.SET_PRINT_MODE("PRINT_NOCOLLATE", true);
//
LODOP.SET_PRINTER_INDEX(printerName);
//
for (let i = 0; i < printDataList.length; i++) {
const printData = printDataList[i];
const isNewPage = i > 0;
// labelNo labelPrintTemplates mixin
if (labelNo === 'A001') {
this.printLabelA001(LODOP, printData, isNewPage);
} else if (labelNo === 'A002') {
this.printLabelA002(LODOP, printData, isNewPage);
} else if (labelNo === 'A003') {
this.printLabelA003(LODOP, printData, isNewPage);
} else {
console.warn(`未知的标签模板:${labelNo}`);
}
}
//
LODOP.PREVIEW();
},
},
}
</script>
<style scoped lang="scss">
.numInput /deep/ .el-input__inner{
text-align: right;
}
/deep/ .inlineNumber input::-webkit-outer-spin-button,
/deep/ .inlineNumber input::-webkit-inner-spin-button {
-webkit-appearance: none;
}
/deep/ .inlineNumber input[type="number"]{
-moz-appearance: textfield;
padding-right: 5px !important;
}
//
.material-dialog {
::v-deep .el-dialog {
border-radius: 8px;
overflow: hidden;
.el-dialog__header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
padding: 18px 20px;
.el-dialog__title {
color: #fff;
font-size: 16px;
font-weight: 600;
}
.el-dialog__headerbtn {
.el-dialog__close {
color: #fff;
font-size: 18px;
&:hover {
color: #f0f0f0;
}
}
}
}
.el-dialog__body {
padding: 25px;
background-color: #f8f9fa;
}
.el-dialog__footer {
padding: 15px 20px;
background-color: #fff;
border-top: 1px solid #e9ecef;
}
}
}
.material-content {
.form-item-enhanced {
margin-bottom: 10px;
::v-deep .el-form-item__label {
color: #495057;
font-weight: 500;
font-size: 14px;
margin-bottom: 8px;
}
::v-deep .el-input {
.el-input__inner {
border-radius: 6px;
border: 1px solid #dee2e6;
transition: all 0.3s;
height: 42px;
line-height: 42px;
font-size: 15px;
&:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}
}
}
//
::v-deep .el-textarea {
.el-textarea__inner {
border-radius: 6px;
border: 1px solid #dee2e6;
transition: all 0.3s;
font-size: 14px;
padding: 8px 12px;
line-height: 1.5;
&:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}
}
}
//
::v-deep .remain-negative {
.el-input__inner {
color: #f56c6c;
font-weight: 600;
border-color: #f56c6c;
background-color: #fef0f0;
}
}
}
}
// -
.material-info-card {
background: linear-gradient(135deg, #667eea15 0%, #764ba215 100%);
border-radius: 8px;
padding: 16px;
margin-bottom: 20px;
border: 1px solid #e3e8f0;
box-shadow: 0 2px 8px rgba(102, 126, 234, 0.08);
animation: fadeInDown 0.5s ease-out;
.info-header {
display: flex;
align-items: center;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid #dee2e6;
i {
font-size: 18px;
color: #667eea;
margin-right: 8px;
}
span {
font-size: 14px;
font-weight: 600;
color: #495057;
}
}
.info-content {
background-color: rgba(255, 255, 255, 0.8);
border-radius: 4px;
padding: 12px;
.info-row {
display: flex;
align-items: center;
padding: 4px 0;
&:not(:last-child) {
border-bottom: 1px dashed #e9ecef;
}
.info-label {
font-size: 13px;
color: #6c757d;
min-width: 90px;
font-weight: 500;
}
.info-value {
font-size: 13px;
color: #212529;
font-weight: 600;
flex: 1;
}
}
}
}
//
.return-settings {
background: #fff;
border-radius: 8px;
padding: 16px;
border: 1px solid #e3e8f0;
box-shadow: 0 2px 8px rgba(102, 126, 234, 0.05);
}
//
.dialog-footer {
display: flex;
justify-content: center;
gap: 12px;
padding: 0;
.action-btn {
min-width: 80px;
padding: 6px 16px;
border-radius: 16px;
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 4px;
i {
font-size: 13px;
}
&.primary {
background: #17B3A3;
border: none;
color: white;
&:hover {
background: #13998b;
box-shadow: 0 4px 12px rgba(23, 179, 163, 0.4);
transform: translateY(-1px);
}
&:active {
transform: translateY(0);
}
}
&.secondary {
background: white;
border: 1px solid #17B3A3;
color: #17B3A3;
&:hover {
background: #17B3A3;
color: white;
}
&:active {
transform: scale(0.98);
}
}
}
}
//
@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
</style>

616
src/views/modules/yieldReport/com_material_roll_up.vue

@ -0,0 +1,616 @@
<template>
<div class="customer-css">
<el-dialog :title="titleCon" v-drag v-bind="$attrs" v-on="$listeners"
width="600px" class="material-dialog">
<div class="material-content">
<el-form :model="pageData" label-position="top" label-width="100px">
<!-- 材料信息卡片 -->
<div class="material-info-card">
<div class="info-header">
<i class="el-icon-document"></i>
<span>材料信息</span>
</div>
<div class="info-content">
<el-row :gutter="15">
<el-col :span="12">
<div class="info-row">
<label class="info-label">材料卷号</label>
<span class="info-value">{{ pageData.rmRollNo || '-' }}</span>
</div>
</el-col>
<el-col :span="12">
<div class="info-row">
<label class="info-label">零部件编码</label>
<span class="info-value">{{ pageData.partNo || '-' }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="24">
<div class="info-row">
<label class="info-label">零部件名称</label>
<span class="info-value">{{ pageData.partDesc || '-' }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="15">
<el-col :span="12">
<div class="info-row">
<label class="info-label">规格型号</label>
<span class="info-value">{{ pageData.spec || '-' }}</span>
</div>
</el-col>
</el-row>
</div>
</div>
<!-- 接卷设置区域 -->
<div class="return-settings">
<el-row :gutter="15">
<el-col :span="8">
<el-form-item label="上机数量" class="form-item-enhanced">
<el-input
v-model="displayOnMachineQty"
disabled
size="large"
style="width: 100%">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="拼卷数量" class="form-item-enhanced">
<el-input class="inlineNumber numInput"
v-model="pageData.returnQty"
type="number"
placeholder="请输入拼卷数量"
size="large"
@input="calculateRemainQty"
style="width: 100%">
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="剩余数量" class="form-item-enhanced">
<el-input
v-model="displayRemainQty"
disabled
size="large"
:class="{'remain-negative': pageData.remainQty < 0}"
style="width: 100%">
</el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 备注 -->
<el-row style="margin-bottom: 30px">
<el-col :span="24">
<el-form-item label="备注" >
<el-input
v-model="pageData.remark"
type="textarea"
:rows="3"
placeholder="请输入备注"
show-word-limit>
</el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<button class="action-btn secondary" @click="submitMaterialRollUp">
{{ buttons.confirmButton }}
</button>
<button class="action-btn secondary" @click="closeDialog">
{{ buttons.closeButton }}
</button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
materialProcessRollUp
} from '@/api/yieldReport/com_material_roll_up.js';
import getLodop from '@/utils/LodopFuncs.js'; //
import labelPrintTemplates from '@/mixins/labelPrintTemplates.js'; // mixin
var functionId = 'C10000019';
export default {
mixins: [labelPrintTemplates], // mixin
data() {
return {
titleCon: '材料拼卷',
scheduleData: {
site: this.$store.state.user.site,
username: this.$store.state.user.name,
seqNo: '',
orderNo: '',
itemNo: 0,
},
pageData: {
site: this.$store.state.user.site,
orderNo: '',
itemNo: '',
seqNo: '',
rollNo: '',
rmRollNo: '',
partNo: '',
partDesc: '',
spec: '',
onMachineQty: 0, //
returnQty: 0, //
remainQty: 0, //
remark: '', //
histSeqNo: '',
operatorId: '',
},
operatorData: {
site: this.$store.state.user.site,
username: this.$store.state.user.name,
operatorId: '',
operatorName: '',
},
buttons: {
confirmButton: '确定',
closeButton: '关闭',
},
}
},
computed: {
// 0
displayOnMachineQty() {
return this.pageData.onMachineQty || this.pageData.onMachineQty === 0 ? String(this.pageData.onMachineQty) : '';
},
// 0
displayRemainQty() {
return this.pageData.remainQty || this.pageData.remainQty === 0 ? String(this.pageData.remainQty) : '';
}
},
methods: {
//
init(scheduleData, operatorData, materialRow) {
//
this.scheduleData = scheduleData;
this.operatorData = JSON.parse(JSON.stringify(operatorData));
//
this.pageData.orderNo = scheduleData.orderNo;
this.pageData.itemNo = scheduleData.itemNo;
this.pageData.seqNo = scheduleData.seqNo;
this.pageData.rollNo = scheduleData.rollNo;
this.pageData.operatorId = operatorData.operatorId;
//
this.pageData.rmRollNo = materialRow.rmRollNo || '';
this.pageData.partNo = materialRow.partNo || '';
this.pageData.partDesc = materialRow.partDesc || '';
this.pageData.spec = materialRow.spec || '';
this.pageData.histSeqNo = materialRow.histSeqNo || '';
// transQty
const transQty = parseFloat(materialRow.transQty);
this.pageData.onMachineQty = isNaN(transQty) ? 0 : transQty;
//
this.pageData.returnQty = 0;
this.pageData.remainQty = this.pageData.onMachineQty;
this.pageData.remark = '';
this.titleCon = '材料拼卷';
},
/*关闭modal*/
closeDialog(){
//
this.$emit('refreshPageData');
//
this.$emit('update:visible', false);
},
/*计算剩余数量*/
calculateRemainQty() {
const onMachineQty = parseFloat(this.pageData.onMachineQty) || 0;
const returnQty = parseFloat(this.pageData.returnQty) || 0;
this.pageData.remainQty = onMachineQty - returnQty;
},
/*提交接卷*/
submitMaterialRollUp() {
// 0
if (!this.pageData.returnQty || this.pageData.returnQty === '' || this.pageData.returnQty < 0) {
this.pageData.returnQty = 0;
}
//
this.calculateRemainQty();
// 0
if (this.pageData.remainQty < 0) {
this.$message.warning('拼卷数量不能大于上机数量!');
return false;
}
//
const submitData = {
site: this.pageData.site,
orderNo: this.pageData.orderNo,
itemNo: this.pageData.itemNo,
seqNo: this.pageData.seqNo,
rollNo: this.pageData.rmRollNo,
returnQty: this.pageData.returnQty,
histSeqNo: this.pageData.histSeqNo,
operatorId: this.pageData.operatorId,
remark: this.pageData.remark || '' //
};
// API MaterialProcessRollUp
materialProcessRollUp(submitData).then(({data}) => {
//
if(data.code == 500 || data.code == 400){
this.$message.error(data.msg || data.message);
} else if (data.code == 201) {
// code=201
this.$message.success(data.msg || '操作成功');
// printData
if (data.printData) {
//
const printDataList = [data.printData];
this.executePrint(printDataList);
} else {
console.warn('未获取到打印参数');
}
//
this.closeDialog();
} else {
//
this.$message.success(data.msg || data.message || '操作成功');
//
this.closeDialog();
}
}).catch((error) => {
this.$message.error('操作失败:' + (error.message || '未知错误'));
});
},
/**
* 执行打印直接使用存储过程返回的打印参数
* @param {Array} printDataList - 存储过程返回的打印数据列表
*/
executePrint(printDataList) {
try {
// 1. LODOP
const LODOP = getLodop();
if (!LODOP) {
this.$message.warning('无法连接到打印控件,跳过打印');
return;
}
// 2.
const printerCount = LODOP.GET_PRINTER_COUNT();
if (printerCount === 0) {
this.$message.warning('未检测到打印机,跳过打印');
return;
}
const defaultPrinterName = LODOP.GET_PRINTER_NAME(0);
// 3. labelNo
if (!printDataList || printDataList.length === 0) {
console.warn('打印数据为空');
return;
}
// labelNo
const labelNo = printDataList[0].labelNo;
if (!labelNo) {
console.warn('未找到标签模板编号');
return;
}
// 4.
this.executePrintWithTemplate(LODOP, printDataList, labelNo, defaultPrinterName);
this.$message.success('标签打印任务已发送!');
} catch (error) {
console.error('打印失败:', error);
this.$message.warning('打印失败: ' + error.message);
}
},
/**
* 执行模板打印
* @param {Object} LODOP - 打印控件对象
* @param {Array} printDataList - 打印数据列表
* @param {String} labelNo - 标签模板编号 (A001/A002/A003)
* @param {String} printerName - 打印机名称
*/
executePrintWithTemplate(LODOP, printDataList, labelNo, printerName) {
LODOP.PRINT_INIT('材料拼卷标签打印');
//
LODOP.SET_PRINT_MODE("PRINT_NOCOLLATE", true);
//
LODOP.SET_PRINTER_INDEX(printerName);
//
for (let i = 0; i < printDataList.length; i++) {
const printData = printDataList[i];
const isNewPage = i > 0;
// labelNo labelPrintTemplates mixin
if (labelNo === 'A001') {
this.printLabelA001(LODOP, printData, isNewPage);
} else if (labelNo === 'A002') {
this.printLabelA002(LODOP, printData, isNewPage);
} else if (labelNo === 'A003') {
this.printLabelA003(LODOP, printData, isNewPage);
} else {
console.warn(`未知的标签模板:${labelNo}`);
}
}
//
LODOP.PREVIEW();
},
},
}
</script>
<style scoped lang="scss">
.numInput /deep/ .el-input__inner{
text-align: right;
}
/deep/ .inlineNumber input::-webkit-outer-spin-button,
/deep/ .inlineNumber input::-webkit-inner-spin-button {
-webkit-appearance: none;
}
/deep/ .inlineNumber input[type="number"]{
-moz-appearance: textfield;
padding-right: 5px !important;
}
//
.material-dialog {
::v-deep .el-dialog {
border-radius: 8px;
overflow: hidden;
.el-dialog__header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
padding: 18px 20px;
.el-dialog__title {
color: #fff;
font-size: 16px;
font-weight: 600;
}
.el-dialog__headerbtn {
.el-dialog__close {
color: #fff;
font-size: 18px;
&:hover {
color: #f0f0f0;
}
}
}
}
.el-dialog__body {
padding: 25px;
background-color: #f8f9fa;
}
.el-dialog__footer {
padding: 15px 20px;
background-color: #fff;
border-top: 1px solid #e9ecef;
}
}
}
.material-content {
.form-item-enhanced {
margin-bottom: 10px;
::v-deep .el-form-item__label {
color: #495057;
font-weight: 500;
font-size: 14px;
margin-bottom: 8px;
}
::v-deep .el-input {
.el-input__inner {
border-radius: 6px;
border: 1px solid #dee2e6;
transition: all 0.3s;
height: 42px;
line-height: 42px;
font-size: 15px;
&:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}
}
}
//
::v-deep .el-textarea {
.el-textarea__inner {
border-radius: 6px;
border: 1px solid #dee2e6;
transition: all 0.3s;
font-size: 14px;
padding: 8px 12px;
line-height: 1.5;
&:focus {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}
}
}
//
::v-deep .remain-negative {
.el-input__inner {
color: #f56c6c;
font-weight: 600;
border-color: #f56c6c;
background-color: #fef0f0;
}
}
}
}
// -
.material-info-card {
background: linear-gradient(135deg, #667eea15 0%, #764ba215 100%);
border-radius: 8px;
padding: 16px;
margin-bottom: 20px;
border: 1px solid #e3e8f0;
box-shadow: 0 2px 8px rgba(102, 126, 234, 0.08);
animation: fadeInDown 0.5s ease-out;
.info-header {
display: flex;
align-items: center;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid #dee2e6;
i {
font-size: 18px;
color: #667eea;
margin-right: 8px;
}
span {
font-size: 14px;
font-weight: 600;
color: #495057;
}
}
.info-content {
background-color: rgba(255, 255, 255, 0.8);
border-radius: 4px;
padding: 12px;
.info-row {
display: flex;
align-items: center;
padding: 4px 0;
&:not(:last-child) {
border-bottom: 1px dashed #e9ecef;
}
.info-label {
font-size: 13px;
color: #6c757d;
min-width: 90px;
font-weight: 500;
}
.info-value {
font-size: 13px;
color: #212529;
font-weight: 600;
flex: 1;
}
}
}
}
//
.return-settings {
background: #fff;
border-radius: 8px;
padding: 16px;
border: 1px solid #e3e8f0;
box-shadow: 0 2px 8px rgba(102, 126, 234, 0.05);
}
//
.dialog-footer {
display: flex;
justify-content: center;
gap: 12px;
padding: 0;
.action-btn {
min-width: 80px;
padding: 6px 16px;
border-radius: 16px;
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 4px;
i {
font-size: 13px;
}
&.primary {
background: #17B3A3;
border: none;
color: white;
&:hover {
background: #13998b;
box-shadow: 0 4px 12px rgba(23, 179, 163, 0.4);
transform: translateY(-1px);
}
&:active {
transform: translateY(0);
}
}
&.secondary {
background: white;
border: 1px solid #17B3A3;
color: #17B3A3;
&:hover {
background: #17B3A3;
color: white;
}
&:active {
transform: scale(0.98);
}
}
}
}
//
@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
</style>

49
src/views/modules/yieldReport/com_produce_report_normal.vue

@ -435,7 +435,7 @@
fixed="left" fixed="left"
header-align="center" header-align="center"
align="center" align="center"
width="160"
width="150"
label="操作"> label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- <a class="customer-a" @click="deleteSfdcMaterialHist(scope.row)">删除</a>--> <!-- <a class="customer-a" @click="deleteSfdcMaterialHist(scope.row)">删除</a>-->
@ -450,10 +450,15 @@
&& scope.row.histType == '发料' && scope.row.keyRMFlag == 'N'" && scope.row.histType == '发料' && scope.row.keyRMFlag == 'N'"
@click="warnFinishMaterialWithNoRemainderConfirm(scope.row)" @click="warnFinishMaterialWithNoRemainderConfirm(scope.row)"
>结束生产</a> >结束生产</a>
<a class="customer-a" v-if="operatorData.operatorName != '' && scope.row.finishedFlag == 'N' && scope.row.sAPBOMItemNo >= 0
&& scope.row.histType == '发料' && scope.row.keyRMFlag == 'N'"
@click="abnormalMaterialOfflineModal(scope.row)"
>异常下机</a>
<el-dropdown trigger="click" v-if="operatorData.operatorName != '' && scope.row.finishedFlag == 'N' && scope.row.sAPBOMItemNo >= 0
&& scope.row.histType == '发料' && scope.row.keyRMFlag == 'N'">
<a class="customer-a" style="cursor: pointer;">更多</a>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="abnormalMaterialOfflineModal(scope.row)">异常下机</el-dropdown-item>
<el-dropdown-item @click.native="materialLossModal(scope.row)">材料暂存</el-dropdown-item>
<el-dropdown-item @click.native="materialRollUpModal(scope.row)">材料拼卷</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@ -690,6 +695,18 @@
</comAbnormalMaterialOffline> </comAbnormalMaterialOffline>
<!-- 材料损耗组件 -->
<comMaterialLoss ref="comMaterialLoss" :close-on-click-modal="false"
:visible.sync="showMaterialLossFlag" @refreshPageData="refreshPageData">
</comMaterialLoss>
<!-- 材料接卷组件 -->
<comMaterialRollUp ref="comMaterialRollUp" :close-on-click-modal="false"
:visible.sync="showMaterialRollUpFlag" @refreshPageData="refreshPageData">
</comMaterialRollUp>
<!-- 生产过程的停机组件 --> <!-- 生产过程的停机组件 -->
<comProduceDown ref="comProduceDown" :close-on-click-modal="false" <comProduceDown ref="comProduceDown" :close-on-click-modal="false"
:visible.sync="showDownFlag" @refreshPageData="refreshPageData"> :visible.sync="showDownFlag" @refreshPageData="refreshPageData">
@ -875,6 +892,8 @@ import comProduceKeyMaterial from "./com_produce_key_material";/*生产过程的
import comReplaceMaterial from "./com_replace_material"/*换料组件*/ import comReplaceMaterial from "./com_replace_material"/*换料组件*/
import comCuttingMaterial from "./com_cutting_material"/*材料下料*/ import comCuttingMaterial from "./com_cutting_material"/*材料下料*/
import comAbnormalMaterialOffline from "./com_abnormal_material_offline"/*材料异常下机*/ import comAbnormalMaterialOffline from "./com_abnormal_material_offline"/*材料异常下机*/
import comMaterialLoss from "./com_material_loss"/*材料损耗*/
import comMaterialRollUp from "./com_material_roll_up"/*材料接卷*/
import comProduceDown from "./com_produce_down";/*停机组件*/ import comProduceDown from "./com_produce_down";/*停机组件*/
import comFinishSchedule from "./com_finish_schedule";/*结束派工单组件*/ import comFinishSchedule from "./com_finish_schedule";/*结束派工单组件*/
import notOverFinishRoll from "./not_over_finish_roll";/*生产过程的停机组件*/ import notOverFinishRoll from "./not_over_finish_roll";/*生产过程的停机组件*/
@ -914,6 +933,8 @@ export default {
showReplaceMaterialFlag: false, showReplaceMaterialFlag: false,
showCuttingMaterialFlag: false, showCuttingMaterialFlag: false,
showAbnormalMaterialOfflineFlag: false, showAbnormalMaterialOfflineFlag: false,
showMaterialLossFlag: false,
showMaterialRollUpFlag: false,
showDownFlag: false, showDownFlag: false,
showFinishScheduleFlag: false, showFinishScheduleFlag: false,
showSopPreviewFlag: false, // SOP showSopPreviewFlag: false, // SOP
@ -3789,6 +3810,8 @@ export default {
comReplaceMaterial,/*换料的组件*/ comReplaceMaterial,/*换料的组件*/
comCuttingMaterial,/*材料下料的功能*/ comCuttingMaterial,/*材料下料的功能*/
comAbnormalMaterialOffline,/*材料异常下机*/ comAbnormalMaterialOffline,/*材料异常下机*/
comMaterialLoss,/*材料损耗*/
comMaterialRollUp,/*材料接卷*/
comProduceDown,/*生产过程的停机组件*/ comProduceDown,/*生产过程的停机组件*/
comFinishSchedule,/*结束派工单的组件*/ comFinishSchedule,/*结束派工单的组件*/
notOverFinishRoll,/*异常下级报工*/ notOverFinishRoll,/*异常下级报工*/
@ -4587,6 +4610,22 @@ export default {
}); });
}, },
/*材料损耗的modal*/
materialLossModal(materialRow) {
this.$nextTick(() => {
this.showMaterialLossFlag = true;
this.$refs.comMaterialLoss.init(this.scheduleData, this.operatorData, materialRow);
});
},
/*材料接卷的modal*/
materialRollUpModal(materialRow) {
this.$nextTick(() => {
this.showMaterialRollUpFlag = true;
this.$refs.comMaterialRollUp.init(this.scheduleData, this.operatorData, materialRow);
});
},
/*材料结束生产的modal*/ /*材料结束生产的modal*/
finishMaterialModal(materialRow) { finishMaterialModal(materialRow) {
this.$nextTick(() => { this.$nextTick(() => {

Loading…
Cancel
Save