This commit is contained in:
2025-12-25 14:08:29 +08:00
parent eb827a961c
commit 062c5a8488
7 changed files with 106 additions and 83 deletions

1
ai-management-dify Submodule

Submodule ai-management-dify added at aa57f8551a

1
jitsi-meet Submodule

Submodule jitsi-meet added at 6549d47233

View File

@@ -4,6 +4,11 @@
import {loadShare} from "@module-federation/runtime";
const importMap = {
"axios": async () => {
let pkg = await import("__mf__virtual/workcase__prebuild__axios__prebuild__.js");
return pkg;
}
,
"element-plus": async () => {
let pkg = await import("__mf__virtual/workcase__prebuild__element_mf_2_plus__prebuild__.js");
return pkg;
@@ -22,6 +27,36 @@
}
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": {
name: "element-plus",
version: "2.12.0",

View File

@@ -0,0 +1 @@
export * from './workcase'

View File

@@ -0,0 +1 @@
export * from './workcase'

View File

@@ -38,7 +38,7 @@
<!-- 工单列表 -->
<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">
<template #default="{ row }">
<span class="ticket-no">{{ row.optsn }}</span>
@@ -140,7 +140,7 @@
</el-select>
</el-form-item>
<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>
<template #footer>
@@ -156,9 +156,9 @@ import { ref, computed, onMounted } from 'vue'
import AdminLayout from '@/views/admin/AdminLayout.vue'
import { Plus, Search } from 'lucide-vue-next'
import { ElMessage, ElMessageBox } from 'element-plus'
import { workcaseAPI } from 'shared/api'
import type { TbWorkcaseDTO, TbWorkcaseProcessDTO } from 'shared/types'
import type { PageParam } from 'shared/types'
import { workcaseAPI } from '@/api/workcase'
import type { TbWorkcaseDTO, TbWorkcaseProcessDTO } from '@/types/workcase'
import type { PageRequest, PageParam, ResultDomain } from 'shared/types'
const statusFilter = ref('all')
const typeFilter = ref('')
@@ -171,12 +171,14 @@ const showCreateDialog = ref(false)
const loading = ref(false)
const formData = ref<TbWorkcaseDTO>({
roomId: '',
deviceNamePlateImg: '',
username: '',
phone: '',
device: '',
type: '',
emergency: 'normal',
remark: ''
description: ''
})
const workcaseList = ref<TbWorkcaseDTO[]>([])
@@ -187,7 +189,10 @@ const workcaseList = ref<TbWorkcaseDTO[]>([])
*/
const loadWorkcases = async () => {
loading.value = true
const filter: TbWorkcaseDTO = {}
const filter: TbWorkcaseDTO = {
roomId: '',
deviceNamePlateImg: '',
}
if (statusFilter.value !== 'all') {
filter.status = statusFilter.value as TbWorkcaseDTO['status']
}
@@ -203,10 +208,14 @@ const loadWorkcases = async () => {
pageSize: pageSize.value
}
const res = await workcaseAPI.getWorkcasePage({ filter, pageParam })
if (res.success && res.data) {
workcaseList.value = res.data.list || []
total.value = res.data.pageParam?.total || 0
const pageRequest: PageRequest<TbWorkcaseDTO> = {
filter,
pageParam
}
const res = await workcaseAPI.getWorkcasePage(pageRequest)
if (res.success) {
workcaseList.value = res.dataList || res.pageDomain?.dataList || []
total.value = res.pageParam?.totalElements || 0
} else {
ElMessage.error(res.message || '加载失败')
}
@@ -226,7 +235,7 @@ const createWorkcaseAPI = async () => {
if (res.success) {
ElMessage.success('工单创建成功')
showCreateDialog.value = false
formData.value = { username: '', phone: '', device: '', type: '', emergency: 'normal', remark: '' }
formData.value = { roomId: '', deviceNamePlateImg: '', username: '', phone: '', device: '', type: '', emergency: 'normal', description: '' }
loadWorkcases()
} else {
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' }
]
/**
* 加载Mock数据
*/
const loadMockData = () => {
workcaseList.value = mockTickets as TbWorkcaseDTO[]
total.value = mockTickets.length
}
// ========================= 字段映射 =========================
const typeMap: Record<string, string> = {
@@ -333,7 +336,8 @@ const filteredTickets = computed(() => {
if (searchKeyword.value) {
const keyword = searchKeyword.value.toLowerCase()
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.device || '').toLowerCase().includes(keyword)
)
@@ -352,46 +356,37 @@ const getStatusType = (status: string) => {
const handleFilterChange = () => {
currentPage.value = 1
// loadWorkcases() // API调用取消注释启用
loadWorkcases() // API调用取消注释启用
}
const handlePageChange = (page: number) => {
currentPage.value = page
// loadWorkcases() // API调用取消注释启用
loadWorkcases() // API调用取消注释启用
}
const viewDetail = (row: TbWorkcaseDTO) => {
ElMessage.info(`查看工单详情: ${row.optsn}`)
ElMessage.info(`查看工单详情: ${row.workcaseId}`)
// TODO: 跳转到工单详情页面
}
const assignTicket = (row: TbWorkcaseDTO) => {
// assignWorkcaseAPI(row) // API调用取消注释启用
ElMessage.info(`指派工单: ${row.optsn}`)
assignWorkcaseAPI(row) // API调用取消注释启用
// ElMessage.info(`指派工单: ${row.optsn}`)
}
const completeTicket = (row: TbWorkcaseDTO) => {
// completeWorkcaseAPI(row) // API调用取消注释启用
ElMessage.success(`完成工单: ${row.optsn}`)
completeWorkcaseAPI(row) // API调用取消注释启用
// ElMessage.success(`完成工单: ${row.optsn}`)
}
const createTicket = () => {
// 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: '' }
createWorkcaseAPI() // API调用取消注释启用
}
// ========================= 生命周期 =========================
onMounted(() => {
// loadWorkcases() // API调用取消注释启用
loadMockData() // Mock模式注释此行以使用API
loadWorkcases() // API调用取消注释启用
// loadMockData() // Mock模式注释此行以使用API
})
</script>

View File

@@ -84,51 +84,15 @@
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import type { TbWorkcaseDTO } from '@/types/workcase'
import { workcaseAPI } from '@/api/workcase/workcase'
// 响应式数据
const headerPaddingTop = ref<number>(44)
const headerTotalHeight = ref<number>(88)
const activeTab = ref<string>('all')
// 模拟工单数据
const orders = ref<TbWorkcaseDTO[]>([
{
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'
}
])
const orders = ref<TbWorkcaseDTO[]>([])
const loading = ref<boolean>(false)
const error = ref<string>('')
// 计算属性根据tab筛选工单
const filteredOrders = computed(() => {
@@ -158,19 +122,44 @@ onMounted(() => {
headerTotalHeight.value = statusBarHeight + 44
// #endif
// TODO: 实际调用API获取工单列表
// 调用API获取工单列表
loadWorkcaseList()
})
// 加载工单列表
function loadWorkcaseList() {
// TODO: 调用 workcaseAPI.getWorkcaseList() 获取数据
console.log('加载工单列表')
async function loadWorkcaseList() {
loading.value = true
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
function changeTab(tab: string) {
activeTab.value = tab
loadWorkcaseList()
}
// 获取状态样式类