This commit is contained in:
zlwu committed 2026-05-27 06:22:08 +08:00
1 parent 41aa90aa05
commit 7145c6c683
17 files changed
+1929 -2224

No files matched your search

@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_types_import_components_d_ts", "label": "components.d.ts", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/types/import/components.d.ts", "source_location": "L1"}], "edges": [], "raw_calls": []}
@@ -0,0 +1 @@
{"nodes": [{"id": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_user_index_vue", "label": "index.vue", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L1"}, {"id": "user_index_loadroleoptions", "label": "loadRoleOptions()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L318"}, {"id": "user_index_formatuserdeptdisplay", "label": "formatUserDeptDisplay()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L341"}, {"id": "user_index_formatuserroledisplay", "label": "formatUserRoleDisplay()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L347"}, {"id": "user_index_filterdeptnode", "label": "filterDeptNode()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L390"}, {"id": "user_index_handledeptnodeclick", "label": "handleDeptNodeClick()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L399"}, {"id": "user_index_loaddepttree", "label": "loadDeptTree()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L405"}, {"id": "user_index_loaddata", "label": "loadData()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L414"}, {"id": "user_index_handlesearch", "label": "handleSearch()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L431"}, {"id": "user_index_handlereset", "label": "handleReset()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L436"}, {"id": "user_index_resetform", "label": "resetForm()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L445"}, {"id": "user_index_handleadd", "label": "handleAdd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L461"}, {"id": "user_index_handleedit", "label": "handleEdit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L472"}, {"id": "user_index_handlesubmit", "label": "handleSubmit()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L498"}, {"id": "user_index_handleselectionchange", "label": "handleSelectionChange()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L538"}, {"id": "user_index_handledelete", "label": "handleDelete()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L542"}, {"id": "user_index_handlebatchresetpwd", "label": "handleBatchResetPwd()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L548"}, {"id": "user_index_handleview", "label": "handleView()", "file_type": "code", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L600"}], "edges": [{"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_user_index_vue", "target": "element_plus", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L292", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_user_index_vue", "target": "icons_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L293", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_user_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_components_business_system_view_dialog_index_vue", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/wuzilong/work/00code/zkxw/web-admin/src/views/system/user/index.vue", "source_location": "L303", "weight": 1.0}, {"source": "users_wuzilong_work_00code_zkxw_web_admin_src_views_system_user_index_vue", "target": "users_wuzilong_work_00code_zkxw_web_admin_src_api_admin", "relation": "imports_from", "confidence": "EXTRACTED", "source_fileLine truncated
@@ -70,12 +70,33 @@
</el-form>
</div>
<div v-if="activeTypeTab !== 'all' && activeTypeTab !== 'outbound'" class="list-toolbar">
<div v-if="activeTypeTab !== 'all'" class="list-toolbar">
<div class="list-toolbar-row">
<el-button class="btn-main" type="primary" @click="handleAdd">
<div class="list-toolbar-selected">
已选 <span class="sel-num">{{ selectedRows.length }}</span> 项
</div>
<el-button
v-if="activeTypeTab !== 'outbound'"
class="btn-main"
type="primary"
@click="handleAdd"
>
<el-icon><Plus /></el-icon
>{{ activeTypeTab === 'temporary' ? '新增临时工单' : '新增生产工单' }}
</el-button>
<el-button
class="btn-ghost"
:disabled="selectedRows.length !== 1"
@click="handleToolbarEditTask"
>
<el-icon><EditPen /></el-icon>编辑任务
</el-button>
<el-button class="btn-ghost" :disabled="!canToolbarDispatch" @click="handleToolbarDispatch">
<el-icon><Position /></el-icon>派发任务
</el-button>
<el-button class="btn-ghost" :disabled="!canToolbarComplete" @click="handleToolbarComplete">
<el-icon><Check /></el-icon>完成工单
</el-button>
</div>
</div>
@@ -86,8 +107,17 @@
:data="tableData"
v-loading="loading"
stripe
row-key="id"
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column
v-if="activeTypeTab !== 'all'"
type="selection"
min-width="55"
align="center"
header-align="center"
/>
<el-table-column
type="index"
label="序号"
@@ -260,35 +290,18 @@
<el-table-column
v-if="activeTypeTab !== 'all'"
label="操作"
min-width="600"
min-width="260"
fixed="right"
align="center"
header-align="center"
>
<template #default="{ row }">
<el-button class="btn-op-item" @click="handleView(row)"
><el-icon><View /></el-icon>查看详情</el-button
><el-icon><View /></el-icon>查看</el-button
>
<el-button class="btn-op-item" @click="handleEditRemark(row)">
<el-icon><EditPen /></el-icon>编辑
</el-button>
<el-button class="btn-op-item" @click="handleEditTask(row)"
><el-icon><EditPen /></el-icon>编辑任务</el-button
>
<el-button
v-if="row.workOrderStatus === 'dpz' || row.workOrderStatus === 'jxz'"
class="btn-op-item primary"
@click="handleOpenDispatch(row)"
>
<el-icon><Position /></el-icon>派发任务
</el-button>
<el-button
v-if="row.workOrderStatus === 'dpz' || row.workOrderStatus === 'jxz'"
class="btn-op-item"
@click="handleComplete(row)"
>
<el-icon><Check /></el-icon>完成工单
</el-button>
<el-button
v-if="row.workOrderStatus !== 'ywc'"
class="btn-op-item"
@@ -668,6 +681,7 @@
function handleTypeTabChange() {
pagination.page = 1
clearSelection()
loadData()
}
@@ -767,10 +781,77 @@
const searchForm = reactive({ keyword: '', workOrderStatus: '' })
const createTimeRange = ref<[string, string] | null>(getDefaultLast30DaysRange())
const tableData = ref<any[]>([])
const selectedRows = ref<any[]>([])
const workOrderListTableRef = ref<TableInstance>()
const loading = ref(false)
const pagination = reactive({ page: 1, pageSize: 10, total: 0 })
const canToolbarDispatch = computed(() => {
if (selectedRows.value.length !== 1) return false
const status = selectedRows.value[0].workOrderStatus
return status === 'dpz' || status === 'jxz'
})
const canToolbarComplete = computed(() => {
if (!selectedRows.value.length) return false
return selectedRows.value.every(
(row) => row.workOrderStatus === 'dpz' || row.workOrderStatus === 'jxz'
)
})
function handleSelectionChange(rows: any[]) {
selectedRows.value = rows
}
function clearSelection() {
selectedRows.value = []
workOrderListTableRef.value?.clearSelection?.()
}
function requireSingleSelection(action: string) {
if (selectedRows.value.length !== 1) {
ElMessage.warning(`请选择一个工单后再${action}`)
return null
}
return selectedRows.value[0]
}
function handleToolbarEditTask() {
const row = requireSingleSelection('编辑任务')
if (row) handleEditTask(row)
}
function handleToolbarDispatch() {
const row = requireSingleSelection('派发任务')
if (!row) return
if (row.workOrderStatus !== 'dpz' && row.workOrderStatus !== 'jxz') {
ElMessage.warning('仅待配置或进行中的工单可派发任务')
return
}
handleOpenDispatch(row)
}
async function handleToolbarComplete() {
const rows = selectedRows.value.filter(
(row) => row.workOrderStatus === 'dpz' || row.workOrderStatus === 'jxz'
)
if (!rows.length) {
ElMessage.warning('请选择待配置或进行中的工单')
return
}
const message =
rows.length === 1
? `确定要完成工单「${rows[0].workOrderNo || ''}」吗?`
: `确定要完成选中的 ${rows.length} 个工单吗?`
await ElMessageBox.confirm(message, '提示', { type: 'warning' })
for (const row of rows) {
await fetchCompleteProductionWorkOrder(row.id, {})
}
ElMessage.success(rows.length === 1 ? '工单已完成' : `已完成 ${rows.length} 个工单`)
clearSelection()
loadData()
}
async function layoutWorkOrderTable() {
await nextTick()
workOrderListTableRef.value?.doLayout?.()
@@ -1074,12 +1155,6 @@
detail.value = await fetchProductionWorkOrderDetail(row.id)
viewVisible.value = true
}
async function handleComplete(row: any) {
await ElMessageBox.confirm('确定要完成该工单吗?', '提示', { type: 'warning' })
await fetchCompleteProductionWorkOrder(row.id, {})
ElMessage.success('工单已完成')
loadData()
}
// ── 派发任务 ──────────────────────────────────────────
const dispatchVisible = ref(false)
+99 -29
View File
@@ -65,11 +65,45 @@
<div class="list-toolbar">
<div class="list-toolbar-row">
<div class="list-toolbar-selected">
<el-button class="btn-main" type="primary" @click="handleAdd">
<el-icon><Plus /></el-icon>
新增用户
</el-button>
已选 <span class="sel-num">{{ selectedRows.length }}</span> 项
</div>
<el-button class="btn-main" type="primary" @click="handleAdd">
<el-icon><Plus /></el-icon>
新增用户
</el-button>
<el-button
class="btn-ghost"
:disabled="selectedRows.length === 0"
@click="handleBatchResetPwd"
>
<el-icon><Key /></el-icon>
重置密码
</el-button>
<el-button
class="btn-ghost"
:disabled="selectedRows.length !== 1"
@click="handleToolbarView"
>
<el-icon><View /></el-icon>
查看
</el-button>
<el-button
class="btn-ghost"
:disabled="selectedRows.length !== 1"
@click="handleToolbarEdit"
>
<el-icon><Edit /></el-icon>
编辑
</el-button>
<el-button
class="btn-ghost"
type="danger"
:disabled="selectedRows.length === 0"
@click="handleBatchDelete"
>
<el-icon><Delete /></el-icon>
删除
</el-button>
</div>
</div>
@@ -80,8 +114,10 @@
v-loading="loading"
stripe
row-key="id"
@selection-change="handleSelectionChange"
@row-dblclick="handleView"
>
<el-table-column type="selection" min-width="55" align="center" header-align="center" />
<el-table-column
type="index"
label="序号"
@@ -146,22 +182,6 @@
align="center"
header-align="center"
/>
<el-table-column
label="操作"
min-width="400"
fixed="right"
align="center"
header-align="center"
>
<template #default="{ row }">
<el-button class="btn-op-item" @click="handleView(row)"
><el-icon><View /></el-icon>查看</el-button
>
<el-button class="btn-op-item primary" @click="handleEdit(row)">编辑</el-button>
<el-button class="btn-op-item" @click="handleResetPwd(row)">重置密码</el-button>
<el-button class="btn-op-item" @click="handleDelete(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination list-pager-bar">
@@ -287,7 +307,10 @@
View,
UserFilled,
RefreshLeft,
Search
Search,
Key,
Edit,
Delete
} from '@element-plus/icons-vue'
import SystemViewDialog from '@/components/business/system-view-dialog/index.vue'
import {
@@ -344,6 +367,7 @@
const searchForm = reactive<{ keyword: string; status: string }>({ keyword: '', status: '' })
const tableData = ref<Api.User.UserItem[]>([])
const selectedRows = ref<Api.User.UserItem[]>([])
const loading = ref(false)
const pagination = reactive({ page: 1, pageSize: 10, total: 0 })
@@ -523,17 +547,63 @@
}
}
async function handleDelete(row: Api.User.UserItem) {
await ElMessageBox.confirm(`确定删除用户「${row.nickName}」吗?`, '提示', { type: 'warning' })
await fetchDeleteUser(row.id)
const handleSelectionChange = (rows: Api.User.UserItem[]) => {
selectedRows.value = rows
}
function requireSingleSelection(action: string): Api.User.UserItem | null {
if (selectedRows.value.length !== 1) {
ElMessage.warning(`请选择一个用户后再${action}`)
return null
}
return selectedRows.value[0]
}
function handleToolbarView() {
const row = requireSingleSelection('查看')
if (row) handleView(row)
}
function handleToolbarEdit() {
const row = requireSingleSelection('编辑')
if (row) handleEdit(row)
}
async function handleBatchDelete() {
const rows = selectedRows.value
if (!rows.length) {
ElMessage.warning('请至少选择一项')
return
}
const message =
rows.length === 1
? `确定删除用户「${rows[0].nickName}」吗?`
: `确定删除选中的 ${rows.length} 个用户吗?`
await ElMessageBox.confirm(message, '提示', { type: 'warning' })
for (const row of rows) {
await fetchDeleteUser(row.id)
}
ElMessage.success('删除成功')
selectedRows.value = []
await loadData()
}
async function handleResetPwd(row: Api.User.UserItem) {
await ElMessageBox.confirm(`确定将用户「${row.nickName}」的密码重置为 111111 吗?`, '提示', {
type: 'warning'
})
await fetchResetPassword(row.id)
async function handleBatchResetPwd() {
const rows = selectedRows.value
if (!rows.length) {
ElMessage.warning('请至少选择一项')
return
}
const message =
rows.length === 1
? `确定将用户「${rows[0].nickName}」的密码重置为 111111 吗?`
: `确定将选中的 ${rows.length} 个用户的密码重置为 111111 吗?`
await ElMessageBox.confirm(message, '提示', { type: 'warning' })
for (const row of rows) {
await fetchResetPassword(row.id)
}
ElMessage.success('密码重置成功')
selectedRows.value = []
}
// ---- 查看弹窗 ----