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

View File

@@ -83,19 +83,26 @@
<el-input v-model="queryParams.remark" placeholder="请输入备注" clearable size="small" /> <el-input v-model="queryParams.remark" placeholder="请输入备注" clearable size="small" />
</el-form-item> </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" <el-button v-if="multiple" type="primary" size="small" icon="el-icon-check"
@click="handleSelectAllCurrentPage">全选当前卷</el-button> @click="handleSelectAllCurrentPage">全选当前卷</el-button>
<el-checkbox v-if="orderBy" style="margin-left: 10px;" v-model="showCoilMap" <el-checkbox v-if="orderBy" style="margin-left: 10px;" v-model="showCoilMap"
size="small">显示钢卷地图</el-checkbox> size="small">显示钢卷地图</el-checkbox>
<el-checkbox v-if="orderBy && orderId" style="margin-left: 10px;" v-model="showOrderInfo" <el-checkbox v-if="orderBy && orderId" style="margin-left: 10px;" v-model="showOrderInfo"
size="small">显示订单详情</el-checkbox> size="small">显示订单详情</el-checkbox>
</el-form-item> </el-form-item>
</el-form> </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 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 icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
<el-button type="warning" size="small" icon="el-icon-setting" <el-button type="warning" size="small" icon="el-icon-setting"

View File

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

View File

