feat(wms): 添加管制卷移库记录和管件信息缺失预警功能

新增管制卷移库记录管理模块,支持查询、标记完成、重新移库操作
新增成品入库管件信息为空预警定时任务
新增前端管制卷移库记录页面
子卷定级接口添加处理结果字段获取和保存到数据库
外箱标签打印改为| 为分隔符,适配公司名称中带,情况
This commit is contained in:
yangyufu
2026-08-10 13:58:20 +08:00
parent ff31082748
commit e3d169901b
23 changed files with 1904 additions and 58 deletions

View File

@@ -0,0 +1,254 @@
<template>
<div class="app-container">
<!--工具栏-->
<div class="head-container">
<div v-if="crud.props.searchToggle">
<!-- 搜索 -->
<el-form
:inline="true"
class="demo-form-inline"
label-position="right"
label-width="80px"
label-suffix=":"
>
<el-form-item label="子卷号">
<el-input
v-model="query.container_name"
size="mini"
clearable
placeholder="子卷号"
@keyup.enter.native="crud.toQuery"
/>
</el-form-item>
<el-form-item label="状态">
<el-select
v-model="query.status"
clearable
size="mini"
placeholder="全部"
class="filter-item"
@change="crud.toQuery"
>
<el-option label="已完成" value="1" />
<el-option label="未完成" value="0" />
<el-option label="移库异常" value="9" />
</el-select>
</el-form-item>
<el-form-item label="移库单据号" label-width="100px">
<el-input
v-model="query.move_bill_code"
size="mini"
clearable
placeholder="移库单据号"
@keyup.enter.native="crud.toQuery"
/>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker
v-model="query.createTime"
type="daterange"
value-format="yyyy-MM-dd HH:mm:ss"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']"
@change="crud.toQuery"
/>
</el-form-item>
<rrOperation />
</el-form>
</div>
<!--操作栏-->
<crudOperation :permission="permission" />
<el-button
type="success"
icon="el-icon-check"
size="mini"
:disabled="!canOperate"
@click="handleMarkComplete(crud.selections[0])"
>
标记完成
</el-button>
<el-button
type="warning"
icon="el-icon-refresh"
size="mini"
:disabled="!canOperate"
@click="handleRetryMove(crud.selections[0])"
>
重新移库
</el-button>
<div style="margin-bottom: 10px"></div>
<!--表格渲染-->
<el-table
ref="table"
v-loading="crud.loading"
size="mini"
:data="crud.data"
highlight-current-row
style="width: 100%;"
@selection-change="crud.selectionChangeHandler"
>
<el-table-column type="selection" width="55" />
<el-table-column show-overflow-tooltip label="移库单据号" width="150">
<template slot-scope="scope">
<span style="color: #f89b0c; font-weight: bold;">{{ scope.row.move_bill_code }}</span>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip prop="container_name" label="子卷号" width="180" />
<el-table-column show-overflow-tooltip prop="status" label="状态" width="100">
<template slot-scope="scope">
<el-tag v-if="scope.row.status === '1'" type="success" size="mini">已完成</el-tag>
<el-tag v-else-if="scope.row.status === '0'" type="info" size="mini">未完成</el-tag>
<el-tag v-else-if="scope.row.status === '9'" type="danger" size="mini">移库异常</el-tag>
<span v-else>{{ scope.row.status }}</span>
</template>
</el-table-column>
<el-table-column show-overflow-tooltip prop="old_level" label="旧级别" width="80" :render-header="renderLevelHeader" />
<el-table-column show-overflow-tooltip prop="old_result" label="旧处理结果" width="120" />
<el-table-column show-overflow-tooltip prop="new_level" label="新级别" width="80" :render-header="renderLevelHeader" />
<el-table-column show-overflow-tooltip prop="new_result" label="新处理结果" width="120" />
<el-table-column show-overflow-tooltip prop="result_message" label="操作结果" min-width="400" />
<el-table-column show-overflow-tooltip prop="create_optname" label="创建人" width="100" />
<el-table-column show-overflow-tooltip prop="create_time" label="创建时间" width="160" />
<el-table-column show-overflow-tooltip prop="update_optname" label="修改人" width="100" />
<el-table-column show-overflow-tooltip prop="update_time" label="修改时间" width="160" />
</el-table>
<!--分页组件-->
<pagination />
</div>
<!--移库单详情弹窗复用moveStor的AddDialog-->
<AddDialog @AddChanged="crud.toQuery" />
</div>
</template>
<script>
import levelchangedtl from '@/views/wms/st/levelchange/levelchangedtl'
import CRUD, { crud, header, presenter } from '@crud/crud'
import rrOperation from '@crud/RR.operation'
import crudOperation from '@crud/CRUD.operation'
import pagination from '@crud/Pagination'
import request from '@/utils/request'
import AddDialog from '@/views/wms/st/inStor/moveStor/AddDialog'
export default {
name: 'Levelchangedtl',
components: { crudOperation, rrOperation, pagination, AddDialog },
cruds() {
return CRUD({
title: '管制卷移库记录',
url: '/api/levelchangedtl',
idField: 'id',
sort: 'create_time,desc',
crudMethod: { ...levelchangedtl },
optShow: {
add: false,
edit: false,
del: false,
download: false,
reset: true
},
queryOnPresenterCreated: false
})
},
mixins: [presenter(), header(), crud()],
data() {
return {
permission: {
add: ['admin', 'levelchangedtl:add'],
edit: ['admin', 'levelchangedtl:edit'],
del: ['admin', 'levelchangedtl:del']
}
}
},
computed: {
canOperate() {
if (this.crud.selections.length === 0) return false
const row = this.crud.selections[0]
return row.status === '0' || row.status === '9'
}
},
created() {
this.initQuery()
},
methods: {
// 自定义级别列表头(含问号提示)
renderLevelHeader(h, { column }) {
return h('span', [
h('span', column.label || '级别'),
h('el-tooltip', {
props: {
effect: 'dark',
placement: 'top',
content: '级别对应关系说明:\n 6级 → 管制、\n 5级→报废、\n 4级→改切 、\n 3级→A- 、\n 2级→A 、\n 1级→A+'
}
}, [
h('i', {
class: 'el-icon-question',
style: { marginLeft: '4px', color: '#909399', cursor: 'pointer', fontSize: '14px' }
})
])
])
},
handleMarkComplete(row) {
this.$confirm('确认将子卷 ' + row.container_name + ' 标记为完成吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
levelchangedtl.markComplete(row).then(res => {
this.crud.notify('标记完成成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.crud.toQuery()
})
}).catch(() => {})
},
handleRetryMove(row) {
this.$confirm('确认对子卷 ' + row.container_name + ' 重新执行移库操作吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
levelchangedtl.retryMove(row).then(res => {
this.crud.notify('重新移库完成', CRUD.NOTIFICATION_TYPE.SUCCESS)
this.crud.toQuery()
})
}).catch(() => {
this.crud.toQuery()
})
},
/* 搜索框创建时间默认最近一周 */
initQuery() {
const end = new Date()
const start = new Date()
const endYear = end.getFullYear()
var endMonth = end.getMonth() + 1
if (end.getMonth() + 1 < 10) {
endMonth = '0' + endMonth.toString()
}
var endDay = end.getDate()
if (end.getDate() < 10) {
endDay = '0' + endDay.toString()
}
const endDate = endYear + '-' + endMonth + '-' + endDay + ' 23:59:59'
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
const startYear = start.getFullYear()
var startMonth = start.getMonth() + 1
if (start.getMonth() + 1 < 10) {
startMonth = '0' + startMonth.toString()
}
var startDay = start.getDate()
if (start.getDate() < 10) {
startDay = '0' + startDay.toString()
}
const startDate = startYear + '-' + startMonth + '-' + startDay + ' 00:00:00'
this.$set(this.query, 'createTime', [startDate, endDate])
this.crud.toQuery()
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
::v-deep .el-dialog__body {
padding-top: 10px;
}
</style>

View File

@@ -0,0 +1,43 @@
import request from '@/utils/request'
export function add(data) {
return request({
url: '/api/levelchangedtl',
method: 'post',
data
})
}
export function del(ids) {
return request({
url: '/api/levelchangedtl',
method: 'delete',
data: ids
})
}
export function edit(data) {
return request({
url: '/api/levelchangedtl',
method: 'put',
data
})
}
export function retryMove(data) {
return request({
url: '/api/levelchangedtl/retryMove',
method: 'post',
data
})
}
export function markComplete(data) {
return request({
url: '/api/levelchangedtl/markComplete',
method: 'post',
data
})
}
export default { add, edit, del, retryMove, markComplete }

View File

@@ -160,7 +160,38 @@
size="mini"
placeholder="请选择"
class="filter-item"
@change="crud.toQuery"
>
<el-option
v-for="item in dict.IS_OR_NOT"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="管件信息是否为空" label-width="140px">
<el-select
v-model="query.is_empty"
clearable
size="mini"
placeholder="请选择"
class="filter-item"
>
<el-option
v-for="item in dict.IS_OR_NOT"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="是否有库存" label-width="140px">
<el-select
v-model="query.is_join"
clearable
size="mini"
placeholder="请选择"
class="filter-item"
>
<el-option
v-for="item in dict.IS_OR_NOT"