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/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/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) { - + 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: { 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 @@ + + + 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';