| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <PageHeader content="å¹è®è®°å½"> |
| | | </PageHeader> |
| | | <div class="search_form"> |
| | | <div class="search_item"> |
| | | <span class="search_title">人ååç§°ï¼</span> |
| | | <el-input v-model="searchForm.searchText" |
| | | style="width: 240px" |
| | | placeholder="è¾å
¥å®¢æ·åç§°æç´¢" |
| | | @change="searchName" |
| | | clearable |
| | | prefix-icon="Search" /> |
| | | <el-button type="primary" |
| | | @click="searchName" |
| | | style="margin-left: 10px">æç´¢</el-button> |
| | | </div> |
| | | <div class="search_item"> |
| | | <span class="search_title">年份ï¼</span> |
| | | <el-date-picker v-model="searchForm.invoiceDate" |
| | | type="year" |
| | | @change="searchDate" |
| | | placeholder="鿩年"> |
| | | </el-date-picker> |
| | | <el-button type="primary" |
| | | @click="searchDate" |
| | | style="margin-left: 10px">æç´¢</el-button> |
| | | <el-button type="primary" |
| | | @click="exportData" |
| | | style="margin-left: 20px;margin-right: 20px">导åº</el-button> |
| | | </div> |
| | | </div> |
| | | <div style="display: flex"> |
| | | <div class="table_list"> |
| | | <el-table :data="tableData" |
| | | border |
| | | v-loading="tableLoading" |
| | | :row-key="(row) => row.id" |
| | | @row-click="rowClickMethod" |
| | | height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" |
| | | label="åºå·" |
| | | type="index" |
| | | width="60" /> |
| | | <el-table-column label="åç§°" |
| | | prop="nickName" |
| | | show-overflow-tooltip |
| | | width="200" /> |
| | | <el-table-column label="æå±é¨é¨" |
| | | prop="deptNames" |
| | | show-overflow-tooltip |
| | | width="200" /> |
| | | <el-table-column label="èç³»æ¹å¼" |
| | | prop="phonenumber" |
| | | show-overflow-tooltip |
| | | width="200" /> |
| | | <!-- <el-table-column label="email" |
| | | prop="email" |
| | | show-overflow-tooltip |
| | | width="200" /> --> |
| | | <!-- <el-table-column label="åºæ¶éé¢(å
)" |
| | | prop="unReceiptPaymentAmount" |
| | | show-overflow-tooltip |
| | | width="200"> |
| | | <template #default="{ row, column }"> |
| | | <el-text type="danger"> |
| | | {{ formattedNumber(row, column, row.unReceiptPaymentAmount) }} |
| | | </el-text> |
| | | </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> |
| | | <div class="table_list"> |
| | | <el-table :data="receiptRecord" |
| | | border |
| | | :row-key="(row) => row.id" |
| | | height="calc(100vh - 18.5em)"> |
| | | <el-table-column align="center" |
| | | label="åºå·" |
| | | type="index" |
| | | width="60" /> |
| | | <el-table-column label="å¹è®æ¥æ" |
| | | prop="trainingDate" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="å¹è®å
容" |
| | | prop="trainingContent" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="å¹è®è¯¾æ¶" |
| | | prop="classHour" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="èæ ¸ç»æ" |
| | | prop="examinationResults" |
| | | show-overflow-tooltip> |
| | | <template #default="{ row }"> |
| | | <el-tag :type="row.examinationResults === 'åæ ¼' ? 'success' : 'danger'"> |
| | | {{ row.examinationResults }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { onMounted, ref } from "vue"; |
| | | import Pagination from "@/components/PIMTable/Pagination.vue"; |
| | | import { |
| | | safeTrainingDetailListPage, |
| | | safeTrainingDetailExport, |
| | | } from "@/api/safeProduction/safetyTrainingAssessment.js"; |
| | | import { userListNoPage } from "@/api/system/user.js"; |
| | | const { proxy } = getCurrentInstance(); |
| | | const tableData = ref([]); |
| | | const receiptRecord = ref([]); |
| | | const tableLoading = ref(false); |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | | }); |
| | | const recordPage = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | | }); |
| | | const total = ref(0); |
| | | const recordTotal = ref(0); |
| | | const data = reactive({ |
| | | searchForm: { |
| | | searchText: "", |
| | | invoiceDate: "", |
| | | }, |
| | | }); |
| | | const customerId = ref(""); |
| | | const { searchForm } = toRefs(data); |
| | | const originReceiptRecord = ref([]); |
| | | // æ¥è¯¢å表 |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | page.current = 1; |
| | | getList(); |
| | | }; |
| | | const paginationChange = obj => { |
| | | page.current = obj.page; |
| | | page.size = obj.limit; |
| | | getList(); |
| | | }; |
| | | const tableDataCopy = ref([]); |
| | | const getList = () => { |
| | | tableLoading.value = true; |
| | | userListNoPage({}).then(res => { |
| | | console.log("res", res.data); |
| | | tableData.value = res.data; |
| | | tableDataCopy.value = res.data; |
| | | if (tableData.value.length > 0) { |
| | | customerId.value = tableData.value[0].userId; |
| | | receiptPaymentList(customerId.value); |
| | | tableLoading.value = false; |
| | | } |
| | | }); |
| | | }; |
| | | const exportData = () => { |
| | | safeTrainingDetailExport({ |
| | | userId: customerId.value, |
| | | }) |
| | | .then(res => { |
| | | // å建Blob对象 |
| | | const blob = new Blob([res], { |
| | | type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
| | | }); |
| | | // å建ä¸è½½é¾æ¥ |
| | | const url = window.URL.createObjectURL(blob); |
| | | const link = document.createElement("a"); |
| | | link.href = url; |
| | | link.download = `è®°å½è¯¦æ
_${tableData.value[0].nickName}.docx`; |
| | | |
| | | // 模æç¹å»ä¸è½½ |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | |
| | | // æ¸
ç临æ¶å¯¹è±¡ |
| | | setTimeout(() => { |
| | | document.body.removeChild(link); |
| | | window.URL.revokeObjectURL(url); |
| | | }, 100); |
| | | |
| | | ElMessage.success("å¯¼åºæå"); |
| | | }) |
| | | .catch(err => { |
| | | console.error("导åºå¤±è´¥:", err); |
| | | ElMessage.error("导åºå¤±è´¥ï¼è¯·éè¯"); |
| | | }); |
| | | }; |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | }; |
| | | // 主表åè®¡æ¹æ³ |
| | | const summarizeMainTable = param => { |
| | | return proxy.summarizeTable( |
| | | param, |
| | | ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"], |
| | | { |
| | | ticketsNum: { noDecimal: true }, // ä¸ä¿çå°æ° |
| | | futureTickets: { noDecimal: true }, // ä¸ä¿çå°æ° |
| | | } |
| | | ); |
| | | }; |
| | | // å表åè®¡æ¹æ³ |
| | | const summarizeMainTable1 = param => { |
| | | var summarizeTable = proxy.summarizeTable( |
| | | param, |
| | | ["invoiceAmount", "receiptAmount", "unReceiptAmount"], |
| | | { |
| | | ticketsNum: { noDecimal: true }, // ä¸ä¿çå°æ° |
| | | futureTickets: { noDecimal: true }, // ä¸ä¿çå°æ° |
| | | } |
| | | ); |
| | | // åæåä¸è¡æ°æ®; |
| | | if (receiptRecord.value?.length > 0) { |
| | | const index = tableData.value.findIndex( |
| | | item => item.id == customerId.value |
| | | ); |
| | | summarizeTable[summarizeTable.length - 1] = |
| | | tableData.value[index].unReceiptPaymentAmount.toFixed(2); |
| | | } else { |
| | | summarizeTable[summarizeTable.length - 1] = 0.0; |
| | | } |
| | | return summarizeTable; |
| | | }; |
| | | const goBack = () => { |
| | | proxy.$router.push({ |
| | | path: "/safeProduction/safetyTrainingAssessment", |
| | | }); |
| | | }; |
| | | const searchName = () => { |
| | | tableData.value = tableDataCopy.value; |
| | | if (searchForm.value.searchText) { |
| | | tableData.value = tableData.value.filter(item => |
| | | item.nickName.includes(searchForm.value.searchText) |
| | | ); |
| | | customerId.value = tableData.value[0].userId; |
| | | } |
| | | |
| | | receiptPaymentList(customerId.value); |
| | | }; |
| | | const dateFormat = (date, format = "yyyy-MM-dd") => { |
| | | const year = date.getFullYear(); |
| | | const month = String(date.getMonth() + 1).padStart(2, "0"); |
| | | const day = String(date.getDate()).padStart(2, "0"); |
| | | return format.replace("yyyy", year).replace("MM", month).replace("dd", day); |
| | | }; |
| | | const searchDate = () => { |
| | | receiptRecord.value = originReceiptRecordCopy.value; |
| | | console.log("searchForm.value.invoiceDate", searchForm.value.invoiceDate); |
| | | if (searchForm.value.invoiceDate) { |
| | | const year = dateFormat(searchForm.value.invoiceDate, "yyyy"); |
| | | receiptRecord.value = receiptRecord.value.filter(item => { |
| | | console.log("item.trainingDate", item.trainingDate); |
| | | return item.trainingDate.includes(year); |
| | | }); |
| | | } |
| | | }; |
| | | const originReceiptRecordCopy = ref([]); |
| | | const receiptPaymentList = id => { |
| | | const param = { |
| | | userId: id, |
| | | }; |
| | | console.log("param", param); |
| | | safeTrainingDetailListPage(param).then(res => { |
| | | originReceiptRecord.value = res.data.records; |
| | | handlePagination({ page: 1, limit: recordPage.size }); |
| | | recordTotal.value = res.data.length; |
| | | }); |
| | | }; |
| | | |
| | | // æ±æ¬¾è®°å½å表å页 |
| | | const recordPaginationChange = pagination => { |
| | | handlePagination(pagination); |
| | | }; |
| | | |
| | | const rowClickMethod = row => { |
| | | customerId.value = row.userId; |
| | | receiptPaymentList(customerId.value); |
| | | }; |
| | | |
| | | const handlePagination = ({ page, limit }) => { |
| | | recordPage.current = page; |
| | | recordPage.size = limit; |
| | | |
| | | const start = (page - 1) * limit; |
| | | const end = start + limit; |
| | | |
| | | receiptRecord.value = originReceiptRecord.value.slice(start, end); |
| | | originReceiptRecordCopy.value = originReceiptRecord.value.slice(start, end); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .table_list { |
| | | width: 50%; |
| | | } |
| | | .search_back { |
| | | cursor: pointer; |
| | | color: #0f497e; |
| | | } |
| | | .search_item { |
| | | width: 50%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: flex-start; |
| | | margin-right: 20px; |
| | | } |
| | | </style> |