diff --git a/apps/web-antd/src/api/analytics/index.ts b/apps/web-antd/src/api/analytics/index.ts index f2f58cbe..74b29f2a 100644 --- a/apps/web-antd/src/api/analytics/index.ts +++ b/apps/web-antd/src/api/analytics/index.ts @@ -13,52 +13,63 @@ export function getIndexCount() { export function getStatisticsCurrDay() { return requestClient.get('/sis/alarmEvents/query/statistics/currDay'); } + // 所有预警信息分类统计 export function getStatistics() { return requestClient.get('/sis/alarmEvents/query/statistics'); } + // 工单 export function getworkOrder() { - return requestClient.get('/property/screen/typeWorkOrderHistogram'); + return requestClient.get( + '/property/cockpit/screen/typeWorkOrderHistogram', + ); } + // 会议室 export function getTodayMeetCount() { - return requestClient.get('/property/screen/todayMeetCount'); + return requestClient.get('/property/cockpit/screen/todayMeetCount'); } + // 水电 export function getHydropower() { return requestClient.get('/property/meterInfo/statusCount'); } + // 门禁 export function getAccessControl() { return requestClient.get('/sis/e8/door/online'); } + // 摄像头状态 export function getCamera() { return requestClient.get('/sis/deviceManage/online'); } + // 访客 export function getVisitorCount() { - return requestClient.get('/property/screen/todayVisitorCount'); + return requestClient.get('/property/cockpit/screen/todayVisitorCount'); } + //车流 export async function queryTwentyfourRunningDatasByPlNos() { let params = { - "orgId": "10012", - "plNos": [ - "PFN000000012", - "PFN000000025" - ] + orgId: '10012', + plNos: ['PFN000000012', 'PFN000000025'], }; - const response = await fetch('https://server.cqnctc.com:6081/web/thirdParty/queryTwentyfourRunningDatasByPlNos', { - method: 'POST', // 指定请求方法为POST - headers: { - 'Content-Type': 'application/json', // 设置内容类型为JSON + const response = await fetch( + 'https://server.cqnctc.com:6081/web/thirdParty/queryTwentyfourRunningDatasByPlNos', + { + method: 'POST', // 指定请求方法为POST + headers: { + 'Content-Type': 'application/json', // 设置内容类型为JSON + }, + body: JSON.stringify(params), // 将参数对象转换为JSON字符串并作为请求体发送 }, - body: JSON.stringify(params), // 将参数对象转换为JSON字符串并作为请求体发送 - }); + ); return response.json(); } + // /** // * 导出资产管理列表 // * @param params diff --git a/apps/web-antd/src/api/property/chargeManagement/model.d.ts b/apps/web-antd/src/api/property/chargeManagement/model.d.ts index 2f5a1565..edcb53e2 100644 --- a/apps/web-antd/src/api/property/chargeManagement/model.d.ts +++ b/apps/web-antd/src/api/property/chargeManagement/model.d.ts @@ -65,6 +65,18 @@ export interface OrderChargeVO { * 收费状态 */ chargeStatus: string | number; + /** + * 单位 + */ + residentUnitId: string; + /** + * 订单号 + */ + orderNo?: string | number; + /** + * 订单内容 + */ + rentalOrder?: any; } export interface OrderChargeForm extends BaseEntity { @@ -196,8 +208,8 @@ export interface OrderChargeQuery extends PageQuery { chargeStatus?: string | number; /** - * 日期范围参数 - */ + * 日期范围参数 + */ params?: any; } @@ -266,4 +278,8 @@ export interface orderChargeDetailForm extends BaseEntity { * 收费状态 */ chargeStatus?: string | number; + /** + * 租赁单位 + */ + residentUnitText?: string; } diff --git a/apps/web-antd/src/api/property/clean_order/index.ts b/apps/web-antd/src/api/property/clean_order/index.ts index d7cea91f..a57905d3 100644 --- a/apps/web-antd/src/api/property/clean_order/index.ts +++ b/apps/web-antd/src/api/property/clean_order/index.ts @@ -7,12 +7,15 @@ import { commonExport } from '#/api/helper'; import { requestClient } from '#/api/request'; /** -* 查询保洁订单列表 -* @param params -* @returns 保洁订单列表 -*/ + * 查询保洁订单列表 + * @param params + * @returns 保洁订单列表 + */ export function clean_orderList(params?: Clean_orderQuery) { - return requestClient.get>('/property/clean_order/list', { params }); + return requestClient.get>( + '/property/clean_order/list', + { params }, + ); } /** @@ -59,3 +62,14 @@ export function clean_orderUpdate(data: Clean_orderForm) { export function clean_orderRemove(id: ID | IDS) { return requestClient.deleteWithMsg(`/property/clean_order/${id}`); } + +/** + * 查询单位的房间列表 + * @param params + * @returns 保洁订单列表 + */ +export function getRoomsByresidentUnitId(residentUnitId?: string | number) { + return requestClient.get( + `/property/clean_order/residentUnitId/${residentUnitId}`, + ); +} diff --git a/apps/web-antd/src/api/property/costManagement/costItemSetting/model.d.ts b/apps/web-antd/src/api/property/costManagement/costItemSetting/model.d.ts index 732e49fb..ca472d56 100644 --- a/apps/web-antd/src/api/property/costManagement/costItemSetting/model.d.ts +++ b/apps/web-antd/src/api/property/costManagement/costItemSetting/model.d.ts @@ -70,6 +70,8 @@ export interface CostItemSettingVO { * 搜索值 */ searchValue: string; + chargeNo: string; + unit: string; } diff --git a/apps/web-antd/src/api/property/costManagement/houseCharge/index.ts b/apps/web-antd/src/api/property/costManagement/houseCharge/index.ts index cbf2d544..52efd66e 100644 --- a/apps/web-antd/src/api/property/costManagement/houseCharge/index.ts +++ b/apps/web-antd/src/api/property/costManagement/houseCharge/index.ts @@ -54,6 +54,14 @@ export function houseChargeRefund(data: HouseChargeForm) { export function houseChargeUpdate(data: HouseChargeForm) { return requestClient.putWithMsg('/property/houseCharge', data); } +/** + * 更正房屋收费 + * @param data + * @returns void + */ +export function houseChargeAddFee(data: HouseChargeForm) { + return requestClient.postWithMsg('/property/houseCharge/addFee', data); +} /** * 删除房屋收费 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 5d48ef7e..80fa49d3 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 @@ -43,7 +43,7 @@ export interface HouseChargeVO { */ remark: string; - chargeTime: any[]; + chargeTime: string; /** * 缴费周期 */ diff --git a/apps/web-antd/src/api/property/rentalOrder/index.ts b/apps/web-antd/src/api/property/rentalOrder/index.ts index 61829f0b..e8e302a1 100644 --- a/apps/web-antd/src/api/property/rentalOrder/index.ts +++ b/apps/web-antd/src/api/property/rentalOrder/index.ts @@ -7,14 +7,22 @@ import { commonExport } from '#/api/helper'; import { requestClient } from '#/api/request'; /** -* 查询绿植租赁-订单管理列表 -* @param params -* @returns 绿植租赁-订单管理列表 -*/ + * 查询绿植租赁-订单管理列表 + * @param params + * @returns 绿植租赁-订单管理列表 + */ export function rentalOrderList(params?: RentalOrderQuery) { - return requestClient.get>('/property/rentalOrder/list', { params }); + return requestClient.get>( + '/property/rentalOrder/list', + { params }, + ); +} +export function rentalNotSelectList(params?: RentalOrderQuery) { + return requestClient.get>( + '/property/rentalOrder/notSelectList', + { params }, + ); } - /** * 导出绿植租赁-订单管理列表 * @param params diff --git a/apps/web-antd/src/api/property/rentalOrder/model.d.ts b/apps/web-antd/src/api/property/rentalOrder/model.d.ts index 745d03d0..e38f7be1 100644 --- a/apps/web-antd/src/api/property/rentalOrder/model.d.ts +++ b/apps/web-antd/src/api/property/rentalOrder/model.d.ts @@ -86,6 +86,10 @@ export interface RentalOrderVO { */ signTime: string; + /** + * 单位名称 + */ + residentUnitText: string; } export interface RentalOrderForm extends BaseEntity { @@ -173,7 +177,6 @@ export interface RentalOrderForm extends BaseEntity { * 签署时间 */ signTime?: string; - } export interface RentalOrderQuery extends PageQuery { @@ -257,7 +260,7 @@ export interface RentalOrderQuery extends PageQuery { signTime?: string; /** - * 日期范围参数 - */ + * 日期范围参数 + */ params?: any; } diff --git a/apps/web-antd/src/api/property/resident/unit/model.d.ts b/apps/web-antd/src/api/property/resident/unit/model.d.ts index dfe50c8a..ead328ed 100644 --- a/apps/web-antd/src/api/property/resident/unit/model.d.ts +++ b/apps/web-antd/src/api/property/resident/unit/model.d.ts @@ -246,4 +246,9 @@ export interface Unit extends BaseEntity { */ area?: string; + /** + * 房间数量 + */ + roomNumber: number; + } diff --git a/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue b/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue index 353d4c96..df895ca9 100644 --- a/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue +++ b/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue @@ -2,9 +2,18 @@ import type { EchartsUIType } from '@vben/plugins/echarts'; import { EchartsUI, useEcharts } from '@vben/plugins/echarts'; -import { onMounted, ref, defineExpose } from 'vue'; +import { onMounted, ref, defineExpose, watch } from 'vue'; import { meterRecordTrend } from '#/api/property/energyManagement/meterRecord'; import dayjs from 'dayjs'; + +const props = defineProps({ + meterType: { + type: Number, + default: 1, + }, +}); + +const meterType = ref(1); const chartRef = ref(); const { renderEcharts } = useEcharts(chartRef); // 添加日期选择相关逻辑 @@ -16,12 +25,12 @@ const getDaysInMonth = (date: any) => { const daysInMonth = new Date(year, month, 0).getDate(); return Array.from({ length: daysInMonth }, (_, i) => i + 1); }; -const getMeterRecordTrend = async (selectedDate: any) => { +const getMeterRecordTrend = async (selectedDate: any, meterType: any) => { const res = await meterRecordTrend({ - day: dayjs().format('YYYY-MM-DD'), month: selectedDate.value, - year: dayjs().format('YYYY'), - meterType: 1, + meterType: meterType.value, + day: null, + year: null, meterId: null, floorId: null, }); @@ -109,7 +118,7 @@ const getMeterRecordTrend = async (selectedDate: any) => { }); }; onMounted(async () => { - getMeterRecordTrend(selectedDate); + getMeterRecordTrend(selectedDate, meterType); }); // 暴露方法给父组件调用 defineExpose({ diff --git a/apps/web-antd/src/views/dashboard/analytics/index.vue b/apps/web-antd/src/views/dashboard/analytics/index.vue index 4eb8c766..59d09876 100644 --- a/apps/web-antd/src/views/dashboard/analytics/index.vue +++ b/apps/web-antd/src/views/dashboard/analytics/index.vue @@ -12,7 +12,7 @@ import AnalyticsVisitsData from './analytics-visits-data.vue'; import AnalyticsVisitsSales from './analytics-visits-sales.vue'; import AnalyticsVisitsSource from './analytics-visits-source.vue'; import { ref, onMounted } from 'vue'; -import { DatePicker } from 'ant-design-vue'; +import { DatePicker, message } from 'ant-design-vue'; import { Radio } from 'ant-design-vue'; import { getIndexCount, @@ -52,7 +52,7 @@ const overviewItems = ref([ ]); //tab选择 -const timeUnit = ref(1); +const meterType = ref(1); // 月份选择 const selectedDate = ref(null); const paramDate = ref(null); @@ -65,12 +65,28 @@ const analyticsTrendsRef = ref | null>( ); const handleDateChange = (date: any) => { paramDate.value = date.format('YYYY-MM'); + console.log('meterType', meterType); // 调用子组件的方法 if ( analyticsTrendsRef.value && analyticsTrendsRef.value.getMeterRecordTrend ) { - analyticsTrendsRef.value.getMeterRecordTrend(paramDate); + analyticsTrendsRef.value.getMeterRecordTrend(paramDate, meterType); + } +}; + +const handleMeterTypeChange = (e: Event) => { + if (!selectedDate.value) { + message.warning('请选择月份'); + return; + } + paramDate.value = selectedDate.value.format('YYYY-MM'); + // 调用子组件的方法 + if ( + analyticsTrendsRef.value && + analyticsTrendsRef.value.getMeterRecordTrend + ) { + analyticsTrendsRef.value.getMeterRecordTrend(paramDate, meterType); } }; @@ -199,8 +215,13 @@ onMounted(() => { class="flex items-center justify-between p-5" style="width: 100%; height: 100px" > - + 电量 + 水量 { @change="handleDateChange" /> -
+
-
diff --git a/apps/web-antd/src/views/property/businessManagement/workOrders/work-orders-detail.vue b/apps/web-antd/src/views/property/businessManagement/workOrders/work-orders-detail.vue index 00c4f65b..8b182da1 100644 --- a/apps/web-antd/src/views/property/businessManagement/workOrders/work-orders-detail.vue +++ b/apps/web-antd/src/views/property/businessManagement/workOrders/work-orders-detail.vue @@ -27,7 +27,7 @@ const [BasicModal, modalApi] = useVbenModal({ }, }); -const orderDetail = shallowRef(null); +const orderDetail = ref(null); const handleRecords = ref([]) async function handleOpenChange(open: boolean) { diff --git a/apps/web-antd/src/views/property/clean/cleanOrders/clean-detail-modal.vue b/apps/web-antd/src/views/property/clean/cleanOrders/clean-detail-modal.vue index f4272eaf..45fb81d0 100644 --- a/apps/web-antd/src/views/property/clean/cleanOrders/clean-detail-modal.vue +++ b/apps/web-antd/src/views/property/clean/cleanOrders/clean-detail-modal.vue @@ -5,26 +5,28 @@ import { $t } from '@vben/locales'; import { cloneDeep } from '@vben/utils'; import { useVbenForm } from '#/adapter/form'; import { cleanList } from '#/api/property/clean'; +import { getRoomsByresidentUnitId } from '#/api/property/clean_order'; import { defaultFormValueGetter, useBeforeCloseDiff } from '#/utils/popup'; -const emit = defineEmits<{ reload: [data: any], editReload: [data: any] }>(); +const emit = defineEmits<{ reload: [data: any]; editReload: [data: any] }>(); const isUpdate = ref(false); const isAdd = ref(false); const isView = ref(false); +const currentUnitId = ref(''); const title = computed(() => { - if(isAdd.value){ + if (isAdd.value) { return $t('pages.common.add'); - }else if(isView.value){ + } else if (isView.value) { return '查看'; - }else{ + } else { return $t('pages.common.edit'); } }); // 缓存清洁服务数据 let cleanListData: any[] = []; -const detailIndex = ref();//传index对应详情的某条数据,对该条数据进行编辑修改 +const detailIndex = ref(); //传index对应详情的某条数据,对该条数据进行编辑修改 const detailSchema = [ { label: '劳务名称', @@ -33,7 +35,7 @@ const detailSchema = [ componentProps: { disabled: isView, api: async () => { - const res = await cleanList({stater:1}); + const res = await cleanList({ stater: 1 }); cleanListData = res.rows || []; return res; }, @@ -42,7 +44,7 @@ const detailSchema = [ valueField: 'id', onChange: async (value: string) => { // 找到选中的服务数据 - const selectedService = cleanListData.find(item => item.id === value); + const selectedService = cleanListData.find((item) => item.id === value); if (selectedService) { // 自动填充其他字段 await formApi.setValues({ @@ -60,22 +62,49 @@ const detailSchema = [ rules: 'required', }, { - label: '保洁面积', - fieldName: 'area', - component: 'InputNumber', + label: '房间', + fieldName: 'roomId', + component: 'ApiSelect', rules: 'required', componentProps: { disabled: isView, - onChange: async (value: number) => { + api: async () => { + const res = await getRoomsByresidentUnitId(currentUnitId.value); + return res; + }, + resultField: 'rows', + labelField: 'roomNumber', + valueField: 'id', + mode: 'multiple', + onChange: async (value: any, option: any) => { + let totalArea: any = 0; + totalArea = option.reduce((sum: any, item: any) => { + // 假设每个选项有一个area字段,根据实际情况调整 + return sum + (parseFloat(item.area) || 0); + }, 0); + await formApi.setValues({ + area: totalArea, // 房间总面积 + // 其他需要自动填充的字段 + }); const formValues = await formApi.getValues(); - if (formValues.peices && value) { + if (formValues.peices && totalArea) { await formApi.setValues({ - sumPeices: Number((formValues.peices * value).toFixed(2)), + sumPeices: Number((formValues.peices * totalArea).toFixed(2)), }); } }, }, }, + { + label: '房间面积(㎡)', + fieldName: 'area', + component: 'Input', + componentProps: { + disabled: true, + }, + rules: 'required', + }, + { label: '计量单位', fieldName: 'measure', @@ -180,18 +209,25 @@ const [BasicModal, modalApi] = useVbenModal({ } modalApi.modalLoading(true); const data = modalApi.getData(); + currentUnitId.value = modalApi.getData().unitId; detailIndex.value = modalApi.getData().index; - if(!data || Object.keys(data).length === 0){ - //modalApi.getData()为空时表示添加 + if (data.update) { + //有index表示编辑 + isUpdate.value = true; + data.roomId = data.roomId + .split(',') + .filter((id: string) => id.trim() !== ''); + } else if (data.readonly) { + isView.value = true; + data.roomId = data.roomId + .split(',') + .filter((id: string) => id.trim() !== ''); + // data.area = data.sumPeices / data.peices; + } else { isAdd.value = true; - }else if(data.readonly){ - isView.value = true; - }else{ - //表示编辑 - isUpdate.value = true; } // TODO: 获取详情数据 - await formApi.setValues(modalApi.getData()); + await formApi.setValues(data); await markInitialized(); modalApi.modalLoading(false); }, @@ -206,18 +242,19 @@ async function handleConfirm() { } let data = cloneDeep(await formApi.getValues()); // 获取选中的服务名称 - const selectedService = cleanListData.find(item => item.id === data.name); + const selectedService = cleanListData.find((item) => item.id === data.name); if (selectedService) { data.name = selectedService.name; - data.id = selectedService.id + data.id = selectedService.id; } + data.roomId = data.roomId.join(','); if (isUpdate.value) { data.index = detailIndex.value; emit('editReload', data); - }else if(isAdd.value){ + } else if (isAdd.value) { emit('reload', data); } - handleClosed() + handleClosed(); await markInitialized(); modalApi.close(); } catch (error) { @@ -238,8 +275,7 @@ async function handleClosed() { diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningNotAssigned/warning-detail.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningNotAssigned/warning-detail.vue new file mode 100644 index 00000000..35f172f7 --- /dev/null +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningNotAssigned/warning-detail.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningNotAssigned/warning-modal.vue b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningNotAssigned/warning-modal.vue new file mode 100644 index 00000000..fac64195 --- /dev/null +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningNotAssigned/warning-modal.vue @@ -0,0 +1,159 @@ + + + + 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 3af36f01..18575e33 100644 --- a/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningProcessing/index.vue +++ b/apps/web-antd/src/views/videoSystem/videoWarning/videoWarningProcessing/index.vue @@ -1,7 +1,6 @@