Showing
3 changed files
with
300 additions
and
7 deletions
... | ... | @@ -3,7 +3,7 @@ export default { |
3 | 3 | nameText: '故障类型名称', |
4 | 4 | deviceNameText: '设备名称', |
5 | 5 | nameCode: '报修单号', |
6 | - themeText: '报修单号', | |
6 | + themeText: '报修主题', | |
7 | 7 | reportText: '报修人', |
8 | 8 | departmentText: '所属部门', |
9 | 9 | reportDate: '报修时间', |
... | ... | @@ -16,7 +16,9 @@ export default { |
16 | 16 | deviceTypeText: '设备类型', |
17 | 17 | storageLocationText: '存放位置', |
18 | 18 | useDepartmentText: '使用部门', |
19 | - // faultDescription: '故障描述', | |
19 | + phoneText: '联系方式', | |
20 | + faultDescription: '故障描述', | |
21 | + imgText: '故障图片', | |
20 | 22 | // faultPicture: '故障图片', |
21 | 23 | // faultVideo: '故障视频', |
22 | 24 | // faultAudio: '故障音频', |
... | ... | @@ -40,7 +42,7 @@ export default { |
40 | 42 | creatorText: '创建人', |
41 | 43 | creatorDate: '创建时间', |
42 | 44 | operaDate: '操作时间', |
43 | - createCategoryText: '创建设备报修', | |
44 | - editOrderText: '编辑设备报修', | |
45 | + createCategoryText: '创建故障报修', | |
46 | + editOrderText: '编辑故障报修', | |
45 | 47 | batchActionText: '批量删除', |
46 | 48 | } | ... | ... |
1 | 1 | import {BasicColumn, FormSchema} from "/@/components/Table"; |
2 | 2 | import {useI18n} from "/@/hooks/web/useI18n"; |
3 | 3 | const { t } = useI18n(); |
4 | +import { uploadThumbnail } from '/@/api/configuration/center/configurationCenter'; | |
5 | +import { FileItem } from '/@/components/Upload/src/typing'; | |
6 | +import {createImgPreview} from "/@/components/Preview"; | |
7 | + | |
4 | 8 | const statusOptions = [ |
5 | 9 | |
6 | 10 | ]; |
... | ... | @@ -44,6 +48,181 @@ export const columns: BasicColumn[] = [ |
44 | 48 | } |
45 | 49 | ]; |
46 | 50 | |
51 | +export const formSchema: FormSchema[] = [ | |
52 | + { | |
53 | + field: 'deviceName', | |
54 | + label: t('faultReport.facility.deviceNameText'), | |
55 | + component: 'Input', | |
56 | + required: true, | |
57 | + colProps: { span: 12 }, | |
58 | + }, | |
59 | + { | |
60 | + field: 'deviceCode', | |
61 | + label: t('faultReport.facility.deviceCodeText'), | |
62 | + component: 'Input', | |
63 | + componentProps: { | |
64 | + disabled: true, | |
65 | + }, | |
66 | + required: true, | |
67 | + colProps: { span: 12 }, | |
68 | + }, | |
69 | + { | |
70 | + field: 'model', | |
71 | + label: t('faultReport.facility.modelText'), | |
72 | + component: 'Input', | |
73 | + componentProps: { | |
74 | + disabled: true, | |
75 | + }, | |
76 | + colProps: { span: 12 }, | |
77 | + }, | |
78 | + { | |
79 | + field: 'deviceType', | |
80 | + label: t('faultReport.facility.deviceTypeText'), | |
81 | + component: 'Input', | |
82 | + required: true, | |
83 | + componentProps: { | |
84 | + disabled: true, | |
85 | + }, | |
86 | + colProps: { span: 12 }, | |
87 | + },{ | |
88 | + field: 'storageLocation', | |
89 | + label: t('faultReport.facility.storageLocationText'), | |
90 | + component: 'Input', | |
91 | + componentProps: { | |
92 | + disabled: true, | |
93 | + }, | |
94 | + colProps: { span: 12 }, | |
95 | + },{ | |
96 | + field: 'useDepartment', | |
97 | + label: t('faultReport.facility.useDepartmentText'), | |
98 | + component: 'Input', | |
99 | + componentProps: { | |
100 | + disabled: true, | |
101 | + }, | |
102 | + required: true, | |
103 | + colProps: { span: 12 }, | |
104 | + },{ | |
105 | + field: 'nameCode', | |
106 | + label: t('faultReport.facility.nameCode'), | |
107 | + component: 'Input', | |
108 | + componentProps: { | |
109 | + disabled: true, | |
110 | + }, | |
111 | + required: true, | |
112 | + colProps: { span: 12 }, | |
113 | + },{ | |
114 | + field: 'report', | |
115 | + label: t('faultReport.facility.reportText'), | |
116 | + component: 'Input', | |
117 | + componentProps: { | |
118 | + disabled: true, | |
119 | + }, | |
120 | + required: true, | |
121 | + colProps: { span: 12 }, | |
122 | + },{ | |
123 | + field: 'department', | |
124 | + label: t('faultReport.facility.departmentText'), | |
125 | + component: 'Input', | |
126 | + componentProps: { | |
127 | + disabled: true, | |
128 | + }, | |
129 | + required: true, | |
130 | + colProps: { span: 12 }, | |
131 | + },{ | |
132 | + field: 'phone', | |
133 | + label: t('faultReport.facility.phoneText'), | |
134 | + component: 'Input', | |
135 | + componentProps: { | |
136 | + disabled: true, | |
137 | + }, | |
138 | + colProps: { span: 12 }, | |
139 | + },{ | |
140 | + field: 'themeText', | |
141 | + label: t('faultReport.facility.themeText'), | |
142 | + component: 'Input', | |
143 | + required: true, | |
144 | + colProps: { span: 24 }, | |
145 | + },{ | |
146 | + field: 'faultDate', | |
147 | + label: t('faultReport.facility.faultDate'), | |
148 | + component: 'DatePicker', | |
149 | + componentProps: { | |
150 | + style: { width: '100%' }, | |
151 | + }, | |
152 | + colProps: { span: 12 }, | |
153 | + }, | |
154 | + { | |
155 | + field: 'faultLevel', | |
156 | + label: t('faultReport.facility.faultLevel'), | |
157 | + component: 'Select', | |
158 | + colProps: { span: 12 }, | |
159 | + },{ | |
160 | + field: 'faultType', | |
161 | + label: t('faultReport.facility.faultType'), | |
162 | + component: 'Select', | |
163 | + colProps: { span: 12 }, | |
164 | + },{ | |
165 | + field: 'serviceStatus', | |
166 | + label: t('faultReport.facility.serviceStatus'), | |
167 | + component: 'Checkbox', | |
168 | + colProps: { span: 12 }, | |
169 | + },{ | |
170 | + field: 'faultDescription', | |
171 | + label: t('faultReport.facility.faultDescription'), | |
172 | + component: 'InputTextArea', | |
173 | + colProps: { span: 24 }, | |
174 | + },{ | |
175 | + field: 'img', | |
176 | + label: t('faultReport.facility.imgText'), | |
177 | + component: 'ApiUpload', | |
178 | + changeEvent: 'update:fileList', | |
179 | + valueField: 'fileList', | |
180 | + componentProps: ({ formModel }) => { | |
181 | + return { | |
182 | + listType: 'picture', | |
183 | + maxFileLimit: 10, | |
184 | + accept: '.png,.jpg,.jpeg,.gif', | |
185 | + api: async (file: File) => { | |
186 | + try { | |
187 | + const formData = new FormData(); | |
188 | + formData.set('file', file); | |
189 | + const { fileStaticUri, fileName } = await uploadThumbnail(formData); | |
190 | + return { | |
191 | + uid: fileStaticUri, | |
192 | + name: fileName, | |
193 | + url: fileStaticUri, | |
194 | + } as FileItem; | |
195 | + } catch (error) { | |
196 | + return {}; | |
197 | + } | |
198 | + }, | |
199 | + // showUploadList: true, | |
200 | + onDownload() {}, | |
201 | + onPreview: (fileList: FileItem) => { | |
202 | + createImgPreview({ imageList: [fileList.url!] }); | |
203 | + }, | |
204 | + onDelete(url: string) { | |
205 | + formModel.deleteLogoUrl = url!; | |
206 | + }, | |
207 | + }; | |
208 | + } | |
209 | + } | |
210 | + // { | |
211 | + // field: 'parentId', | |
212 | + // label: t('routes.common.organization.parentOrganization'), | |
213 | + // component: 'ApiTreeSelect', | |
214 | + // componentProps: { | |
215 | + // placeholder: t('common.chooseText') + t('business.organizationText'), | |
216 | + // api: async () => { | |
217 | + // const data = await getOrganizationList(); | |
218 | + // copyTransFun(data as any as any[]); | |
219 | + // return data; | |
220 | + // }, | |
221 | + // multiple: 2 | |
222 | + // }, | |
223 | + // }, | |
224 | +] | |
225 | + | |
47 | 226 | export const searchFormSchema: FormSchema[] = [ |
48 | 227 | { |
49 | 228 | field: 'deviceNameText', | ... | ... |
1 | 1 | <template> |
2 | - <div> | |
3 | - <BasicTable @register="registerTable" style="flex: auto"> | |
2 | + <div class="main"> | |
3 | + <PageWrapper v-if="!status" > | |
4 | + <BasicTable @register="registerTable" style="flex: auto" > | |
5 | + <template #toolbar> | |
6 | + <Authority value="api:yt:faultReport:facility:post"> | |
7 | + <Button type="primary" @click="handleCreate('add')"> | |
8 | + {{ t('faultReport.facility.createCategoryText') }} | |
9 | + </Button> | |
10 | + </Authority> | |
11 | + </template> | |
12 | + </BasicTable> | |
13 | + </PageWrapper> | |
14 | + <PageWrapper v-else class="page"> | |
15 | + <BreadcrumbIot :breadcrumbList="breadcrumbData" /> | |
16 | + <div class="page-form"> | |
17 | + <ModuleTitle :title="t('faultReport.facility.createCategoryText')" /> | |
18 | + <BasicForm | |
19 | + @register="registerForm" | |
20 | + @submit="handleSubmit" | |
21 | + style="padding: 10px 80px 10px 10px" | |
22 | + > | |
23 | + </BasicForm> | |
24 | + <div class="page-form-button"> | |
25 | + <Authority value="api:yt:faultReport:facility:post"> | |
26 | + <Button @click="handleSubmit"> | |
27 | + {{ t('common.cancelText') }} | |
28 | + </Button> | |
29 | + </Authority> | |
30 | + <Authority > | |
31 | + <Button type="primary" @click="handleSubmit" style="margin-left: 10px"> | |
32 | + {{ t('common.okText') }} | |
33 | + </Button> | |
34 | + </Authority> | |
35 | + </div> | |
36 | + </div> | |
37 | + </PageWrapper> | |
4 | 38 | |
5 | - </BasicTable> | |
6 | 39 | </div> |
7 | 40 | </template> |
8 | 41 | <script lang="ts" setup> |
9 | 42 | import {getPlanList} from "/@/api/equipment/chenkPlan"; |
10 | 43 | import {columns, searchFormSchema} from "./index"; |
44 | +import { useRouter, useRoute } from 'vue-router'; | |
11 | 45 | import {DeviceModel} from "/@/api/device/model/deviceModel"; |
12 | 46 | import {useI18n} from "/@/hooks/web/useI18n"; |
13 | 47 | const { t } = useI18n(); |
14 | 48 | import {BasicTable, useTable} from "/@/components/Table"; |
49 | +import {PageWrapper} from "/@/components/Page"; | |
50 | +import { BreadcrumbIot } from "/@/views/common/BreadcrumbIot" | |
51 | +import { ModuleTitle } from "/@/views/common/ModuleTitle" | |
52 | +import {Button} from "ant-design-vue"; | |
53 | +import {Authority} from "/@/components/Authority"; | |
54 | +import {ref,watchEffect} from "vue"; | |
55 | +import {BasicForm, useForm} from "/@/components/Form"; | |
56 | +import {formSchema} from "./index"; | |
57 | +const router = useRouter(); | |
58 | +const route = useRoute(); | |
59 | +const status = ref<string>(''); | |
60 | +const [ | |
61 | + registerForm, | |
62 | + { validate, setFieldsValue, resetFields, updateSchema, validateFields, getFieldsValue }, | |
63 | +] = useForm({ | |
64 | + labelWidth: 120, | |
65 | + schemas: formSchema, | |
66 | + showActionButtonGroup: false, | |
67 | +}); | |
15 | 68 | |
69 | +const breadcrumbData = [ | |
70 | + { | |
71 | + title: '故障报修', | |
72 | + query: 'add', | |
73 | + }, | |
74 | + { | |
75 | + title: '新增故障', | |
76 | + query: '', | |
77 | + }, | |
78 | +]; | |
16 | 79 | const [ |
17 | 80 | registerTable, |
18 | 81 | { reload, setLoading, setSelectedRowKeys, getForm, getSelectRowKeys, getRowSelection }, |
... | ... | @@ -44,4 +107,53 @@ const [ |
44 | 107 | }, |
45 | 108 | } |
46 | 109 | }); |
110 | + | |
111 | +watchEffect(() => { | |
112 | + const type = route?.query?.type || ''; | |
113 | + console.log(type, 'type'); | |
114 | + // if (type === 'add') { | |
115 | + // status.value = 'add'; | |
116 | + // } else if (type === 'edit') { | |
117 | + // status.value = 'edit'; | |
118 | + // } | |
119 | + status.value = type === 'add' ? 'add' : type === 'edit' ? 'edit' : 'default'; | |
120 | +}); | |
121 | + | |
122 | +const handleCreate = (text: string) => { | |
123 | + router.push({ | |
124 | + path: route.path, | |
125 | + query: { type: text }, | |
126 | + }); | |
127 | +}; | |
128 | +const handleSubmit = () => { | |
129 | + console.log('handleSubmit'); | |
130 | + const value = getFieldsValue(); | |
131 | + console.log(value,'value') | |
132 | +} | |
133 | + | |
47 | 134 | </script> |
135 | +<style> | |
136 | +.main { | |
137 | + display: flex; | |
138 | + height: 100%; | |
139 | +} | |
140 | +.page { | |
141 | + padding: 16px; | |
142 | +} | |
143 | +.page-form { | |
144 | + margin-top: 16px; | |
145 | + padding: 16px; | |
146 | + background-color: #fff; | |
147 | + font-size: 14px; | |
148 | + flex: 1; | |
149 | +} | |
150 | +.overflow-hidden { | |
151 | + height: calc(100% - 32px); | |
152 | + display: flex; | |
153 | + flex-direction: column; | |
154 | +} | |
155 | +.page-form-button { | |
156 | + width: 100%; | |
157 | + text-align: center; | |
158 | +} | |
159 | +</style> | ... | ... |