From d9621a0416f1bac16d518e093d9e5c5d3a049fec Mon Sep 17 00:00:00 2001 From: dev_ljl <2590379346@qq.com> Date: Sun, 20 Jul 2025 17:58:39 +0800 Subject: [PATCH 1/5] =?UTF-8?q?1=E3=80=81=E8=80=83=E5=8B=A4=E7=BB=84?= =?UTF-8?q?=E6=8E=92=E7=8F=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../attendanceGroupSettings/index.ts | 9 ++ .../attendanceGroupSettings/model.d.ts | 15 ++- .../costManagement/houseCharge/model.d.ts | 2 + .../attendanceGroupSettings/data.ts | 97 ++++++++++++-- .../attendanceGroupSettings/group-modal.vue | 123 +++++++++++++----- .../holiday-calendar.vue | 78 +++++++++++ .../houseCharge/house-charge-refund.vue | 23 ++-- 7 files changed, 293 insertions(+), 54 deletions(-) create mode 100644 apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/holiday-calendar.vue diff --git a/apps/web-antd/src/api/property/attendanceManagement/attendanceGroupSettings/index.ts b/apps/web-antd/src/api/property/attendanceManagement/attendanceGroupSettings/index.ts index a7260b35..66a61b01 100644 --- a/apps/web-antd/src/api/property/attendanceManagement/attendanceGroupSettings/index.ts +++ b/apps/web-antd/src/api/property/attendanceManagement/attendanceGroupSettings/index.ts @@ -59,3 +59,12 @@ export function groupUpdate(data: GroupForm) { export function groupRemove(id: ID | IDS) { return requestClient.deleteWithMsg(`/Property/group/${id}`); } + +/** + * 获取节假日数据 + * @param year + */ +export async function getHoliday(year: string) { + const response = await fetch(`https://timor.tech/api/holiday/year/${year}`); + return response.json(); +} diff --git a/apps/web-antd/src/api/property/attendanceManagement/attendanceGroupSettings/model.d.ts b/apps/web-antd/src/api/property/attendanceManagement/attendanceGroupSettings/model.d.ts index e189227b..ab341b73 100644 --- a/apps/web-antd/src/api/property/attendanceManagement/attendanceGroupSettings/model.d.ts +++ b/apps/web-antd/src/api/property/attendanceManagement/attendanceGroupSettings/model.d.ts @@ -1,4 +1,4 @@ -import type { PageQuery, BaseEntity } from '#/api/common'; +import type {PageQuery, BaseEntity} from '#/api/common'; export interface GroupVO { /** @@ -63,7 +63,16 @@ export interface GroupQuery extends PageQuery { attendanceType?: number; /** - * 日期范围参数 - */ + * 日期范围参数 + */ params?: any; } + +/** + * 假期 + */ +export interface Holiday { + holiday: boolean; + name: string; + date: string; +} diff --git a/apps/web-antd/src/api/property/costManagement/houseCharge/model.d.ts b/apps/web-antd/src/api/property/costManagement/houseCharge/model.d.ts index 2188b2fb..7abe3229 100644 --- a/apps/web-antd/src/api/property/costManagement/houseCharge/model.d.ts +++ b/apps/web-antd/src/api/property/costManagement/houseCharge/model.d.ts @@ -58,6 +58,8 @@ export interface HouseChargeVO { costItemsVo: CostItemSettingVO; chargeStatus: string; + + personId: string; } export interface HouseChargeForm extends BaseEntity { 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 d270af7e..14d851ab 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/data.ts +++ b/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/data.ts @@ -2,7 +2,7 @@ import type { FormSchemaGetter } from '#/adapter/form'; import type { VxeGridProps } from '#/adapter/vxe-table'; import {getDictOptions} from "#/utils/dict"; import {renderDict} from "#/utils/render"; - +import type { TableColumnsType } from 'ant-design-vue'; export const querySchema: FormSchemaGetter = () => [ { @@ -124,6 +124,18 @@ export const modalSchema: FormSchemaGetter = () => [ rules:'required', defaultValue:'1', }, + { + label: '', + fieldName: 'shiftData', + component: 'Input', + dependencies: { + show: (formValue) => formValue.attendanceType=='1', + triggerFields: ['attendanceType'], + }, + slots:{ + default:'shiftData' + }, + }, { label: '排班周期', fieldName: 'schedulingCycle', @@ -138,32 +150,99 @@ export const modalSchema: FormSchemaGetter = () => [ defaultValue:'1', rules:'required' }, + { + label: '', + fieldName: 'cycleData', + component: 'Input', + dependencies: { + show: (formValue) => formValue.attendanceType=='1', + triggerFields: ['attendanceType'], + }, + slots:{ + default:'cycleData' + }, + }, ]; -export const weekdayColumns: VxeGridProps['columns'] = [ +export const weekdayColumns: TableColumnsType = [ { title: '工作日', - name: 'label', + key: 'label', width:180, align:'center', dataIndex:'label' }, { title: '班次', - name: 'shift', + key: 'shift', minWidth:180, align:'center', dataIndex:'shift' }, { title: '操作', - name: 'action', + key: 'action', dataIndex:'action', width:180, align:'center', - slots:{ - default:'action' - }, - }, ] + +export const noClockingColumns: TableColumnsType = [ + { + title: '无需打卡日期', + key: 'label', + width:180, + align:'center', + dataIndex:'label' + }, + { + title: '操作', + key: 'action', + dataIndex:'action', + width:180, + align:'center', + }, +] + +export const clockingColumns: TableColumnsType = [ + { + title: '必须打卡日期', + key: 'label', + width:180, + align:'center', + dataIndex:'label' + }, + { + title: '操作', + key: 'action', + dataIndex:'action', + width:180, + align:'center', + }, +] + +export const cycleColumns: TableColumnsType = [ + { + title: '天数', + key: 'label', + width:180, + align:'center', + dataIndex:'label' + }, + { + title: '班次', + key: 'label', + width:180, + align:'center', + dataIndex:'label' + }, + { + title: '操作', + key: 'action', + dataIndex:'action', + width:180, + align:'center', + }, +] + 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 769c01c1..4445dbbc 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 @@ -13,9 +13,16 @@ import { } from '#/api/property/attendanceManagement/attendanceGroupSettings'; import {defaultFormValueGetter, useBeforeCloseDiff} from '#/utils/popup'; -import {modalSchema, weekdayColumns} from './data'; -import {Tag, Button, Table} from 'ant-design-vue' +import { + clockingColumns, + cycleColumns, + modalSchema, + noClockingColumns, + weekdayColumns +} from './data'; +import {Tag, Button, Table, Checkbox} from 'ant-design-vue' import {getDictOptions} from "#/utils/dict"; +import holidayCalendar from './holiday-calendar.vue' const emit = defineEmits<{ reload: [] }>(); @@ -24,7 +31,9 @@ const weekdayData = ref([]) const title = computed(() => { return isUpdate.value ? $t('pages.common.edit') : $t('pages.common.add'); }); - +const settingData = ref({ + isAutomatic: true, +}) const [BasicForm, formApi] = useVbenForm({ commonConfig: { // 默认占满两列 @@ -50,8 +59,9 @@ const {onBeforeClose, markInitialized, resetInitialized} = useBeforeCloseDiff( const [BasicModal, modalApi] = useVbenModal({ // 在这里更改宽度 - class: 'w-[70%]', + class: 'w-[80%]', fullscreenButton: false, + maskClosable:false, onBeforeClose, onClosed: handleClosed, onConfirm: handleConfirm, @@ -66,18 +76,17 @@ const [BasicModal, modalApi] = useVbenModal({ if (isUpdate.value && id) { const record = await groupInfo(id); await formApi.setValues(record); - }else { - weekdayData.value=[] - getDictOptions('wy_kqgzr').forEach(item=>{ - weekdayData.value.push({ - dayOfWeek:item.value, - label:item.label, - shift:item.value=='6'||item.value=='7'?'休息':'常规班次:08:00:00~12:00:00 14:00:00~17:00:00' - }) + } else { + weekdayData.value = [] + getDictOptions('wy_kqgzr').forEach(item => { + weekdayData.value.push({ + dayOfWeek: item.value, + label: item.label, + shift: item.value == '6' || item.value == '7' ? '休息' : '常规班次:08:00:00~12:00:00 14:00:00~17:00:00' + }) }) } await markInitialized(); - modalApi.modalLoading(false); }, }); @@ -106,41 +115,95 @@ async function handleClosed() { await formApi.resetForm(); resetInitialized(); } + +const [HolidayCalendar, holidayApi] = useVbenModal({ + connectedComponent: holidayCalendar, +}); + +/** + * 查看法定节假日日历 + */ +async function showHoliday() { + holidayApi.open() +} + + diff --git a/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/holiday-calendar.vue b/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/holiday-calendar.vue new file mode 100644 index 00000000..2db5c818 --- /dev/null +++ b/apps/web-antd/src/views/property/attendanceManagement/attendanceGroupSettings/holiday-calendar.vue @@ -0,0 +1,78 @@ + + + + diff --git a/apps/web-antd/src/views/property/costManagement/houseCharge/house-charge-refund.vue b/apps/web-antd/src/views/property/costManagement/houseCharge/house-charge-refund.vue index 4d068e2f..9a67aad1 100644 --- a/apps/web-antd/src/views/property/costManagement/houseCharge/house-charge-refund.vue +++ b/apps/web-antd/src/views/property/costManagement/houseCharge/house-charge-refund.vue @@ -6,13 +6,11 @@ import {cloneDeep} from '@vben/utils'; import {useVbenForm} from '#/adapter/form'; import { - houseChargeAdd, houseChargeInfo, houseChargeRefund, - houseChargeUpdate } from '#/api/property/costManagement/houseCharge'; import {defaultFormValueGetter, useBeforeCloseDiff} from '#/utils/popup'; -import {modalSchemaRefund, modalSchemaUpdate} from './data'; +import {modalSchemaRefund} from './data'; import {renderDict} from "#/utils/render"; import {Descriptions, DescriptionsItem, Divider} from "ant-design-vue"; import type {HouseChargeVO} from "#/api/property/costManagement/houseCharge/model"; @@ -62,14 +60,15 @@ const [BasicModal, modalApi] = useVbenModal({ modalApi.modalLoading(true); const {id} = modalApi.getData() as { id?: number | string }; isUpdate.value = !!id; - record.value = await houseChargeInfo(id); - if (record.value) { - room.value = record.value.roomVo - costItem.value = record.value.costItemsVo + if(id){ + record.value = await houseChargeInfo(id); + if (record.value) { + room.value = record.value.roomVo + costItem.value = record.value.costItemsVo + } + await formApi.setValues(record.value); } - await formApi.setValues(record.value); await markInitialized(); - modalApi.modalLoading(false); }, }); @@ -83,8 +82,8 @@ async function handleConfirm() { } // getValues获取为一个readonly的对象 需要修改必须先深拷贝一次 const data = cloneDeep(await formApi.getValues()); - data.costItemsId = record.value.costItemsId - data.personId = record.value.personId + data.costItemsId = record.value?.costItemsId + data.personId = record.value?.personId await houseChargeRefund(data); resetInitialized(); emit('reload'); @@ -123,7 +122,7 @@ async function handleClosed() { {{ record.startTime }} - {{ room.roomNumber }} + {{ room?.roomNumber }} {{ `${room?.area} (套内面积:${room?.insideInArea})` }} From 9a14f9bc77879a7f009ae95dd0e659e1bc232266 Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Sun, 20 Jul 2025 19:46:54 +0800 Subject: [PATCH 2/5] =?UTF-8?q?refactor(sis):=20=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=94=B5=E6=A2=AF=E6=A5=BC=E5=B1=82=E6=8E=88=E6=9D=83=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sis/elevatorInfo/floorAuth-modal.vue | 116 ------------------ .../src/views/sis/elevatorInfo/index.vue | 13 -- 2 files changed, 129 deletions(-) delete mode 100644 apps/web-antd/src/views/sis/elevatorInfo/floorAuth-modal.vue diff --git a/apps/web-antd/src/views/sis/elevatorInfo/floorAuth-modal.vue b/apps/web-antd/src/views/sis/elevatorInfo/floorAuth-modal.vue deleted file mode 100644 index dc1f22c2..00000000 --- a/apps/web-antd/src/views/sis/elevatorInfo/floorAuth-modal.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - diff --git a/apps/web-antd/src/views/sis/elevatorInfo/index.vue b/apps/web-antd/src/views/sis/elevatorInfo/index.vue index ae3195ad..e9ed22c5 100644 --- a/apps/web-antd/src/views/sis/elevatorInfo/index.vue +++ b/apps/web-antd/src/views/sis/elevatorInfo/index.vue @@ -25,7 +25,6 @@ import { commonDownloadExcel } from '#/utils/file/download'; import elevatorInfoModal from './elevatorInfo-modal.vue'; import { columns, querySchema } from './data'; -import floorAuthModal from './floorAuth-modal.vue'; const formOptions: VbenFormProps = { commonConfig: { @@ -89,10 +88,6 @@ const [ElevatorInfoModal, modalApi] = useVbenModal({ connectedComponent: elevatorInfoModal, }); -const [FloorAuthModal, floorAuthModalApi] = useVbenModal({ - connectedComponent: floorAuthModal, -}); - function handleAdd() { modalApi.setData({}); modalApi.open(); @@ -128,11 +123,6 @@ function handleDownloadExcel() { }); } -function handleAuth(row: Required) { - floorAuthModalApi.setData({ unitId: row.unitId, elevatorId: row.elevatorId }); - floorAuthModalApi.open(); -} - - From 31c260c8cadbce53290d91feeb69851f076faa98 Mon Sep 17 00:00:00 2001 From: fyy <2717885210@qq.com> Date: Sun, 20 Jul 2025 20:40:35 +0800 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=E7=BB=84=E4=BB=B6=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=BC=95=E5=85=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workforceManagement/scheduleView.vue | 50 +++++++------------ 1 file changed, 19 insertions(+), 31 deletions(-) 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 59da82b2..9614c0e9 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue @@ -5,13 +5,12 @@ import {ref} from 'vue'; import dayjs from 'dayjs'; import { Dayjs } from 'dayjs'; import { columns, querySchema } from './data'; -import { +import { useVbenVxeGrid, vxeCheckboxChecked, - type VxeGridProps + type VxeGridProps } from '#/adapter/vxe-table'; import { getVxePopupContainer } from '@vben/utils'; -import { Page, useVbenModal, type VbenFormProps } from '@vben/common-ui'; import { arrangementExport, arrangementList, @@ -22,11 +21,7 @@ import type { ArrangementForm } from '#/api/property/attendanceManagement/arrang import { Page, useVbenModal, type VbenFormProps } from '@vben/common-ui'; import { Modal, Popconfirm, Space } from 'ant-design-vue'; - - - const emit = defineEmits<{(e:'changeView',value:boolean):void}>(); - const props = defineProps<{ viewMode:'calender' | 'schedule' }>(); @@ -40,25 +35,6 @@ function handleViewModeChange(e: RadioChangeEvent): void { emit('changeView',e.target.value) } -const formOptions: VbenFormProps = { - commonConfig: { - labelWidth: 80, - componentProps: { - allowClear: true, - }, - }, - schema: querySchema(), - wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4', - // 处理区间选择器RangePicker时间格式 将一个字段映射为两个字段 搜索/导出会用到 - // 不需要直接删除 - // fieldMappingTime: [ - // [ - // 'createTime', - // ['params[beginTime]', 'params[endTime]'], - // ['YYYY-MM-DD 00:00:00', 'YYYY-MM-DD 23:59:59'], - // ], - // ], -}; const gridOptions: VxeGridProps = { checkboxConfig: { @@ -90,10 +66,23 @@ const gridOptions: VxeGridProps = { keyField: 'id', }, // 表格全局唯一表示 保存列配置需要用到 - id: 'property-arrangement-index' + id: 'property-arrangement-index', + toolbarConfig: { + // 控制工具栏整体是否显示(默认显示) + show: true, + // 隐藏"刷新/重置"按钮(对应 redo) + refresh: false, + // 隐藏"全屏"按钮 + fullscreen: false, + // 隐藏"列设置"按钮(对应 setting) + columns: false, + // 隐藏"表格尺寸"按钮(对应 size) + size: undefined, + // 其他可能的按钮(如导出等,按需配置) + // export: false, // 如果有导出按钮,也可以隐藏 + }, }; const [BasicTable, tableApi] = useVbenVxeGrid({ - formOptions, gridOptions, }); @@ -129,7 +118,7 @@ async function handleDelete(row: Required) {
- + - + \ No newline at end of file From 29fd557eac3bfd58eae8bfed4d466ca25539e8f7 Mon Sep 17 00:00:00 2001 From: fyy <2717885210@qq.com> Date: Sun, 20 Jul 2025 20:47:25 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=E7=BB=84=E4=BB=B6=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=BC=95=E5=85=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../attendanceManagement/workforceManagement/scheduleView.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 9614c0e9..b3836a31 100644 --- a/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue +++ b/apps/web-antd/src/views/property/attendanceManagement/workforceManagement/scheduleView.vue @@ -2,7 +2,6 @@ import { Radio, Select, Button, Table,Calendar } from 'ant-design-vue'; import type { RadioChangeEvent } from 'ant-design-vue'; import {ref} from 'vue'; -import dayjs from 'dayjs'; import { Dayjs } from 'dayjs'; import { columns, querySchema } from './data'; import { @@ -150,4 +149,4 @@ async function handleDelete(row: Required) {
\ No newline at end of file + From ee1365cd4c42d20b64309346bf3f9f7c351025f4 Mon Sep 17 00:00:00 2001 From: 15683799673 Date: Mon, 21 Jul 2025 03:38:19 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/package.json | 1 + .../api/{property => sis}/factory/index.ts | 12 +- .../api/{property => sis}/factory/model.d.ts | 0 apps/web-antd/src/api/sis/stream/index.ts | 13 + apps/web-antd/src/api/sis/stream/model.d.ts | 22 ++ .../src/views/sis/deviceManage/data.ts | 64 ++++- .../sis/deviceManage/deviceManage-modal.vue | 12 +- .../src/views/sis/elevatorInfo/data.ts | 3 - .../views/{property => sis}/factory/data.ts | 40 +-- .../factory/factory-modal.vue | 2 +- .../views/{property => sis}/factory/index.vue | 41 ++- .../src/views/sis/personLibImg/data.tsx | 2 +- .../src/views/sis/video/channel-tree.vue | 18 +- apps/web-antd/src/views/sis/video/data.ts | 4 + apps/web-antd/src/views/sis/video/index.vue | 270 +++++++++++++++++- apps/web-antd/vite.config.mts | 4 +- .../base/shared/src/constants/dict-enum.ts | 1 + 17 files changed, 403 insertions(+), 106 deletions(-) rename apps/web-antd/src/api/{property => sis}/factory/index.ts (70%) rename apps/web-antd/src/api/{property => sis}/factory/model.d.ts (100%) create mode 100644 apps/web-antd/src/api/sis/stream/index.ts create mode 100644 apps/web-antd/src/api/sis/stream/model.d.ts rename apps/web-antd/src/views/{property => sis}/factory/data.ts (65%) rename apps/web-antd/src/views/{property => sis}/factory/factory-modal.vue (96%) rename apps/web-antd/src/views/{property => sis}/factory/index.vue (89%) diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index 3d0ec1d3..0007c442 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -51,6 +51,7 @@ "echarts-gl": "^2.0.9", "jsencrypt": "^3.3.2", "lodash-es": "^4.17.21", + "mpegts.js": "^1.8.0", "pinia": "catalog:", "tinymce": "^7.3.0", "unplugin-vue-components": "^0.27.3", diff --git a/apps/web-antd/src/api/property/factory/index.ts b/apps/web-antd/src/api/sis/factory/index.ts similarity index 70% rename from apps/web-antd/src/api/property/factory/index.ts rename to apps/web-antd/src/api/sis/factory/index.ts index ae1f1a6e..456248bf 100644 --- a/apps/web-antd/src/api/property/factory/index.ts +++ b/apps/web-antd/src/api/sis/factory/index.ts @@ -12,7 +12,7 @@ import { requestClient } from '#/api/request'; * @returns 厂商管理列表 */ export function factoryList(params?: FactoryQuery) { - return requestClient.get>('/property/factory/list', { params }); + return requestClient.get>('/sis/factory/list', { params }); } /** @@ -21,7 +21,7 @@ export function factoryList(params?: FactoryQuery) { * @returns 厂商管理列表 */ export function factoryExport(params?: FactoryQuery) { - return commonExport('/property/factory/export', params ?? {}); + return commonExport('/sis/factory/export', params ?? {}); } /** @@ -30,7 +30,7 @@ export function factoryExport(params?: FactoryQuery) { * @returns 厂商管理详情 */ export function factoryInfo(id: ID) { - return requestClient.get(`/property/factory/${id}`); + return requestClient.get(`/sis/factory/${id}`); } /** @@ -39,7 +39,7 @@ export function factoryInfo(id: ID) { * @returns void */ export function factoryAdd(data: FactoryForm) { - return requestClient.postWithMsg('/property/factory', data); + return requestClient.postWithMsg('/sis/factory', data); } /** @@ -48,7 +48,7 @@ export function factoryAdd(data: FactoryForm) { * @returns void */ export function factoryUpdate(data: FactoryForm) { - return requestClient.putWithMsg('/property/factory', data); + return requestClient.putWithMsg('/sis/factory', data); } /** @@ -57,5 +57,5 @@ export function factoryUpdate(data: FactoryForm) { * @returns void */ export function factoryRemove(id: ID | IDS) { - return requestClient.deleteWithMsg(`/property/factory/${id}`); + return requestClient.deleteWithMsg(`/sis/factory/${id}`); } diff --git a/apps/web-antd/src/api/property/factory/model.d.ts b/apps/web-antd/src/api/sis/factory/model.d.ts similarity index 100% rename from apps/web-antd/src/api/property/factory/model.d.ts rename to apps/web-antd/src/api/sis/factory/model.d.ts diff --git a/apps/web-antd/src/api/sis/stream/index.ts b/apps/web-antd/src/api/sis/stream/index.ts new file mode 100644 index 00000000..0f07b406 --- /dev/null +++ b/apps/web-antd/src/api/sis/stream/index.ts @@ -0,0 +1,13 @@ +import type { AddStreamProxyResult } from './model'; +import { requestClient } from '#/api/request'; + +/** + * 添加拉流代理,如果成功会返回可播放的视频流地址 + * @param params + * @returns 人像信息列表 + */ +export function addStreamProxy(params?: any) { + return requestClient.post('sis/stream//realtime/add', { + params, + }); +} diff --git a/apps/web-antd/src/api/sis/stream/model.d.ts b/apps/web-antd/src/api/sis/stream/model.d.ts new file mode 100644 index 00000000..8993f651 --- /dev/null +++ b/apps/web-antd/src/api/sis/stream/model.d.ts @@ -0,0 +1,22 @@ +export interface AddStreamProxyResult { + key:string; + rtsp:string; + rtmp:string; + flv:string; + wsFlv:string; + mp4:string; + hls:string; +} + +export interface AddStreamProxyQuery { + videoIp:string; + videoPort:number; + factoryNo:string; + account:string; + pwd:string; + channelId:string; + startTime:string; + endTime:string; + stream:string; + +} diff --git a/apps/web-antd/src/views/sis/deviceManage/data.ts b/apps/web-antd/src/views/sis/deviceManage/data.ts index a4e1c13b..2e1928de 100644 --- a/apps/web-antd/src/views/sis/deviceManage/data.ts +++ b/apps/web-antd/src/views/sis/deviceManage/data.ts @@ -3,6 +3,10 @@ import type { VxeGridProps } from '#/adapter/vxe-table'; import { getPopupContainer } from '@vben/utils'; import { getDictOptions } from '#/utils/dict'; import { DictEnum } from '@vben/constants'; +import type { FactoryQuery } from '#/api/sis/factory/model'; +import { factoryList } from '#/api/sis/factory'; +import { deviceGroupList } from '#/api/sis/deviceGroup'; +import type { DeviceGroupQuery } from '#/api/sis/deviceGroup/model'; export const querySchema: FormSchemaGetter = () => [ { @@ -16,9 +20,13 @@ export const querySchema: FormSchemaGetter = () => [ label: '设备ip', }, { - component: 'Input', + component: 'Select', fieldName: 'deviceType', label: '设备类型', + componentProps: { + getPopupContainer, + options: getDictOptions(DictEnum.sis_ipc_device_type, true), + }, }, { fieldName: 'deviceStatus', @@ -40,12 +48,16 @@ export const columns: VxeGridProps['columns'] = [ field: 'deviceName', }, { - title: '厂商编号', - field: 'factoryNo', + title: '设备厂商', + field: 'factoryName', }, { title: '设备类型', - field: 'device_type', + field: 'deviceTypeName', + }, + { + title: '设备组', + field: 'groupName', }, { title: '设备ip', @@ -90,15 +102,53 @@ export const modalSchema: FormSchemaGetter = () => [ }, { label: '设备厂商', - fieldName: 'facrotyNo', - component: 'Input', + fieldName: 'factoryNo', + component: 'ApiSelect', rules: 'required', + componentProps: { + allowClear: true, + resultField: 'list', // 根据API返回结构调整 + labelField: 'factoryName', + valueField: 'factoryNo', + api: async () => { + const params: FactoryQuery = { + pageNum: 1, + pageSize: 500, + }; + const res = await factoryList(params); + return res.rows; + }, + }, }, { label: '设备类型', fieldName: 'deviceType', - component: 'Input', + component: 'Select', rules: 'required', + componentProps: { + getPopupContainer, + options: getDictOptions(DictEnum.sis_ipc_device_type, true), + }, + }, + { + label: '设备组', + fieldName: 'groupId', + component: 'ApiSelect', + rules: 'required', + componentProps: { + allowClear: true, + resultField: 'list', // 根据API返回结构调整 + labelField: 'name', + valueField: 'id', + api: async () => { + const params: DeviceGroupQuery = { + pageNum: 1, + pageSize: 500, + }; + const res = await deviceGroupList(params); + return res.rows; + }, + }, }, { label: '设备ip', diff --git a/apps/web-antd/src/views/sis/deviceManage/deviceManage-modal.vue b/apps/web-antd/src/views/sis/deviceManage/deviceManage-modal.vue index 762ae10d..526bcf29 100644 --- a/apps/web-antd/src/views/sis/deviceManage/deviceManage-modal.vue +++ b/apps/web-antd/src/views/sis/deviceManage/deviceManage-modal.vue @@ -6,10 +6,16 @@ import { $t } from '@vben/locales'; import { cloneDeep } from '@vben/utils'; import { useVbenForm } from '#/adapter/form'; -import { deviceManageAdd, deviceManageInfo, deviceManageUpdate } from '#/api/sis/deviceManage'; +import { + deviceManageAdd, + deviceManageInfo, + deviceManageUpdate, +} from '#/api/sis/deviceManage'; import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; import { modalSchema } from './data'; +import { getDictOptions } from '#/utils/dict'; +import { DictEnum } from '@vben/constants'; const emit = defineEmits<{ reload: [] }>(); @@ -27,7 +33,7 @@ const [BasicForm, formApi] = useVbenForm({ // 通用配置项 会影响到所有表单项 componentProps: { class: 'w-full', - } + }, }, schema: modalSchema(), showDefaultActions: false, @@ -53,7 +59,6 @@ const [BasicModal, modalApi] = useVbenModal({ return null; } modalApi.modalLoading(true); - const { id } = modalApi.getData() as { id?: number | string }; isUpdate.value = !!id; @@ -98,4 +103,3 @@ async function handleClosed() { - diff --git a/apps/web-antd/src/views/sis/elevatorInfo/data.ts b/apps/web-antd/src/views/sis/elevatorInfo/data.ts index 4c416af8..e3c6c2b7 100644 --- a/apps/web-antd/src/views/sis/elevatorInfo/data.ts +++ b/apps/web-antd/src/views/sis/elevatorInfo/data.ts @@ -1,7 +1,5 @@ import type { FormSchemaGetter } from '#/adapter/form'; import type { VxeGridProps } from '#/adapter/vxe-table'; -import type { DeviceManageQuery } from '#/api/sis/deviceManage/model'; -import { deviceManageList } from '#/api/sis/deviceManage'; export const querySchema: FormSchemaGetter = () => [ { @@ -205,6 +203,5 @@ export const modalSchema: FormSchemaGetter = () => [ fieldName: 'elevatorControlDeviceId', defaultValue: undefined, label: '梯控摄像头', - }, ]; diff --git a/apps/web-antd/src/views/property/factory/data.ts b/apps/web-antd/src/views/sis/factory/data.ts similarity index 65% rename from apps/web-antd/src/views/property/factory/data.ts rename to apps/web-antd/src/views/sis/factory/data.ts index b32215af..7ccf02ff 100644 --- a/apps/web-antd/src/views/property/factory/data.ts +++ b/apps/web-antd/src/views/sis/factory/data.ts @@ -1,7 +1,6 @@ import type { FormSchemaGetter } from '#/adapter/form'; import type { VxeGridProps } from '#/adapter/vxe-table'; - export const querySchema: FormSchemaGetter = () => [ { component: 'Input', @@ -11,17 +10,7 @@ export const querySchema: FormSchemaGetter = () => [ { component: 'Input', fieldName: 'factoryName', - label: '设备厂商名称', - }, - { - component: 'Input', - fieldName: 'dataState', - label: '数据状态:1有效,0无效', - }, - { - component: 'Input', - fieldName: 'searchValue', - label: '搜索值', + label: '厂商名称', }, ]; @@ -29,30 +18,18 @@ export const querySchema: FormSchemaGetter = () => [ // export const columns: () => VxeGridProps['columns'] = () => [ export const columns: VxeGridProps['columns'] = [ { type: 'checkbox', width: 60 }, - { - title: '', - field: 'id', - }, { title: '厂商编码', field: 'factoryNo', }, { - title: '设备厂商名称', + title: '厂商名称', field: 'factoryName', }, { title: '备注', field: 'remark', }, - { - title: '数据状态:1有效,0无效', - field: 'dataState', - }, - { - title: '搜索值', - field: 'searchValue', - }, { field: 'action', fixed: 'right', @@ -79,7 +56,7 @@ export const modalSchema: FormSchemaGetter = () => [ rules: 'required', }, { - label: '设备厂商名称', + label: '厂商名称', fieldName: 'factoryName', component: 'Input', rules: 'required', @@ -89,15 +66,4 @@ export const modalSchema: FormSchemaGetter = () => [ fieldName: 'remark', component: 'Input', }, - { - label: '数据状态:1有效,0无效', - fieldName: 'dataState', - component: 'Input', - rules: 'required', - }, - { - label: '搜索值', - fieldName: 'searchValue', - component: 'Input', - }, ]; diff --git a/apps/web-antd/src/views/property/factory/factory-modal.vue b/apps/web-antd/src/views/sis/factory/factory-modal.vue similarity index 96% rename from apps/web-antd/src/views/property/factory/factory-modal.vue rename to apps/web-antd/src/views/sis/factory/factory-modal.vue index b02cd221..5fc8e9dc 100644 --- a/apps/web-antd/src/views/property/factory/factory-modal.vue +++ b/apps/web-antd/src/views/sis/factory/factory-modal.vue @@ -6,7 +6,7 @@ import { $t } from '@vben/locales'; import { cloneDeep } from '@vben/utils'; import { useVbenForm } from '#/adapter/form'; -import { factoryAdd, factoryInfo, factoryUpdate } from '#/api/property/factory'; +import { factoryAdd, factoryInfo, factoryUpdate } from '#/api/sis/factory'; import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; import { modalSchema } from './data'; diff --git a/apps/web-antd/src/views/property/factory/index.vue b/apps/web-antd/src/views/sis/factory/index.vue similarity index 89% rename from apps/web-antd/src/views/property/factory/index.vue rename to apps/web-antd/src/views/sis/factory/index.vue index fe786028..31e0b201 100644 --- a/apps/web-antd/src/views/property/factory/index.vue +++ b/apps/web-antd/src/views/sis/factory/index.vue @@ -1,25 +1,16 @@ @@ -138,9 +134,10 @@ function handleDownloadExcel() { + type="primary" + v-access:code="['property:factory:remove']" + @click="handleMultiDelete" + > {{ $t('pages.common.delete') }} -import type { PropType } from 'vue'; import { onMounted, ref } from 'vue'; import { SyncOutlined } from '@ant-design/icons-vue'; import { InputSearch, Skeleton, Tree } from 'ant-design-vue'; @@ -11,21 +10,15 @@ defineOptions({ inheritAttrs: false }); withDefaults(defineProps<{ showSearch?: boolean }>(), { showSearch: true }); const emit = defineEmits<{ - /** - * 点击刷新按钮的事件 - */ - reload: []; + + checked: []; /** * 点击节点的事件 */ + reload: []; select: []; }>(); -const channelId = defineModel('channelId', { - required: true, - type: Array as PropType, -}); - const searchValue = defineModel('searchValue', { type: String, default: '', @@ -39,7 +32,6 @@ const showTreeSkeleton = ref(true); async function loadChannelTree() { showTreeSkeleton.value = true; searchValue.value = ''; - channelId.value = []; const ret = await treeList(); channelTree.value = ret; showTreeSkeleton.value = false; @@ -85,14 +77,14 @@ onMounted(loadChannelTree); - + diff --git a/apps/web-antd/vite.config.mts b/apps/web-antd/vite.config.mts index 27bdfd9e..dcbd4d1b 100644 --- a/apps/web-antd/vite.config.mts +++ b/apps/web-antd/vite.config.mts @@ -28,8 +28,8 @@ export default defineConfig(async () => { rewrite: (path) => path.replace(/^\/api/, ''), // mock代理目标地址 // target: 'http://192.168.43.169:8080', - target: 'https://by.missmoc.top/api/', - // target: 'http://192.168.0.108:8080', + // target: 'https://by.missmoc.top/api/', + target: 'http://192.168.0.108:8080', // target: 'http://192.168.0.106:8080', // target: 'http://47.109.37.87:3010', ws: true, diff --git a/packages/@core/base/shared/src/constants/dict-enum.ts b/packages/@core/base/shared/src/constants/dict-enum.ts index 08e1b2ac..457f45ec 100644 --- a/packages/@core/base/shared/src/constants/dict-enum.ts +++ b/packages/@core/base/shared/src/constants/dict-enum.ts @@ -21,6 +21,7 @@ export const DictEnum = { wy_fjzt: 'wy_fjzt', // 房间状态 wy_direction_towards: 'direction_towards', // 房间朝向 sis_device_status: 'sis_device_status', //设备在线状态 + sis_ipc_device_type: 'sis_ipc_device_type', //设备在线状态 wy_sf:'wy_sf',//是否可售 SIS_ACCESS_CONTROL_DEVICE_TYPE: 'sis_access_control_device_type', SIS_LIB_TYPE: 'sis_lib_type',