From 0a77934d8b6c410c9e47e11ab40fc3c5019f27fa Mon Sep 17 00:00:00 2001 From: fyy <2717885210@qq.com> Date: Mon, 11 Aug 2025 11:05:47 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=E6=8E=92=E7=8F=AD=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../attendanceManagement/arrangement/index.ts | 14 +++++++ .../arrangement/model.d.ts | 9 +++-- .../workforceManagement/calendarView.vue | 14 ++----- .../workforceManagement/data.ts | 39 +++++++++++++------ .../workforceManagement/scheduleView.vue | 32 +++++++++------ 5 files changed, 71 insertions(+), 37 deletions(-) diff --git a/apps/web-antd/src/api/property/attendanceManagement/arrangement/index.ts b/apps/web-antd/src/api/property/attendanceManagement/arrangement/index.ts index fdd93873..3da89d0b 100644 --- a/apps/web-antd/src/api/property/attendanceManagement/arrangement/index.ts +++ b/apps/web-antd/src/api/property/attendanceManagement/arrangement/index.ts @@ -78,3 +78,17 @@ export function arrangmentList(params?: arrangmentListQuery) { { params }, ); } + +/** + * 查询某天排班人员详情列表(班表视图) + * @param params + * @returns 排班列表 + */ + +export function queryScheduleView(params?: arrangmentListQuery) { + return requestClient.get>( + '/property/AttendanceUserGroup/queryScheduleView', + { params }, + ); +} + diff --git a/apps/web-antd/src/api/property/attendanceManagement/arrangement/model.d.ts b/apps/web-antd/src/api/property/attendanceManagement/arrangement/model.d.ts index e0ecbb4a..89b0748c 100644 --- a/apps/web-antd/src/api/property/attendanceManagement/arrangement/model.d.ts +++ b/apps/web-antd/src/api/property/attendanceManagement/arrangement/model.d.ts @@ -40,9 +40,9 @@ export interface ArrangementVO { * 状态:0-未生效,1-已生效 */ status?: number; - userGroupList?:any[]; - attendanceGroup?:any; - dateType?:number + userGroupList?: any[]; + attendanceGroup?: any; + dateType?: number; } export interface ArrangementForm extends BaseEntity { @@ -138,5 +138,6 @@ export interface ArrangementQuery extends PageQuery { month?: string; } export interface arrangmentListQuery extends PageQuery { - currentDate:string//某天的日期 + currentDate: string; //某天的日期 } +export interface AttendanceUserGroup {} diff --git a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/calendarView.vue b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/calendarView.vue index 3898bd20..87f5d535 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/calendarView.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/calendarView.vue @@ -15,7 +15,7 @@ import { import { Modal } from 'ant-design-vue'; const emit = defineEmits<{ - (e: 'changeView', value: boolean): void; + (e: 'changeView', value: 'calender' | 'schedule'): void; }>(); const props = defineProps<{ viewMode: 'calender' | 'schedule'; @@ -24,20 +24,15 @@ const selectedDate = ref(); const calendarData = reactive([]); const loading = ref(false); // 查询日历数据 -const fetchCalendarData = async (month?: string) => { +const fetchCalendarData = async () => { try { loading.value = true; const params = { - month: - month || - selectedDate.value?.format('YYYY-MM') || - dayjs().format('YYYY-MM'), + month: selectedDate.value?.format('YYYY-MM') || dayjs().format('YYYY-MM'), }; const res = await arrangementCalender(params); const currentMonth = - month || - selectedDate.value?.format('YYYY-MM') || - dayjs().format('YYYY-MM'); //当前月份的开始日期 + selectedDate.value?.format('YYYY-MM') || dayjs().format('YYYY-MM'); //当前月份的开始日期 // 清空之前的数据 calendarData.length = 0; @@ -171,7 +166,6 @@ const scheduleData: { ]; // 切换视图模式 function handleViewModeChange(e: RadioChangeEvent): void { - // 将父组件的isCalenderView变为true emit('changeView', e.target.value); } diff --git a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/data.ts b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/data.ts index d8918d73..b8f8f270 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/data.ts +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/data.ts @@ -82,34 +82,51 @@ export const columns: VxeGridProps['columns'] = [ }, { title: '人员', - field: 'scheduleName', + field: 'employeeName', width: 120, // width: 'auto', }, { title: '单位', - field: 'scheduleName', + field: 'deptName', width: 'auto', }, - { - title: '排班名称', - field: 'scheduleName', - minWidth: 120, - }, + // { + // title: '排班名称', + // field: 'attendanceArrangement.scheduleName', + // minWidth: 120, + // }, { title: '考勤组', - field: 'groupId', + field: 'attendanceGroup.groupName', minWidth: 120, }, { title: '考勤类型', - field: 'scheduleType', + field: 'attendanceGroup.attendanceType', + slots: { + default: ({ row }) => { + return renderDict(String(row.attendanceGroup.attendanceType),'wy_kqlx') + }, + }, width: 'auto', }, { title: '考勤时间', - field: 'dateType', + field: 'attendanceShift', minWidth: 200, + slots: { + default: ({ row }) => { + if (row.attendanceShift.startTime && row.attendanceShift.endTime) { + if(row.attendanceShift.restEndTime&&row.attendanceShift.restStartTime){ + return `${row.attendanceShift.startTime}~${row.attendanceShift.endTime} ${row.shift.restStartTime}~${row.shift.restEndTime}`; + }else{ + return `${row.attendanceShift.startTime}~${row.attendanceShift.endTime}`; + } + } + return '/'; + }, + }, }, { field: 'action', @@ -289,7 +306,7 @@ export const workforceDayDetailColumns:VxeGridProps['columns'] =[ default: ({ row }) => { if (row.shift.startTime && row.shift.endTime) { if(row.shift.restEndTime&&row.shift.restStartTime){ - return `${row.shift.restStartTime}~${row.shift.restEndTime} ${row.shift.startTime}~${row.shift.endTime}`; + return `${row.shift.startTime}~${row.shift.endTime} ${row.shift.restStartTime}~${row.shift.restEndTime}`; }else{ return `${row.shift.startTime}~${row.shift.endTime}`; } diff --git a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue index b1bb8858..c2d101a0 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue @@ -7,24 +7,28 @@ import { columns } from './data'; import { useVbenVxeGrid, type VxeGridProps } from '#/adapter/vxe-table'; import { getVxePopupContainer } from '@vben/utils'; import { - arrangementList, + queryScheduleView, arrangementRemove, } from '#/api/property/attendanceManagement/arrangement'; import arrangementModal from './arrangement-modal.vue'; import type { ArrangementForm } from '#/api/property/attendanceManagement/arrangement/model'; import { Page, useVbenModal } from '@vben/common-ui'; import { Popconfirm, Space } from 'ant-design-vue'; -const emit = defineEmits<{ (e: 'changeView', value: boolean): void }>(); +import dayjs from 'dayjs'; +const emit = defineEmits<{ + (e: 'changeView', value: 'calender' | 'schedule'): void; +}>(); const props = defineProps<{ viewMode: 'calender' | 'schedule'; }>(); const value = ref(); -const onPanelChange = (value: Dayjs, mode: string) => { - console.log(value, mode); +const onSelect = (value: Dayjs) => { + currentDate.value = dayjs(value).format('YYYY-MM-DD'); + tableApi.query(); }; +let currentDate = ref(dayjs().format('YYYY-MM-DD')); // 切换视图模式 function handleViewModeChange(e: RadioChangeEvent): void { - // 将父组件的isCalenderView变为false emit('changeView', e.target.value); } @@ -45,11 +49,11 @@ const gridOptions: VxeGridProps = { pagerConfig: {}, proxyConfig: { ajax: { - query: async ({ page }, formValues = {}) => { - return await arrangementList({ + query: async ({ page }) => { + return await queryScheduleView({ pageNum: page.currentPage, pageSize: page.pageSize, - ...formValues, + currentDate: currentDate.value, }); }, }, @@ -115,7 +119,7 @@ async function handleDelete(row: Required) { v-model:value="value" :fullscreen="false" :mode="'month'" - @panelChange="onPanelChange" + @select="onSelect" /> @@ -133,7 +137,7 @@ async function handleDelete(row: Required) { ) { v-access:code="['property:arrangement:remove']" @click.stop="" > - {{ $t('pages.common.delete') }} + 移除 @@ -153,4 +157,8 @@ async function handleDelete(row: Required) { - + From 931bdfcddd86c02b323f5cab7188b2b364c2b259 Mon Sep 17 00:00:00 2001 From: FLL <2162874245@qq.com> Date: Mon, 11 Aug 2025 15:04:32 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/property/community/data.ts | 2 +- .../property/visitorManagement/visitorInvitation/data.ts | 6 ++++++ apps/web-antd/vite.config.mts | 5 +++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/web-antd/src/views/property/community/data.ts b/apps/web-antd/src/views/property/community/data.ts index 8dc5734c..3e0e3d46 100644 --- a/apps/web-antd/src/views/property/community/data.ts +++ b/apps/web-antd/src/views/property/community/data.ts @@ -182,7 +182,7 @@ export const modalSchema: FormSchemaGetter = () => [ component: 'Textarea', }, { - label: '人像图片', + label: '社区/园区图片', fieldName: 'img', component: 'ImageUpload', componentProps: { diff --git a/apps/web-antd/src/views/property/visitorManagement/visitorInvitation/data.ts b/apps/web-antd/src/views/property/visitorManagement/visitorInvitation/data.ts index abe88315..ccbcfa04 100644 --- a/apps/web-antd/src/views/property/visitorManagement/visitorInvitation/data.ts +++ b/apps/web-antd/src/views/property/visitorManagement/visitorInvitation/data.ts @@ -141,6 +141,12 @@ export const modalSchema: FormSchemaGetter = () => [ component: 'Input', rules: 'required', }, + { + label: '邀约单位', + fieldName: 'interviewedUnit', + component: 'Input', + rules: 'required', + }, { label: '联系电话', fieldName: 'interviewedPhone', diff --git a/apps/web-antd/vite.config.mts b/apps/web-antd/vite.config.mts index 29bf5bc4..28b4f4cf 100644 --- a/apps/web-antd/vite.config.mts +++ b/apps/web-antd/vite.config.mts @@ -29,9 +29,10 @@ export default defineConfig(async () => { // mock代理目标地址 // target: 'http://192.168.43.169:8080', // target: 'https://by.missmoc.top/api/', - target: 'http://127.0.0.1:8080', - // target: 'http://192.168.0.106:8080', + target: 'http://192.168.1.108:8080', + // target: 'http://192.168.43.169:8080', // target: 'http://47.109.37.87:3010', + // target: 'http://4082b6ba.r8.vip.cpolar.cn', ws: true, }, }, From f7462c254e45c212ceeffb9ce0810e7fc26d90d6 Mon Sep 17 00:00:00 2001 From: FLL <2162874245@qq.com> Date: Mon, 11 Aug 2025 15:06:46 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/views/property/community/community-modal.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web-antd/src/views/property/community/community-modal.vue b/apps/web-antd/src/views/property/community/community-modal.vue index c35956bc..964d1d76 100644 --- a/apps/web-antd/src/views/property/community/community-modal.vue +++ b/apps/web-antd/src/views/property/community/community-modal.vue @@ -30,7 +30,7 @@ const [BasicForm, formApi] = useVbenForm({ // 默认占满两列 formItemClass: 'col-span-1', // 默认label宽度 px - labelWidth: 80, + labelWidth: 90, // 通用配置项 会影响到所有表单项 componentProps: { class: 'w-full', From bc73f02c47e8745c81fe1210b84c878a38fe0bb9 Mon Sep 17 00:00:00 2001 From: dev_ljl <2590379346@qq.com> Date: Tue, 12 Aug 2025 13:41:46 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat:=E5=B7=A1=E6=A3=80=E7=82=B9=E4=BA=8C?= =?UTF-8?q?=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inspectionPoint/model.d.ts | 4 ++ .../views/property/assetManage/depot/data.ts | 30 ++++----- .../src/views/property/community/data.ts | 2 +- .../inspectionPlan/data.ts | 2 +- .../inspectionPoint/data.ts | 7 ++ .../inspectionPoint/index.vue | 41 +++++++++++- .../inspectionPoint/point-detail.vue | 64 +++++++++++++++++++ 7 files changed, 130 insertions(+), 20 deletions(-) create mode 100644 apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/point-detail.vue diff --git a/apps/web-antd/src/api/property/inspectionManagement/inspectionPoint/model.d.ts b/apps/web-antd/src/api/property/inspectionManagement/inspectionPoint/model.d.ts index dd4e4824..38196b80 100644 --- a/apps/web-antd/src/api/property/inspectionManagement/inspectionPoint/model.d.ts +++ b/apps/web-antd/src/api/property/inspectionManagement/inspectionPoint/model.d.ts @@ -46,6 +46,10 @@ export interface InspectionPointVO { */ searchValue: string; + itemName: string; + + createTime: string; + } export interface InspectionPointForm extends BaseEntity { diff --git a/apps/web-antd/src/views/property/assetManage/depot/data.ts b/apps/web-antd/src/views/property/assetManage/depot/data.ts index 3d8cabf5..afc2f889 100644 --- a/apps/web-antd/src/views/property/assetManage/depot/data.ts +++ b/apps/web-antd/src/views/property/assetManage/depot/data.ts @@ -2,6 +2,8 @@ import type {FormSchemaGetter} from '#/adapter/form'; import type {VxeGridProps} from '#/adapter/vxe-table'; import {renderDict} from "#/utils/render"; import {getDictOptions} from "#/utils/dict"; +import {z} from "#/adapter/form"; +import {$t} from "@vben/locales"; export const querySchema: FormSchemaGetter = () => [ @@ -30,18 +32,10 @@ export const querySchema: FormSchemaGetter = () => [ export const columns: VxeGridProps['columns'] = [ {type: 'checkbox', width: 60}, - { - title: '序号', - field: 'id', - slots: { - default: ({rowIndex}) => { - return (rowIndex + 1).toString(); - } - } - }, { title: '仓库名称', field: 'depotName', + width:200 }, { title: '仓库类型', @@ -50,21 +44,23 @@ export const columns: VxeGridProps['columns'] = [ default: ({row}) => { return renderDict(row.modelType, 'wy_cclx') } - } + }, + width:180 }, { title: '状态', field: 'state', - slots: {default: 'state'} + slots: {default: 'state'}, + width:120 + }, + { + title: '创建时间', + field: 'createTime', }, { title: '描述信息', field: 'msg', - }, - - { - title: '创建时间', - field: 'createTime', + minWidth:180, }, { field: 'action', @@ -89,7 +85,7 @@ export const modalSchema: FormSchemaGetter = () => [ label: '仓库名称', fieldName: 'depotName', component: 'Input', - rules:'required' + rules: z.string().min(1,'请输入仓库名称').max(30, { message: '仓库名称过长' }), }, { label: '仓库类型', diff --git a/apps/web-antd/src/views/property/community/data.ts b/apps/web-antd/src/views/property/community/data.ts index 8dc5734c..770114f1 100644 --- a/apps/web-antd/src/views/property/community/data.ts +++ b/apps/web-antd/src/views/property/community/data.ts @@ -154,7 +154,7 @@ export const modalSchema: FormSchemaGetter = () => [ { label: '占地面积', fieldName: 'area', - component: 'Input', + component: 'InputNumber', }, { label: '建成时间', diff --git a/apps/web-antd/src/views/property/inspectionManagement/inspectionPlan/data.ts b/apps/web-antd/src/views/property/inspectionManagement/inspectionPlan/data.ts index 95fd466a..9e269ea2 100644 --- a/apps/web-antd/src/views/property/inspectionManagement/inspectionPlan/data.ts +++ b/apps/web-antd/src/views/property/inspectionManagement/inspectionPlan/data.ts @@ -116,7 +116,7 @@ export const modalSchema: FormSchemaGetter = () => [ label: '计划名称', fieldName: 'planName', component: 'Input', - rules: 'required', + rules: z.string().min(1,'请输入计划名称').max(30, { message: '计划名称过长' }), }, { label: '巡检路线', diff --git a/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/data.ts b/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/data.ts index a80edc9a..b6d51485 100644 --- a/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/data.ts +++ b/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/data.ts @@ -50,6 +50,13 @@ export const columns: VxeGridProps['columns'] = [ title: '创建时间', field: 'createTime', }, + { + title: '二维码', + field: 'qrcode', + slots:{ + default: 'qrcode' + } + }, { title: '备注', field: 'remark', diff --git a/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/index.vue b/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/index.vue index 156f113a..bce8238d 100644 --- a/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/index.vue +++ b/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/index.vue @@ -1,7 +1,7 @@ + + diff --git a/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/point-detail.vue b/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/point-detail.vue new file mode 100644 index 00000000..7b9fe199 --- /dev/null +++ b/apps/web-antd/src/views/property/inspectionManagement/inspectionPoint/point-detail.vue @@ -0,0 +1,64 @@ + + + From 1d1afb0162457c1cc01f1f1dcc8112e6fb59e52c Mon Sep 17 00:00:00 2001 From: fyy <2717885210@qq.com> Date: Tue, 12 Aug 2025 13:51:35 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E8=A7=86=E9=A2=91=E9=A2=84=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/layouts/basic.vue | 55 ++-- .../workforceManagement/arrangement-modal.vue | 52 +++- .../workforceManagement/data.ts | 34 ++- .../workforceManagement/dept-tree.vue | 122 ++++++++ .../workforceManagement/scheduleView.vue | 3 +- .../workforceManagement/type.d.ts | 109 +++---- .../workforceManagement/unit-person-modal.vue | 204 ++++--------- .../videoWarning/videoAlertList/index.vue | 1 - .../videoWarning/videoWarningHasDone/data.ts | 265 +++++++++++++++++ .../videoWarningHasDone/index.vue | 279 ++++++++++++++++++ .../level-setting-modal.vue | 45 +++ .../videoWarningHasDone/warning-detail.vue | 147 +++++++++ .../videoWarningHasDone/warning-modal.vue | 122 ++++++++ .../videoWarningProcessing/data.ts | 103 +++++-- .../videoWarningProcessing/index.vue | 152 +++++----- .../videoWarningProcessing/warning-detail.vue | 79 ++++- .../videoWarningProcessing/warning-modal.vue | 13 + .../videoWarning/videoWarningToDone/data.ts | 265 +++++++++++++++++ .../videoWarning/videoWarningToDone/index.vue | 276 +++++++++++++++++ .../level-setting-modal.vue | 45 +++ .../videoWarningToDone/warning-detail.vue | 147 +++++++++ .../videoWarningToDone/warning-modal.vue | 121 ++++++++ 22 files changed, 2260 insertions(+), 379 deletions(-) create mode 100644 apps/web-antd/src/views/property/attendanceManagement/workforceManagement/dept-tree.vue create mode 100644 apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/data.ts create mode 100644 apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/index.vue create mode 100644 apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/level-setting-modal.vue create mode 100644 apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/warning-detail.vue create mode 100644 apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/warning-modal.vue create mode 100644 apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/data.ts create mode 100644 apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/index.vue create mode 100644 apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/level-setting-modal.vue create mode 100644 apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/warning-detail.vue create mode 100644 apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/warning-modal.vue diff --git a/apps/web-antd/src/layouts/basic.vue b/apps/web-antd/src/layouts/basic.vue index 4d5fee5d..fffb92c6 100644 --- a/apps/web-antd/src/layouts/basic.vue +++ b/apps/web-antd/src/layouts/basic.vue @@ -11,7 +11,6 @@ import { GiteeIcon, GitHubOutlined, UserOutlined, - } from '@vben/icons'; import { BasicLayout, @@ -58,34 +57,34 @@ const menus = computed(() => { icon: UserOutlined, text: $t('ui.widgets.profile'), }, + // { + // handler: () => { + // openWindow('https://gitee.com/dapppp/ruoyi-plus-vben5', { + // target: '_blank', + // }); + // }, + // icon: () => h(GiteeIcon, { class: 'text-red-800' }), + // text: 'Gitee项目地址', + // }, + // { + // handler: () => { + // openWindow(VBEN_GITHUB_URL, { + // target: '_blank', + // }); + // }, + // icon: GitHubOutlined, + // text: 'Vben官方地址', + // }, + // { + // handler: () => { + // openWindow(`${VBEN_GITHUB_URL}/issues`, { + // target: '_blank', + // }); + // }, + // icon: CircleHelp, + // text: $t('ui.widgets.qa'), + // }, { - handler: () => { - openWindow('https://gitee.com/dapppp/ruoyi-plus-vben5', { - target: '_blank', - }); - }, - icon: () => h(GiteeIcon, { class: 'text-red-800' }), - text: 'Gitee项目地址', - }, - { - handler: () => { - openWindow(VBEN_GITHUB_URL, { - target: '_blank', - }); - }, - icon: GitHubOutlined, - text: 'Vben官方地址', - }, - { - handler: () => { - openWindow(`${VBEN_GITHUB_URL}/issues`, { - target: '_blank', - }); - }, - icon: CircleHelp, - text: $t('ui.widgets.qa'), - }, - { handler: () => { router.push('/navigation'); }, diff --git a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/arrangement-modal.vue b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/arrangement-modal.vue index 1a941699..85d4c4ec 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/arrangement-modal.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/arrangement-modal.vue @@ -1,5 +1,5 @@ + + diff --git a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue index c2d101a0..6a22a6aa 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue @@ -114,6 +114,7 @@ async function handleDelete(row: Required) { border: '1px solid #d9d9d9', borderRadius: '4px', }" + class="calendar" > ) { diff --git a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/type.d.ts b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/type.d.ts index f3685f2a..9f4afa2d 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/type.d.ts +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/type.d.ts @@ -1,67 +1,52 @@ //列表数据,用于展示人员列表 export interface PersonVO { - /** - * 主键id - */ - id: string | number; - - /** - * 用户id - */ - userId: string | number; - - /** - * 用户名称 - */ + userId: string; + tenantId: string; + deptId: number; userName: string; - - /** - * 联系电话 - */ - phone: string; - - /** - * 性别 - */ - gender: number; - - /** - * 人脸图片 - */ - img: string; - - /** - * 所属单位id - */ - unitId: string | number; - - /** - * 所属单位名称 - */ - unitName: string; - - /** - * 入驻位置 - */ - locathon: string; - - /** - * 入驻时间 - */ - time: string; - - /** - * 车牌号码 - */ - carNumber: string; - - /** - * 状态 - */ - state: number | string; - - /** - * 备注 - */ + nickName: string; + userType: string; + email: string; + phonenumber: string; + sex: string; + avatar?: string; + status: string; + loginIp: string; + loginDate: string; remark: string; + createTime: string; + dept: Dept; + roles: Role[]; + roleIds?: string[]; + postIds?: number[]; + roleId: string; + deptName: string; +} +export interface Dept { + deptId: number; + parentId: number; + parentName?: string; + ancestors: string; + deptName: string; + orderNum: number; + leader: string; + phone?: string; + email?: string; + status: string; + createTime?: string; +} + +export interface Role { + roleId: string; + roleName: string; + roleKey: string; + roleSort: number; + dataScope: string; + menuCheckStrictly?: boolean; + deptCheckStrictly?: boolean; + status: string; + remark: string; + createTime?: string; + flag: boolean; + superAdmin: boolean; } diff --git a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/unit-person-modal.vue b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/unit-person-modal.vue index d2b9a3b4..425ef105 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/unit-person-modal.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/unit-person-modal.vue @@ -1,35 +1,22 @@ diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoAlertList/index.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoAlertList/index.vue index 52143fee..d56d9376 100644 --- a/apps/web-antd/src/views/videoSystem/videoWarning/videoAlertList/index.vue +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoAlertList/index.vue @@ -38,7 +38,6 @@ class="cursor-pointer overflow-hidden rounded-lg border border-gray-200 transition-shadow hover:shadow-md" @click="handleViewDetail(item)" > -
+import { Page, useVbenModal, type VbenFormProps } from '@vben/common-ui'; +import { getVxePopupContainer } from '@vben/utils'; + +import { Modal, Popconfirm, Space, Tag } from 'ant-design-vue'; +import { ref, watch } from 'vue'; + +import { + useVbenVxeGrid, + vxeCheckboxChecked, + type VxeGridProps, +} from '#/adapter/vxe-table'; + +import { commonDownloadExcel } from '#/utils/file/download'; +import { renderDict } from '#/utils/render'; + +import { columns, querySchema } from './data'; +import warningModal from './warning-modal.vue'; +import warningDetail from './warning-detail.vue'; +import LevelSettingModal from './level-setting-modal.vue'; +import imgPng from '../../../../assets/algorithmManagement/image.png'; + +// 假数据 +const mockData = ref([ + { + id: 1, + alarmId: 'JWD-3434234', + alarmTime: '2025.07.21 12:20', + level: '特大', + alarmType: '越界侦测', + description: '温度高于80度发生火宅', + location: '1栋3号电梯旁', + processingStatus: '已完成', + processingDetails: '', + processingTime: '', + }, + { + id: 2, + alarmId: 'JWD-3434235', + alarmTime: '2025.07.21 11:15', + level: '重要', + alarmType: '异常行为', + description: '人员异常聚集', + location: '2栋大厅', + processingStatus: '已完成', + processingDetails: '已派人员前往处理', + processingTime: '2025.07.21 11:30', + imgUrl: imgPng, + }, + { + id: 3, + alarmId: 'JWD-3434236', + alarmTime: '2025.07.21 10:45', + level: '一般', + alarmType: '设备故障', + description: '摄像头离线', + location: '3栋走廊', + processingStatus: '已完成', + processingDetails: '已修复设备', + processingTime: '2025.07.21 11:00', + imgUrl: imgPng, + }, + { + id: 4, + alarmId: 'JWD-3434236', + alarmTime: '2025.07.21 10:45', + level: '一般', + alarmType: '设备故障', + description: '摄像头离线', + location: '3栋走廊', + processingStatus: '已完成', + processingDetails: '已修复设备', + processingTime: '2025.07.21 11:00', + imgUrl: imgPng, + }, +]); + +const formOptions: VbenFormProps = { + commonConfig: { + labelWidth: 100, + componentProps: { + allowClear: true, + }, + }, + schema: querySchema(), + wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3', +}; + +const gridOptions: VxeGridProps = { + columns, + height: 'auto', + data: mockData.value, + pagerConfig: { + currentPage: 1, + pageSize: 10, + total: mockData.value.length, + }, + rowConfig: { + keyField: 'id', + }, + id: 'video-warning-processing-index', +}; + +const [BasicTable, tableApi] = useVbenVxeGrid({ + formOptions, + gridOptions, +}); + +// 监听数据变化,强制重新渲染表格 +const tableKey = ref(0); +watch( + mockData, + () => { + tableKey.value++; + }, + { deep: true }, +); + +const [WarningModal, modalApi] = useVbenModal({ + connectedComponent: warningModal, +}); + +const [WarningDetail, detailApi] = useVbenModal({ + connectedComponent: warningDetail, +}); + +const [LevelSettingModalComp, levelModalApi] = useVbenModal({ + connectedComponent: LevelSettingModal, +}); + +// 级别设置 +function handleLevelSetting(row: any) { + levelModalApi.setData({ id: row.id, level: row.level, data: mockData.value }); + levelModalApi.open(); +} + +// 查看详情 +async function handleView(row: any) { + detailApi.setData({ id: row.id, data: mockData.value }); + detailApi.open(); +} + +// 编辑 +async function handleEdit(row: any) { + modalApi.setData({ id: row.id, data: mockData.value }); + modalApi.open(); +} + +// // 分配处理 +// function handleAssign(row: any) { +// Modal.confirm({ +// title: '分配处理', +// content: `确定要分配预警 ${row.alarmId} 给处理人员吗?`, +// onOk() { +// // 模拟分配处理 +// const index = mockData.value.findIndex((item: any) => item.id === row.id); +// if (index !== -1) { +// mockData.value[index].processingStatus = '处理中'; +// mockData.value[index].processingDetails = '已分配给处理人员'; +// mockData.value[index].processingTime = new Date().toLocaleString(); +// tableApi.query(); +// } +// }, +// }); +// } + +// 删除 +async function handleDelete(row: any) { + const index = mockData.value.findIndex((item: any) => item.id === row.id); + if (index !== -1) { + mockData.value.splice(index, 1); + await tableApi.query(); + } +} + +// 批量删除 +function handleMultiDelete() { + const rows = tableApi.grid.getCheckboxRecords(); + const ids = rows.map((row: any) => row.id); + Modal.confirm({ + title: '提示', + okType: 'danger', + content: `确认删除选中的${ids.length}条记录吗?`, + onOk: async () => { + ids.forEach((id) => { + const index = mockData.value.findIndex((item: any) => item.id === id); + if (index !== -1) { + mockData.value.splice(index, 1); + } + }); + await tableApi.query(); + }, + }); +} + + + diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/level-setting-modal.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/level-setting-modal.vue new file mode 100644 index 00000000..1568374a --- /dev/null +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/level-setting-modal.vue @@ -0,0 +1,45 @@ + + + diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/warning-detail.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/warning-detail.vue new file mode 100644 index 00000000..9479a43b --- /dev/null +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/warning-detail.vue @@ -0,0 +1,147 @@ + + + diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/warning-modal.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/warning-modal.vue new file mode 100644 index 00000000..125a333e --- /dev/null +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningHasDone/warning-modal.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningProcessing/data.ts b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningProcessing/data.ts index 7639cf63..a6cae811 100644 --- a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningProcessing/data.ts +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningProcessing/data.ts @@ -48,6 +48,11 @@ export const columns: VxeGridProps['columns'] = [ field: 'alarmTime', width: 150, }, + { + title: '设备名称', + field: 'deviceName', + width: 150, + }, { title: '级别', field: 'level', @@ -116,6 +121,11 @@ export const columns: VxeGridProps['columns'] = [ field: 'processingDetails', width: 150, }, + { + title: '预期处理时间', + field: 'expectedProcessingTime', + width: 150, + }, { title: '处理时间', field: 'processingTime', @@ -145,6 +155,7 @@ export const modalSchema: FormSchemaGetter = () => [ fieldName: 'alarmId', component: 'Input', rules: 'required', + disabled: true, }, { label: '预警时间', @@ -156,6 +167,63 @@ export const modalSchema: FormSchemaGetter = () => [ showTime: true, }, rules: 'required', + disabled: true, + }, + { + label: '预警类型', + fieldName: 'alarmType', + component: 'Input', + rules: 'required', + disabled: true, + }, + { + label: '描述', + fieldName: 'description', + component: 'Input', + formItemClass: 'col-span-2', + disabled: true, + }, + { + label: '所在位置', + fieldName: 'location', + component: 'Input', + rules: 'required', + disabled: true, + }, + { + label: '设备名称', + fieldName: 'deviceName', + component: 'Input', + rules: 'required', + disabled: true, + }, + { + label: '处理情况', + fieldName: 'processingDetails', + component: 'Input', + componentProps: { + rows: 3, + }, + formItemClass: 'col-span-2', + disabled: true, + }, + { + label: '处理时间', + fieldName: 'processingTime', + component: 'DatePicker', + componentProps: { + format: 'YYYY.MM.DD HH:mm', + valueFormat: 'YYYY.MM.DD HH:mm', + showTime: true, + }, + disabled: true, + }, + { + label: '处理图片', + fieldName: 'imgUrl', + component: 'Input', + rules: 'required', + disabled: true, }, { label: '级别', @@ -170,27 +238,6 @@ export const modalSchema: FormSchemaGetter = () => [ }, rules: 'selectRequired', }, - { - label: '预警类型', - fieldName: 'alarmType', - component: 'Input', - rules: 'required', - }, - { - label: '描述', - fieldName: 'description', - component: 'InputTextArea', - componentProps: { - rows: 3, - }, - formItemClass: 'col-span-2', - }, - { - label: '所在位置', - fieldName: 'location', - component: 'Input', - rules: 'required', - }, { label: '处理状态', fieldName: 'processingStatus', @@ -205,22 +252,14 @@ export const modalSchema: FormSchemaGetter = () => [ rules: 'selectRequired', }, { - label: '处理情况', - fieldName: 'processingDetails', - component: 'InputTextArea', - componentProps: { - rows: 3, - }, - formItemClass: 'col-span-2', - }, - { - label: '处理时间', - fieldName: 'processingTime', + label: '预期处理时间', + fieldName: 'expectedProcessingTime', component: 'DatePicker', componentProps: { format: 'YYYY.MM.DD HH:mm', valueFormat: 'YYYY.MM.DD HH:mm', showTime: true, }, + rules: 'required', }, ]; diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningProcessing/index.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningProcessing/index.vue index b7ca1380..7ff8410d 100644 --- a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningProcessing/index.vue +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningProcessing/index.vue @@ -1,73 +1,3 @@ - - - + diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/data.ts b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/data.ts new file mode 100644 index 00000000..a6cae811 --- /dev/null +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/data.ts @@ -0,0 +1,265 @@ +import type { FormSchemaGetter } from '#/adapter/form'; +import type { VxeGridProps } from '#/adapter/vxe-table'; +import { getDictOptions } from '#/utils/dict'; +import { renderDict } from '#/utils/render'; +import { h } from 'vue'; + +export const querySchema: FormSchemaGetter = () => [ + { + component: 'Input', + fieldName: 'alarmType', + label: '视频预警类型', + }, + { + component: 'Select', + componentProps: { + options: [ + { label: '特大', value: '特大' }, + { label: '重要', value: '重要' }, + { label: '一般', value: '一般' }, + ], + }, + fieldName: 'level', + label: '级别', + }, + { + component: 'Select', + componentProps: { + options: [ + { label: '待分配', value: '待分配' }, + { label: '处理中', value: '处理中' }, + { label: '已完成', value: '已完成' }, + ], + }, + fieldName: 'processingStatus', + label: '处理状态', + }, +]; + +export const columns: VxeGridProps['columns'] = [ + { type: 'checkbox', width: 60 }, + { + title: '预警编号', + field: 'alarmId', + width: 150, + }, + { + title: '预警时间', + field: 'alarmTime', + width: 150, + }, + { + title: '设备名称', + field: 'deviceName', + width: 150, + }, + { + title: '级别', + field: 'level', + width: 100, + slots: { + default: ({ row }: any) => { + const levelColors: Record = { + 特大: 'red', + 重要: 'orange', + 一般: 'blue', + }; + return h( + 'span', + { + style: { + color: levelColors[row.level] || '#666', + fontWeight: 'bold', + }, + }, + row.level, + ); + }, + }, + }, + { + title: '预警类型', + field: 'alarmType', + width: 120, + }, + { + title: '描述', + field: 'description', + minWidth: 200, + }, + { + title: '所在位置', + field: 'location', + width: 150, + }, + { + title: '处理状态', + field: 'processingStatus', + width: 100, + slots: { + default: ({ row }: any) => { + const statusColors: Record = { + 待分配: 'red', + 处理中: 'orange', + 已完成: 'green', + }; + return h( + 'span', + { + style: { + color: statusColors[row.processingStatus] || '#666', + fontWeight: 'bold', + }, + }, + row.processingStatus, + ); + }, + }, + }, + { + title: '处理情况', + field: 'processingDetails', + width: 150, + }, + { + title: '预期处理时间', + field: 'expectedProcessingTime', + width: 150, + }, + { + title: '处理时间', + field: 'processingTime', + width: 150, + }, + { + field: 'action', + fixed: 'right', + slots: { default: 'action' }, + title: '操作', + width: 380, + }, +]; + +export const modalSchema: FormSchemaGetter = () => [ + { + label: '主键', + fieldName: 'id', + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], + }, + }, + { + label: '预警编号', + fieldName: 'alarmId', + component: 'Input', + rules: 'required', + disabled: true, + }, + { + label: '预警时间', + fieldName: 'alarmTime', + component: 'DatePicker', + componentProps: { + format: 'YYYY.MM.DD HH:mm', + valueFormat: 'YYYY.MM.DD HH:mm', + showTime: true, + }, + rules: 'required', + disabled: true, + }, + { + label: '预警类型', + fieldName: 'alarmType', + component: 'Input', + rules: 'required', + disabled: true, + }, + { + label: '描述', + fieldName: 'description', + component: 'Input', + formItemClass: 'col-span-2', + disabled: true, + }, + { + label: '所在位置', + fieldName: 'location', + component: 'Input', + rules: 'required', + disabled: true, + }, + { + label: '设备名称', + fieldName: 'deviceName', + component: 'Input', + rules: 'required', + disabled: true, + }, + { + label: '处理情况', + fieldName: 'processingDetails', + component: 'Input', + componentProps: { + rows: 3, + }, + formItemClass: 'col-span-2', + disabled: true, + }, + { + label: '处理时间', + fieldName: 'processingTime', + component: 'DatePicker', + componentProps: { + format: 'YYYY.MM.DD HH:mm', + valueFormat: 'YYYY.MM.DD HH:mm', + showTime: true, + }, + disabled: true, + }, + { + label: '处理图片', + fieldName: 'imgUrl', + component: 'Input', + rules: 'required', + disabled: true, + }, + { + label: '级别', + fieldName: 'level', + component: 'Select', + componentProps: { + options: [ + { label: '特大', value: '特大' }, + { label: '重要', value: '重要' }, + { label: '一般', value: '一般' }, + ], + }, + rules: 'selectRequired', + }, + { + label: '处理状态', + fieldName: 'processingStatus', + component: 'Select', + componentProps: { + options: [ + { label: '待分配', value: '待分配' }, + { label: '处理中', value: '处理中' }, + { label: '已完成', value: '已完成' }, + ], + }, + rules: 'selectRequired', + }, + { + label: '预期处理时间', + fieldName: 'expectedProcessingTime', + component: 'DatePicker', + componentProps: { + format: 'YYYY.MM.DD HH:mm', + valueFormat: 'YYYY.MM.DD HH:mm', + showTime: true, + }, + rules: 'required', + }, +]; diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/index.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/index.vue new file mode 100644 index 00000000..cb074052 --- /dev/null +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/index.vue @@ -0,0 +1,276 @@ + + + diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/level-setting-modal.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/level-setting-modal.vue new file mode 100644 index 00000000..1568374a --- /dev/null +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/level-setting-modal.vue @@ -0,0 +1,45 @@ + + + diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/warning-detail.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/warning-detail.vue new file mode 100644 index 00000000..9479a43b --- /dev/null +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/warning-detail.vue @@ -0,0 +1,147 @@ + + + diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/warning-modal.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/warning-modal.vue new file mode 100644 index 00000000..78c338ea --- /dev/null +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningToDone/warning-modal.vue @@ -0,0 +1,121 @@ + + + + From 938bb0a52a984b109608e0a0d15e52bb112671e5 Mon Sep 17 00:00:00 2001 From: FLL <2162874245@qq.com> Date: Tue, 12 Aug 2025 13:59:23 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../property/customerService/commonProblem/index.vue | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 apps/web-antd/src/views/property/customerService/commonProblem/index.vue diff --git a/apps/web-antd/src/views/property/customerService/commonProblem/index.vue b/apps/web-antd/src/views/property/customerService/commonProblem/index.vue new file mode 100644 index 00000000..8300c0b3 --- /dev/null +++ b/apps/web-antd/src/views/property/customerService/commonProblem/index.vue @@ -0,0 +1,11 @@ + + + + +