Showing
8 changed files
with
325 additions
and
30 deletions
| @@ -32,4 +32,22 @@ export const deleteRepairOrder = (params) => { | @@ -32,4 +32,22 @@ export const deleteRepairOrder = (params) => { | ||
| 32 | params, | 32 | params, |
| 33 | }); | 33 | }); |
| 34 | }; | 34 | }; |
| 35 | +/** | ||
| 36 | + * 更新状态 | ||
| 37 | + */ | ||
| 38 | +export const updateStatus = (params) => { | ||
| 39 | + return defHttp.post<any>({ | ||
| 40 | + url: `/repairOrder/updateStatus`, | ||
| 41 | + params, | ||
| 42 | + }); | ||
| 43 | +}; | ||
| 44 | +/** | ||
| 45 | + * 维修 | ||
| 46 | + */ | ||
| 47 | +export const saveRecord = (params) => { | ||
| 48 | + return defHttp.post<any>({ | ||
| 49 | + url: `/repairRecord/save`, | ||
| 50 | + params, | ||
| 51 | + }); | ||
| 52 | +}; | ||
| 35 | 53 |
| @@ -51,6 +51,9 @@ export default { | @@ -51,6 +51,9 @@ export default { | ||
| 51 | stopConfirmText: '确认停用当前维护计划吗?', | 51 | stopConfirmText: '确认停用当前维护计划吗?', |
| 52 | down: '完成', | 52 | down: '完成', |
| 53 | downConfirmText: '确认完成当前维护计划吗?', | 53 | downConfirmText: '确认完成当前维护计划吗?', |
| 54 | + maintenance: '维修', | ||
| 55 | + checkOK: '验收通过', | ||
| 56 | + checkFail: '验收失败', | ||
| 54 | 57 | ||
| 55 | 58 | ||
| 56 | light: '亮色主题', | 59 | light: '亮色主题', |
| @@ -86,7 +86,7 @@ | @@ -86,7 +86,7 @@ | ||
| 86 | treeStyle.value.maxHeight = '100vh' | 86 | treeStyle.value.maxHeight = '100vh' |
| 87 | } | 87 | } |
| 88 | let api:any; | 88 | let api:any; |
| 89 | - if (attrs?.listType === 'equipment') { | 89 | + if (props?.listType === 'equipment') { |
| 90 | api = getAllCategory() | 90 | api = getAllCategory() |
| 91 | }else { | 91 | }else { |
| 92 | api = getOrganizationList() | 92 | api = getOrganizationList() |
| @@ -144,7 +144,7 @@ const [ | @@ -144,7 +144,7 @@ const [ | ||
| 144 | clickToRowSelect: false, | 144 | clickToRowSelect: false, |
| 145 | rowKey: 'id', | 145 | rowKey: 'id', |
| 146 | actionColumn: { | 146 | actionColumn: { |
| 147 | - width: 230, | 147 | + width: 360, |
| 148 | title: t('common.actionText'), | 148 | title: t('common.actionText'), |
| 149 | slots: { customRender: 'action' }, | 149 | slots: { customRender: 'action' }, |
| 150 | fixed: 'right', | 150 | fixed: 'right', |
| @@ -136,7 +136,7 @@ | @@ -136,7 +136,7 @@ | ||
| 136 | clickToRowSelect: false, | 136 | clickToRowSelect: false, |
| 137 | rowKey: 'id', | 137 | rowKey: 'id', |
| 138 | actionColumn: { | 138 | actionColumn: { |
| 139 | - width: 230, | 139 | + width: 360, |
| 140 | title: t('common.actionText'), | 140 | title: t('common.actionText'), |
| 141 | slots: { customRender: 'action' }, | 141 | slots: { customRender: 'action' }, |
| 142 | fixed: 'right', | 142 | fixed: 'right', |
| 1 | +<template> | ||
| 2 | + <a-modal | ||
| 3 | + v-model:visible="visible" | ||
| 4 | + title="维修" | ||
| 5 | + @ok="handleOk" | ||
| 6 | + @cancel="handleCancel" | ||
| 7 | + > | ||
| 8 | + <a-form style="padding: 20px" :model="form" :label-col="{ span: 6 }" :wrapper-col="{ span: 14 }" :rules="rules"> | ||
| 9 | + <a-form-item label="维修人" name="repairByName"> | ||
| 10 | + <div style="display: flex"> | ||
| 11 | + <a-input | ||
| 12 | + v-model:value="form.repairByName" | ||
| 13 | + placeholder="请选择" | ||
| 14 | + :disabled="true" | ||
| 15 | + > | ||
| 16 | + </a-input> | ||
| 17 | + <a-button | ||
| 18 | + type="primary" | ||
| 19 | + @click="goChoose" | ||
| 20 | + :disabled="isViewMode" | ||
| 21 | + > | ||
| 22 | + 选人 | ||
| 23 | + </a-button> | ||
| 24 | + </div> | ||
| 25 | + </a-form-item> | ||
| 26 | + <a-form-item label="维修时间" name="repairDate"> | ||
| 27 | + <a-date-picker | ||
| 28 | + v-model:value="form.repairDate" | ||
| 29 | + placeholder="请选择维修时间" | ||
| 30 | + style="width: 100%" | ||
| 31 | + /> | ||
| 32 | + </a-form-item> | ||
| 33 | + <a-form-item label="维修情况说明" name="description"> | ||
| 34 | + <a-textarea v-model:value="form.description" placeholder="请输入维修情况说明" /> | ||
| 35 | + </a-form-item> | ||
| 36 | + <a-form-item label="故障原因" name="malfunctionReasonId"> | ||
| 37 | + <a-select | ||
| 38 | + v-model:value="form.malfunctionReasonId" | ||
| 39 | + :options="reasonOptions" | ||
| 40 | + placeholder="请选择" | ||
| 41 | + /> | ||
| 42 | + </a-form-item> | ||
| 43 | + </a-form> | ||
| 44 | + </a-modal> | ||
| 45 | + <a-modal | ||
| 46 | + v-model:visible="userVisible" | ||
| 47 | + :title="userModalTitle" | ||
| 48 | + width="60vw" | ||
| 49 | + height="50vh" | ||
| 50 | + @ok="handleUserOk" | ||
| 51 | + @cancel="handleUserCancel" | ||
| 52 | + > | ||
| 53 | + <div style="padding: 20px;display: flex"> | ||
| 54 | + <OrganizationIdTree @select="handleSelect" ref="organizationIdTreeRef" isOpen="true"/> | ||
| 55 | + <div style="margin-top: 20px;margin-left: 30px"> | ||
| 56 | + <a-radio-group v-model:value="selectedItem"> | ||
| 57 | + <template v-for="item in Options" :key="`${item.id}`"> | ||
| 58 | + <a-radio :style="radioStyle" :value="item">{{ item.username }}</a-radio> | ||
| 59 | + </template> | ||
| 60 | + </a-radio-group> | ||
| 61 | + </div> | ||
| 62 | + </div> | ||
| 63 | + </a-modal> | ||
| 64 | +</template> | ||
| 65 | + | ||
| 66 | +<script setup lang="ts"> | ||
| 67 | +import {onMounted, reactive, ref, watch} from 'vue'; | ||
| 68 | +import {OrganizationIdTree, useResetOrganizationTree} from "/@/views/common/organizationIdTree"; | ||
| 69 | +import {getUserListByOrg} from "/@/api/equipment/ledger"; | ||
| 70 | +import {useUserStore} from "/@/store/modules/user"; | ||
| 71 | +import {useMessage} from "/@/hooks/web/useMessage"; | ||
| 72 | +import {getEquipmentErrorList} from "/@/api/equipment/errorReason"; | ||
| 73 | + | ||
| 74 | +const props = defineProps({ | ||
| 75 | + initialData: { | ||
| 76 | + type: Object, | ||
| 77 | + default: () => ({ | ||
| 78 | + form: { | ||
| 79 | + orderId: '', | ||
| 80 | + repairBy: '', | ||
| 81 | + repairByName: '', | ||
| 82 | + repairDate: '', | ||
| 83 | + description: '', | ||
| 84 | + malfunctionReasonId: '', | ||
| 85 | + } | ||
| 86 | + }), | ||
| 87 | + }, | ||
| 88 | + visible: { | ||
| 89 | + type: Boolean, | ||
| 90 | + default: false, | ||
| 91 | + }, | ||
| 92 | +}); | ||
| 93 | + | ||
| 94 | +const visible = ref(props.visible); | ||
| 95 | +const emit = defineEmits(['update:visible', 'submit']); | ||
| 96 | + | ||
| 97 | +const searchInfo = reactive<Recordable>({}); | ||
| 98 | +const { organizationIdTreeRef } = useResetOrganizationTree(searchInfo); | ||
| 99 | +const userVisible = ref(false); | ||
| 100 | +const userModalTitle = ref('选人'); | ||
| 101 | +const selectedItem = ref<{ id: string; username: string } | null>(null); | ||
| 102 | +const radioStyle = reactive({ | ||
| 103 | + display: 'block', | ||
| 104 | + height: '30px', | ||
| 105 | + lineHeight: '30px', | ||
| 106 | +}); | ||
| 107 | +const form = ref({ | ||
| 108 | + orderId: '', | ||
| 109 | + repairBy: '', | ||
| 110 | + repairByName: '', | ||
| 111 | + repairDate: '', | ||
| 112 | + description: '', | ||
| 113 | + malfunctionReasonId: '', | ||
| 114 | +}); | ||
| 115 | +const { createMessage } = useMessage(); | ||
| 116 | +const userInfo = useUserStore(); | ||
| 117 | +const rules = { | ||
| 118 | + repairByName: [{ required: true, message: '请输入维修人', trigger: 'blur' }], | ||
| 119 | + description: [{ required: true, message: '请输入维修情况说明', trigger: 'blur' }], | ||
| 120 | + malfunctionReasonId: [{ required: true, message: '请输入故障原因', trigger: 'blur' }], | ||
| 121 | +}; | ||
| 122 | +watch( | ||
| 123 | + () => props.visible, | ||
| 124 | + (newVal) => { | ||
| 125 | + visible.value = newVal; | ||
| 126 | + } | ||
| 127 | +); | ||
| 128 | + | ||
| 129 | + | ||
| 130 | +// 监听 visible 的变化并通知父组件 | ||
| 131 | +watch( | ||
| 132 | + () => visible.value, | ||
| 133 | + (newVal) => { | ||
| 134 | + emit('update:visible', newVal); | ||
| 135 | + } | ||
| 136 | +); | ||
| 137 | + | ||
| 138 | +// 监听 initialData 的变化 | ||
| 139 | +watch( | ||
| 140 | + () => props.initialData, | ||
| 141 | + (newVal) => { | ||
| 142 | + form.value = { ...newVal.form }; | ||
| 143 | + }, | ||
| 144 | + { deep: true } | ||
| 145 | +); | ||
| 146 | +const reasonOptions = ref([]); | ||
| 147 | +const Options = ref([]); | ||
| 148 | + | ||
| 149 | +const handleOk = () => { | ||
| 150 | + emit('submit', form.value); | ||
| 151 | + resetForm(); | ||
| 152 | +}; | ||
| 153 | + | ||
| 154 | +// 清空表单和表格数据 | ||
| 155 | +const resetForm = () => { | ||
| 156 | + form.value = { | ||
| 157 | + orderId: '', | ||
| 158 | + repairBy: '', | ||
| 159 | + repairByName: '', | ||
| 160 | + repairDate: '', | ||
| 161 | + description: '', | ||
| 162 | + malfunctionReasonId: '', | ||
| 163 | + }; | ||
| 164 | +}; | ||
| 165 | + | ||
| 166 | +const handleCancel = () => { | ||
| 167 | + emit('update:visible', false); // 关闭模态框 | ||
| 168 | +}; | ||
| 169 | + | ||
| 170 | + | ||
| 171 | +const goChoose = () => { | ||
| 172 | + userVisible.value = true; | ||
| 173 | + selectedItem.value = null; | ||
| 174 | +} | ||
| 175 | + | ||
| 176 | +onMounted(() => { | ||
| 177 | + fetchAgeOptions(); | ||
| 178 | +}); | ||
| 179 | + | ||
| 180 | +const fetchAgeOptions = async () => { | ||
| 181 | + try { | ||
| 182 | + const response = await getEquipmentErrorList({ page: 1, pageSize: 999 }); // 调用接口 | ||
| 183 | + reasonOptions.value = response.items?.map((item: any) => { | ||
| 184 | + return { | ||
| 185 | + value: item?.id, | ||
| 186 | + label: item?.reason | ||
| 187 | + } | ||
| 188 | + }); | ||
| 189 | + } catch (error) { | ||
| 190 | + console.error('失败:', error); | ||
| 191 | + } | ||
| 192 | +}; | ||
| 193 | + | ||
| 194 | +const handleSelect = async (organizationId: string) => { | ||
| 195 | + searchInfo.organizationId = organizationId; | ||
| 196 | + const _data = { | ||
| 197 | + page: '1', | ||
| 198 | + pageSize: '999', | ||
| 199 | + tenantId: userInfo.getUserInfo.tenantId!, | ||
| 200 | + organizationId: organizationId | ||
| 201 | + } | ||
| 202 | + const response = await getUserListByOrg(_data); // 调用接口 | ||
| 203 | + Options.value = response.items; | ||
| 204 | + | ||
| 205 | +}; | ||
| 206 | + | ||
| 207 | +// 确认按钮的回调 | ||
| 208 | +const handleUserOk = () => { | ||
| 209 | + if (!selectedItem.value) { | ||
| 210 | + createMessage.warning('请选择一个用户'); | ||
| 211 | + return; | ||
| 212 | + } | ||
| 213 | + form.value.repairBy = selectedItem.value.id | ||
| 214 | + form.value.repairByName = selectedItem.value.username | ||
| 215 | + | ||
| 216 | + userVisible.value = false; // 关闭弹框 | ||
| 217 | +}; | ||
| 218 | + | ||
| 219 | +const handleUserCancel = () => { | ||
| 220 | + selectedItem.value = null; | ||
| 221 | + userVisible.value = false; | ||
| 222 | +}; | ||
| 223 | + | ||
| 224 | +</script> |
| @@ -45,21 +45,26 @@ | @@ -45,21 +45,26 @@ | ||
| 45 | <template #action="{ record }"> | 45 | <template #action="{ record }"> |
| 46 | <TableAction | 46 | <TableAction |
| 47 | :actions="[ | 47 | :actions="[ |
| 48 | + { | ||
| 49 | + label: t('common.maintenance'), | ||
| 50 | + auth: 'api:yt:order:update', | ||
| 51 | + icon: 'ant-design:caret-right-outlined', | ||
| 52 | + ifShow: () => record.status === 'SCHEDULING', | ||
| 53 | + onClick:recordSave.bind(null,record) | ||
| 54 | + }, | ||
| 48 | { | 55 | { |
| 49 | - label: t('common.editText'), | 56 | + label: t('common.checkOK'), |
| 50 | auth: 'api:yt:order:update', | 57 | auth: 'api:yt:order:update', |
| 51 | - icon: 'clarity:note-edit-line', | ||
| 52 | - onClick: handleEdit.bind(null, record), | 58 | + icon: 'ant-design:caret-right-outlined', |
| 59 | + ifShow: () => record.status === 'REPAIRFINISH', | ||
| 60 | + onClick:handleUpdateStatus.bind(null, record, 'ACCEPTANCEPASSED') | ||
| 53 | }, | 61 | }, |
| 54 | { | 62 | { |
| 55 | - label: t('common.delText'), | ||
| 56 | - auth: 'api:yt:order:delete', | ||
| 57 | - icon: 'ant-design:delete-outlined', | ||
| 58 | - color: 'error', | ||
| 59 | - popConfirm: { | ||
| 60 | - title: t('common.deleteConfirmText'), | ||
| 61 | - confirm: handleDelete.bind(null, record), | ||
| 62 | - }, | 63 | + label: t('common.checkFail'), |
| 64 | + auth: 'api:yt:order:update', | ||
| 65 | + icon: 'ant-design:caret-right-outlined', | ||
| 66 | + ifShow: () => record.status === 'REPAIRFINISH', | ||
| 67 | + onClick:handleUpdateStatus.bind(null, record, 'SCHEDULING') | ||
| 63 | }, | 68 | }, |
| 64 | ]" | 69 | ]" |
| 65 | /> | 70 | /> |
| @@ -69,13 +74,18 @@ | @@ -69,13 +74,18 @@ | ||
| 69 | <FormDrawer | 74 | <FormDrawer |
| 70 | @register="registerApplicationApiFormDrawer" | 75 | @register="registerApplicationApiFormDrawer" |
| 71 | /> | 76 | /> |
| 77 | + <RepairFormModal | ||
| 78 | + v-model:visible="modalVisible" | ||
| 79 | + :initial-data="initialData" | ||
| 80 | + @submit="handleSubmit" | ||
| 81 | + /> | ||
| 72 | </div> | 82 | </div> |
| 73 | </template> | 83 | </template> |
| 74 | <script setup lang="ts"> | 84 | <script setup lang="ts"> |
| 75 | - import { orderModal } from "./components/index" | 85 | + import { orderModal, RepairFormModal } from "./components/index" |
| 76 | import { BasicTable, TableAction, TableImg } from '/@/components/Table'; | 86 | import { BasicTable, TableAction, TableImg } from '/@/components/Table'; |
| 77 | import { useTable } from '/@/components/Table'; | 87 | import { useTable } from '/@/components/Table'; |
| 78 | - import { getRepairOrderList } from '/@/api/repair/order'; | 88 | + import {getRepairOrderList, saveRecord, updateStatus} from '/@/api/repair/order'; |
| 79 | import { columns, searchFormSchema } from './index'; | 89 | import { columns, searchFormSchema } from './index'; |
| 80 | import { useI18n } from '/@/hooks/web/useI18n'; | 90 | import { useI18n } from '/@/hooks/web/useI18n'; |
| 81 | import { Button, Tag } from 'ant-design-vue'; | 91 | import { Button, Tag } from 'ant-design-vue'; |
| @@ -85,11 +95,22 @@ | @@ -85,11 +95,22 @@ | ||
| 85 | const [registerModal, { openModal }] = useModal(); | 95 | const [registerModal, { openModal }] = useModal(); |
| 86 | import {FormDrawer} from "./components/FormDrawer/index"; | 96 | import {FormDrawer} from "./components/FormDrawer/index"; |
| 87 | import {useDrawer} from "/@/components/Drawer"; | 97 | import {useDrawer} from "/@/components/Drawer"; |
| 88 | - import {deleteRepairOrder} from "/@/api/repair/order"; | ||
| 89 | import {useMessage} from "/@/hooks/web/useMessage"; | 98 | import {useMessage} from "/@/hooks/web/useMessage"; |
| 99 | + import {ref} from "vue"; | ||
| 100 | + import {dateFormat} from "/@/utils/common/compUtils"; | ||
| 101 | + const modalVisible = ref(false); | ||
| 90 | const [registerApplicationApiFormDrawer, { }] = useDrawer(); | 102 | const [registerApplicationApiFormDrawer, { }] = useDrawer(); |
| 91 | const { createMessage } = useMessage(); | 103 | const { createMessage } = useMessage(); |
| 92 | - | 104 | + const initialData = ref({ |
| 105 | + form: { | ||
| 106 | + orderId:'', | ||
| 107 | + repairBy: '', | ||
| 108 | + repairByName: '', | ||
| 109 | + repairDate: '', | ||
| 110 | + description: '', | ||
| 111 | + malfunctionReasonId: '', | ||
| 112 | + }, | ||
| 113 | + }); | ||
| 93 | const [ | 114 | const [ |
| 94 | registerTable, | 115 | registerTable, |
| 95 | { reload, setLoading, setSelectedRowKeys }, | 116 | { reload, setLoading, setSelectedRowKeys }, |
| @@ -132,26 +153,54 @@ | @@ -132,26 +153,54 @@ | ||
| 132 | }); | 153 | }); |
| 133 | }; | 154 | }; |
| 134 | 155 | ||
| 135 | - // 编辑 | ||
| 136 | - const handleEdit = (record?: any) => { | ||
| 137 | - openModal(true, { | ||
| 138 | - isUpdate: true, | ||
| 139 | - record, | ||
| 140 | - }); | ||
| 141 | - }; | ||
| 142 | 156 | ||
| 143 | - const handleDelete = async (record?: any) => { | 157 | + const handleUpdateStatus = async (record?: any,value?: string) => { |
| 158 | + console.log(record,'record') | ||
| 159 | + console.log(value,'value') | ||
| 144 | let id = record.id; | 160 | let id = record.id; |
| 161 | + let status = value; | ||
| 162 | + | ||
| 145 | try { | 163 | try { |
| 146 | setLoading(true); | 164 | setLoading(true); |
| 147 | - await deleteRepairOrder({ id }); | ||
| 148 | - createMessage.success(t('common.deleteSuccessText')); | 165 | + await updateStatus({ id,status }); |
| 166 | + createMessage.success(t('common.editSuccessText')); | ||
| 149 | handleReload(); | 167 | handleReload(); |
| 150 | } catch (error) { | 168 | } catch (error) { |
| 151 | throw error; | 169 | throw error; |
| 152 | } finally { | 170 | } finally { |
| 153 | setLoading(false); | 171 | setLoading(false); |
| 154 | } | 172 | } |
| 155 | - }; | 173 | + } |
| 156 | 174 | ||
| 175 | + const recordSave = async (record?: any) => { | ||
| 176 | + modalVisible.value = true; | ||
| 177 | + initialData.value = { | ||
| 178 | + form: { | ||
| 179 | + orderId: record?.id || '', | ||
| 180 | + repairBy: '', | ||
| 181 | + repairByName: '', | ||
| 182 | + repairDate: '', | ||
| 183 | + description: '', | ||
| 184 | + malfunctionReasonId: '', | ||
| 185 | + } | ||
| 186 | + } | ||
| 187 | + } | ||
| 188 | + const handleSubmit = async (data) => { | ||
| 189 | + const format = 'yyyy-MM-dd hh:mm:ss'; | ||
| 190 | + const _data = { | ||
| 191 | + ...data, | ||
| 192 | + repairDate: dateFormat(data?.repairDate, format), | ||
| 193 | + } | ||
| 194 | + try { | ||
| 195 | + setLoading(true); | ||
| 196 | + await saveRecord(_data); // 提交维修表单数据 | ||
| 197 | + createMessage.success(t('common.editSuccessText')); | ||
| 198 | + handleReload(); | ||
| 199 | + modalVisible.value = false; | ||
| 200 | + } catch (error) { | ||
| 201 | + throw error; | ||
| 202 | + } finally { | ||
| 203 | + setLoading(false); | ||
| 204 | + } | ||
| 205 | + }; | ||
| 157 | </script> | 206 | </script> |