Browse Source

feat: 客户端新增工单添加缓存最近一次提交功能

master
AaronWu 6 months ago
parent
commit
f19b6c63e6
  1. 4
      .env.development
  2. 71
      src/utils/issueCache.ts
  3. 57
      src/views/client/issue/index.vue
  4. 4
      src/views/question/issue/detail.vue
  5. 16
      src/views/question/issue/formSchemas.tsx
  6. 8
      src/views/question/issue/index.vue
  7. 2
      src/views/question/knowledge/index.vue

4
.env.development

@ -9,8 +9,8 @@
# 只在开发模式中被载入 # 只在开发模式中被载入
# 网站前缀 # 网站前缀
VITE_BASE_API_URL = http://192.168.2.110:8089/server/
# VITE_BASE_API_URL = http://43.137.2.78:8085/server/
# VITE_BASE_API_URL = http://192.168.2.110:8089/server/
VITE_BASE_API_URL = http://43.137.2.78:8085/server/
# base api # base api
VITE_BASE_API = '/server/' VITE_BASE_API = '/server/'

71
src/utils/issueCache.ts

@ -0,0 +1,71 @@
// 问题工单字段缓存工具
const CACHE_KEY = 'issue_form_cache';
export interface IssueFormCache {
contacts?: string;
contactsMobile?: string;
contactsEmail?: string;
customer?: string;
productId?: number;
versionId?: number;
appVersion?: string;
agent?: string;
}
/**
* localStorage
*/
export const saveIssueFormCache = (formData: Partial<IssueFormCache>) => {
try {
const cacheData: IssueFormCache = {};
// 只缓存指定的字段
const fieldsToCache = [
'contacts',
'contactsMobile',
'contactsEmail',
'customer',
'productId',
'versionId',
'appVersion',
'agent'
] as const;
fieldsToCache.forEach(field => {
const value = formData[field];
if (value !== undefined) {
(cacheData as any)[field] = value;
}
});
localStorage.setItem(CACHE_KEY, JSON.stringify(cacheData));
} catch (error) {
console.error('保存表单缓存失败:', error);
}
};
/**
* localStorage获取问题工单表单字段缓存
*/
export const getIssueFormCache = (): IssueFormCache => {
try {
const cacheStr = localStorage.getItem(CACHE_KEY);
if (cacheStr) {
return JSON.parse(cacheStr);
}
} catch (error) {
console.error('获取表单缓存失败:', error);
}
return {};
};
/**
*
*/
export const clearIssueFormCache = () => {
try {
localStorage.removeItem(CACHE_KEY);
} catch (error) {
console.error('清除表单缓存失败:', error);
}
};

57
src/views/client/issue/index.vue

@ -156,6 +156,7 @@
import { type TableListItem } from '@/views/question/issue/columns'; import { type TableListItem } from '@/views/question/issue/columns';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { stateTypeList } from '@/views/question/issue/data'; import { stateTypeList } from '@/views/question/issue/data';
import { saveIssueFormCache, getIssueFormCache } from '@/utils/issueCache';
const router = useRouter(); const router = useRouter();
// //
const treeData = ref<any[]>([]); const treeData = ref<any[]>([]);
@ -283,6 +284,21 @@
await (values.id ? updateIssue : createIssue)(values); await (values.id ? updateIssue : createIssue)(values);
message.success(`${values.id ? '编辑' : '新增'}成功`); message.success(`${values.id ? '编辑' : '新增'}成功`);
// localStorage
if (!values.id) {
saveIssueFormCache({
contacts: values.contacts,
contactsMobile: values.contactsMobile,
contactsEmail: values.contactsEmail,
customer: values.customer,
productId: values.productId,
versionId: values.versionId,
appVersion: values.appVersion,
agent: values.agent,
});
}
visible.value = false; visible.value = false;
resetFormFields(); resetFormFields();
// //
@ -307,11 +323,50 @@
formRef.clearValidate(); formRef.clearValidate();
}; };
const handleAdd = () => {
const handleAdd = async () => {
curRow.value = {}; curRow.value = {};
// formRef?.setFieldsValue(curRecord.value); // formRef?.setFieldsValue(curRecord.value);
quillEditor.value?.setContents(''); quillEditor.value?.setContents('');
resetFormFields(); resetFormFields();
// localStorage
const cachedData = getIssueFormCache();
if (Object.keys(cachedData).length > 0) {
//
const formData: any = { ...cachedData };
// ID
if (cachedData.productId) {
try {
const { data } = await fetchVersionPageList({
productId: cachedData.productId,
current: 1,
size: 999,
});
if (data && Array.isArray(data) && data.length) {
formRef?.updateSchema({
field: 'versionId',
componentProps: {
options: data.map((e) => {
return {
label: e.name,
value: e.id,
};
}),
},
});
}
} catch (error) {
console.error('加载版本列表失败:', error);
}
}
//
nextTick(() => {
formRef?.setFieldsValue(formData);
});
}
openModal(); openModal();
}; };

