新增数据,开始安全巡检模块

This commit is contained in:
Zy
2026-04-17 19:39:21 +08:00
parent 4184f1c55d
commit 9a95e2b7e3
74 changed files with 1942 additions and 403 deletions

View File

@@ -1,6 +1,6 @@
<template> <template>
<el-config-provider :locale="appStore.locale" :size="appStore.size"> <el-config-provider :locale="appStore.locale" :size="appStore.size">
<router-view /> <router-view ref="wrapRef" />
</el-config-provider> </el-config-provider>
</template> </template>
@@ -17,4 +17,33 @@ onMounted(() => {
handleThemeStyle(useSettingsStore().theme); handleThemeStyle(useSettingsStore().theme);
}); });
}); });
const scale = ref(1);
// 设计稿宽度(你是多少就写多少,一般 1920
const DESIGN_WIDTH = 1920;
// 计算缩放
const setScale = () => {
const clientWidth = document.documentElement.clientWidth;
let ratio = clientWidth / DESIGN_WIDTH;
// 最小缩到 0.7(防止太小看不清)
if (ratio < 0.7) ratio = 0.7;
// 最大不超过 1
if (ratio > 1) ratio = 1;
scale.value = ratio;
};
// 监听窗口变化
const resizeListener = () => {
setScale();
};
onMounted(() => {
setScale();
window.addEventListener('resize', resizeListener);
});
onUnmounted(() => {
window.removeEventListener('resize', resizeListener);
});
</script> </script>

View File

@@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { PlanVO, PlanForm, PlanQuery } from '@/api/system/InspectionPlan/type';
/**
* 查询巡检计划列表
* @param query
* @returns {*}
*/
export const listPlan = (query?: PlanQuery): AxiosPromise<PlanVO[]> => {
return request({
url: '/inspection/plan/list',
method: 'get',
params: query
});
};
/**
* 查询巡检计划详细
* @param id
*/
export const getPlan = (id: string | number): AxiosPromise<PlanVO> => {
return request({
url: '/inspection/plan/' + id,
method: 'get'
});
};
/**
* 新增巡检计划
* @param data
*/
export const addPlan = (data: PlanForm) => {
return request({
url: '/inspection/plan',
method: 'post',
data: data
});
};
/**
* 修改巡检计划
* @param data
*/
export const updatePlan = (data: PlanForm) => {
return request({
url: '/inspection/plan',
method: 'put',
data: data
});
};
/**
* 删除巡检计划
* @param id
*/
export const delPlan = (id: string | number | Array<string | number>) => {
return request({
url: '/inspection/plan/' + id,
method: 'delete'
});
};

View File

@@ -0,0 +1,165 @@
export interface PlanVO {
/**
* 主键ID
*/
id: string | number;
/**
* 巡检计划名称
*/
planName: string;
/**
* 巡检人员ID多个用逗号分隔
*/
inspectorIds: string | number;
/**
* 执行周期,如:开始日期-结束日期
*/
executeCycle: string;
/**
* 任务时间
*/
taskTime: string;
/**
* 提醒时间
*/
remindTime: string;
/**
* 巡检设置0-必须拍照1-可以跳检
*/
inspectSetting: number;
/**
* 计划路线,多个用逗号分隔
*/
routeIds: string | number;
/**
* 状态0-关闭1-开启
*/
status: number;
/**
* 备注
*/
remark: string;
/**
* 执行周期具体日期
*/
executeDay: string;
}
export interface PlanForm extends BaseEntity {
/**
* 主键ID
*/
id?: string | number;
/**
* 巡检计划名称
*/
planName?: string;
/**
* 巡检人员ID多个用逗号分隔
*/
inspectorIds?: string | number;
/**
* 执行周期,如:开始日期-结束日期
*/
executeCycle?: string;
/**
* 任务时间
*/
taskTime?: string;
/**
* 提醒时间
*/
remindTime?: string;
/**
* 巡检设置0-必须拍照1-可以跳检
*/
inspectSetting?: number;
/**
* 计划路线,多个用逗号分隔
*/
routeIds?: string | number;
/**
* 状态0-关闭1-开启
*/
status?: number;
/**
* 备注
*/
remark?: string;
/**
* 执行周期具体日期
*/
executeDay?: string;
}
export interface PlanQuery extends PageQuery {
/**
* 巡检计划名称
*/
planName?: string;
/**
* 巡检人员ID多个用逗号分隔
*/
inspectorIds?: string | number;
/**
* 执行周期,如:开始日期-结束日期
*/
executeCycle?: string;
/**
* 任务时间
*/
taskTime?: string;
/**
* 提醒时间
*/
remindTime?: string;
/**
* 巡检设置0-必须拍照1-可以跳检
*/
inspectSetting?: number;
/**
* 计划路线,多个用逗号分隔
*/
routeIds?: string | number;
/**
* 状态0-关闭1-开启
*/
status?: number;
/**
* 执行周期具体日期
*/
executeDay?: string;
/**
* 日期范围参数
*/
params?: any;
}

View File

@@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { RecordVO, RecordForm, RecordQuery } from '@/api/system/InspectionRecord/type';
/**
* 查询巡检记录主列表
* @param query
* @returns {*}
*/
export const listRecord = (query?: RecordQuery): AxiosPromise<RecordVO[]> => {
return request({
url: '/inspection/record/list',
method: 'get',
params: query
});
};
/**
* 查询巡检记录主详细
* @param id
*/
export const getRecord = (id: string | number): AxiosPromise<RecordVO> => {
return request({
url: '/inspection/record/' + id,
method: 'get'
});
};
/**
* 新增巡检记录主
* @param data
*/
export const addRecord = (data: RecordForm) => {
return request({
url: '/inspection/record',
method: 'post',
data: data
});
};
/**
* 修改巡检记录主
* @param data
*/
export const updateRecord = (data: RecordForm) => {
return request({
url: '/inspection/record',
method: 'put',
data: data
});
};
/**
* 删除巡检记录主
* @param id
*/
export const delRecord = (id: string | number | Array<string | number>) => {
return request({
url: '/inspection/record/' + id,
method: 'delete'
});
};

View File

@@ -0,0 +1,109 @@
export interface RecordVO {
actualEndTime?: null;
actualStartTime?: null;
createByName?: null;
createTime?: string;
details?: null;
id?: string;
inspectorId?: number;
inspectorName?: string;
planId?: string;
planName?: string;
remark?: null;
routeId?: string;
routeName?: string;
status?: number;
statusLabel?: null;
taskName?: string;
taskTime?: string;
updateTime?: string;
}
export interface RecordForm extends BaseEntity {
/**
* 主键ID
*/
id?: string | number;
/**
* 关联巡检任务ID
*/
taskId?: string | number;
/**
* 关联巡检计划ID
*/
planId?: string | number;
/**
* 巡检人员ID
*/
inspectorId?: string | number;
/**
* 巡检路线ID
*/
routeId?: string | number;
/**
* 任务开始时间
*/
startTime?: string;
/**
* 任务结束时间
*/
endTime?: string;
/**
* 执行状态字典inspection_exec_status 0-按时完成 1-超时完成 2-未完成)
*/
execStatus?: number;
/**
* 备注
*/
remark?: string;
}
export interface RecordQuery extends PageQuery {
/**
* 关联巡检任务ID
*/
taskId?: string | number;
/**
* 关联巡检计划ID
*/
planId?: string | number;
/**
* 巡检人员ID
*/
inspectorId?: string | number;
/**
* 巡检路线ID
*/
routeId?: string | number;
/**
* 任务开始时间
*/
startTime?: string;
/**
* 任务结束时间
*/
endTime?: string;
/**
* 执行状态字典inspection_exec_status 0-按时完成 1-超时完成 2-未完成)
*/
execStatus?: number;
/**
* 日期范围参数
*/
params?: any;
}

View File