@@ -83,6 +83,14 @@
@keyup.enter.native="handleQuery" /> @keyup.enter.native="handleQuery" />
</el-form-item> </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-form-item v-if="showWaybill" label="发货状态">
<el-radio-group v-model="queryParams.status" @change="handleQuery"> <el-radio-group v-model="queryParams.status" @change="handleQuery">
<el-radio-button label="">全部</el-radio-button> <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-button type="info" plain icon="el-icon-download" size="mini" @click="handleExportAllProps">导出全部</el-button>
</el-col> </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" <el-button type="info" plain icon="el-icon-printer" size="mini" :disabled="multiple"
@click="handleBatchPrintLabel">批量打印标签</el-button> @click="handleBatchPrintLabel">批量打印标签</el-button>
</el-col>
<!-- <el-col :span="2" v-if="showWaybill">
</el-col> --> </el-col> -->
<el-col :span="1.5" v-if="showOrderBy"> <el-col :span="1.5" v-if="showOrderBy">
<el-checkbox v-model="queryParams.orderBy" v-loading="loading" @change="getList" <el-checkbox v-model="queryParams.orderBy" v-loading="loading" @change="getList"
label="orderBy">按实际库区排序</el-checkbox> label="orderBy">按实际库区排序</el-checkbox>
@@ -187,6 +193,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="业务员" align="center" prop="saleName" width="60" /> <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 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="长度 (米)" align="center" prop="length" v-if="showLength" />
<el-table-column label="发货时间" v-if="showExportTime" align="center" prop="exportTime" width="205"> <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="material"></el-table-column>
<el-table-column v-if="moreColumn" label="厂家" prop="manufacturer"></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="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="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="trimmingRequirement"></el-table-column>
<el-table-column v-if="moreColumn" label="包装" prop="packagingRequirement"></el-table-column> <el-table-column v-if="moreColumn" label="包装" prop="packagingRequirement"></el-table-column>
@@ -402,111 +409,219 @@
@pagination="getList" /> @pagination="getList" />
</div> </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 ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="入场钢卷号" prop="enterCoilNo"> <el-row :gutter="20">
<el-input v-model="form.enterCoilNo" placeholder="请输入入场钢卷号" :disabled="form.coilId" /> <el-col :span="12">
</el-form-item> <el-form-item label="入场钢卷号" prop="enterCoilNo">
<el-form-item label="当前钢卷号" prop="currentCoilNo"> <el-input v-model="form.enterCoilNo" placeholder="请输入入场钢卷号" :disabled="!!form.coilId" />
<el-input v-model="form.currentCoilNo" placeholder="请输入当前钢卷号" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="厂家原料卷号" prop="supplierCoilNo"> <el-col :span="12">
<el-input v-model="form.supplierCoilNo" placeholder="请输入厂家原料卷号" /> <el-form-item label="当前钢卷号" prop="currentCoilNo">
</el-form-item> <el-input v-model.trim="form.currentCoilNo" placeholder="请输入当前钢卷号" />
<el-form-item label="所在库位" prop="warehouseId"> </el-form-item>
<warehouse-select v-model="form.warehouseId" placeholder="请选择仓库/库区/库位" style="width: 100%;" clearable /> </el-col>
</el-form-item> </el-row>
<el-form-item label="实际库区" prop="actualWarehouseId"> <el-row :gutter="20">
<actual-warehouse-select v-model="form.actualWarehouseId" :clearInput="form.coilId != null" <el-col :span="12">
placeholder="请选择实际库区" style="width: 100%;" clearable /> <el-form-item label="厂家原料卷号" prop="supplierCoilNo">
</el-form-item> <el-input v-model.trim="form.supplierCoilNo" placeholder="请输入厂家原料卷号" />
<el-form-item label="班组" prop="team"> </el-form-item>
<el-select v-model="form.team" placeholder="请选择班组" style="width: 100%"> </el-col>
<el-option key="甲" label="甲" value="甲" /> <el-col :span="12">
<el-option key="乙" label="乙" value="乙" /> <el-form-item label="所在库位" prop="warehouseId">
</el-select> <warehouse-select v-model="form.warehouseId" placeholder="请选择仓库/库区/库位" style="width: 100%;" clearable />
</el-form-item> </el-form-item>
<el-form-item label="材料类型" prop="materialType"> </el-col>
<el-select v-model="form.materialType" placeholder="请选择材料类型" @change="handleMaterialTypeChange"> </el-row>
<el-option label="成品" value="成品" /> <el-row :gutter="20">
<el-option label="原料" value="原料" /> <el-col :span="12">
</el-select> <el-form-item label="实际库区" prop="actualWarehouseId">
</el-form-item> <actual-warehouse-select v-model="form.actualWarehouseId" placeholder="请选择实际库区" style="width: 100%;"
<el-form-item :label="getItemLabel" prop="itemId"> clearable />
<product-select v-if="form.itemType == 'product'" v-model="form.itemId" placeholder="请选择成品" </el-form-item>
style="width: 100%;" clearable /> </el-col>
<raw-material-select v-else-if="form.itemType == 'raw_material'" v-model="form.itemId" placeholder="请选择原料" <el-col :span="12">
style="width: 100%;" clearable /> <el-form-item label="班组" prop="team">
<div v-else>请先选择材料类型</div> <el-select v-model="form.team" placeholder="请选择班组" style="width: 100%">
</el-form-item> <el-option key="甲" label="甲" value="甲" />
<!-- <el-form-item label="质量状态" prop="qualityStatus"> <el-option key="乙" label="乙" value="乙" />
<el-select v-model="form.qualityStatus" placeholder="请选择质量状态" style="width: 100%"> </el-select>
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label" </el-form-item>
:value="item.value" /> </el-col>
</el-select> </el-row>
</el-form-item> --> <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="切边要求" prop="trimmingRequirement"> <el-form-item label="材料类型" prop="materialType">
<el-select v-model="form.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%"> <el-select v-model="form.materialType" placeholder="请选择材料类型" @change="handleMaterialTypeChange">
<el-option label="净边料" value="净边料" /> <el-option label="成品" value="成品" />
<el-option label="毛边料" value="毛边料" /> <el-option label="料" value="料" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col>
<el-form-item label="原料材质" prop="packingStatus"> <el-col :span="12">
<el-input v-model="form.packingStatus" placeholder="请输入原料材质"> <el-form-item :label="getItemLabel" prop="itemId">
</el-input> <product-select v-if="form.itemType == 'product'" v-model="form.itemId" placeholder="请选择成品"
</el-form-item> style="width: 100%;" clearable />
<raw-material-select v-else-if="form.itemType == 'raw_material'" v-model="form.itemId" placeholder="请选择原料"
<el-form-item label="包装要求" prop="packagingRequirement"> style="width: 100%;" clearable />
<el-select v-model="form.packagingRequirement" placeholder="请选择包装要求" style="width: 100%"> <div v-else>请先选择材料类型</div>
<el-option label="裸包" value="裸包" /> </el-form-item>
<el-option label="普包" value="普包" /> </el-col>
<el-option label="简包" value="简包" /> </el-row>
<el-option label="精包" value="精包" /> <el-row :gutter="20">
</el-select> <el-col :span="12">
</el-form-item> <el-form-item label="质量状态" prop="qualityStatus">
<el-form-item label="毛重" prop="grossWeight"> <el-select v-model="form.qualityStatus" placeholder="请选择质量状态" style="width: 100%">
<el-input v-model="form.grossWeight" placeholder="请输入毛重" /> <el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label"
</el-form-item> :value="item.value" />
<el-form-item label="净重" prop="netWeight"> </el-select>
<el-input v-model="form.netWeight" placeholder="请输入净重" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="长度" prop="length" v-if="showLength"> <el-col :span="12">
<el-input v-model="form.length" placeholder="请输入长度" /> <el-form-item label="切边要求" prop="trimmingRequirement">
</el-form-item> <el-select v-model="form.trimmingRequirement" placeholder="请选择切边要求" style="width: 100%">
<el-form-item label="实测长度(m)" prop="actualLength"> <el-option label="净边料" value="净边料" />
<el-input-number :controls="false" v-model="form.actualLength" placeholder="请输入实测长度" type="number" <el-option label="毛边料" value="毛边料" />
:step="0.01" /> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="实测厚度(mm)" prop="actualThickness" class="form-item-half"> </el-col>
<el-input-number :controls="false" v-model="form.actualThickness" placeholder="请输入实测厚度" type="number" </el-row>
:step="0.01" /> <el-row :gutter="20">
</el-form-item> <el-col :span="12">
<el-form-item label="实测宽度(mm)" prop="actualWidth"> <el-form-item label="原料材质" prop="packingStatus">
<el-input-number :controls="false" v-model="form.actualWidth" placeholder="请输入实测宽度" type="number" <el-input v-model="form.packingStatus" placeholder="请输入原料材质" />
:step="0.01" /> </el-form-item>
</el-form-item> </el-col>
<el-form-item label="业务目的" prop="businessPurpose"> <el-col :span="12">
<el-select v-model="form.businessPurpose" placeholder="业务目的" filterable> <el-form-item label="包装要求" prop="packagingRequirement">
<el-option v-for="item in dict.type.coil_business_purpose" :key="item.value" :value="item.value" <el-select v-model="form.packagingRequirement" placeholder="请选择包装要求" style="width: 100%">
:label="item.label" /> <el-option label="裸包" value="裸包" />
</el-select> <el-option label="普包" value="普包" />
</el-form-item> <el-option label="简包" value="简包" />
<el-form-item label="调制度" prop="temperGrade"> <el-option label="精包" value="精包" />
<el-input v-model="form.temperGrade" placeholder="请输入调制度" /> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="镀层种类" prop="coatingType"> </el-col>
<MemoInput storageKey="coatingType" v-model="form.coatingType" placeholder="请输入镀层种类" /> </el-row>
</el-form-item> <el-row :gutter="20">
<el-form-item label="钢卷表面处理" prop="coilSurfaceTreatment"> <el-col :span="12">
<MemoInput storageKey="surfaceTreatmentDesc" v-model="form.coilSurfaceTreatment" placeholder="请输入钢卷表面处理" /> <el-form-item label="毛重" prop="grossWeight">
</el-form-item> <el-input v-model="form.grossWeight" placeholder="请输入毛重" />
<el-form-item label="备注" prop="remark"> </el-form-item>
<el-input v-model="form.remark" placeholder="请输入备注" /> </el-col>
</el-form-item> <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> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button> <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 DragResizeBox from '@/components/DragResizeBox/index.vue';
import ProcessFlow from '../components/ProcessFlow.vue'; import ProcessFlow from '../components/ProcessFlow.vue';
import WarehouseTree from '@/components/KLPService/WarehouseTree/index.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 { listDeliveryWaybillDetail, delDeliveryWaybillDetail } from "@/api/wms/deliveryWaybillDetail";
import { listDeliveryPlan } from "@/api/wms/deliveryPlan"; import { listDeliveryPlan } from "@/api/wms/deliveryPlan";
import { addCoilQualityRejudge } from "@/api/wms/coilQualityRejudge"; import { addCoilQualityRejudge } from "@/api/wms/coilQualityRejudge";
import { listCoilContractRel, addCoilContractRel, updateCoilContractRel } from "@/api/wms/coilContractRel";
export default { export default {
name: "MaterialCoil", name: "MaterialCoil",
@@ -874,6 +992,8 @@ export default {
ProcessFlow, ProcessFlow,
DragResizeBox, DragResizeBox,
WarehouseTree, WarehouseTree,
TimeInput,
ContractSelect,
}, },
dicts: ['product_coil_status', 'coil_material', 'coil_itemname', 'coil_manufacturer', 'coil_quality_status', 'wms_next_warehouse', 'coil_business_purpose'], dicts: ['product_coil_status', 'coil_material', 'coil_itemname', 'coil_manufacturer', 'coil_quality_status', 'wms_next_warehouse', 'coil_business_purpose'],
props: { props: {
@@ -1006,6 +1126,8 @@ export default {
}, },
// 按钮loading // 按钮loading
buttonLoading: false, buttonLoading: false,
contractLoading: false,
contractRelId: null,
showProcessFlow: false, showProcessFlow: false,
// 遮罩层 // 遮罩层
loading: true, loading: true,
@@ -1245,9 +1367,7 @@ export default {
}, },
}, },
created() { created() {
if (this.showExportTime) { this.getUserList();
this.getUserList();
}
if (this.useWarehouseIds) { if (this.useWarehouseIds) {
this.warehouseIds = this.warehouseOptions.map(item => item.value).join(','); this.warehouseIds = this.warehouseOptions.map(item => item.value).join(',');
} }
@@ -1725,6 +1845,25 @@ export default {
this.$set(this.productionTimeForm, 'formattedDuration', ''); 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() { submitProductionTimeForm() {
this.$refs.productionTimeForm.validate((valid) => { this.$refs.productionTimeForm.validate((valid) => {
@@ -1986,6 +2125,45 @@ export default {
this.open = false; this.open = false;
this.reset(); 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() { reset() {
this.form = { this.form = {
@@ -2013,6 +2191,15 @@ export default {
materialType: '原料', materialType: '原料',
temperGrade: undefined, temperGrade: undefined,
coatingType: undefined, coatingType: undefined,
qualityStatus: undefined,
actualLength: undefined,
actualWidth: undefined,
scheduleThickness: undefined,
productionStartTime: undefined,
productionEndTime: undefined,
productionDuration: undefined,
formattedDuration: undefined,
contractId: undefined,
}; };
this.resetForm("form"); 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.open = true;
this.title = "修改钢卷物料"; 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.open = true;
this.title = "修改钢卷物料"; this.title = "修改钢卷物料";
}); });

View File

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

View File

@@ -38,6 +38,15 @@
<muti-select v-model="queryParams.qualityStatusCsv" :options="dict.type.coil_quality_status" <muti-select v-model="queryParams.qualityStatusCsv" :options="dict.type.coil_quality_status"
placeholder="请选择品质" clearable /> placeholder="请选择品质" clearable />
</el-form-item> </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-form-item prop="endTime">
<el-button type="primary" @click="getList">查询</el-button> <el-button type="primary" @click="getList">查询</el-button>
<el-button type="primary" @click="exportData">导出</el-button> <el-button type="primary" @click="exportData">导出</el-button>

View File

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