4
src/views/question/issue/detail.vue

@ -107,6 +107,10 @@
import { CopyOutlined } from '@ant-design/icons-vue'; import { CopyOutlined } from '@ant-design/icons-vue';
import { copyText } from '@/utils/common'; import { copyText } from '@/utils/common';
defineOptions({
name: 'IssueDetail',
});
const props = defineProps({ const props = defineProps({
id: { id: {
type: String, type: String,

16
src/views/question/issue/formSchemas.tsx

@ -8,7 +8,6 @@ import { stateTypeList } from './data';
import { DictEnum } from '@/enums/dictEnum'; import { DictEnum } from '@/enums/dictEnum';
import { getDictionaryByTypeName } from '@/utils/dict'; import { getDictionaryByTypeName } from '@/utils/dict';
import { fetchProdList, fetchVersionPageList } from '@/api/prodVersion'; import { fetchProdList, fetchVersionPageList } from '@/api/prodVersion';
import component from '@/locales/lang/en-US/component';
const questionTypeList = await getDictionaryByTypeName(DictEnum.QUESTION_TYPE); const questionTypeList = await getDictionaryByTypeName(DictEnum.QUESTION_TYPE);
// 编辑页字段 // 编辑页字段
export const getEditFormSchema: ( export const getEditFormSchema: (
@ -219,11 +218,22 @@ export const getEditFormSchema: (
}, },
componentProps: { componentProps: {
options: stateTypeList, options: stateTypeList,
disabled: true,
// disabled: true,
}, },
vIf: () => !isClient, vIf: () => !isClient,
rules: [{ required: true, type: 'number' }], rules: [{ required: true, type: 'number' }],
}, },
// 计划解决时间
{
field: 'resolutionTime',
component: 'Input',
label: '计划解决时间',
colProps: {
span: 6,
},
vIf: () => !isClient && isDetail,
},
{ {
field: 'title', field: 'title',
@ -371,7 +381,7 @@ export const getFlowFormSchema: (row?: Partial<TableListItem>, state?: any) => F
colProps: { colProps: {
span: 24, span: 24,
}, },
vIf: () => state === 5,
vIf: () => state === 5 || state === 6,
rules: [{ required: true, type: 'string' }], rules: [{ required: true, type: 'string' }],
}, },
{ {

8
src/views/question/issue/index.vue

@ -107,12 +107,13 @@
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { useFormModal } from '@/hooks/useModal/index'; import { useFormModal } from '@/hooks/useModal/index';
import { getEditFormSchema, getFlowFormSchema } from './formSchemas'; import { getEditFormSchema, getFlowFormSchema } from './formSchemas';
import { ExclamationCircleOutlined, DeleteOutlinƒed } from '@ant-design/icons-vue';
import { ExclamationCircleOutlined, DeleteOutlined } from '@ant-design/icons-vue';
import { stateTypeList } from './data'; import { stateTypeList } from './data';
import { fetchVersionPageList } from '@/api/prodVersion'; import { fetchVersionPageList } from '@/api/prodVersion';
import { DraggableModal } from '@/components/core/draggable-modal'; import { DraggableModal } from '@/components/core/draggable-modal';
import { useForm } from '@/components/core/schema-form'; import { useForm } from '@/components/core/schema-form';
import { quillImageUploadCustom } from '../commom/tools'; import { quillImageUploadCustom } from '../commom/tools';
import { useDebounceFn } from '@vueuse/core';
defineOptions({ defineOptions({
name: 'issue', name: 'issue',
@ -244,12 +245,11 @@
visible.value = false; visible.value = false;
}; };
const handleSync = async (record: TableListItem) => {
const handleSync = useDebounceFn(async (record: TableListItem) => {
if (!record.id) return; if (!record.id) return;
const res = await syncIssue({ const res = await syncIssue({
id: record.id, id: record.id,
}); });
console.log('res: ', res);
if (res.code === 200) { if (res.code === 200) {
message.success('同步到禅道成功'); message.success('同步到禅道成功');
@ -257,7 +257,7 @@
} else { } else {
message.error('同步到禅道失败'); message.error('同步到禅道失败');
} }
};
}, 300);
const columns: any = [ const columns: any = [
...baseColumns, ...baseColumns,

2
src/views/question/knowledge/index.vue

@ -50,7 +50,7 @@
}" }"
:title="`${curRecord.id ? '编辑' : '新增'}知识库`" :title="`${curRecord.id ? '编辑' : '新增'}知识库`"
:mask-closable="false" :mask-closable="false"
:getContainer="() => knowContainerRef"
:getContainer="knowContainerRef || undefined"
:destroyOnClose="true" :destroyOnClose="true"
@ok="handleOk" @ok="handleOk"
@cancel="handleCancel" @cancel="handleCancel"

Loading…
Cancel
Save