提交
This commit is contained in:
1 parent
41aa90aa05
commit
7145c6c683
17 files changed
+1929
-2224
No files matched your search
+1
@@ -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": []}
|
||||
+1
@@ -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": []}
|
||||
+1
@@ -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)
|
||||
|
||||
@@ -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 = []
|
||||
}
|
||||
|
||||
// ---- 查看弹窗 ----
|
||||
|
||||
Reference in new issue
Block a user