<template>
|
<div class="tl">
|
<!-- 工单详情信息 -->
|
<V-WorkOrderInfo :info="info"></V-WorkOrderInfo>
|
<div class="tl_title">
|
<div class="tl_title_left">
|
<div class="tl_title_left_x"></div>
|
<span>投料信息</span>
|
<span>{{total == 0 ? '' : total}}{{formList[formList.length - 1].dw ? formList[formList.length - 1].dw : ''}}</span>
|
</div>
|
<div class="tl_title_right" @click="add">
|
<img src="@/assets/icon/gongdan_ic_shoudong@2x.png" alt="" />
|
<span>增加投料</span>
|
</div>
|
</div>
|
<van-swipe-cell v-for="(item, index) in materialList" :key="index">
|
<div class="tl_list">
|
<div class="tl_list_item" @click="open1(index)">
|
<div class="tl_list_item_label">选择物料</div>
|
<div class="tl_list_item_go" v-if="!item.materialName">
|
<span :style="item.materialName ? 'color: #000000;' : ''">
|
点击跳转到物料列表
|
</span>
|
<van-icon name="arrow" color="#999999" />
|
</div>
|
<div class="tl_list_item_wl" v-else>
|
<div class="tl_list_item_wl_top">
|
<span>{{ item.materialName }}</span>
|
<span> | {{ item.materialCode }}</span>
|
</div>
|
<div class="tl_list_item_wl_bottom">
|
<span class="green" v-if="item.qualityType == 0">合格</span>
|
<span class="yellow" v-else-if="item.qualityType == 1">不良</span>
|
<span class="red" v-else-if="item.qualityType == 2">报废</span>
|
<span>{{ item.procedureName ? ` / ${item.procedureName}` : ' / -' }}</span>
|
<span>{{ item.locationName ? ` / ${item.locationName}` : ' / -' }}</span>
|
<span>{{ item.batch ? ` / ${item.batch}` : ' / -' }}</span>
|
</div>
|
</div>
|
</div>
|
<div class="tl_list_item">
|
<div class="tl_list_item_label">投料数量{{ item.unitAttribute }}</div>
|
<div class="tl_list_item_go">
|
<input type="text" @blur="changeNumber(item.num, index, item.unitAttribute)" v-model="item.num" />
|
</div>
|
</div>
|
</div>
|
<template #right>
|
<van-button square style="height: 100%;" type="danger" text="删除" @click="dele(index)" />
|
</template>
|
</van-swipe-cell>
|
<div class="tl_zw"></div>
|
<div class="tl_footer">
|
<button class="tl_footer_submit" v-preventReClick @click="submit">提交</button>
|
</div>
|
</div>
|
<!-- 入库物料 -->
|
<MaterialT :show="show" :workorderId="String(workorderId)" :deviceId="deviceId" @close="close" @value="getValue" />
|
<!-- 工装器具 -->
|
<!-- <Tooling :show="gzShow" :attribute="info.type === 2 ? `${Attribute.BL}` : `${Attribute.HG},${Attribute.HH}`" :classification="true" @close="close" @value="getValue" /> -->
|
</template>
|
|
<script setup lang="ts">
|
import { ref, onMounted, watch } from 'vue'
|
import { useRoute, useRouter } from "vue-router"
|
import { queryById, createMaterial, createMaterialStandard } from '@/apis/WorkOrderAPI'
|
import { Toast } from 'vant'
|
import { REGULAR } from '@/utils/utils'
|
import { Attribute } from '@/enum'
|
// import Tooling from '@/components/common/Tooling.vue'
|
import VWorkOrderInfo from '@/components/common/WorkOrderInfo.vue'
|
// import Material from '@/components/common/Material.vue'
|
import MaterialT from '@/components/common/MaterialT.vue'
|
|
const route = useRoute()
|
const router = useRouter()
|
|
// 投料索引
|
let indexs = ref<number>()
|
|
let info: any = ref({})
|
let total = ref<number>(0)
|
let workorderId = ref<string>('')
|
let deviceId = ref<string>('')
|
let gzShow = ref<boolean>(false)
|
|
let show = ref<boolean>(false)
|
|
// 投料信息
|
let materialList: any = ref([
|
{
|
id: '',
|
materialName: '',
|
materialCode: '',
|
qualityType: '',
|
procedureName: '',
|
locationName: '',
|
batch: '',
|
num: '',
|
unitAttribute: ''
|
}
|
])
|
|
// 投料信息数组
|
let formList: any = ref([
|
{
|
id: Date.now(),
|
toolingTypeId: '', // 工装类型
|
toolingTypeName: '',// 工装类型名称
|
workClothesId: '', // 工装
|
workClothesName: '',// 工装名称
|
num: '', // 数量
|
attribute: '', // 工装属性
|
attributeType: '', // 工装属性类型
|
dw: '', // 物料单位
|
unitAttribute: ''
|
}
|
])
|
|
const gzshow = ref<boolean>(false)
|
|
// 获取物料数据
|
const getValue = (item: any) => {
|
for (let i = 0; i < materialList.value.length; i++) {
|
if (item.id === materialList.value[i].id) {
|
Toast.fail({ message: '不能重复选择相同物料' })
|
return
|
}
|
}
|
materialList.value[indexs.value as number].id = item.id
|
materialList.value[indexs.value as number].materialName = item.materialName
|
materialList.value[indexs.value as number].num = item.num
|
materialList.value[indexs.value as number].batch = item.batch
|
materialList.value[indexs.value as number].locationName = item.locationName
|
materialList.value[indexs.value as number].materialCode = item.materialCode
|
materialList.value[indexs.value as number].procedureName = item.procedureName
|
materialList.value[indexs.value as number].qualityType = item.qualityType
|
materialList.value[indexs.value as number].unitAttribute = item.unitAttribute
|
show.value = false
|
// return
|
// if (!item.umodelName) {
|
// Toast.fail({ message: '该工装暂无物料,不能进行投料' })
|
// return
|
// }
|
// formList.value[indexs.value as number].toolingTypeId = item.cmodel1BigName
|
// formList.value[indexs.value as number].toolingTypeName = item.categoryId
|
// formList.value[indexs.value as number].workClothesId = item.id
|
// formList.value[indexs.value as number].workClothesName = item.code
|
// formList.value[indexs.value as number].attribute = item.smodelCode
|
// formList.value[indexs.value as number].attributeType = item.smodelLabel
|
// formList.value[indexs.value as number].dw = item.umodelName
|
// formList.value[indexs.value as number].num = item.num
|
// gzShow.value = false
|
}
|
|
const close = () => {
|
show.value = false
|
}
|
|
// 失去焦点验证整数小数
|
const changeNumber = (num: any, index: number, unitAttribute: number): void => {
|
if (unitAttribute === 0 && num !== '') {
|
if(!REGULAR.positiveInteger.test(num)){
|
Toast({ message: '只能输入正整数' })
|
materialList.value[index].num = ''
|
}
|
} else if (unitAttribute === 1 && num !== '') {
|
if(!REGULAR.number.test(num)){
|
Toast({ message: '只能输入正整数或小数(最多四位)' })
|
materialList.value[index].num = ''
|
}
|
}
|
if (num <= 0) {
|
Toast({ message: '投料数量不能小于等于0' })
|
materialList.value[index].num = ''
|
}
|
}
|
|
// 打开工装弹框
|
const open1 = (index: number): void => {
|
indexs.value = index
|
show.value = true
|
}
|
|
// 添加投料信息
|
const add = (): void => {
|
materialList.value.unshift({
|
id: '',
|
materialName: '',
|
materialCode: '',
|
qualityType: '',
|
procedureName: '',
|
locationName: '',
|
batch: '',
|
num: '',
|
unitAttribute: ''
|
})
|
}
|
|
// 删除投料信息
|
const dele = (index: number): void => {
|
if (materialList.value.length === 1) {
|
Toast('至少保留一条投料信息')
|
return
|
}
|
materialList.value.splice(index, 1)
|
}
|
|
// 提交手动投料
|
const submit = (): void => {
|
let isOpen: any = true
|
materialList.value.forEach((item: any, index: number) => {
|
if (!item.num) {
|
Toast({ message: `请先完善第${index + 1}条投料信息`, duration: 2000 })
|
isOpen = false
|
}
|
})
|
let total: number = 0
|
materialList.value.forEach((item: any, index: number) => {
|
if (item.num > 0) {
|
total += Number(item.num)
|
}
|
})
|
if (info.value.bomType !== 1 && info.value.hasBom !== 1) {
|
if (total > info.value.planNum) {
|
Toast.fail({ message: '投料数量不能大于计划数量', duration: 2000 })
|
return
|
}
|
}
|
if (isOpen) {
|
let recordList: any = []
|
materialList.value.forEach((item: any) => {
|
recordList.push({ wstockId: item.id, num: item.num })
|
})
|
createMaterialStandard({
|
id: route.query.id,
|
recordList: recordList
|
}).then(res => {
|
if (res.code === 200) {
|
Toast.success({ message: '投料成功', duration: 2000, forbidClick: true })
|
setTimeout(() => {
|
router.go(-1)
|
}, 2000)
|
}
|
})
|
}
|
}
|
|
// 获取详情数据
|
const queryByIds = (): void => {
|
queryById(route.query.id).then(res => {
|
if (res.code === 200) {
|
info.value = res.data
|
workorderId.value = route.query.id as string
|
deviceId.value = res.data.pgmodel.id
|
}
|
})
|
}
|
|
// 根据id查询工装
|
// const getListByConditions = (id: any): void => {
|
// getListByCondition({
|
// categoryId: id
|
// }).then(res => {
|
// if (res.code === 200) {
|
// console.log(res)
|
// }
|
// })
|
// }
|
|
watch(() => formList.value, (news) => {
|
total.value = 0
|
news.forEach((element: any) => {
|
total.value = total.value + Number(element.num)
|
})
|
}, { deep: true })
|
|
onMounted(() => {
|
queryByIds()
|
})
|
</script>
|
|
<style lang="scss" scoped>
|
.tl {
|
width: 100%;
|
height: 100%;
|
position: absolute;
|
background: #F7F7F7;
|
.tl_title {
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
padding: 30px;
|
.tl_title_left {
|
display: flex;
|
align-items: center;
|
.tl_title_left_x {
|
width: 8px;
|
height: 30px;
|
background: $nav-color;
|
border-radius: 2px;
|
margin-right: 12px;
|
}
|
span {
|
font-size: 32px;
|
font-weight: 500;
|
color: #222222;
|
&:nth-child(3) {
|
font-size: 28px;
|
font-weight: 500;
|
color: $nav-color;
|
margin-left: 10px;
|
}
|
}
|
}
|
.tl_title_right {
|
display: flex;
|
align-items: center;
|
img {
|
width: 28px;
|
height: 28px;
|
margin-right: 12px;
|
}
|
span {
|
font-size: 28px;
|
font-weight: 400;
|
color: $nav-color;
|
}
|
}
|
}
|
.tl_list {
|
display: flex;
|
flex-direction: column;
|
background: white;
|
padding: 0 30px;
|
margin-bottom: 20px;
|
.tl_list_item {
|
min-height: 98px;
|
// padding: 20px 0;
|
box-sizing: border-box;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
border-bottom: 1px solid #E5E5E5;
|
&:last-child {
|
border: none !important;
|
}
|
.tl_list_item_label {
|
font-size: 30px;
|
font-weight: 400;
|
color: #222222;
|
}
|
.tl_list_item_wl {
|
display: flex;
|
flex-direction: column;
|
align-items: end;
|
.tl_list_item_wl_top {
|
display: flex;
|
align-items: center;
|
span {
|
font-size: 28px;
|
color: #222222;
|
}
|
}
|
.tl_list_item_wl_bottom {
|
display: flex;
|
align-items: center;
|
span {
|
font-size: 28px;
|
color: #222222;
|
}
|
}
|
}
|
.tl_list_item_go {
|
display: flex;
|
align-items: center;
|
input {
|
text-align: right;
|
width: 180px;
|
height: 60px;
|
border-radius: 8px;
|
border: 1PX solid #E5E5E5;
|
padding: 0 30px;
|
box-sizing: border-box;
|
font-size: 28px;
|
font-weight: 400;
|
color: #333333;
|
}
|
span {
|
font-size: 28px;
|
font-weight: 400;
|
color: #999999;
|
margin-right: 10px;
|
}
|
}
|
}
|
}
|
.tl_zw {
|
height: 160px;
|
}
|
.tl_footer {
|
width: 100%;
|
position: fixed;
|
bottom: 0;
|
left: 0;
|
padding: 0 30px 68px 30px;
|
box-sizing: border-box;
|
.tl_footer_submit {
|
width: 690px;
|
height: 88px;
|
border: none;
|
background: #4275FC;
|
box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.08);
|
border-radius: 8px;
|
font-size: 30px;
|
font-weight: 500;
|
color: #FFFFFF;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
}
|
}
|
}
|
</style>
|