| <template> | 
|     <div class="details"> | 
|         <V-WorkOrderInfo :info="info"></V-WorkOrderInfo> | 
|         <!--  投料信息  --> | 
|         <div class="details_dj"> | 
|             <div class="details_dj_title"> | 
|                 <div class="details_x"></div> | 
|                 <span>投料信息</span> | 
|                 <span>{{total == 0 ? '' : total}}<template v-if="listData.length > 0">{{listData[listData.length - 1].dw ? listData[listData.length - 1].dw : ''}}</template></span> | 
|             </div> | 
|             <van-swipe-cell v-for="(item, index) in listData" :key="index"> | 
|                 <div class="details_dj_list"> | 
|                     <div class="details_dj_list_item"> | 
|                         <div class="details_dj_list_item_top"> | 
|                             <span>{{item.code}}</span> | 
|                             <span v-if="info.umodel">{{item.total}}{{item.dw}}</span> | 
|                         </div> | 
|                         <div class="details_dj_list_item_bottom"> | 
|                             <span v-if="info.umodel">投料数量({{item.dw}}):</span> | 
|                             <input v-model="item.num" @blur="changeNumber(item.num, index, item.umodelData)" type="text" /> | 
|                         </div> | 
|                     </div> | 
|                 </div> | 
|                 <template #right> | 
|                     <van-button style="height: 100%;" square type="danger" text="删除" @click="dele(index)" /> | 
|                 </template> | 
|             </van-swipe-cell> | 
|         </div> | 
|         <div class="details_zw"></div> | 
|         <!--  底部功能按钮  --> | 
|         <div class="details_footer"> | 
|             <div class="details_footer_buttona" @click="continueScanning">继续扫码</div> | 
|             <button v-preventReClick class="details_footer_buttonb" @click="submit">提交</button> | 
|         </div> | 
|         <!--  扫码组件  --> | 
|         <v-ScanCode | 
|             :openCode="openCode" | 
|             :infos="['请扫描工装码']" | 
|             @closePopup="closePopup" | 
|             @onDecode="onDecode" /> | 
|     </div> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
|     import { ref, onMounted, nextTick, watch } from 'vue' | 
|     import { Toast } from 'vant' | 
|     import { REGULAR } from '@/utils/utils' | 
|     import { useRouter, useRoute } from "vue-router" | 
|     import { getBarcodeContent, queryById, toolingQueryById, createMaterial } from '@/apis/WorkOrderAPI' | 
|     import vScanCode from '@/components/common/ScanCode.vue' | 
|     import VWorkOrderInfo from '@/components/common/WorkOrderInfo.vue' | 
|   | 
|     const info: any = ref({}) | 
|   | 
|     const router = useRouter() | 
|     let total = ref<number>(0) | 
|     const route = useRoute() | 
|   | 
|     // 投料信息 | 
|     let listData: any = ref([]) | 
|   | 
|     // 失去焦点验证整数小数 | 
|     const changeNumber = (num: any, index: number, umodelData: number): void => { | 
|         if (umodelData === 0 && num !== '') {  // 整数 | 
|             if(!REGULAR.positiveInteger.test(num)){ | 
|                 Toast({ message: '只能输入正整数' }) | 
|                 listData.value[index].num = '' | 
|             } | 
|         } else if (umodelData === 1 && num !== '') {  // 小数(只支持四位小数) | 
|             if(!REGULAR.number.test(num)){ | 
|                 Toast({ message: '只能输入正整数或小数(最多四位)' }) | 
|                 listData.value[index].num = '' | 
|             } | 
|         } | 
|     } | 
|   | 
|     // 删除一条投料信息 | 
|     const dele = (index: any): void => { | 
|         if (listData.value.length === 1) { | 
|             Toast({ | 
|                 message: '至少添加一条投料信息', | 
|                 duration: 2000 | 
|             }) | 
|             return | 
|         } | 
|         listData.value.splice(index, 1) | 
|     } | 
|   | 
|     // 控制扫码显示隐藏 | 
|     const openCode = ref<boolean>(false) | 
|   | 
|     // 关闭扫码组件 | 
|     const closePopup = (): void => { | 
|         openCode.value = false | 
|     } | 
|   | 
|     // 继续扫码 | 
|     const continueScanning = () => { | 
|         openCode.value = true | 
|     } | 
|   | 
|     // 获取扫码值 | 
|     const onDecode = (data: string[]): void => { | 
|         getBarcodeContent({ | 
|             barcode: data[0] | 
|         }).then(res => { | 
|             if (res.code === 200) { | 
|                 if (res.data.barcodeType === 4) { | 
|                     toolingQueryByIds(res.data.id) | 
|                 } else { | 
|                     Toast({ | 
|                         message: '请扫描正确的篮筐码', | 
|                         duration: 2000 | 
|                     }) | 
|                 } | 
|             } | 
|         }) | 
|         nextTick(() => { | 
|             openCode.value = false | 
|         }) | 
|     } | 
|   | 
|     // 查询工单详情 | 
|     const queryByIds = () => { | 
|         queryById(route.query.id).then(res => { | 
|             if (res.code === 200) { | 
|                 info.value = res.data | 
|             } | 
|         }) | 
|     } | 
|   | 
|     // 根据工装器具id获取详情 | 
|     const toolingQueryByIds = (id: any): void => { | 
|         toolingQueryById({ id }) | 
|             .then(res => { | 
|                 if (res.code === 200) { | 
|                     if (res.data[0].status === 0) { | 
|                         Toast({ message: '该工装已报废' }) | 
|                     } else if (res.data[0].status === 1) { | 
|                         Toast({ message: '该工装为空' }) | 
|                     } | 
|                     let isOpen = true | 
|                     listData.value.forEach((item: any) => { | 
|                         if (item.id === res.data[0].id) { | 
|                             isOpen = false | 
|                         } | 
|                     }) | 
|                     if (isOpen) { | 
|                         listData.value.push({ id: res.data[0].id, code: res.data[0].code + ' - ' + res.data[0].mmodelName, total: res.data[0].num, num: res.data[0].num, dw: res.data[0].umodelName, umodelData: res.data[0].umodelData }) | 
|                     } else { | 
|                         Toast({ message: '工装已存在', duration: 2000 }) | 
|                     } | 
|                 } | 
|             }) | 
|     } | 
|   | 
|     // 提交投料 | 
|     const submit = () => { | 
|         let isOpen = true | 
|         listData.value.forEach((item: any) => { | 
|             if (item.num === '') { | 
|                 isOpen = false | 
|                 Toast({ message: `[${item.code}]投料数量不能为空`, duration: 2000 }) | 
|             } | 
|             if (item.num > item.total) { | 
|                 isOpen = false | 
|                 Toast({ message: `[${item.code}]投料数量不能大于生产数量`, duration: 2000 }) | 
|                 return | 
|             } | 
|         }) | 
|   | 
|         if (isOpen) { | 
|             let recordList: any = [] | 
|             listData.value.forEach((item: any) => { | 
|                 recordList.push({ applianceId: item.id, num: item.num }) | 
|             }) | 
|             createMaterial({ | 
|                 id: route.query.id, | 
|                 recordList: recordList | 
|             }).then(res => { | 
|                 if (res.code === 200) { | 
|                     Toast.success({ message: '投料成功', duration: 2000, forbidClick: true }) | 
|                     setTimeout(() => { | 
|                         router.go(-1) | 
|                     }, 2000) | 
|                 } | 
|             }) | 
|         } | 
|     } | 
|   | 
|     watch(() => listData.value, (news) => { | 
|         total.value = 0 | 
|         news.forEach((element: any) => { | 
|             total.value = total.value + Number(element.num) | 
|         }) | 
|     }, { deep: true }) | 
|   | 
|     onMounted(() => { | 
|         queryByIds() | 
|         toolingQueryByIds(route.query.gzId) | 
|     }) | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
|     .details { | 
|         width: 100%; | 
|         height: 100%; | 
|         position: absolute; | 
|         background: #F7F7F7; | 
|         .details_dj { | 
|             display: flex; | 
|             flex-direction: column; | 
|             .details_dj_title { | 
|                 width: 100%; | 
|                 display: flex; | 
|                 align-items: center; | 
|                 padding: 30px; | 
|                 box-sizing: border-box; | 
|                 .details_x { | 
|                     width: 8px; | 
|                     height: 30px; | 
|                     background: #4275FC; | 
|                     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; | 
|                     } | 
|                 } | 
|             } | 
|             .details_dj_list { | 
|                 width: 100%; | 
|                 padding: 30px; | 
|                 margin-bottom: 20px; | 
|                 box-sizing: border-box; | 
|                 background: #ffffff; | 
|                 display: flex; | 
|                 flex-direction: column; | 
|                 .details_dj_list_item { | 
|                     display: flex; | 
|                     flex-direction: column; | 
|                     border-bottom: 1px solid #E5E5E5; | 
|                     padding-bottom: 30px; | 
|                     margin-top: 30px; | 
|                     &:first-child { | 
|                         margin-top: 0; | 
|                     } | 
|                     &:last-child { | 
|                         padding-bottom: 0; | 
|                         border: none; | 
|                     } | 
|                     .details_dj_list_item_top { | 
|                         display: flex; | 
|                         align-items: center; | 
|                         justify-content: space-between; | 
|                         span { | 
|                             &:first-child { | 
|                                 font-size: 30px; | 
|                                 font-weight: 500; | 
|                                 color: #222222; | 
|                             } | 
|                             &:last-child { | 
|                                 font-size: 28px; | 
|                                 font-weight: 500; | 
|                                 color: #4275FC; | 
|                             } | 
|                         } | 
|                     } | 
|                     .details_dj_list_item_bottom { | 
|                         display: flex; | 
|                         align-items: center; | 
|                         justify-content: space-between; | 
|                         margin-top: 30px; | 
|                         span { | 
|                             font-size: 28px; | 
|                             font-weight: 400; | 
|                             color: #222222; | 
|                         } | 
|                         input { | 
|                             text-align: right; | 
|                             width: 280px; | 
|                             height: 60px; | 
|                             padding: 0 30px; | 
|                             box-sizing: border-box; | 
|                             /*background: #F7F7F7;*/ | 
|                             border-radius: 8px; | 
|                             border: 1PX solid #E5E5E5; | 
|                             font-size: 28px; | 
|                             font-weight: 500; | 
|                             color: #333333; | 
|                         } | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|         .details_zw { | 
|             height: 160px; | 
|         } | 
|         .details_footer { | 
|             width: 100%; | 
|             position: fixed; | 
|             bottom: 0; | 
|             left: 0; | 
|             padding-bottom: 68px; | 
|             padding-left: 30px; | 
|             padding-right: 30px; | 
|             display: flex; | 
|             align-items: center; | 
|             justify-content: space-between; | 
|             box-sizing: border-box; | 
|             .details_footer_buttona { | 
|                 width: 334px; | 
|                 height: 88px; | 
|                 background: #FFFFFF; | 
|                 box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.08); | 
|                 border-radius: 8px; | 
|                 font-size: 30px; | 
|                 font-weight: 500; | 
|                 color: $nav-color; | 
|                 display: flex; | 
|                 align-items: center; | 
|                 justify-content: center; | 
|             } | 
|             .details_footer_buttonb { | 
|                 width: 334px; | 
|                 height: 88px; | 
|                 border: none; | 
|                 background: $nav-color; | 
|                 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> |