You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1155 lines
42 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="p-2">
<el-card shadow="never">
<el-form label-width="120px" label-position="right" :inline="true" :model="queryForm" class="demo-form-inline">
<el-form-item label="入库单号">
<el-input v-model="queryForm.instockCode" placeholder="输入调拨单号" clearable/>
</el-form-item>
<el-form-item label="工单类型" prop="instockType">
<el-select v-model="queryForm.instockType" placeholder="请选择工单类型" clearable >
<el-option v-for="dict in wms_instock_type" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<!-- <el-form-item label="入库方式" prop="instockMethond">-->
<!-- <el-select v-model="queryForm.instockMethond" placeholder="请选择入库方式" clearable >-->
<!-- <el-option v-for="dict in instock_methond" :key="dict.value" :label="dict.label" :value="dict.value"/>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="审核状态" prop="auditStatus">
<el-select v-model="queryForm.auditStatus" placeholder="请选择审核状态" clearable >
<el-option v-for="dict in approve_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
</el-select>
</el-form-item>
<el-form-item label="仓库" prop="warehouseId">
<el-select v-model="queryForm.warehouseId" placeholder="请选择所属仓库">
<el-option
v-for="item in baseStoreList"
:key="item.warehouseId"
:label="item.warehouseName"
:value="item.warehouseId"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button :loading="parentTableLoad" type="primary" @click="query">查询</el-button>
<el-button @click="reset">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card style="margin-top: 8px" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="parentTableAdd">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="ids.length !== 1" @click="parentTableUpdate()">修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="ids.length < 1" @click="parentTableDelete()">删除
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>-->
<!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true"
@queryTable="getParentTable"></right-toolbar>
</el-row>
</template>
<el-table v-loading="parentTableLoad" :data="parentTableData" style="width: 100%" highlight-current-row
@current-change="parentTableCellClick"
@selection-change="selectionChange" ref="parentTableRef">
<el-table-column type="selection" width="55"/>
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="入库单 主键" align="center" prop="instockId"/> -->
<el-table-column label="入库单号" align="center" prop="instockCode"/>
<el-table-column label="物料大类" align="center" prop="materialCategoryName">
</el-table-column>
<el-table-column label="工单类型" align="center" prop="instockType">
<template #default="scope">
<dict-tag :options="wms_instock_type" :value="scope.row.instockType"/>
</template>
</el-table-column>
<el-table-column label="入库方式" align="center" prop="instockMethond">
<template #default="scope">
<dict-tag :options="instock_methond" :value="scope.row.instockMethond"/>
</template>
</el-table-column>
<el-table-column label="订单编号" align="center" prop="orderNo"/>
<el-table-column label="审核人" align="center" prop="auditBy"/>
<el-table-column label="审核时间" align="center" prop="auditTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.auditTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="审核状态" align="center" prop="auditStatus">
<template #default="scope">
<dict-tag :options="approve_status" :value="scope.row.auditStatus"/>
</template>
</el-table-column>
<el-table-column label="审核意见" align="center" prop="auditComments"/>
<el-table-column label="仓库ID" align="center" prop="warehouseCode"/>
<!-- <el-table-column label="入库方式" align="center" prop="inMethod">
<template #default="scope">
<dict-tag :options="wms_allocate_way" :value="scope.row.inMethod"/>
</template>
</el-table-column> -->
<el-table-column label="操作" align="center" width="200">
<template #default="scope">
<!-- <el-button size="small" @click.stop="viewDetails(scope.row)">-->
<!-- 查看-->
<!-- </el-button>-->
<el-button size="small" @click.stop="parentTableApprove(scope.row)" v-if="scope.row.auditStatus==0&&scope.row.auditBy!=''">
审批
</el-button>
<el-button size="small" @click.stop="parentTableUpdate(scope.row)">
修改
</el-button>
<el-button
size="small"
type="danger"
@click.stop="parentTableDelete(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="parentTableTotal > 0" :total="parentTableTotal" v-model:page="queryForm.pageNum"
v-model:limit="queryForm.pageSize" @pagination="getParentTable"/>
</el-card>
<el-card style="margin-top: 8px" shadow="never">
<el-table :data="childrenTableData" style="width: 100%" v-loading="childrenTableLoad">
<el-table-column label="物料编码" align="center" prop="materialCode"/>
<el-table-column label="物料名称" align="center" prop="materialName"/>
<el-table-column label="入库数量" align="center" prop="instockQty"/>
<el-table-column label="质检标识" align="center" prop="isInspection">
<template #default="scope">
<dict-tag :options="wsm_is_inspection" :value="scope.row.isInspection"/>
</template>
</el-table-column>
<el-table-column label="已分包数量" align="center" prop="printedNum" />
<el-table-column label="物料规格" align="center" prop="materialSpe"/>
<el-table-column label="计量单位名称" align="center" prop="unitName"/>
<el-table-column label="是否有条码" align="center" prop="codeYesNo">
<template #default="scope">
<dict-tag :options="wms_barcode_if" :value="scope.row.codeYesNo"/>
</template>
</el-table-column>
<el-table-column label="物料大类" align="center" prop="materialCategoryName">
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template #default="scope">
<el-button size="small" @click="childrenTableUpdate( scope.row)" v-if="auditStatusLoad">
打印
</el-button>
<el-button
size="small"
type="danger"
@click="childrenTableUDelete(scope.row)"
>
删除
</el-button>
<!-- <el-tooltip content="打印" placement="top">
<el-button type="primary" @click="handlePrint(scope.row)">打印</el-button>
</el-tooltip> -->
</template>
</el-table-column>
</el-table>
</el-card>
<el-dialog v-model="dialogVisible" :title="dialogTitle" width="80%">
<el-card shadow="never">
<el-form :model="dialogForm" :inline="true" label-width="120px" :disabled="isView">
<el-form-item label="物料大类" prop="materialCategoryId">
<el-select v-model="dialogForm.materialCategoryId" placeholder="请选择物料大类" @change="setMaterialList">
<el-option v-for="item in mategoryOptions"
:key="item.materialCategoryId"
:label="item.materialCategoryName"
:value="item.materialCategoryId"
/>
</el-select>
</el-form-item>
<el-form-item label="工单类型" prop="instockType">
<el-select v-model="dialogForm.instockType" placeholder="请选择工单类型(1采购订单,2生产订单,3手工,4系统生成)">
<el-option
v-for="dict in wms_instock_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="订单编号" prop="orderNo">
<el-input v-model="dialogForm.orderNo" placeholder="请输入订单编号" />
</el-form-item>
<el-form-item label="采购订单" v-if="state.showPurchaseOrderSelect">
<el-select v-model="state.selectedPurchaseOrder" placeholder="请选择采购订单" value-key="poId" style="width: 200px">
<el-option v-for="item in state.purchaseOrders" :key="item.poId" :label="item.poNo" :value="item" />
</el-select>
<el-button type="primary" @click="handleAssociatePurchaseOrder" style="margin-left: 10px" :disabled="!state.selectedPurchaseOrder">
关联
</el-button>
</el-form-item>
<el-form-item label="生产订单" v-if="state.showProductionOrderSelect">
<el-select v-model="state.selectedProductionOrder" placeholder="请选择生产订单" @change="handleProductionOrderSelect" value-key="productOrderId">
<el-option v-for="item in state.productionOrders" :key="item.productOrderId" :label="item.orderCode" :value="item" />
</el-select>
</el-form-item>
<!-- <el-form-item label="审核人" prop="auditBy">
<el-select v-model="dialogForm.auditBy" placeholder="请选择审核人">
<el-option
v-for="item in userList"
:key="item.userId"
:label="item.userName"
:value="item.userName"
/>
</el-select>
</el-form-item> -->
<el-form-item label="仓库ID" prop="warehouseId">
<el-select v-model="dialogForm.warehouseId" placeholder="请选择所属仓库">
<el-option
v-for="item in baseStoreList"
:key="item.warehouseId"
:label="item.warehouseName"
:value="item.warehouseId"
></el-option>
</el-select>
</el-form-item>
</el-form>
</el-card>
<el-card style="margin-top: 8px" shadow="never">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="addDialogTableCell">新增</el-button>
</el-col>
</el-row>
<el-table :data="dialogtable" style="width: 100%">
<el-table-column label="字段1" prop="date" v-if="false">
<template #default="scope">
<el-select
v-model="scope.row.date"
placeholder="Select"
>
<el-option
v-for="i in material_mategoryId"
:label="i.materialName"
:value="i.materialId"
:key="i.materialId"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="物料编码" prop="materialCode">
<!-- <template #default="scope">
<el-select
v-model="scope.row.materialId"
placeholder="选择物料"
style="width: 240px"
>
<el-option
v-for="i in materialList"
:label="i.materialCode+'('+i.materialName+')'"
:value="i.materialId"
:key="i.materialId"
/>
</el-select>
</template>-->
<template #default="scope">
<el-input
v-model="scope.row.materialCode"
placeholder="请点击检索物料"
@click="handleMaterialAdd('material', scope.$index)" >
<template #append>
<el-icon class="el-input__icon"><search/></el-icon>
</template>
</el-input>
</template>
</el-table-column>
<el-table-column label="物料名称" prop="materialName">
<template #default="scope">
<el-select
v-model="scope.row.materialName"
placeholder="选择物料"
style="width: 240px"
:disabled="true"
>
<el-option
v-for="i in materialList"
:label="i.materialName"
:value="i.materialName"
:key="i.materialId"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="物料单位" prop="materialUnit">
<template #default="scope">
<el-select
v-model="scope.row.materialUnit"
placeholder="选择物料"
style="width: 240px"
:disabled="true"
>
<el-option
v-for="i in materialList"
:label="i.materialUnit"
:value="i.materialUnit"
:key="i.materialId"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="物料规格" prop="materialSpec">
<template #default="scope">
<el-select
v-model="scope.row.materialSpec"
placeholder="选择物料"
style="width: 240px"
:disabled="true"
>
<el-option
v-for="i in materialList"
:label="i.materialSpec"
:value="i.materialSpec"
:key="i.materialId"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="入库数量" prop="instockQty">
<template #default="scope">
<el-input-number
v-if="scope.row._showQtyInput"
v-model.number="scope.row.instockQty"
:min="0"
:max="scope.row.deliveryQty"
:precision="0"
:controls="false"
placeholder="请输入入库数量"
@change="(val) => validateQty(scope.row, val)"
style="width: 100%"
/>
<span v-else>{{ scope.row.instockQty }}</span>
</template>
</el-table-column>
<el-table-column label="有无条码" prop="codeYesNo">
<template #default="scope">
<el-select
v-model="scope.row.codeYesNo"
placeholder="选择有无条码"
style="width: 240px"
>
<el-option
v-for="i in wms_barcode_if"
:label="i.label"
:value="i.value"
:key="i.value"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="200">
<template #default="scope">
<el-button
size="small"
type="danger"
@click="tableUDelete(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
<!-- <el-table-column label="已包数量" prop="printedNum">
<template #default="scope">
<el-input v-model="scope.row.printedNum" placeholder="请输入已包数量" />
</template>
</el-table-column> -->
<!-- <el-table-column label="分包数量" prop="printNum">
<template #default="scope">
<el-input v-model="scope.row.printNum" placeholder="请输入分包数量" />
</template>
</el-table-column>
<el-table-column label="打印数量" prop="barcodeNum">
<template #default="scope">
<el-input v-model="scope.row.barcodeNum" placeholder="请输入打印数量" />
</template> -->
<!-- </el-table-column> -->
<!-- <el-table-column label="erp同步状态" prop="erpSynchronousStatus">-->
<!-- <template #default="scope">-->
<!-- <el-select-->
<!-- v-model="scope.row.erpSynchronousStatus"-->
<!-- placeholder="选择erp同步状态"-->
<!-- >-->
<!-- <el-option-->
<!-- label="1"-->
<!-- value="1"-->
<!-- />-->
<!-- <el-option-->
<!-- label="2"-->
<!-- value="2"-->
<!-- />-->
<!-- </el-select>-->
<!-- </template>-->
<!-- </el-table-column>-->
</el-table>
</el-card>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">关闭</el-button>
<el-button type="primary" @click="dialogSubmit">
确定
</el-button>
</div>
</template>
</el-dialog>
<el-dialog v-model="parentTableInfoVisible" title="修改父表格" width="40%">
<el-form :model="parentTableInfoForm" label-width="120px">
<el-form-item label="物料大类" prop="materialCategoryId">
<el-select v-model="parentTableInfoForm.materialCategoryId" placeholder="请选择物料大类" :disabled="true">
<el-option v-for="item in mategoryOptions"
:key="item.materialCategoryId"
:label="item.materialCategoryName"
:value="item.materialCategoryId"
/>
</el-select>
</el-form-item>
<el-form-item label="工单类型" prop="instockType">
<el-select v-model="parentTableInfoForm.instockType" placeholder="请选择工单类型">
<el-option
v-for="dict in wms_instock_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="订单编号" prop="orderNo">
<el-input v-model="form.orderNo" placeholder="请输入订单编号" />
</el-form-item> -->
<el-form-item label="审核人" prop="auditBy">
<el-select v-model="parentTableInfoForm.auditBy" placeholder="请选择审核人" :disabled="true">
<el-option
v-for="item in userList"
:key="item.userId"
:label="item.userName"
:value="item.userName"
/>
</el-select>
</el-form-item>
<el-form-item label="仓库" prop="warehouseId">
<el-select v-model="parentTableInfoForm.warehouseCode" placeholder="请选择所属仓库" :disabled="true">
<el-option
v-for="item in baseStoreList"
:key="item.warehouseId"
:label="item.warehouseName"
:value="item.warehouseId"
></el-option>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="parentTableInfoVisible = false">关闭</el-button>
<el-button type="primary" @click="parentTableInfoSubmit">
确定
</el-button>
</div>
</template>
</el-dialog>
<el-dialog v-model="parentTableApproveVisible" title="审批" width="40%">
<el-form :model="parentTableApproveForm" label-width="120px">
<el-form-item label="审核人" prop="auditBy">
<el-select v-model="parentTableApproveForm.auditBy" placeholder="请选择审核人" style="width:100px;" :disabled="true">
<el-option
v-for="item in userList"
:key="item.userId"
:label="item.userName"
:value="item.userName"
/>
</el-select>
</el-form-item>
<el-form-item label="审核状态" prop="auditStatus">
<el-radio-group v-model='parentTableApproveForm.auditStatus'>
<el-radio
v-for='dict in audit_behave'
:key='dict.value'
:value='dict.value'
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="审核意见" prop="auditComments">
<el-input
v-model='parentTableApproveForm.auditComments'
style="width: 500px"
:autosize="{ minRows: 2, maxRows: 4 }"
type="textarea"
placeholder="Please input"/>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="parentTableApproveVisible = false">关闭</el-button>
<el-button type="primary" @click="parentTableApproveSubmit">
确定
</el-button>
</div>
</template>
</el-dialog>
<el-dialog v-model="childrenTableInfoVisible" title="条码生成" width="40%">
<el-form :model="childrenTableInfoForm" label-width="120px">
<el-form-item label="物料" prop="materialCode">
<el-select v-model="childrenTableInfoForm.materialCode" placeholder="请选择物料" :disabled="true">
<el-option
v-for="item in materialList"
:key="item.materialId"
:label="item.materialCode"
:value="item.materialId"
/>
</el-select>
</el-form-item>
<el-form-item label="入库数量" prop="instockQty">
<el-input v-model="childrenTableInfoForm.instockQty" placeholder="请输入入库数量" :disabled="true"/>
</el-form-item>
<el-form-item label="有无条码" prop="codeYesNo">
<el-radio-group v-model="childrenTableInfoForm.codeYesNo" :disabled="true">
<el-radio
v-for="dict in wms_barcode_if"
:key="dict.value"
:value="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="已包数量" prop="printedNum">
<el-input v-model="childrenTableInfoForm.printedNum" placeholder="" :disabled="true"/>
</el-form-item>
<el-form-item label="分包数量" prop="splitPackageCount">
<el-input-number v-model="childrenTableInfoForm.splitPackageCount" :min="1" :max="remainingQty" placeholder="请输入分包数量" />
</el-form-item>
<el-form-item label="打印数量" prop="printCopies" v-if="childrenTableInfoForm.splitPackageCount === 1 || !childrenTableInfoForm.splitPackageCount">
<el-input-number v-model="childrenTableInfoForm.printCopies" :min="1" :max="20" placeholder="请输入打印条码数量" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="childrenTableInfoVisible = false">关闭</el-button>
<el-button type="primary" @click="submitForm">
确定
</el-button>
</div>
</template>
</el-dialog>
<!-- 添加物料信息对话框 -->
<el-dialog title="选择物料信息" v-model="materialOpen" width='1200px' append-to-body>
<MaterialSelectInWMS
@selection="handleSelection"
ref="materialSelectRef"
v-if="materialOpen"
:materialCategoryId="dialogForm.materialCategoryId"
></MaterialSelectInWMS>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitMaterialForm">确 定</el-button>
<el-button @click="materialOpen = false">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script setup name="Linkage" lang="ts">
import { listInstockOrder, getInstockOrder, delInstockOrder, addInstockOrder, updateInstockOrder, approveInstockOrder } from '@/api/wms/instockOrder';
import type { InstockOrderForm } from '@/api/wms/instockOrder/types';
import {onMounted, reactive, watch, computed} from 'vue'
import {ElMessage, ElMessageBox} from 'element-plus'
import {getBaseWarehouseList} from "@/api/wms/baseWarehouse";
import {UserVO} from "@/api/system/user/types";
import {listUser} from "@/api/system/user";
import { listInstockDetail, getInstockDetail, delInstockDetail, updateInstockDetail, addInstockDetail } from '@/api/wms/instockDetail';
import { InstockDetailVO, InstockDetailQuery, InstockDetailForm } from '@/api/wms/instockDetail/types';
import {
getMaterialList, getInstockMaterialList
} from '@/api/wms/linkage'
import MaterialSelectInWMS from "@/views/wms/baseMaterialInfo/addMaterialInWMS.vue";
import { getBaseMaterialCategoryListInWMS } from '@/api/wms/baseMaterialCategory';
import { getWmsPurchaseOrderDetailList } from '@/api/wms/wmsPurchaseOrderDetail';
import { getProdOrderInfoList, listOrderInfo } from '@/api/wms/orderInfo';
import { getWmsPurchaseOrderList } from '@/api/wms/wmsPurchaseOrder';
const {proxy} = getCurrentInstance() as ComponentInternalInstance;
const {audit_behave,
wms_barcode_if,
wms_instock_type,
approve_status,
erp_synchronous_status,
material_mategories,
mes_material_categories,
wms_allocate_status,
wms_allocate_create,
wms_allocate_way,
instock_methond,
wsm_is_inspection
} = toRefs<any>(proxy?.useDict('audit_behave', 'wms_barcode_if', 'wms_instock_type', 'approve_status', 'erp_synchronous_status', 'material_mategories', 'mes_material_categories', 'wms_allocate_status', 'wms_allocate_create', 'wms_allocate_way', 'instock_methond', 'wsm_is_inspection'));
interface User {
date: string
name: string
address: string
}
const parentTableTotal = ref(0)
const dialogVisible = ref(false)
const parentTableInfoVisible = ref(false)
const parentTableApproveVisible = ref(false)
const childrenTableInfoVisible = ref(false)
// const childrenTableInfoSubmit = ref(false)
const updateDialog = ref(false)
const dialogTitle = ref('添加')
const dialogForm = ref<InstockOrderForm>({ instockType: '', orderNo: '', materialCategoryId: '', warehouseId: '' });
const parentTableInfoForm = ref({})
const parentTableApproveForm = ref({})
const childrenTableInfoForm = ref({})
const queryForm = ref({
instockCode: '',
materialCategoryId: '',
materialCategoryName: '',
warehouseId: '',
instockType: '',
instockMethond: '',
pageNum: 1,
pageSize: 10
})
// 获取路由实例
const route = useRoute();// 获取路由实例
// 初始化时获取路由参数并设置到查询表单
let routeInstockMethondValue = '';
if (route.query.instockMethond) {
// 确保值是字符串类型,如果是数组则取第一个元素
const instockMethondValue = Array.isArray(route.query.instockMethond)
? route.query.instockMethond[0]
: route.query.instockMethond;
queryForm.value.instockMethond = instockMethondValue;
routeInstockMethondValue = instockMethondValue; // 保存路由参数值
}
const parentTableRef = ref()
const parentTableData = ref([])
const ids = ref([])
const childrenTableData = ref([])
const dialogtable = ref([])
const baseStoreList = ref([]);
const userList = ref([]);
const materialList = ref([]);
const parentTableLoad = ref(false)
const childrenTableLoad = ref(false)
const isView = ref(false)
const partntTableSelectCell = ref({})
const state = reactive({
showPurchaseOrderSelect: false,
showProductionOrderSelect: false,
purchaseOrders: [],
productionOrders: [],
selectedPurchaseOrder: null,
selectedProductionOrder: null,
isPurchaseOrderAssociated: false
});
// 获取仓库
getBaseWarehouseList().then(e => {
baseStoreList.value = e.data
})
listUser().then(e => {
userList.value = e.rows;
})
/** 提交按钮 */
const submitForm = async() => {
if (!childrenTableInfoForm.value.instockQty || !childrenTableInfoForm.value.printedNum) {
ElMessage.error('物料数据未加载完成,请重试')
return
}
const split = Number(childrenTableInfoForm.value.splitPackageCount) || 1
const copies = Number(childrenTableInfoForm.value.printCopies) || 1
const remaining = remainingQty.value
if (split > remaining) {
ElMessage.error('分包数量不能超过剩余物料量')
return
}
if (split > 1) {
if (remaining % split !== 0) {
ElMessage.error('剩余物料量无法平均分包,请调整分包数量')
return
}
// 对于分包>1设置barcodeNum=1每个包打印1份
childrenTableInfoForm.value.printCopies = 1
} else {
if (copies < 1) {
ElMessage.error('重复打印数量至少为1')
return
}
}
await updateInstockDetail(childrenTableInfoForm.value)
getChildrenTable({instockId: partntTableSelectCell.value.instockId})
childrenTableInfoVisible.value = false
}
let mategoryOptions = ref([]);
const getMaterialCategorySelect = async () => {
const res = await getBaseMaterialCategoryListInWMS(null);
mategoryOptions.value = res.data;
};
// 获取父表格数据
const getParentTable = async () => {
await getMaterialCategorySelect();
parentTableLoad.value = true
await listInstockOrder(queryForm.value).then(async (e) => {
parentTableLoad.value = false
parentTableData.value = e.rows
console.log(e.total)
parentTableTotal.value = e.total
if (e.rows.length > 0) {
parentTableRef.value.setCurrentRow(e.rows[0])
await getChildrenTable({instockId: e.rows[0].instockId,auditStatus: e.rows[0].auditStatus})
} else {
childrenTableData.value = []
}
})
}
const auditStatusLoad = ref(false)
// 获取子表格数据
const getChildrenTable = async (form) => {
console.log(form.auditStatus)
if(form.auditStatus == 1){
auditStatusLoad.value = true;
}else{
auditStatusLoad.value = false;
}
childrenTableLoad.value = true
console.log(form)
await listInstockDetail(form).then(e => {
childrenTableLoad.value = false
console.log(e.rows)
childrenTableData.value = e.rows
// parentTableTotal.value = e.total
})
}
getParentTable()
/** 打印按钮操作 */
const handlePrint = async (row?: InstockDetailVO) => {
reset();
const _instockDetailId = row?.instockDetailId || ids.value[0]
const res = await getInstockDetail(_instockDetailId);
Object.assign(childrenTableInfoForm.value, res.data);
}
// 查询
const query = async () => {
ids.value = []
parentTableRef.value?.clearSelection()
await getParentTable()
}
const reset = () => {
queryForm.value = {
instockId: '',
instockMethond: routeInstockMethondValue, // 使用保存的路由参数值
}
getParentTable()
}
// 父表格行点击
const parentTableCellClick = async (e) => {
partntTableSelectCell.value = e
await getChildrenTable({instockId: e.instockId,auditStatus: e.auditStatus})
}
// 表格多选
const selectionChange = (e) => {
ids.value = e.map(v => v.instockId)
}
// 查看
const viewDetails = (e) => {
isView.value = true
dialogVisible.value = true
viewAllocateOrder(e.aoId).then(v => {
dialogForm.value = v.data
})
}
// 父表格新增
const parentTableAdd = () => {
dialogVisible.value = true;
dialogForm.value = { instockType: '', orderNo: '', materialCategoryId: '', warehouseId: '' }; // Add more if needed
dialogtable.value = [];
};
// 父表格审批
const parentTableApprove = async (e) => {
parentTableApproveForm.value = (await getInstockOrder(e.instockId)).data
parentTableApproveVisible.value = true
updateDialog.value = true
}
// 父表格修改
const parentTableUpdate = async (e) => {
let id = ref(null)
if (e) {
id.value = e.instockId
} else {
id.value = ids.value?.[0]
}
if (!id.value) return
parentTableInfoForm.value = (await getInstockOrder(id.value)).data
parentTableInfoVisible.value = true
updateDialog.value = true
}
// 父表格删除
const parentTableDelete = async (e) => {
const delList = ref([])
if (e) {
delList.value = [e.instockId]
} else {
delList.value = ids.value
}
ElMessageBox.confirm(
'确定要删除这些数据吗?',
'Warning',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(async () => {
await delInstockOrder(delList.value.toString()).then(e => {
ElMessage({
type: 'success',
message: '删除完成',
})
getParentTable()
})
})
.catch(() => {
ElMessage({
type: 'info',
message: '取消',
})
})
}
// 获取物料列表
const setMaterialList = (materialCategoryId) => {
getInstockMaterialList({"materialCategoryId":materialCategoryId}).then(e => {
materialList.value = e.data
})
}
// 添加子表格行
// const addDialogTableCell = () => {
// dialogtable.value.push({})
// }
const addDialogTableCell = () => {
dialogtable.value.push({
_showQtyInput: true, // 确保新增行可以显示数量输入框
instockQty: 0, // 初始化入库数量为0
codeYesNo: '0' // 默认无条码
});
}
// 新增提交
const dialogSubmit = () => {
// 将前端行映射为后端明细字段,并进行基本校验与过滤
const detailList = (dialogtable.value || [])
.map((item: any) => ({
materialId: item.materialId,
materialCode: item.materialCode,
materialName: item.materialName,
materialSpe: item.materialSpec, // 前端 materialSpec -> 后端 materialSpe
unitName: item.materialUnit, // 前端 materialUnit -> 后端 unitName
instockQty: item.instockQty,
codeYesNo: item.codeYesNo || '0',
materialCategoryId: dialogForm.value.materialCategoryId
}))
.filter(d => d.materialId && d.materialCode && Number(d.instockQty) > 0);
if (!detailList.length) {
ElMessage.error('请添加至少一条入库明细且数量>0');
return;
}
const payload: InstockOrderForm = {
...dialogForm.value,
detailListBo: detailList
};
addInstockOrder(payload).then(() => {
ElMessage.success('保存成功');
dialogVisible.value = false;
getParentTable();
});
}
/**
* 入库单审批
*/
const parentTableApproveSubmit = () =>{
approveInstockOrder(parentTableApproveForm.value).then(e=>{
console.log(e)
if(e.data==0){
ElMessage({
type: 'error',
message: '请通知对应负责人审批',
})
}
if(e.data!=0){
ElMessage({
type: 'success',
message: '审批完成',
})
}
parentTableApproveVisible.value = false
getParentTable()
})
}
const parentTableInfoSubmit = () =>{
updateInstockOrder(parentTableInfoForm.value).then(e=>{
ElMessage({
type: 'success',
message: '修改完成',
})
parentTableInfoVisible.value = false
getParentTable()
})
}
// 子表格修改
const childrenTableUpdate = async (e) => {
childrenTableInfoForm.value = (await getInstockDetail(e.instockDetailId)).data
childrenTableInfoForm.value.splitPackageCount = 1
childrenTableInfoForm.value.printCopies = 1
childrenTableInfoVisible.value = true
}
// 子表格数据新增删除
const tableUDelete = (row) => {
ElMessageBox.confirm(
'确定要删除这些数据吗?',
'Warning',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(async () => {
const index = dialogtable.value.indexOf(row);
console.log(index)
dialogtable.value.splice(index,1)
})
}
// 子表格删除
const childrenTableUDelete = (e) => {
ElMessageBox.confirm(
'确定要删除这些数据吗?',
'Warning',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(async () => {
await delInstockDetail(e.instockDetailId).then(async (e) => {
ElMessage({
type: 'success',
message: '删除完成',
})
await getChildrenTable({instockId: partntTableSelectCell.value.instockId})
})
})
.catch(() => {
ElMessage({
type: 'info',
message: '取消',
})
})
}
/* 以下为添加物料信息对话框相关方法 */
let materialSelectRef = ref();//物料选择对话框绑定
const materialOpen = ref(false);//物料选择对话框显示
const selectType = ref(''); // 用于标识当前选择的是哪个字段
const selectedMaterial = ref(null); // 存储选中的物料完整信息
const currentRowIndex = ref(-1); // 存储当前正在编辑的行索引
/** 处理从MaterialSelect组件接收到的选择 */
const handleSelection = (row) => {
selectedMaterial.value = row;
};
/** 提交物料BOM信息按钮 */
const submitMaterialForm = () => {
if (!selectedMaterial.value) {
// 如果没有选中行,则尝试从表格中获取
selectedMaterial.value = materialSelectRef.value.tableRef.store.states.currentRow.value;
}
if (selectedMaterial.value) {
if (selectType.value === 'material') {
// 只更新当前正在编辑的行
if (currentRowIndex.value >= 0 && dialogtable.value[currentRowIndex.value]) {
dialogtable.value[currentRowIndex.value].materialId = selectedMaterial.value.materialId;
dialogtable.value[currentRowIndex.value].materialName = selectedMaterial.value.materialName;
dialogtable.value[currentRowIndex.value].materialCode = selectedMaterial.value.materialCode;
dialogtable.value[currentRowIndex.value].unitName = selectedMaterial.value.materialUnit;
dialogtable.value[currentRowIndex.value].materialSpe = selectedMaterial.value.materialSpec;
// 可以根据需要添加更多字段
}
}
}
// 重置选中的物料信息和关闭对话框
selectedMaterial.value = null;
materialOpen.value = false;
};
/** 新增按钮操作 */
const handleMaterialAdd = (type, index) => {
selectType.value = type;
currentRowIndex.value = index; // 保存当前正在编辑的行索引
materialOpen.value = true;
}
const loadPurchaseOrders = async () => {
// const res = await listWmsPurchaseOrder({ auditStatus: '1', pageNum: 1, pageSize: 99999 });
const res = await getWmsPurchaseOrderList(null)
state.purchaseOrders = res.data;
};
const loadProductionOrders = async () => {
// const res = await listOrderInfo({ orderStatus: '1', pageNum: 1, pageSize: 99999 });
const res = await getProdOrderInfoList(null)
state.productionOrders = res.data;
};
watch(() => dialogForm.value.instockType, async (newVal) => {
state.showPurchaseOrderSelect = (newVal === '1');
state.showProductionOrderSelect = (newVal === '2');
// Clear previous selections
state.selectedPurchaseOrder = null;
state.selectedProductionOrder = null;
dialogtable.value = [];
if (newVal === '1') {
await loadPurchaseOrders();
} else if (newVal === '2') {
await loadProductionOrders();
}
});
const handleAssociatePurchaseOrder = async () => {
if (!state.selectedPurchaseOrder) return;
const order = state.selectedPurchaseOrder;
dialogForm.value.orderNo = order.poNo;
const res = await getWmsPurchaseOrderDetailList({ poNo: order.poNo });
dialogtable.value = res.data.map(item => ({
materialId: item.materialId,
materialCode: item.materialCode,
materialName: item.materialName,
materialSpec: item.materialSpe,
materialUnit: item.unitName || '',
instockQty: 0, // 初始化为0让用户手动输入
deliveryQty: item.deliveryQty, // 保存交付数量用于验证
_showQtyInput: true // 标记显示数字输入框
}));
};
const handlePurchaseOrderSelect = (order) => {
state.selectedPurchaseOrder = order;
// 清空之前的物料列表
dialogtable.value = [];
};
const handleProductionOrderSelect = (order) => {
state.selectedProductionOrder = order;
dialogForm.value.orderNo = order.orderCode;
// For production, do not auto-populate materials; user adds manually
};
// 验证入库数量
const validateQty = (row, val) => {
if (val === null || val === undefined || val === '') {
row.instockQty = 0;
return;
}
// 确保是整数
const intVal = parseInt(val);
if (isNaN(intVal)) {
row.instockQty = 0;
return;
}
// 确保不超过交付数量
if (row.deliveryQty !== undefined && intVal > row.deliveryQty) {
row.instockQty = row.deliveryQty;
ElMessage.warning(`入库数量不能大于交付数量 ${row.deliveryQty}`);
} else {
row.instockQty = Math.max(0, intVal);
}
};
// 确保 computed 定义在脚本开头
const remainingQty = computed(() => {
const instock = Number(childrenTableInfoForm.value.instockQty) || 0
const printed = Number(childrenTableInfoForm.value.printedNum) || 0
return Math.max(0, instock - printed) // 添加 Math.max 防护负值
})
</script>
<style>
.demo-form-inline .el-input {
--el-input-width: 220px;
}
.demo-form-inline .el-select {
--el-select-width: 220px;
}
</style>