<template> 
 | 
  <div class="app-container"> 
 | 
    <div class="search_form"> 
 | 
      <div> 
 | 
        <span class="search_title">供应商名称:</span> 
 | 
        <el-input v-model="searchForm.supplierName" style="width: 240px" placeholder="请输入" @change="handleQuery" 
 | 
          clearable prefix-icon="Search" /> 
 | 
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button> 
 | 
      </div> 
 | 
      <div> 
 | 
        <!-- <el-button type="primary" @click="openForm('add')">新增出库</el-button> --> 
 | 
        <el-button @click="handleOut">导出</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)" stripe> 
 | 
        <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="inboundBatches" width="160" show-overflow-tooltip /> 
 | 
        <el-table-column label="供应商名称" prop="supplierName" width="240" show-overflow-tooltip /> 
 | 
        <el-table-column label="产品大类" prop="productCategory" width="100" show-overflow-tooltip /> 
 | 
        <el-table-column label="规格型号" prop="specificationModel" width="200" show-overflow-tooltip /> 
 | 
        <el-table-column label="单位" prop="unit" width="70" show-overflow-tooltip /> 
 | 
        <el-table-column label="入库数量" prop="inboundNum" width="90" show-overflow-tooltip /> 
 | 
        <el-table-column label="库存数量" prop="inboundNum0" width="90" show-overflow-tooltip /> 
 | 
        <el-table-column label="含税单价" prop="taxInclusiveUnitPrice" width="100" show-overflow-tooltip /> 
 | 
        <el-table-column label="含税总价" prop="taxInclusiveTotalPrice" width="100" show-overflow-tooltip /> 
 | 
        <el-table-column label="税率(%)" prop="taxRate" width="80" show-overflow-tooltip /> 
 | 
        <el-table-column label="不含税总价" prop="taxExclusiveTotalPrice" width="100" show-overflow-tooltip /> 
 | 
        <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(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" /> 
 | 
    </div> 
 | 
    <el-dialog v-model="dialogFormVisible" :title="'新增出库'" width="40%" @close="closeDia"> 
 | 
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> 
 | 
        <el-form-item label="出库数量:" 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="出库日期:" 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="出库人:" prop="entryPerson"> 
 | 
          <el-select v-model="form.nickName" 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 @click="closeDia">取消</el-button> 
 | 
        </div> 
 | 
      </template> 
 | 
    </el-dialog> 
 | 
  </div> 
 | 
</template> 
 | 
  
 | 
<script setup> 
 | 
import pagination from '@/components/PIMTable/Pagination.vue' 
 | 
import { ref } from 'vue' 
 | 
import { ElMessageBox } from "element-plus"; 
 | 
import useUserStore from '@/store/modules/user' 
 | 
import { userListNoPageByTenantId } from "@/api/system/user.js"; 
 | 
import { 
 | 
  getStockInPage 
 | 
} from "@/api/inventoryManagement/stockIn.js"; 
 | 
import { 
 | 
  getStockManagePage, 
 | 
    delStockManage, 
 | 
    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 page = reactive({ 
 | 
  current: 1, 
 | 
  size: 100, 
 | 
}) 
 | 
const total = ref(0) 
 | 
const fileList = ref([]) 
 | 
  
 | 
// 用户信息表单弹框数据 
 | 
const dialogFormVisible = ref(false) 
 | 
const data = reactive({ 
 | 
  searchForm: { 
 | 
    supplierName: '', 
 | 
    inboundQuantity:'', 
 | 
    inboundTime:'', 
 | 
    nickName: '', 
 | 
    userId: '', 
 | 
  }, 
 | 
  form: { 
 | 
    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) 
 | 
  
 | 
// 查询列表 
 | 
/** 搜索按钮操作 */ 
 | 
const handleQuery = () => { 
 | 
  page.current = 1 
 | 
  getList() 
 | 
} 
 | 
const paginationChange = (obj) => { 
 | 
  page.current = obj.page; 
 | 
  page.size = obj.limit; 
 | 
  getList() 
 | 
} 
 | 
const getList = () => { 
 | 
  tableLoading.value = true 
 | 
  getStockInPage({ ...searchForm.value, ...page }).then(res => { 
 | 
    tableLoading.value = false 
 | 
    tableData.value = res.data.records 
 | 
    total.value = res.data.total 
 | 
    console.log('res', res.data.records) 
 | 
  }).catch(() => { 
 | 
    tableLoading.value = false 
 | 
  }) 
 | 
} 
 | 
  
 | 
const findNodeById = (nodes, productId) => { 
 | 
  for (let i = 0; i < nodes.length; i++) { 
 | 
    if (nodes[i].value === productId) { 
 | 
      return nodes[i].label; // 找到节点,返回该节点 
 | 
    } 
 | 
    if (nodes[i].children && nodes[i].children.length > 0) { 
 | 
      const foundNode = findNodeById(nodes[i].children, productId); 
 | 
      if (foundNode) { 
 | 
        return foundNode.label; // 在子节点中找到,返回该节点 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
  return null; // 没有找到节点,返回null 
 | 
}; 
 | 
// 表格选择数据 
 | 
const handleSelectionChange = (selection) => { 
 | 
  // 过滤掉子数据 
 | 
  selectedRows.value = selection.filter(item => item.id); 
 | 
  console.log('selection', selectedRows.value) 
 | 
} 
 | 
const expandedRowKeys = ref([]) 
 | 
  
 | 
// 主表合计方法 
 | 
const summarizeMainTable = (param) => { 
 | 
  return proxy.summarizeTable(param, ['contractAmount', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); 
 | 
}; 
 | 
const currentRowId = ref(null) // 新增:存储当前操作的行ID 
 | 
  
 | 
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 = {} 
 | 
  // 初始化表单数据 
 | 
  form.value = { 
 | 
    productrecordId: '', 
 | 
    inboundQuantity: '', // 出库数量清空 
 | 
    inboundTime: getCurrentDate(), // 默认当前日期 
 | 
    nickName: '', // 默认当前用户 
 | 
  } 
 | 
  console.log('form',form.value) 
 | 
  // 加载用户列表 
 | 
  try { 
 | 
    const userLists = await userListNoPageByTenantId() 
 | 
    userList.value = userLists.data 
 | 
  } catch (error) { 
 | 
    console.error('加载用户列表失败:', error) 
 | 
  } 
 | 
} 
 | 
  
 | 
// 提交表单 
 | 
const submitForm = () => { 
 | 
  let num = Number(form.value.inboundQuantity) 
 | 
  if(num < 1 || num > currentRowNum.value){ 
 | 
    return proxy.$modal.msgWarning("请填入有效数字") 
 | 
  } 
 | 
  proxy.$refs["formRef"].validate(valid => { 
 | 
    if (valid && currentRowId.value) { 
 | 
      const outData = { 
 | 
        id: currentRowId.value, // 原始记录ID 
 | 
        salesLedgerProductId: salesLedgerProductId.value, 
 | 
        quantity: form.value.inboundQuantity, // 出库数量 
 | 
        time: form.value.inboundTime, // 出库时间 
 | 
        userId: form.value.nickName // 操作人 
 | 
      } 
 | 
      console.log(outData) 
 | 
  
 | 
      stockOut(outData).then(res => { 
 | 
        proxy.$modal.msgSuccess("提交成功") 
 | 
        closeDia() 
 | 
        getList() 
 | 
      }).catch(err => { 
 | 
        proxy.$modal.msgError("出库失败") 
 | 
      }) 
 | 
    } 
 | 
  }) 
 | 
} 
 | 
// 关闭弹框 
 | 
const closeDia = () => { 
 | 
  proxy.resetForm("formRef") 
 | 
  dialogFormVisible.value = false 
 | 
} 
 | 
  
 | 
// 导出 
 | 
const handleOut = () => { 
 | 
  ElMessageBox.confirm( 
 | 
    '是否确认导出?', 
 | 
    '导出', { 
 | 
    confirmButtonText: '确认', 
 | 
    cancelButtonText: '取消', 
 | 
    type: 'warning', 
 | 
  } 
 | 
  ).then(() => { 
 | 
    proxy.download("/stockin/export", {}, '入库台账.xlsx') 
 | 
  }).catch(() => { 
 | 
    proxy.$modal.msg("已取消") 
 | 
  }) 
 | 
} 
 | 
// 删除 
 | 
const handleDelete = () => { 
 | 
  let ids = [] 
 | 
  if (selectedRows.value.length > 0) { 
 | 
    ids = selectedRows.value.map(item => item.id); 
 | 
  } else { 
 | 
    proxy.$modal.msgWarning('请选择数据') 
 | 
    return 
 | 
  } 
 | 
  ElMessageBox.confirm( 
 | 
    '选中的内容将被删除,是否确认删除?', 
 | 
    '导出', { 
 | 
    confirmButtonText: '确认', 
 | 
    cancelButtonText: '取消', 
 | 
    type: 'warning', 
 | 
  } 
 | 
  ).then(() => { 
 | 
    delStockManage(ids).then(res => { 
 | 
      proxy.$modal.msgSuccess("删除成功") 
 | 
      getList() 
 | 
    }) 
 | 
  }).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'); 
 | 
  return `${year}-${month}-${day}`; 
 | 
} 
 | 
onMounted(() => { 
 | 
  getList() 
 | 
}) 
 | 
</script> 
 | 
  
 | 
<style scoped lang="scss"></style> 
 |