feat: 新增业务员、合同号查询与展示,优化钢卷管理功能

1.  在钢卷相关API中新增对saleName和contractNo字段的过滤逻辑,避免数据覆盖
2.  多个报表页面新增业务员和合同号查询条件
3.  钢卷物料页面重构表单布局,新增生产耗时计算、合同绑定功能
4.  告警页面优化UI展示,新增详情弹窗和备注处理流程
5.  多处代码格式化与注释优化
This commit is contained in:
2026-06-22 14:42:46 +08:00
parent 1167bc117b
commit 3e640b4a4d
7 changed files with 722 additions and 340 deletions

View File

@@ -49,7 +49,8 @@ export function addMaterialCoil(data) {
export function updateMaterialCoil(data) {
// 对data进行预处理将currentCoilNo去除首位的空格
const payload = {
// 将saleName和contractNo剔除防止覆盖
const { saleName, contractNo, ...payload} = {
...data,
currentCoilNo: data.currentCoilNo.trim(),
}
@@ -63,7 +64,8 @@ export function updateMaterialCoil(data) {
// 简单更新钢卷物料表
export function updateMaterialCoilSimple(data) {
// 对data进行预处理将currentCoilNo去除首位的空格
const payload = {
// 将saleName和contractNo剔除防止覆盖
const { saleName, contractNo, ...payload} = {
...data,
currentCoilNo: data.currentCoilNo.trim(),
}

View File

@@ -83,19 +83,26 @@
<el-input v-model="queryParams.remark" placeholder="请输入备注" clearable size="small" />
</el-form-item>
<el-form-item>
<el-form-item label="业务员" prop="saleName" v-if="orderBy">
<el-input v-model="queryParams.saleName" placeholder="请输入业务员" clearable size="small" />
</el-form-item>
<el-form-item label="合同号" prop="contractNo" v-if="orderBy">
<el-input v-model="queryParams.contractNo" placeholder="请输入合同号" clearable size="small" />
</el-form-item>
<el-form-item>
<el-button v-if="multiple" type="primary" size="small" icon="el-icon-check"
@click="handleSelectAllCurrentPage">全选当前卷</el-button>
<el-checkbox v-if="orderBy" style="margin-left: 10px;" v-model="showCoilMap"
size="small">显示钢卷地图</el-checkbox>
<el-checkbox v-if="orderBy && orderId" style="margin-left: 10px;" v-model="showOrderInfo"
size="small">显示订单详情</el-checkbox>
</el-form-item>
</el-form>
<div style="display: flex; flex-direction: column; justify-content: flex-start; align-items: center; gap: 2px;">
<div
style="display: flex; flex-direction: column; justify-content: flex-start; align-items: center; gap: 2px;">
<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
<el-button type="warning" size="small" icon="el-icon-setting"

View File

@@ -1,6 +1,6 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form v-show="showSearch" ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="68px">
<el-form-item label="告警类型" prop="warningType">
<el-radio-group v-model="queryParams.warningType" @change="handleQuery">
<el-radio-button label="LENGTH">长度告警</el-radio-button>
@@ -15,16 +15,24 @@
</el-select>
</el-form-item> -->
<el-form-item label="告警状态" prop="warningStatus">
<el-select v-model="queryParams.warningStatus" placeholder="请选择告警状态" clearable
@change="handleQuery">
<el-select
v-model="queryParams.warningStatus"
placeholder="请选择告警状态"
clearable
@change="handleQuery"
>
<el-option label="未处理" value="0" />
<el-option label="已处理" value="1" />
<el-option label="已忽略" value="2" />
</el-select>
</el-form-item>
<el-form-item label="工序" prop="actionType">
<el-select v-model="queryParams.actionType" placeholder="请选择工序" clearable
@change="handleQuery">
<el-select
v-model="queryParams.actionType"
placeholder="请选择工序"
clearable
@change="handleQuery"
>
<el-option v-for="item in dict.type.action_type" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
@@ -83,13 +91,14 @@
</el-col>
</el-row>
<el-table v-loading="loading" :data="materialWarningList" @selection-change="handleSelectionChange" :row-class-name="getRowClassName">
<el-table v-loading="loading" :data="materialWarningList" :row-class-name="getRowClassName" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="钢卷ID" align="center" prop="coilId" /> -->
<el-table-column label="告警类型" align="center" prop="warningType">
<el-table-column label="告警类型" align="center" prop="warningType" width="100">
<template slot-scope="scope">
<span>{{ scope.row.warningType === 'LENGTH' ? '长度' : scope.row.warningType === 'THICKNESS' ? '厚度' : '宽度'
}}</span>
<el-tag :type="scope.row.warningType === 'LENGTH' ? 'warning' : scope.row.warningType === 'THICKNESS' ? '' : 'success'" size="small" effect="plain">
{{ scope.row.warningType === 'LENGTH' ? '长度' : scope.row.warningType === 'THICKNESS' ? '厚度' : '宽度' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="工序" align="center" prop="actionType">
@@ -99,6 +108,7 @@
</el-table-column>
<el-table-column label="入场卷号" align="center" prop="coilVo.enterCoilNo" />
<el-table-column label="当前卷号" align="center" prop="coilVo.currentCoilNo" />
<el-table-column label="品质" align="center" prop="coilVo.qualityStatus" />
<el-table-column label="发生时间" align="center" prop="createTime" width="180">
<!-- 如果是今天的标红显示 -->
<template slot-scope="scope">
@@ -119,87 +129,103 @@
<el-table-column label="告警说明" align="center" prop="warningMsg" show-overflow-tooltip />
<el-table-column label="告警状态" align="center" prop="warningStatus">
<template slot-scope="scope">
<span>{{ scope.row.warningStatus == 0 ? '未处理' : scope.row.warningStatus == 1 ? '已处理' : '已忽略' }}</span>
<div class="status-cell">
<el-tag
:type="scope.row.warningStatus == 0 ? 'danger' : scope.row.warningStatus == 1 ? 'success' : 'info'"
size="small"
effect="plain"
>
{{ scope.row.warningStatus == 0 ? '未处理' : scope.row.warningStatus == 1 ? '已处理' : '已忽略' }}
</el-tag>
</div>
</template>
</el-table-column>
<el-table-column label="处理人" align="center" prop="handleBy" />
<el-table-column label="处理时间" align="center" prop="handleTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.handleTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column label="处理备注" align="center" prop="handleRemark" /> -->
<!-- <el-table-column label="备注" align="center" prop="remark" /> -->
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleHandle(scope.row)">处理</el-button>
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleIgnore(scope.row)">忽略</el-button>
<el-button size="mini" type="text" icon="el-icon-view" @click="showDetail(scope.row)">详情</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改钢卷告警对话框 -->
<!-- <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="钢卷ID" prop="coilId">
<el-input v-model="form.coilId" placeholder="请输入钢卷ID" />
</el-form-item>
<el-form-item label="理论值" prop="theoreticalVal">
<el-input v-model="form.theoreticalVal" placeholder="请输入理论值" />
</el-form-item>
<el-form-item label="实测值" prop="actualVal">
<el-input v-model="form.actualVal" placeholder="请输入实测值" />
</el-form-item>
<el-form-item label="允许偏差" prop="allowDeviation">
<el-input v-model="form.allowDeviation" placeholder="请输入允许偏差" />
</el-form-item>
<el-form-item label="实际偏差值" prop="deviationValue">
<el-input v-model="form.deviationValue" placeholder="请输入实际偏差值" />
</el-form-item>
<el-form-item label="偏差率(%)" prop="deviationRate">
<el-input v-model="form.deviationRate" placeholder="请输入偏差率(%)" />
</el-form-item>
<el-form-item label="告警级别(WARNING/ERROR/CRITICAL)" prop="warningLevel">
<el-input v-model="form.warningLevel" placeholder="请输入告警级别(WARNING/ERROR/CRITICAL)" />
</el-form-item>
<el-form-item label="告警说明" prop="warningMsg">
<el-input v-model="form.warningMsg" placeholder="请输入告警说明" />
</el-form-item>
<el-form-item label="处理人" prop="handleBy">
<el-input v-model="form.handleBy" placeholder="请输入处理人" />
</el-form-item>
<el-form-item label="处理时间" prop="handleTime">
<el-date-picker clearable
v-model="form.handleTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择处理时间">
</el-date-picker>
</el-form-item>
<!-- 告警详情弹窗 -->
<el-dialog title="告警详情" :visible.sync="detailDialogVisible" width="1400px" append-to-body>
<div v-if="detailData.warningId" v-loading="detailLoading">
<el-divider content-position="left">钢卷信息</el-divider>
<CoilInfoRender :coilInfo="detailData.coilVo" />
<el-divider content-position="left">告警信息</el-divider>
<el-descriptions :column="2" border size="small">
<el-descriptions-item label="告警类型">
<el-tag :type="detailData.warningType === 'LENGTH' ? 'warning' : detailData.warningType === 'THICKNESS' ? '' : 'success'" size="small" effect="plain">
{{ detailData.warningType === 'LENGTH' ? '长度' : detailData.warningType === 'THICKNESS' ? '厚度' : '宽度' }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="工序">
<dict-tag :options="dict.type.action_type" :value="detailData.actionType" />
</el-descriptions-item>
<el-descriptions-item label="告警状态">
<el-tag
:type="detailData.warningStatus == 0 ? 'danger' : detailData.warningStatus == 1 ? 'success' : 'info'"
size="small"
effect="plain"
>
{{ detailData.warningStatus == 0 ? '未处理' : detailData.warningStatus == 1 ? '已处理' : '已忽略' }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="发生时间">
{{ parseTime(detailData.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}
</el-descriptions-item>
<el-descriptions-item label="推论值">{{ detailData.theoreticalVal }}</el-descriptions-item>
<el-descriptions-item label="实际值">{{ detailData.actualVal }}</el-descriptions-item>
<el-descriptions-item label="允许偏差">{{ detailData.allowDeviation }}</el-descriptions-item>
<el-descriptions-item label="实际偏差">{{ detailData.deviationValue }}</el-descriptions-item>
<el-descriptions-item label="告警说明" :span="2">{{ detailData.warningMsg }}</el-descriptions-item>
</el-descriptions>
<el-divider v-if="detailData.warningStatus != 0" content-position="left">处理信息</el-divider>
<div v-if="detailData.warningStatus != 0" class="handle-detail">
<div class="handle-remark-body">"{{ detailData.handleRemark }}"</div>
<div class="handle-meta-row">
<span>{{ detailData.handleBy }}</span>
<span class="handle-meta-sep">·</span>
<span>{{ parseTime(detailData.handleTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</div>
</div>
</div>
</el-dialog>
<!-- 处理备注弹窗 -->
<el-dialog title="填写处理备注" :visible.sync="handleRemarkDialogVisible" width="500px" append-to-body>
<el-form ref="handleRemarkForm" :model="handleRemarkForm" :rules="handleRemarkRules" label-width="80px">
<el-form-item label="处理备注" prop="handleRemark">
<el-input v-model="form.handleRemark" placeholder="请输入处理备注" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
<el-input v-model="handleRemarkForm.handleRemark" type="textarea" placeholder="请输入处理备注" :rows="4" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
<el-button @click="handleRemarkDialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmHandleRemark"> </el-button>
</div>
</el-dialog> -->
</el-dialog>
</div>
</template>
<script>
import { listMaterialWarning, getMaterialWarning, delMaterialWarning, addMaterialWarning, updateMaterialWarning, batchHandleMaterial, batchHandleHistory } from "@/api/wms/materialWarning";
import { listMaterialWarning, getMaterialWarning, delMaterialWarning, addMaterialWarning, updateMaterialWarning, batchHandleMaterial, batchHandleHistory } from '@/api/wms/materialWarning'
export default {
name: "MaterialWarning",
name: 'MaterialWarning',
data() {
return {
// 按钮loading
@@ -219,9 +245,25 @@ export default {
// 钢卷告警表格数据
materialWarningList: [],
// 弹出层标题
title: "",
title: '',
// 是否显示弹出层
open: false,
// 详情弹窗
detailDialogVisible: false,
detailLoading: false,
detailData: {},
// 处理备注弹窗
handleRemarkDialogVisible: false,
handleRemarkMode: 'single',
handleRemarkTarget: null,
handleRemarkForm: {
handleRemark: ''
},
handleRemarkRules: {
handleRemark: [
{ required: true, message: '处理备注不能为空', trigger: 'blur' }
]
},
// 查询参数
queryParams: {
pageNum: 1,
@@ -241,205 +283,199 @@ export default {
handleRemark: undefined,
onlyToday: true,
createStartTime: undefined,
createEndTime: undefined,
createEndTime: undefined
},
// 表单参数
form: {},
// 表单校验
rules: {
warningId: [
{ required: true, message: "告警ID不能为空", trigger: "blur" }
{ required: true, message: '告警ID不能为空', trigger: 'blur' }
],
coilId: [
{ required: true, message: "钢卷ID不能为空", trigger: "blur" }
{ required: true, message: '钢卷ID不能为空', trigger: 'blur' }
],
warningType: [
{ required: true, message: "告警类型(LENGTH=长度, THICKNESS=厚度, WIDTH=宽度)不能为空", trigger: "change" }
{ required: true, message: '告警类型(LENGTH=长度, THICKNESS=厚度, WIDTH=宽度)不能为空', trigger: 'change' }
],
theoreticalVal: [
{ required: true, message: "理论值不能为空", trigger: "blur" }
{ required: true, message: '理论值不能为空', trigger: 'blur' }
],
actualVal: [
{ required: true, message: "实测值不能为空", trigger: "blur" }
{ required: true, message: '实测值不能为空', trigger: 'blur' }
],
allowDeviation: [
{ required: true, message: "允许偏差(数值/百分比)不能为空", trigger: "blur" }
{ required: true, message: '允许偏差(数值/百分比)不能为空', trigger: 'blur' }
],
deviationValue: [
{ required: true, message: "实际偏差值不能为空", trigger: "blur" }
{ required: true, message: '实际偏差值不能为空', trigger: 'blur' }
],
deviationRate: [
{ required: true, message: "偏差率(%)不能为空", trigger: "blur" }
{ required: true, message: '偏差率(%)不能为空', trigger: 'blur' }
],
warningLevel: [
{ required: true, message: "告警级别(WARNING/ERROR/CRITICAL)不能为空", trigger: "blur" }
{ required: true, message: '告警级别(WARNING/ERROR/CRITICAL)不能为空', trigger: 'blur' }
],
warningMsg: [
{ required: true, message: "告警说明不能为空", trigger: "blur" }
{ required: true, message: '告警说明不能为空', trigger: 'blur' }
],
warningStatus: [
{ required: true, message: "告警状态(0=未处理,1=已处理,2=已忽略)不能为空", trigger: "change" }
{ required: true, message: '告警状态(0=未处理,1=已处理,2=已忽略)不能为空', trigger: 'change' }
],
handleBy: [
{ required: true, message: "处理人不能为空", trigger: "blur" }
{ required: true, message: '处理人不能为空', trigger: 'blur' }
],
handleTime: [
{ required: true, message: "处理时间不能为空", trigger: "blur" }
{ required: true, message: '处理时间不能为空', trigger: 'blur' }
],
handleRemark: [
{ required: true, message: "处理备注不能为空", trigger: "blur" }
{ required: true, message: '处理备注不能为空', trigger: 'blur' }
],
delFlag: [
{ required: true, message: "删除标志不能为空", trigger: "blur" }
{ required: true, message: '删除标志不能为空', trigger: 'blur' }
],
createTime: [
{ required: true, message: "创建时间不能为空", trigger: "blur" }
{ required: true, message: '创建时间不能为空', trigger: 'blur' }
],
updateTime: [
{ required: true, message: "更新时间不能为空", trigger: "blur" }
{ required: true, message: '更新时间不能为空', trigger: 'blur' }
],
remark: [
{ required: true, message: "备注不能为空", trigger: "blur" }
{ required: true, message: '备注不能为空', trigger: 'blur' }
]
}
};
}
},
dicts: ['action_type'],
created() {
this.getList();
this.getList()
},
methods: {
/** 查询钢卷告警列表 */
getList() {
this.loading = true;
this.loading = true
if (this.queryParams.onlyToday) {
const today = new Date();
const y = today.getFullYear();
const m = String(today.getMonth() + 1).padStart(2, '0');
const d = String(today.getDate()).padStart(2, '0');
this.queryParams.createStartTime = `${y}-${m}-${d} 00:00:00`;
this.queryParams.createEndTime = `${y}-${m}-${d} 23:59:59`;
const today = new Date()
const y = today.getFullYear()
const m = String(today.getMonth() + 1).padStart(2, '0')
const d = String(today.getDate()).padStart(2, '0')
this.queryParams.createStartTime = `${y}-${m}-${d} 00:00:00`
this.queryParams.createEndTime = `${y}-${m}-${d} 23:59:59`
} else {
this.queryParams.createStartTime = undefined;
this.queryParams.createEndTime = undefined;
this.queryParams.createStartTime = undefined
this.queryParams.createEndTime = undefined
}
listMaterialWarning(this.queryParams).then(response => {
this.materialWarningList = response.rows;
this.total = response.total;
this.loading = false;
});
this.materialWarningList = response.rows
this.total = response.total
this.loading = false
})
},
/** 忽略按钮操作 */
handleIgnore(row) {
this.loading = true;
updateMaterialWarning({ ...row, warningStatus: 2, handleBy: this.$store.state.user.name, handleTime: this.parseTime(new Date(), '{y}-{m}-{d} {h}:{i}:{s}') }).then(response => {
this.loading = false;
this.$message({
message: "忽略成功",
type: "success"
});
this.getList();
});
this.$modal.confirm('确认忽略该告警?').then(() => {
this.loading = true
updateMaterialWarning({ ...row, warningStatus: 2, handleBy: this.$store.state.user.name, handleTime: this.parseTime(new Date(), '{y}-{m}-{d} {h}:{i}:{s}') }).then(response => {
this.loading = false
this.$modal.msgSuccess('忽略成功')
this.getList()
})
}).catch(() => {})
},
/** 行样式区分长度告警和厚度告警 */
getRowClassName({ row }) {
if (row.warningType === 'LENGTH') return 'warning-row-length';
if (row.warningType === 'THICKNESS') return 'warning-row-thickness';
return '';
if (row.warningType === 'LENGTH') return 'warning-row-length'
if (row.warningType === 'THICKNESS') return 'warning-row-thickness'
return ''
},
/** 判断是否是今天的 */
isToday(date) {
const today = new Date();
const year = today.getFullYear();
const month = today.getMonth() + 1;
const day = today.getDate();
const dateObj = new Date(date);
const year2 = dateObj.getFullYear();
const month2 = dateObj.getMonth() + 1;
const day2 = dateObj.getDate();
return year === year2 && month === month2 && day === day2;
const today = new Date()
const year = today.getFullYear()
const month = today.getMonth() + 1
const day = today.getDate()
const dateObj = new Date(date)
const year2 = dateObj.getFullYear()
const month2 = dateObj.getMonth() + 1
const day2 = dateObj.getDate()
return year === year2 && month === month2 && day === day2
},
/** 处理按钮操作 */
handleHandle(row) {
this.loading = true;
// 填写处理人和处理时间
updateMaterialWarning({ ...row, warningStatus: 1, handleBy: this.$store.state.user.name, handleTime: this.parseTime(new Date(), '{y}-{m}-{d} {h}:{i}:{s}') }).then(response => {
this.loading = false;
this.$message({
message: "处理成功",
type: "success"
});
this.getList();
});
this.$modal.confirm('确认将该告警标记为已处理?').then(() => {
this.handleRemarkMode = 'single'
this.handleRemarkTarget = row
this.handleRemarkForm.handleRemark = ''
this.handleRemarkDialogVisible = true
this.$nextTick(() => {
this.$refs.handleRemarkForm && this.$refs.handleRemarkForm.clearValidate()
})
}).catch(() => {})
},
/** 批量处理按钮操作 */
handleBatchProcess() {
if (this.ids.length === 0) {
this.$modal.msgWarning("请至少选择一条记录");
return;
this.$modal.msgWarning('请至少选择一条记录')
return
}
this.$modal.confirm('确认将选中的 ' + this.ids.length + ' 条告警标记为已处理?').then(() => {
this.loading = true;
return batchHandleMaterial({ warningIds: this.ids, warningStatus: 1 });
}).then(() => {
this.loading = false;
this.$modal.msgSuccess("批量处理成功");
this.getList();
}).catch(() => {
}).finally(() => {
this.loading = false;
});
this.handleRemarkMode = 'batch'
this.handleRemarkTarget = this.ids
this.handleRemarkForm.handleRemark = ''
this.handleRemarkDialogVisible = true
this.$nextTick(() => {
this.$refs.handleRemarkForm && this.$refs.handleRemarkForm.clearValidate()
})
}).catch(() => {})
},
/** 批量忽略按钮操作 */
handleBatchIgnore() {
if (this.ids.length === 0) {
this.$modal.msgWarning("请至少选择一条记录");
return;
this.$modal.msgWarning('请至少选择一条记录')
return
}
this.$modal.confirm('确认将选中的 ' + this.ids.length + ' 条告警标记为已忽略?').then(() => {
this.loading = true;
return batchHandleMaterial({ warningIds: this.ids, warningStatus: 2 });
this.loading = true
return batchHandleMaterial({ warningIds: this.ids, warningStatus: 2 })
}).then(() => {
this.loading = false;
this.$modal.msgSuccess("批量忽略成功");
this.getList();
this.loading = false
this.$modal.msgSuccess('批量忽略成功')
this.getList()
}).catch(() => {
}).finally(() => {
this.loading = false;
});
this.loading = false
})
},
/** 处理历史告警按钮操作(批量标记今天以前的所有记录为已处理) */
handleBatchProcessHistory() {
this.$modal.confirm('确认将今天以前的所有告警标记为已处理?').then(() => {
this.loading = true;
return batchHandleHistory({ warningStatus: 1 });
}).then(() => {
this.loading = false;
this.$modal.msgSuccess("处理历史告警成功");
this.getList();
}).catch(() => {
}).finally(() => {
this.loading = false;
});
this.handleRemarkMode = 'history'
this.handleRemarkTarget = null
this.handleRemarkForm.handleRemark = ''
this.handleRemarkDialogVisible = true
this.$nextTick(() => {
this.$refs.handleRemarkForm && this.$refs.handleRemarkForm.clearValidate()
})
}).catch(() => {})
},
/** 忽略历史告警按钮操作(批量标记今天以前的所有记录为已忽略) */
handleBatchIgnoreHistory() {
this.$modal.confirm('确认将今天以前的所有告警标记为已忽略?').then(() => {
this.loading = true;
return batchHandleHistory({ warningStatus: 2 });
this.loading = true
return batchHandleHistory({ warningStatus: 2 })
}).then(() => {
this.loading = false;
this.$modal.msgSuccess("忽略历史告警成功");
this.getList();
this.loading = false
this.$modal.msgSuccess('忽略历史告警成功')
this.getList()
}).catch(() => {
}).finally(() => {
this.loading = false;
});
this.loading = false
})
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
this.open = false
this.reset()
},
// 表单重置
reset() {
@@ -464,18 +500,18 @@ export default {
updateTime: undefined,
updateBy: undefined,
remark: undefined
};
this.resetForm("form");
}
this.resetForm('form')
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
this.resetForm('queryForm')
this.handleQuery()
},
// 多选框选中数据
handleSelectionChange(selection) {
@@ -485,61 +521,130 @@ export default {
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加钢卷告警";
this.reset()
this.open = true
this.title = '添加钢卷告警'
},
/** 修改按钮操作 */
handleUpdate(row) {
this.loading = true;
this.reset();
this.loading = true
this.reset()
const warningId = row.warningId || this.ids
getMaterialWarning(warningId).then(response => {
this.loading = false;
this.form = response.data;
this.open = true;
this.title = "修改钢卷告警";
});
this.loading = false
this.form = response.data
this.open = true
this.title = '修改钢卷告警'
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
this.$refs['form'].validate(valid => {
if (valid) {
this.buttonLoading = true;
this.buttonLoading = true
if (this.form.warningId != null) {
updateMaterialWarning(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
this.$modal.msgSuccess('修改成功')
this.open = false
this.getList()
}).finally(() => {
this.buttonLoading = false;
});
this.buttonLoading = false
})
} else {
addMaterialWarning(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
this.$modal.msgSuccess('新增成功')
this.open = false
this.getList()
}).finally(() => {
this.buttonLoading = false;
});
this.buttonLoading = false
})
}
}
});
})
},
/** 详情按钮操作 */
showDetail(row) {
this.detailDialogVisible = true
// this.detailLoading = true
this.detailData = row;
// getMaterialWarning(row.warningId).then(response => {
// this.detailData = response.data
// this.detailLoading = false
// }).catch(() => {
// this.detailLoading = false
// })
},
/** 确认填写处理备注 */
confirmHandleRemark() {
this.$refs.handleRemarkForm.validate(valid => {
if (!valid) return
this.loading = true
const handleBy = this.$store.state.user.name
const handleTime = this.parseTime(new Date(), '{y}-{m}-{d} {h}:{i}:{s}')
const handleRemark = this.handleRemarkForm.handleRemark
if (this.handleRemarkMode === 'single') {
const row = this.handleRemarkTarget
updateMaterialWarning({
...row,
warningStatus: 1,
handleBy,
handleTime,
handleRemark
}).then(() => {
this.loading = false
this.handleRemarkDialogVisible = false
this.$modal.msgSuccess('处理成功')
this.getList()
}).catch(() => {
this.loading = false
})
} else if (this.handleRemarkMode === 'batch') {
batchHandleMaterial({
warningIds: this.handleRemarkTarget,
warningStatus: 1,
handleBy,
handleTime,
handleRemark
}).then(() => {
this.loading = false
this.handleRemarkDialogVisible = false
this.$modal.msgSuccess('批量处理成功')
this.getList()
}).catch(() => {
this.loading = false
})
} else if (this.handleRemarkMode === 'history') {
batchHandleHistory({
warningStatus: 1,
handleBy,
handleTime,
handleRemark
}).then(() => {
this.loading = false
this.handleRemarkDialogVisible = false
this.$modal.msgSuccess('处理历史告警成功')
this.getList()
}).catch(() => {
this.loading = false
})
}
})
},
/** 删除按钮操作 */
handleDelete(row) {
const warningIds = row.warningId || this.ids;
const warningIds = row.warningId || this.ids
this.$modal.confirm('是否确认删除钢卷告警编号为"' + warningIds + '"的数据项?').then(() => {
this.loading = true;
return delMaterialWarning(warningIds);
this.loading = true
return delMaterialWarning(warningIds)
}).then(() => {
this.loading = false;
this.getList();
this.$modal.msgSuccess("删除成功");
this.loading = false
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {
}).finally(() => {
this.loading = false;
});
this.loading = false
})
},
/** 导出按钮操作 */
handleExport() {
@@ -548,7 +653,7 @@ export default {
}, `materialWarning_${new Date().getTime()}.xlsx`)
}
}
};
}
</script>
<style scoped>
.el-table .warning-row-length {
@@ -557,4 +662,57 @@ export default {
.el-table .warning-row-thickness {
background-color: #ecf5ff;
}
.status-cell {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
padding: 4px 0;
}
.status-detail {
width: 100%;
text-align: left;
}
.status-remark {
font-size: 13px;
color: #303133;
line-height: 1.5;
margin-bottom: 4px;
font-weight: 500;
word-break: break-all;
}
.status-meta {
font-size: 11px;
color: #909399;
letter-spacing: 0.3px;
}
.handle-detail {
padding: 12px 0;
}
.handle-remark-body {
font-size: 15px;
color: #303133;
line-height: 1.8;
margin-bottom: 12px;
padding: 12px 16px;
background: #fafafa;
border-radius: 0 6px 6px 0;
font-style: italic;
letter-spacing: 0.5px;
}
.handle-meta-row {
font-size: 13px;
color: #909399;
display: flex;
align-items: center;
gap: 8px;
justify-content: flex-start;
letter-spacing: 0.4px;
}
.handle-meta-sep {
color: #c0c4cc;
font-weight: bold;
}
</style>

View File

@@ -83,6 +83,14 @@
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="业务员" prop="saleName">
<el-input v-model="queryParams.saleName" placeholder="请输入业务员" clearable size="small" />
</el-form-item>
<el-form-item label="合同号" prop="contractNo">
<el-input v-model="queryParams.contractNo" placeholder="请输入合同号" clearable size="small" />
</el-form-item>
<el-form-item v-if="showWaybill" label="发货状态">
<el-radio-group v-model="queryParams.status" @change="handleQuery">
<el-radio-button label="">全部</el-radio-button>
@@ -136,13 +144,11 @@
<el-button type="info" plain icon="el-icon-download" size="mini" @click="handleExportAllProps">导出全部</el-button>
</el-col>
<el-col :span="2" v-if="canExportAll">
<!-- <el-col :span="2" v-if="canExportAll">
<el-button type="info" plain icon="el-icon-printer" size="mini" :disabled="multiple"
@click="handleBatchPrintLabel">批量打印标签</el-button>
</el-col>
<!-- <el-col :span="2" v-if="showWaybill">
</el-col> -->
<el-col :span="1.5" v-if="showOrderBy">
<el-checkbox v-model="queryParams.orderBy" v-loading="loading" @change="getList"
label="orderBy">按实际库区排序</el-checkbox>
@@ -187,6 +193,7 @@
</template>
</el-table-column>
<el-table-column label="业务员" align="center" prop="saleName" width="60" />
<el-table-column label="合同号" align="center" prop="contractNo" width="120" />
<el-table-column v-if="showAbnormal" label="异常数量" align="center" prop="abnormalCount"></el-table-column>
<el-table-column label="长度 (米)" align="center" prop="length" v-if="showLength" />
<el-table-column label="发货时间" v-if="showExportTime" align="center" prop="exportTime" width="205">
@@ -223,7 +230,7 @@
<el-table-column v-if="moreColumn" label="材质" prop="material"></el-table-column>
<el-table-column v-if="moreColumn" label="厂家" prop="manufacturer"></el-table-column>
<el-table-column v-if="moreColumn" label="表面处理" prop="surfaceTreatmentDesc"></el-table-column>
<el-table-column v-if="moreColumn" label="品质" prop="qualityStatus"></el-table-column>
<el-table-column label="品质" prop="qualityStatus"></el-table-column>
<el-table-column v-if="moreColumn" label="备注" prop="remark" show-overflow-tooltip></el-table-column>
<el-table-column v-if="moreColumn" label="切边" prop="trimmingRequirement"></el-table-column>
<el-table-column v-if="moreColumn" label="包装" prop="packagingRequirement"></el-table-column>
@@ -402,111 +409,219 @@
@pagination="getList" />
</div>
<!-- 添加或修改钢卷物料对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-dialog :title="title" :visible.sync="open" width="1200px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="入场钢卷号" prop="enterCoilNo">
<el-input v-model="form.enterCoilNo" placeholder="请输入入场钢卷号" :disabled="form.coilId" />
</el-form-item>
<el-form-item label="当前钢卷号" prop="currentCoilNo">
<el-input v-model="form.currentCoilNo" placeholder="请输入当前钢卷号" />
</el-form-item>
<el-form-item label="厂家原料卷号" prop="supplierCoilNo">
<el-input v-model="form.supplierCoilNo" placeholder="请输入厂家原料卷号" />
</el-form-item>
<el-form-item label="所在库位" prop="warehouseId">
<warehouse-select v-model="form.warehouseId" placeholder="请选择仓库/库区/库位" style="width: 100%;" clearable />
</el-form-item>
<el-form-item label="实际库区" prop="actualWarehouseId">
<actual-warehouse-select v-model="form.actualWarehouseId" :clearInput="form.coilId != null"
placeholder="请选择实际库区" style="width: 100%;" clearable />
</el-form-item>
<el-form-item label="班组" prop="team">
<el-select v-model="form.team" placeholder="请选择班组" style="width: 100%">
<el-option key="甲" label="甲" value="甲" />
<el-option key="乙" label="乙" value="乙" />
</el-select>
</el-form-item>
<el-form-item label="材料类型" prop="materialType">
<el-select v-model="form.materialType" placeholder="请选择材料类型" @change="handleMaterialTypeChange">
<el-option label="成品" value="成品" />
<el-option label="原料" value="原料" />
</el-select>
</el-form-item>
<el-form-item :label="getItemLabel" prop="itemId">
<product-select v-if="form.itemType == 'product'" v-model="form.itemId" placeholder="请选择成品"
style="width: 100%;" clearable />
<raw-material-select v-else-if="form.itemType == 'raw_material'" v-model="form.itemId" placeholder="请选择原料"
style="width: 100%;" clearable />
<div v-else>请先选择材料类型</div>
</el-form-item>
<!-- <el-form-item label="质量状态" prop="qualityStatus">
<el-select v-model="form.qualityStatus" placeholder="请选择质量状态" style="width: 100%">
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item> -->
<el-form-item label="切边要求" prop="trimmingRequirement">
<el-select v-model="form.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%">
<el-option label="净边料" value="净边料" />
<el-option label="毛边料" value="毛边料" />
</el-select>
</el-form-item>
<el-form-item label="原料材质" prop="packingStatus">
<el-input v-model="form.packingStatus" placeholder="请输入原料材质">
</el-input>
</el-form-item>
<el-form-item label="包装要求" prop="packagingRequirement">
<el-select v-model="form.packagingRequirement" placeholder="请选择包装要求" style="width: 100%">
<el-option label="裸包" value="裸包" />
<el-option label="普包" value="普包" />
<el-option label="简包" value="简包" />
<el-option label="精包" value="精包" />
</el-select>
</el-form-item>
<el-form-item label="毛重" prop="grossWeight">
<el-input v-model="form.grossWeight" placeholder="请输入毛重" />
</el-form-item>
<el-form-item label="净重" prop="netWeight">
<el-input v-model="form.netWeight" placeholder="请输入净重" />
</el-form-item>
<el-form-item label="长度" prop="length" v-if="showLength">
<el-input v-model="form.length" placeholder="请输入长度" />
</el-form-item>
<el-form-item label="实测长度(m)" prop="actualLength">
<el-input-number :controls="false" v-model="form.actualLength" placeholder="请输入实测长度" type="number"
:step="0.01" />
</el-form-item>
<el-form-item label="实测厚度(mm)" prop="actualThickness" class="form-item-half">
<el-input-number :controls="false" v-model="form.actualThickness" placeholder="请输入实测厚度" type="number"
:step="0.01" />
</el-form-item>
<el-form-item label="实测宽度(mm)" prop="actualWidth">
<el-input-number :controls="false" v-model="form.actualWidth" placeholder="请输入实测宽度" type="number"
:step="0.01" />
</el-form-item>
<el-form-item label="业务目的" prop="businessPurpose">
<el-select v-model="form.businessPurpose" placeholder="业务目的" filterable>
<el-option v-for="item in dict.type.coil_business_purpose" :key="item.value" :value="item.value"
:label="item.label" />
</el-select>
</el-form-item>
<el-form-item label="调制度" prop="temperGrade">
<el-input v-model="form.temperGrade" placeholder="请输入调制度" />
</el-form-item>
<el-form-item label="镀层种类" prop="coatingType">
<MemoInput storageKey="coatingType" v-model="form.coatingType" placeholder="请输入镀层种类" />
</el-form-item>
<el-form-item label="钢卷表面处理" prop="coilSurfaceTreatment">
<MemoInput storageKey="surfaceTreatmentDesc" v-model="form.coilSurfaceTreatment" placeholder="请输入钢卷表面处理" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="入场钢卷号" prop="enterCoilNo">
<el-input v-model="form.enterCoilNo" placeholder="请输入入场钢卷号" :disabled="!!form.coilId" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前钢卷号" prop="currentCoilNo">
<el-input v-model.trim="form.currentCoilNo" placeholder="请输入当前钢卷号" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="厂家原料卷号" prop="supplierCoilNo">
<el-input v-model.trim="form.supplierCoilNo" placeholder="请输入厂家原料卷号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所在库位" prop="warehouseId">
<warehouse-select v-model="form.warehouseId" placeholder="请选择仓库/库区/库位" style="width: 100%;" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="实际库区" prop="actualWarehouseId">
<actual-warehouse-select v-model="form.actualWarehouseId" placeholder="请选择实际库区" style="width: 100%;"
clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="班组" prop="team">
<el-select v-model="form.team" placeholder="请选择班组" style="width: 100%">
<el-option key="甲" label="甲" value="甲" />
<el-option key="乙" label="乙" value="乙" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="材料类型" prop="materialType">
<el-select v-model="form.materialType" placeholder="请选择材料类型" @change="handleMaterialTypeChange">
<el-option label="成品" value="成品" />
<el-option label="料" value="料" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="getItemLabel" prop="itemId">
<product-select v-if="form.itemType == 'product'" v-model="form.itemId" placeholder="请选择成品"
style="width: 100%;" clearable />
<raw-material-select v-else-if="form.itemType == 'raw_material'" v-model="form.itemId" placeholder="请选择原料"
style="width: 100%;" clearable />
<div v-else>请先选择材料类型</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="质量状态" prop="qualityStatus">
<el-select v-model="form.qualityStatus" placeholder="请选择质量状态" style="width: 100%">
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="切边要求" prop="trimmingRequirement">
<el-select v-model="form.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%">
<el-option label="净边料" value="净边料" />
<el-option label="毛边料" value="毛边料" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="原料材质" prop="packingStatus">
<el-input v-model="form.packingStatus" placeholder="请输入原料材质" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="包装要求" prop="packagingRequirement">
<el-select v-model="form.packagingRequirement" placeholder="请选择包装要求" style="width: 100%">
<el-option label="裸包" value="裸包" />
<el-option label="普包" value="普包" />
<el-option label="简包" value="简包" />
<el-option label="精包" value="精包" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="毛重" prop="grossWeight">
<el-input v-model="form.grossWeight" placeholder="请输入毛重" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="净重" prop="netWeight">
<el-input v-model="form.netWeight" placeholder="请输入净重" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="实测长度(mm)" prop="actualLength">
<el-input-number :controls="false" v-model="form.actualLength" placeholder="请输入实测长度" type="number"
:step="0.01" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实测宽度(mm)" prop="actualWidth">
<el-input-number :controls="false" v-model="form.actualWidth" placeholder="请输入实测宽度" type="number"
:step="0.01" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="实测厚度(mm)" prop="actualThickness">
<el-input-number :controls="false" v-model="form.actualThickness" placeholder="请输入实测厚度" type="number"
:step="0.01" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="业务目的" prop="businessPurpose">
<el-select v-model="form.businessPurpose" placeholder="请选择业务目的" style="width: 100%">
<el-option v-for="item in dict.type.coil_business_purpose" :key="item.value" :value="item.value"
:label="item.label" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="调制度" prop="temperGrade">
<el-input v-model="form.temperGrade" placeholder="请输入调制度" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="镀层种类" prop="coatingType">
<MemoInput storageKey="coatingType" v-model="form.coatingType" placeholder="请输入镀层种类" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="钢卷表面处理" prop="coilSurfaceTreatment">
<MemoInput storageKey="surfaceTreatmentDesc" v-model="form.coilSurfaceTreatment" placeholder="请输入钢卷表面处理" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="排产厚度(mm)" prop="scheduleThickness">
<el-input-number :controls="false" v-model="form.scheduleThickness" placeholder="请输入排产厚度" type="number"
:step="0.001" style="width: 100%;" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="生产开始时间" prop="productionStartTime">
<TimeInput v-model="form.productionStartTime" @input="calculateFormProductionDuration" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产结束时间" prop="productionEndTime">
<TimeInput v-model="form.productionEndTime" @input="calculateFormProductionDuration" :show-now-button="true" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="生产耗时" prop="productionDuration">
<el-input v-model="form.formattedDuration" placeholder="自动计算" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" v-if="form.coilId">
<el-col :span="12">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker v-model="form.createTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择创建时间" style="width: 100%;" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="创建人" prop="createBy">
<el-select v-model="form.createBy" placeholder="请选择创建人" style="width: 100%;" clearable filterable>
<el-option v-for="item in userList" :key="item.userName" :label="item.nickName" :value="item.userName" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" v-if="form.coilId">
<el-col :span="24">
<el-form-item label="绑定合同" prop="contractId">
<div style="display: flex; gap: 10px; width: 100%;">
<contract-select v-model="form.contractId" placeholder="请选择合同" style="flex: 1;" clearable mode="all" />
<el-button type="success" :loading="contractLoading" @click="saveContractRel">保存合同</el-button>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
@@ -848,9 +963,12 @@ import { getCoilTagPrintType } from '@/views/wms/coil/js/coilPrint';
import DragResizeBox from '@/components/DragResizeBox/index.vue';
import ProcessFlow from '../components/ProcessFlow.vue';
import WarehouseTree from '@/components/KLPService/WarehouseTree/index.vue';
import TimeInput from "@/components/TimeInput";
import ContractSelect from "@/components/KLPService/ContractSelect";
import { listDeliveryWaybillDetail, delDeliveryWaybillDetail } from "@/api/wms/deliveryWaybillDetail";
import { listDeliveryPlan } from "@/api/wms/deliveryPlan";
import { addCoilQualityRejudge } from "@/api/wms/coilQualityRejudge";
import { listCoilContractRel, addCoilContractRel, updateCoilContractRel } from "@/api/wms/coilContractRel";
export default {
name: "MaterialCoil",
@@ -874,6 +992,8 @@ export default {
ProcessFlow,
DragResizeBox,
WarehouseTree,
TimeInput,
ContractSelect,
},
dicts: ['product_coil_status', 'coil_material', 'coil_itemname', 'coil_manufacturer', 'coil_quality_status', 'wms_next_warehouse', 'coil_business_purpose'],
props: {
@@ -1006,6 +1126,8 @@ export default {
},
// 按钮loading
buttonLoading: false,
contractLoading: false,
contractRelId: null,
showProcessFlow: false,
// 遮罩层
loading: true,
@@ -1245,9 +1367,7 @@ export default {
},
},
created() {
if (this.showExportTime) {
this.getUserList();
}
this.getUserList();
if (this.useWarehouseIds) {
this.warehouseIds = this.warehouseOptions.map(item => item.value).join(',');
}
@@ -1725,6 +1845,25 @@ export default {
this.$set(this.productionTimeForm, 'formattedDuration', '');
}
},
// 计算表单中的生产耗时
calculateFormProductionDuration() {
const { productionStartTime, productionEndTime } = this.form;
if (productionStartTime && productionEndTime) {
const start = new Date(productionStartTime).getTime();
const end = new Date(productionEndTime).getTime();
if (end < start) {
this.form.productionDuration = '';
this.form.formattedDuration = '';
} else {
const durationMs = end - start;
this.form.productionDuration = Math.round(durationMs / (1000 * 60));
this.form.formattedDuration = this.formatDuration(durationMs);
}
} else {
this.form.productionDuration = '';
this.form.formattedDuration = '';
}
},
// 处理生产时间提交
submitProductionTimeForm() {
this.$refs.productionTimeForm.validate((valid) => {
@@ -1986,6 +2125,45 @@ export default {
this.open = false;
this.reset();
},
loadContractRel(coilId) {
if (!coilId) {
this.contractRelId = null;
this.$set(this.form, 'contractId', null);
return;
}
listCoilContractRel({ coilId }).then(res => {
const rows = res.rows || [];
if (rows.length > 0) {
this.contractRelId = rows[0].relId;
this.$set(this.form, 'contractId', rows[0].contractId);
} else {
this.contractRelId = null;
this.$set(this.form, 'contractId', null);
}
});
},
saveContractRel() {
this.contractLoading = true;
listCoilContractRel({ coilId: this.form.coilId }).then(res => {
const rows = res.rows || [];
if (rows.length > 0) {
return updateCoilContractRel({
relId: rows[0].relId,
coilId: this.form.coilId,
contractId: this.form.contractId
});
} else {
return addCoilContractRel({
coilId: this.form.coilId,
contractId: this.form.contractId
});
}
}).then(() => {
this.$message.success('合同绑定保存成功');
}).finally(() => {
this.contractLoading = false;
});
},
// 表单重置
reset() {
this.form = {
@@ -2013,6 +2191,15 @@ export default {
materialType: '原料',
temperGrade: undefined,
coatingType: undefined,
qualityStatus: undefined,
actualLength: undefined,
actualWidth: undefined,
scheduleThickness: undefined,
productionStartTime: undefined,
productionEndTime: undefined,
productionDuration: undefined,
formattedDuration: undefined,
contractId: undefined,
};
this.resetForm("form");
},
@@ -2072,6 +2259,12 @@ export default {
}
}
if (this.form.productionDuration) {
this.form.formattedDuration = this.formatDuration(this.form.productionDuration * 60 * 1000);
}
this.loadContractRel(coilId);
this.open = true;
this.title = "修改钢卷物料";
});
@@ -2178,6 +2371,12 @@ export default {
}
}
if (this.form.productionDuration) {
this.form.formattedDuration = this.formatDuration(this.form.productionDuration * 60 * 1000);
}
this.loadContractRel(coilId);
this.open = true;
this.title = "修改钢卷物料";
});

View File

@@ -41,14 +41,15 @@
<muti-select v-model="queryParams.qualityStatusCsv" :options="dict.type.coil_quality_status"
placeholder="请选择品质" clearable />
</el-form-item>
<!-- <el-form-item label="导出模式" prop="abnormalExportCount">
<el-radio-group v-model="abnormalExportCount">
<el-radio-button :label="0">多行导出</el-radio-button>
<el-radio-button :label="1">单行拼接</el-radio-button>
</el-radio-group>
</el-form-item> -->
<el-form-item label="业务员" prop="saleName">
<el-input style="width: 200px;" v-model="queryParams.saleName" placeholder="请输入业务员" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="合同号" prop="contractNo">
<el-input style="width: 200px;" v-model="queryParams.contractNo" placeholder="请输入合同号" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<!-- <el-button type="primary" @click="getList">查询</el-button> -->
<el-dropdown split-button type="primary" @click="getList" @command="handleCommand">
查询
<el-dropdown-menu slot="dropdown">
@@ -57,14 +58,8 @@
<el-dropdown-item command="exportDataMore">导出产出钢卷(多行)</el-dropdown-item>
<el-dropdown-item command="exportLossDataMore">导出消耗钢卷(多行)</el-dropdown-item>
<!-- <el-dropdown-item command="saveOutputReport">保存产出报表</el-dropdown-item>
<el-dropdown-item command="saveLossReport">保存消耗报表</el-dropdown-item> -->
</el-dropdown-menu>
</el-dropdown>
<!-- <el-button type="primary" @click="exportData">导出产出钢卷</el-button>
<el-button type="primary" @click="exportLossData">导出消耗钢卷</el-button>
<el-button type="primary" @click="saveOutputReport">保存产出报表</el-button>
<el-button type="primary" @click="saveLossReport">保存消耗报表</el-button> -->
</el-form-item>
</el-form>
</el-row>

View File

@@ -38,6 +38,15 @@
<muti-select v-model="queryParams.qualityStatusCsv" :options="dict.type.coil_quality_status"
placeholder="请选择品质" clearable />
</el-form-item>
<el-form-item label="业务员" prop="saleName">
<el-input style="width: 200px;" v-model="queryParams.saleName" placeholder="请输入业务员" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="合同号" prop="contractNo">
<el-input style="width: 200px;" v-model="queryParams.contractNo" placeholder="请输入合同号" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item prop="endTime">
<el-button type="primary" @click="getList">查询</el-button>
<el-button type="primary" @click="exportData">导出</el-button>

View File

@@ -99,6 +99,12 @@
<warehouse-select v-model="queryParams.warehouseId" placeholder="请选择仓库/库区/库位"
style="width: 100%; display: inline-block; width: 200px;" clearable />
</el-form-item>
<el-form-item label="业务员" prop="saleName">
<el-input v-model="queryParams.saleName" placeholder="请输入业务员" clearable size="small" />
</el-form-item>
<el-form-item label="合同号" prop="contractNo">
<el-input v-model="queryParams.contractNo" placeholder="请输入合同号" clearable size="small" />
</el-form-item>
</template>
<template v-else>
<el-form-item label="入场钢卷号" prop="enterCoilNo">
@@ -134,6 +140,12 @@
<muti-select v-model="queryParams.qualityStatusCsv" :options="dict.type.coil_quality_status"
placeholder="请选择品质" clearable />
</el-form-item>
<el-form-item label="业务员" prop="saleName">
<el-input v-model="queryParams.saleName" placeholder="请输入业务员" clearable size="small" />
</el-form-item>
<el-form-item label="合同号" prop="contractNo">
<el-input v-model="queryParams.contractNo" placeholder="请输入合同号" clearable size="small" />
</el-form-item>
</template>
<el-form-item>
<el-button type="primary" @click="handleQuery">查询</el-button>
@@ -541,7 +553,7 @@ export default {
'材质属性': ['material', 'manufacturer', 'surfaceTreatmentDesc', 'zincLayer', 'packingStatus', 'temperGrade', 'coatingType', 'chromePlateCoilNo'],
'用途': ['purpose', 'businessPurpose'],
'状态': ['qualityStatus', 'statusDesc', 'isRelatedToOrderText'],
'其他': ['itemName', 'itemId', 'packagingRequirement', 'trimmingRequirement', 'transferType', 'saleName', 'remark', 'team'],
'其他': ['itemName', 'itemId', 'packagingRequirement', 'trimmingRequirement', 'transferType', 'contractNo', 'saleName', 'remark', 'team'],
},
queryParams: {
startTime: start,