| | |
| | | import request from '@/utils/request' |
| | | |
| | | // å页æ¥è¯¢ |
| | | export function listPage(params) { |
| | | export function lavorIssueListPage(params) { |
| | | return request({ |
| | | url: '/lavorIssue/listPage', |
| | | method: 'get', |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="dynamic-table-container"> |
| | | <el-table |
| | | ref="tableRef" |
| | | v-loading="loading" |
| | | :data="tableData" |
| | | :border="border" |
| | | :height="height" |
| | | :header-cell-style="{ background: '#F0F1F5', color: '#333333' }" |
| | | style="width: 100%" |
| | | @selection-change="handleSelectionChange" |
| | | @row-click="handleRowClick" |
| | | > |
| | | <!-- éæ©å --> |
| | | <el-table-column |
| | | v-if="showSelection" |
| | | align="center" |
| | | type="selection" |
| | | width="55" |
| | | /> |
| | | |
| | | <!-- åºå·å --> |
| | | <el-table-column |
| | | v-if="showIndex" |
| | | align="center" |
| | | label="åºå·" |
| | | type="index" |
| | | width="60" |
| | | /> |
| | | |
| | | <!-- åºå®åï¼é¨é¨ --> |
| | | <el-table-column |
| | | label="é¨é¨" |
| | | prop="department" |
| | | width="120" |
| | | show-overflow-tooltip |
| | | align="center" |
| | | /> |
| | | |
| | | <!-- åºå®åï¼å§å --> |
| | | <el-table-column |
| | | label="å§å" |
| | | prop="name" |
| | | width="100" |
| | | show-overflow-tooltip |
| | | align="center" |
| | | /> |
| | | |
| | | <!-- åºå®åï¼å·¥å· --> |
| | | <el-table-column |
| | | label="å·¥å·" |
| | | prop="employeeId" |
| | | width="100" |
| | | show-overflow-tooltip |
| | | align="center" |
| | | /> |
| | | |
| | | <!-- 卿åï¼æ ¹æ®åå
¸æ¸²æ --> |
| | | <el-table-column |
| | | v-for="(dictItem, index) in dynamicColumns" |
| | | :key="dictItem.value" |
| | | :label="dictItem.label" |
| | | :prop="dictItem.value" |
| | | :width="dictItem.width || 120" |
| | | show-overflow-tooltip |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <!-- æ ¹æ®åå
¸ç±»å渲æä¸åçæ¾ç¤ºæ¹å¼ --> |
| | | <template v-if="dictItem.renderType === 'tag'"> |
| | | <el-tag |
| | | :type="getTagType(scope.row[dictItem.value])" |
| | | size="small" |
| | | > |
| | | {{ getDictValueLabel(dictItem.dictType, scope.row[dictItem.value]) }} |
| | | </el-tag> |
| | | </template> |
| | | <template v-else-if="dictItem.renderType === 'select'"> |
| | | <el-select |
| | | v-model="scope.row[dictItem.value]" |
| | | placeholder="è¯·éæ©" |
| | | size="small" |
| | | @change="handleSelectChange(scope.row, dictItem.value, $event)" |
| | | > |
| | | <el-option |
| | | v-for="option in dictItem.options" |
| | | :key="option.value" |
| | | :label="option.label" |
| | | :value="option.value" |
| | | /> |
| | | </el-select> |
| | | </template> |
| | | <template v-else-if="dictItem.renderType === 'input'"> |
| | | <el-input |
| | | v-model="scope.row[dictItem.value]" |
| | | size="small" |
| | | placeholder="请è¾å
¥" |
| | | @blur="handleInputChange(scope.row, dictItem.value, $event)" |
| | | /> |
| | | </template> |
| | | <template v-else> |
| | | <span>{{ getDictValueLabel(dictItem.dictType, scope.row[dictItem.value]) }}</span> |
| | | </template> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <!-- æä½å --> |
| | | <el-table-column |
| | | v-if="showActions" |
| | | label="æä½" |
| | | width="150" |
| | | align="center" |
| | | fixed="right" |
| | | > |
| | | <template #default="scope"> |
| | | <el-button |
| | | type="primary" |
| | | link |
| | | size="small" |
| | | @click="handleEdit(scope.row, scope.$index)" |
| | | > |
| | | ç¼è¾ |
| | | </el-button> |
| | | <el-button |
| | | type="danger" |
| | | link |
| | | size="small" |
| | | @click="handleDelete(scope.row, scope.$index)" |
| | | > |
| | | å é¤ |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页ç»ä»¶ --> |
| | | <div v-if="showPagination" class="pagination-container"> |
| | | <el-pagination |
| | | v-model:current-page="pagination.current" |
| | | v-model:page-size="pagination.size" |
| | | :page-sizes="[10, 20, 50, 100]" |
| | | :total="pagination.total" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, onMounted, watch } from 'vue' |
| | | import { useDict } from '@/utils/dict' |
| | | |
| | | // å®ä¹ç»ä»¶å±æ§ |
| | | const props = defineProps({ |
| | | // è¡¨æ ¼æ°æ® |
| | | data: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | // åå
¸ç±»åæ°ç»ï¼ç¨äºå¨æçæå |
| | | dictTypes: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºéæ©å |
| | | showSelection: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºåºå·å |
| | | showIndex: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºæä½å |
| | | showActions: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºå页 |
| | | showPagination: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // è¡¨æ ¼é«åº¦ |
| | | height: { |
| | | type: [String, Number], |
| | | default: 'auto' |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºè¾¹æ¡ |
| | | border: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // å è½½ç¶æ |
| | | loading: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // å页é
ç½® |
| | | pagination: { |
| | | type: Object, |
| | | default: () => ({ |
| | | current: 1, |
| | | size: 10, |
| | | total: 0 |
| | | }) |
| | | } |
| | | }) |
| | | |
| | | // å®ä¹äºä»¶ |
| | | const emit = defineEmits([ |
| | | 'selection-change', |
| | | 'row-click', |
| | | 'edit', |
| | | 'delete', |
| | | 'select-change', |
| | | 'input-change', |
| | | 'size-change', |
| | | 'current-change' |
| | | ]) |
| | | |
| | | // ååºå¼æ°æ® |
| | | const tableRef = ref(null) |
| | | const tableData = ref([]) |
| | | |
| | | // è·ååå
¸æ°æ® |
| | | const dictData = ref({}) |
| | | |
| | | // 卿åé
ç½® |
| | | const dynamicColumns = computed(() => { |
| | | const columns = [] |
| | | |
| | | props.dictTypes.forEach(dictType => { |
| | | const dictItems = dictData.value[dictType] || [] |
| | | // 为æ¯ä¸ªåå
¸ç±»åå建ä¸ä¸ªåï¼è䏿¯ä¸ºæ¯ä¸ªåå
¸é¡¹å建å |
| | | if (dictItems.length > 0) { |
| | | columns.push({ |
| | | label: getDictLabel(dictType), // è·ååå
¸ç±»åçæ¾ç¤ºåç§° |
| | | value: dictType, // 使ç¨åå
¸ç±»åä½ä¸ºå段å |
| | | width: 120, |
| | | renderType: 'tag', // é»è®¤ä½¿ç¨æ ç¾æ¾ç¤º |
| | | options: dictItems, // æä¾é项 |
| | | dictType: dictType |
| | | }) |
| | | } |
| | | }) |
| | | |
| | | return columns |
| | | }) |
| | | |
| | | // è·ååå
¸ç±»åçæ¾ç¤ºåç§° |
| | | const getDictLabel = (dictType) => { |
| | | const labelMap = { |
| | | 'sys_normal_disable': 'ç¶æ', |
| | | 'sys_user_level': '级å«', |
| | | 'sys_user_position': 'èä½', |
| | | 'sys_yes_no': 'æ¯å¦', |
| | | 'sys_user_sex': 'æ§å«', |
| | | 'sys_lavor_issue': 'å³å¡é®é¢' // æ·»å å³å¡é®é¢åå
¸ |
| | | } |
| | | return labelMap[dictType] || dictType |
| | | } |
| | | |
| | | // è·ååå
¸æ°æ® |
| | | const loadDictData = async () => { |
| | | try { |
| | | const dictPromises = props.dictTypes.map(async (dictType) => { |
| | | const { getDicts } = await import('@/api/system/dict/data') |
| | | const response = await getDicts(dictType) |
| | | return { |
| | | type: dictType, |
| | | data: response.data.map(item => ({ |
| | | label: item.dictLabel, |
| | | value: item.dictValue, |
| | | elTagType: item.listClass, |
| | | elTagClass: item.cssClass |
| | | })) |
| | | } |
| | | }) |
| | | |
| | | const results = await Promise.all(dictPromises) |
| | | results.forEach(result => { |
| | | dictData.value[result.type] = result.data |
| | | }) |
| | | } catch (error) { |
| | | console.error('å è½½åå
¸æ°æ®å¤±è´¥:', error) |
| | | // 妿åå
¸å 载失败ï¼ä½¿ç¨é»è®¤æ°æ® |
| | | props.dictTypes.forEach(dictType => { |
| | | if (!dictData.value[dictType]) { |
| | | dictData.value[dictType] = [] |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | |
| | | // è·åæ ç¾ç±»å |
| | | const getTagType = (value) => { |
| | | // æ ¹æ®å¼è¿åä¸åçæ ç¾ç±»å |
| | | if (value === '1' || value === 'true' || value === 'æ¯') return 'success' |
| | | if (value === '0' || value === 'false' || value === 'å¦') return 'danger' |
| | | if (value === '2' || value === 'warning') return 'warning' |
| | | return 'info' |
| | | } |
| | | |
| | | // è·ååå
¸å¼çæ ç¾ |
| | | const getDictValueLabel = (dictType, value) => { |
| | | if (!value) return '-' |
| | | const dictItems = dictData.value[dictType] || [] |
| | | const item = dictItems.find(item => item.value === value) |
| | | return item ? item.label : value |
| | | } |
| | | |
| | | // äºä»¶å¤ç彿° |
| | | const handleSelectionChange = (selection) => { |
| | | emit('selection-change', selection) |
| | | } |
| | | |
| | | const handleRowClick = (row, column, event) => { |
| | | emit('row-click', row, column, event) |
| | | } |
| | | |
| | | const handleEdit = (row, index) => { |
| | | emit('edit', row, index) |
| | | } |
| | | |
| | | const handleDelete = (row, index) => { |
| | | emit('delete', row, index) |
| | | } |
| | | |
| | | const handleSelectChange = (row, prop, value) => { |
| | | emit('select-change', row, prop, value) |
| | | } |
| | | |
| | | const handleInputChange = (row, prop, event) => { |
| | | emit('input-change', row, prop, event.target.value) |
| | | } |
| | | |
| | | const handleSizeChange = (size) => { |
| | | emit('size-change', size) |
| | | } |
| | | |
| | | const handleCurrentChange = (current) => { |
| | | emit('current-change', current) |
| | | } |
| | | |
| | | // ç嬿°æ®åå |
| | | watch(() => props.data, (newData) => { |
| | | tableData.value = newData |
| | | }, { immediate: true }) |
| | | |
| | | // çå¬åå
¸ç±»ååå |
| | | watch(() => props.dictTypes, () => { |
| | | loadDictData() |
| | | }, { immediate: true }) |
| | | |
| | | // ç»ä»¶æè½½æ¶å è½½åå
¸æ°æ® |
| | | onMounted(() => { |
| | | loadDictData() |
| | | }) |
| | | |
| | | // æ´é²æ¹æ³ç»ç¶ç»ä»¶ |
| | | defineExpose({ |
| | | tableRef, |
| | | getSelection: () => tableRef.value?.getSelectionRows() || [], |
| | | clearSelection: () => tableRef.value?.clearSelection(), |
| | | toggleRowSelection: (row, selected) => tableRef.value?.toggleRowSelection(row, selected), |
| | | setCurrentRow: (row) => tableRef.value?.setCurrentRow(row) |
| | | }) |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .dynamic-table-container { |
| | | width: 100%; |
| | | } |
| | | |
| | | .pagination-container { |
| | | margin-top: 20px; |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | } |
| | | |
| | | :deep(.el-table .el-table__header-wrapper th) { |
| | | background-color: #F0F1F5 !important; |
| | | color: #333333; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | :deep(.el-table .el-table__body-wrapper td) { |
| | | padding: 8px 0; |
| | | } |
| | | |
| | | :deep(.el-select) { |
| | | width: 100%; |
| | | } |
| | | |
| | | :deep(.el-input) { |
| | | width: 100%; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <div class="search-form"> |
| | | <el-form :inline="true" :model="searchForm"> |
| | | <el-form-item label="é¨é¨"> |
| | | <el-input |
| | | v-model="searchForm.department" |
| | | placeholder="请è¾å
¥é¨é¨åç§°" |
| | | clearable |
| | | style="width: 200px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="å§å"> |
| | | <el-input |
| | | v-model="searchForm.name" |
| | | placeholder="请è¾å
¥å§å" |
| | | clearable |
| | | style="width: 200px" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleSearch">æç´¢</el-button> |
| | | <el-button @click="handleReset">éç½®</el-button> |
| | | <el-button type="success" @click="handleAdd">æ°å¢</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | |
| | | <div class="table-container"> |
| | | <DynamicTable |
| | | ref="dynamicTableRef" |
| | | :data="tableData" |
| | | :dict-types="dictTypes" |
| | | :loading="loading" |
| | | :show-selection="true" |
| | | :show-actions="true" |
| | | :show-pagination="true" |
| | | :pagination="pagination" |
| | | height="calc(100vh - 280px)" |
| | | @selection-change="handleSelectionChange" |
| | | @edit="handleEdit" |
| | | @delete="handleDelete" |
| | | @select-change="handleSelectChange" |
| | | @input-change="handleInputChange" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handleCurrentChange" |
| | | /> |
| | | </div> |
| | | |
| | | <!-- æ°å¢/ç¼è¾å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="dialogTitle" |
| | | width="600px" |
| | | append-to-body |
| | | > |
| | | <el-form |
| | | ref="formRef" |
| | | :model="form" |
| | | :rules="rules" |
| | | label-width="100px" |
| | | > |
| | | <el-form-item label="é¨é¨" prop="department"> |
| | | <el-input v-model="form.department" placeholder="请è¾å
¥é¨é¨" /> |
| | | </el-form-item> |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-input v-model="form.name" placeholder="请è¾å
¥å§å" /> |
| | | </el-form-item> |
| | | <el-form-item label="å·¥å·" prop="employeeId"> |
| | | <el-input v-model="form.employeeId" placeholder="请è¾å
¥å·¥å·" /> |
| | | </el-form-item> |
| | | |
| | | <!-- å¨æè¡¨åé¡¹ï¼æ ¹æ®åå
¸çæ --> |
| | | <el-form-item |
| | | v-for="dictItem in dynamicFormItems" |
| | | :key="dictItem.value" |
| | | :label="dictItem.label" |
| | | :prop="dictItem.value" |
| | | > |
| | | <el-select |
| | | v-model="form[dictItem.value]" |
| | | placeholder="è¯·éæ©" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="option in dictItem.options" |
| | | :key="option.value" |
| | | :label="option.label" |
| | | :value="option.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="dialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="handleSubmit">ç¡®å®</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, computed, onMounted } from 'vue' |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | import DynamicTable from '@/components/DynamicTable/index.vue' |
| | | |
| | | // ååºå¼æ°æ® |
| | | const loading = ref(false) |
| | | const dialogVisible = ref(false) |
| | | const dialogTitle = ref('') |
| | | const editIndex = ref(-1) |
| | | const selectedRows = ref([]) |
| | | |
| | | // æç´¢è¡¨å |
| | | const searchForm = reactive({ |
| | | department: '', |
| | | name: '' |
| | | }) |
| | | |
| | | // è¡¨æ ¼æ°æ® |
| | | const tableData = ref([ |
| | | { |
| | | id: 1, |
| | | department: 'ææ¯é¨', |
| | | name: 'å¼ ä¸', |
| | | employeeId: 'EMP001', |
| | | status: '1', |
| | | level: '2', |
| | | position: '1' |
| | | }, |
| | | { |
| | | id: 2, |
| | | department: '人äºé¨', |
| | | name: 'æå', |
| | | employeeId: 'EMP002', |
| | | status: '0', |
| | | level: '1', |
| | | position: '2' |
| | | }, |
| | | { |
| | | id: 3, |
| | | department: 'è´¢å¡é¨', |
| | | name: 'çäº', |
| | | employeeId: 'EMP003', |
| | | status: '1', |
| | | level: '3', |
| | | position: '1' |
| | | } |
| | | ]) |
| | | |
| | | // åå
¸ç±»åé
ç½® |
| | | const dictTypes = ref([ |
| | | 'sys_normal_disable', // ç¶æåå
¸ |
| | | 'sys_user_level', // 级å«åå
¸ |
| | | 'sys_user_position' // èä½åå
¸ |
| | | ]) |
| | | |
| | | // å页é
ç½® |
| | | const pagination = reactive({ |
| | | current: 1, |
| | | size: 10, |
| | | total: 0 |
| | | }) |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = reactive({ |
| | | department: '', |
| | | name: '', |
| | | employeeId: '', |
| | | status: '', |
| | | level: '', |
| | | position: '' |
| | | }) |
| | | |
| | | // 表åéªè¯è§å |
| | | const rules = { |
| | | department: [ |
| | | { required: true, message: '请è¾å
¥é¨é¨', trigger: 'blur' } |
| | | ], |
| | | name: [ |
| | | { required: true, message: '请è¾å
¥å§å', trigger: 'blur' } |
| | | ], |
| | | employeeId: [ |
| | | { required: true, message: '请è¾å
¥å·¥å·', trigger: 'blur' } |
| | | ] |
| | | } |
| | | |
| | | // å¨æè¡¨å项 |
| | | const dynamicFormItems = computed(() => { |
| | | // è¿éå¯ä»¥æ ¹æ®åå
¸æ°æ®å¨æçæè¡¨å项 |
| | | return [ |
| | | { |
| | | label: 'ç¶æ', |
| | | value: 'status', |
| | | options: [ |
| | | { label: 'å¯ç¨', value: '1' }, |
| | | { label: 'ç¦ç¨', value: '0' } |
| | | ] |
| | | }, |
| | | { |
| | | label: '级å«', |
| | | value: 'level', |
| | | options: [ |
| | | { label: 'å级', value: '1' }, |
| | | { label: 'ä¸çº§', value: '2' }, |
| | | { label: 'é«çº§', value: '3' } |
| | | ] |
| | | }, |
| | | { |
| | | label: 'èä½', |
| | | value: 'position', |
| | | options: [ |
| | | { label: 'åå·¥', value: '1' }, |
| | | { label: '主管', value: '2' }, |
| | | { label: 'ç»ç', value: '3' } |
| | | ] |
| | | } |
| | | ] |
| | | }) |
| | | |
| | | // ç»ä»¶å¼ç¨ |
| | | const dynamicTableRef = ref(null) |
| | | const formRef = ref(null) |
| | | |
| | | // äºä»¶å¤ç彿° |
| | | const handleSearch = () => { |
| | | // å®ç°æç´¢é»è¾ |
| | | console.log('æç´¢æ¡ä»¶:', searchForm) |
| | | ElMessage.success('æç´¢åè½å¾
å®ç°') |
| | | } |
| | | |
| | | const handleReset = () => { |
| | | searchForm.department = '' |
| | | searchForm.name = '' |
| | | } |
| | | |
| | | const handleAdd = () => { |
| | | dialogTitle.value = 'æ°å¢åå·¥' |
| | | editIndex.value = -1 |
| | | resetForm() |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | const handleEdit = (row, index) => { |
| | | dialogTitle.value = 'ç¼è¾åå·¥' |
| | | editIndex.value = index |
| | | Object.assign(form, row) |
| | | dialogVisible.value = true |
| | | } |
| | | |
| | | const handleDelete = async (row, index) => { |
| | | try { |
| | | await ElMessageBox.confirm('ç¡®å®è¦å é¤è¿æ¡è®°å½åï¼', 'æç¤º', { |
| | | type: 'warning' |
| | | }) |
| | | |
| | | tableData.value.splice(index, 1) |
| | | ElMessage.success('å 餿å') |
| | | } catch (error) { |
| | | // ç¨æ·åæ¶å é¤ |
| | | } |
| | | } |
| | | |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection |
| | | } |
| | | |
| | | const handleSelectChange = (row, prop, value) => { |
| | | console.log('éæ©åå:', row, prop, value) |
| | | // å¯ä»¥å¨è¿éå¤çæ°æ®æ´æ°é»è¾ |
| | | } |
| | | |
| | | const handleInputChange = (row, prop, value) => { |
| | | console.log('è¾å
¥åå:', row, prop, value) |
| | | // å¯ä»¥å¨è¿éå¤çæ°æ®æ´æ°é»è¾ |
| | | } |
| | | |
| | | const handleSizeChange = (size) => { |
| | | pagination.size = size |
| | | // éæ°å è½½æ°æ® |
| | | } |
| | | |
| | | const handleCurrentChange = (current) => { |
| | | pagination.current = current |
| | | // éæ°å è½½æ°æ® |
| | | } |
| | | |
| | | const handleSubmit = async () => { |
| | | try { |
| | | await formRef.value.validate() |
| | | |
| | | if (editIndex.value === -1) { |
| | | // æ°å¢ |
| | | const newRow = { |
| | | id: Date.now(), |
| | | ...form |
| | | } |
| | | tableData.value.push(newRow) |
| | | ElMessage.success('æ°å¢æå') |
| | | } else { |
| | | // ç¼è¾ |
| | | Object.assign(tableData.value[editIndex.value], form) |
| | | ElMessage.success('ç¼è¾æå') |
| | | } |
| | | |
| | | dialogVisible.value = false |
| | | } catch (error) { |
| | | console.error('表åéªè¯å¤±è´¥:', error) |
| | | } |
| | | } |
| | | |
| | | const resetForm = () => { |
| | | Object.assign(form, { |
| | | department: '', |
| | | name: '', |
| | | employeeId: '', |
| | | status: '', |
| | | level: '', |
| | | position: '' |
| | | }) |
| | | formRef.value?.resetFields() |
| | | } |
| | | |
| | | // ç»ä»¶æè½½æ¶åå§åæ°æ® |
| | | onMounted(() => { |
| | | pagination.total = tableData.value.length |
| | | }) |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .app-container { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .search-form { |
| | | margin-bottom: 20px; |
| | | padding: 20px; |
| | | background-color: #f5f5f5; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .table-container { |
| | | background-color: #fff; |
| | | border-radius: 4px; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .dialog-footer { |
| | | text-align: right; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- ç®åçæç´¢åºå --> |
| | | <el-card class="search-card"> |
| | | <el-form :inline="true"> |
| | | <el-form-item label="é¨é¨"> |
| | | <el-input v-model="searchForm.department" placeholder="请è¾å
¥é¨é¨" clearable /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="handleSearch">æç´¢</el-button> |
| | | <el-button @click="handleReset">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <!-- å¨æè¡¨æ ¼ --> |
| | | <el-card class="table-card"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <span>å工信æ¯è¡¨</span> |
| | | <el-button type="primary" size="small" @click="handleAdd">æ°å¢åå·¥</el-button> |
| | | </div> |
| | | </template> |
| | | |
| | | <DynamicTable |
| | | :data="tableData" |
| | | :dict-types="dictTypes" |
| | | :loading="loading" |
| | | :show-selection="true" |
| | | :show-actions="true" |
| | | height="400px" |
| | | @selection-change="handleSelectionChange" |
| | | @edit="handleEdit" |
| | | @delete="handleDelete" |
| | | /> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive } from 'vue' |
| | | import { ElMessage } from 'element-plus' |
| | | import DynamicTable from '@/components/DynamicTable/index.vue' |
| | | |
| | | // æç´¢è¡¨å |
| | | const searchForm = reactive({ |
| | | department: '' |
| | | }) |
| | | |
| | | // è¡¨æ ¼æ°æ® |
| | | const tableData = ref([ |
| | | { |
| | | id: 1, |
| | | department: 'ææ¯é¨', |
| | | name: 'å¼ ä¸', |
| | | employeeId: 'EMP001', |
| | | sys_normal_disable: '1', // ç¶æ |
| | | sys_user_level: '2', // çº§å« |
| | | sys_user_position: '1' // èä½ |
| | | }, |
| | | { |
| | | id: 2, |
| | | department: '人äºé¨', |
| | | name: 'æå', |
| | | employeeId: 'EMP002', |
| | | sys_normal_disable: '0', // ç¶æ |
| | | sys_user_level: '1', // çº§å« |
| | | sys_user_position: '2' // èä½ |
| | | } |
| | | ]) |
| | | |
| | | // åå
¸ç±»å |
| | | const dictTypes = ref([ |
| | | 'sys_normal_disable', // ç¶æï¼å¯ç¨/ç¦ç¨ |
| | | 'sys_user_level', // 级å«ï¼å级/ä¸çº§/é«çº§ |
| | | 'sys_user_position' // èä½ï¼åå·¥/主管/ç»ç |
| | | ]) |
| | | |
| | | // å è½½ç¶æ |
| | | const loading = ref(false) |
| | | |
| | | // äºä»¶å¤ç |
| | | const handleSearch = () => { |
| | | loading.value = true |
| | | // 模ææç´¢ |
| | | setTimeout(() => { |
| | | loading.value = false |
| | | ElMessage.success('æç´¢å®æ') |
| | | }, 1000) |
| | | } |
| | | |
| | | const handleReset = () => { |
| | | searchForm.department = '' |
| | | } |
| | | |
| | | const handleAdd = () => { |
| | | ElMessage.info('æ°å¢åè½å¾
å®ç°') |
| | | } |
| | | |
| | | const handleSelectionChange = (selection) => { |
| | | console.log('éä¸çè¡:', selection) |
| | | } |
| | | |
| | | const handleEdit = (row, index) => { |
| | | ElMessage.info(`ç¼è¾ç¬¬${index + 1}è¡æ°æ®`) |
| | | } |
| | | |
| | | const handleDelete = (row, index) => { |
| | | ElMessage.warning(`å é¤ç¬¬${index + 1}è¡æ°æ®`) |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .app-container { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .search-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .table-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .card-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | } |
| | | |
| | | :deep(.el-form-item) { |
| | | margin-bottom: 0; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="filters" :inline="true"> |
| | | <el-form-item label="åæ¾å£åº¦:" prop="season"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title">åæ¾å£åº¦ï¼</span> |
| | | <el-select |
| | | style="width: 200px;" |
| | | @change="handleQuery" |
| | | v-model="filters.season" |
| | | v-model="searchForm.season" |
| | | placeholder="è¯·éæ©" |
| | | :clearable="false" |
| | | > |
| | | <el-option :label="item.label" :value="item.value" v-for="(item,index) in jidu" :key="value" /> |
| | | <el-option :label="item.label" :value="item.value" v-for="(item,index) in jidu" :key="item.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åå·¥åç§°:"> |
| | | <span class="search_title ml10">åå·¥åç§°ï¼</span> |
| | | <el-input |
| | | v-model="filters.staffName" |
| | | v-model="searchForm.staffName" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥" |
| | | @change="handleQuery" |
| | | clearable |
| | | prefix-icon="Search" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getTableData">æç´¢</el-button> |
| | | <el-button @click="resetFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <div></div> |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px" |
| | | >æç´¢</el-button |
| | | > |
| | | </div> |
| | | <div> |
| | | <el-button type="primary" @click="add" icon="Plus"> æ°å¢ </el-button> |
| | | <el-button @click="handleOut" icon="download">导åº</el-button> |
| | |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | <PIMTable |
| | | rowKey="id" |
| | | isSelection |
| | | :column="columns" |
| | | :tableData="dataList" |
| | | :page="{ |
| | | current: pagination.currentPage, |
| | | size: pagination.pageSize, |
| | | total: pagination.total, |
| | | }" |
| | | <div class="table_list"> |
| | | <el-table |
| | | ref="tableRef" |
| | | v-loading="tableLoading" |
| | | :data="tableData" |
| | | border |
| | | height="calc(100vh - 21em)" |
| | | :header-cell-style="{ background: '#F0F1F5', color: '#333333' }" |
| | | style="width: 100%" |
| | | @selection-change="handleSelectionChange" |
| | | @pagination="changePage" |
| | | > |
| | | <template #operation="{ row }"> |
| | | <el-button type="primary" text @click="edit(row)" icon="editPen"> |
| | | <!-- éæ©å --> |
| | | <el-table-column |
| | | align="center" |
| | | type="selection" |
| | | width="55" |
| | | fixed="left" |
| | | /> |
| | | |
| | | <!-- åºå·å --> |
| | | <el-table-column |
| | | align="center" |
| | | label="åºå·" |
| | | type="index" |
| | | width="60" |
| | | fixed="left" |
| | | /> |
| | | |
| | | <!-- åºå®åï¼é¨é¨ --> |
| | | <!-- <el-table-column--> |
| | | <!-- label="é¨é¨"--> |
| | | <!-- prop="deptName"--> |
| | | <!-- width="120"--> |
| | | <!-- show-overflow-tooltip--> |
| | | <!-- align="center"--> |
| | | <!-- fixed="left"--> |
| | | <!-- />--> |
| | | |
| | | <!-- åºå®åï¼å§å --> |
| | | <el-table-column |
| | | label="å§å" |
| | | prop="staffName" |
| | | width="100" |
| | | show-overflow-tooltip |
| | | align="center" |
| | | fixed="left" |
| | | /> |
| | | |
| | | <!-- åºå®åï¼å·¥å· --> |
| | | <el-table-column |
| | | label="å·¥å·" |
| | | prop="staffNo" |
| | | width="100" |
| | | show-overflow-tooltip |
| | | align="center" |
| | | fixed="left" |
| | | /> |
| | | |
| | | <!-- 卿åï¼æ ¹æ®åå
¸æ¸²æ --> |
| | | <el-table-column |
| | | v-for="(dictItem, index) in sys_lavor_issue" |
| | | :key="dictItem.value" |
| | | :label="dictItem.label" |
| | | :prop="dictItem.value" |
| | | show-overflow-tooltip |
| | | > |
| | | </el-table-column> |
| | | |
| | | <!-- æä½å --> |
| | | <el-table-column |
| | | label="æä½" |
| | | width="150" |
| | | align="center" |
| | | fixed="right" |
| | | > |
| | | <template #default="scope"> |
| | | <el-button |
| | | type="primary" |
| | | link |
| | | size="small" |
| | | @click="edit(scope.row)" |
| | | > |
| | | ç¼è¾ |
| | | </el-button> |
| | | <el-button type="primary" :disabled="row.adoptedDate ? true : false" text @click="adopted(row)"> |
| | | <el-button |
| | | type="danger" |
| | | link |
| | | size="small" |
| | | :disabled="!!scope.row.adoptedDate" |
| | | @click="adopted(scope.row)" |
| | | > |
| | | é¢ç¨ |
| | | </el-button> |
| | | </template> |
| | | </PIMTable> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination :total="total" layout="total, sizes, prev, pager, next, jumper" |
| | | :page="page.current" :limit="page.size" @pagination="paginationChange" /> |
| | | </div> |
| | | <Modal ref="modalRef" @success="getTableData"></Modal> |
| | | <Modal ref="modalRef" @success="handleQuery"></Modal> |
| | | <files-dia ref="filesDia"></files-dia> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { usePaginationApi } from "@/hooks/usePaginationApi"; |
| | | import { listPage,deleteLedger,update } from "@/api/lavorissce/ledger"; |
| | | import { onMounted, getCurrentInstance } from "vue"; |
| | | import Modal from "./Modal.vue"; |
| | | import { ElMessageBox, ElMessage } from "element-plus"; |
| | | import { ref, onMounted } from 'vue' |
| | | import dayjs from "dayjs"; |
| | | import Modal from "./Modal.vue"; |
| | | import FilesDia from "./filesDia.vue"; |
| | | import { getCurrentMonth } from "@/utils/util" |
| | | |
| | | // è¡¨æ ¼å¤éæ¡éä¸é¡¹ |
| | | const multipleList = ref([]); |
| | | import {lavorIssueListPage} from "@/api/lavorissce/ledger.js"; |
| | | import {ElMessageBox} from "element-plus"; |
| | | const { proxy } = getCurrentInstance(); |
| | | |
| | | const page = ref({ |
| | | current: 1, |
| | | size: 100, |
| | | }) |
| | | const total = ref(0) |
| | | // ååºå¼æ°æ® |
| | | const tableRef = ref(null) |
| | | const tableData = ref([]) |
| | | const tableLoading = ref(false) |
| | | const { sys_lavor_issue } = proxy.useDict("sys_lavor_issue") |
| | | const data = reactive({ |
| | | searchForm: { |
| | | feedbackDate: "", |
| | | disDate: "", |
| | | }, |
| | | }); |
| | | const modalRef = ref(); |
| | | const { payment_methods } = proxy.useDict("payment_methods"); |
| | | const { income_types } = proxy.useDict("income_types"); |
| | | const filesDia = ref() |
| | | |
| | | const { |
| | | filters, |
| | | columns, |
| | | dataList, |
| | | pagination, |
| | | getTableData, |
| | | resetFilters, |
| | | onCurrentChange, |
| | | } = usePaginationApi( |
| | | listPage, |
| | | { |
| | | staffName: '', |
| | | season: getCurrentMonth(), |
| | | }, |
| | | [ |
| | | { |
| | | label: "å³ä¿åå·", |
| | | align: "center", |
| | | prop: "orderNo", |
| | | }, |
| | | { |
| | | label: "åå·¥åç§°", |
| | | align: "center", |
| | | prop: "staffName", |
| | | }, |
| | | { |
| | | label: "åå·¥ç¼å·", |
| | | align: "center", |
| | | prop: "staffNo" |
| | | }, |
| | | |
| | | { |
| | | label: "å³ä¿ç±»å", |
| | | align: "center", |
| | | prop: "dictTypeName", |
| | | |
| | | }, |
| | | { |
| | | label: "å³ä¿é²å
·", |
| | | align: "center", |
| | | prop: "dictName", |
| | | |
| | | }, |
| | | { |
| | | label: "åæ¾æ°é", |
| | | align: "center", |
| | | prop: "num", |
| | | |
| | | }, |
| | | { |
| | | label: "è¿åæ¥æ", |
| | | align: "center", |
| | | prop: "factoryDate", |
| | | |
| | | }, |
| | | { |
| | | label: "åæ¾æ¥æ", |
| | | align: "center", |
| | | prop: "issueDate", |
| | | |
| | | }, |
| | | { |
| | | label: "é¢ç¨æ¥æ", |
| | | align: "center", |
| | | prop: "adoptedDate", |
| | | |
| | | }, |
| | | { |
| | | fixed: "right", |
| | | label: "æä½", |
| | | dataType: "slot", |
| | | slot: "operation", |
| | | align: "center", |
| | | width: "200px", |
| | | }, |
| | | ] |
| | | ); |
| | | |
| | | const filesDia = ref(); |
| | | const { searchForm } = toRefs(data); |
| | | const multipleList = ref([]); |
| | | const jidu = ref([ |
| | | { |
| | | value: '1', |
| | |
| | | } |
| | | ]) |
| | | |
| | | // å¤éååä»ä¹ |
| | | const handleSelectionChange = (selectionList) => { |
| | | multipleList.value = selectionList; |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | page.current = 1; |
| | | getList(); |
| | | }; |
| | | |
| | | // è·ååå
¸æ°æ® |
| | | const getList = async () => { |
| | | tableLoading.value = true; |
| | | lavorIssueListPage().then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | page.total = res.data.total; |
| | | }).catch(err => { |
| | | tableLoading.value = false; |
| | | }) |
| | | } |
| | | const add = () => { |
| | | modalRef.value.openModal(); |
| | | }; |
| | | const edit = (row) => { |
| | | modalRef.value.loadForm(row); |
| | | }; |
| | | const deleteRow = (id) => { |
| | | ElMessageBox.confirm("æ¤æä½å°æ°¸ä¹
å é¤è¯¥æ°æ®, æ¯å¦ç»§ç»?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }).then(async () => { |
| | | const { code } = await deleteLedger(id); |
| | | if (code == 200) { |
| | | ElMessage({ |
| | | type: "success", |
| | | message: "å 餿å", |
| | | }); |
| | | getTableData(); |
| | | } |
| | | }); |
| | | }; |
| | | const handleOut = () => { |
| | | ElMessageBox.confirm("éä¸çå
容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼", "导åº", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | proxy.download(`/lavorIssue/exportCopy`, {season: filters.season}, "å³ä¿å°è´¦.xlsx"); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已忶"); |
| | | }); |
| | | }; |
| | | const adopted = (row) => { |
| | | ElMessageBox.confirm("æ¯å¦ç¡®è®¤é¢ç¨?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const add = () => { |
| | | modalRef.value.openModal(); |
| | | }; |
| | | const edit = (row) => { |
| | | modalRef.value.loadForm(row); |
| | | }; |
| | | |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | getTableData(); |
| | | }; |
| | | const changePage = ({ page, limit }) => { |
| | | pagination.currentPage = page; |
| | | pagination.pageSize = limit; |
| | | onCurrentChange(page); |
| | | }; |
| | | const deleteRow = (id) => { |
| | | ElMessageBox.confirm("æ¤æä½å°æ°¸ä¹
å é¤è¯¥æ°æ®, æ¯å¦ç»§ç»?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }).then(async () => { |
| | | const { code } = await deleteLedger(id); |
| | | if (code == 200) { |
| | | ElMessage({ |
| | | type: "success", |
| | | message: "å 餿å", |
| | | }); |
| | | getTableData(); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | const changeDaterange = (value) => { |
| | | if (value) { |
| | | filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD"); |
| | | filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD"); |
| | | } else { |
| | | filters.entryDateStart = undefined; |
| | | filters.entryDateEnd = undefined; |
| | | } |
| | | getTableData(); |
| | | }; |
| | | |
| | | const handleOut = () => { |
| | | ElMessageBox.confirm("éä¸çå
容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼", "导åº", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | proxy.download(`/lavorIssue/exportCopy`, {season: filters.season}, "å³ä¿å°è´¦.xlsx"); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已忶"); |
| | | }); |
| | | }; |
| | | // æå¼éä»¶å¼¹æ¡ |
| | | const openFilesFormDia = (row) => { |
| | | nextTick(() => { |
| | | filesDia.value?.openDialog( row,'æ¶å
¥') |
| | | }) |
| | | }; |
| | | // äºä»¶å¤ç彿° |
| | | const handleSelectionChange = (selection) => { |
| | | multipleList.value = selection; |
| | | } |
| | | |
| | | const paginationChange = (size) => { |
| | | console.log(size) |
| | | |
| | | } |
| | | |
| | | // ç»ä»¶æè½½æ¶å è½½åå
¸æ°æ® |
| | | onMounted(() => { |
| | | filters.entryDate = [ |
| | | dayjs().format("YYYY-MM-DD"), |
| | | dayjs().add(1, "day").format("YYYY-MM-DD"), |
| | | ] |
| | | filters.entryDateStart = dayjs().format("YYYY-MM-DD") |
| | | filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD") |
| | | getTableData(); |
| | | }); |
| | | handleQuery() |
| | | }) |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .table_list { |
| | | margin-top: unset; |
| | | <style scoped> |
| | | .dynamic-table-container { |
| | | width: 100%; |
| | | } |
| | | .actions { |
| | | |
| | | .pagination-container { |
| | | margin-top: 20px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-bottom: 10px; |
| | | justify-content: flex-end; |
| | | } |
| | | |
| | | :deep(.el-table .el-table__header-wrapper th) { |
| | | background-color: #F0F1F5 !important; |
| | | color: #333333; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | :deep(.el-table .el-table__body-wrapper td) { |
| | | padding: 8px 0; |
| | | } |
| | | |
| | | :deep(.el-select) { |
| | | width: 100%; |
| | | } |
| | | |
| | | :deep(.el-input) { |
| | | width: 100%; |
| | | } |
| | | </style> |
| | | |
| | |
| | | |
| | | <script setup> |
| | | import { usePaginationApi } from "@/hooks/usePaginationApi"; |
| | | import { listPage,statistics } from "@/api/lavorissce/ledger"; |
| | | import { onMounted, getCurrentInstance } from "vue"; |
| | | import { ElMessageBox, ElMessage } from "element-plus"; |
| | | import dayjs from "dayjs"; |
| | | import {lavorIssueListPage, statistics} from "@/api/lavorissce/ledger"; |
| | | import { onMounted } from "vue"; |
| | | |
| | | // è¡¨æ ¼å¤éæ¡éä¸é¡¹ |
| | | const multipleList = ref([]); |
| | | const { proxy } = getCurrentInstance(); |
| | | const modalRef = ref(); |
| | | const filesDia = ref() |
| | | const jidu = ref([ |
| | | { |
| | | value: '1', |
| | |
| | | resetFilters, |
| | | onCurrentChange, |
| | | } = usePaginationApi( |
| | | listPage, |
| | | lavorIssueListPage, |
| | | { |
| | | season: '', |
| | | issueDate: '', |
| | |
| | | |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | page.current = 1; |
| | | pagination.current = 1; |
| | | getTableData(); |
| | | }; |
| | | const changePage = ({ page, limit }) => { |