forked from BaoKaiWms/202501-Wms-Kate-Wuxi
849 lines
35 KiB
Vue
849 lines
35 KiB
Vue
|
|
<template>
|
|||
|
|
<el-config-provider :locale="zhCn">
|
|||
|
|
<el-container class="content">
|
|||
|
|
<div class="work-area">
|
|||
|
|
<fieldset class="main-area">
|
|||
|
|
<el-form ref="workFormRef" :model="workFormEntity" :label-position="labelPosition"
|
|||
|
|
label-width="158px" style="max-width: 100%" :rules="rules" status-icon>
|
|||
|
|
<div style="display: flex; justify-content: space-between;">
|
|||
|
|
<el-row>
|
|||
|
|
<el-form-item label="计划开工日期" prop="planStartDate">
|
|||
|
|
<el-date-picker v-model="workFormEntity.planStartDate" type="date"
|
|||
|
|
placeholder="选择开工日期" :shortcuts="shortcuts" style="width: 196px;" clearable />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="工单号" prop="workOrder">
|
|||
|
|
<el-select v-model="workFormEntity.workOrder" filterable default-first-option
|
|||
|
|
placeholder="请选择工单号" style="width: 196px" :loading="optionLoading" remote
|
|||
|
|
:remote-method="(query) => {
|
|||
|
|
workFormQuery.workOrder = query
|
|||
|
|
initWorkOptions()
|
|||
|
|
}" remote-show-suffix reserve-keyword clearable>
|
|||
|
|
<el-option v-for="item in workOptions.workOrder" :key="item" :label="item"
|
|||
|
|
:value="item" />
|
|||
|
|
</el-select>
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="原始成品号" prop="productIdOrigin">
|
|||
|
|
<el-input v-model="workFormEntity.productIdOrigin" placeholder="原始成品号" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="过滤成品号" prop="productId">
|
|||
|
|
<el-input v-model="workFormEntity.productId" placeholder="过滤成品号" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="单片号" prop="singleProductId">
|
|||
|
|
<el-select v-model="workFormEntity.singleProductId" filterable default-first-option
|
|||
|
|
placeholder="请选择单片号" style="width: 196px" :loading="optionLoading" remote
|
|||
|
|
:remote-method="(query) => {
|
|||
|
|
workFormQuery.singleProductId = query
|
|||
|
|
initWorkOptions()
|
|||
|
|
}" remote-show-suffix reserve-keyword clearable>
|
|||
|
|
<el-option v-for="item in workOptions.singleProductId" :key="item" :label="item"
|
|||
|
|
:value="item" />
|
|||
|
|
</el-select>
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="料盒号" prop="boxNo">
|
|||
|
|
<el-select v-model="workFormEntity.boxNo" filterable default-first-option
|
|||
|
|
placeholder="请选择料盒号" style="width: 196px" :loading="optionLoading" remote
|
|||
|
|
:remote-method="(query) => {
|
|||
|
|
workFormQuery.boxNo = query
|
|||
|
|
initWorkOptions()
|
|||
|
|
}" remote-show-suffix reserve-keyword clearable>
|
|||
|
|
<el-option v-for="item in workOptions.boxNo" :key="item" :label="item"
|
|||
|
|
:value="item" />
|
|||
|
|
</el-select>
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="原材料号" prop="goodsId">
|
|||
|
|
<el-select v-model="workFormEntity.goodsId" filterable default-first-option
|
|||
|
|
placeholder="请选择原材料号" style="width: 196px" :loading="optionLoading" remote
|
|||
|
|
:remote-method="(query) => {
|
|||
|
|
workFormQuery.goodsId = query
|
|||
|
|
initWorkOptions()
|
|||
|
|
}" remote-show-suffix reserve-keyword clearable>
|
|||
|
|
<el-option v-for="item in workOptions.goodsId" :key="item" :label="item"
|
|||
|
|
:value="item" />
|
|||
|
|
</el-select>
|
|||
|
|
</el-form-item>
|
|||
|
|
</el-row>
|
|||
|
|
<el-row>
|
|||
|
|
<el-button type="success"
|
|||
|
|
style="height: 50px; width: 100px; margin: auto 5px auto 5px; font-size: large; color: black;"
|
|||
|
|
@click="confirmStart()">确认配料</el-button>
|
|||
|
|
<el-button type="warning"
|
|||
|
|
style="height: 50px; width: 100px; margin: auto 5px auto 5px; font-size: large; color: black;"
|
|||
|
|
@click="resetWorkFormQuery()">清除选择</el-button>
|
|||
|
|
</el-row>
|
|||
|
|
</div>
|
|||
|
|
</el-form>
|
|||
|
|
</fieldset>
|
|||
|
|
<fieldset class="confirm-area">
|
|||
|
|
<el-form ref="confirmRef" :model="confirmEntity" :label-position="labelPosition" label-width="158px"
|
|||
|
|
style="max-width: 100%" :rules="confirmRules" status-icon>
|
|||
|
|
<div style="display: flex; justify-content: space-between;">
|
|||
|
|
<el-row>
|
|||
|
|
<el-row style="border-bottom: dashed 1px black;">
|
|||
|
|
<el-form-item label="工单号" prop="workOrder">
|
|||
|
|
<el-input v-model="confirmEntity.workOrder" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="成品号" prop="productId">
|
|||
|
|
<el-input v-model="confirmEntity.productId" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="单片号" prop="singleProductId">
|
|||
|
|
<el-input v-model="confirmEntity.singleProductId" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="物料号" prop="goodsId">
|
|||
|
|
<el-input v-model="confirmEntity.goodsId" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="料盒号" prop="boxNo">
|
|||
|
|
<el-input v-model="confirmEntity.boxNo" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="计划拣选数量" prop="planPickQty">
|
|||
|
|
<el-input v-model="confirmEntity.planPickQty" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="实际拣选数量" prop="realPickQty">
|
|||
|
|
<el-input-number v-model.number="confirmEntity.realPickQty"
|
|||
|
|
controls-position="right" :min="0" clearable @change="changePlanQty()" />
|
|||
|
|
</el-form-item>
|
|||
|
|
</el-row>
|
|||
|
|
<el-row>
|
|||
|
|
<el-form-item label="箱号" prop="vehicleId">
|
|||
|
|
<el-input v-model="confirmEntity.vehicleId" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="存放区域" prop="putArea">
|
|||
|
|
<el-input v-model="confirmEntity.putArea" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="计划剩余数量" prop="planRemainQty" v-if="confirmEntity.isOut != 1">
|
|||
|
|
<el-input v-model="confirmEntity.planRemainQty" disabled />
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="实际剩余数量" prop="realRemainQty" v-if="confirmEntity.isOut != 1">
|
|||
|
|
<el-input-number v-model.number="confirmEntity.realRemainQty"
|
|||
|
|
controls-position="right" :min="0" clearable />
|
|||
|
|
</el-form-item>
|
|||
|
|
</el-row>
|
|||
|
|
</el-row>
|
|||
|
|
<el-row>
|
|||
|
|
<el-button type="primary"
|
|||
|
|
style="height: 50px; width: 100px; margin: auto 5px auto 5px; font-size: large; color: black;"
|
|||
|
|
@click="showBoxSummary()">显示料盒</el-button>
|
|||
|
|
<el-button type="success" ref="confirmReleaseBtn"
|
|||
|
|
style="height: 50px; width: 100px; margin: auto 5px auto 5px; font-size: large; color: black;"
|
|||
|
|
@click="confirmOrRelease()">确认/放行</el-button>
|
|||
|
|
<el-button type="warning"
|
|||
|
|
style="height: 50px; width: 100px; margin: auto 5px auto 5px; font-size: large; color: black;"
|
|||
|
|
@click="requestPrint()">打印标签</el-button>
|
|||
|
|
</el-row>
|
|||
|
|
</div>
|
|||
|
|
</el-form>
|
|||
|
|
</fieldset>
|
|||
|
|
<div class="table-area">
|
|||
|
|
<el-table :data="currentBoxGoodsList" stripe border class="table-class" max-height="350px"
|
|||
|
|
highlight-current-row :header-cell-style="{ 'text-align': 'center' }"
|
|||
|
|
:cell-style="{ 'text-align': 'center' }" @sort-change="handleSortChange">
|
|||
|
|
<el-table-column prop="goodsId" label="料号" min-width="120px" sortable="custom"
|
|||
|
|
show-overflow-tooltip />
|
|||
|
|
<el-table-column prop="needNum" label="需求数量" min-width="120px" sortable="custom"
|
|||
|
|
show-overflow-tooltip />
|
|||
|
|
<el-table-column prop="finishNum" label="已完成数量" min-width="120px" sortable="custom"
|
|||
|
|
show-overflow-tooltip />
|
|||
|
|
</el-table>
|
|||
|
|
<br />
|
|||
|
|
<el-pagination v-model:current-page="baseTableQuery.currentPage"
|
|||
|
|
v-model:page-size="baseTableQuery.pageSize" :page-sizes="[5, 10, 15]" :small="false"
|
|||
|
|
:disabled="false" :background="false" :default-page-size="5" @size-change="searchKittingGoods"
|
|||
|
|
@current-change="searchKittingGoods" layout="total, sizes, prev, pager, next, jumper"
|
|||
|
|
:total="baseTableQuery.total" />
|
|||
|
|
</div>
|
|||
|
|
<el-dialog v-model="boxShowFlag" title="料盒总览" width="50%" center :close="closeBoxSummary">
|
|||
|
|
<span>料盒信息</span>
|
|||
|
|
<el-table :data="boxSummary" stripe border class="table-class" max-height="200px"
|
|||
|
|
:header-cell-style="{ 'text-align': 'center' }" :cell-style="{ 'text-align': 'center' }">
|
|||
|
|
<el-table-column prop="workOrder" label="工单号" fixed="left" />
|
|||
|
|
<el-table-column prop="taoQty" label="套数" />
|
|||
|
|
<el-table-column prop="productId" label="总成号" />
|
|||
|
|
<el-table-column prop="singleProductId" label="成品/单片" />
|
|||
|
|
<el-table-column prop="boxNo" label="料盒号" />
|
|||
|
|
<el-table-column prop="boxQty" label="料盒数量" />
|
|||
|
|
</el-table>
|
|||
|
|
<span>缺料信息</span>
|
|||
|
|
<el-table :data="goodsLackSummary" stripe border class="table-class" max-height="450px"
|
|||
|
|
:header-cell-style="{ 'text-align': 'center' }" :cell-style="{ 'text-align': 'center' }">
|
|||
|
|
<el-table-column prop="goodsId" label="料号" fixed="left" />
|
|||
|
|
<el-table-column prop="needNum" label="需求数量" />
|
|||
|
|
<el-table-column prop="stockNum" label="库存数量" />
|
|||
|
|
<el-table-column prop="lackNum" label="缺料数量" />
|
|||
|
|
<el-table-column prop="remark" label="备注" />
|
|||
|
|
</el-table>
|
|||
|
|
</el-dialog>
|
|||
|
|
<div style="width: 0;height: 0;overflow: hidden">
|
|||
|
|
<button ref="printBtn" style="display: none;" v-print="printObj"></button>
|
|||
|
|
<div id="printArea" class="objectDialogFlowPrint">
|
|||
|
|
<div class="pageWarp" v-for="item in printTabs">
|
|||
|
|
<div class="print-tab-text">
|
|||
|
|
<div class="print-row-normal">工单:{{ item.workOrder }}</div>
|
|||
|
|
<div class="print-row-normal">总成:{{ item.productId }}</div>
|
|||
|
|
<div class="print-row-normal">单片:{{ item.singleProductId }}</div>
|
|||
|
|
<div class="print-row-normal">配料:{{ item.kittingDate }}</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="print-tab-text">
|
|||
|
|
<div class="print-row-normal">测试台:{{ item.testNo }}</div>
|
|||
|
|
<div class="print-row-normal">产量:{{ item.productionQty }}</div>
|
|||
|
|
<div class="print-row-normal">料盒号:{{ item.boxNo }}</div>
|
|||
|
|
<div class="print-row-normal">生产:{{ item.produceDate }}</div>
|
|||
|
|
</div>
|
|||
|
|
<div class="print-tab-image">
|
|||
|
|
<qrcode-vue
|
|||
|
|
:value="item.singleProductId == '' ? item.productId + '&' + item.boxNo : item.singleProductId + '&' + item.boxNo"
|
|||
|
|
:size="size" :foreground="color" level="H" />
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
<div style="width: 0;height: 0;overflow: hidden">
|
|||
|
|
<button ref="printLackGoodsBtn" style="display: none;"
|
|||
|
|
v-print="getPrintObj('printLackGoodsArea')"></button>
|
|||
|
|
<div id="printLackGoodsArea" class="objectDialogFlowPrint">
|
|||
|
|
<div class="pageWarp" v-for="item in lackGoodsForPrint">
|
|||
|
|
<div class="print-tab-full">
|
|||
|
|
<div class="print-row-big">料盒:{{ item.boxNo }}</div>
|
|||
|
|
<div class="print-row-big">料号:{{ item.goodsId }}</div>
|
|||
|
|
<div class="print-row-big">需求:{{ item.needNum }}</div>
|
|||
|
|
<div class="print-row-big">缺料:{{ item.needNum - item.finishNum }}</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</el-container>
|
|||
|
|
</el-config-provider>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup>
|
|||
|
|
import store from '@/store'
|
|||
|
|
import QrcodeVue from 'qrcode.vue'
|
|||
|
|
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
|
|||
|
|
import { queryKateWorks, initWorks, getCurrentWorks, confirmCurrentWork, getBoxesAndLacks, queryWorkingGoodsByPage, getLackGoods } from '@/api/kateWork.js'
|
|||
|
|
import { errorBox, successBox, warningBox } from '@/utils/myMessageBox.js'
|
|||
|
|
import { ElMessage } from 'element-plus'
|
|||
|
|
import { dateFormatter } from '@/utils/formatter.js'
|
|||
|
|
import { nextTick, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue'
|
|||
|
|
import { printObj, labelPosition, shortcuts, getPrintObj } from '@/constant/form'
|
|||
|
|
import { loading } from '@/utils/loading'
|
|||
|
|
import { genTableRequest } from '@/utils/generator.js'
|
|||
|
|
import { useRoute } from 'vue-router'
|
|||
|
|
const standId = store.getters.getStandId
|
|||
|
|
const userName = store.getters.getUserName
|
|||
|
|
let storeKittingWork = store.getters.getKittingWork
|
|||
|
|
let timer = ref()
|
|||
|
|
let optionLoading = ref(false)
|
|||
|
|
let workOptions = reactive({
|
|||
|
|
workOrder: [],
|
|||
|
|
singleProductId: [],
|
|||
|
|
boxNo: [],
|
|||
|
|
goodsId: []
|
|||
|
|
})
|
|||
|
|
let workFormRef = ref()
|
|||
|
|
let workFormEntity = reactive({
|
|||
|
|
workOrder: '',
|
|||
|
|
productIdOrigin: '',
|
|||
|
|
productId: '',
|
|||
|
|
singleProductId: '',
|
|||
|
|
boxNo: '',
|
|||
|
|
goodsId: '',
|
|||
|
|
planStartDate: null
|
|||
|
|
})
|
|||
|
|
let workFormQuery = reactive({
|
|||
|
|
workOrder: '',
|
|||
|
|
singleProductId: '',
|
|||
|
|
boxNo: '',
|
|||
|
|
goodsId: '',
|
|||
|
|
})
|
|||
|
|
const rules = reactive({
|
|||
|
|
workOrder: [
|
|||
|
|
{ required: true, message: '请选择工单号。' }
|
|||
|
|
]
|
|||
|
|
})
|
|||
|
|
let confirmRef = ref()
|
|||
|
|
let confirmEntity = reactive({
|
|||
|
|
workOrder: storeKittingWork.workOrder,
|
|||
|
|
productId: storeKittingWork.productId,
|
|||
|
|
singleProductId: storeKittingWork.singleProductId,
|
|||
|
|
boxNo: storeKittingWork.boxNo
|
|||
|
|
})
|
|||
|
|
let confirmRules = reactive({})
|
|||
|
|
let boxShowFlag = ref(false)
|
|||
|
|
let boxSummary = ref([])
|
|||
|
|
let goodsLackSummary = ref([])
|
|||
|
|
let pauseGetWorkFlag = ref(false)
|
|||
|
|
let printTabs = ref([])
|
|||
|
|
let currentBoxGoodsList = ref([])
|
|||
|
|
let baseTableQuery = reactive({
|
|||
|
|
currentPage: 1,
|
|||
|
|
pageSize: 5,
|
|||
|
|
total: 0,
|
|||
|
|
sortBy: new Map([['goodsId', true]]),// 按照料号顺序排序
|
|||
|
|
standId: store.getters.getStandId,
|
|||
|
|
userName: store.getters.getUserName
|
|||
|
|
})
|
|||
|
|
let lackGoodsForPrint = ref([])
|
|||
|
|
const printBtn = ref()
|
|||
|
|
const printLackGoodsBtn = ref()
|
|||
|
|
const confirmReleaseBtn = ref()
|
|||
|
|
const size = ref(35)
|
|||
|
|
const color = ref('#000000')
|
|||
|
|
const route = useRoute()// 路由
|
|||
|
|
// 系统
|
|||
|
|
onMounted(() => {
|
|||
|
|
nextTick(() => {
|
|||
|
|
initWorkOptions()
|
|||
|
|
searchKittingGoods()
|
|||
|
|
timer.value = setInterval(() => {
|
|||
|
|
timerTask_1()
|
|||
|
|
}, 1000)
|
|||
|
|
// 监听enter键
|
|||
|
|
window.addEventListener('keydown', solveEnterKey)
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
onBeforeUnmount(() => {
|
|||
|
|
clearInterval(timer.value)
|
|||
|
|
window.removeEventListener('keydown', solveEnterKey)
|
|||
|
|
})
|
|||
|
|
// 监视路由
|
|||
|
|
watch(() => route.path, (newVal, oldVal) => {
|
|||
|
|
if (newVal == '/kitting') {
|
|||
|
|
timer.value = setInterval(() => {
|
|||
|
|
timerTask_1()
|
|||
|
|
}, 1000)
|
|||
|
|
// 监听enter键
|
|||
|
|
window.addEventListener('keydown', solveEnterKey)
|
|||
|
|
} else {
|
|||
|
|
clearInterval(timer.value)
|
|||
|
|
window.removeEventListener('keydown', solveEnterKey)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
watch(() => workFormEntity.workOrder, (newVal, oldVal) => {
|
|||
|
|
if (newVal == '') {
|
|||
|
|
workFormEntity.productIdOrigin = ''
|
|||
|
|
workFormEntity.productId = ''
|
|||
|
|
workFormEntity.singleProductId = ''
|
|||
|
|
workFormEntity.boxNo = ''
|
|||
|
|
workFormEntity.goodsId = ''
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
watch(() => workFormEntity.productId, (newVal, oldVal) => {
|
|||
|
|
if (newVal != oldVal) {
|
|||
|
|
workFormEntity.singleProductId = ''
|
|||
|
|
workFormEntity.boxNo = ''
|
|||
|
|
workFormEntity.goodsId = ''
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
watch(() => workFormEntity.singleProductId, (newVal, oldVal) => {
|
|||
|
|
if (newVal != oldVal) {
|
|||
|
|
workFormEntity.boxNo = ''
|
|||
|
|
workFormEntity.goodsId = ''
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
watch(() => workFormEntity.boxNo, (newVal, oldVal) => {
|
|||
|
|
if (newVal != oldVal) {
|
|||
|
|
workFormEntity.goodsId = ''
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
// 定时器任务1
|
|||
|
|
const timerTask_1 = () => {
|
|||
|
|
// 查询工作
|
|||
|
|
getWork()
|
|||
|
|
// 判断是否需要显示料盒信息
|
|||
|
|
ifNeedShowBoxSummary()
|
|||
|
|
}
|
|||
|
|
// 自定义方法
|
|||
|
|
const solveEnterKey = (e) => {
|
|||
|
|
if (e.key.toLocaleLowerCase() == 'enter') {
|
|||
|
|
confirmReleaseBtn.value.$el.click()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 初始化工单options
|
|||
|
|
const initWorkOptions = () => {
|
|||
|
|
const request = {
|
|||
|
|
workOrder: workFormQuery.workOrder != '' ? workFormQuery.workOrder : workFormEntity.workOrder,
|
|||
|
|
singleProductId: workFormQuery.singleProductId != '' ? workFormQuery.singleProductId : workFormEntity.singleProductId,
|
|||
|
|
boxNo: workFormQuery.boxNo != '' ? workFormQuery.boxNo : workFormEntity.boxNo,
|
|||
|
|
goodsId: workFormQuery.goodsId != '' ? workFormQuery.goodsId : workFormEntity.goodsId,
|
|||
|
|
planStartDate: dateFormatter(workFormEntity.planStartDate)
|
|||
|
|
}
|
|||
|
|
optionLoading.value = true
|
|||
|
|
queryKateWorks(request).then(res => {
|
|||
|
|
const response = res.data
|
|||
|
|
if (response.code == 0) {
|
|||
|
|
workOptions.workOrder = response.data.workOrder
|
|||
|
|
// 设置成品号
|
|||
|
|
workFormEntity.productIdOrigin = response.data.productIdOrigin
|
|||
|
|
workFormEntity.productId = response.data.productId
|
|||
|
|
workOptions.singleProductId = response.data.singleProductId
|
|||
|
|
workOptions.boxNo = response.data.boxNo
|
|||
|
|
workOptions.goodsId = response.data.goodsId
|
|||
|
|
} else {
|
|||
|
|
workOptions.workOrder = []
|
|||
|
|
// 重置成品号
|
|||
|
|
workFormEntity.productIdOrigin = ''
|
|||
|
|
workFormEntity.productId = ''
|
|||
|
|
workOptions.singleProductId = []
|
|||
|
|
workOptions.boxNo = []
|
|||
|
|
workOptions.goodsId = []
|
|||
|
|
}
|
|||
|
|
}).catch(err => {
|
|||
|
|
console.log(err)
|
|||
|
|
errorBox('查询选项错误。')
|
|||
|
|
}).finally(() => {
|
|||
|
|
optionLoading.value = false
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
// 重置参数
|
|||
|
|
const resetWorkFormQuery = () => {
|
|||
|
|
workFormQuery.workOrder = ''
|
|||
|
|
workFormQuery.singleProductId = ''
|
|||
|
|
workFormQuery.boxNo = ''
|
|||
|
|
workFormQuery.goodsId = ''
|
|||
|
|
workFormEntity.workOrder = ''
|
|||
|
|
workFormEntity.productIdOrigin = ''
|
|||
|
|
workFormEntity.productId = ''
|
|||
|
|
workFormEntity.singleProductId = ''
|
|||
|
|
workFormEntity.boxNo = ''
|
|||
|
|
workFormEntity.goodsId = ''
|
|||
|
|
}
|
|||
|
|
// 确认配料
|
|||
|
|
const confirmStart = () => {
|
|||
|
|
const request = {
|
|||
|
|
workOrder: workFormEntity.workOrder,
|
|||
|
|
singleProductId: workFormEntity.singleProductId,
|
|||
|
|
boxNo: workFormEntity.boxNo,
|
|||
|
|
goodsId: workFormEntity.goodsId,
|
|||
|
|
standId: standId,
|
|||
|
|
userName: userName
|
|||
|
|
}
|
|||
|
|
loading.open()
|
|||
|
|
initWorks(request).then(res => {
|
|||
|
|
const response = res.data
|
|||
|
|
if (response.code == 0) {
|
|||
|
|
ElMessage.success(response.message)
|
|||
|
|
setTimeout(() => {
|
|||
|
|
showBoxSummary()
|
|||
|
|
searchKittingGoods()
|
|||
|
|
}, 2000)
|
|||
|
|
} else {
|
|||
|
|
errorBox(response.message)
|
|||
|
|
}
|
|||
|
|
}).catch(err => {
|
|||
|
|
console.log(err)
|
|||
|
|
errorBox('请求错误。')
|
|||
|
|
}).finally(() => {
|
|||
|
|
loading.close()
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
// 显示料盒总览
|
|||
|
|
const showBoxSummary = () => {
|
|||
|
|
if (boxShowFlag.value) {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
boxSummary.value = []
|
|||
|
|
goodsLackSummary.value = []
|
|||
|
|
// 请求
|
|||
|
|
const request = {
|
|||
|
|
standId: standId,
|
|||
|
|
userName: userName
|
|||
|
|
}
|
|||
|
|
getBoxesAndLacks(request).then(res => {
|
|||
|
|
const response = res.data
|
|||
|
|
if (response.code == 0) {
|
|||
|
|
const boxDetailVo = response.data
|
|||
|
|
// 获得打印标签数据
|
|||
|
|
getPrintTabs(boxDetailVo.boxSummary)
|
|||
|
|
// 料盒显示数据
|
|||
|
|
boxSummary.value = [boxDetailVo.boxSummary]
|
|||
|
|
goodsLackSummary.value = boxDetailVo.goodsLackSummary
|
|||
|
|
boxShowFlag.value = true
|
|||
|
|
} else {
|
|||
|
|
errorBox(response.message)
|
|||
|
|
}
|
|||
|
|
}).catch(error => {
|
|||
|
|
console.log(error)
|
|||
|
|
errorBox('发生异常:' + error)
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
// 关闭弹窗
|
|||
|
|
const closeBoxSummary = () => {
|
|||
|
|
boxSummary.value = []
|
|||
|
|
goodsLackSummary.value = []
|
|||
|
|
boxShowFlag.value = false
|
|||
|
|
}
|
|||
|
|
// 获取工作信息
|
|||
|
|
const getWork = () => {
|
|||
|
|
if (pauseGetWorkFlag.value) {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
const request = {
|
|||
|
|
standId: standId,
|
|||
|
|
userName: userName
|
|||
|
|
}
|
|||
|
|
getCurrentWorks(request).then(res => {
|
|||
|
|
const response = res.data
|
|||
|
|
if (response.code == 0) {
|
|||
|
|
// 设置form
|
|||
|
|
confirmEntity.workIndex = response.data.orderConfirm.workIndex
|
|||
|
|
confirmEntity.workOrder = response.data.orderConfirm.workOrder
|
|||
|
|
confirmEntity.productId = response.data.orderConfirm.productId
|
|||
|
|
confirmEntity.singleProductId = response.data.orderConfirm.singleProductId
|
|||
|
|
confirmEntity.boxNo = response.data.orderConfirm.boxNo
|
|||
|
|
confirmEntity.goodsId = response.data.orderConfirm.goodsId
|
|||
|
|
confirmEntity.planPickQty = response.data.orderConfirm.planPickQty
|
|||
|
|
confirmEntity.realPickQty = response.data.orderConfirm.realPickQty
|
|||
|
|
confirmEntity.stockId = response.data.stockConfirm.stockId
|
|||
|
|
confirmEntity.vehicleId = response.data.stockConfirm.vehicleId
|
|||
|
|
confirmEntity.planRemainQty = response.data.stockConfirm.planRemainQty
|
|||
|
|
confirmEntity.realRemainQty = response.data.stockConfirm.realRemainQty
|
|||
|
|
confirmEntity.isOut = response.data.stockConfirm.isOut
|
|||
|
|
confirmEntity.putArea = response.data.stockConfirm.putArea
|
|||
|
|
confirmEntity.warningQty = response.data.stockConfirm.warningQty
|
|||
|
|
pauseGetWorkFlag.value = true
|
|||
|
|
// 如果剩余数量低于预警值,弹框报警
|
|||
|
|
if (confirmEntity.isOut == 0 && confirmEntity.planRemainQty <= confirmEntity.warningQty) {
|
|||
|
|
warningBox('剩余数量低于预警值,请清点库存数量。')
|
|||
|
|
}
|
|||
|
|
} else if (response.code == 400) {
|
|||
|
|
// 警告,弹框
|
|||
|
|
pauseGetWorkFlag.value = true
|
|||
|
|
warningBox(response.message)
|
|||
|
|
} else {
|
|||
|
|
if (response.data != null && response.data.orderConfirm != null) {
|
|||
|
|
confirmEntity.workOrder = response.data.orderConfirm.workOrder
|
|||
|
|
confirmEntity.boxNo = response.data.orderConfirm.boxNo
|
|||
|
|
confirmEntity.productId = response.data.orderConfirm.productId
|
|||
|
|
confirmEntity.singleProductId = response.data.orderConfirm.singleProductId
|
|||
|
|
} else {
|
|||
|
|
confirmEntity.workOrder = ''
|
|||
|
|
confirmEntity.boxNo = ''
|
|||
|
|
confirmEntity.productId = ''
|
|||
|
|
confirmEntity.singleProductId = ''
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}).catch(err => {
|
|||
|
|
console.log(err)
|
|||
|
|
pauseGetWorkFlag.value = true
|
|||
|
|
errorBox('请求错误,请检查完原因后刷新界面。')
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
// 是否弹出料盒界面
|
|||
|
|
const ifNeedShowBoxSummary = () => {
|
|||
|
|
if (storeKittingWork.workOrder != '') {
|
|||
|
|
// 需要弹出上一个料盒的缺料打印信息
|
|||
|
|
if (confirmEntity.workOrder != storeKittingWork.workOrder
|
|||
|
|
|| confirmEntity.productId != storeKittingWork.productId
|
|||
|
|
|| confirmEntity.singleProductId != storeKittingWork.singleProductId
|
|||
|
|
|| confirmEntity.boxNo != storeKittingWork.boxNo) {
|
|||
|
|
printLacks(storeKittingWork.workOrder, storeKittingWork.productId, storeKittingWork.singleProductId, storeKittingWork.boxNo)
|
|||
|
|
if (confirmEntity.workOrder == '') {
|
|||
|
|
// 说明当前工单工作已完成,需要弹框提示工作已完成
|
|||
|
|
successBox('当前工单已完成。')
|
|||
|
|
} else if (confirmEntity.boxNo != storeKittingWork.boxNo) {
|
|||
|
|
// 前一个料盒已完成,需要弹框提示料盒已完成
|
|||
|
|
showBoxSummary()
|
|||
|
|
}
|
|||
|
|
// 替换store
|
|||
|
|
storeKittingWork.workOrder = confirmEntity.workOrder
|
|||
|
|
storeKittingWork.productId = confirmEntity.productId
|
|||
|
|
storeKittingWork.singleProductId = confirmEntity.singleProductId
|
|||
|
|
storeKittingWork.boxNo = confirmEntity.boxNo
|
|||
|
|
searchKittingGoods()
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
// 替换store
|
|||
|
|
storeKittingWork.workOrder = confirmEntity.workOrder
|
|||
|
|
storeKittingWork.productId = confirmEntity.productId
|
|||
|
|
storeKittingWork.singleProductId = confirmEntity.singleProductId
|
|||
|
|
storeKittingWork.boxNo = confirmEntity.boxNo
|
|||
|
|
}
|
|||
|
|
store.commit('mutationKittingWork', storeKittingWork)
|
|||
|
|
}
|
|||
|
|
// 确认放行
|
|||
|
|
const confirmOrRelease = () => {
|
|||
|
|
const request = {
|
|||
|
|
orderConfirm: {
|
|||
|
|
workIndex: confirmEntity.workIndex,
|
|||
|
|
workOrder: confirmEntity.workOrder,
|
|||
|
|
productId: confirmEntity.productId,
|
|||
|
|
singleProductId: confirmEntity.singleProductId,
|
|||
|
|
boxNo: confirmEntity.boxNo,
|
|||
|
|
goodsId: confirmEntity.goodsId,
|
|||
|
|
planPickQty: confirmEntity.planPickQty,
|
|||
|
|
realPickQty: confirmEntity.realPickQty
|
|||
|
|
},
|
|||
|
|
stockConfirm: {
|
|||
|
|
stockId: confirmEntity.stockId,
|
|||
|
|
vehicleId: confirmEntity.vehicleId,
|
|||
|
|
goodsId: confirmEntity.goodsId,
|
|||
|
|
planRemainQty: confirmEntity.planRemainQty,
|
|||
|
|
realRemainQty: confirmEntity.realRemainQty,
|
|||
|
|
isOut: confirmEntity.isOut,
|
|||
|
|
putArea: confirmEntity.putArea
|
|||
|
|
},
|
|||
|
|
standId: standId,
|
|||
|
|
userName: userName
|
|||
|
|
}
|
|||
|
|
confirmCurrentWork(request).then(res => {
|
|||
|
|
const response = res.data
|
|||
|
|
if (response.code == 0) {
|
|||
|
|
// 设置form
|
|||
|
|
resetConfirmEntity()
|
|||
|
|
// 继续刷新
|
|||
|
|
pauseGetWorkFlag.value = false
|
|||
|
|
ElMessage.success(response.message)
|
|||
|
|
} else if (response.code == 400) {
|
|||
|
|
// 设置form
|
|||
|
|
resetConfirmEntity()
|
|||
|
|
// 警告
|
|||
|
|
pauseGetWorkFlag.value = false
|
|||
|
|
warningBox(response.message)
|
|||
|
|
} else {
|
|||
|
|
// 错误
|
|||
|
|
errorBox(response.message)
|
|||
|
|
}
|
|||
|
|
}).catch(err => {
|
|||
|
|
console.log(err)
|
|||
|
|
errorBox('请求错误,请检查完原因后刷新界面。')
|
|||
|
|
}).finally(() => {
|
|||
|
|
// 刷新一下物料显示
|
|||
|
|
searchKittingGoods()
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
const resetConfirmEntity = () => {
|
|||
|
|
confirmEntity.workIndex = ''
|
|||
|
|
confirmEntity.goodsId = ''
|
|||
|
|
confirmEntity.planPickQty = null
|
|||
|
|
confirmEntity.realPickQty = null
|
|||
|
|
confirmEntity.stockId = ''
|
|||
|
|
confirmEntity.vehicleId = ''
|
|||
|
|
confirmEntity.planRemainQty = null
|
|||
|
|
confirmEntity.realRemainQty = null
|
|||
|
|
confirmEntity.isOut = null
|
|||
|
|
confirmEntity.putArea = ''
|
|||
|
|
confirmEntity.warningQty = null
|
|||
|
|
}
|
|||
|
|
// 当拣选数量修改时,要对应的修改
|
|||
|
|
const changePlanQty = () => {
|
|||
|
|
if (confirmEntity.isOut == 0 && confirmEntity.realPickQty != confirmEntity.planPickQty) {
|
|||
|
|
// 修正量
|
|||
|
|
const changeQty = confirmEntity.realPickQty - confirmEntity.planPickQty
|
|||
|
|
// 修正实际剩余数量
|
|||
|
|
confirmEntity.realRemainQty = confirmEntity.planRemainQty - changeQty
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
const requestPrint = () => {
|
|||
|
|
nextTick(() => {
|
|||
|
|
printBtn.value.click()
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
// 获得打印数据
|
|||
|
|
const getPrintTabs = (boxSummary) => {
|
|||
|
|
printTabs.value = []
|
|||
|
|
if (boxSummary != undefined) {
|
|||
|
|
for (let i = 1; i <= boxSummary.boxQty; i++) {
|
|||
|
|
printTabs.value.push(
|
|||
|
|
{
|
|||
|
|
workOrder: boxSummary.workOrder,
|
|||
|
|
productId: boxSummary.productIdOrigin,
|
|||
|
|
singleProductId: boxSummary.singleProductId,
|
|||
|
|
boxNo: boxSummary.boxNo,
|
|||
|
|
kittingDate: boxSummary.kittingDate,
|
|||
|
|
produceDate: boxSummary.produceDate,
|
|||
|
|
testNo: boxSummary.testNo,
|
|||
|
|
productionQty: boxSummary.productionQty,
|
|||
|
|
}
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// 查询配料单
|
|||
|
|
const searchKittingGoods = () => {
|
|||
|
|
let request = genTableRequest(baseTableQuery)
|
|||
|
|
request.workOrder = confirmEntity.workOrder
|
|||
|
|
request.productId = confirmEntity.productId
|
|||
|
|
request.singleProductId = confirmEntity.singleProductId
|
|||
|
|
request.boxNo = confirmEntity.boxNo
|
|||
|
|
queryWorkingGoodsByPage(request).then(res => {
|
|||
|
|
const response = res.data
|
|||
|
|
if (response.code == 0) {
|
|||
|
|
const data = response.data
|
|||
|
|
if (data != null) {
|
|||
|
|
currentBoxGoodsList.value = data.lists
|
|||
|
|
baseTableQuery.total = data.total
|
|||
|
|
} else {
|
|||
|
|
currentBoxGoodsList.value = []
|
|||
|
|
baseTableQuery.total = 0
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}).catch(err => {
|
|||
|
|
console.log(err)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
// 处理排序
|
|||
|
|
const handleSortChange = (data) => {
|
|||
|
|
if (baseTableQuery.sortBy.has(data.prop)) {
|
|||
|
|
baseTableQuery.sortBy.delete(data.prop)
|
|||
|
|
}
|
|||
|
|
baseTableQuery.sortBy.set(data.prop, data.order == 'ascending')
|
|||
|
|
searchKittingGoods()
|
|||
|
|
}
|
|||
|
|
// 打印上一个料盒的缺料信息
|
|||
|
|
const printLacks = (workOrder, productId, singleProductId, boxNo) => {
|
|||
|
|
const request = {
|
|||
|
|
workOrder: workOrder,
|
|||
|
|
productId: productId,
|
|||
|
|
singleProductId: singleProductId,
|
|||
|
|
boxNo: boxNo,
|
|||
|
|
standId: standId,
|
|||
|
|
userName: userName
|
|||
|
|
}
|
|||
|
|
getLackGoods(request).then(res => {
|
|||
|
|
const response = res.data
|
|||
|
|
if (response.code == 0) {
|
|||
|
|
lackGoodsForPrint.value = response.data
|
|||
|
|
nextTick(() => {
|
|||
|
|
printLackGoodsBtn.value.click()
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}).catch(err => {
|
|||
|
|
console.log(err)
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
<style scoped>
|
|||
|
|
.content {
|
|||
|
|
display: flex;
|
|||
|
|
width: 100%;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.work-area {
|
|||
|
|
width: 100%;
|
|||
|
|
/* padding: 5px; */
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.main-area {
|
|||
|
|
margin: auto;
|
|||
|
|
min-height: fit-content;
|
|||
|
|
max-height: 90%;
|
|||
|
|
margin-bottom: 10px;
|
|||
|
|
min-width: inherit;
|
|||
|
|
border: solid 1px;
|
|||
|
|
border-radius: 10px;
|
|||
|
|
box-shadow: 0px 15px 10px -15px #000;
|
|||
|
|
overflow: auto;
|
|||
|
|
padding: 10px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.confirm-area {
|
|||
|
|
margin: auto;
|
|||
|
|
min-height: fit-content;
|
|||
|
|
max-height: 90%;
|
|||
|
|
margin-bottom: 10px;
|
|||
|
|
min-width: inherit;
|
|||
|
|
border: solid 1px;
|
|||
|
|
border-radius: 10px;
|
|||
|
|
box-shadow: 0px 15px 10px -15px #000;
|
|||
|
|
overflow: auto;
|
|||
|
|
padding: 10px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.title-area {
|
|||
|
|
display: flex;
|
|||
|
|
/* min-height: 10%; */
|
|||
|
|
max-height: max-content;
|
|||
|
|
margin-bottom: 10px;
|
|||
|
|
min-width: inherit;
|
|||
|
|
border: solid 1px;
|
|||
|
|
border-radius: 10px;
|
|||
|
|
box-shadow: 0px 15px 10px -15px #000;
|
|||
|
|
overflow: auto;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.table-area {
|
|||
|
|
margin: auto;
|
|||
|
|
min-height: fit-content;
|
|||
|
|
max-height: 60%;
|
|||
|
|
margin-bottom: 10px;
|
|||
|
|
min-width: inherit;
|
|||
|
|
border: solid 1px;
|
|||
|
|
border-radius: 10px;
|
|||
|
|
box-shadow: 0px 15px 10px -15px #000;
|
|||
|
|
overflow: auto;
|
|||
|
|
padding: 10px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.el-form-item {
|
|||
|
|
margin: 10px 5px 10px 5px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.el-form-item .el-input {
|
|||
|
|
width: 196px;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.table-class {
|
|||
|
|
margin: 5px 5px 5px 5px;
|
|||
|
|
width: inherit;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@media print {
|
|||
|
|
@page {
|
|||
|
|
size: auto;
|
|||
|
|
margin-top: 0;
|
|||
|
|
margin-bottom: 0;
|
|||
|
|
margin-left: 0;
|
|||
|
|
margin-right: 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
body,
|
|||
|
|
html {
|
|||
|
|
height: auto !important;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.objectDialogFlowPrint {
|
|||
|
|
width: 100% !important;
|
|||
|
|
height: 100% !important;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.objectDialogFlowPrint .pageWarp {
|
|||
|
|
/*这句话很重要,控制时候强制分页 https://www.w3school.com.cn/cssref/pr_page-break-after.asp*/
|
|||
|
|
page-break-after: always;
|
|||
|
|
width: 100%;
|
|||
|
|
height: 100%;
|
|||
|
|
text-align: center;
|
|||
|
|
padding: 0;
|
|||
|
|
display: flex;
|
|||
|
|
print-color-adjust: exact;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.print-tab-text {
|
|||
|
|
width: 40%;
|
|||
|
|
align-content: center;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.print-tab-image {
|
|||
|
|
width: 20%;
|
|||
|
|
align-content: center;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.print-row-normal {
|
|||
|
|
margin: 8px 3px 8px 3px;
|
|||
|
|
font-size: 13px;
|
|||
|
|
font-weight: bold;
|
|||
|
|
text-align: left;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.print-tab-full {
|
|||
|
|
width: 90%;
|
|||
|
|
align-content: center;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.print-row-big {
|
|||
|
|
margin: 8px 3px 8px 3px;
|
|||
|
|
font-size: 20px;
|
|||
|
|
font-weight: bold;
|
|||
|
|
text-align: left;
|
|||
|
|
}
|
|||
|
|
</style>
|