修改
This commit is contained in:
1
ai-management-dify
Submodule
1
ai-management-dify
Submodule
Submodule ai-management-dify added at aa57f8551a
1
jitsi-meet
Submodule
1
jitsi-meet
Submodule
Submodule jitsi-meet added at 6549d47233
@@ -4,6 +4,11 @@
|
|||||||
import {loadShare} from "@module-federation/runtime";
|
import {loadShare} from "@module-federation/runtime";
|
||||||
const importMap = {
|
const importMap = {
|
||||||
|
|
||||||
|
"axios": async () => {
|
||||||
|
let pkg = await import("__mf__virtual/workcase__prebuild__axios__prebuild__.js");
|
||||||
|
return pkg;
|
||||||
|
}
|
||||||
|
,
|
||||||
"element-plus": async () => {
|
"element-plus": async () => {
|
||||||
let pkg = await import("__mf__virtual/workcase__prebuild__element_mf_2_plus__prebuild__.js");
|
let pkg = await import("__mf__virtual/workcase__prebuild__element_mf_2_plus__prebuild__.js");
|
||||||
return pkg;
|
return pkg;
|
||||||
@@ -22,6 +27,36 @@
|
|||||||
}
|
}
|
||||||
const usedShared = {
|
const usedShared = {
|
||||||
|
|
||||||
|
"axios": {
|
||||||
|
name: "axios",
|
||||||
|
version: "1.13.2",
|
||||||
|
scope: ["default"],
|
||||||
|
loaded: false,
|
||||||
|
from: "workcase",
|
||||||
|
async get () {
|
||||||
|
if (false) {
|
||||||
|
throw new Error(`Shared module '${"axios"}' must be provided by host`);
|
||||||
|
}
|
||||||
|
usedShared["axios"].loaded = true
|
||||||
|
const {"axios": pkgDynamicImport} = importMap
|
||||||
|
const res = await pkgDynamicImport()
|
||||||
|
const exportModule = {...res}
|
||||||
|
// All npm packages pre-built by vite will be converted to esm
|
||||||
|
Object.defineProperty(exportModule, "__esModule", {
|
||||||
|
value: true,
|
||||||
|
enumerable: false
|
||||||
|
})
|
||||||
|
return function () {
|
||||||
|
return exportModule
|
||||||
|
}
|
||||||
|
},
|
||||||
|
shareConfig: {
|
||||||
|
singleton: false,
|
||||||
|
requiredVersion: "^1.13.2",
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
"element-plus": {
|
"element-plus": {
|
||||||
name: "element-plus",
|
name: "element-plus",
|
||||||
version: "2.12.0",
|
version: "2.12.0",
|
||||||
|
|||||||
1
urbanLifelineWeb/packages/workcase/src/api/index.ts
Normal file
1
urbanLifelineWeb/packages/workcase/src/api/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export * from './workcase'
|
||||||
1
urbanLifelineWeb/packages/workcase/src/types/index.ts
Normal file
1
urbanLifelineWeb/packages/workcase/src/types/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export * from './workcase'
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
<!-- 工单列表 -->
|
<!-- 工单列表 -->
|
||||||
<el-card>
|
<el-card>
|
||||||
<el-table :data="filteredTickets" style="width: 100%">
|
<el-table :data="filteredTickets" style="width: 100%" v-loading="loading">
|
||||||
<el-table-column prop="optsn" label="工单号" width="140">
|
<el-table-column prop="optsn" label="工单号" width="140">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<span class="ticket-no">{{ row.optsn }}</span>
|
<span class="ticket-no">{{ row.optsn }}</span>
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="故障描述">
|
<el-form-item label="故障描述">
|
||||||
<el-input v-model="formData.remark" type="textarea" :rows="4" placeholder="请输入故障描述" />
|
<el-input v-model="formData.description" type="textarea" :rows="4" placeholder="请输入故障描述" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
@@ -156,9 +156,9 @@ import { ref, computed, onMounted } from 'vue'
|
|||||||
import AdminLayout from '@/views/admin/AdminLayout.vue'
|
import AdminLayout from '@/views/admin/AdminLayout.vue'
|
||||||
import { Plus, Search } from 'lucide-vue-next'
|
import { Plus, Search } from 'lucide-vue-next'
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
import { workcaseAPI } from 'shared/api'
|
import { workcaseAPI } from '@/api/workcase'
|
||||||
import type { TbWorkcaseDTO, TbWorkcaseProcessDTO } from 'shared/types'
|
import type { TbWorkcaseDTO, TbWorkcaseProcessDTO } from '@/types/workcase'
|
||||||
import type { PageParam } from 'shared/types'
|
import type { PageRequest, PageParam, ResultDomain } from 'shared/types'
|
||||||
|
|
||||||
const statusFilter = ref('all')
|
const statusFilter = ref('all')
|
||||||
const typeFilter = ref('')
|
const typeFilter = ref('')
|
||||||
@@ -171,12 +171,14 @@ const showCreateDialog = ref(false)
|
|||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
|
|
||||||
const formData = ref<TbWorkcaseDTO>({
|
const formData = ref<TbWorkcaseDTO>({
|
||||||
|
roomId: '',
|
||||||
|
deviceNamePlateImg: '',
|
||||||
username: '',
|
username: '',
|
||||||
phone: '',
|
phone: '',
|
||||||
device: '',
|
device: '',
|
||||||
type: '',
|
type: '',
|
||||||
emergency: 'normal',
|
emergency: 'normal',
|
||||||
remark: ''
|
description: ''
|
||||||
})
|
})
|
||||||
|
|
||||||
const workcaseList = ref<TbWorkcaseDTO[]>([])
|
const workcaseList = ref<TbWorkcaseDTO[]>([])
|
||||||
@@ -187,7 +189,10 @@ const workcaseList = ref<TbWorkcaseDTO[]>([])
|
|||||||
*/
|
*/
|
||||||
const loadWorkcases = async () => {
|
const loadWorkcases = async () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
const filter: TbWorkcaseDTO = {}
|
const filter: TbWorkcaseDTO = {
|
||||||
|
roomId: '',
|
||||||
|
deviceNamePlateImg: '',
|
||||||
|
}
|
||||||
if (statusFilter.value !== 'all') {
|
if (statusFilter.value !== 'all') {
|
||||||
filter.status = statusFilter.value as TbWorkcaseDTO['status']
|
filter.status = statusFilter.value as TbWorkcaseDTO['status']
|
||||||
}
|
}
|
||||||
@@ -203,10 +208,14 @@ const loadWorkcases = async () => {
|
|||||||
pageSize: pageSize.value
|
pageSize: pageSize.value
|
||||||
}
|
}
|
||||||
|
|
||||||
const res = await workcaseAPI.getWorkcasePage({ filter, pageParam })
|
const pageRequest: PageRequest<TbWorkcaseDTO> = {
|
||||||
if (res.success && res.data) {
|
filter,
|
||||||
workcaseList.value = res.data.list || []
|
pageParam
|
||||||
total.value = res.data.pageParam?.total || 0
|
}
|
||||||
|
const res = await workcaseAPI.getWorkcasePage(pageRequest)
|
||||||
|
if (res.success) {
|
||||||
|
workcaseList.value = res.dataList || res.pageDomain?.dataList || []
|
||||||
|
total.value = res.pageParam?.totalElements || 0
|
||||||
} else {
|
} else {
|
||||||
ElMessage.error(res.message || '加载失败')
|
ElMessage.error(res.message || '加载失败')
|
||||||
}
|
}
|
||||||
@@ -226,7 +235,7 @@ const createWorkcaseAPI = async () => {
|
|||||||
if (res.success) {
|
if (res.success) {
|
||||||
ElMessage.success('工单创建成功')
|
ElMessage.success('工单创建成功')
|
||||||
showCreateDialog.value = false
|
showCreateDialog.value = false
|
||||||
formData.value = { username: '', phone: '', device: '', type: '', emergency: 'normal', remark: '' }
|
formData.value = { roomId: '', deviceNamePlateImg: '', username: '', phone: '', device: '', type: '', emergency: 'normal', description: '' }
|
||||||
loadWorkcases()
|
loadWorkcases()
|
||||||
} else {
|
} else {
|
||||||
ElMessage.error(res.message || '创建失败')
|
ElMessage.error(res.message || '创建失败')
|
||||||
@@ -288,13 +297,7 @@ const mockTickets = [
|
|||||||
{ workcaseId: 'WC005', optsn: 'TK005', username: '孙七', phone: '13800138004', type: 'install', device: 'G-100S', emergency: 'emergency' as const, status: 'processing' as const, processor: '李四', createTime: '2024-12-13 08:45' }
|
{ workcaseId: 'WC005', optsn: 'TK005', username: '孙七', phone: '13800138004', type: 'install', device: 'G-100S', emergency: 'emergency' as const, status: 'processing' as const, processor: '李四', createTime: '2024-12-13 08:45' }
|
||||||
]
|
]
|
||||||
|
|
||||||
/**
|
|
||||||
* 加载Mock数据
|
|
||||||
*/
|
|
||||||
const loadMockData = () => {
|
|
||||||
workcaseList.value = mockTickets as TbWorkcaseDTO[]
|
|
||||||
total.value = mockTickets.length
|
|
||||||
}
|
|
||||||
|
|
||||||
// ========================= 字段映射 =========================
|
// ========================= 字段映射 =========================
|
||||||
const typeMap: Record<string, string> = {
|
const typeMap: Record<string, string> = {
|
||||||
@@ -333,7 +336,8 @@ const filteredTickets = computed(() => {
|
|||||||
if (searchKeyword.value) {
|
if (searchKeyword.value) {
|
||||||
const keyword = searchKeyword.value.toLowerCase()
|
const keyword = searchKeyword.value.toLowerCase()
|
||||||
result = result.filter((t: TbWorkcaseDTO) =>
|
result = result.filter((t: TbWorkcaseDTO) =>
|
||||||
(t.optsn || '').toLowerCase().includes(keyword) ||
|
(t.roomId || '').toLowerCase().includes(keyword) ||
|
||||||
|
(t.deviceNamePlateImg || '').toLowerCase().includes(keyword) ||
|
||||||
(t.username || '').toLowerCase().includes(keyword) ||
|
(t.username || '').toLowerCase().includes(keyword) ||
|
||||||
(t.device || '').toLowerCase().includes(keyword)
|
(t.device || '').toLowerCase().includes(keyword)
|
||||||
)
|
)
|
||||||
@@ -352,46 +356,37 @@ const getStatusType = (status: string) => {
|
|||||||
|
|
||||||
const handleFilterChange = () => {
|
const handleFilterChange = () => {
|
||||||
currentPage.value = 1
|
currentPage.value = 1
|
||||||
// loadWorkcases() // API调用:取消注释启用
|
loadWorkcases() // API调用:取消注释启用
|
||||||
}
|
}
|
||||||
|
|
||||||
const handlePageChange = (page: number) => {
|
const handlePageChange = (page: number) => {
|
||||||
currentPage.value = page
|
currentPage.value = page
|
||||||
// loadWorkcases() // API调用:取消注释启用
|
loadWorkcases() // API调用:取消注释启用
|
||||||
}
|
}
|
||||||
|
|
||||||
const viewDetail = (row: TbWorkcaseDTO) => {
|
const viewDetail = (row: TbWorkcaseDTO) => {
|
||||||
ElMessage.info(`查看工单详情: ${row.optsn}`)
|
ElMessage.info(`查看工单详情: ${row.workcaseId}`)
|
||||||
// TODO: 跳转到工单详情页面
|
// TODO: 跳转到工单详情页面
|
||||||
}
|
}
|
||||||
|
|
||||||
const assignTicket = (row: TbWorkcaseDTO) => {
|
const assignTicket = (row: TbWorkcaseDTO) => {
|
||||||
// assignWorkcaseAPI(row) // API调用:取消注释启用
|
assignWorkcaseAPI(row) // API调用:取消注释启用
|
||||||
ElMessage.info(`指派工单: ${row.optsn}`)
|
// ElMessage.info(`指派工单: ${row.optsn}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const completeTicket = (row: TbWorkcaseDTO) => {
|
const completeTicket = (row: TbWorkcaseDTO) => {
|
||||||
// completeWorkcaseAPI(row) // API调用:取消注释启用
|
completeWorkcaseAPI(row) // API调用:取消注释启用
|
||||||
ElMessage.success(`完成工单: ${row.optsn}`)
|
// ElMessage.success(`完成工单: ${row.optsn}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const createTicket = () => {
|
const createTicket = () => {
|
||||||
// createWorkcaseAPI() // API调用:取消注释启用
|
createWorkcaseAPI() // API调用:取消注释启用
|
||||||
|
|
||||||
// Mock模式下的处理
|
|
||||||
if (!formData.value.username || !formData.value.phone || !formData.value.device || !formData.value.type) {
|
|
||||||
ElMessage.error('请填写必填项')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
ElMessage.success('工单创建成功')
|
|
||||||
showCreateDialog.value = false
|
|
||||||
formData.value = { username: '', phone: '', device: '', type: '', emergency: 'normal', remark: '' }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========================= 生命周期 =========================
|
// ========================= 生命周期 =========================
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// loadWorkcases() // API调用:取消注释启用
|
loadWorkcases() // API调用:取消注释启用
|
||||||
loadMockData() // Mock模式:注释此行以使用API
|
// loadMockData() // Mock模式:注释此行以使用API
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -84,51 +84,15 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, computed, onMounted } from 'vue'
|
import { ref, computed, onMounted } from 'vue'
|
||||||
import type { TbWorkcaseDTO } from '@/types/workcase'
|
import type { TbWorkcaseDTO } from '@/types/workcase'
|
||||||
|
import { workcaseAPI } from '@/api/workcase/workcase'
|
||||||
|
|
||||||
// 响应式数据
|
// 响应式数据
|
||||||
const headerPaddingTop = ref<number>(44)
|
const headerPaddingTop = ref<number>(44)
|
||||||
const headerTotalHeight = ref<number>(88)
|
const headerTotalHeight = ref<number>(88)
|
||||||
const activeTab = ref<string>('all')
|
const activeTab = ref<string>('all')
|
||||||
|
const orders = ref<TbWorkcaseDTO[]>([])
|
||||||
// 模拟工单数据
|
const loading = ref<boolean>(false)
|
||||||
const orders = ref<TbWorkcaseDTO[]>([
|
const error = ref<string>('')
|
||||||
{
|
|
||||||
workcaseId: 'TH20241217001',
|
|
||||||
userId: '1',
|
|
||||||
username: '李经理',
|
|
||||||
phone: '13800138001',
|
|
||||||
type: '控制系统故障',
|
|
||||||
device: 'TH-500GF',
|
|
||||||
deviceCode: 'TH20230501001',
|
|
||||||
emergency: 'emergency',
|
|
||||||
status: 'processing',
|
|
||||||
createTime: '2024-12-17 15:30:00'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
workcaseId: 'TH20241217002',
|
|
||||||
userId: '2',
|
|
||||||
username: '王工',
|
|
||||||
phone: '13800138002',
|
|
||||||
type: '发动机故障',
|
|
||||||
device: 'TH-300GF',
|
|
||||||
deviceCode: 'TH20230502001',
|
|
||||||
emergency: 'normal',
|
|
||||||
status: 'pending',
|
|
||||||
createTime: '2024-12-17 14:20:00'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
workcaseId: 'TH20241216001',
|
|
||||||
userId: '3',
|
|
||||||
username: '张总',
|
|
||||||
phone: '13800138003',
|
|
||||||
type: '电气系统故障',
|
|
||||||
device: 'TH-800GF',
|
|
||||||
deviceCode: 'TH20230503001',
|
|
||||||
emergency: 'normal',
|
|
||||||
status: 'done',
|
|
||||||
createTime: '2024-12-16 09:15:00'
|
|
||||||
}
|
|
||||||
])
|
|
||||||
|
|
||||||
// 计算属性:根据tab筛选工单
|
// 计算属性:根据tab筛选工单
|
||||||
const filteredOrders = computed(() => {
|
const filteredOrders = computed(() => {
|
||||||
@@ -158,19 +122,44 @@ onMounted(() => {
|
|||||||
headerTotalHeight.value = statusBarHeight + 44
|
headerTotalHeight.value = statusBarHeight + 44
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
// TODO: 实际调用API获取工单列表
|
// 调用API获取工单列表
|
||||||
loadWorkcaseList()
|
loadWorkcaseList()
|
||||||
})
|
})
|
||||||
|
|
||||||
// 加载工单列表
|
// 加载工单列表
|
||||||
function loadWorkcaseList() {
|
async function loadWorkcaseList() {
|
||||||
// TODO: 调用 workcaseAPI.getWorkcaseList() 获取数据
|
loading.value = true
|
||||||
console.log('加载工单列表')
|
error.value = ''
|
||||||
|
try {
|
||||||
|
const filter: TbWorkcaseDTO = {}
|
||||||
|
if (activeTab.value !== 'all') {
|
||||||
|
filter.status = activeTab.value as TbWorkcaseDTO['status']
|
||||||
|
}
|
||||||
|
const res = await workcaseAPI.getWorkcaseList(filter)
|
||||||
|
if (res.success && res.dataList) {
|
||||||
|
orders.value = res.dataList || []
|
||||||
|
} else {
|
||||||
|
error.value = res.message || '加载失败'
|
||||||
|
uni.showToast({
|
||||||
|
title: res.message || '加载失败',
|
||||||
|
icon: 'error'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
error.value = '网络错误,请稍后重试'
|
||||||
|
uni.showToast({
|
||||||
|
title: '网络错误,请稍后重试',
|
||||||
|
icon: 'error'
|
||||||
|
})
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 切换Tab
|
// 切换Tab
|
||||||
function changeTab(tab: string) {
|
function changeTab(tab: string) {
|
||||||
activeTab.value = tab
|
activeTab.value = tab
|
||||||
|
loadWorkcaseList()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取状态样式类
|
// 获取状态样式类
|
||||||
|
|||||||
Reference in New Issue
Block a user