| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-tabs v-model="activeTab" @tab-change="handleTabChange"> |
| | | <el-tab-pane label="成品出库" name="production"> |
| | | <el-tabs v-model="activeTab" |
| | | @tab-change="handleTabChange"> |
| | | <el-tab-pane label="成品出库" |
| | | name="production"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title ml10">产品大类:</span> |
| | | <el-input |
| | | v-model="searchForm.productCategory" |
| | | <el-input v-model="searchForm.productCategory" |
| | | style="width: 240px" |
| | | placeholder="请输入" |
| | | clearable |
| | | /> |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button> |
| | | clearable /> |
| | | <el-button type="primary" |
| | | @click="handleQuery" |
| | | style="margin-left: 10px">搜索</el-button> |
| | | </div> |
| | | <div> |
| | | <el-button @click="handleOut">导出</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | | <el-table :data="tableData" border v-loading="tableLoading" |
| | | :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" |
| | | :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" label="序号" type="index" width="60" /> |
| | | <el-table-column label="销售合同号" prop="salesContractNo" width="180" show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" prop="productCategory" show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" prop="specificationModel" show-overflow-tooltip /> |
| | | <el-table-column label="单位" prop="unit" width="70" show-overflow-tooltip /> |
| | | <el-table-column label="剩余库存" prop="inboundNum0" width="90" show-overflow-tooltip /> |
| | | <el-table-column fixed="right" label="操作" min-width="60" align="center"> |
| | | <el-table :data="tableData" |
| | | border |
| | | v-loading="tableLoading" |
| | | :expand-row-keys="expandedRowKeys" |
| | | :row-key="row => row.id" |
| | | show-summary |
| | | style="width: 100%" |
| | | :summary-method="summarizeMainTable" |
| | | height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" |
| | | label="序号" |
| | | type="index" |
| | | width="60" /> |
| | | <el-table-column label="销售合同号" |
| | | prop="salesContractNo" |
| | | width="180" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" |
| | | prop="productCategory" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" |
| | | prop="specificationModel" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="单位" |
| | | prop="unit" |
| | | width="70" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="剩余库存" |
| | | prop="inboundNum0" |
| | | width="90" |
| | | show-overflow-tooltip /> |
| | | <el-table-column fixed="right" |
| | | label="操作" |
| | | min-width="60" |
| | | align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="openForm(scope.row);">发货</el-button> |
| | | <el-button :disabled="scope.row.inboundNum0 <= 0" |
| | | link |
| | | type="primary" |
| | | size="small" |
| | | @click="openForm(scope.row);">发货</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" :limit="page.size" @pagination="paginationChange" /> |
| | | <pagination v-show="total > 0" |
| | | :total="total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" |
| | | :limit="page.size" |
| | | @pagination="paginationChange" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="原料出库" name="purchase"> |
| | | <el-tab-pane label="原料出库" |
| | | name="purchase"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title ml10">产品大类:</span> |
| | | <el-input |
| | | v-model="searchForm.productCategory" |
| | | <el-input v-model="searchForm.productCategory" |
| | | style="width: 240px" |
| | | placeholder="请输入" |
| | | clearable |
| | | /> |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button> |
| | | clearable /> |
| | | <el-button type="primary" |
| | | @click="handleQuery" |
| | | style="margin-left: 10px">搜索</el-button> |
| | | </div> |
| | | <div> |
| | | <el-button @click="handleOut">导出</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | | <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" |
| | | :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" type="selection" width="55" /> |
| | | <el-table-column align="center" label="序号" type="index" width="60" /> |
| | | <el-table-column label="采购合同号" prop="purchaseContractNumber" width="180" show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" prop="productCategory" show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" prop="specificationModel" show-overflow-tooltip /> |
| | | <el-table-column label="单位" prop="unit" width="70" show-overflow-tooltip /> |
| | | <el-table-column label="剩余库存" prop="inboundNum0" width="90" show-overflow-tooltip /> |
| | | <el-table-column label="含税单价(元)" prop="taxInclusiveUnitPrice" width="150"></el-table-column> |
| | | <el-table-column label="含税总价(元)" prop="taxInclusiveTotalPrice" width="150"></el-table-column> |
| | | <el-table-column fixed="right" label="操作" min-width="60" align="center"> |
| | | <el-table :data="tableData" |
| | | border |
| | | v-loading="tableLoading" |
| | | @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" |
| | | :row-key="row => row.id" |
| | | show-summary |
| | | style="width: 100%" |
| | | :summary-method="summarizeMainTable" |
| | | height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" |
| | | type="selection" |
| | | width="55" /> |
| | | <el-table-column align="center" |
| | | label="序号" |
| | | type="index" |
| | | width="60" /> |
| | | <el-table-column label="采购合同号" |
| | | prop="purchaseContractNumber" |
| | | width="180" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" |
| | | prop="productCategory" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" |
| | | prop="specificationModel" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="单位" |
| | | prop="unit" |
| | | width="70" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="剩余库存" |
| | | prop="inboundNum0" |
| | | width="90" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="含税单价(元)" |
| | | prop="taxInclusiveUnitPrice" |
| | | width="150"></el-table-column> |
| | | <el-table-column label="含税总价(元)" |
| | | prop="taxInclusiveTotalPrice" |
| | | width="150"></el-table-column> |
| | | <el-table-column fixed="right" |
| | | label="操作" |
| | | min-width="60" |
| | | align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="openForm(scope.row);">领用</el-button> |
| | | <el-button link |
| | | :disabled="scope.row.inboundNum0 <= 0" |
| | | type="primary" |
| | | size="small" |
| | | @click="openForm(scope.row);">领用</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" :limit="page.size" @pagination="paginationChange" /> |
| | | <pagination v-show="total > 0" |
| | | :total="total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" |
| | | :limit="page.size" |
| | | @pagination="paginationChange" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | <el-dialog v-model="dialogFormVisible" :title="getDialogTitle()" width="40%" @close="closeDia"> |
| | | <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> |
| | | <el-dialog v-model="dialogFormVisible" |
| | | :title="getDialogTitle()" |
| | | width="40%" |
| | | @close="closeDia"> |
| | | <el-form :model="form" |
| | | label-width="140px" |
| | | label-position="top" |
| | | :rules="rules" |
| | | ref="formRef"> |
| | | <div>{{getAvailableQuantityText()}}:{{currentRowNum}}</div> |
| | | <el-form-item :label="getQuantityLabel()" prop="salesContractNo"> |
| | | <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.inboundQuantity" placeholder="请输入" clearable /> |
| | | <el-form-item :label="getQuantityLabel()" |
| | | prop="salesContractNo"> |
| | | <el-input-number :step="0.01" |
| | | :min="0" |
| | | style="width: 100%" |
| | | v-model="form.inboundQuantity" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | <el-form-item :label="getDateLabel()" prop="projectName"> |
| | | <el-date-picker style="width: 100%" v-model="form.inboundTime" value-format="YYYY-MM-DD" format="YYYY-MM-DD" |
| | | type="date" placeholder="请选择" clearable /> |
| | | <el-form-item :label="getDateLabel()" |
| | | prop="projectName"> |
| | | <el-date-picker style="width: 100%" |
| | | v-model="form.inboundTime" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | type="date" |
| | | placeholder="请选择" |
| | | clearable /> |
| | | </el-form-item> |
| | | <el-form-item :label="getPersonLabel()" prop="entryPerson"> |
| | | <el-select v-model="form.nickName" filterable |
| | | <el-form-item :label="getPersonLabel()" |
| | | prop="entryPerson"> |
| | | <el-select v-model="form.nickName" |
| | | filterable |
| | | default-first-option |
| | | :reserve-keyword="false" placeholder="请选择" clearable> |
| | | <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" /> |
| | | :reserve-keyword="false" |
| | | placeholder="请选择" |
| | | clearable> |
| | | <el-option v-for="item in userList" |
| | | :key="item.userId" |
| | | :label="item.nickName" |
| | | :value="item.userId" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">确认</el-button> |
| | | <el-button type="primary" |
| | | @click="submitForm">确认</el-button> |
| | | <el-button @click="closeDia">取消</el-button> |
| | | </div> |
| | | </template> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import pagination from '@/components/PIMTable/Pagination.vue' |
| | | import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue' |
| | | import pagination from "@/components/PIMTable/Pagination.vue"; |
| | | import { ref, reactive, toRefs, onMounted, getCurrentInstance } from "vue"; |
| | | import { ElMessageBox } from "element-plus"; |
| | | import useUserStore from '@/store/modules/user' |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { userListNoPageByTenantId } from "@/api/system/user.js"; |
| | | import { |
| | | getStockInPage, |
| | |
| | | stockOut, |
| | | } from "@/api/inventoryManagement/stockManage.js"; |
| | | |
| | | const userStore = useUserStore() |
| | | const { proxy } = getCurrentInstance() |
| | | const tableData = ref([]) |
| | | const selectedRows = ref([]) |
| | | const userList = ref([]) |
| | | const tableLoading = ref(false) |
| | | const userStore = useUserStore(); |
| | | const { proxy } = getCurrentInstance(); |
| | | const tableData = ref([]); |
| | | const selectedRows = ref([]); |
| | | const userList = ref([]); |
| | | const tableLoading = ref(false); |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | | }) |
| | | const total = ref(0) |
| | | const fileList = ref([]) |
| | | }); |
| | | const total = ref(0); |
| | | const fileList = ref([]); |
| | | |
| | | // 用户信息表单弹框数据 |
| | | const dialogFormVisible = ref(false) |
| | | const activeTab = ref('production') |
| | | const dialogFormVisible = ref(false); |
| | | const activeTab = ref("production"); |
| | | const data = reactive({ |
| | | searchForm: { |
| | | supplierName: '', |
| | | customerName: '', |
| | | inboundQuantity:'', |
| | | inboundTime:'', |
| | | nickName: '', |
| | | userId: '', |
| | | productCategory:'', |
| | | timeStr: '', |
| | | supplierName: "", |
| | | customerName: "", |
| | | inboundQuantity: "", |
| | | inboundTime: "", |
| | | nickName: "", |
| | | userId: "", |
| | | productCategory: "", |
| | | timeStr: "", |
| | | }, |
| | | form: { |
| | | productrecordId: '', |
| | | productrecordId: "", |
| | | }, |
| | | rules: { |
| | | inboundTime: [{ required: true, message: "请选择", trigger: "change" }], |
| | | inboundQuantity: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | nickname: [{ required: true, message: "请选择", trigger: "change" }] |
| | | } |
| | | }) |
| | | const { searchForm, form, rules } = toRefs(data) |
| | | nickname: [{ required: true, message: "请选择", trigger: "change" }], |
| | | }, |
| | | }); |
| | | const { searchForm, form, rules } = toRefs(data); |
| | | |
| | | // 查询列表 |
| | | /** 搜索按钮操作 */ |
| | | const handleQuery = () => { |
| | | page.current = 1 |
| | | getList() |
| | | } |
| | | const paginationChange = (obj) => { |
| | | page.current = 1; |
| | | getList(); |
| | | }; |
| | | const paginationChange = obj => { |
| | | page.current = obj.page; |
| | | page.size = obj.limit; |
| | | getList() |
| | | } |
| | | getList(); |
| | | }; |
| | | const getList = () => { |
| | | tableLoading.value = true |
| | | const params = { ...page } |
| | | if (activeTab.value === 'production') { |
| | | params.customerName = searchForm.value.customerName |
| | | params.timeStr = searchForm.value.timeStr |
| | | tableLoading.value = true; |
| | | const params = { ...page }; |
| | | if (activeTab.value === "production") { |
| | | params.customerName = searchForm.value.customerName; |
| | | params.timeStr = searchForm.value.timeStr; |
| | | } else { |
| | | params.supplierName = searchForm.value.supplierName |
| | | params.timeStr = searchForm.value.timeStr |
| | | params.supplierName = searchForm.value.supplierName; |
| | | params.timeStr = searchForm.value.timeStr; |
| | | } |
| | | params.productCategory = searchForm.value.productCategory |
| | | let apiCall |
| | | if (activeTab.value === 'production') { |
| | | apiCall = getStockInPageByProduction(params) |
| | | params.productCategory = searchForm.value.productCategory; |
| | | let apiCall; |
| | | if (activeTab.value === "production") { |
| | | apiCall = getStockInPageByProduction(params); |
| | | } else { |
| | | apiCall = getStockInPage(params) |
| | | apiCall = getStockInPage(params); |
| | | } |
| | | apiCall.then(res => { |
| | | tableLoading.value = false |
| | | tableData.value = res.data.records |
| | | total.value = res.data.total |
| | | }).catch(() => { |
| | | tableLoading.value = false |
| | | apiCall |
| | | .then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | total.value = res.data.total; |
| | | }) |
| | | } |
| | | .catch(() => { |
| | | tableLoading.value = false; |
| | | }); |
| | | }; |
| | | |
| | | const handleTabChange = () => { |
| | | page.current = 1 |
| | | searchForm.value.supplierName = '' |
| | | searchForm.value.customerName = '' |
| | | searchForm.value.timeStr = '' |
| | | selectedRows.value = [] |
| | | searchForm.value.productCategory = '' |
| | | getList() |
| | | } |
| | | page.current = 1; |
| | | searchForm.value.supplierName = ""; |
| | | searchForm.value.customerName = ""; |
| | | searchForm.value.timeStr = ""; |
| | | selectedRows.value = []; |
| | | searchForm.value.productCategory = ""; |
| | | getList(); |
| | | }; |
| | | |
| | | const findNodeById = (nodes, productId) => { |
| | | for (let i = 0; i < nodes.length; i++) { |
| | |
| | | return null; // 没有找到节点,返回null |
| | | }; |
| | | // 表格选择数据 |
| | | const handleSelectionChange = (selection) => { |
| | | const handleSelectionChange = selection => { |
| | | // 过滤掉子数据 |
| | | selectedRows.value = selection.filter(item => item.id); |
| | | console.log('selection', selectedRows.value) |
| | | } |
| | | const expandedRowKeys = ref([]) |
| | | console.log("selection", selectedRows.value); |
| | | }; |
| | | const expandedRowKeys = ref([]); |
| | | |
| | | // 主表合计方法 |
| | | const summarizeMainTable = (param) => { |
| | | return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); |
| | | const summarizeMainTable = param => { |
| | | return proxy.summarizeTable(param, [ |
| | | "contractAmount", |
| | | "taxInclusiveTotalPrice", |
| | | "taxExclusiveTotalPrice", |
| | | ]); |
| | | }; |
| | | const currentRowId = ref(null) // 新增:存储当前操作的行ID |
| | | const currentRowId = ref(null); // 新增:存储当前操作的行ID |
| | | |
| | | const currentRowNum = ref(0) |
| | | const currentRowNum = ref(0); |
| | | const salesLedgerProductId = ref(null); |
| | | |
| | | // 打开弹框 |
| | | const openForm = async (row) => { |
| | | dialogFormVisible.value = true |
| | | currentRowId.value = row.id |
| | | currentRowNum.value = row.inboundNum0 |
| | | salesLedgerProductId.value = row.salesLedgerProductId |
| | | form.value = {} |
| | | const openForm = async row => { |
| | | dialogFormVisible.value = true; |
| | | currentRowId.value = row.id; |
| | | currentRowNum.value = row.inboundNum0; |
| | | salesLedgerProductId.value = row.salesLedgerProductId; |
| | | form.value = {}; |
| | | // 初始化表单数据 |
| | | form.value = { |
| | | productrecordId: '', |
| | | inboundQuantity: '', // 出库数量清空 |
| | | productrecordId: "", |
| | | inboundQuantity: "", // 出库数量清空 |
| | | inboundTime: getCurrentDate(), // 默认当前日期 |
| | | nickName: '', // 默认当前用户 |
| | | } |
| | | console.log('form',form.value) |
| | | nickName: "", // 默认当前用户 |
| | | }; |
| | | console.log("form", form.value); |
| | | // 加载用户列表 |
| | | try { |
| | | const userLists = await userListNoPageByTenantId() |
| | | userList.value = userLists.data |
| | | const userLists = await userListNoPageByTenantId(); |
| | | userList.value = userLists.data; |
| | | } catch (error) { |
| | | console.error('加载用户列表失败:', error) |
| | | console.error("加载用户列表失败:", error); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // 提交表单 |
| | | const submitForm = () => { |
| | | let num = Number(form.value.inboundQuantity) |
| | | let num = Number(form.value.inboundQuantity); |
| | | if(num <= 0 || num > currentRowNum.value){ |
| | | return proxy.$modal.msgWarning("请填入有效数字") |
| | | return proxy.$modal.msgWarning("请填入有效数字"); |
| | | } |
| | | proxy.$refs["formRef"].validate(valid => { |
| | | if (valid && currentRowId.value) { |
| | | const typeMap = { production: 2, purchase: 1 } |
| | | const typeMap = { production: 2, purchase: 1 }; |
| | | const outData = { |
| | | id: currentRowId.value, // 原始记录ID |
| | | salesLedgerProductId: salesLedgerProductId.value, |
| | | quantity: form.value.inboundQuantity, // 出库数量 |
| | | time: form.value.inboundTime, // 出库时间 |
| | | userId: form.value.nickName, // 操作人 |
| | | type: typeMap[activeTab.value] // 出库类型:采购1,生产2 |
| | | } |
| | | console.log(outData) |
| | | type: typeMap[activeTab.value], // 出库类型:采购1,生产2 |
| | | }; |
| | | console.log(outData); |
| | | |
| | | stockOut(outData).then(res => { |
| | | proxy.$modal.msgSuccess("提交成功") |
| | | closeDia() |
| | | getList() |
| | | }).catch(err => { |
| | | proxy.$modal.msgError("出库失败") |
| | | stockOut(outData) |
| | | .then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | getList(); |
| | | }) |
| | | .catch(err => { |
| | | proxy.$modal.msgError("出库失败"); |
| | | }); |
| | | } |
| | | }) |
| | | } |
| | | }); |
| | | }; |
| | | // 关闭弹框 |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef") |
| | | dialogFormVisible.value = false |
| | | } |
| | | proxy.resetForm("formRef"); |
| | | dialogFormVisible.value = false; |
| | | }; |
| | | |
| | | // 导出 |
| | | const handleOut = () => { |
| | | ElMessageBox.confirm( |
| | | '是否确认导出?', |
| | | '导出', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | } |
| | | ).then(() => { |
| | | // 根据不同的 tab 类型调用不同的导出接口 |
| | | let exportUrl = "/stockin/export" |
| | | if (activeTab.value === 'production') { |
| | | exportUrl = "/stockin/exportOne" |
| | | } |
| | | proxy.download(exportUrl, {}, '入库台账.xlsx') |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已取消") |
| | | ElMessageBox.confirm("是否确认导出?", "导出", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | // 根据不同的 tab 类型调用不同的导出接口 |
| | | let exportUrl = "/stockin/export"; |
| | | if (activeTab.value === "production") { |
| | | exportUrl = "/stockin/exportOne"; |
| | | } |
| | | proxy.download(exportUrl, {}, "入库台账.xlsx"); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已取消"); |
| | | }); |
| | | }; |
| | | // 删除 |
| | | const handleDelete = () => { |
| | | let ids = [] |
| | | let ids = []; |
| | | if (selectedRows.value.length > 0) { |
| | | ids = selectedRows.value.map(item => item.id); |
| | | } else { |
| | | proxy.$modal.msgWarning('请选择数据') |
| | | return |
| | | proxy.$modal.msgWarning("请选择数据"); |
| | | return; |
| | | } |
| | | ElMessageBox.confirm( |
| | | '选中的内容将被删除,是否确认删除?', |
| | | '导出', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | } |
| | | ).then(() => { |
| | | ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "导出", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | delStockManage(ids).then(res => { |
| | | proxy.$modal.msgSuccess("删除成功") |
| | | getList() |
| | | proxy.$modal.msgSuccess("删除成功"); |
| | | getList(); |
| | | }); |
| | | }) |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已取消") |
| | | }) |
| | | } |
| | | .catch(() => { |
| | | proxy.$modal.msg("已取消"); |
| | | }); |
| | | }; |
| | | // 获取当前日期并格式化为 YYYY-MM-DD |
| | | function getCurrentDate() { |
| | | const today = new Date(); |
| | | const year = today.getFullYear(); |
| | | const month = String(today.getMonth() + 1).padStart(2, '0'); // 月份从0开始 |
| | | const day = String(today.getDate()).padStart(2, '0'); |
| | | const month = String(today.getMonth() + 1).padStart(2, "0"); // 月份从0开始 |
| | | const day = String(today.getDate()).padStart(2, "0"); |
| | | return `${year}-${month}-${day}`; |
| | | } |
| | | |
| | | // 根据tab类型获取弹框标题 |
| | | const getDialogTitle = () => { |
| | | const titleMap = { |
| | | production: '新增发货', |
| | | purchase: '新增领用' |
| | | production: "新增发货", |
| | | purchase: "新增领用", |
| | | }; |
| | | return titleMap[activeTab.value] || '新增出库'; |
| | | return titleMap[activeTab.value] || "新增出库"; |
| | | }; |
| | | |
| | | // 根据tab类型获取可出库数量文本 |
| | | const getAvailableQuantityText = () => { |
| | | const textMap = { |
| | | production: '可发货数量', |
| | | purchase: '可领用数量' |
| | | production: "可发货数量", |
| | | purchase: "可领用数量", |
| | | }; |
| | | return textMap[activeTab.value] || '可出库数量'; |
| | | return textMap[activeTab.value] || "可出库数量"; |
| | | }; |
| | | |
| | | // 根据tab类型获取数量字段标签 |
| | | const getQuantityLabel = () => { |
| | | const labelMap = { |
| | | production: '发货数量:', |
| | | purchase: '领用数量:' |
| | | production: "发货数量:", |
| | | purchase: "领用数量:", |
| | | }; |
| | | return labelMap[activeTab.value] || '出库数量:'; |
| | | return labelMap[activeTab.value] || "出库数量:"; |
| | | }; |
| | | |
| | | // 根据tab类型获取日期字段标签 |
| | | const getDateLabel = () => { |
| | | const labelMap = { |
| | | production: '发货日期:', |
| | | purchase: '领用日期:' |
| | | production: "发货日期:", |
| | | purchase: "领用日期:", |
| | | }; |
| | | return labelMap[activeTab.value] || '出库日期:'; |
| | | return labelMap[activeTab.value] || "出库日期:"; |
| | | }; |
| | | |
| | | // 根据tab类型获取人员字段标签 |
| | | const getPersonLabel = () => { |
| | | const labelMap = { |
| | | production: '发货人:', |
| | | purchase: '领用人:' |
| | | production: "发货人:", |
| | | purchase: "领用人:", |
| | | }; |
| | | return labelMap[activeTab.value] || '出库人:'; |
| | | return labelMap[activeTab.value] || "出库人:"; |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getList() |
| | | }) |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"></style> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-tabs v-model="activeTab" @tab-change="handleTabChange"> |
| | | <el-tab-pane label="成品入库" name="production"> |
| | | <el-tabs v-model="activeTab" |
| | | @tab-change="handleTabChange"> |
| | | <el-tab-pane label="成品入库" |
| | | name="production"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title ml10">入库日期:</span> |
| | | <el-date-picker |
| | | v-model="searchForm.timeStr" |
| | | <el-date-picker v-model="searchForm.timeStr" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | @change="handleQuery" |
| | | /> |
| | | @change="handleQuery" /> |
| | | <span class="search_title ml10">产品大类:</span> |
| | | <el-input |
| | | v-model="searchForm.productCategory" |
| | | <el-input v-model="searchForm.productCategory" |
| | | style="width: 240px" |
| | | placeholder="请输入" |
| | | clearable |
| | | /> |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button> |
| | | clearable /> |
| | | <el-button type="primary" |
| | | @click="handleQuery" |
| | | style="margin-left: 10px">搜索</el-button> |
| | | </div> |
| | | <div> |
| | | <el-button @click="handleOut">导出</el-button> |
| | | <el-button type="danger" plain @click="handleDelete">删除</el-button> |
| | | <el-button type="danger" |
| | | plain |
| | | @click="handleDelete">删除</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | | <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" |
| | | :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" type="selection" width="55" /> |
| | | <el-table-column align="center" label="序号" type="index" width="60" /> |
| | | <el-table-column label="入库时间" prop="createTime" show-overflow-tooltip /> |
| | | <el-table-column label="销售合同号" prop="salesContractNo" width="180" show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" prop="productCategory" show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" prop="specificationModel" show-overflow-tooltip /> |
| | | <el-table-column label="单位" prop="unit" width="70" show-overflow-tooltip /> |
| | | <el-table-column label="入库数量" prop="inboundNum" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="单价(元)" prop="unitPrice" width="150"></el-table-column> |
| | | <el-table-column label="总价(元)" prop="totalPrice" width="150"></el-table-column> |
| | | <el-table-column fixed="right" label="操作" min-width="60" align="center"> |
| | | <el-table :data="tableData" |
| | | border |
| | | v-loading="tableLoading" |
| | | @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" |
| | | :row-key="row => row.id" |
| | | show-summary |
| | | style="width: 100%" |
| | | :summary-method="summarizeMainTable" |
| | | height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" |
| | | type="selection" |
| | | width="55" /> |
| | | <el-table-column align="center" |
| | | label="序号" |
| | | type="index" |
| | | width="60" /> |
| | | <el-table-column label="入库时间" |
| | | prop="createTime" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="销售合同号" |
| | | prop="salesContractNo" |
| | | width="180" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" |
| | | prop="productCategory" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" |
| | | prop="specificationModel" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="单位" |
| | | prop="unit" |
| | | width="70" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="入库数量" |
| | | prop="inboundNum" |
| | | width="100" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="单价(元)" |
| | | prop="unitPrice" |
| | | width="150"></el-table-column> |
| | | <el-table-column label="总价(元)" |
| | | prop="totalPrice" |
| | | width="150"></el-table-column> |
| | | <!-- <el-table-column fixed="right" |
| | | label="操作" |
| | | min-width="60" |
| | | align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="openForm('edit', scope.row, 'production');">编辑</el-button> |
| | | <el-button link |
| | | type="primary" |
| | | size="small" |
| | | @click="openForm('edit', scope.row, 'production');">编辑</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> --> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" :limit="page.size" @pagination="paginationChange" /> |
| | | <pagination v-show="total > 0" |
| | | :total="total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" |
| | | :limit="page.size" |
| | | @pagination="paginationChange" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="原料入库" name="purchase"> |
| | | <el-tab-pane label="原料入库" |
| | | name="purchase"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title ml10">入库日期:</span> |
| | | <el-date-picker |
| | | v-model="searchForm.timeStr" |
| | | <el-date-picker v-model="searchForm.timeStr" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | @change="handleQuery" |
| | | /> |
| | | @change="handleQuery" /> |
| | | <span class="search_title ml10">产品大类:</span> |
| | | <el-input |
| | | v-model="searchForm.productCategory" |
| | | <el-input v-model="searchForm.productCategory" |
| | | style="width: 240px" |
| | | placeholder="请输入" |
| | | clearable |
| | | /> |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button> |
| | | clearable /> |
| | | <el-button type="primary" |
| | | @click="handleQuery" |
| | | style="margin-left: 10px">搜索</el-button> |
| | | </div> |
| | | <div> |
| | | <el-button type="primary" @click="openForm('add', 'purchase')">新增入库</el-button> |
| | | <el-button type="primary" |
| | | @click="openForm('add', 'purchase')">新增入库</el-button> |
| | | <el-button @click="handleOut">导出</el-button> |
| | | <el-button type="danger" plain @click="handleDelete">删除</el-button> |
| | | <el-button type="danger" |
| | | plain |
| | | @click="handleDelete">删除</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | | <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" |
| | | :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" type="selection" width="55" /> |
| | | <el-table-column align="center" label="序号" type="index" width="60" /> |
| | | <el-table-column label="入库时间" prop="createTime" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="采购合同号" prop="purchaseContractNumber" width="180" show-overflow-tooltip /> |
| | | <el-table-column label="供应商名称" prop="supplierName" width="240" show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" prop="productCategory" show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" prop="specificationModel" show-overflow-tooltip /> |
| | | <el-table-column label="单位" prop="unit" width="70" show-overflow-tooltip /> |
| | | <el-table-column label="入库数量" prop="inboundNum" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="含税单价(元)" prop="taxInclusiveUnitPrice" width="150"></el-table-column> |
| | | <el-table-column label="含税总价(元)" prop="taxInclusiveTotalPrice" width="150"></el-table-column> |
| | | <el-table-column label="入库人" prop="createBy" width="80" show-overflow-tooltip /> |
| | | <el-table-column fixed="right" label="操作" min-width="60" align="center"> |
| | | <el-table :data="tableData" |
| | | border |
| | | v-loading="tableLoading" |
| | | @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" |
| | | :row-key="row => row.id" |
| | | show-summary |
| | | style="width: 100%" |
| | | :summary-method="summarizeMainTable" |
| | | height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" |
| | | type="selection" |
| | | width="55" /> |
| | | <el-table-column align="center" |
| | | label="序号" |
| | | type="index" |
| | | width="60" /> |
| | | <el-table-column label="入库时间" |
| | | prop="createTime" |
| | | width="100" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="采购合同号" |
| | | prop="purchaseContractNumber" |
| | | width="180" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="供应商名称" |
| | | prop="supplierName" |
| | | width="240" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" |
| | | prop="productCategory" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" |
| | | prop="specificationModel" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="单位" |
| | | prop="unit" |
| | | width="70" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="入库数量" |
| | | prop="inboundNum" |
| | | width="100" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="含税单价(元)" |
| | | prop="taxInclusiveUnitPrice" |
| | | width="150"></el-table-column> |
| | | <el-table-column label="含税总价(元)" |
| | | prop="taxInclusiveTotalPrice" |
| | | width="150"></el-table-column> |
| | | <el-table-column label="入库人" |
| | | prop="createBy" |
| | | width="80" |
| | | show-overflow-tooltip /> |
| | | <el-table-column fixed="right" |
| | | label="操作" |
| | | min-width="60" |
| | | align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="openForm('edit', scope.row, 'purchase');">编辑</el-button> |
| | | <el-button link |
| | | :disabled="scope.row.type == 1" |
| | | type="primary" |
| | | size="small" |
| | | @click="openForm('edit', scope.row, 'purchase');">编辑</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" :limit="page.size" @pagination="paginationChange" /> |
| | | <pagination v-show="total > 0" |
| | | :total="total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" |
| | | :limit="page.size" |
| | | @pagination="paginationChange" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | |
| | | <form-dia ref="formDia" @close="handleQuery" @success="handleQuery"></form-dia> |
| | | <form-dia-product ref="formDiaProduct" @close="handleQuery" @success="handleQuery"></form-dia-product> |
| | | <form-dia ref="formDia" |
| | | @close="handleQuery" |
| | | @success="handleQuery"></form-dia> |
| | | <form-dia-product ref="formDiaProduct" |
| | | @close="handleQuery" |
| | | @success="handleQuery"></form-dia-product> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import pagination from '@/components/PIMTable/Pagination.vue' |
| | | import { ref, reactive, toRefs, onMounted, getCurrentInstance, nextTick } from 'vue' |
| | | import pagination from "@/components/PIMTable/Pagination.vue"; |
| | | import { |
| | | ref, |
| | | reactive, |
| | | toRefs, |
| | | onMounted, |
| | | getCurrentInstance, |
| | | nextTick, |
| | | } from "vue"; |
| | | import { ElMessageBox } from "element-plus"; |
| | | import useUserStore from '@/store/modules/user' |
| | | import dayjs from 'dayjs' |
| | | import useUserStore from "@/store/modules/user"; |
| | | import dayjs from "dayjs"; |
| | | import { |
| | | getStockInPage, |
| | | getStockInPageByProduction, |
| | | delStockIn, |
| | | } from "@/api/inventoryManagement/stockIn.js"; |
| | | import FormDia from './components/formDia.vue' |
| | | import FormDiaProduct from './components/formDiaProduct.vue' |
| | | import FormDia from "./components/formDia.vue"; |
| | | import FormDiaProduct from "./components/formDiaProduct.vue"; |
| | | |
| | | // 获取当前日期 |
| | | function getCurrentDate() { |
| | | return dayjs().format('YYYY-MM-DD') |
| | | return dayjs().format("YYYY-MM-DD"); |
| | | } |
| | | |
| | | const { proxy } = getCurrentInstance() |
| | | const { proxy } = getCurrentInstance(); |
| | | |
| | | const tableData = ref([]) |
| | | const selectedRows = ref([]) |
| | | const tableLoading = ref(false) |
| | | const formDia = ref() |
| | | const formDiaProduct = ref() |
| | | const activeTab = ref('production') // 当前激活的 tab |
| | | const tableData = ref([]); |
| | | const selectedRows = ref([]); |
| | | const tableLoading = ref(false); |
| | | const formDia = ref(); |
| | | const formDiaProduct = ref(); |
| | | const activeTab = ref("production"); // 当前激活的 tab |
| | | |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | | }) |
| | | const total = ref(0) |
| | | }); |
| | | const total = ref(0); |
| | | |
| | | const data = reactive({ |
| | | searchForm: { |
| | | supplierName: '', |
| | | customerName: '', |
| | | productCategory:'', |
| | | timeStr: '', |
| | | supplierName: "", |
| | | customerName: "", |
| | | productCategory: "", |
| | | timeStr: "", |
| | | }, |
| | | }) |
| | | const { searchForm } = toRefs(data) |
| | | }); |
| | | const { searchForm } = toRefs(data); |
| | | // 查询列表 |
| | | /** 搜索按钮操作 */ |
| | | const handleQuery = () => { |
| | | page.current = 1 |
| | | getList() |
| | | } |
| | | const paginationChange = (obj) => { |
| | | page.current = 1; |
| | | getList(); |
| | | }; |
| | | const paginationChange = obj => { |
| | | page.current = obj.page; |
| | | page.size = obj.limit; |
| | | getList() |
| | | } |
| | | getList(); |
| | | }; |
| | | const getList = () => { |
| | | tableLoading.value = true |
| | | const params = { ...page } |
| | | tableLoading.value = true; |
| | | const params = { ...page }; |
| | | |
| | | // 根据不同的 tab 类型传递不同的查询参数 |
| | | if (activeTab.value === 'production') { |
| | | params.customerName = searchForm.value.customerName |
| | | params.timeStr = searchForm.value.timeStr |
| | | if (activeTab.value === "production") { |
| | | params.customerName = searchForm.value.customerName; |
| | | params.timeStr = searchForm.value.timeStr; |
| | | } else { |
| | | params.supplierName = searchForm.value.supplierName |
| | | params.timeStr = searchForm.value.timeStr |
| | | params.supplierName = searchForm.value.supplierName; |
| | | params.timeStr = searchForm.value.timeStr; |
| | | } |
| | | params.productCategory = searchForm.value.productCategory |
| | | params.productCategory = searchForm.value.productCategory; |
| | | |
| | | // 根据不同的 tab 类型调用不同的接口 |
| | | const apiCall = activeTab.value === 'production' |
| | | const apiCall = |
| | | activeTab.value === "production" |
| | | ? getStockInPageByProduction(params) |
| | | : getStockInPage(params) |
| | | : getStockInPage(params); |
| | | |
| | | apiCall.then(res => { |
| | | tableLoading.value = false |
| | | tableData.value = res.data.records |
| | | apiCall |
| | | .then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | |
| | | // 前端计算总价:总价 = unitPrice * inboundNum |
| | | tableData.value = tableData.value.map(item => { |
| | | // 使用入库数量计算总价 |
| | | const inboundNum = Number(item.inboundNum) || 0 |
| | | const unitPrice = Number(item.unitPrice) || 0 |
| | | const taxInclusiveUnitPrice = Number(item.taxInclusiveUnitPrice) || 0 |
| | | const inboundNum = Number(item.inboundNum) || 0; |
| | | const unitPrice = Number(item.unitPrice) || 0; |
| | | const taxInclusiveUnitPrice = Number(item.taxInclusiveUnitPrice) || 0; |
| | | |
| | | // 根据标签页类型计算不同的总价 |
| | | if (activeTab.value === 'production') { |
| | | if (activeTab.value === "production") { |
| | | // 成品库存:总价 = unitPrice * 入库数量 |
| | | item.totalPrice = (unitPrice * inboundNum).toFixed(2) |
| | | item.totalPrice = (unitPrice * inboundNum).toFixed(2); |
| | | } else { |
| | | // 原料和材料库存:含税总价 = taxInclusiveUnitPrice * 入库数量 |
| | | item.taxInclusiveTotalPrice = (taxInclusiveUnitPrice * inboundNum).toFixed(2) |
| | | item.taxInclusiveTotalPrice = ( |
| | | taxInclusiveUnitPrice * inboundNum |
| | | ).toFixed(2); |
| | | } |
| | | |
| | | return item |
| | | }) |
| | | return item; |
| | | }); |
| | | |
| | | total.value = res.data.total |
| | | }).catch(() => { |
| | | tableLoading.value = false |
| | | total.value = res.data.total; |
| | | }) |
| | | } |
| | | .catch(() => { |
| | | tableLoading.value = false; |
| | | }); |
| | | }; |
| | | |
| | | // 切换 tab |
| | | const handleTabChange = (tabName) => { |
| | | page.current = 1 |
| | | const handleTabChange = tabName => { |
| | | page.current = 1; |
| | | // 切换 tab 时清空搜索条件 |
| | | searchForm.value.supplierName = '' |
| | | searchForm.value.customerName = '' |
| | | searchForm.value.timeStr = '' |
| | | searchForm.value.productCategory = '' |
| | | getList() |
| | | } |
| | | searchForm.value.supplierName = ""; |
| | | searchForm.value.customerName = ""; |
| | | searchForm.value.timeStr = ""; |
| | | searchForm.value.productCategory = ""; |
| | | getList(); |
| | | }; |
| | | |
| | | // 打开弹框 |
| | | const openForm = async (type, row, tabType) => { |
| | | const currentTab = tabType || activeTab.value |
| | | const currentTab = tabType || activeTab.value; |
| | | await nextTick(() => { |
| | | if (currentTab === 'production') { |
| | | formDiaProduct.value?.openDialog(type, row) |
| | | if (currentTab === "production") { |
| | | formDiaProduct.value?.openDialog(type, row); |
| | | }else { |
| | | formDia.value?.openDialog(type, row) |
| | | formDia.value?.openDialog(type, row); |
| | | } |
| | | }) |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | // 表格选择数据 |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection.filter(item => item.id) |
| | | } |
| | | const handleSelectionChange = selection => { |
| | | selectedRows.value = selection.filter(item => item.id); |
| | | }; |
| | | |
| | | const expandedRowKeys = ref([]) |
| | | const expandedRowKeys = ref([]); |
| | | |
| | | // 主表合计方法 |
| | | const summarizeMainTable = (param) => { |
| | | return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']) |
| | | } |
| | | const summarizeMainTable = param => { |
| | | return proxy.summarizeTable(param, [ |
| | | "contractAmount", |
| | | "taxInclusiveTotalPrice", |
| | | "taxExclusiveTotalPrice", |
| | | ]); |
| | | }; |
| | | |
| | | // 导出 |
| | | const handleOut = () => { |
| | | ElMessageBox.confirm('是否确认导出?', '导出', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | }).then(() => { |
| | | // 根据不同的 tab 类型调用不同的导出接口 |
| | | let exportUrl = "/stockin/export" |
| | | if (activeTab.value === 'production') { |
| | | exportUrl = "/stockin/exportOne" |
| | | } |
| | | proxy.download(exportUrl, {}, '入库台账.xlsx') |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已取消") |
| | | ElMessageBox.confirm("是否确认导出?", "导出", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | // 根据不同的 tab 类型调用不同的导出接口 |
| | | let exportUrl = "/stockin/export"; |
| | | if (activeTab.value === "production") { |
| | | exportUrl = "/stockin/exportOne"; |
| | | } |
| | | proxy.download(exportUrl, {}, "入库台账.xlsx"); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已取消"); |
| | | }); |
| | | }; |
| | | |
| | | // 删除 |
| | | const handleDelete = () => { |
| | | if (selectedRows.value.length === 0) { |
| | | proxy.$modal.msgWarning('请选择数据') |
| | | return |
| | | proxy.$modal.msgWarning("请选择数据"); |
| | | return; |
| | | } |
| | | const ids = selectedRows.value.map(item => item.id) |
| | | const ids = selectedRows.value.map(item => item.id); |
| | | |
| | | ElMessageBox.confirm('选中的内容将被删除,是否确认删除?', '删除', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | }).then(() => { |
| | | ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "删除", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | // 根据当前 tab 类型选择不同的删除接口和type参数 |
| | | let deleteApi, deleteParams |
| | | let deleteApi, deleteParams; |
| | | |
| | | if (activeTab.value === 'production') { |
| | | if (activeTab.value === "production") { |
| | | // 成品删除,type传2 |
| | | deleteApi = delStockIn |
| | | deleteParams = { ids, type: 2 } |
| | | deleteApi = delStockIn; |
| | | deleteParams = { ids, type: 2 }; |
| | | } else { |
| | | // 原料删除,type传1 |
| | | deleteApi = delStockIn |
| | | deleteParams = { ids, type: 1 } |
| | | deleteApi = delStockIn; |
| | | deleteParams = { ids, type: 1 }; |
| | | } |
| | | |
| | | deleteApi(deleteParams).then(() => { |
| | | proxy.$modal.msgSuccess("删除成功") |
| | | getList() |
| | | }).catch(() => { |
| | | proxy.$modal.msgError("删除失败") |
| | | deleteApi(deleteParams) |
| | | .then(() => { |
| | | proxy.$modal.msgSuccess("删除成功"); |
| | | getList(); |
| | | }) |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已取消") |
| | | .catch(() => { |
| | | proxy.$modal.msgError("删除失败"); |
| | | }); |
| | | }) |
| | | } |
| | | .catch(() => { |
| | | proxy.$modal.msg("已取消"); |
| | | }); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getList() |
| | | }) |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"></style> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-tabs v-model="activeTab" @tab-change="handleTabChange"> |
| | | <el-tab-pane label="成品库存" name="production"> |
| | | <el-tabs v-model="activeTab" |
| | | @tab-change="handleTabChange"> |
| | | <el-tab-pane label="成品库存" |
| | | name="production"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title ml10">入库日期:</span> |
| | | <el-date-picker |
| | | v-model="searchForm.timeStr" |
| | | <el-date-picker v-model="searchForm.timeStr" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | @change="handleQuery" |
| | | /> |
| | | @change="handleQuery" /> |
| | | <span class="search_title ml10">产品大类:</span> |
| | | <el-input |
| | | v-model="searchForm.productCategory" |
| | | <el-input v-model="searchForm.productCategory" |
| | | style="width: 240px" |
| | | placeholder="请输入" |
| | | clearable |
| | | /> |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button> |
| | | clearable /> |
| | | <el-button type="primary" |
| | | @click="handleQuery" |
| | | style="margin-left: 10px">搜索</el-button> |
| | | </div> |
| | | <div> |
| | | <el-button @click="handleOut">导出</el-button> |
| | |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | | <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" |
| | | <el-table :data="tableData" |
| | | border |
| | | v-loading="tableLoading" |
| | | @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" |
| | | :row-key="row => row.id" |
| | | show-summary |
| | | style="width: 100%" |
| | | :row-class-name="tableRowClassName" |
| | | :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" type="selection" width="55" /> |
| | | <el-table-column align="center" label="序号" type="index" width="60" /> |
| | | <el-table-column label="入库日期" prop="createTime" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="销售合同号" prop="salesContractNo" width="180" show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" prop="productCategory" show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" prop="specificationModel" show-overflow-tooltip /> |
| | | <el-table-column label="单位" prop="unit" width="80" show-overflow-tooltip /> |
| | | <el-table-column label="已出库数量" prop="totalInboundNum" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="剩余库存" prop="inboundNum0" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="单价(元)" prop="unitPrice" width="150"></el-table-column> |
| | | <el-table-column label="总价(元)" prop="totalPrice" width="150"></el-table-column> |
| | | <el-table-column fixed="right" label="操作" min-width="60" align="center"> |
| | | :summary-method="summarizeMainTable" |
| | | height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" |
| | | type="selection" |
| | | width="55" /> |
| | | <el-table-column align="center" |
| | | label="序号" |
| | | type="index" |
| | | width="60" /> |
| | | <el-table-column label="入库日期" |
| | | prop="createTime" |
| | | width="100" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="销售合同号" |
| | | prop="salesContractNo" |
| | | width="180" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" |
| | | prop="productCategory" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" |
| | | prop="specificationModel" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="单位" |
| | | prop="unit" |
| | | width="80" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="已出库数量" |
| | | prop="totalInboundNum" |
| | | width="100" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="剩余库存" |
| | | prop="inboundNum0" |
| | | width="100" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="单价(元)" |
| | | prop="unitPrice" |
| | | width="150"></el-table-column> |
| | | <el-table-column label="总价(元)" |
| | | prop="totalPrice" |
| | | width="150"></el-table-column> |
| | | <!-- <el-table-column fixed="right" label="操作" min-width="60" align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">编辑</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table-column> --> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" :limit="page.size" @pagination="paginationChange" /> |
| | | <pagination v-show="total > 0" |
| | | :total="total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" |
| | | :limit="page.size" |
| | | @pagination="paginationChange" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="原料库存" name="purchase"> |
| | | <el-tab-pane label="原料库存" |
| | | name="purchase"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title ml10">入库日期:</span> |
| | | <el-date-picker |
| | | v-model="searchForm.timeStr" |
| | | <el-date-picker v-model="searchForm.timeStr" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | @change="handleQuery" |
| | | /> |
| | | @change="handleQuery" /> |
| | | <span class="search_title ml10">产品大类:</span> |
| | | <el-input |
| | | v-model="searchForm.productCategory" |
| | | <el-input v-model="searchForm.productCategory" |
| | | style="width: 240px" |
| | | placeholder="请输入" |
| | | clearable |
| | | /> |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button> |
| | | clearable /> |
| | | <el-button type="primary" |
| | | @click="handleQuery" |
| | | style="margin-left: 10px">搜索</el-button> |
| | | </div> |
| | | <div> |
| | | <el-button @click="handleOut">导出</el-button> |
| | |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | | <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" :row-key="row => row.id" show-summary style="width: 100%" |
| | | <el-table :data="tableData" |
| | | border |
| | | v-loading="tableLoading" |
| | | @selection-change="handleSelectionChange" |
| | | :expand-row-keys="expandedRowKeys" |
| | | :row-key="row => row.id" |
| | | show-summary |
| | | style="width: 100%" |
| | | :row-class-name="tableRowClassName" |
| | | :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" type="selection" width="55" /> |
| | | <el-table-column align="center" label="序号" type="index" width="60" /> |
| | | <el-table-column label="入库日期" prop="createTime" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="采购合同号" prop="purchaseContractNumber" width="180" show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" prop="productCategory" show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" prop="specificationModel" show-overflow-tooltip /> |
| | | <el-table-column label="单位" prop="unit" width="80" show-overflow-tooltip /> |
| | | <el-table-column label="已出库数量" prop="totalInboundNum" show-overflow-tooltip /> |
| | | <el-table-column label="剩余库存" prop="inboundNum0" show-overflow-tooltip /> |
| | | <el-table-column label="含税单价(元)" prop="taxInclusiveUnitPrice" width="150"></el-table-column> |
| | | <el-table-column label="含税总价(元)" prop="taxInclusiveTotalPrice" width="150"></el-table-column> |
| | | :summary-method="summarizeMainTable" |
| | | height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" |
| | | type="selection" |
| | | width="55" /> |
| | | <el-table-column align="center" |
| | | label="序号" |
| | | type="index" |
| | | width="60" /> |
| | | <el-table-column label="入库日期" |
| | | prop="createTime" |
| | | width="100" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="采购合同号" |
| | | prop="purchaseContractNumber" |
| | | width="180" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="产品大类" |
| | | prop="productCategory" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="规格型号" |
| | | prop="specificationModel" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="单位" |
| | | prop="unit" |
| | | width="80" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="已出库数量" |
| | | prop="totalInboundNum" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="剩余库存" |
| | | prop="inboundNum0" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="含税单价(元)" |
| | | prop="taxInclusiveUnitPrice" |
| | | width="150"></el-table-column> |
| | | <el-table-column label="含税总价(元)" |
| | | prop="taxInclusiveTotalPrice" |
| | | width="150"></el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" :limit="page.size" @pagination="paginationChange" /> |
| | | <pagination v-show="total > 0" |
| | | :total="total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" |
| | | :limit="page.size" |
| | | @pagination="paginationChange" /> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | |
| | | <!-- 成品库存弹框 --> |
| | | <FormDiaProduction |
| | | v-model:dialogFormVisible="productionDialogVisible" |
| | | <FormDiaProduction v-model:dialogFormVisible="productionDialogVisible" |
| | | :operationType="operationType" |
| | | :formData="form" |
| | | @submit="submitForm" |
| | | @close="closeDia" |
| | | /> |
| | | |
| | | @close="closeDia" /> |
| | | <!-- 原料库存弹框 --> |
| | | <FormDiaPurchase |
| | | v-model:dialogFormVisible="purchaseDialogVisible" |
| | | <FormDiaPurchase v-model:dialogFormVisible="purchaseDialogVisible" |
| | | :operationType="operationType" |
| | | :formData="form" |
| | | @submit="submitForm" |
| | | @close="closeDia" |
| | | /> |
| | | @close="closeDia" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import pagination from '@/components/PIMTable/Pagination.vue' |
| | | import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue' |
| | | import pagination from "@/components/PIMTable/Pagination.vue"; |
| | | import { ref, reactive, toRefs, onMounted, getCurrentInstance } from "vue"; |
| | | import { ElMessageBox } from "element-plus"; |
| | | import useUserStore from '@/store/modules/user' |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { userListNoPageByTenantId } from "@/api/system/user.js"; |
| | | import { productTreeList,modelList } from "@/api/basicData/product.js" |
| | | import { productTreeList, modelList } from "@/api/basicData/product.js"; |
| | | import { |
| | | getStockManagePage, |
| | | getStockManagePageByProduction, |
| | | delStockManage, |
| | | } from "@/api/inventoryManagement/stockManage.js"; |
| | | import { |
| | | updateManagement, updateManagementByCustom, updateStockIn |
| | | updateManagement, |
| | | updateManagementByCustom, |
| | | updateStockIn, |
| | | } from "@/api/inventoryManagement/stockIn.js"; |
| | | |
| | | // 导入两个独立的弹框组件 |
| | | import FormDiaProduction from './components/FormDiaProduction.vue' |
| | | import FormDiaPurchase from './components/FormDiaPurchase.vue' |
| | | import FormDiaProduction from "./components/FormDiaProduction.vue"; |
| | | import FormDiaPurchase from "./components/FormDiaPurchase.vue"; |
| | | |
| | | const userStore = useUserStore() |
| | | const { proxy } = getCurrentInstance() |
| | | const tableData = ref([]) |
| | | const productData = ref([]) |
| | | const selectedRows = ref([]) |
| | | const userList = ref([]) |
| | | const productList = ref([]) |
| | | const productModelList = ref([]) |
| | | const userStore = useUserStore(); |
| | | const { proxy } = getCurrentInstance(); |
| | | const tableData = ref([]); |
| | | const productData = ref([]); |
| | | const selectedRows = ref([]); |
| | | const userList = ref([]); |
| | | const productList = ref([]); |
| | | const productModelList = ref([]); |
| | | // const customerOption = ref([]) |
| | | const tableLoading = ref(false) |
| | | const tableLoading = ref(false); |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | | }) |
| | | const total = ref(0) |
| | | const fileList = ref([]) |
| | | }); |
| | | const total = ref(0); |
| | | const fileList = ref([]); |
| | | const loading = ref(false); |
| | | // 用户信息表单弹框数据 |
| | | const operationType = ref('') |
| | | const activeTab = ref('production') |
| | | const operationType = ref(""); |
| | | const activeTab = ref("production"); |
| | | |
| | | // 弹框显示状态 |
| | | const productionDialogVisible = ref(false) |
| | | const purchaseDialogVisible = ref(false) |
| | | const productionDialogVisible = ref(false); |
| | | const purchaseDialogVisible = ref(false); |
| | | |
| | | const data = reactive({ |
| | | searchForm: { |
| | | // supplierName: '', |
| | | productCategory:'', |
| | | customerName: '', |
| | | timeStr: '', |
| | | productCategory: "", |
| | | customerName: "", |
| | | timeStr: "", |
| | | }, |
| | | form: { |
| | | supplierId: null, |
| | | // supplierName: '', |
| | | productId: null, |
| | | productName: '', |
| | | productName: "", |
| | | userId: userStore.userId, |
| | | nickName: '', |
| | | nickName: "", |
| | | productModelId: null, |
| | | model: '', |
| | | unit: '', |
| | | model: "", |
| | | unit: "", |
| | | productrecordId: null, |
| | | unitPrice: '', // 添加成品库存的单价字段 |
| | | taxInclusiveUnitPrice: '', |
| | | taxInclusiveTotalPrice: '', |
| | | taxRate: '', |
| | | taxExclusiveTotalPrice: '', |
| | | inboundTime: '', |
| | | inboundBatch: '', |
| | | stockQuantity: '', |
| | | boundTime: '', |
| | | warnNum: '', // 新增最低库存字段 |
| | | unitPrice: "", // 添加成品库存的单价字段 |
| | | taxInclusiveUnitPrice: "", |
| | | taxInclusiveTotalPrice: "", |
| | | taxRate: "", |
| | | taxExclusiveTotalPrice: "", |
| | | inboundTime: "", |
| | | inboundBatch: "", |
| | | stockQuantity: "", |
| | | boundTime: "", |
| | | warnNum: "", // 新增最低库存字段 |
| | | salesLedgerProductId: null, |
| | | }, |
| | | rules: { |
| | | // supplierName: [{ required: true, message: '请输入供应商名称', trigger: 'blur' }], |
| | | productCategory: [{ required: true, message: '请选择产品大类', trigger: 'change' }], |
| | | specificationModel: [{ required: true, message: '请输入规格型号', trigger: 'blur' }], |
| | | unit: [{ required: true, message: '请输入单位', trigger: 'blur' }], |
| | | stockQuantity: [{ required: true, message: '请输入出库数量', trigger: 'blur' }], |
| | | unitPrice: [{ required: true, message: '请输入单价', trigger: 'blur' }], // 添加成品库存单价的验证规则 |
| | | taxInclusiveUnitPrice: [{ required: true, message: '请输入含税单价', trigger: 'blur' }], |
| | | taxInclusiveTotalPrice: [{ required: true, message: '请输入含税总价', trigger: 'blur' }], |
| | | taxRate: [{ required: true, message: '请输入税率', trigger: 'blur' }], |
| | | taxExclusiveTotalPrice: [{ required: true, message: '请输入不含税总价', trigger: 'blur' }], |
| | | boundTime: [{ required: true, message: '请选择库存时间', trigger: 'change' }], |
| | | inboundTime: [{ required: true, message: '请选择入库时间', trigger: 'change' }], |
| | | inboundPerson: [{ required: true, message: '请选择出库人', trigger: 'change' }], |
| | | warnNum: [{ required: true, message: '请输入最低库存', trigger: 'blur' }], |
| | | } |
| | | }) |
| | | const { searchForm, form, rules } = toRefs(data) |
| | | productCategory: [ |
| | | { required: true, message: "请选择产品大类", trigger: "change" }, |
| | | ], |
| | | specificationModel: [ |
| | | { required: true, message: "请输入规格型号", trigger: "blur" }, |
| | | ], |
| | | unit: [{ required: true, message: "请输入单位", trigger: "blur" }], |
| | | stockQuantity: [ |
| | | { required: true, message: "请输入出库数量", trigger: "blur" }, |
| | | ], |
| | | unitPrice: [{ required: true, message: "请输入单价", trigger: "blur" }], // 添加成品库存单价的验证规则 |
| | | taxInclusiveUnitPrice: [ |
| | | { required: true, message: "请输入含税单价", trigger: "blur" }, |
| | | ], |
| | | taxInclusiveTotalPrice: [ |
| | | { required: true, message: "请输入含税总价", trigger: "blur" }, |
| | | ], |
| | | taxRate: [{ required: true, message: "请输入税率", trigger: "blur" }], |
| | | taxExclusiveTotalPrice: [ |
| | | { required: true, message: "请输入不含税总价", trigger: "blur" }, |
| | | ], |
| | | boundTime: [ |
| | | { required: true, message: "请选择库存时间", trigger: "change" }, |
| | | ], |
| | | inboundTime: [ |
| | | { required: true, message: "请选择入库时间", trigger: "change" }, |
| | | ], |
| | | inboundPerson: [ |
| | | { required: true, message: "请选择出库人", trigger: "change" }, |
| | | ], |
| | | warnNum: [{ required: true, message: "请输入最低库存", trigger: "blur" }], |
| | | }, |
| | | }); |
| | | const { searchForm, form, rules } = toRefs(data); |
| | | |
| | | // 查询列表 |
| | | /** 搜索按钮操作 */ |
| | | const handleQuery = () => { |
| | | page.current = 1 |
| | | getList() |
| | | } |
| | | const paginationChange = (obj) => { |
| | | page.current = 1; |
| | | getList(); |
| | | }; |
| | | const paginationChange = obj => { |
| | | page.current = obj.page; |
| | | page.size = obj.limit; |
| | | getList() |
| | | } |
| | | getList(); |
| | | }; |
| | | const buildQueryParams = () => { |
| | | const params = { |
| | | ...page, |
| | | timeStr: searchForm.value.timeStr, |
| | | } |
| | | params.productCategory = searchForm.value.productCategory |
| | | if (activeTab.value === 'production') { |
| | | params.customerName = searchForm.value.customerName |
| | | }; |
| | | params.productCategory = searchForm.value.productCategory; |
| | | if (activeTab.value === "production") { |
| | | params.customerName = searchForm.value.customerName; |
| | | } else { |
| | | // params.supplierName = searchForm.value.supplierName |
| | | } |
| | | return params |
| | | } |
| | | return params; |
| | | }; |
| | | |
| | | const getList = () => { |
| | | tableLoading.value = true |
| | | const params = buildQueryParams() |
| | | const apiCall = activeTab.value === 'production' |
| | | tableLoading.value = true; |
| | | const params = buildQueryParams(); |
| | | const apiCall = |
| | | activeTab.value === "production" |
| | | ? getStockManagePageByProduction(params) |
| | | : getStockManagePage(params) |
| | | apiCall.then(res => { |
| | | tableLoading.value = false |
| | | tableData.value = res.data.records |
| | | : getStockManagePage(params); |
| | | apiCall |
| | | .then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | |
| | | // 为表格数据自动计算总价 |
| | | tableData.value = tableData.value.map(item => { |
| | | // 计算剩余库存 |
| | | const stockQuantity = parseFloat(item.inboundNum) || 0 |
| | | const outboundQuantity = parseFloat(item.totalInboundNum) || 0 |
| | | const remainingStock = Math.max(stockQuantity - outboundQuantity, 0) |
| | | const stockQuantity = parseFloat(item.inboundNum) || 0; |
| | | const outboundQuantity = parseFloat(item.totalInboundNum) || 0; |
| | | const remainingStock = Math.max(stockQuantity - outboundQuantity, 0); |
| | | |
| | | // 根据标签页类型计算总价 |
| | | if (activeTab.value === 'production') { |
| | | if (activeTab.value === "production") { |
| | | // 成品库存:总价 = 单价 × 剩余库存 |
| | | const unitPrice = parseFloat(item.unitPrice) || 0 |
| | | item.totalPrice = (unitPrice * remainingStock).toFixed(2) |
| | | } else if (activeTab.value === 'purchase') { |
| | | const unitPrice = parseFloat(item.unitPrice) || 0; |
| | | item.totalPrice = (unitPrice * remainingStock).toFixed(2); |
| | | } else if (activeTab.value === "purchase") { |
| | | // 原料库存:含税总价 = 含税单价 × 剩余库存 |
| | | const taxInclusiveUnitPrice = parseFloat(item.taxInclusiveUnitPrice) || 0 |
| | | item.taxInclusiveTotalPrice = (taxInclusiveUnitPrice * remainingStock).toFixed(2) |
| | | const taxInclusiveUnitPrice = |
| | | parseFloat(item.taxInclusiveUnitPrice) || 0; |
| | | item.taxInclusiveTotalPrice = ( |
| | | taxInclusiveUnitPrice * remainingStock |
| | | ).toFixed(2); |
| | | } |
| | | |
| | | return item |
| | | }) |
| | | return item; |
| | | }); |
| | | |
| | | total.value = res.data.total |
| | | total.value = res.data.total; |
| | | // 数据加载完成后检查库存 |
| | | // checkStockAndCreatePurchase(); |
| | | }).catch(() => { |
| | | tableLoading.value = false |
| | | }) |
| | | } |
| | | .catch(() => { |
| | | tableLoading.value = false; |
| | | }); |
| | | }; |
| | | |
| | | // 切换 tab |
| | | const handleTabChange = () => { |
| | | page.current = 1 |
| | | page.current = 1; |
| | | // searchForm.value.supplierName = '' |
| | | searchForm.value.customerName = '' |
| | | searchForm.value.timeStr = '' |
| | | selectedRows.value = [] |
| | | searchForm.value.productCategory = '' |
| | | getList() |
| | | } |
| | | searchForm.value.customerName = ""; |
| | | searchForm.value.timeStr = ""; |
| | | selectedRows.value = []; |
| | | searchForm.value.productCategory = ""; |
| | | getList(); |
| | | }; |
| | | |
| | | // 表格选择数据 |
| | | const handleSelectionChange = (selection) => { |
| | | |
| | | const handleSelectionChange = selection => { |
| | | // 过滤掉子数据 |
| | | selectedRows.value = selection.filter(item => item.id); |
| | | console.log('selection', selectedRows.value) |
| | | } |
| | | const expandedRowKeys = ref([]) |
| | | console.log("selection", selectedRows.value); |
| | | }; |
| | | const expandedRowKeys = ref([]); |
| | | |
| | | // 主表合计方法 |
| | | const summarizeMainTable = (param) => { |
| | | return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); |
| | | const summarizeMainTable = param => { |
| | | return proxy.summarizeTable(param, [ |
| | | "contractAmount", |
| | | "taxInclusiveTotalPrice", |
| | | "taxExclusiveTotalPrice", |
| | | ]); |
| | | }; |
| | | |
| | | // 表格行类名 |
| | |
| | | const stock = Number(row?.inboundNum0 ?? 0); |
| | | const warn = Number(row?.warnNum ?? 0); |
| | | if (!Number.isFinite(stock) || !Number.isFinite(warn)) { |
| | | return ''; |
| | | return ""; |
| | | } |
| | | return stock < warn ? 'row-low-stock' : ''; |
| | | return stock < warn ? "row-low-stock" : ""; |
| | | }; |
| | | |
| | | // 打开弹框 |
| | | const openForm = async (type, row) => { |
| | | operationType.value = type |
| | | form.value = {} |
| | | productData.value = [] |
| | | let userLists = await userListNoPageByTenantId() |
| | | userList.value = userLists.data |
| | | if (type === 'edit') { |
| | | form.value = { ...row } |
| | | operationType.value = type; |
| | | form.value = {}; |
| | | productData.value = []; |
| | | let userLists = await userListNoPageByTenantId(); |
| | | userList.value = userLists.data; |
| | | if (type === "edit") { |
| | | form.value = { ...row }; |
| | | productTreeList().then(res =>{ |
| | | productList.value = res |
| | | productList.value = res; |
| | | productList.value.forEach(i =>{ |
| | | if (i.label === row.productCategory) { |
| | | modelList({ id: i.id }).then((res) => { |
| | | modelList({ id: i.id }).then(res => { |
| | | productModelList.value = res; |
| | | }); |
| | | } |
| | | }) |
| | | }) |
| | | }); |
| | | }); |
| | | } |
| | | form.value.entryDate = getCurrentDate() // 设置默认录入日期为当前日期 |
| | | form.value.entryDate = getCurrentDate(); // 设置默认录入日期为当前日期 |
| | | |
| | | // 根据当前标签页显示对应的弹框 |
| | | if (activeTab.value === 'production') { |
| | | productionDialogVisible.value = true |
| | | } else if (activeTab.value === 'purchase') { |
| | | purchaseDialogVisible.value = true |
| | | if (activeTab.value === "production") { |
| | | productionDialogVisible.value = true; |
| | | } else if (activeTab.value === "purchase") { |
| | | purchaseDialogVisible.value = true; |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // 提交表单 |
| | | const submitForm = (submittedData) => { |
| | | console.log('子组件提交的数据:', submittedData) |
| | | const submitForm = submittedData => { |
| | | console.log("子组件提交的数据:", submittedData); |
| | | |
| | | // 使用子组件提交的数据,而不是父组件的form对象 |
| | | const submitData = { ...submittedData } |
| | | const submitData = { ...submittedData }; |
| | | |
| | | // 根据当前标签页移除对应的总价字段 |
| | | if (activeTab.value === 'production') { |
| | | if (activeTab.value === "production") { |
| | | // 成品库存:移除总价字段 |
| | | delete submitData.totalPrice |
| | | } else if (activeTab.value === 'purchase') { |
| | | delete submitData.totalPrice; |
| | | } else if (activeTab.value === "purchase") { |
| | | // 原料库存:移除含税总价字段 |
| | | delete submitData.taxInclusiveTotalPrice |
| | | delete submitData.taxInclusiveTotalPrice; |
| | | } |
| | | |
| | | // 移除其他可能的总价字段 |
| | | delete submitData.taxExclusiveTotalPrice |
| | | delete submitData.taxExclusiveTotalPrice; |
| | | |
| | | console.log('提交给后端的数据(已移除总价字段):', submitData) |
| | | console.log("提交给后端的数据(已移除总价字段):", submitData); |
| | | |
| | | // 根据当前标签页调用不同的提交接口 |
| | | let apiCall |
| | | if (activeTab.value === 'production') { |
| | | let apiCall; |
| | | if (activeTab.value === "production") { |
| | | // 成品库存使用 updateManagement 接口 |
| | | apiCall = updateManagement(submitData) |
| | | apiCall = updateManagement(submitData); |
| | | } else { |
| | | // 原料库存使用 updateManagementByCustom 接口 |
| | | apiCall = updateManagementByCustom(submitData) |
| | | apiCall = updateManagementByCustom(submitData); |
| | | } |
| | | |
| | | apiCall.then(res => { |
| | | proxy.$modal.msgSuccess("提交成功") |
| | | closeDia() |
| | | getList() |
| | | apiCall |
| | | .then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | getList(); |
| | | // 提交后检查库存并尝试创建请购单 |
| | | // checkStockAndCreatePurchase(); |
| | | }).catch(error => { |
| | | console.error('提交失败:', error) |
| | | proxy.$modal.msgError("提交失败,请重试") |
| | | }) |
| | | } |
| | | .catch(error => { |
| | | console.error("提交失败:", error); |
| | | proxy.$modal.msgError("提交失败,请重试"); |
| | | }); |
| | | }; |
| | | // 检查库存并创建请购单 |
| | | // const checkStockAndCreatePurchase = async () => { |
| | | // const stockList = tableData.value; |
| | |
| | | // }; |
| | | // 关闭弹框 |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef") |
| | | productionDialogVisible.value = false |
| | | purchaseDialogVisible.value = false |
| | | } |
| | | proxy.resetForm("formRef"); |
| | | productionDialogVisible.value = false; |
| | | purchaseDialogVisible.value = false; |
| | | }; |
| | | |
| | | // 导出 |
| | | const handleOut = () => { |
| | | ElMessageBox.confirm( |
| | | '是否确认导出?', |
| | | '导出', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | } |
| | | ).then(() => { |
| | | const exportParams = buildQueryParams() |
| | | // 根据不同的 tab 类型调用不同的导出接口 |
| | | let exportUrl = "/stockin/exportCopy" |
| | | if (activeTab.value === 'production') { |
| | | exportUrl = "/stockin/exportCopyOne" |
| | | } |
| | | proxy.download(exportUrl, exportParams, '库存信息.xlsx') |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已取消") |
| | | ElMessageBox.confirm("是否确认导出?", "导出", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | const exportParams = buildQueryParams(); |
| | | // 根据不同的 tab 类型调用不同的导出接口 |
| | | let exportUrl = "/stockin/exportCopy"; |
| | | if (activeTab.value === "production") { |
| | | exportUrl = "/stockin/exportCopyOne"; |
| | | } |
| | | proxy.download(exportUrl, exportParams, "库存信息.xlsx"); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已取消"); |
| | | }); |
| | | }; |
| | | // 删除 |
| | | const handleDelete = () => { |
| | | let ids = [] |
| | | let ids = []; |
| | | if (selectedRows.value.length > 0) { |
| | | ids = selectedRows.value.map(item => item.id); |
| | | } else { |
| | | proxy.$modal.msgWarning('请选择数据') |
| | | return |
| | | proxy.$modal.msgWarning("请选择数据"); |
| | | return; |
| | | } |
| | | ElMessageBox.confirm( |
| | | '选中的内容将被删除,是否确认删除?', |
| | | '导出', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: '取消', |
| | | type: 'warning', |
| | | } |
| | | ).then(() => { |
| | | ElMessageBox.confirm("选中的内容将被删除,是否确认删除?", "导出", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | delStockManage({ids:ids}).then(res => { |
| | | proxy.$modal.msgSuccess("删除成功") |
| | | getList() |
| | | proxy.$modal.msgSuccess("删除成功"); |
| | | getList(); |
| | | }); |
| | | }) |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已取消") |
| | | }) |
| | | } |
| | | .catch(() => { |
| | | proxy.$modal.msg("已取消"); |
| | | }); |
| | | }; |
| | | // 获取当前日期并格式化为 YYYY-MM-DD |
| | | function getCurrentDate() { |
| | | const today = new Date(); |
| | | const year = today.getFullYear(); |
| | | const month = String(today.getMonth() + 1).padStart(2, '0'); // 月份从0开始 |
| | | const day = String(today.getDate()).padStart(2, '0'); |
| | | const month = String(today.getMonth() + 1).padStart(2, "0"); // 月份从0开始 |
| | | const day = String(today.getDate()).padStart(2, "0"); |
| | | return `${year}-${month}-${day}`; |
| | | } |
| | | onMounted(() => { |
| | | getList() |
| | | getList(); |
| | | // checkStockAndCreatePurchase(); |
| | | // 每小时检查一次库存 |
| | | // const intervalId = setInterval(checkStockAndCreatePurchase, 60 * 60 * 1000); |
| | |
| | | // // 组件卸载时清除定时器 |
| | | // clearInterval(intervalId); |
| | | // }); |
| | | }) |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogFormVisible" |
| | | <el-dialog v-model="dialogFormVisible" |
| | | title="上传附件" |
| | | width="50%" |
| | | @close="closeDia" |
| | | > |
| | | @close="closeDia"> |
| | | <div style="margin-bottom: 10px;text-align: right"> |
| | | <el-upload |
| | | v-model:file-list="fileList" |
| | | <el-upload v-model:file-list="fileList" |
| | | class="upload-demo" |
| | | :action="uploadUrl" |
| | | :on-success="handleUploadSuccess" |
| | |
| | | name="file" |
| | | :show-file-list="false" |
| | | :headers="headers" |
| | | style="display: inline;margin-right: 10px" |
| | | > |
| | | style="display: inline;margin-right: 10px"> |
| | | <el-button type="primary">上传附件</el-button> |
| | | </el-upload> |
| | | <el-button type="danger" plain @click="handleDelete">删除</el-button> |
| | | <el-button type="danger" |
| | | plain |
| | | @click="handleDelete">删除</el-button> |
| | | </div> |
| | | <PIMTable |
| | | rowKey="id" |
| | | <PIMTable rowKey="id" |
| | | :column="tableColumn" |
| | | :tableData="tableData" |
| | | :tableLoading="tableLoading" |
| | |
| | | @selection-change="handleSelectionChange" |
| | | height="500" |
| | | :page="page" |
| | | @pagination="pagination" |
| | | > |
| | | @pagination="pagination"> |
| | | </PIMTable> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | |
| | | |
| | | <script setup> |
| | | import {ref} from "vue"; |
| | | import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js"; |
| | | import { |
| | | getStaffJoinInfo, |
| | | staffJoinAdd, |
| | | staffJoinUpdate, |
| | | } from "@/api/personnelManagement/onboarding.js"; |
| | | import {Search} from "@element-plus/icons-vue"; |
| | | import { |
| | | qualityInspectParamDel, |
| | | qualityInspectParamInfo, |
| | | qualityInspectParamUpdate |
| | | qualityInspectParamUpdate, |
| | | } from "@/api/qualityManagement/qualityInspectParam.js"; |
| | | import {ElMessageBox} from "element-plus"; |
| | | import {getToken} from "@/utils/auth.js"; |
| | | import { |
| | | qualityInspectFileAdd, |
| | | qualityInspectFileDel, |
| | | qualityInspectFileListPage |
| | | qualityInspectFileListPage, |
| | | } from "@/api/qualityManagement/qualityInspectFile.js"; |
| | | import Pagination from "@/components/PIMTable/Pagination.vue"; |
| | | const { proxy } = getCurrentInstance() |
| | | const emit = defineEmits(['close']) |
| | | const { proxy } = getCurrentInstance(); |
| | | const emit = defineEmits(["close"]); |
| | | |
| | | const dialogFormVisible = ref(false); |
| | | const currentId = ref('') |
| | | const currentId = ref(""); |
| | | const selectedRows = ref([]); |
| | | const tableColumn = ref([ |
| | | { |
| | |
| | | { |
| | | name: "下载", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | clickFun: row => { |
| | | downLoadFile(row); |
| | | }, |
| | | } |
| | | }, |
| | | ], |
| | | }, |
| | | ]); |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | | total: 0 |
| | | total: 0, |
| | | }); |
| | | const total = ref(0); |
| | | const tableData = ref([]); |
| | |
| | | const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 上传的图片服务器地址 |
| | | |
| | | // 打开弹框 |
| | | const openDialog = (row) => { |
| | | const openDialog = row => { |
| | | dialogFormVisible.value = true; |
| | | currentId.value = row.id; |
| | | getList() |
| | | } |
| | | const pagination = (obj) => { |
| | | getList(); |
| | | }; |
| | | const pagination = obj => { |
| | | page.current = obj.page; |
| | | page.size = obj.limit; |
| | | getList(); |
| | | }; |
| | | const getList = () => { |
| | | qualityInspectFileListPage({inspectId: currentId.value}).then(res => { |
| | | qualityInspectFileListPage({ inspectId: currentId.value, ...page }).then( |
| | | res => { |
| | | tableData.value = res.data.records; |
| | | page.total = res.data.total; |
| | | }) |
| | | } |
| | | ); |
| | | }; |
| | | // 表格选择数据 |
| | | const handleSelectionChange = (selection) => { |
| | | const handleSelectionChange = selection => { |
| | | selectedRows.value = selection; |
| | | }; |
| | | // 下载附件 |
| | | const downLoadFile = (row) => { |
| | | const downLoadFile = row => { |
| | | proxy.$download.name(row.url); |
| | | } |
| | | }; |
| | | // 关闭弹框 |
| | | const closeDia = () => { |
| | | dialogFormVisible.value = false; |
| | | emit('close') |
| | | emit("close"); |
| | | }; |
| | | // 上传成功处理 |
| | | function handleUploadSuccess(res, file) { |
| | | // 如果上传成功 |
| | | if (res.code == 200) { |
| | | const fileRow = {} |
| | | fileRow.name = res.data.originalName |
| | | fileRow.url = res.data.tempPath |
| | | uploadFile(fileRow) |
| | | const fileRow = {}; |
| | | fileRow.name = res.data.originalName; |
| | | fileRow.url = res.data.tempPath; |
| | | uploadFile(fileRow); |
| | | } else { |
| | | proxy.$modal.msgError("文件上传失败"); |
| | | } |
| | |
| | | file.inspectId = currentId.value; |
| | | qualityInspectFileAdd(file).then(res => { |
| | | proxy.$modal.msgSuccess("文件上传成功"); |
| | | getList() |
| | | }) |
| | | getList(); |
| | | }); |
| | | } |
| | | // 上传失败处理 |
| | | function handleUploadError() { |
| | |
| | | const handleDelete = () => { |
| | | let ids = []; |
| | | if (selectedRows.value.length > 0) { |
| | | ids = selectedRows.value.map((item) => item.id); |
| | | ids = selectedRows.value.map(item => item.id); |
| | | } else { |
| | | proxy.$modal.msgWarning("请选择数据"); |
| | | return; |
| | |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }).then(() => { |
| | | qualityInspectFileDel(ids).then((res) => { |
| | | }) |
| | | .then(() => { |
| | | qualityInspectFileDel(ids).then(res => { |
| | | proxy.$modal.msgSuccess("删除成功"); |
| | | getList(); |
| | | }); |
| | | }).catch(() => { |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已取消"); |
| | | }); |
| | | }; |
| | |
| | | </script> |
| | | |
| | | <style scoped> |
| | | |
| | | </style> |
| | |
| | | submit(row.id); |
| | | }, |
| | | disabled: row => { |
| | | return row.inspectState == 1; |
| | | return row.inspectState == 1 || !row.checkResult; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogFormVisible" |
| | | <el-dialog v-model="dialogFormVisible" |
| | | :title="operationType === 'add' ? '新增不合格管理' : '编辑不合格管理'" |
| | | width="70%" |
| | | @close="closeDia" |
| | | > |
| | | <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> |
| | | @close="closeDia"> |
| | | <el-form :model="form" |
| | | label-width="140px" |
| | | label-position="top" |
| | | :rules="rules" |
| | | ref="formRef"> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="状态:" prop="inspectState"> |
| | | <el-form-item label="状态:" |
| | | prop="inspectState"> |
| | | <el-select v-model="form.inspectState"> |
| | | <el-option label="待处理" :value="0" /> |
| | | <el-option label="已处理" :value="1" /> |
| | | <el-option label="待处理" |
| | | :value="0" /> |
| | | <el-option label="已处理" |
| | | :value="1" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="类别:" prop="inspectType"> |
| | | <el-form-item label="类别:" |
| | | prop="inspectType"> |
| | | <el-select v-model="form.inspectType"> |
| | | <el-option label="原材料检验" :value="0" /> |
| | | <el-option label="过程检验" :value="1" /> |
| | | <el-option label="出厂检验" :value="2" /> |
| | | <el-option label="原材料检验" |
| | | :value="0" /> |
| | | <el-option label="过程检验" |
| | | :value="1" /> |
| | | <el-option label="出厂检验" |
| | | :value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="产品名称:" prop="productId"> |
| | | <el-tree-select |
| | | v-model="form.productId" |
| | | <el-form-item label="产品名称:" |
| | | prop="productId"> |
| | | <el-tree-select v-model="form.productId" |
| | | placeholder="请选择" |
| | | clearable |
| | | check-strictly |
| | | @change="getModels" |
| | | :data="productOptions" |
| | | :render-after-expand="false" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="规格型号:" |
| | | prop="model"> |
| | | <el-input v-model="form.model" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="单位:" |
| | | prop="unit"> |
| | | <el-input v-model="form.unit" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="数量:" |
| | | prop="quantity"> |
| | | <el-input-number :step="0.01" |
| | | :min="0" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="规格型号:" prop="model"> |
| | | <el-input v-model="form.model" placeholder="请输入" clearable/> |
| | | v-model="form.quantity" |
| | | placeholder="请输入" |
| | | clearable |
| | | :precision="2" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="单位:" prop="unit"> |
| | | <el-input v-model="form.unit" placeholder="请输入" clearable/> |
| | | <el-form-item label="检验员:" |
| | | prop="checkName"> |
| | | <el-input v-model="form.checkName" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="数量:" prop="quantity"> |
| | | <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="请输入" clearable :precision="2"/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检验员:" prop="checkName"> |
| | | <el-input v-model="form.checkName" placeholder="请输入" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检测日期:" prop="checkTime"> |
| | | <el-date-picker |
| | | v-model="form.checkTime" |
| | | <el-form-item label="检测日期:" |
| | | prop="checkTime"> |
| | | <el-date-picker v-model="form.checkTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | style="width: 100%" |
| | | /> |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="不合格现象:" prop="defectivePhenomena"> |
| | | <el-input v-model="form.defectivePhenomena" placeholder="请输入" clearable/> |
| | | <el-form-item label="不合格现象:" |
| | | prop="defectivePhenomena"> |
| | | <el-input v-model="form.defectivePhenomena" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="处理结果:" prop="dealResult"> |
| | | <el-input v-model="form.dealResult" placeholder="请输入" clearable/> |
| | | <el-form-item label="处理结果:" |
| | | prop="dealResult"> |
| | | <el-input v-model="form.dealResult" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="处理人:" prop="dealName"> |
| | | <el-input v-model="form.dealName" placeholder="请输入" clearable/> |
| | | <el-form-item label="处理人:" |
| | | prop="dealName"> |
| | | <el-input v-model="form.dealName" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="处理日期:" prop="dealTime"> |
| | | <el-date-picker |
| | | v-model="form.dealTime" |
| | | <el-form-item label="处理日期:" |
| | | prop="dealTime"> |
| | | <el-date-picker v-model="form.dealTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | style="width: 100%" |
| | | /> |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">确认</el-button> |
| | | <el-button type="primary" |
| | | @click="submitForm">确认</el-button> |
| | | <el-button @click="closeDia">取消</el-button> |
| | | </div> |
| | | </template> |
| | |
| | | import { |
| | | getQualityUnqualifiedInfo, |
| | | qualityUnqualifiedAdd, |
| | | qualityUnqualifiedUpdate |
| | | qualityUnqualifiedUpdate, |
| | | } from "@/api/qualityManagement/nonconformingManagement.js"; |
| | | const { proxy } = getCurrentInstance() |
| | | const emit = defineEmits(['close']) |
| | | const { proxy } = getCurrentInstance(); |
| | | const emit = defineEmits(["close"]); |
| | | |
| | | const dialogFormVisible = ref(false); |
| | | const operationType = ref('') |
| | | const operationType = ref(""); |
| | | const data = reactive({ |
| | | form: { |
| | | checkTime: "", |
| | |
| | | quantity: "", |
| | | checkCompany: "", |
| | | checkResult: "", |
| | | inspectState: '', |
| | | inspectType: '', |
| | | defectivePhenomena: '', |
| | | dealResult: '', |
| | | inspectState: "", |
| | | inspectType: "", |
| | | defectivePhenomena: "", |
| | | dealResult: "", |
| | | }, |
| | | rules: { |
| | | checkTime: [{ required: false, message: "请输入", trigger: "blur" },], |
| | | checkTime: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | process: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | checkName: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | productId: [{ required: true, message: "请输入", trigger: "blur" }], |
| | |
| | | quantity: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | checkCompany: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | checkResult: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | defectivePhenomena: [ |
| | | { required: true, message: "请输入", trigger: "blur" }, |
| | | ], |
| | | }, |
| | | }); |
| | | const { form, rules } = toRefs(data); |
| | |
| | | const openDialog = (type, row) => { |
| | | operationType.value = type; |
| | | dialogFormVisible.value = true; |
| | | form.value = {} |
| | | form.value = {}; |
| | | getProductOptions(); |
| | | if (operationType.value === 'edit') { |
| | | if (operationType.value === "edit") { |
| | | getQualityUnqualifiedInfo(row.id).then(res => { |
| | | form.value = {...res.data} |
| | | }) |
| | | form.value = { ...res.data }; |
| | | }); |
| | | } |
| | | } |
| | | }; |
| | | const getProductOptions = () => { |
| | | productTreeList().then((res) => { |
| | | productTreeList().then(res => { |
| | | productOptions.value = convertIdToValue(res); |
| | | }); |
| | | }; |
| | | const getModels = (value) => { |
| | | const getModels = value => { |
| | | form.value.productName = findNodeById(productOptions.value, value); |
| | | }; |
| | | const findNodeById = (nodes, productId) => { |
| | |
| | | return null; // 没有找到节点,返回null |
| | | }; |
| | | function convertIdToValue(data) { |
| | | return data.map((item) => { |
| | | return data.map(item => { |
| | | const { id, children, ...rest } = item; |
| | | const newItem = { |
| | | ...rest, |
| | |
| | | qualityUnqualifiedAdd(form.value).then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | }) |
| | | }); |
| | | } else { |
| | | qualityUnqualifiedUpdate(form.value).then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | }) |
| | | }); |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | }); |
| | | }; |
| | | // 关闭弹框 |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef"); |
| | | dialogFormVisible.value = false; |
| | | emit('close') |
| | | emit("close"); |
| | | }; |
| | | defineExpose({ |
| | | openDialog, |
| | |
| | | </script> |
| | | |
| | | <style scoped> |
| | | |
| | | </style> |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogFormVisible" |
| | | <el-dialog v-model="dialogFormVisible" |
| | | :title="operationType === 'add' ? '新增不合格处理' : '处理不合格'" |
| | | width="70%" |
| | | @close="closeDia" |
| | | > |
| | | <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> |
| | | @close="closeDia"> |
| | | <el-form :model="form" |
| | | label-width="140px" |
| | | label-position="top" |
| | | :rules="rules" |
| | | ref="formRef"> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="状态:" prop="inspectState"> |
| | | <el-form-item label="状态:" |
| | | prop="inspectState"> |
| | | <el-select v-model="form.inspectState"> |
| | | <el-option label="待处理" :value="0" /> |
| | | <el-option label="已处理" :value="1" /> |
| | | <el-option label="待处理" |
| | | :value="0" /> |
| | | <el-option label="已处理" |
| | | :value="1" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="类别:" prop="inspectType"> |
| | | <el-select v-model="form.inspectType" disabled> |
| | | <el-option label="原材料检验" :value="0" /> |
| | | <el-option label="过程检验" :value="1" /> |
| | | <el-option label="出厂检验" :value="2" /> |
| | | <el-form-item label="类别:" |
| | | prop="inspectType"> |
| | | <el-select v-model="form.inspectType" |
| | | disabled> |
| | | <el-option label="原材料检验" |
| | | :value="0" /> |
| | | <el-option label="过程检验" |
| | | :value="1" /> |
| | | <el-option label="出厂检验" |
| | | :value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="产品名称:" prop="productId"> |
| | | <el-tree-select |
| | | v-model="form.productId" |
| | | <el-form-item label="产品名称:" |
| | | prop="productId"> |
| | | <el-tree-select v-model="form.productId" |
| | | placeholder="请选择" |
| | | clearable |
| | | disabled |
| | |
| | | @change="getModels" |
| | | :data="productOptions" |
| | | :render-after-expand="false" |
| | | style="width: 100%" |
| | | /> |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="规格型号:" prop="model"> |
| | | <el-input v-model="form.model" placeholder="请输入" clearable disabled/> |
| | | <el-form-item label="规格型号:" |
| | | prop="model"> |
| | | <el-input v-model="form.model" |
| | | placeholder="请输入" |
| | | clearable |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="单位:" prop="unit"> |
| | | <el-input v-model="form.unit" placeholder="请输入" clearable disabled/> |
| | | <el-form-item label="单位:" |
| | | prop="unit"> |
| | | <el-input v-model="form.unit" |
| | | placeholder="请输入" |
| | | clearable |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="数量:" prop="quantity"> |
| | | <el-input v-model="form.quantity" placeholder="请输入" clearable disabled/> |
| | | <el-form-item label="数量:" |
| | | prop="quantity"> |
| | | <el-input v-model="form.quantity" |
| | | placeholder="请输入" |
| | | clearable |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检验员:" prop="checkName"> |
| | | <el-input v-model="form.checkName" placeholder="请输入" clearable disabled/> |
| | | <el-form-item label="检验员:" |
| | | prop="checkName"> |
| | | <el-input v-model="form.checkName" |
| | | placeholder="请输入" |
| | | clearable |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="检测日期:" prop="checkTime"> |
| | | <el-date-picker |
| | | v-model="form.checkTime" |
| | | <el-form-item label="检测日期:" |
| | | prop="checkTime"> |
| | | <el-date-picker v-model="form.checkTime" |
| | | type="date" |
| | | disabled |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | style="width: 100%" |
| | | /> |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="不合格现象:" prop="defectivePhenomena"> |
| | | <el-input v-model="form.defectivePhenomena" placeholder="请输入" clearable/> |
| | | <el-form-item label="不合格现象:" |
| | | prop="defectivePhenomena"> |
| | | <el-input v-model="form.defectivePhenomena" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="处理结果:" prop="dealResult"> |
| | | <el-input v-model="form.dealResult" placeholder="请输入" clearable/> |
| | | <el-form-item label="处理结果:" |
| | | prop="dealResult"> |
| | | <el-input v-model="form.dealResult" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="处理人:" prop="dealName"> |
| | | <el-input v-model="form.dealName" placeholder="请输入" clearable/> |
| | | <el-form-item label="处理人:" |
| | | prop="dealName"> |
| | | <el-input v-model="form.dealName" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="处理日期:" prop="dealTime"> |
| | | <el-date-picker |
| | | v-model="form.dealTime" |
| | | <el-form-item label="处理日期:" |
| | | prop="dealTime"> |
| | | <el-date-picker v-model="form.dealTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | style="width: 100%" |
| | | /> |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">确认</el-button> |
| | | <el-button type="primary" |
| | | @click="submitForm">确认</el-button> |
| | | <el-button @click="closeDia">取消</el-button> |
| | | </div> |
| | | </template> |
| | |
| | | import { |
| | | getQualityUnqualifiedInfo, |
| | | qualityUnqualifiedAdd, |
| | | qualityUnqualifiedUpdate |
| | | qualityUnqualifiedUpdate, |
| | | } from "@/api/qualityManagement/nonconformingManagement.js"; |
| | | const { proxy } = getCurrentInstance() |
| | | const emit = defineEmits(['close']) |
| | | const { proxy } = getCurrentInstance(); |
| | | const emit = defineEmits(["close"]); |
| | | |
| | | const dialogFormVisible = ref(false); |
| | | const operationType = ref('') |
| | | const operationType = ref(""); |
| | | const data = reactive({ |
| | | form: { |
| | | checkTime: "", |
| | |
| | | quantity: "", |
| | | checkCompany: "", |
| | | checkResult: "", |
| | | inspectState: '', |
| | | inspectType: '', |
| | | defectivePhenomena: '', |
| | | dealResult: '', |
| | | dealName: '', |
| | | dealTime: '', |
| | | inspectState: "", |
| | | inspectType: "", |
| | | defectivePhenomena: "", |
| | | dealResult: "", |
| | | dealName: "", |
| | | dealTime: "", |
| | | }, |
| | | rules: { |
| | | checkTime: [{ required: false, message: "请输入", trigger: "blur" },], |
| | | checkTime: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | process: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | checkName: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | productId: [{ required: false, message: "请输入", trigger: "blur" }], |
| | |
| | | quantity: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | checkCompany: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | checkResult: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | defectivePhenomena: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | defectivePhenomena: [ |
| | | { required: true, message: "请输入", trigger: "blur" }, |
| | | ], |
| | | dealResult: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | dealName: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | dealTime: [{ required: true, message: "请输入", trigger: "change" }], |
| | | defectivePhenomena: [ |
| | | { required: true, message: "请输入", trigger: "blur" }, |
| | | ], |
| | | }, |
| | | }); |
| | | const { form, rules } = toRefs(data); |
| | |
| | | const openDialog = (type, row) => { |
| | | operationType.value = type; |
| | | dialogFormVisible.value = true; |
| | | form.value = {} |
| | | form.value = {}; |
| | | getProductOptions(); |
| | | if (operationType.value === 'edit') { |
| | | if (operationType.value === "edit") { |
| | | getQualityUnqualifiedInfo(row.id).then(res => { |
| | | form.value = {...res.data} |
| | | }) |
| | | form.value = { ...res.data }; |
| | | }); |
| | | } |
| | | } |
| | | }; |
| | | const getProductOptions = () => { |
| | | productTreeList().then((res) => { |
| | | productTreeList().then(res => { |
| | | productOptions.value = convertIdToValue(res); |
| | | }); |
| | | }; |
| | | const getModels = (value) => { |
| | | const getModels = value => { |
| | | form.value.productName = findNodeById(productOptions.value, value); |
| | | }; |
| | | const findNodeById = (nodes, productId) => { |
| | |
| | | return null; // 没有找到节点,返回null |
| | | }; |
| | | function convertIdToValue(data) { |
| | | return data.map((item) => { |
| | | return data.map(item => { |
| | | const { id, children, ...rest } = item; |
| | | const newItem = { |
| | | ...rest, |
| | |
| | | qualityUnqualifiedAdd(form.value).then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | }) |
| | | }); |
| | | } else { |
| | | qualityUnqualifiedUpdate(form.value).then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | }) |
| | | }); |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | }); |
| | | }; |
| | | // 关闭弹框 |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef"); |
| | | dialogFormVisible.value = false; |
| | | emit('close') |
| | | emit("close"); |
| | | }; |
| | | defineExpose({ |
| | | openDialog, |
| | |
| | | </script> |
| | | |
| | | <style scoped> |
| | | |
| | | </style> |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogFormVisible" |
| | | <el-dialog v-model="dialogFormVisible" |
| | | title="上传附件" |
| | | width="50%" |
| | | @close="closeDia" |
| | | > |
| | | @close="closeDia"> |
| | | <div style="margin-bottom: 10px;text-align: right"> |
| | | <el-upload |
| | | v-model:file-list="fileList" |
| | | <el-upload v-model:file-list="fileList" |
| | | class="upload-demo" |
| | | :action="uploadUrl" |
| | | :on-success="handleUploadSuccess" |
| | |
| | | name="file" |
| | | :show-file-list="false" |
| | | :headers="headers" |
| | | style="display: inline;margin-right: 10px" |
| | | > |
| | | style="display: inline;margin-right: 10px"> |
| | | <el-button type="primary">上传附件</el-button> |
| | | </el-upload> |
| | | <el-button type="danger" plain @click="handleDelete">删除</el-button> |
| | | <el-button type="danger" |
| | | plain |
| | | @click="handleDelete">删除</el-button> |
| | | </div> |
| | | <PIMTable |
| | | rowKey="id" |
| | | <PIMTable rowKey="id" |
| | | :column="tableColumn" |
| | | :tableData="tableData" |
| | | :tableLoading="tableLoading" |
| | |
| | | @selection-change="handleSelectionChange" |
| | | height="500" |
| | | :page="page" |
| | | @pagination="pagination" |
| | | > |
| | | @pagination="pagination"> |
| | | </PIMTable> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | |
| | | |
| | | <script setup> |
| | | import {ref} from "vue"; |
| | | import filePreview from '@/components/filePreview/index.vue' |
| | | import filePreview from "@/components/filePreview/index.vue"; |
| | | import {ElMessageBox} from "element-plus"; |
| | | import {getToken} from "@/utils/auth.js"; |
| | | import { |
| | | qualityInspectFileAdd, |
| | | qualityInspectFileDel, |
| | | qualityInspectFileListPage |
| | | qualityInspectFileListPage, |
| | | } from "@/api/qualityManagement/qualityInspectFile.js"; |
| | | const { proxy } = getCurrentInstance() |
| | | const emit = defineEmits(['close']) |
| | | const { proxy } = getCurrentInstance(); |
| | | const emit = defineEmits(["close"]); |
| | | |
| | | const dialogFormVisible = ref(false); |
| | | const currentId = ref('') |
| | | const currentId = ref(""); |
| | | const selectedRows = ref([]); |
| | | const filePreviewRef = ref() |
| | | const filePreviewRef = ref(); |
| | | const tableColumn = ref([ |
| | | { |
| | | label: "文件名称", |
| | |
| | | { |
| | | name: "下载", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | clickFun: row => { |
| | | downLoadFile(row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "预览", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | clickFun: row => { |
| | | lookFile(row); |
| | | }, |
| | | } |
| | | }, |
| | | ], |
| | | }, |
| | | ]); |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | | total: 0 |
| | | total: 0, |
| | | }); |
| | | const total = ref(0); |
| | | const tableData = ref([]); |
| | |
| | | const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 上传的图片服务器地址 |
| | | |
| | | // 打开弹框 |
| | | const openDialog = (row) => { |
| | | const openDialog = row => { |
| | | dialogFormVisible.value = true; |
| | | currentId.value = row.id; |
| | | getList() |
| | | } |
| | | getList(); |
| | | }; |
| | | |
| | | const getList = () => { |
| | | qualityInspectFileListPage({inspectId: currentId.value}).then(res => { |
| | | qualityInspectFileListPage({ inspectId: currentId.value, ...page }).then( |
| | | res => { |
| | | tableData.value = res.data.records; |
| | | page.total = res.data.total; |
| | | }) |
| | | } |
| | | const pagination = (obj) => { |
| | | ); |
| | | }; |
| | | const pagination = obj => { |
| | | page.current = obj.page; |
| | | page.size = obj.limit; |
| | | getList(); |
| | | }; |
| | | // 表格选择数据 |
| | | const handleSelectionChange = (selection) => { |
| | | const handleSelectionChange = selection => { |
| | | selectedRows.value = selection; |
| | | }; |
| | | // 下载附件 |
| | | const downLoadFile = (row) => { |
| | | const downLoadFile = row => { |
| | | proxy.$download.name(row.url); |
| | | } |
| | | }; |
| | | // 关闭弹框 |
| | | const closeDia = () => { |
| | | dialogFormVisible.value = false; |
| | | emit('close') |
| | | emit("close"); |
| | | }; |
| | | // 上传成功处理 |
| | | function handleUploadSuccess(res, file) { |
| | | // 如果上传成功 |
| | | if (res.code == 200) { |
| | | const fileRow = {} |
| | | fileRow.name = res.data.originalName |
| | | fileRow.url = res.data.tempPath |
| | | uploadFile(fileRow) |
| | | const fileRow = {}; |
| | | fileRow.name = res.data.originalName; |
| | | fileRow.url = res.data.tempPath; |
| | | uploadFile(fileRow); |
| | | } else { |
| | | proxy.$modal.msgError("文件上传失败"); |
| | | } |
| | |
| | | file.inspectId = currentId.value; |
| | | qualityInspectFileAdd(file).then(res => { |
| | | proxy.$modal.msgSuccess("文件上传成功"); |
| | | getList() |
| | | }) |
| | | getList(); |
| | | }); |
| | | } |
| | | // 上传失败处理 |
| | | function handleUploadError() { |
| | | proxy.$modal.msgError("文件上传失败"); |
| | | } |
| | | // 预览附件 |
| | | const lookFile = (row) => { |
| | | filePreviewRef.value.open(row.url) |
| | | } |
| | | const lookFile = row => { |
| | | filePreviewRef.value.open(row.url); |
| | | }; |
| | | // 删除 |
| | | const handleDelete = () => { |
| | | let ids = []; |
| | | if (selectedRows.value.length > 0) { |
| | | ids = selectedRows.value.map((item) => item.id); |
| | | ids = selectedRows.value.map(item => item.id); |
| | | } else { |
| | | proxy.$modal.msgWarning("请选择数据"); |
| | | return; |
| | |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }).then(() => { |
| | | qualityInspectFileDel(ids).then((res) => { |
| | | }) |
| | | .then(() => { |
| | | qualityInspectFileDel(ids).then(res => { |
| | | proxy.$modal.msgSuccess("删除成功"); |
| | | getList(); |
| | | }); |
| | | }).catch(() => { |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已取消"); |
| | | }); |
| | | }; |
| | |
| | | </script> |
| | | |
| | | <style scoped> |
| | | |
| | | </style> |
| | |
| | | quantity: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | checkCompany: [{ required: false, message: "请输入", trigger: "blur" }], |
| | | checkResult: [{ required: true, message: "请输入", trigger: "change" }], |
| | | defectivePhenomena: [ |
| | | { required: true, message: "请输入", trigger: "blur" }, |
| | | ], |
| | | }, |
| | | }); |
| | | const userList = ref([]); |
| | |
| | | submit(row.id); |
| | | }, |
| | | disabled: row => { |
| | | return row.inspectState == 1; |
| | | return row.inspectState == 1 || !row.checkResult; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | <el-form-item label="数量:" |
| | | prop="quantity"> |
| | | <el-input-number :step="0.01" |
| | | readonly |
| | | :min="0" |
| | | :disabled="operationType === 'edit'" |
| | | style="width: 100%" |
| | |
| | | submit(row.id); |
| | | }, |
| | | disabled: row => { |
| | | return row.inspectState == 1; |
| | | return row.inspectState == 1 || !row.checkResult; |
| | | }, |
| | | }, |
| | | { |
| | |
| | | const formatDate = (row, column, cellValue) => { |
| | | if (cellValue) { |
| | | const date = new Date(cellValue); |
| | | return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; |
| | | return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(
|
| | | 2,
|
| | | "0"
|
| | | )}-${String(date.getDate()).padStart(2, "0")}`;
|
| | | } |
| | | return ""; |
| | | };
|