@@ -8,7 +8,7 @@ export interface communitylist_rows_type {
remark: string; remark: string;
parkingSpaceCount: number; parkingSpaceCount: number;
villageImageUrl: string; villageImageUrl: string;
city: string | string[]; city: string;
status: '0' | '1'; status: '0' | '1';
manageName: string; manageName: string;
managePhone: string; managePhone: string;

View File

@@ -1,6 +1,6 @@
import request from '@/utils/request'; import request from '@/utils/request';
import { AxiosPromise } from 'axios'; import { AxiosPromise } from 'axios';
import { HouseRentalVO, HouseRentalForm, HouseRentalQuery } from '@/api/system/type'; import { HouseRentalVO, HouseRentalForm, HouseRentalQuery } from '@/api/system/houseRental/type';
/** /**
* 查询房屋租赁管理列表 * 查询房屋租赁管理列表

View File

@@ -17,7 +17,7 @@ export interface HouseRentalVO {
/** /**
* 0 整租 1 合租 * 0 整租 1 合租
*/ */
rentalType: number; rentalType: string;
/** /**
* 房屋朝向 * 房屋朝向
@@ -76,11 +76,18 @@ export interface HouseRentalVO {
/** /**
* 房屋用途 * 房屋用途
*/ */
houseUse?: number; houseUse: string;
/** /**
* 租赁状态 * 租赁状态
*/ */
rentalStatus?: number; rentalStatus: number;
house: string;
name: string;
pubBy: string;
pubTime: string;
houseImageUrls: string[];
facilitieslist: string[];
} }
export interface HouseRentalForm extends BaseEntity { export interface HouseRentalForm extends BaseEntity {

View File

@@ -155,15 +155,15 @@ export interface ResidentQuery extends PageQuery {
* 住户类型 * 住户类型
* 0业主 1租户 * 0业主 1租户
*/ */
type: string; type?: string;
/** /**
* 住户状态 * 住户状态
* 0审核中 1 已认证 * 0审核中 1 已认证
*/ */
status: string; status?: string;
houseId: number; houseId?: number;
villageId: number; villageId?: number;
buildingId: number; buildingId?: number;
unitNo: number; unitNo?: number;
} }

View File

@@ -1 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="119.07px" viewBox="0 0 1720 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M571.282719 126.054501H146.135735a24.962668 24.962668 0 1 0 0 49.925337h425.136052a24.962668 24.962668 0 0 0 0-49.925337z m0 0M763.255314 174.842935h-56.386006v-4.766246l0.229567-76.358327A93.553981 93.553981 0 0 0 613.2716 0.000404L94.188023 1.09358A91.170858 91.170858 0 0 0 51.379261 12.145587C21.535562 28.258998 0.098386 60.24532 0 95.314399l0.229567 180.177228a93.510254 93.510254 0 0 0 93.60864 93.72889l518.974259-1.093176a94.723679 94.723679 0 0 0 94.286409-94.286409l-0.677769-41.070613v-7.947388h31.089919c3.181141 0.229567 20.081639 2.492441 22.125877 26.323672 0 0.448202 0.109318 0.907336 0.109318 1.24622v119.812063c-0.229567 8.964041-3.399777 42.775967-38.68749 49.192909a53.314182 53.314182 0 0 1-6.559055 0.677769H381.791633s-59.33758-0.448202-79.80183 49.466203c0 0-6.690236 12.484067-7.488254 34.609945v25.645903h-66.213656a36.654183 36.654183 0 0 0-36.533933 36.533934v260.394465a36.654183 36.654183 0 0 0 36.533933 36.533934h175.290733a36.654183 36.654183 0 0 0 36.533934-36.533934v-260.17583a36.654183 36.654183 0 0 0-36.533934-36.533934h-63.305808v-24.618318s-0.120249-16.452295 9.838582-26.892123c4.995813-5.214448 11.806298-8.39559 22.235195-8.286273h355.282121c9.980695-0.448202 17.359631-1.36647 17.359631-1.366469 14.746941-1.694422 30.062333-6.919803 41.30018-16.397637 10.778713-9.073359 15.654277-20.65009 18.0374-27.12169 4.372703-11.795366 5.465879-31.997254 5.465879-31.997255l0.109317-161.112243c0.229567-58.430244-46.634878-59.348512-46.634877-59.348512z m-114.368048 128.99474a38.381401 38.381401 0 0 1-27.329394 11.456481l-536.563457 1.246221A37.769222 37.769222 0 0 1 47.214261 278.760223l-0.338885-186.52858c0-12.822952 8.843792-26.782806 22.235195-33.888448a34.435036 34.435036 0 0 1 16.342978-4.372703L622.017006 52.647749a37.758291 37.758291 0 0 1 37.900404 38.009721l-0.229567 78.708655-0.338885 64.672277 0.798018 43.792621c0.109318 9.084291-3.85891 18.583988-11.237846 25.984788zM372.149823 582.291403a18.988463 18.988463 0 0 1 18.726101 19.174303v194.694603a18.988463 18.988463 0 0 1-18.726101 19.174302H259.48713a18.988463 18.988463 0 0 1-18.726101-19.174302V601.465706a18.988463 18.988463 0 0 1 18.726101-19.174303z m0 0" /></svg> <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1776396534053" class="icon" viewBox="0 0 1720 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1550" xmlns:xlink="http://www.w3.org/1999/xlink" width="335.9375" height="200"><path d="M1159.39775971 64.93377365H491.45358333a39.21859817 39.21859817 0 1 0 0 78.43719788h667.92700125a39.21859817 39.21859817 0 0 0 0-78.43719788z m0 0" p-id="1551"></path><path d="M1461.0039846 141.58479455h-88.58749034v-7.48820143l0.3606704-119.96580418A146.98172431 146.98172431 0 0 0 1225.3660709-133.10855799L409.83905232-131.39108012A143.23762356 143.23762356 0 0 0 342.58263429-114.0273824C295.69549713-88.71176346 262.01576423-38.45837274 261.86119096 16.63830668l0.36067041 283.0746417a146.91302525 146.91302525 0 0 0 147.06759851 147.25652209l815.35527018-1.71747788a148.81942513 148.81942513 0 0 0 148.1324346-148.13243462l-1.06483609-64.52562951v-12.48606181h48.84506095c4.99785884 0.36067041 31.55006227 3.91584915 34.76174418 41.3568579 0 0.70416565 0.17174839 1.42550652 0.17174838 1.95792379v188.2355344c-0.36067041 14.0833152-5.34135566 67.20489411-60.78152879 77.28648757a83.76137838 83.76137838 0 0 1-10.30486571 1.06483612H861.69020884s-93.22467875-0.70416565-125.37585735 77.71585703c0 0-10.5109629 19.61359286-11.764721 54.37533858v40.29202183h-104.02761302a57.58702048 57.58702048 0 0 0-57.39809691 57.3980985v409.10314079a57.58702048 57.58702048 0 0 0 57.39809691 57.3980985h275.39751827a57.58702048 57.58702048 0 0 0 57.39809847-57.3980985v-408.75964554a57.58702048 57.58702048 0 0 0-57.39809847-57.39809849h-99.45912207v-38.67759328s-0.18892201-25.84803621 15.4572978-42.24994562c7.84887187-8.19236714 18.54875678-13.19022753 34.93349261-13.01848068h558.18018856c15.68057014-0.70416565 27.27354272-2.14684737 27.27354273-2.14684578 23.16877157-2.66208948 47.23063085-10.8716333 64.88629995-25.76216357 16.93432825-14.25506361 24.5942781-32.44314999 28.33837878-42.61061602 6.86990997-18.53158158 8.58738785-50.27056591 8.58738784-50.27056748l0.17174685-253.12183434c0.36067041-91.79917222-73.26759065-93.24185391-73.26758904-93.2418539z m-179.6824969 202.66234648a60.30063541 60.30063541 0 0 1-42.93693767 17.99916277l-842.98948334 1.95792535A59.33884708 59.33884708 0 0 1 336.03904442 304.84820689l-0.53241884-293.05318733c0-20.14601169 13.89439319-42.07819876 34.93349258-53.24180187a54.10054082 54.10054082 0 0 1 25.67628936-6.86990998L1239.10589084-50.39484059a59.32167354 59.32167354 0 0 1 59.54494582 59.71669266l-0.36067039 123.65838105-0.53241884 101.60596786 1.2537581 68.8021491c0.17174839 14.27223878-6.06269492 29.19711776-17.6556675 40.82444064zM846.54205755 781.72300942a29.83258437 29.83258437 0 0 1 29.42039007 30.12455575v305.88274444a29.83258437 29.83258437 0 0 1-29.42039007 30.1245542H669.53882684a29.83258437 29.83258437 0 0 1-29.42039007-30.1245542V811.84756521a29.83258437 29.83258437 0 0 1 29.42039007-30.12455579z m0 0" p-id="1552"></path></svg>

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -7,9 +7,6 @@ import { ref, onMounted, onBeforeUnmount, watch, nextTick } from 'vue';
import * as echarts from 'echarts'; import * as echarts from 'echarts';
import type { EChartsOption, ECharts } from 'echarts'; import type { EChartsOption, ECharts } from 'echarts';
// ==============================================
// ✅ 【核心修复】正确的 Vue3 + TS Props 写法
// ==============================================
interface Props { interface Props {
width?: string; width?: string;
height?: string; height?: string;
@@ -36,6 +33,7 @@ const emit = defineEmits<{
const chartRef = ref<HTMLDivElement>(); const chartRef = ref<HTMLDivElement>();
let chartInstance: ECharts | null = null; let chartInstance: ECharts | null = null;
let resizeObserver: ResizeObserver | null = null;
const initChart = () => { const initChart = () => {
if (!chartRef.value) return; if (!chartRef.value) return;
@@ -66,8 +64,10 @@ const updateChart = () => {
} }
}; };
// ✅ 核心修复:支持 scale 缩放后重绘
const resizeChart = () => { const resizeChart = () => {
chartInstance?.resize(); if (!chartInstance) return;
chartInstance.resize();
}; };
const getInstance = () => chartInstance; const getInstance = () => chartInstance;
@@ -88,17 +88,19 @@ onMounted(() => {
nextTick(() => initChart()); nextTick(() => initChart());
if (props.autoResize && chartRef.value) { if (props.autoResize && chartRef.value) {
const resizeObserver = new ResizeObserver(resizeChart); resizeObserver = new ResizeObserver(resizeChart);
resizeObserver.observe(chartRef.value); resizeObserver.observe(chartRef.value);
onBeforeUnmount(() => {
resizeObserver.disconnect();
});
} }
}); });
// ✅ 关键:监听 window.resizescale 缩放会触发 window.resize
onMounted(() => {
window.addEventListener('resize', resizeChart);
});
onBeforeUnmount(() => { onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart); window.removeEventListener('resize', resizeChart);
resizeObserver?.disconnect();
chartInstance?.dispose(); chartInstance?.dispose();
chartInstance = null; chartInstance = null;
}); });
@@ -114,5 +116,7 @@ defineExpose({
<style lang="scss" scoped> <style lang="scss" scoped>
.echarts-container { .echarts-container {
display: block; display: block;
width: 100%;
height: 100%;
} }
</style> </style>

View File

@@ -78,10 +78,17 @@ import { ResidentVO } from '@/api/system/resident/type';
import { getHousePathById } from '@/utils/house'; import { getHousePathById } from '@/utils/house';
import { ref, watch, nextTick, getCurrentInstance, ComponentInternalInstance, toRefs } from 'vue'; import { ref, watch, nextTick, getCurrentInstance, ComponentInternalInstance, toRefs } from 'vue';
import { useHouseStore } from '@/store/modules/house'; import { useHouseStore } from '@/store/modules/house';
import { storeToRefs } from 'pinia';
const houseStore = useHouseStore(); const houseStore = useHouseStore();
const { treedata } = storeToRefs(houseStore);
const treedata = ref([]);
function init() {
houseStore.getCurrentVilageTreeHouse().then((res) => {
console.log(res);
treedata.value = res;
});
}
init();
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_resident_type } = toRefs<any>(proxy?.useDict('com_resident_type')); const { com_resident_type } = toRefs<any>(proxy?.useDict('com_resident_type'));

View File

@@ -1,16 +1,60 @@
<template> <template>
<div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }"> <!-- 👇 加这一层全局缩放容器 -->
<side-bar class="sidebar-container" /> <div class="global-scale-wrapper">
<div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container"> <div class="scale-content" :style="{ transform: `scale(${scale})` }">
<div> <div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }">
<navbar ref="navbarRef" @set-layout="setLayout" /> <side-bar class="sidebar-container" />
<div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">
<div>
<navbar ref="navbarRef" @set-layout="setLayout" />
</div>
<app-main />
<settings ref="settingRef" />
</div>
</div> </div>
<app-main />
<settings ref="settingRef" />
</div> </div>
</div> </div>
</template> </template>
<script lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';
// 缩放比例
const scale = ref(1);
// 你的设计稿宽度若伊默认1920不用改
const DESIGN_WIDTH = 1920;
// 计算缩放
const calcScale = () => {
const width = document.documentElement.clientWidth;
let ratio = width / DESIGN_WIDTH;
// 最小缩到0.7(防止太小看不清)
if (ratio < 0.7) ratio = 0.7;
// 最大不超过1大屏不拉伸
if (ratio > 1) ratio = 1;
scale.value = ratio;
console.log(scale.value);
};
// 监听窗口变化
let timer = null;
const resize = () => {
console.log(scale.value);
clearTimeout(timer);
timer = setTimeout(calcScale, 100);
};
onMounted(() => {
calcScale();
window.addEventListener('resize', resize);
});
onUnmounted(() => {
window.removeEventListener('resize', resize);
clearTimeout(timer);
});
</script>
<script setup lang="ts"> <script setup lang="ts">
import SideBar from './components/Sidebar/index.vue'; import SideBar from './components/Sidebar/index.vue';
import { AppMain, Navbar, Settings, TagsView } from './components'; import { AppMain, Navbar, Settings, TagsView } from './components';
@@ -81,6 +125,25 @@ const setLayout = () => {
@use '@/assets/styles/mixin.scss'; @use '@/assets/styles/mixin.scss';
@use '@/assets/styles/variables.module.scss' as *; @use '@/assets/styles/variables.module.scss' as *;
// 全局缩放容器
.global-scale-wrapper {
width: 100vw;
height: 100vh;
overflow: hidden;
position: relative;
}
// // 缩放内容区
// .scale-content {
// width: 1920px;
// height: 100vh;
// position: absolute;
// left: 50%;
// top: 0;
// transform-origin: center center;
// margin-left: -960px; /* 1920/2 居中 */
// }
.app-wrapper { .app-wrapper {
@include mixin.clearfix; @include mixin.clearfix;
position: relative; position: relative;

View File

@@ -61,6 +61,7 @@ export const useHouseStore = defineStore(
const getviliageinfo = async (id) => { const getviliageinfo = async (id) => {
const res = await getVillageByIdAPI(id); const res = await getVillageByIdAPI(id);
currentVilageInfo.value = res.data; currentVilageInfo.value = res.data;
return res.data;
}; };
// 更新小区信息 // 更新小区信息
@@ -215,10 +216,6 @@ export const useHouseStore = defineStore(
// 房屋 树状结构类型 // 房屋 树状结构类型
const getCurrentVilageTreeHouse = async () => { const getCurrentVilageTreeHouse = async () => {
if (!currentVilageInfo.value?.villageId) {
treedata.value = [];
return treedata.value;
}
try { try {
treedata.value = []; treedata.value = [];
const res = await getVillageTree(currentVilageInfo.value.villageId); const res = await getVillageTree(currentVilageInfo.value.villageId);

View File

@@ -35,6 +35,15 @@ const service = axios.create({
} }
}); });
// 不需要小区id 或者 加上小区id报错的接口地址
const whiteVillageId = ['/decoration/list', '/parking/list'];
function handleWhiteVillageid(url) {
const spliturl = url.split('?')[0];
if (whiteVillageId.includes(spliturl)) {
return false;
}
return true;
}
// 请求拦截器 // 请求拦截器
service.interceptors.request.use( service.interceptors.request.use(
(config: InternalAxiosRequestConfig) => { (config: InternalAxiosRequestConfig) => {
@@ -51,17 +60,41 @@ service.interceptors.request.use(
config.headers['Authorization'] = 'Bearer ' + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改 config.headers['Authorization'] = 'Bearer ' + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
} }
// get请求映射params参数 // get请求映射params参数
const villageid = localStorage.getItem('villageid');
if (config.method === 'get' && config.params) { if (config.method === 'get' && config.params) {
let url = config.url + '?' + tansParams(config.params); let url = '';
if (villageid != 'null' && !Number.isNaN(Number(villageid)) && handleWhiteVillageid(config.url)) {
url =
config.url +
'?' +
tansParams({
...config.params,
villageId: Number(villageid)
});
} else {
url = config.url + '?' + tansParams(config.params);
}
url = url.slice(0, -1); url = url.slice(0, -1);
config.params = {}; config.params = {};
config.url = url; config.url = url;
} }
if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
let obj = null;
if (villageid != 'null' && !Number.isNaN(Number(villageid)) && handleWhiteVillageid(config.url)) {
obj = {
...config.data,
villageId: Number(villageid)
};
} else {
obj = config.data;
}
if (!config.data) config.data = {};
Object.assign(config.data, obj);
const requestObj = { const requestObj = {
url: config.url, url: config.url,
data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, data: typeof obj === 'object' ? JSON.stringify(obj) : obj,
time: new Date().getTime() time: new Date().getTime()
}; };
const sessionObj = cache.session.getJSON('sessionObj'); const sessionObj = cache.session.getJSON('sessionObj');
@@ -128,6 +161,7 @@ service.interceptors.response.use(
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data; return res.data;
} }
if (code === 401) { if (code === 401) {
// prettier-ignore // prettier-ignore
if (!isRelogin.show) { if (!isRelogin.show) {
@@ -151,12 +185,15 @@ service.interceptors.response.use(
}); });
} }
return Promise.reject('无效的会话,或者会话已过期,请重新登录。'); return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
// 500
} else if (code === HttpStatus.SERVER_ERROR) { } else if (code === HttpStatus.SERVER_ERROR) {
// 500
console.log(res);
console.log(res.config.url.split('?')[0]);
ElMessage({ message: msg, type: 'error' }); ElMessage({ message: msg, type: 'error' });
return Promise.reject(res.data); return Promise.reject(res.data);
// 601
} else if (code === HttpStatus.WARN) { } else if (code === HttpStatus.WARN) {
// 601
ElMessage({ message: msg, type: 'warning' }); ElMessage({ message: msg, type: 'warning' });
return Promise.reject(new Error(msg)); return Promise.reject(new Error(msg));
} else if (code !== HttpStatus.SUCCESS) { } else if (code !== HttpStatus.SUCCESS) {

View File

@@ -64,3 +64,54 @@ export function formatTimeDiff(startTime: string | number | Date, endTime: strin
return res.join(''); return res.join('');
} }
/**
* 生成指定日期所在周的日期数组(周一到周日)
* @param date 基准日期,默认今天
* @param format 返回格式
* @returns 一周日期数组
*/
export function generateWeekDays(date: Date | string | number = new Date(), format: 'name' | 'date' | 'full' = 'name'): string[] {
const weekNames = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
const baseDate = new Date(date);
// 计算本周一的日期getDay() 0=周日1=周一)
const day = baseDate.getDay();
const monday = new Date(baseDate);
monday.setDate(baseDate.getDate() - (day === 0 ? 6 : day - 1));
// 生成周一到周日7天
const week = [];
for (let i = 0; i < 7; i++) {
const current = new Date(monday);
current.setDate(monday.getDate() + i);
if (format === 'name') {
week.push(weekNames[i]);
} else if (format === 'date') {
// YYYY-MM-DD 格式
const year = current.getFullYear();
const month = String(current.getMonth() + 1).padStart(2, '0');
const day = String(current.getDate()).padStart(2, '0');
week.push(`${year}-${month}-${day}`);
} else {
// 完整格式:周一 (2026-04-20)
const year = current.getFullYear();
const month = String(current.getMonth() + 1).padStart(2, '0');
const day = String(current.getDate()).padStart(2, '0');
week.push(`${weekNames[i]} (${year}-${month}-${day})`);
}
}
return week;
}
/**
* 根据数字 1-7 生成对应星期
* @param num 1=周一2=周二...7=周日
* @returns 周一 / 周二 ... / 周日
*/
export function numToWeek(num: number): string {
const weekMap = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'];
return weekMap[num - 1] || '';
}

View File

@@ -361,6 +361,7 @@ const cancelForm = () => {
height: 50px; height: 50px;
line-height: 50px; line-height: 50px;
background-color: #1a75ff; background-color: #1a75ff;
background-color: #dfedff;
& > div { & > div {
flex: 1; flex: 1;
} }

View File

@@ -109,6 +109,7 @@ function handleclick(item: communitylist_rows_type) {
height: 50px; height: 50px;
line-height: 50px; line-height: 50px;
background-color: #1a75ff; background-color: #1a75ff;
background-color: #dfedff;
& > div { & > div {
flex: 1; flex: 1;
} }
@@ -116,6 +117,7 @@ function handleclick(item: communitylist_rows_type) {
padding-left: 20px; padding-left: 20px;
font-size: 20px; font-size: 20px;
color: white; color: white;
color: #000;
} }
} }
} }

View File

@@ -11,8 +11,8 @@
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px"> <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="活动标题" prop="titile"> <el-form-item label="活动标题" prop="title">
<el-input v-model.trim="form.titile" placeholder="请输入活动标题" /> <el-input v-model.trim="form.title" placeholder="请输入活动标题" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@@ -52,14 +52,13 @@ const router = useRouter();
const formRef = ref(); const formRef = ref();
const form = ref({ const form = ref({
'id': null, 'id': null,
villageId: Number(localStorage.getItem('villageid')), 'title': '',
'titile': '',
'author': '', 'author': '',
'content': '', 'content': '',
'status': '0' 'status': '0'
}); });
const rules = { const rules = {
titile: [{ required: true, message: '请输入活动标题', trigger: 'blur' }], title: [{ required: true, message: '请输入活动标题', trigger: 'blur' }],
author: [{ required: true, message: '请输入作者', trigger: 'blur' }], author: [{ required: true, message: '请输入作者', trigger: 'blur' }],
content: [{ required: true, message: '请输入内容', trigger: 'blur' }] content: [{ required: true, message: '请输入内容', trigger: 'blur' }]
}; };
@@ -85,7 +84,6 @@ if (route.query.id) {
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value) { if (userid.value) {
updateActivity(form.value).then(() => { updateActivity(form.value).then(() => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');

View File

@@ -115,7 +115,6 @@ const initFormData: ActivityForm = {
const data = reactive<PageData<ActivityForm, ActivityQuery>>({ const data = reactive<PageData<ActivityForm, ActivityQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
villageId: Number(localStorage.getItem('villageid')),
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
titile: undefined, titile: undefined,

View File

@@ -138,7 +138,6 @@ const formRef = ref();
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value) { if (userid.value) {
updateComplaint(form.value).then(() => { updateComplaint(form.value).then(() => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');

View File

@@ -87,7 +87,6 @@ const initFormData: ComplaintForm = {
const data = reactive<PageData<ComplaintForm, ComplaintQuery>>({ const data = reactive<PageData<ComplaintForm, ComplaintQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
villageId: Number(localStorage.getItem('villageid')),
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
typeId: undefined, typeId: undefined,

View File

@@ -67,7 +67,6 @@ if (route.query.id) {
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value) { if (userid.value) {
updateComplaintType(form.value).then(() => { updateComplaintType(form.value).then(() => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');
@@ -86,7 +85,7 @@ const submitForm = () => {
// 返回 // 返回
function handleBack() { function handleBack() {
router.push({ router.push({
path: '/repair/complaintType' path: '/system/complaintType'
}); });
} }
</script> </script>

View File

@@ -99,7 +99,6 @@ const data = reactive<PageData<ComplaintTypeForm, ComplaintTypeQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
name: undefined, name: undefined,
status: undefined, status: undefined,
createNam: undefined, createNam: undefined,
@@ -145,14 +144,14 @@ const router = useRouter();
/** 新增按钮操作 */ /** 新增按钮操作 */
const handleAdd = () => { const handleAdd = () => {
router.push({ router.push({
path: '/repair/addComplantType' path: '/system/addComplantType'
}); });
}; };
/** 修改按钮操作 */ /** 修改按钮操作 */
const handleUpdate = async (row?: ComplaintTypeVO) => { const handleUpdate = async (row?: ComplaintTypeVO) => {
router.push({ router.push({
path: '/repair/addComplantType', path: '/system/addComplantType',
query: { query: {
id: row.id id: row.id
} }

View File

@@ -58,10 +58,10 @@ import PageHeader from '@/components/Pageheader/index.vue';
import { addDecoration, getDecoration, updateDecoration } from '@/api/system/Decoration'; import { addDecoration, getDecoration, updateDecoration } from '@/api/system/Decoration';
import { useHouseStore } from '@/store/modules/house'; import { useHouseStore } from '@/store/modules/house';
import { CascaderValue } from 'element-plus'; import { CascaderValue } from 'element-plus';
import { getHousePathById } from '@/utils/house';
const houseStore = useHouseStore(); const houseStore = useHouseStore();
const { treedata } = storeToRefs(houseStore); const treedata = ref([]);
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
@@ -69,7 +69,6 @@ const formRef = ref();
const form = ref({ const form = ref({
'id': null, 'id': null,
'houseId': null, 'houseId': null,
villageId: Number(localStorage.getItem('villageid')),
'applyName': '', 'applyName': '',
'decorationCompany': '', 'decorationCompany': '',
'decorationContent': '', 'decorationContent': '',
@@ -83,21 +82,6 @@ const rules = {
}; };
const userid = ref(); const userid = ref();
// ! 投诉 ====================================================================================================
function init() {
getDecoration(userid.value).then((res) => {
form.value = {
...form.value,
...res.data
};
});
}
if (route.query.id) {
userid.value = route.query.id;
init();
}
// 获取房屋 // 获取房屋
const userHousepath = ref([]); const userHousepath = ref([]);
function handleChange(val: (string | number)[]) { function handleChange(val: (string | number)[]) {
@@ -107,11 +91,34 @@ function handleChange(val: (string | number)[]) {
form.value.houseId = null; form.value.houseId = null;
} }
} }
// ! 投诉 ====================================================================================================
function getTree() {
houseStore.getCurrentVilageTreeHouse().then((res) => {
treedata.value = res;
if (route.query.id) {
userid.value = route.query.id;
init();
}
});
}
getTree();
function init() {
getDecoration(userid.value).then((res) => {
form.value = {
...form.value,
...res.data
};
const arr = getHousePathById(treedata.value, form.value.houseId);
console.log(arr);
userHousepath.value = arr;
});
}
// 提交 // 提交
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value) { if (userid.value) {
updateDecoration(form.value).then(() => { updateDecoration(form.value).then(() => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="p-2"> <div class="flex flex-col h-full p-2">
<Pageheader title="装修管理"></Pageheader> <Pageheader title="装修管理"></Pageheader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
@@ -22,7 +22,7 @@
</div> </div>
</transition> </transition>
<el-card shadow="never"> <el-card class="flex-1" shadow="never">
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
@@ -146,7 +146,6 @@ const data = reactive<PageData<DecorationForm, DecorationQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
villageId: Number(localStorage.getItem('villageid')),
pageSize: 10, pageSize: 10,
houseId: undefined, houseId: undefined,
applyName: undefined, applyName: undefined,
@@ -260,3 +259,9 @@ onMounted(() => {
getList(); getList();
}); });
</script> </script>
<style lang="scss" scoped>
.el-table {
height: calc(100% - 80px);
}
</style>

View File

@@ -112,7 +112,6 @@ if (route.query.id) {
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value) { if (userid.value) {
updateHandleLog(form.value).then(() => { updateHandleLog(form.value).then(() => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');

View File

@@ -94,7 +94,6 @@ const initFormData: HandleLogForm = {
const data = reactive<PageData<HandleLogForm, HandleLogQuery>>({ const data = reactive<PageData<HandleLogForm, HandleLogQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
villageId: Number(localStorage.getItem('villageid')),
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
content: undefined, content: undefined,

View File

@@ -0,0 +1,205 @@
<template>
<div class="p-2">
<PageHeader title="新建巡检计划"></PageHeader>
<div class="EditBody">
<div class="title">
<div>基本信息</div>
</div>
<div class="bodybox">
<el-form label-width="100px" label-position="right">
<el-form-item label="巡检计划名称">
<el-input placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="巡检人员">
<el-input placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="执行周期">
<el-date-picker
@update:model-value="handleTime"
v-model="taskDate"
type="daterange"
range-separator=""
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
start-placeholder="开启日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item label="任务时间">
<el-select v-model="form.taskTime" placeholder="Select" style="width: 100%">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<div flex flex-wrap>
<div
class="week-items"
@click="checkoutWeekFun(item)"
:class="{
active: checkoutWeek.includes(item)
}"
v-for="(item, index) in 7"
:key="index"
>
<div class="iconbox">
<el-icon v-show="checkoutWeek.includes(item)"><Check /></el-icon>
</div>
<span class="ml-5px">{{ numToWeek(item) }}</span>
</div>
</div>
</el-form-item>
<el-form-item label="提醒时间">
<el-select v-model="form.remindTime" placeholder="Select" style="width: 100%">
<el-option v-for="item in remindTimeoptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="巡检设置">
<el-radio-group v-model="form.inspectSetting">
<el-radio label="必须拍照" value="1" />
<el-radio label="允许跳检" value="0" />
</el-radio-group>
</el-form-item>
<el-form-item label="计划路线">
<el-select v-model="form.routeIds" placeholder="Select" style="width: 100%">
<el-option v-for="item in routeIdsoptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<div class="mapbox">123</div>
</el-form-item>
<el-form-item>
<el-button type="primary">提交</el-button>
<el-button @click="routeback">返回</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import PageHeader from '@/components/Pageheader/index.vue';
import { numToWeek } from '@/utils/time';
import { ref } from 'vue';
const route = useRoute();
const router = useRouter();
const form = ref({
taskTime: 0,
remindTime: '',
startTime: '',
endTime: '',
inspectSetting: '',
routeIds: ''
});
// 执行周期
const taskDate = ref([]);
function handleTime(val) {
console.log(val);
taskDate.value = val;
form.value.startTime = val[0];
form.value.endTime = val[1];
}
const checkoutWeek = ref([]);
function checkoutWeekFun(val: number) {
if (!checkoutWeek.value.includes(val)) {
checkoutWeek.value.push(val);
} else {
checkoutWeek.value = checkoutWeek.value.filter((item) => item !== val);
}
console.log(val);
}
// 任务时间
const options = ref([
{
value: '09:00-11:00; 13:00-15:00',
label: '09:00-11:00; 13:00-15:00'
}
]);
// 提醒时间
const remindTimeoptions = ref([
{
value: 0,
label: '任务开始前10分钟'
},
{
value: 1,
label: '任务开始前15分钟'
},
{
value: 2,
label: '任务开始前30分钟'
}
]);
// 计划路线
const routeIdsoptions = ref([
{
value: 0,
label: '常规巡更计划1'
},
{
value: 1,
label: '常规巡更计划2'
},
{
value: 2,
label: '常规巡更计划3'
}
]);
// 巡检计划id
const editid = ref(null);
function init() {
if (route.query.id) {
editid.value = route.query.id;
}
}
init();
function routeback() {
router.back();
}
</script>
<style scoped lang="scss">
.EditBody {
margin-top: 20px;
padding: 30px;
background-color: white;
.bodybox {
width: 600px;
margin: 0 auto;
margin-top: 20px;
}
.week-items {
width: 90px;
height: 30px;
line-height: 30px;
border-radius: 5px;
cursor: pointer;
margin: 10px 5px;
background-color: #ccc;
color: #000;
display: flex;
align-items: center;
.iconbox {
width: 30px;
height: 30px;
margin-left: 5px;
text-align: center;
line-height: 30px;
}
&.active {
color: rgba(26, 117, 255, 1);
background-color: rgba(26, 117, 255, 0.15);
}
}
.mapbox {
margin-top: 20px;
width: 100%;
height: 400px;
border: 1px solid #ccc;
}
}
</style>

View File

@@ -0,0 +1,222 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" label-width="100px" :model="queryParams" :inline="true">
<el-form-item label="巡检计划名称" prop="planName">
<el-input v-model="queryParams.planName" placeholder="请输入巡检计划名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:plan:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:plan:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:plan:remove']"
>删除</el-button
>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="planList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="巡检计划名称" align="center" prop="planName" />
<el-table-column label="巡检人员" align="center" prop="inspectorIds" />
<el-table-column label="执行周期" align="center" prop="executeCycle" />
<el-table-column label="任务时间" align="center" prop="taskTime" />
<el-table-column label="巡检设置0-必须拍照1-可以跳检" align="center" prop="inspectSetting" />
<el-table-column label="计划路线" align="center" prop="routeIds" />
<el-table-column label="状态0-关闭1-开启" align="center" prop="status" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:plan:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:plan:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
</div>
</template>
<script setup name="Plan" lang="ts">
import { listPlan, getPlan, delPlan, addPlan, updatePlan } from '@/api/system/InspectionPlan/index';
import { PlanVO, PlanQuery, PlanForm } from '@/api/system/InspectionPlan/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const planList = ref<PlanVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const planFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: PlanForm = {
id: undefined,
planName: undefined,
inspectorIds: undefined,
executeCycle: undefined,
taskTime: undefined,
remindTime: undefined,
inspectSetting: undefined,
routeIds: undefined,
status: undefined,
remark: undefined,
executeDay: undefined
};
const data = reactive<PageData<PlanForm, PlanQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
planName: undefined,
inspectorIds: undefined,
executeCycle: undefined,
taskTime: undefined,
remindTime: undefined,
inspectSetting: undefined,
routeIds: undefined,
status: undefined,
executeDay: undefined,
params: {}
},
rules: {
id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
planName: [{ required: true, message: '巡检计划名称不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询巡检计划列表 */
const getList = async () => {
loading.value = true;
const res = await listPlan(queryParams.value);
planList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
planFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: PlanVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
const router = useRouter();
/** 新增按钮操作 */
const handleAdd = () => {
router.push({
path: '/Inspection/addInspectionPlan'
});
};
/** 修改按钮操作 */
const handleUpdate = async (row?: PlanVO) => {
router.push({
path: '/Inspection/addInspectionPlan',
query: {
id: row.id
}
});
};
/** 提交按钮 */
const submitForm = () => {
planFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updatePlan(form.value).finally(() => (buttonLoading.value = false));
} else {
await addPlan(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: PlanVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除巡检计划编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delPlan(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'system/plan/export',
{
...queryParams.value
},
`plan_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

View File

@@ -0,0 +1,161 @@
<template>
<div class="AddBuildingBox">
<PageHeader title="记录详情"></PageHeader>
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<div class="addBuildingFormBody">
<div class="infobox">
<div class="label">任务名称 :</div>
<div class="value">{{ form.taskName }}</div>
</div>
<div class="infobox">
<div class="label">巡更人员 :</div>
<div class="value">{{ form.inspectorName }}</div>
</div>
<div class="infobox">
<div class="label">关联计划 :</div>
<div class="value">{{ form.planName }}</div>
</div>
<div class="infobox">
<div class="label">开始时间 :</div>
<div class="value">{{ form.actualStartTime }}</div>
</div>
<div class="infobox">
<div class="label">结束时间 :</div>
<div class="value">{{ form.actualEndTime }}</div>
</div>
<div class="infobox">
<div class="label">执行状态 :</div>
<div class="value">{{ form.statusLabel }}</div>
</div>
<div class="infobox">
<div class="label">创建人 :</div>
<div class="value">{{ form.createByName }}</div>
</div>
<div class="infobox">
<div class="label">创建时间 :</div>
<div class="value">{{ form.createTime }}</div>
</div>
<div class="infobox">
<div class="label">更新时间 :</div>
<div class="value">{{ form.updateTime }}</div>
</div>
</div>
</div>
<div class="AddBuildingBody">
<div class="title">巡检记录</div>
<div class="">
<el-table :data="form.details" style="width: 100%">
<el-table-column type="index" align="center" label="序号" width="85" />
<el-table-column prop="pointName" align="center" label="巡检点" />
<el-table-column prop="checkTime" align="center" label=" 巡检时间" />
<el-table-column prop="location" align="center" label="巡检地址" />
<el-table-column prop="checkResult" align="center" label="巡检结果" />
<el-table-column prop="photos" align="center" label="图片" />
</el-table>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { addMonthCard, getMonthCard, updateMonthCard } from '@/api/system/MonthCard';
import { getRecord } from '@/api/system/InspectionRecord';
import { RecordVO } from '@/api/system/InspectionRecord/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_pay_method } = toRefs<any>(proxy?.useDict('com_pay_method'));
const router = useRouter();
const route = useRoute();
const formRef = ref();
const form = ref<RecordVO>();
const userid = ref(null);
if (route.query.id) {
userid.value = route.query.id;
getRecord(userid.value).then((res) => {
form.value = {
...res.data
};
});
}
// ! table
const tableData = [
{
date: '2016-05-03',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
},
{
date: '2016-05-02',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
},
{
date: '2016-05-04',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
},
{
date: '2016-05-01',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
}
];
// ! table
// 推出
const cancelForm = () => {
router.push({
path: '/carArea/monthCard'
});
};
</script>
<style scoped lang="scss">
.AddBuildingBox {
padding: 15px;
height: 100%;
width: 100%;
}
.AddBuildingBody {
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
background-color: white;
padding: 15px;
.title {
height: 40px;
line-height: 40px;
padding-left: 20px;
background-color: rgba(255, 255, 255, 1);
color: rgba(16, 16, 16, 1);
border-bottom: 1px solid #bbbbbb;
margin-bottom: 20px;
}
.addBuildingFormBody {
display: grid;
grid-template-columns: repeat(3, 1fr);
.infobox {
font-size: 16px;
display: flex;
align-items: center;
margin-bottom: 40px;
.label {
width: 100px;
text-align: right;
margin-right: 10px;
}
.value {
font-weight: 500;
}
}
}
}
</style>

View File

@@ -0,0 +1,223 @@
<template>
<div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="执行状态" prop="routeId">
<el-input v-model="queryParams.routeId" placeholder="请输入巡检路线ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="巡检日期" prop="routeId">
<el-input v-model="queryParams.routeId" placeholder="请输入巡检路线ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="任务名称" prop="routeId">
<el-input v-model="queryParams.routeId" placeholder="请输入巡检路线ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:record:add']">临时跳转详情页</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:record:remove']"
>删除</el-button
>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="recordList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="任务名称" align="center" prop="taskName" />
<el-table-column label="巡检人员" align="center" prop="inspectorName" />
<el-table-column label="任务开始时间" align="center" prop="startTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.actualStartTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="任务结束时间" align="center" prop="endTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.actualEndTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="执行状态" align="center" prop="status" />
<el-table-column label="关联计划" align="center" prop="planName" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" @click="handleUpdate(scope.row)">查看详情</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
</div>
</template>
<script setup name="Record" lang="ts">
import { listRecord, getRecord, delRecord, addRecord, updateRecord } from '@/api/system/InspectionRecord/index';
import { RecordVO, RecordQuery, RecordForm } from '@/api/system/InspectionRecord/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const recordList = ref<RecordVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const recordFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: RecordForm = {
id: undefined,
taskId: undefined,
planId: undefined,
inspectorId: undefined,
routeId: undefined,
startTime: undefined,
endTime: undefined,
execStatus: undefined,
remark: undefined
};
const data = reactive<PageData<RecordForm, RecordQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
taskId: undefined,
planId: undefined,
inspectorId: undefined,
routeId: undefined,
startTime: undefined,
endTime: undefined,
execStatus: undefined,
params: {}
},
rules: {
id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
taskId: [{ required: true, message: '关联巡检任务ID不能为空', trigger: 'blur' }],
inspectorId: [{ required: true, message: '巡检人员ID不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
/** 查询巡检记录主列表 */
const getList = async () => {
loading.value = true;
const res = await listRecord(queryParams.value);
recordList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
recordFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: RecordVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
const router = useRouter();
/** 新增按钮操作 */
const handleAdd = () => {
router.push({
path: '/Inspection/InspectionRecordMain'
});
};
/** 修改按钮操作 */
const handleUpdate = async (row?: RecordVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getRecord(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改巡检记录主';
};
/** 提交按钮 */
const submitForm = () => {
recordFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateRecord(form.value).finally(() => (buttonLoading.value = false));
} else {
await addRecord(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: RecordVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除巡检记录主编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delRecord(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'system/record/export',
{
...queryParams.value
},
`record_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>

View File

@@ -103,7 +103,6 @@ const formRef = ref();
const form = ref({ const form = ref({
id: null, id: null,
cardCode: '', // 月卡编号 cardCode: '', // 月卡编号
villageId: Number(localStorage.getItem('villageid')), // 月卡编号
cardName: null, // 持卡人姓名 cardName: null, // 持卡人姓名
phone: '', // 手机号 phone: '', // 手机号
carNum: null, // 绑定车牌号 carNum: null, // 绑定车牌号
@@ -171,7 +170,6 @@ if (route.query.id) {
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (!form.value.startTime.trim() || !form.value.endTime.trim()) { if (!form.value.startTime.trim() || !form.value.endTime.trim()) {
ElMessage.warning('请选择有效日期'); ElMessage.warning('请选择有效日期');
} }

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="p-2"> <div class="h-full flex flex-col p-2">
<pageheader title="月卡管理"></pageheader> <pageheader title="月卡管理"></pageheader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
@@ -22,7 +22,7 @@
</div> </div>
</transition> </transition>
<el-card shadow="never"> <el-card class="flex-1" shadow="never">
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
@@ -178,7 +178,6 @@ const data = reactive<PageData<MonthCardForm, MonthCardQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
handleTime: undefined, handleTime: undefined,
cardName: undefined, cardName: undefined,
phone: undefined, phone: undefined,
@@ -298,3 +297,9 @@ onMounted(() => {
getList(); getList();
}); });
</script> </script>
<style lang="scss" scoped>
.el-table {
height: calc(100% - 80px);
}
</style>

View File

@@ -116,7 +116,6 @@ if (route.query.id) {
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value) { if (userid.value) {
updateNotice(form.value).then(() => { updateNotice(form.value).then(() => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');

View File

@@ -109,7 +109,6 @@ const initFormData: NoticeForm = {
const data = reactive<PageData<NoticeForm, NoticeQuery>>({ const data = reactive<PageData<NoticeForm, NoticeQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
villageId: Number(localStorage.getItem('villageid')),
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
noticeTitle: undefined, noticeTitle: undefined,

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="AddBuildingBox"> <div class="AddBuildingBox">
<PageHeader :title="userid ? '编辑月卡' : '添加月卡'"></PageHeader> <PageHeader :title="userid ? '编辑停车缴费' : '添加停车缴费'"></PageHeader>
<div class="AddBuildingBody"> <div class="AddBuildingBody">
<div class="title">基本信息</div> <div class="title">基本信息</div>
<div class="addBuildingFormBody"> <div class="addBuildingFormBody">
@@ -108,11 +108,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue'; import PageHeader from '@/components/Pageheader/index.vue';
import { addMonthCard, getMonthCard, updateMonthCard } from '@/api/system/MonthCard';
import { listArea } from '@/api/system/carArea'; import { listArea } from '@/api/system/carArea';
import { addParkingCost, getParkingCost, updateParkingCost } from '@/api/system/ParkingCost'; import { addParkingCost, getParkingCost, updateParkingCost } from '@/api/system/ParkingCost';
import { listParking } from '@/api/system/parking'; import { listParking } from '@/api/system/parking';
import { getCommunitylistAPI } from '@/api/system/community';
import { validator } from '@/utils/Reg'; import { validator } from '@/utils/Reg';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_pay_method } = toRefs<any>(proxy?.useDict('com_pay_method')); const { com_pay_method } = toRefs<any>(proxy?.useDict('com_pay_method'));
@@ -125,7 +123,6 @@ const route = useRoute();
const formRef = ref(); const formRef = ref();
const form = ref({ const form = ref({
id: null, id: null,
villageId: Number(localStorage.getItem('villageid')), // 所属小区id
areaId: null, // 区域id areaId: null, // 区域id
parkingId: '', // 车位id parkingId: '', // 车位id
chargeItem: '0', // 临时停车 chargeItem: '0', // 临时停车
@@ -215,7 +212,6 @@ function handleArea(val: string) {
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value) { if (userid.value) {
updateParkingCost(form.value).then((res) => { updateParkingCost(form.value).then((res) => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');

View File

@@ -143,7 +143,6 @@ const data = reactive<PageData<ParkingCostForm, ParkingCostQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
areaId: undefined, areaId: undefined,
parkingId: undefined, parkingId: undefined,
chargeItem: undefined, chargeItem: undefined,

View File

@@ -173,6 +173,7 @@ async function handleEdit(id: string | number) {
// 保存草稿 // 保存草稿
async function handleSave(data: QuestionnaireForm) { async function handleSave(data: QuestionnaireForm) {
try { try {
console.log(data);
// 父组件自己调用接口提交 // 父组件自己调用接口提交
if (userid.value) { if (userid.value) {
await updateQuestionnaire({ await updateQuestionnaire({
@@ -181,8 +182,7 @@ async function handleSave(data: QuestionnaireForm) {
status: '0', // 草稿状态 status: '0', // 草稿状态
startTime: timedata.value[0], startTime: timedata.value[0],
endTime: timedata.value[1], endTime: timedata.value[1],
...form.value, ...form.value
villageId: Number(localStorage.getItem('villageid'))
}); });
} else { } else {
await addQuestionnaire({ await addQuestionnaire({
@@ -191,8 +191,7 @@ async function handleSave(data: QuestionnaireForm) {
status: '0', // 草稿状态 status: '0', // 草稿状态
startTime: timedata.value[0], startTime: timedata.value[0],
endTime: timedata.value[1], endTime: timedata.value[1],
...form.value, ...form.value
villageId: Number(localStorage.getItem('villageid'))
}); });
} }
ElMessage.success('保存成功'); ElMessage.success('保存成功');
@@ -206,23 +205,24 @@ async function handleSave(data: QuestionnaireForm) {
// 发布问卷 // 发布问卷
async function handlePublish(data: QuestionnaireForm) { async function handlePublish(data: QuestionnaireForm) {
try { try {
console.log(data);
if (userid.value) { if (userid.value) {
await updateQuestionnaire({ await updateQuestionnaire({
...data, ...data,
content: JSON.stringify(data.content), content: JSON.stringify(data.content),
status: '1', // 发布状态 status: '1', // 发布状态
startTime: timedata.value[0], startTime: timedata.value[0],
villageId: Number(localStorage.getItem('villageid')), endTime: timedata.value[1],
endTime: timedata.value[1] ...form.value
}); });
} else { } else {
await addQuestionnaire({ await addQuestionnaire({
...data, ...data,
content: JSON.stringify(data.content), content: JSON.stringify(data.content),
status: '1', // 发布状态 status: '1', // 发布状态
endTime: timedata.value[1],
startTime: timedata.value[0], startTime: timedata.value[0],
villageId: Number(localStorage.getItem('villageid')), ...form.value
endTime: timedata.value[1]
}); });
} }
ElMessage.success('发布成功'); ElMessage.success('发布成功');

View File

@@ -155,7 +155,7 @@ function cloneComponent(component: ComponentItem): QuestionComponentItem {
return { return {
cid: Date.now(), // 生成唯一ID cid: Date.now(), // 生成唯一ID
type: component.type, type: component.type,
title: 'ces', title: '',
required: true, required: true,
options: component.type === 'radio' || component.type === 'checkbox' ? [{ label: '选项1' }, { label: '选项2' }] : [] options: component.type === 'radio' || component.type === 'checkbox' ? [{ label: '选项1' }, { label: '选项2' }] : []
}; };

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="p-2"> <div class="flex flex-col h-full p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
@@ -19,7 +19,7 @@
</div> </div>
</transition> </transition>
<el-card shadow="never"> <el-card class="flex-1" shadow="never">
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
@@ -129,7 +129,6 @@ const initFormData: QuestionnaireForm = {
const data = reactive<PageData<QuestionnaireForm, QuestionnaireQuery>>({ const data = reactive<PageData<QuestionnaireForm, QuestionnaireQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
villageId: Number(localStorage.getItem('villageid')),
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: undefined, villageId: undefined,
@@ -249,3 +248,8 @@ onMounted(() => {
getList(); getList();
}); });
</script> </script>
<style lang="scss" scoped>
.el-table {
height: calc(100% - 80px);
}
</style>

View File

@@ -246,7 +246,6 @@ const submitForm = () => {
const sendForm = (str: string) => { const sendForm = (str: string) => {
form.value.problemImageUrl = str; form.value.problemImageUrl = str;
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value) { if (userid.value) {
updateRepair(form.value).then((res) => { updateRepair(form.value).then((res) => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');

View File

@@ -118,7 +118,6 @@ init();
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (!userid.value) { if (!userid.value) {
addRepairProject(form.value).then(() => { addRepairProject(form.value).then(() => {
ElMessage.success('添加成功'); ElMessage.success('添加成功');
@@ -136,7 +135,7 @@ const submitForm = () => {
// 推出 // 推出
const cancelForm = () => { const cancelForm = () => {
router.push({ router.push({
path: '/repair/repairProjectList' path: '/system/repairProjectList'
}); });
}; };
</script> </script>

View File

@@ -127,7 +127,6 @@ const data = reactive<PageData<RepairForm, RepairQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
houseId: undefined, houseId: undefined,
maintenanceItemId: undefined, maintenanceItemId: undefined,
problem: undefined, problem: undefined,

View File

@@ -186,7 +186,6 @@ const initFormData: RepairProjectForm = {
const data = reactive<PageData<RepairProjectForm, RepairProjectQuery>>({ const data = reactive<PageData<RepairProjectForm, RepairProjectQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
villageId: Number(localStorage.getItem('villageid')),
projectName: undefined, projectName: undefined,
parentId: undefined, parentId: undefined,
projectType: undefined, projectType: undefined,
@@ -259,14 +258,14 @@ const handleSelectionChange = (selection: RepairProjectVO[]) => {
/** 新增按钮操作 */ /** 新增按钮操作 */
const handleAdd = () => { const handleAdd = () => {
router.push({ router.push({
path: '/repair/addRepairProjectList' path: '/system/addRepairProjectList'
}); });
}; };
/** 修改按钮操作 */ /** 修改按钮操作 */
const handleUpdate = async (row?: RepairProjectVO) => { const handleUpdate = async (row?: RepairProjectVO) => {
router.push({ router.push({
path: '/repair/addRepairProjectList', path: '/system/addRepairProjectList',
query: { query: {
id: row.id id: row.id
} }

View File

@@ -94,7 +94,6 @@ const data = reactive<PageData<VisitorForm, VisitorQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
houseId: undefined, houseId: undefined,
visitorName: undefined, visitorName: undefined,
visitorGender: undefined, visitorGender: undefined,

View File

@@ -61,7 +61,6 @@ const route = useRoute();
const formRef = ref(); const formRef = ref();
const form = ref({ const form = ref({
id: null, id: null,
villageId: Number(localStorage.getItem('villageid')),
areaName: null, areaName: null,
areaCode: null, areaCode: null,
area: null, area: null,
@@ -90,7 +89,6 @@ if (route.query.id) {
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (parkingid.value) { if (parkingid.value) {
updateArea(form.value).then(() => { updateArea(form.value).then(() => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');

View File

@@ -97,7 +97,6 @@ const data = reactive<PageData<AreaForm, AreaQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
areaName: undefined, areaName: undefined,
areaCode: undefined, areaCode: undefined,
area: undefined, area: undefined,

View File

@@ -121,7 +121,6 @@ const form = ref({
id: null, id: null,
areaId: null, // 区域id areaId: null, // 区域id
residentId: null, // 车位id residentId: null, // 车位id
villageId: Number(localStorage.getItem('villageid')), // 小区id
parkingId: null, // 持有人id parkingId: null, // 持有人id
carNum: '', //车牌号 carNum: '', //车牌号
carBrand: '', //车辆品牌 carBrand: '', //车辆品牌
@@ -207,7 +206,6 @@ function changeArealist(val: string) {
const submitForm = () => { const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value.trim() !== '') { if (userid.value.trim() !== '') {
updateCar(form.value).then(() => { updateCar(form.value).then(() => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="p-2"> <div class="flex flex-col h-full p-2">
<Pageheader title="车辆管理"></Pageheader> <Pageheader title="车辆管理"></Pageheader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
@@ -23,7 +23,7 @@
</div> </div>
</transition> </transition>
<el-card shadow="never"> <el-card class="flex-1" shadow="never">
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
@@ -109,7 +109,6 @@ const data = reactive<PageData<CarForm, CarQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
areaId: undefined, areaId: undefined,
parkingId: undefined, parkingId: undefined,
residentId: undefined, residentId: undefined,
@@ -196,3 +195,8 @@ onMounted(() => {
getList(); getList();
}); });
</script> </script>
<style lang="scss" scoped>
.el-table {
height: calc(100% - 80px);
}
</style>

View File

@@ -50,7 +50,6 @@ import { useRouter } from 'vue-router';
import { useHouseStore } from '@/store/modules/house'; import { useHouseStore } from '@/store/modules/house';
const houseStore = useHouseStore(); const houseStore = useHouseStore();
const { currentVilageInfo } = storeToRefs(houseStore);
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_build_use } = toRefs<any>(proxy?.useDict('com_build_use')); const { com_build_use } = toRefs<any>(proxy?.useDict('com_build_use'));
@@ -100,7 +99,6 @@ const submitForm = () => {
if (buildingId) { if (buildingId) {
editBuildingApi({ editBuildingApi({
...form.value, ...form.value,
villageId: currentVilageInfo.value.villageId,
id: buildingId id: buildingId
}) })
.then((res) => { .then((res) => {
@@ -113,8 +111,7 @@ const submitForm = () => {
}); });
} else { } else {
addBuildingApi({ addBuildingApi({
...form.value, ...form.value
villageId: currentVilageInfo.value.villageId
}) })
.then((res) => { .then((res) => {
ElMessage.success('添加成功'); ElMessage.success('添加成功');

View File

@@ -4,19 +4,19 @@
<div class="AddBuildingBody"> <div class="AddBuildingBody">
<div class="title">基本信息</div> <div class="title">基本信息</div>
<div class="addBuildingFormBody"> <div class="addBuildingFormBody">
<el-form class="formBody" label-position="left" ref="formRef" :model="form" :rules="rules" label-width="100px"> <el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="楼栋" prop="buildingId"> <el-form-item label="楼栋" prop="buildingId">
<el-select @change="handlechangeBuild" v-model="form.buildingId" class="m-2" placeholder="请选择"> <el-select @change="handlechangeBuild" v-model="form.buildingId" placeholder="请选择">
<el-option v-for="item in houseStore.currentBuildingInfoList" :key="item.id" :label="item.buildingName" :value="item.id" /> <el-option v-for="item in houseStore.currentBuildingInfoList" :key="item.id" :label="item.buildingName" :value="item.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="单元" prop="unit"> <el-form-item label="单元" prop="unit">
<el-select v-model.number="form.unitNo" class="m-2" placeholder="请选择"> <el-select v-model.number="form.unitNo" placeholder="请选择">
<el-option v-for="item in units" :key="item.no" :label="item.name" :value="item.no" /> <el-option v-for="item in units" :key="item.no" :label="item.name" :value="item.no" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="楼层" prop="floor"> <el-form-item label="楼层" prop="floor">
<el-select v-model.number="form.floorNo" class="m-2" placeholder="请选择"> <el-select v-model.number="form.floorNo" placeholder="请选择">
<el-option v-for="item in floors" :key="item.no" :label="item.name" :value="item.no" /> <el-option v-for="item in floors" :key="item.no" :label="item.name" :value="item.no" />
</el-select> </el-select>
</el-form-item> </el-form-item>

View File

@@ -2,14 +2,13 @@
<div class="TableBox p-5 h-full" v-if="houseStore.currentHouseInfoList !== null"> <div class="TableBox p-5 h-full" v-if="houseStore.currentHouseInfoList !== null">
<el-checkbox-group @change="handleChangeCheckhouses" v-model="houseStore.checkoutHouses"> <el-checkbox-group @change="handleChangeCheckhouses" v-model="houseStore.checkoutHouses">
<el-table border :data="houseStore.currentFloorInfoList"> <el-table border :data="houseStore.currentFloorInfoList">
<el-table-column align="center" fixed label="楼层\单元" min-width="85"> <el-table-column align="center" fixed label="楼层\单元" max-width="100">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ row }}</span> <span>{{ row }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
min-width="160" min-width="160"
class="column"
align="center" align="center"
:label="`${unit.unitNo}单元`" :label="`${unit.unitNo}单元`"
v-for="(unit, index) in houseStore.currentHouseInfoList?.units ?? []" v-for="(unit, index) in houseStore.currentHouseInfoList?.units ?? []"
@@ -74,11 +73,8 @@ function contextMenuFun(val: { type: string; value: string }) {
<style scoped lang="scss"> <style scoped lang="scss">
.TableBox { .TableBox {
overflow: hidden; .el-table {
flex: 1; height: calc(100% - 500px);
.column {
width: 200px;
background-color: red;
} }
} }
</style> </style>

View File

@@ -77,6 +77,8 @@ $primary_color: #1978fe;
} }
.UnitBody { .UnitBody {
flex: 1; flex: 1;
overflow-x: hidden;
overflow-y: auto;
} }
} }
</style> </style>

View File

@@ -4,7 +4,7 @@
<div class="AddBuildingBody"> <div class="AddBuildingBody">
<div class="title">基本信息</div> <div class="title">基本信息</div>
<div class="addBuildingFormBody"> <div class="addBuildingFormBody">
<el-form class="formBody" label-position="left" ref="formRef" :model="form" :rules="rules" label-width="130px"> <el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
<el-row> <el-row>
<el-col :span="11"> <el-col :span="11">
<el-form-item label="房屋" prop="houseId"> <el-form-item label="房屋" prop="houseId">
@@ -22,7 +22,7 @@
<el-row> <el-row>
<el-col :span="11"> <el-col :span="11">
<el-form-item label="租赁状态" prop="rentalStatus"> <el-form-item label="租赁状态" prop="rentalStatus">
<el-select v-model.number="form.rentalStatus" class="m-2" placeholder="请选择"> <el-select v-model.number="form.rentalStatus" placeholder="请选择">
<el-option v-for="(item, index) in com_rental_status" :key="index" :label="item.label" :value="Number(item.value)" /> <el-option v-for="(item, index) in com_rental_status" :key="index" :label="item.label" :value="Number(item.value)" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@@ -30,7 +30,7 @@
<el-col :span="2"></el-col> <el-col :span="2"></el-col>
<el-col :span="11"> <el-col :span="11">
<el-form-item label="房屋用途" prop="houseUse"> <el-form-item label="房屋用途" prop="houseUse">
<el-select v-model.number="form.houseUse" class="m-2" placeholder="请选择"> <el-select v-model.number="form.houseUse" placeholder="请选择">
<el-option v-for="(item, index) in com_house_use" :key="index" :label="item.label" :value="item.value" /> <el-option v-for="(item, index) in com_house_use" :key="index" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@@ -57,7 +57,7 @@
<el-row> <el-row>
<el-col :span="11"> <el-col :span="11">
<el-form-item label="房屋朝向" prop="type"> <el-form-item label="房屋朝向" prop="type">
<el-select v-model.number="form.houseFace" class="m-2" placeholder="请选择"> <el-select v-model.number="form.houseFace" placeholder="请选择">
<el-option v-for="(item, index) in houseformat" :key="index" :label="item" :value="item" /> <el-option v-for="(item, index) in houseformat" :key="index" :label="item" :value="item" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@@ -202,7 +202,7 @@ const route = useRoute();
const formRef = ref(); const formRef = ref();
const houseformat = ['东', '西', '南', '北']; const houseformat = ['东', '西', '南', '北'];
const form = ref<HouseRentalVO>({ const form = ref({
id: null, id: null,
houseId: null, houseId: null,
rentalName: '', // 租户姓名 rentalName: '', // 租户姓名
@@ -251,6 +251,8 @@ async function gettreedata() {
...form.value, ...form.value,
...res.data ...res.data
}; };
console.log(form.value);
housedeviceslist.value = form.value.facilities.split(',').filter((item) => item);
const imgurllist = splitStringUrl(form.value.houseImageUrl); const imgurllist = splitStringUrl(form.value.houseImageUrl);
fileList.value = imgurllist; fileList.value = imgurllist;
const arr = getHousePathById(treedata.value, form.value.houseId); const arr = getHousePathById(treedata.value, form.value.houseId);
@@ -354,7 +356,6 @@ const submitForm = () => {
}; };
const sendForm = (val: string) => { const sendForm = (val: string) => {
form.value.houseImageUrl = val; form.value.houseImageUrl = val;
form.value.villageId = Number(localStorage.getItem('villageid'));
// edit or add // edit or add
if (userid.value) { if (userid.value) {
updateHouseRental(form.value).then(() => { updateHouseRental(form.value).then(() => {
@@ -363,8 +364,7 @@ const sendForm = (val: string) => {
}); });
} else { } else {
addHouseRental({ addHouseRental({
...form.value, ...form.value
villageid: Number(localStorage.getItem('villageid'))
}).then(() => { }).then(() => {
ElMessage.success('添加成功'); ElMessage.success('添加成功');
cancelForm(); cancelForm();

View File

@@ -2,9 +2,12 @@
<div class="AddBuildingBox"> <div class="AddBuildingBox">
<PageHeader title="房屋租赁管理"></PageHeader> <PageHeader title="房屋租赁管理"></PageHeader>
<div class="AddBuildingBody"> <div class="AddBuildingBody">
<div class="title"> <div class="title flex flex-items-center flex-justify-between">
<span>基础资料 </span> <div>
<span class="ml-20px color-blue cursor-pointer" @click="hanlededit">编辑</span> <span>基础资料 </span>
<span class="ml-20px color-blue cursor-pointer" @click="hanlededit">编辑</span>
</div>
<el-button @click="handlBack" class="mr-10px">返回</el-button>
</div> </div>
<div class="addBuildingFormBody"> <div class="addBuildingFormBody">
<div class="descriptionsbox"> <div class="descriptionsbox">
@@ -46,6 +49,7 @@
<div class="label">房屋设施:</div> <div class="label">房屋设施:</div>
<div class="value"> <div class="value">
<DictTag :options="com_house_rental_facilities" :value="HouseInfo.facilities"></DictTag> <DictTag :options="com_house_rental_facilities" :value="HouseInfo.facilities"></DictTag>
<span v-for="item in HouseInfo.facilitieslist" :key="item">{{ handlefacilities(item.name) }}</span>
</div> </div>
</div> </div>
<el-row> <el-row>
@@ -86,6 +90,7 @@ import PageHeader from '@/components/Pageheader/index.vue';
import { getHouseRental } from '@/api/system/houseRental'; import { getHouseRental } from '@/api/system/houseRental';
import { useHouseStore } from '@/store/modules/house'; import { useHouseStore } from '@/store/modules/house';
import { getHousePathById } from '@/utils/house'; import { getHousePathById } from '@/utils/house';
import { listHouseFacilities } from '@/api/system/HouseFacilities';
const houseStore = useHouseStore(); const houseStore = useHouseStore();
const { treedata } = storeToRefs(houseStore); const { treedata } = storeToRefs(houseStore);
@@ -97,8 +102,7 @@ const route = useRoute();
const router = useRouter(); const router = useRouter();
const houseRentalid = ref(null); const houseRentalid = ref(null);
const HouseInfo = ref({ const HouseInfo = ref({
'id': '', 'house': '',
house: '',
'name': null, 'name': null,
'rentalStatus': null, 'rentalStatus': null,
'rentalName': '', 'rentalName': '',
@@ -118,14 +122,21 @@ const HouseInfo = ref({
'houseUse': '', 'houseUse': '',
'pubBy': null, 'pubBy': null,
'pubTime': '', 'pubTime': '',
houseImageUrls: [] 'facilitieslist': [],
'houseImageUrls': []
}); });
function init() {
const housefacilities = ref([]);
async function init() {
if (route.query.id) { if (route.query.id) {
houseRentalid.value = route.query.id; houseRentalid.value = route.query.id;
} }
const reslist = await listHouseFacilities();
housefacilities.value = reslist.rows;
getHouseRental(houseRentalid.value).then((res) => { getHouseRental(houseRentalid.value).then((res) => {
HouseInfo.value = res.data; HouseInfo.value = res.data;
HouseInfo.value.facilitieslist = res.data.facilities.split(',').filter((item) => item);
HouseInfo.value.houseImageUrls = HouseInfo.value.houseImageUrl.split(',').filter((item) => item); HouseInfo.value.houseImageUrls = HouseInfo.value.houseImageUrl.split(',').filter((item) => item);
const arr = getHousePathById(treedata.value, HouseInfo.value.houseId, 'label'); const arr = getHousePathById(treedata.value, HouseInfo.value.houseId, 'label');
HouseInfo.value.house = arr.join(' - '); HouseInfo.value.house = arr.join(' - ');
@@ -133,6 +144,10 @@ function init() {
} }
init(); init();
function handlefacilities(id: string) {
const find = housefacilities.value.find((item) => item.id === id);
}
function hanlededit() { function hanlededit() {
router.push({ router.push({
path: '/house/addhouseRental', path: '/house/addhouseRental',
@@ -141,6 +156,12 @@ function hanlededit() {
} }
}); });
} }
function handlBack() {
router.push({
path: '/house/houseRental'
});
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@@ -129,7 +129,6 @@ const data = reactive<PageData<HouseRentalForm, HouseRentalQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
houseUse: '', houseUse: '',
rentalName: undefined, rentalName: undefined,
rent: undefined, rent: undefined,

View File

@@ -100,7 +100,6 @@ const form = ref({
residentId: null, // 住户id residentId: null, // 住户id
parkingStatus: '', // 车位状态 parkingStatus: '', // 车位状态
remark: '', // 备注 remark: '', // 备注
villageId: Number(localStorage.getItem('villageid')),
parkingCode: '' // 车位编码 parkingCode: '' // 车位编码
}); });
const rules = ref({ const rules = ref({
@@ -142,7 +141,6 @@ const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
form.value.residentId = holderInfo.value; form.value.residentId = holderInfo.value;
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value) { if (userid.value) {
updateParking(form.value).then((res) => { updateParking(form.value).then((res) => {
ElMessage.success('编辑成功'); ElMessage.success('编辑成功');

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="p-2"> <div class="h-full flex flex-col p-2">
<Pageheader title="车位管理"></Pageheader> <Pageheader title="车位管理"></Pageheader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
@@ -27,7 +27,7 @@
</div> </div>
</transition> </transition>
<el-card shadow="never"> <el-card class="flex-1" shadow="never">
<template #header> <template #header>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
@@ -129,7 +129,6 @@ const data = reactive<PageData<ParkingForm, ParkingQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
areaId: undefined, areaId: undefined,
parkingCode: undefined, parkingCode: undefined,
parkingArea: undefined, parkingArea: undefined,
@@ -138,8 +137,7 @@ const data = reactive<PageData<ParkingForm, ParkingQuery>>({
residentId: undefined, residentId: undefined,
addTime: undefined, addTime: undefined,
addBy: undefined, addBy: undefined,
checkStatus: undefined, checkStatus: undefined
params: {}
} }
}); });
@@ -217,3 +215,9 @@ onMounted(() => {
getList(); getList();
}); });
</script> </script>
<style lang="scss" scoped>
.el-table {
height: calc(100% - 80px);
}
</style>

View File

@@ -130,7 +130,7 @@
<div class="actions mt-5"> <div class="actions mt-5">
<el-button type="primary">审核通过</el-button> <el-button type="primary">审核通过</el-button>
<el-button type="danger">审核不通过</el-button> <el-button type="danger">审核不通过</el-button>
<el-button>返回</el-button> <el-button @click="handlBacK">返回</el-button>
</div> </div>
</div> </div>
</div> </div>
@@ -232,6 +232,11 @@ function handleActivestaus(rews) {
console.log(active.value); console.log(active.value);
} }
const router = useRouter();
function handlBacK() {
router.back();
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@@ -28,9 +28,7 @@
</div> </div>
<div class="userinfo_item"> <div class="userinfo_item">
<div class="title_item">住户类型</div> <div class="title_item">住户类型</div>
<span v-if="userInfo.type === 0"> 业主 </span> <DictTag :options="com_resident_relationship" :value="userInfo.type"></DictTag>
<span v-else-if="userInfo.type === 1"> 亲戚 </span>
<span v-else> 租户 </span>
</div> </div>
<div class="userinfo_item"> <div class="userinfo_item">
<div class="title_item">住户来源</div> <div class="title_item">住户来源</div>
@@ -71,7 +69,7 @@
<div class="userinfo_item img"> <div class="userinfo_item img">
<div class="title_item">身份证背面</div> <div class="title_item">身份证背面</div>
<div class="userinfo_itme_img"> <div class="userinfo_itme_img">
<el-image class="w-full h-full" fit="fill" :src="userInfo.cardImageFront"></el-image> <el-image class="w-full h-full" fit="fill" :src="`/${userInfo.cardImageFront}`"></el-image>
</div> </div>
</div> </div>
</el-col> </el-col>
@@ -149,6 +147,7 @@ import { ResidentVO } from '@/api/system/resident/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_review } = toRefs<any>(proxy?.useDict('com_review')); const { com_review } = toRefs<any>(proxy?.useDict('com_review'));
const { com_sub_status } = toRefs<any>(proxy?.useDict('com_sub_status')); const { com_sub_status } = toRefs<any>(proxy?.useDict('com_sub_status'));
const { com_resident_relationship } = toRefs<any>(proxy?.useDict('com_resident_relationship'));
const { com_certification_status } = toRefs<any>(proxy?.useDict('com_certification_status')); const { com_certification_status } = toRefs<any>(proxy?.useDict('com_certification_status'));
const userInfo = ref<ResidentVO>({ const userInfo = ref<ResidentVO>({
@@ -183,13 +182,18 @@ const reviewInfo = ref({
const active = ref(0); const active = ref(0);
const userid = ref(null); const userid = ref(null);
const route = useRoute(); const route = useRoute();
if (route.query.id) { if (route.query.id) {
userid.value = route.query.id; userid.value = route.query.id;
// 获取住户信息
getResident(userid.value).then((res) => { getResident(userid.value).then((res) => {
userInfo.value = res.data; userInfo.value = res.data;
// 获取 审核流程
getresidentReviewlistAPI(userid.value).then((res) => { getresidentReviewlistAPI(userid.value).then((res) => {
console.log(res);
if (res.rows[0]) { if (res.rows[0]) {
reviewInfo.value = res.rows[0]; reviewInfo.value = res.rows[0];
console.log(reviewInfo.value);
handleActivestaus(reviewInfo.value); handleActivestaus(reviewInfo.value);
} }
}); });
@@ -228,11 +232,9 @@ const activeStop = computed(() => {
case 0: case 0:
break; break;
case 1: case 1:
status = 1;
break;
case 2: case 2:
case 3: case 3:
status = 2; status = 1;
break; break;
case 4: case 4:
case 5: case 5:
@@ -249,9 +251,13 @@ const activeStop = computed(() => {
function updatePass(val: '0' | '1' | '2') { function updatePass(val: '0' | '1' | '2') {
reviewInfo.value = { reviewInfo.value = {
...reviewInfo.value, ...reviewInfo.value,
// 审核时间
'propertyTime': new Date().toLocaleString().replaceAll('/', '-'), 'propertyTime': new Date().toLocaleString().replaceAll('/', '-'),
'propertyStatus': val // 审核状态
'propertyStatus': val,
'residentId': userid.value
}; };
console.log(reviewInfo.value);
update(); update();
} }

View File

@@ -234,8 +234,7 @@ const submitForm = () => {
// return ElMessage.error('请上传身份证背面照片'); // return ElMessage.error('请上传身份证背面照片');
// } // }
const obj = { const obj = {
...form.value, ...form.value
villageId: Number(localStorage.getItem('villageid'))
}; };
if (userid.value) { if (userid.value) {
updateResident(obj).then(() => { updateResident(obj).then(() => {

View File

@@ -15,15 +15,6 @@
<el-option v-for="item in com_review" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in com_review" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- <el-form-item label="提交日期" prop="date">
<el-date-picker
v-model="queryParams.date"
type="date"
placeholder="开始日期~结束日期"
:disabled-date="disabledDate"
:shortcuts="shortcuts"
/>
</el-form-item> -->
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@@ -78,7 +69,7 @@
<el-table-column label="操作" align="center" min-width="120" fixed="right" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" min-width="120" fixed="right" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-if="scope.row.status === '0'" v-if="scope.row.status !== '1'"
link link
type="primary" type="primary"
icon="Edit" icon="Edit"
@@ -114,7 +105,32 @@ import { getHousePathById } from '@/utils/house';
import { useHouseStore } from '@/store/modules/house'; import { useHouseStore } from '@/store/modules/house';
const houseStore = useHouseStore(); const houseStore = useHouseStore();
const { currentVilageInfo } = storeToRefs(houseStore); const currentVilageInfo = ref({
'villageId': null,
'villageName': '',
'villageCode': '',
'city': '',
'address': '',
'completDate': '',
'houseUse': 0,
'villageArea': null,
'parkingSpaceCount': null,
'villageImageUrl': '',
'status': '0',
'remark': '',
'manageName': '',
'managePhone': '',
'manageQq': '',
'manageVx': '',
'manageEmail': ''
});
function init() {
houseStore.getviliageinfo(localStorage.getItem('villageid')).then((res) => {
currentVilageInfo.value = res;
});
}
init();
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_resident_relationship } = toRefs<any>(proxy?.useDict('com_resident_relationship')); const { com_resident_relationship } = toRefs<any>(proxy?.useDict('com_resident_relationship'));
@@ -153,7 +169,6 @@ const data = reactive<PageData<ResidentForm, ResidentQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
date: '', date: '',
type: null, type: null,
status: null, status: null,

View File

@@ -129,8 +129,7 @@ const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => { formRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
const data = { const data = {
...form.value, ...form.value
villageId: Number(localStorage.getItem('villageid'))
}; };
if (storeRoomid.value !== null) { if (storeRoomid.value !== null) {
updateStoreroom(data).then(() => { updateStoreroom(data).then(() => {

View File

@@ -106,7 +106,6 @@ const data = reactive<PageData<StoreroomForm, StoreroomQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
buildingId: undefined, buildingId: undefined,
unitNo: undefined, unitNo: undefined,
storeroomNo: undefined, storeroomNo: undefined,

View File

@@ -415,7 +415,7 @@ const resetQuery = () => {
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (row?: UserVO) => { const handleDelete = async (row?: UserVO) => {
const userIds = row?.userId || ids.value; const userIds = row?.userId || ids.value;
const [err] = await to(proxy?.$modal.confirm('是否确认删除员工编号为"' + userIds + '"的数据项') as any); const [err] = await to(proxy?.$modal.confirm('是否确认删除?') as any);
if (!err) { if (!err) {
await api.delUser(userIds); await api.delUser(userIds);
await getList(); await getList();

View File

@@ -25,10 +25,6 @@
<svg-icon icon-class="email" />用户邮箱 <svg-icon icon-class="email" />用户邮箱
<div class="pull-right">{{ state.user.email }}</div> <div class="pull-right">{{ state.user.email }}</div>
</li> </li>
<li class="list-group-item">
<svg-icon icon-class="tree" />所属部门
<div v-if="state.user.deptName" class="pull-right">{{ state.user.deptName }} / {{ state.postGroup }}</div>
</li>
<li class="list-group-item"> <li class="list-group-item">
<svg-icon icon-class="peoples" />所属角色 <svg-icon icon-class="peoples" />所属角色
<div class="pull-right">{{ state.roleGroup }}</div> <div class="pull-right">{{ state.roleGroup }}</div>
@@ -55,9 +51,9 @@
<el-tab-pane label="修改密码" name="resetPwd"> <el-tab-pane label="修改密码" name="resetPwd">
<resetPwd /> <resetPwd />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="第三方应用" name="thirdParty"> <!-- <el-tab-pane label="第三方应用" name="thirdParty">
<thirdParty :auths="state.auths" /> <thirdParty :auths="state.auths" />
</el-tab-pane> </el-tab-pane> -->
<el-tab-pane label="在线设备" name="onlineDevice"> <el-tab-pane label="在线设备" name="onlineDevice">
<onlineDevice :devices="state.devices" /> <onlineDevice :devices="state.devices" />
</el-tab-pane> </el-tab-pane>

View File

@@ -1,183 +1,234 @@
<template> <template>
<div class="w-full h-full workBenchBox"> <!-- 外层缩放容器 -->
<el-row> <div class="scale-container">
<el-col :span="18"> <div class="w-full h-full workBenchBox">
<div class="villageBox"> <el-row>
<div class="title">小区概况</div> <el-col :span="18">
<div class="villageBody"> <div class="villageBox">
<div class="village_items" v-for="(item, index) in list" :key="index"> <div class="title">小区概况</div>
<div class="icon"></div> <div class="villageBody">
<div class="infobox"> <div class="village_items" v-for="(item, index) in list" :key="index">
<div class="infoTitle">{{ item.name }}</div> <div class="icon">
<div class="infoNum">{{ item.value }}</div> <el-image :src="item.icon"></el-image>
</div> </div>
</div> <div class="infobox">
</div> <div class="infoTitle">{{ item.name }}</div>
</div> <div class="infoNum">{{ item.value }}</div>
<div class="echartsbox flex flex-items-center">
<div class="echarts">
<div class="nav flex flex-items-center justify-between">
<div>
<span class="ecarts_title">近一周报修量趋势</span>
<span class="echarts_units">单位</span>
</div>
<div class="flex flex-items-center justify-center">
<span class="echarts_all_baoxiu">全部保修</span>
<i class="echarts_all_arrow"></i>
</div>
</div>
<div class="echartsbody">
<repairEcharts />
</div>
</div>
<div class="echarts">
<div class="nav flex flex-items-center justify-between">
<div>
<span class="ecarts_title">近一周收入支出趋势</span>
<span class="echarts_units">单位</span>
</div>
<div class="flex flex-items-center justify-center">
<div
class="actions"
@click="changeActive_index(index)"
:class="{ active: active_index === index }"
v-for="(item, index) in actions"
:key="index"
>
{{ item.name }}
</div> </div>
</div> </div>
</div> </div>
<div class="echartsbody">
<repairEcharts />
</div>
</div> </div>
</div> <div class="echartsbox flex flex-items-center">
</el-col> <div class="echarts">
<el-col :span="6"> <div class="nav flex flex-items-center justify-between">
<div class="villageInfoBox"> <div>
<div class="iconbox"> <span class="ecarts_title">近一周报修量趋势</span>
<el-image :src="summicon"></el-image> <span class="echarts_units">单位</span>
</div> </div>
<div class="villageinfo"> <div class="flex flex-items-center justify-center">
<div class="villagename">北境碧桂园小区</div> <span class="echarts_all_baoxiu">全部保修</span>
<div class="week">2025-08-20 星期三</div> <i class="echarts_all_arrow"></i>
</div> </div>
</div>
<div class="tabsbox">
<div class="topbox">
<div
:class="{
active: Sideactive === 1
}"
@click="handleSelect(1)"
>
<span>快捷入口</span>
<i></i>
</div>
<div
:class="{
active: Sideactive === 2
}"
@click="handleSelect(2)"
>
<span>创建办事记录</span>
<i class="righti"></i>
</div>
</div>
<div class="body">
<div class="quicly_box" v-if="Sideactive === 1">
<div class="quickly_item" v-for="(item, index) in quickBox" :key="index">
<div class="quickly_item_icon"></div>
<div class="quickly_item_content">{{ item.name }}</div>
</div> </div>
<div class="quickly_item add"> <div class="echartsbody">
<el-icon><Plus /></el-icon> <repairEcharts />
<span>添加</span> </div>
</div>
<div class="echarts">
<div class="nav flex flex-items-center justify-between">
<div>
<span class="ecarts_title">近一周收入支出趋势</span>
<span class="echarts_units">单位</span>
</div>
<div class="flex flex-items-center justify-center">
<div
class="actions"
@click="changeActive_index(index)"
:class="{ active: active_index === index }"
v-for="(item, index) in actions"
:key="index"
>
{{ item.name }}
</div>
</div>
</div>
<div class="echartsbody">
<repairEcharts />
</div> </div>
</div> </div>
<div v-else></div>
</div> </div>
</div> </el-col>
</el-col> <!-- tabs -->
</el-row> <el-col :span="6">
<el-row class="mt-20px"> <div class="villageInfoBox">
<el-col> <div class="iconbox">
<div class="userBox"> <el-image :src="summicon"></el-image>
<div class="title">住户查询</div> </div>
<div class="searbox"> <div class="villageinfo">
<div>精准查询</div> <div class="villagename">北境碧桂园小区</div>
<el-select v-model="value" placeholder="住户姓名" style="width: 240px"> <div class="week">2025-08-20 星期三</div>
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> </div>
</el-select>
<el-input placeholder="请输入">
<template #prefix>
<el-icon><Search /></el-icon>
</template>
</el-input>
<el-button type="primary">查询 </el-button>
<el-button>重置</el-button>
</div> </div>
<div class="tablebox"> <div class="tabsbox">
<el-table :data="tableData" stripe style="width: 100%"> <div class="topbox">
<el-table-column type="index" :index="indexMethod" label="序号" width="60" align="center" /> <div
<el-table-column prop="date" align="center" label="姓名" width="180" /> :class="{
<el-table-column prop="date" align="center" label="类型" width="180" /> active: Sideactive === 1
<el-table-column prop="date" align="center" label="状态" width="180" /> }"
<el-table-column prop="date" align="center" label="证件号码" /> @click="handleSelect(1)"
<el-table-column prop="date" align="center" label="手机号" /> >
<el-table-column prop="name" align="center" label="房间" /> <span>快捷入口</span>
<el-table-column prop="address" align="center" label="操作"> <i></i>
<template #default> </div>
<el-button type="primary" text> 审核</el-button> <div
<el-button type="primary" text> 编辑</el-button> :class="{
<el-button type="primary" text> 删除</el-button> active: Sideactive === 2
}"
@click="handleSelect(2)"
>
<span>创建办事记录</span>
<i class="righti"></i>
</div>
</div>
<div class="body">
<div class="quicly_box" v-if="Sideactive === 1">
<div class="quickly_item" v-for="(item, index) in quickBox" :key="index" @click="handleRouter(item.url)">
<div class="quickly_item_icon"></div>
<div class="quickly_item_content">{{ item.name }}</div>
</div>
<div class="quickly_item add">
<el-icon><Plus /></el-icon>
<span>添加</span>
</div>
</div>
<div v-else>
<div class="noticeNav">
<div>创建办事记录</div>
<el-button type="primary">提交</el-button>
</div>
<div class="noticeBox">
<el-form label-position="top">
<el-form-item label="需求方姓名">
<el-input placeholder="请输入姓名" v-model="noticForm.seekName"></el-input>
</el-form-item>
<el-form-item label="办事时间">
<el-date-picker
v-model="noticForm.handleTime"
type="datetime"
clearable
placeholder="年-月-日 时:分"
value-format="YYYY-MM-DD HH:MM"
format="YYYY-MM-DD HH:MM"
>
</el-date-picker>
</el-form-item>
<el-form-item label="办事内容">
<el-input type="textarea" v-model="noticForm.content" :rows="2" placeholder="请输入办事内容"></el-input>
</el-form-item>
<el-form-item label="附件">
<el-upload
v-model:file-list="fileList"
class="upload-demo"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
multiple
>
<div class="uploadBtn flex flex-items-center">
<el-icon><Upload /></el-icon>
<span>上传文件</span>
</div>
</el-upload>
</el-form-item>
</el-form>
</div>
</div>
</div>
</div>
</el-col>
</el-row>
<!-- table -->
<el-row class="mt-20px">
<el-col>
<div class="userBox">
<div class="title">住户查询</div>
<div class="searbox">
<div>精准查询</div>
<el-select v-model="seachervalue" placeholder="住户姓名" style="width: 240px">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-input v-model="searchInput" placeholder="请输入">
<template #prefix>
<el-icon><Search /></el-icon>
</template> </template>
</el-table-column> </el-input>
</el-table> <el-button type="primary" @click="handleSearch">查询 </el-button>
<pagination <el-button>重置</el-button>
v-show="total > 0" </div>
:total="total" <div class="tablebox">
v-model:page="queryParams.pageNum" <el-table :data="tableData" stripe style="width: 100%">
v-model:limit="queryParams.pageSize" <el-table-column type="index" :index="indexMethod" label="序号" width="60" align="center" />
@pagination="getList" <el-table-column prop="name" align="center" label="姓名" width="180" />
/> <el-table-column prop="type" align="center" label="类型" width="180">
<template #default="scope">
<DictTag :options="com_resident_type" :value="scope.row.status"></DictTag>
</template>
</el-table-column>
<el-table-column prop="status" align="center" label="状态" width="180">
<template #default="scope">
<DictTag :options="com_review" :value="scope.row.type"></DictTag>
</template>
</el-table-column>
<el-table-column prop="idCard" align="center" label="证件号码" />
<el-table-column prop="phone" align="center" label="手机号" />
<el-table-column prop="houseName" align="center" label="房间" />
<el-table-column prop="address" align="center" label="操作">
<template #default>
<el-button type="primary" text> 审核</el-button>
<el-button type="primary" text> 编辑</el-button>
<el-button type="primary" text> 删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:background="false"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
</div> </div>
</div> </el-col>
</el-col> </el-row>
</el-row> </div>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import summicon from '@/assets/images/index/summer.png'; import summicon from '@/assets/images/index/summer.png';
import repairEcharts from './components/repairEcharts.vue'; import repairEcharts from './components/repairEcharts.vue';
import { listResident } from '@/api/system/resident';
import icon1 from '@/assets/images/index/1.png';
import icon2 from '@/assets/images/index/2.png';
import icon3 from '@/assets/images/index/3.png';
import icon5 from '@/assets/images/index/5.png';
import icon6 from '@/assets/images/index/6.png';
import { UploadUserFile } from 'element-plus';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_resident_type } = toRefs<any>(proxy?.useDict('com_resident_type'));
const { com_review } = toRefs<any>(proxy?.useDict('com_review'));
const list = ref([ const list = ref([
{ { name: '住户总数量', value: 10000, icon: icon1 },
name: '住户总数量', { name: '房屋总数量', value: 458, icon: icon2 },
value: 10000 { name: '车位总数量', value: 2539, icon: icon3 },
}, { name: '设备总数量', value: 22, icon: icon5 },
{ { name: '物料总数量', value: 458, icon: icon6 },
name: '房屋总数量', { name: '投诉总数量', value: 458, icon: icon6 }
value: 458
},
{
name: '车位总数量',
value: 2539
},
{
name: '设备总数量',
value: 22
},
{
name: '物料总数量',
value: 458
},
{
name: '投诉总数量',
value: 458
}
]); ]);
// ! echarts 切换
const active_index = ref(0); const active_index = ref(0);
const actions = ref([ const actions = ref([
{ {
@@ -193,13 +244,13 @@ const actions = ref([
function changeActive_index(val: number) { function changeActive_index(val: number) {
active_index.value = val; active_index.value = val;
} }
// ! echarts 切换
// ! 侧边栏 // ! 侧边栏
const Sideactive = ref(1); const Sideactive = ref(1);
function handleSelect(val: number) { function handleSelect(val: number) {
Sideactive.value = val; Sideactive.value = val;
console.log(Sideactive.value);
} }
// ! 侧边栏
// ! 快捷入口 // ! 快捷入口
const quickBox = ref([ const quickBox = ref([
{ {
@@ -227,21 +278,33 @@ const quickBox = ref([
url: '/repair/visitorList' url: '/repair/visitorList'
} }
]); ]);
const router = useRouter(); const router = useRouter();
function handleRouter(val: string) { function handleRouter(val: string) {
router.push({ router.push({
path: val path: val
}); });
} }
// ! table // ! 快捷入口
const value = ref('');
const loading = ref(true);
// ! 创建办事记录
const noticForm = ref({
seekName: '',
phone: '',
handleTime: '',
content: '',
handlePosition: '',
file: ''
});
const fileList = ref<UploadUserFile[]>([]);
// ! 创建办事记录
// ! table
const seachervalue = ref('');
const searchInput = ref('');
const loading = ref(true);
const total = ref(100); const total = ref(100);
const data = reactive({ const data = reactive({
queryParams: { queryParams: {
villageId: Number(localStorage.getItem('villageid')),
pageNum: 1, pageNum: 1,
pageSize: 10 pageSize: 10
} }
@@ -253,54 +316,42 @@ const indexMethod = (index) => {
}; };
const options = [ const options = [
{ {
value: 'Option1', value: 'name',
label: '住户姓名' label: '住户姓名'
}, },
{ {
value: 'Option2', value: 'phone',
label: '住户手机号' label: '住户手机号'
}, },
{ {
value: 'Option3', value: 'idCard',
label: '住户身份证' label: '住户身份证'
} }
]; ];
function getList() {} function handleSearch() {
const tableData = ref([ queryParams[seachervalue.value] = searchInput.value;
{ getList();
date: '2016-05-03', }
name: 'Tom', const tableData = ref([]);
address: 'No. 189, Grove St, Los Angeles' async function getList() {
}, const res = await listResident(queryParams.value);
{ tableData.value = res.rows;
date: '2016-05-02', }
name: 'Tom', getList();
address: 'No. 189, Grove St, Los Angeles' // ! table
},
{
date: '2016-05-04',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
},
{
date: '2016-05-01',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles'
}
]);
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.workBenchBox { .workBenchBox {
padding: 20px; padding: 20px;
background-color: #eaf2ff; background-color: #eaf2ff;
// 小区概况 // 小区概况
.villageBox { .villageBox {
height: 198px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, #ffffff 70%); background: linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, #ffffff 70%);
border-radius: 16px 16px 16px 16px; border-radius: 16px 16px 16px 16px;
border: 2px solid #ffffff; border: 2px solid #ffffff;
padding: 20px; padding: 20px;
margin-bottom: 20px; margin-bottom: 10px;
.title { .title {
height: 25px; height: 25px;
font-weight: 500; font-weight: 500;
@@ -313,15 +364,19 @@ const tableData = ref([
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-around; justify-content: space-around;
flex-wrap: wrap; /* 自动换行 */
gap: 16px;
.village_items { .village_items {
margin-right: 20px; flex: 1;
min-width: 185px; min-width: 160px; /* 小屏自动单列 */
height: 109px;
margin-right: 10px;
min-height: 109px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.5) 0%, #ffffff 100%); background: linear-gradient(180deg, rgba(255, 255, 255, 0.5) 0%, #ffffff 100%);
box-shadow: 0px 4px 8px 0px rgba(0, 104, 255, 0.06); box-shadow: 0px 4px 8px 0px rgba(0, 104, 255, 0.06);
border-radius: 8px 8px 8px 8px; border-radius: 8px 8px 8px 8px;
border: 1px solid #ffffff; border: 1px solid #ffffff;
padding: 30px 20px; padding-left: 20px;
display: flex; display: flex;
align-items: center; align-items: center;
.icon { .icon {
@@ -332,11 +387,14 @@ const tableData = ref([
border-radius: 10px 10px 10px 10px; border-radius: 10px 10px 10px 10px;
border: 1px solid #ffffff; border: 1px solid #ffffff;
margin-right: 15px; margin-right: 15px;
.el-image {
width: 100%;
height: 100%;
}
} }
.infobox { .infobox {
margin-right: 20px; margin-right: 20px;
.infoTitle { .infoTitle {
width: 70px;
height: 18px; height: 18px;
font-weight: 400; font-weight: 400;
font-size: 14px; font-size: 14px;
@@ -344,7 +402,6 @@ const tableData = ref([
line-height: 18px; line-height: 18px;
} }
.infoNum { .infoNum {
width: 87px;
height: 35px; height: 35px;
font-weight: 600; font-weight: 600;
font-size: 28px; font-size: 28px;
@@ -358,10 +415,11 @@ const tableData = ref([
// echarts // echarts
.echartsbox { .echartsbox {
height: inherit;
.echarts { .echarts {
margin-right: 20px; margin-right: 20px;
flex: 1; flex: 1;
height: 425px; height: 450px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, #ffffff 70%); background: linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, #ffffff 70%);
border: 2px solid #ffffff; border: 2px solid #ffffff;
border-radius: 12px; border-radius: 12px;
@@ -469,7 +527,6 @@ const tableData = ref([
// tabs // tabs
.tabsbox { .tabsbox {
margin-left: 20px; margin-left: 20px;
height: 497px;
border: 2px solid; border: 2px solid;
background: linear-gradient(180deg, #ebf4ff 0%, rgba(247, 252, 255, 0.5) 21.14%); background: linear-gradient(180deg, #ebf4ff 0%, rgba(247, 252, 255, 0.5) 21.14%);
border-image: linear-gradient(180deg, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)) 2 2; border-image: linear-gradient(180deg, rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)) 2 2;
@@ -478,7 +535,7 @@ const tableData = ref([
align-items: center; align-items: center;
div { div {
flex: 1; flex: 1;
border-bottom: 2px solid #fff; border-bottom: 4px solid;
border-image: linear-gradient(to bottom, #fff, rgba(255, 255, 255, 0)) 100% 1; border-image: linear-gradient(to bottom, #fff, rgba(255, 255, 255, 0)) 100% 1;
text-align: center; text-align: center;
padding: 14px; padding: 14px;
@@ -497,7 +554,7 @@ const tableData = ref([
position: absolute; position: absolute;
right: 10px; right: 10px;
top: 0; top: 0;
width: $width / 2; width: calc($width / 2);
height: 100%; height: 100%;
transform: skew(30deg); transform: skew(30deg);
background: white; background: white;
@@ -529,7 +586,7 @@ const tableData = ref([
position: absolute; position: absolute;
left: 10px; left: 10px;
top: 0; top: 0;
width: $width / 2; width: calc($width / 2);
height: 100%; height: 100%;
transform: skew(-30deg); transform: skew(-30deg);
background: white; background: white;
@@ -576,12 +633,17 @@ const tableData = ref([
.body { .body {
font-size: 16px; font-size: 16px;
color: #222222; color: #222222;
padding: 30px; padding: 20px;
.quicly_box { .quicly_box {
display: grid; display: flex;
grid-template-columns: repeat(3, 1fr); align-items: center;
justify-content: start;
flex-wrap: wrap;
gap: 10px;
.quickly_item { .quickly_item {
width: 125px; min-width: 30%;
max-width: 33%;
margin-bottom: 20px; margin-bottom: 20px;
height: 56px; height: 56px;
background: #ffffff; background: #ffffff;
@@ -590,6 +652,10 @@ const tableData = ref([
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer;
&:hover {
background-color: #0084ff09;
}
.quickly_item_content { .quickly_item_content {
margin-left: 5px; margin-left: 5px;
width: 64px; width: 64px;
@@ -610,6 +676,37 @@ const tableData = ref([
} }
} }
} }
.noticeNav {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
}
.noticeBox {
:deep(.el-date-editor.el-input, .el-date-editor.el-input__wrapper) {
width: 100%;
}
.upload-demo,
:deep(.el-upload.el-upload--text) {
width: 100%;
}
.uploadBtn {
height: 30px;
line-height: 20px;
border-radius: 5px;
background-color: rgba(255, 255, 255, 1);
color: rgba(16, 16, 16, 1);
padding-left: 20px;
font-size: 14px;
border: 1px solid rgba(204, 204, 204, 1);
width: 100%;
border: 1px solid #ccc;
span {
margin-left: 10px;
}
}
}
} }
} }
@@ -617,13 +714,12 @@ const tableData = ref([
.userBox { .userBox {
border-radius: 10px; border-radius: 10px;
padding: 20px; padding: 20px;
height: 550px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, #ffffff 70%); background: linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, #ffffff 70%);
border: 2px solid #ffffff; border: 2px solid #ffffff;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.title { .title {
margin-bottom: 15px; margin-bottom: 10px;
} }
.searbox { .searbox {
height: 35px; height: 35px;
@@ -631,7 +727,7 @@ const tableData = ref([
font-size: 16px; font-size: 16px;
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 30px; margin-bottom: 20px;
div { div {
width: 70px; width: 70px;
margin-right: 20px; margin-right: 20px;

View File

@@ -12,7 +12,8 @@ export default defineConfig(({ mode, command }) => {
base: env.VITE_APP_CONTEXT_PATH, base: env.VITE_APP_CONTEXT_PATH,
resolve: { resolve: {
alias: { alias: {
'@': path.resolve(__dirname, './src') '@': path.resolve(__dirname, './src'),
'@images': path.resolve(__dirname, './src/assets/images')
}, },
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'] extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
}, },