| <template> | 
|     <div class="zk"> | 
|         <div class="zk_list"> | 
|             <div class="zk_list_item" @click="open('d')"> | 
|                 <span>单据类型</span> | 
|                 <div class="zk_list_item_n"> | 
|                     <span :style="data.typeName ? 'color: black;' : ''">{{data.typeName ? data.typeName : '请选择'}}</span> | 
|                     <van-icon name="arrow" color="#999999" size="20" /> | 
|                 </div> | 
|             </div> | 
|             <div class="zk_list_item" @click="open('c')"> | 
|                 <span>出库仓库</span> | 
|                 <div class="zk_list_item_n"> | 
|                     <span :style="data.exWarehouse ? 'color: black;' : ''">{{data.exWarehouse ? data.exWarehouse : '请选择'}}</span> | 
|                     <van-icon name="arrow" color="#999999" size="20" /> | 
|                 </div> | 
|             </div> | 
|             <div class="zk_list_item" @click="open('r')"> | 
|                 <span>入库仓库</span> | 
|                 <div class="zk_list_item_n"> | 
|                     <span :style="data.warehousingWarehouseName ? 'color: black;' : ''">{{data.warehousingWarehouseName ? data.warehousingWarehouseName : '请选择'}}</span> | 
|                     <van-icon name="arrow" color="#999999" size="20" /> | 
|                 </div> | 
|             </div> | 
|         </div> | 
|         <div class="zk_title"> | 
|             <div class="zk_title_i"></div> | 
|             <span>转出物料列表</span> | 
|         </div> | 
|         <div class="zk_wl"> | 
|             <template v-if="view.MaterialList.length > 0"> | 
|                 <van-swipe-cell v-for="(item, i) in view.MaterialList" :key="i"> | 
|                     <div class="zk_wl_item"> | 
|                         <span>{{item.materialName}}|{{item.materialCode}}</span> | 
|                         <span> | 
|                             <span class="green" v-if="item.qualityType === '0'">合格</span> | 
|                             <span class="yellow" v-if="item.qualityType === '1'">不良</span> | 
|                             <span class="red" v-if="item.qualityType === '2'">报废</span> | 
|                              | <span>{{item.procedureName ? item.procedureName : '-'}} | </span> | 
|                             <span>{{item.batch ? item.batch : '-'}}</span> | 
|                         </span> | 
|                         <span>货位:{{item.locationName}}</span> | 
|                         <div class="zk_wl_item_num"> | 
|                             <span>转出数量({{item.unitName}}):</span> | 
|                             <input type="number" v-model="item.total" placeholder="0" /> | 
|                         </div> | 
|                     </div> | 
|                     <template #right> | 
|                         <van-button square type="danger" style="height: 100%;" text="删除" @click="dele(i)" /> | 
|                     </template> | 
|                 </van-swipe-cell> | 
|             </template> | 
|             <div class="zk_wl_w" v-else> | 
|                 <span>暂无数据</span> | 
|             </div> | 
|         </div> | 
|         <div class="zk_z"></div> | 
|         <div class="zk_footer"> | 
|             <div class="zk_footer_wl" @click="open('w')">选择物料</div> | 
|             <div style="width: 20px"></div> | 
|             <div class="zk_footer_submit" @click="submit">提交</div> | 
|         </div> | 
|     </div> | 
|     <!--  单据类型  --> | 
|     <van-popup v-model:show="view.type" position="bottom" round :style="{ height: '50%' }"> | 
|         <van-picker | 
|             title="请选择单据类型" | 
|             :columns="view.documentTypeDate" | 
|             @confirm="onConfirm" | 
|             @cancel="onCancel" | 
|             :columns-field-names="view.customFieldName" | 
|         /> | 
|     </van-popup> | 
|     <!--  选择仓库  --> | 
|     <Warehouse :show="view.Warehouse" @close="view.Warehouse = false" @value="getValue" /> | 
|     <!--  选择物料  --> | 
|     <Materials | 
|         ref="Material" | 
|         :show="view.Material" | 
|         :warehouseQualityType="view.warehouseQualityType" | 
|         :id="data.exWarehouseId.toString()" | 
|         @close="view.Material = false" | 
|         @value="getValueWL" /> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
|     import { reactive, ref } from 'vue' | 
|     import { documentType } from '@/constData' | 
|     import { Toast } from 'vant' | 
|     import { createZK } from '@/apis/agencyAPI' | 
|     import { setTime } from '@/utils/utils' | 
|     import { useRouter } from "vue-router" | 
|     import Warehouse from '@/components/common/Warehouse.vue' | 
|     import Materials from '@/components/common/Materials.vue' | 
|   | 
|     const router = useRouter() | 
|   | 
|     const Material = ref(null) | 
|   | 
|     let data = reactive({ | 
|         type: '', | 
|         outUserId: '', | 
|         inUserId: '', | 
|         typeName: '', | 
|         exWarehouse: '', | 
|         exWarehouseId: '', | 
|         warehousingWarehouse: '', | 
|         warehousingWarehouseName: '' | 
|     }) | 
|   | 
|     let view = reactive({ | 
|         type: false, | 
|         Warehouse: false, | 
|         Material: false, | 
|         status: '', | 
|         MaterialList: [], | 
|         documentTypeDate: documentType, | 
|         warehouseQualityType: '', | 
|         customFieldName: { | 
|             text: 'name' | 
|         } | 
|     }) | 
|   | 
|     // 创建转库单 | 
|     const submit = () => { | 
|         // let isOpen: boolean = true | 
|         if (!data.type) return Toast.fail({ message: '单据类型不能为空' }) | 
|         if (!data.exWarehouse) return Toast.fail({ message: '出库仓库不能为空' }) | 
|         if (!data.warehousingWarehouse) return Toast.fail({ message: '入库仓库不能为空' }) | 
|         if (view.MaterialList.length === 0) return Toast.fail({ message: '转出物料不能为空' }) | 
|         // view.MaterialList.forEach((element: any) => { | 
|         //     if (Number(element.total) > Number(element.num)) { | 
|         //         // isOpen = false | 
|         //         Toast.fail({ message: '转库的物料数量不能大于库存量!' }) | 
|         //         return | 
|         //     } | 
|         // }) | 
|         for (let i = 0; i < view.MaterialList.length; i++) { | 
|             if (!view.MaterialList[i].total || view.MaterialList[i].total <= 0) { | 
|                 Toast.fail({ message: '转出数量必须大于0' }) | 
|                 return | 
|             } | 
|             if (Number(view.MaterialList[i].total) > Number(view.MaterialList[i].num)) { | 
|                 Toast.fail({ message: '转库的物料数量不能大于库存量!' }) | 
|                 return | 
|             } | 
|         } | 
|         // if (isOpen) { | 
|             let time = setTime(new Date(), '-') | 
|             let wtransferDetailBeanList: any = [] | 
|             view.MaterialList.forEach((element: any) => { | 
|                 wtransferDetailBeanList.push({ | 
|                     batch: element.batch, | 
|                     materialId: element.materialId, | 
|                     procedureId: element.procedureId, | 
|                     procedureName: element.procedureName, | 
|                     qualityType: element.qualityType, | 
|                     unitId: element.unitId, | 
|                     outPlanNum: element.total, | 
|                     proceduresId: element.procedureId, | 
|                     inLocationId: null, | 
|                     outLocationId: element.locationId, | 
|                     inWarehouseId: data.exWarehouseId, | 
|                     outWarehouseId: data.warehousingWarehouse | 
|                 }) | 
|             }) | 
|             createZK({ | 
|                 type: data.type, | 
|                 outPlandate: time, | 
|                 inPlandate: time, | 
|                 origin: 0, | 
|                 outUserId: data.outUserId, | 
|                 inUserId: data.inUserId, | 
|                 inWarehouseId: data.warehousingWarehouse, | 
|                 outWarehouseId: data.exWarehouseId, | 
|                 wtransferDetailBeanList | 
|             }).then(res => { | 
|                 if (res.code === 200) { | 
|                     Toast.success({ message: '创建成功', forbidClick: true, duration: 2000 }) | 
|                     setTimeout(() => { | 
|                         router.go(-1) | 
|                     }, 2000) | 
|                 } | 
|             }) | 
|         // } | 
|     } | 
|   | 
|     // 删除物料 | 
|     const dele = (i: number): void => { | 
|         if (view.MaterialList.length === 1) { | 
|             Toast.fail({ message: '至少保留一项物料' }) | 
|             return | 
|         } | 
|         view.MaterialList.splice(i, 1) | 
|     } | 
|   | 
|     // 物料回调 | 
|     const getValueWL = (val: any): void => { | 
|         val.forEach((element: any) => { | 
|             element.total = element.num | 
|         }) | 
|         view.MaterialList.push(...val) | 
|         view.Material = false | 
|     } | 
|   | 
|     // 仓库回调 | 
|     const getValue = (val: any): void => { | 
|         if (view.status === 'c') { | 
|             data.exWarehouse = val.name | 
|             data.exWarehouseId = val.id | 
|             data.outUserId = val.managerId | 
|         } else if (view.status === 'r') { | 
|             data.warehousingWarehouseName = val.name | 
|             data.warehousingWarehouse = val.id | 
|             data.inUserId = val.managerId | 
|             view.warehouseQualityType = val.tmodel.label | 
|         } | 
|         view.Warehouse = false | 
|     } | 
|   | 
|     // 打开选择弹框 | 
|     const open = (type: string): void => { | 
|         if (type === 'd') { | 
|             view.type = true | 
|         } else if (type === 'c') { | 
|             view.status = 'c' | 
|             view.Warehouse = true | 
|         } else if (type === 'r') { | 
|             view.status = 'r' | 
|             view.Warehouse = true | 
|         } else if (type === 'w') { | 
|             if (data.exWarehouseId) { | 
|                 if (data.warehousingWarehouseName) { | 
|                     let arr: Array<any> = [] | 
|                     view.MaterialList.forEach((element: any) => { | 
|                         arr.push(element.id) | 
|                     }) | 
|                     const { selected }: any = Material.value | 
|                     Material.value.selected = arr | 
|                     view.Material = true | 
|                 } else { | 
|                     Toast.fail({ message: '请先选择入库仓库', duration: 2000 }) | 
|                 } | 
|             } else { | 
|                 Toast.fail({ message: '请先选择出库仓库', duration: 2000 }) | 
|             } | 
|         } | 
|     } | 
|   | 
|     // 确认单据类型 | 
|     const onConfirm = (val: any): void => { | 
|         data.type = val.id | 
|         data.typeName = val.name | 
|         view.type = false | 
|     } | 
|   | 
|     const onCancel = (): void => { | 
|         view.type = false | 
|     } | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
| .zk { | 
|     position: absolute; | 
|     width: 100%; | 
|     .zk_list { | 
|         padding: 0 30px; | 
|         background: white; | 
|         margin-top: 20px; | 
|         .zk_list_item { | 
|             height: 98px; | 
|             display: flex; | 
|             align-items: center; | 
|             justify-content: space-between; | 
|             border-bottom: 1PX solid #E5E5E5; | 
|             &:last-child { | 
|                 border: none !important; | 
|             } | 
|             span { | 
|                 font-size: 30px; | 
|                 font-weight: 400; | 
|                 color: #222222; | 
|             } | 
|             .zk_list_item_n { | 
|                 display: flex; | 
|                 align-items: center; | 
|                 span { | 
|                     font-size: 28px; | 
|                     font-weight: 400; | 
|                     color: #999999; | 
|                     margin-right: 10px; | 
|                 } | 
|             } | 
|         } | 
|     } | 
|     .zk_title { | 
|         padding: 40px 30px 30px 30px; | 
|         display: flex; | 
|         align-items: center; | 
|         .zk_title_i { | 
|             width: 8px; | 
|             height: 30px; | 
|             background: #4275FC; | 
|             border-radius: 2px; | 
|             margin-right: 12px; | 
|         } | 
|         span { | 
|             font-size: 32px; | 
|             font-weight: 500; | 
|             color: #222222; | 
|         } | 
|     } | 
|     .zk_wl { | 
|         background: white; | 
|         .zk_wl_w { | 
|             width: 100%; | 
|             height: 200px; | 
|             background: white; | 
|             display: flex; | 
|             align-items: center; | 
|             justify-content: center; | 
|             font-size: 26px; | 
|             color: black; | 
|         } | 
|         .zk_wl_item { | 
|             display: flex; | 
|             flex-direction: column; | 
|             padding: 30px; | 
|             border-bottom: 1PX solid #e2e2e2; | 
|             .zk_wl_item_num { | 
|                 display: flex; | 
|                 align-items: center; | 
|                 justify-content: space-between; | 
|                 margin-top: 30px; | 
|                 span { | 
|                     font-size: 28px; | 
|                     font-weight: 400; | 
|                     color: #222222; | 
|                     margin: 0!important; | 
|                 } | 
|                 input { | 
|                     width: 180px; | 
|                     height: 60px; | 
|                     background: #FFFFFF; | 
|                     border-radius: 8px; | 
|                     border: 1PX solid #CCCCCC; | 
|                     padding: 0 30px; | 
|                     font-size: 28px; | 
|                 } | 
|                 input::-webkit-input-placeholder { | 
|                     font-size: 28px; | 
|                     font-weight: 400; | 
|                     color: #999999; | 
|                 } | 
|             } | 
|             span { | 
|                 &:nth-child(1) { | 
|                     font-size: 30px; | 
|                     font-weight: 500; | 
|                     color: #222222; | 
|                     margin-bottom: 24px; | 
|                 } | 
|                 &:nth-child(2) { | 
|                     font-size: 24px; | 
|                     font-weight: 400; | 
|                     color: #666666; | 
|                     margin-bottom: 30px; | 
|                     span { | 
|                         font-size: 24px; | 
|                     } | 
|                 } | 
|                 &:nth-child(3) { | 
|                     font-size: 28px; | 
|                     font-weight: 400; | 
|                     color: #333333; | 
|                 } | 
|             } | 
|         } | 
|     } | 
|     .zk_z { | 
|         height: 168px; | 
|     } | 
|     .zk_footer { | 
|         width: 100%; | 
|         box-sizing: border-box; | 
|         padding: 0 30px; | 
|         position: fixed; | 
|         bottom: 0; | 
|         left: 0; | 
|         padding-bottom: 68px; | 
|         display: flex; | 
|         align-items: center; | 
|         justify-content: space-between; | 
|         .zk_footer_wl { | 
|             flex: 1; | 
|             height: 88px; | 
|             background: #FFFFFF; | 
|             box-shadow: 0 0 12px 0 rgba(0,0,0,0.08); | 
|             border-radius: 8px; | 
|             display: flex; | 
|             align-items: center; | 
|             justify-content: center; | 
|             font-size: 30px; | 
|             font-weight: 500; | 
|             color: $nav-color; | 
|         } | 
|         .zk_footer_submit { | 
|             flex: 1; | 
|             height: 88px; | 
|             background: $nav-color; | 
|             box-shadow: 0 0 12px 0 rgba(0,0,0,0.08); | 
|             border-radius: 8px; | 
|             display: flex; | 
|             align-items: center; | 
|             justify-content: center; | 
|             font-size: 30px; | 
|             font-weight: 500; | 
|             color: #FFFFFF; | 
|         } | 
|     } | 
| } | 
| </style> |