From 63499beb8b3759b22505502ae765661f1e74760b Mon Sep 17 00:00:00 2001 From: fyy <2717885210@qq.com> Date: Mon, 28 Jul 2025 15:29:35 +0800 Subject: [PATCH 1/5] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=BB=BA=E7=AD=91?= =?UTF-8?q?=E7=AE=A1=E7=90=86bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/property/building/data.tsx | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/apps/web-antd/src/views/property/building/data.tsx b/apps/web-antd/src/views/property/building/data.tsx index af23c43f..688c7cbb 100644 --- a/apps/web-antd/src/views/property/building/data.tsx +++ b/apps/web-antd/src/views/property/building/data.tsx @@ -73,14 +73,6 @@ export const columns: VxeGridProps['columns'] = [ title: '地址', field: 'addr', }, - { - title: '经度', - field: 'lon', - }, - { - title: '维度', - field: 'lat', - }, { field: 'action', fixed: 'right', @@ -150,14 +142,4 @@ export const modalSchema: FormSchemaGetter = () => [ component: 'Input', rules: 'required', }, - { - label: '经度', - fieldName: 'lon', - component: 'Input', - }, - { - label: '维度', - fieldName: 'lat', - component: 'Input', - }, ]; From fe78f7ad25e2c6c3431da76d5b2d0666a0bda251 Mon Sep 17 00:00:00 2001 From: dev_ljl <2590379346@qq.com> Date: Mon, 28 Jul 2025 17:16:27 +0800 Subject: [PATCH 2/5] =?UTF-8?q?1=E3=80=81bug=E4=BF=AE=E5=A4=8D=202?= =?UTF-8?q?=E3=80=81=E6=B7=BB=E5=8A=A0=E5=B7=A1=E6=A3=80=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inspectionDetail/index.ts | 61 ++++++ .../inspectionDetail/model.d.ts | 201 ++++++++++++++++++ .../attendance-group-detail.vue | 54 +++-- .../attendanceGroupSettings/data.ts | 20 +- .../attendanceGroupSettings/group-modal.vue | 49 ++++- .../src/views/property/community/data.ts | 21 +- .../src/views/property/community/index.vue | 5 - .../inspectionDetails/data.ts | 116 ++++++---- .../inspectionDetails/index.vue | 16 +- 9 files changed, 458 insertions(+), 85 deletions(-) create mode 100644 apps/web-antd/src/api/property/inspectionManagement/inspectionDetail/index.ts create mode 100644 apps/web-antd/src/api/property/inspectionManagement/inspectionDetail/model.d.ts diff --git a/apps/web-antd/src/api/property/inspectionManagement/inspectionDetail/index.ts b/apps/web-antd/src/api/property/inspectionManagement/inspectionDetail/index.ts new file mode 100644 index 00000000..a6962167 --- /dev/null +++ b/apps/web-antd/src/api/property/inspectionManagement/inspectionDetail/index.ts @@ -0,0 +1,61 @@ +import type { TaskDetailVO, TaskDetailForm, TaskDetailQuery } from './model'; + +import type { ID, IDS } from '#/api/common'; +import type { PageResult } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +/** +* 查询巡检明细列表 +* @param params +* @returns 巡检明细列表 +*/ +export function taskDetailList(params?: TaskDetailQuery) { + return requestClient.get>('/property/taskDetail/list', { params }); +} + +/** + * 导出巡检明细列表 + * @param params + * @returns 巡检明细列表 + */ +export function taskDetailExport(params?: TaskDetailQuery) { + return commonExport('/property/taskDetail/export', params ?? {}); +} + +/** + * 查询巡检明细详情 + * @param id id + * @returns 巡检明细详情 + */ +export function taskDetailInfo(id: ID) { + return requestClient.get(`/property/taskDetail/${id}`); +} + +/** + * 新增巡检明细 + * @param data + * @returns void + */ +export function taskDetailAdd(data: TaskDetailForm) { + return requestClient.postWithMsg('/property/taskDetail', data); +} + +/** + * 更新巡检明细 + * @param data + * @returns void + */ +export function taskDetailUpdate(data: TaskDetailForm) { + return requestClient.putWithMsg('/property/taskDetail', data); +} + +/** + * 删除巡检明细 + * @param id id + * @returns void + */ +export function taskDetailRemove(id: ID | IDS) { + return requestClient.deleteWithMsg(`/property/taskDetail/${id}`); +} diff --git a/apps/web-antd/src/api/property/inspectionManagement/inspectionDetail/model.d.ts b/apps/web-antd/src/api/property/inspectionManagement/inspectionDetail/model.d.ts new file mode 100644 index 00000000..5750e1e1 --- /dev/null +++ b/apps/web-antd/src/api/property/inspectionManagement/inspectionDetail/model.d.ts @@ -0,0 +1,201 @@ +import type { PageQuery, BaseEntity } from '#/api/common'; + +export interface TaskDetailVO { + /** + * 主键id + */ + id: string | number; + + /** + * 任务id + */ + taskId: string | number; + + /** + * 路线id + */ + routeId: string | number; + + /** + * 巡检计划id + */ + planId: string | number; + + /** + * 巡检点id + */ + pointId: string | number; + + /** + * 巡检方式 + */ + patrolType: string; + + /** + * 签到类型 + */ + signType: string; + + /** + * 巡检状态(0未完成,1已完成) + */ + inspectionState: string; + + /** + * 巡检照片 + */ + inspectionImag +e: string; + + /** + * 实际巡检时间 + */ + inspectionTime: string; + + /** + * 备注 + */ + remark: string; + + /** + * 点开始时间 + */ + pointStartTime: string; + + /** + * 点结束时间 + */ + pointEndTime: string; + +} + +export interface TaskDetailForm extends BaseEntity { + /** + * 主键id + */ + id?: string | number; + + /** + * 任务id + */ + taskId?: string | number; + + /** + * 路线id + */ + routeId?: string | number; + + /** + * 巡检计划id + */ + planId?: string | number; + + /** + * 巡检点id + */ + pointId?: string | number; + + /** + * 巡检方式 + */ + patrolType?: string; + + /** + * 签到类型 + */ + signType?: string; + + /** + * 巡检状态(0未完成,1已完成) + */ + inspectionState?: string; + + /** + * 巡检照片 + */ + inspectionImage?: string; + + /** + * 实际巡检时间 + */ + inspectionTime?: string; + + /** + * 备注 + */ + remark?: string; + + /** + * 点开始时间 + */ + pointStartTime?: string; + + /** + * 点结束时间 + */ + pointEndTime?: string; + +} + +export interface TaskDetailQuery extends PageQuery { + /** + * 任务id + */ + taskId?: string | number; + + /** + * 路线id + */ + routeId?: string | number; + + /** + * 巡检计划id + */ + planId?: string | number; + + /** + * 巡检点id + */ + pointId?: string | number; + + /** + * 巡检方式 + */ + patrolType?: string; + + /** + * 签到类型 + */ + signType?: string; + + /** + * 巡检状态(0未完成,1已完成) + */ + inspectionState?: string; + + /** + * 巡检照片 + */ + inspectionImag +e?: string; + + /** + * 实际巡检时间 + */ + inspectionTime?: string; + + /** + * 点开始时间 + */ + pointStartTime?: string; + + /** + * 点结束时间 + */ + pointEndTime?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/attendance-group-detail.vue b/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/attendance-group-detail.vue index 0d454d4d..def438ed 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/attendance-group-detail.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/attendance-group-detail.vue @@ -45,7 +45,28 @@ async function handleOpenChange(open: boolean) { } modalApi.modalLoading(true); const {id,attendanceType} = modalApi.getData() as { id?: number | string,attendanceType?:string }; - groupDetail.value = await groupInfo(id,attendanceType); + const res = await groupInfo(id,attendanceType); + groupDetail.value=res; + if(res.attendanceType==0){ + unCheckInData.value=res.clockDateList.filter(item=>item.mustNoCheck==0) + checkInData.value=res.clockDateList.filter(item=>item.mustNoCheck==1) + weekdayData.value=res.weekList + weekdayData.value.forEach(item => { + if(item.shiftId){ + const shift = res.attendanceList.find(i => item.shiftId == i.id); + let str = '' + if (shift.isRest) { + str = `${shift.name}:${shift.startTime}~${shift.restStartTime} ${shift.restEndTime}~${shift.endTime}`; + } else { + str = `${shift.name}:${shift.startTime}~${shift.endTime}`; + } + item.shiftValue=str + } + }) + groupDetail.value.isAutomatic=true + }else { + cycleData.value=res; + } modalApi.modalLoading(false); } @@ -94,6 +115,15 @@ async function showHoliday() { size="small" :pagination="false" > + - diff --git a/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/data.ts b/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/data.ts index 83536447..df4b942e 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/data.ts +++ b/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/data.ts @@ -82,6 +82,10 @@ export const modalSchema: FormSchemaGetter = () => [ buttonStyle: 'solid', options: getDictOptions('wy_kqlx'), }, + dependencies:{ + disabled: (formValue) => formValue.id, + triggerFields: ['id'], + }, rules: 'selectRequired', defaultValue: '0', }, @@ -168,17 +172,17 @@ export const modalSchema: FormSchemaGetter = () => [ export const weekdayColumns: TableColumnsType = [ { title: '工作日', - key: 'label', + key: 'dayOfWeek', width: 120, align: 'center', - dataIndex: 'label' + dataIndex: 'dayOfWeek' }, { title: '班次', - key: 'shiftValue', + key: 'shiftId', minWidth: 180, align: 'center', - dataIndex: 'shiftValue' + dataIndex: 'shiftId' }, { title: '操作', @@ -320,17 +324,17 @@ export const clockInModalSchema: FormSchemaGetter = () => [ export const infoWeekdayColumns: TableColumnsType = [ { title: '工作日', - key: 'label', + key: 'dayOfWeek', width: 120, align: 'center', - dataIndex: 'label' + dataIndex: 'dayOfWeek' }, { title: '班次', - key: 'shiftValue', + key: 'shiftId', minWidth: 180, align: 'center', - dataIndex: 'shiftValue' + dataIndex: 'shiftId' }, ] diff --git a/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/group-modal.vue b/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/group-modal.vue index cc6690ac..bce2bccb 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/group-modal.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/group-modal.vue @@ -28,6 +28,8 @@ import checkInDate from './check-in-date.vue' import {h} from 'vue'; import {PlusOutlined, MinusOutlined} from '@ant-design/icons-vue'; import type {ShiftVO} from "#/api/property/attendanceManagement/shiftSetting/model"; +import {renderDict} from "#/utils/render"; +import dayjs from "dayjs"; const emit = defineEmits<{ reload: [] }>(); const isUpdate = ref(false); @@ -88,6 +90,26 @@ const [BasicModal, modalApi] = useVbenModal({ isUpdate.value = !!id; if (isUpdate.value && id) { const record = await groupInfo(id, attendanceType); + record.attendanceType = record.attendanceType.toString() + if (record.attendanceType == '0') { + settingData.unCheckInData = record.clockDateList.filter(item => item.mustNoCheck == 0) + settingData.checkInData = record.clockDateList.filter(item => item.mustNoCheck == 1) + settingData.weekdayData = record.weekList + settingData.weekdayData.forEach(item => { + if(item.shiftId){ + const shift = record.attendanceList.find(i => item.shiftId == i.id); + let str = '' + if (shift.isRest) { + str = `${shift.name}:${shift.startTime}~${shift.restStartTime} ${shift.restEndTime}~${shift.endTime}`; + } else { + str = `${shift.name}:${shift.startTime}~${shift.endTime}`; + } + item.shiftValue=str + } + }) + } else { + + } await formApi.setValues(record); } else { getDictOptions('wy_kqgzr').forEach(item => { @@ -119,7 +141,7 @@ async function handleConfirm() { let hasError = true; settingData.cycleData.some((item, index) => { if (!item.scheduleId) { - hasError=false + hasError = false message.warning('请选择周期天数对应班次。'); return; } @@ -331,6 +353,13 @@ function getUnCheckInData(val: any) { :data-source="settingData.weekdayData" size="small" :pagination="false"> @@ -383,8 +417,13 @@ function getUnCheckInData(val: any) { - + From cc9ad36328ba6e5bd829d31eae48862cf08e8634 Mon Sep 17 00:00:00 2001 From: dev_ljl <2590379346@qq.com> Date: Mon, 28 Jul 2025 17:30:46 +0800 Subject: [PATCH 3/5] =?UTF-8?q?1=E3=80=81=E5=85=A5=E9=A9=BB=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E5=88=A0=E9=99=A4=E4=BA=BA=E5=91=98=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/property/resident/person/data.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/apps/web-antd/src/views/property/resident/person/data.ts b/apps/web-antd/src/views/property/resident/person/data.ts index 9110859c..171b1b1a 100644 --- a/apps/web-antd/src/views/property/resident/person/data.ts +++ b/apps/web-antd/src/views/property/resident/person/data.ts @@ -181,15 +181,6 @@ export const modalSchema: FormSchemaGetter = () => [ rules: 'selectRequired', formItemClass: 'col-span-2', }, - { - label: '人员类型', - fieldName: 'type', - component: 'Select', - componentProps: { - options: getDictOptions('wy_rzrylx'), - }, - rules: 'selectRequired', - }, // { // label: '入住员工', // fieldName: 'userId', @@ -236,7 +227,7 @@ export const modalSchema: FormSchemaGetter = () => [ formItemClass: 'col-span-1', componentProps: { class: 'w-auto', - + }, defaultValue: false, dependencies: { From fb537fdc00755cc2f50878f3b89dd64d7ff1ccb5 Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Tue, 29 Jul 2025 02:05:02 +0800 Subject: [PATCH 4/5] =?UTF-8?q?feat(property):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AF=BC=E5=85=A5=E5=92=8C=E4=BA=BA=E8=84=B8?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/property/resident/person/index.ts | 55 ++++++- .../api/property/resident/person/model.d.ts | 12 ++ .../resident/person/face-import-modal.vue | 115 ++++++++++++++ .../views/property/resident/person/index.vue | 148 +++++++++--------- .../resident/person/person-import-modal.vue | 131 ++++++++++++++++ 5 files changed, 382 insertions(+), 79 deletions(-) create mode 100644 apps/web-antd/src/views/property/resident/person/face-import-modal.vue create mode 100644 apps/web-antd/src/views/property/resident/person/person-import-modal.vue diff --git a/apps/web-antd/src/api/property/resident/person/index.ts b/apps/web-antd/src/api/property/resident/person/index.ts index f3593634..43f57891 100644 --- a/apps/web-antd/src/api/property/resident/person/index.ts +++ b/apps/web-antd/src/api/property/resident/person/index.ts @@ -1,9 +1,9 @@ -import type { PersonVO, PersonForm, PersonQuery } from './model'; +import type { PersonVO, PersonForm, PersonQuery, PerssonImportParam } from './model'; import type { ID, IDS } from '#/api/common'; import type { PageResult } from '#/api/common'; -import { commonExport } from '#/api/helper'; +import { commonExport, ContentTypeEnum } from '#/api/helper'; import { requestClient } from '#/api/request'; /** @@ -59,3 +59,54 @@ export function personUpdate(data: PersonForm) { export function personRemove(id: ID | IDS) { return requestClient.deleteWithMsg(`/property/person/${id}`); } + +/** + * 从excel导入用户 + * @param data + * @returns void + */ +export function personImportData(data: PerssonImportParam) { + return requestClient.post<{ code: number; msg: string }>( + '/property/person/importData', + data, + { + headers: { + 'Content-Type': ContentTypeEnum.FORM_DATA, + }, + isTransformResponse: false, + }, + ); +} + +/** + * 导入人脸 + * @param data + * @returns void + */ +export function personImportFace(data: PerssonImportParam) { + return requestClient.post<{ code: number; msg: string }>( + '/property/person/importFace', + data, + { + headers: { + 'Content-Type': ContentTypeEnum.FORM_DATA, + }, + isTransformResponse: false, + }, + ); +} + +/** + * 下载用户导入模板 + * @returns blob + */ +export function downloadImportTemplate() { + return requestClient.post( + '/property/person/importTemplate', + {}, + { + isTransformResponse: false, + responseType: 'blob', + }, + ); +} diff --git a/apps/web-antd/src/api/property/resident/person/model.d.ts b/apps/web-antd/src/api/property/resident/person/model.d.ts index 83b2c7a5..57f03f6b 100644 --- a/apps/web-antd/src/api/property/resident/person/model.d.ts +++ b/apps/web-antd/src/api/property/resident/person/model.d.ts @@ -285,3 +285,15 @@ export interface Person extends BaseEntity { email: string } + +/** + * @description: 用户导入 + * @param updateSupport 是否覆盖数据 + * @param unitId 单位Id + * @param file excel文件 + */ +export interface PerssonImportParam { + updateSupport: boolean; + unitId: number; + file: Blob | File; +} diff --git a/apps/web-antd/src/views/property/resident/person/face-import-modal.vue b/apps/web-antd/src/views/property/resident/person/face-import-modal.vue new file mode 100644 index 00000000..3fd90094 --- /dev/null +++ b/apps/web-antd/src/views/property/resident/person/face-import-modal.vue @@ -0,0 +1,115 @@ + + + diff --git a/apps/web-antd/src/views/property/resident/person/index.vue b/apps/web-antd/src/views/property/resident/person/index.vue index 50d4af5a..2166815f 100644 --- a/apps/web-antd/src/views/property/resident/person/index.vue +++ b/apps/web-antd/src/views/property/resident/person/index.vue @@ -1,29 +1,31 @@ @@ -127,68 +143,44 @@ function handleInfo(row: Required) { diff --git a/apps/web-antd/src/views/property/resident/person/person-import-modal.vue b/apps/web-antd/src/views/property/resident/person/person-import-modal.vue new file mode 100644 index 00000000..03d085da --- /dev/null +++ b/apps/web-antd/src/views/property/resident/person/person-import-modal.vue @@ -0,0 +1,131 @@ + + + From ce445ae088e7e3ed9478976e3eff49e40980cc6f Mon Sep 17 00:00:00 2001 From: fyy <2717885210@qq.com> Date: Tue, 29 Jul 2025 11:42:20 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=AF=BC=E8=88=AA=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/@core/preferences/src/types.ts | 2 ++ .../effects/layouts/src/basic/header/header.vue | 13 ++++++++++++- .../layouts/src/widgets/back-navigation.vue | 14 ++++++++++++++ packages/effects/layouts/src/widgets/index.ts | 1 + 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 packages/effects/layouts/src/widgets/back-navigation.vue diff --git a/packages/@core/preferences/src/types.ts b/packages/@core/preferences/src/types.ts index e640edb5..f2094073 100644 --- a/packages/@core/preferences/src/types.ts +++ b/packages/@core/preferences/src/types.ts @@ -267,6 +267,8 @@ interface WidgetPreferences { sidebarToggle: boolean; /** 是否显示主题切换部件 */ themeToggle: boolean; + /** 是否显示返回导航部件 */ + backNavigation: boolean; } interface Preferences { diff --git a/packages/effects/layouts/src/basic/header/header.vue b/packages/effects/layouts/src/basic/header/header.vue index 97387460..59276af9 100644 --- a/packages/effects/layouts/src/basic/header/header.vue +++ b/packages/effects/layouts/src/basic/header/header.vue @@ -11,6 +11,7 @@ import { LanguageToggle, PreferencesButton, ThemeToggle, + BackNavigation, } from '../../widgets'; interface Props { @@ -43,7 +44,8 @@ const rightSlots = computed(() => { list.push({ index: REFERENCE_VALUE, name: 'global-search', - }); + } + ); } if (preferencesButtonPosition.value.header) { @@ -76,6 +78,12 @@ const rightSlots = computed(() => { name: 'notification', }); } + if (preferences.widget.backNavigation) { + list.push({ + index: REFERENCE_VALUE + 60, + name: 'back-navigation', + }); + } Object.keys(slots).forEach((key) => { const name = key.split('-'); @@ -164,6 +172,9 @@ function clearPreferencesAndLogout() { + diff --git a/packages/effects/layouts/src/widgets/back-navigation.vue b/packages/effects/layouts/src/widgets/back-navigation.vue new file mode 100644 index 00000000..d2b51266 --- /dev/null +++ b/packages/effects/layouts/src/widgets/back-navigation.vue @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/packages/effects/layouts/src/widgets/index.ts b/packages/effects/layouts/src/widgets/index.ts index f6a4a7ba..9b0b9be7 100644 --- a/packages/effects/layouts/src/widgets/index.ts +++ b/packages/effects/layouts/src/widgets/index.ts @@ -9,3 +9,4 @@ export * from './notification'; export * from './preferences'; export * from './theme-toggle'; export * from './user-dropdown'; +export { default as BackNavigation } from './back-navigation.vue';