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

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>
<el-config-provider :locale="appStore.locale" :size="appStore.size">
<router-view />
<router-view ref="wrapRef" />
</el-config-provider>
</template>
@@ -17,4 +17,33 @@ onMounted(() => {
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>

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;
parkingSpaceCount: number;
villageImageUrl: string;
city: string | string[];
city: string;
status: '0' | '1';
manageName: string;
managePhone: string;

View File

@@ -1,6 +1,6 @@
import request from '@/utils/request';
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 合租
*/
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 {

View File

@@ -155,15 +155,15 @@ export interface ResidentQuery extends PageQuery {
* 住户类型
* 0业主 1租户
*/
type: string;
type?: string;
/**
* 住户状态
* 0审核中 1 已认证
*/
status: string;
status?: string;
houseId: number;
villageId: number;
buildingId: number;
unitNo: number;
houseId?: number;
villageId?: number;
buildingId?: 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 type { EChartsOption, ECharts } from 'echarts';
// ==============================================
// ✅ 【核心修复】正确的 Vue3 + TS Props 写法
// ==============================================
interface Props {
width?: string;
height?: string;
@@ -36,6 +33,7 @@ const emit = defineEmits<{
const chartRef = ref<HTMLDivElement>();
let chartInstance: ECharts | null = null;
let resizeObserver: ResizeObserver | null = null;
const initChart = () => {
if (!chartRef.value) return;
@@ -66,8 +64,10 @@ const updateChart = () => {
}
};
// ✅ 核心修复:支持 scale 缩放后重绘
const resizeChart = () => {
chartInstance?.resize();
if (!chartInstance) return;
chartInstance.resize();
};
const getInstance = () => chartInstance;
@@ -88,17 +88,19 @@ onMounted(() => {
nextTick(() => initChart());
if (props.autoResize && chartRef.value) {
const resizeObserver = new ResizeObserver(resizeChart);
resizeObserver = new ResizeObserver(resizeChart);
resizeObserver.observe(chartRef.value);
onBeforeUnmount(() => {
resizeObserver.disconnect();
});
}
});
// ✅ 关键:监听 window.resizescale 缩放会触发 window.resize
onMounted(() => {
window.addEventListener('resize', resizeChart);
});
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
resizeObserver?.disconnect();
chartInstance?.dispose();
chartInstance = null;
});
@@ -114,5 +116,7 @@ defineExpose({
<style lang="scss" scoped>
.echarts-container {
display: block;
width: 100%;
height: 100%;
}
</style>

View File

@@ -78,10 +78,17 @@ import { ResidentVO } from '@/api/system/resident/type';
import { getHousePathById } from '@/utils/house';
import { ref, watch, nextTick, getCurrentInstance, ComponentInternalInstance, toRefs } from 'vue';
import { useHouseStore } from '@/store/modules/house';
import { storeToRefs } from 'pinia';
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 { com_resident_type } = toRefs<any>(proxy?.useDict('com_resident_type'));

View File

@@ -1,4 +1,7 @@
<template>
<!-- 👇 加这一层全局缩放容器 -->
<div class="global-scale-wrapper">
<div class="scale-content" :style="{ transform: `scale(${scale})` }">
<div :class="classObj" class="app-wrapper" :style="{ '--current-color': theme }">
<side-bar class="sidebar-container" />
<div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" class="main-container">
@@ -9,8 +12,49 @@
<settings ref="settingRef" />
</div>
</div>
</div>
</div>
</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">
import SideBar from './components/Sidebar/index.vue';
import { AppMain, Navbar, Settings, TagsView } from './components';
@@ -81,6 +125,25 @@ const setLayout = () => {
@use '@/assets/styles/mixin.scss';
@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 {
@include mixin.clearfix;
position: relative;

View File

@@ -61,6 +61,7 @@ export const useHouseStore = defineStore(
const getviliageinfo = async (id) => {
const res = await getVillageByIdAPI(id);
currentVilageInfo.value = res.data;
return res.data;
};
// 更新小区信息
@@ -215,10 +216,6 @@ export const useHouseStore = defineStore(
// 房屋 树状结构类型
const getCurrentVilageTreeHouse = async () => {
if (!currentVilageInfo.value?.villageId) {
treedata.value = [];
return treedata.value;
}
try {
treedata.value = [];
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(
(config: InternalAxiosRequestConfig) => {
@@ -51,17 +60,41 @@ service.interceptors.request.use(
config.headers['Authorization'] = 'Bearer ' + getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
}
// get请求映射params参数
const villageid = localStorage.getItem('villageid');
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);
config.params = {};
config.url = url;
}
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 = {
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()
};
const sessionObj = cache.session.getJSON('sessionObj');
@@ -128,6 +161,7 @@ service.interceptors.response.use(
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
return res.data;
}
if (code === 401) {
// prettier-ignore
if (!isRelogin.show) {
@@ -151,12 +185,15 @@ service.interceptors.response.use(
});
}
return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
// 500
} else if (code === HttpStatus.SERVER_ERROR) {
// 500
console.log(res);
console.log(res.config.url.split('?')[0]);
ElMessage({ message: msg, type: 'error' });
return Promise.reject(res.data);
// 601
} else if (code === HttpStatus.WARN) {
// 601
ElMessage({ message: msg, type: 'warning' });
return Promise.reject(new Error(msg));
} else if (code !== HttpStatus.SUCCESS) {

View File

@@ -64,3 +64,54 @@ export function formatTimeDiff(startTime: string | number | Date, endTime: strin
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;
line-height: 50px;
background-color: #1a75ff;
background-color: #dfedff;
& > div {
flex: 1;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -99,7 +99,6 @@ const data = reactive<PageData<ComplaintTypeForm, ComplaintTypeQuery>>({
queryParams: {
pageNum: 1,
pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
name: undefined,
status: undefined,
createNam: undefined,
@@ -145,14 +144,14 @@ const router = useRouter();
/** 新增按钮操作 */
const handleAdd = () => {
router.push({
path: '/repair/addComplantType'
path: '/system/addComplantType'
});
};
/** 修改按钮操作 */
const handleUpdate = async (row?: ComplaintTypeVO) => {
router.push({
path: '/repair/addComplantType',
path: '/system/addComplantType',
query: {
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 { useHouseStore } from '@/store/modules/house';
import { CascaderValue } from 'element-plus';
import { getHousePathById } from '@/utils/house';
const houseStore = useHouseStore();
const { treedata } = storeToRefs(houseStore);
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const treedata = ref([]);
const route = useRoute();
const router = useRouter();
@@ -69,7 +69,6 @@ const formRef = ref();
const form = ref({
'id': null,
'houseId': null,
villageId: Number(localStorage.getItem('villageid')),
'applyName': '',
'decorationCompany': '',
'decorationContent': '',
@@ -83,21 +82,6 @@ const rules = {
};
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([]);
function handleChange(val: (string | number)[]) {
@@ -107,11 +91,34 @@ function handleChange(val: (string | number)[]) {
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 = () => {
formRef.value?.validate(async (valid: boolean) => {
if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (userid.value) {
updateDecoration(form.value).then(() => {
ElMessage.success('编辑成功');

View File

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

View File

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

View File

@@ -94,7 +94,6 @@ const initFormData: HandleLogForm = {
const data = reactive<PageData<HandleLogForm, HandleLogQuery>>({
form: { ...initFormData },
queryParams: {
villageId: Number(localStorage.getItem('villageid')),
pageNum: 1,
pageSize: 10,
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({
id: null,
cardCode: '', // 月卡编号
villageId: Number(localStorage.getItem('villageid')), // 月卡编号
cardName: null, // 持卡人姓名
phone: '', // 手机号
carNum: null, // 绑定车牌号
@@ -171,7 +170,6 @@ if (route.query.id) {
const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => {
if (valid) {
form.value.villageId = Number(localStorage.getItem('villageid'));
if (!form.value.startTime.trim() || !form.value.endTime.trim()) {
ElMessage.warning('请选择有效日期');
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
<template>
<div class="p-2">
<div class="flex flex-col h-full p-2">
<Pageheader title="车辆管理"></Pageheader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
@@ -23,7 +23,7 @@
</div>
</transition>
<el-card shadow="never">
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
@@ -109,7 +109,6 @@ const data = reactive<PageData<CarForm, CarQuery>>({
queryParams: {
pageNum: 1,
pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
areaId: undefined,
parkingId: undefined,
residentId: undefined,
@@ -196,3 +195,8 @@ onMounted(() => {
getList();
});
</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';
const houseStore = useHouseStore();
const { currentVilageInfo } = storeToRefs(houseStore);
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_build_use } = toRefs<any>(proxy?.useDict('com_build_use'));
@@ -100,7 +99,6 @@ const submitForm = () => {
if (buildingId) {
editBuildingApi({
...form.value,
villageId: currentVilageInfo.value.villageId,
id: buildingId
})
.then((res) => {
@@ -113,8 +111,7 @@ const submitForm = () => {
});
} else {
addBuildingApi({
...form.value,
villageId: currentVilageInfo.value.villageId
...form.value
})
.then((res) => {
ElMessage.success('添加成功');

View File

@@ -4,19 +4,19 @@
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<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-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-select>
</el-form-item>
<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-select>
</el-form-item>
<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-select>
</el-form-item>

View File

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

View File

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

View File

@@ -4,7 +4,7 @@
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<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-col :span="11">
<el-form-item label="房屋" prop="houseId">
@@ -22,7 +22,7 @@
<el-row>
<el-col :span="11">
<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-select>
</el-form-item>
@@ -30,7 +30,7 @@
<el-col :span="2"></el-col>
<el-col :span="11">
<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-select>
</el-form-item>
@@ -57,7 +57,7 @@
<el-row>
<el-col :span="11">
<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-select>
</el-form-item>
@@ -202,7 +202,7 @@ const route = useRoute();
const formRef = ref();
const houseformat = ['东', '西', '南', '北'];
const form = ref<HouseRentalVO>({
const form = ref({
id: null,
houseId: null,
rentalName: '', // 租户姓名
@@ -251,6 +251,8 @@ async function gettreedata() {
...form.value,
...res.data
};
console.log(form.value);
housedeviceslist.value = form.value.facilities.split(',').filter((item) => item);
const imgurllist = splitStringUrl(form.value.houseImageUrl);
fileList.value = imgurllist;
const arr = getHousePathById(treedata.value, form.value.houseId);
@@ -354,7 +356,6 @@ const submitForm = () => {
};
const sendForm = (val: string) => {
form.value.houseImageUrl = val;
form.value.villageId = Number(localStorage.getItem('villageid'));
// edit or add
if (userid.value) {
updateHouseRental(form.value).then(() => {
@@ -363,8 +364,7 @@ const sendForm = (val: string) => {
});
} else {
addHouseRental({
...form.value,
villageid: Number(localStorage.getItem('villageid'))
...form.value
}).then(() => {
ElMessage.success('添加成功');
cancelForm();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -234,8 +234,7 @@ const submitForm = () => {
// return ElMessage.error('请上传身份证背面照片');
// }
const obj = {
...form.value,
villageId: Number(localStorage.getItem('villageid'))
...form.value
};
if (userid.value) {
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-select>
</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-button type="primary" icon="Search" @click="handleQuery">搜索</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">
<template #default="scope">
<el-button
v-if="scope.row.status === '0'"
v-if="scope.row.status !== '1'"
link
type="primary"
icon="Edit"
@@ -114,7 +105,32 @@ import { getHousePathById } from '@/utils/house';
import { useHouseStore } from '@/store/modules/house';
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 { com_resident_relationship } = toRefs<any>(proxy?.useDict('com_resident_relationship'));
@@ -153,7 +169,6 @@ const data = reactive<PageData<ResidentForm, ResidentQuery>>({
queryParams: {
pageNum: 1,
pageSize: 10,
villageId: Number(localStorage.getItem('villageid')),
date: '',
type: null,
status: null,

View File

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

View File

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

View File

@@ -415,7 +415,7 @@ const resetQuery = () => {
/** 删除按钮操作 */
const handleDelete = async (row?: UserVO) => {
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) {
await api.delUser(userIds);
await getList();

View File

@@ -25,10 +25,6 @@
<svg-icon icon-class="email" />用户邮箱
<div class="pull-right">{{ state.user.email }}</div>
</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">
<svg-icon icon-class="peoples" />所属角色
<div class="pull-right">{{ state.roleGroup }}</div>
@@ -55,9 +51,9 @@
<el-tab-pane label="修改密码" name="resetPwd">
<resetPwd />
</el-tab-pane>
<el-tab-pane label="第三方应用" name="thirdParty">
<!-- <el-tab-pane label="第三方应用" name="thirdParty">
<thirdParty :auths="state.auths" />
</el-tab-pane>
</el-tab-pane> -->
<el-tab-pane label="在线设备" name="onlineDevice">
<onlineDevice :devices="state.devices" />
</el-tab-pane>

View File

@@ -1,4 +1,6 @@
<template>
<!-- 外层缩放容器 -->
<div class="scale-container">
<div class="w-full h-full workBenchBox">
<el-row>
<el-col :span="18">
@@ -6,7 +8,9 @@
<div class="title">小区概况</div>
<div class="villageBody">
<div class="village_items" v-for="(item, index) in list" :key="index">
<div class="icon"></div>
<div class="icon">
<el-image :src="item.icon"></el-image>
</div>
<div class="infobox">
<div class="infoTitle">{{ item.name }}</div>
<div class="infoNum">{{ item.value }}</div>
@@ -54,6 +58,7 @@
</div>
</div>
</el-col>
<!-- tabs -->
<el-col :span="6">
<div class="villageInfoBox">
<div class="iconbox">
@@ -87,7 +92,7 @@
</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" 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>
@@ -96,37 +101,85 @@
<span>添加</span>
</div>
</div>
<div v-else></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="value" placeholder="住户姓名" style="width: 240px">
<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 placeholder="请输入">
<el-input v-model="searchInput" placeholder="请输入">
<template #prefix>
<el-icon><Search /></el-icon>
</template>
</el-input>
<el-button type="primary">查询 </el-button>
<el-button type="primary" @click="handleSearch">查询 </el-button>
<el-button>重置</el-button>
</div>
<div class="tablebox">
<el-table :data="tableData" stripe style="width: 100%">
<el-table-column type="index" :index="indexMethod" label="序号" width="60" align="center" />
<el-table-column prop="date" align="center" label="姓名" width="180" />
<el-table-column prop="date" align="center" label="类型" width="180" />
<el-table-column prop="date" align="center" label="状态" width="180" />
<el-table-column prop="date" align="center" label="证件号码" />
<el-table-column prop="date" align="center" label="手机号" />
<el-table-column prop="name" align="center" label="房间" />
<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>
@@ -137,6 +190,7 @@
</el-table>
<pagination
v-show="total > 0"
:background="false"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@@ -147,37 +201,34 @@
</el-col>
</el-row>
</div>
</div>
</template>
<script lang="ts" setup>
import summicon from '@/assets/images/index/summer.png';
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([
{
name: '住户总数量',
value: 10000
},
{
name: '房屋总数量',
value: 458
},
{
name: '车位总数量',
value: 2539
},
{
name: '设备总数量',
value: 22
},
{
name: '物料总数量',
value: 458
},
{
name: '投诉总数量',
value: 458
}
{ name: '住户总数量', value: 10000, icon: icon1 },
{ name: '房屋总数量', value: 458, icon: icon2 },
{ name: '车位总数量', value: 2539, icon: icon3 },
{ name: '设备总数量', value: 22, icon: icon5 },
{ name: '物料总数量', value: 458, icon: icon6 },
{ name: '投诉总数量', value: 458, icon: icon6 }
]);
// ! echarts 切换
const active_index = ref(0);
const actions = ref([
{
@@ -193,13 +244,13 @@ const actions = ref([
function changeActive_index(val: number) {
active_index.value = val;
}
// ! echarts 切换
// ! 侧边栏
const Sideactive = ref(1);
function handleSelect(val: number) {
Sideactive.value = val;
console.log(Sideactive.value);
}
// ! 侧边栏
// ! 快捷入口
const quickBox = ref([
{
@@ -227,21 +278,33 @@ const quickBox = ref([
url: '/repair/visitorList'
}
]);
const router = useRouter();
function handleRouter(val: string) {
router.push({
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 data = reactive({
queryParams: {
villageId: Number(localStorage.getItem('villageid')),
pageNum: 1,
pageSize: 10
}
@@ -253,54 +316,42 @@ const indexMethod = (index) => {
};
const options = [
{
value: 'Option1',
value: 'name',
label: '住户姓名'
},
{
value: 'Option2',
value: 'phone',
label: '住户手机号'
},
{
value: 'Option3',
value: 'idCard',
label: '住户身份证'
}
];
function getList() {}
const tableData = ref([
{
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'
}
]);
function handleSearch() {
queryParams[seachervalue.value] = searchInput.value;
getList();
}
const tableData = ref([]);
async function getList() {
const res = await listResident(queryParams.value);
tableData.value = res.rows;
}
getList();
// ! table
</script>
<style scoped lang="scss">
.workBenchBox {
padding: 20px;
background-color: #eaf2ff;
// 小区概况
.villageBox {
height: 198px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, #ffffff 70%);
border-radius: 16px 16px 16px 16px;
border: 2px solid #ffffff;
padding: 20px;
margin-bottom: 20px;
margin-bottom: 10px;
.title {
height: 25px;
font-weight: 500;
@@ -313,15 +364,19 @@ const tableData = ref([
display: flex;
align-items: center;
justify-content: space-around;
flex-wrap: wrap; /* 自动换行 */
gap: 16px;
.village_items {
margin-right: 20px;
min-width: 185px;
height: 109px;
flex: 1;
min-width: 160px; /* 小屏自动单列 */
margin-right: 10px;
min-height: 109px;
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);
border-radius: 8px 8px 8px 8px;
border: 1px solid #ffffff;
padding: 30px 20px;
padding-left: 20px;
display: flex;
align-items: center;
.icon {
@@ -332,11 +387,14 @@ const tableData = ref([
border-radius: 10px 10px 10px 10px;
border: 1px solid #ffffff;
margin-right: 15px;
.el-image {
width: 100%;
height: 100%;
}
}
.infobox {
margin-right: 20px;
.infoTitle {
width: 70px;
height: 18px;
font-weight: 400;
font-size: 14px;
@@ -344,7 +402,6 @@ const tableData = ref([
line-height: 18px;
}
.infoNum {
width: 87px;
height: 35px;
font-weight: 600;
font-size: 28px;
@@ -358,10 +415,11 @@ const tableData = ref([
// echarts
.echartsbox {
height: inherit;
.echarts {
margin-right: 20px;
flex: 1;
height: 425px;
height: 450px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, #ffffff 70%);
border: 2px solid #ffffff;
border-radius: 12px;
@@ -469,7 +527,6 @@ const tableData = ref([
// tabs
.tabsbox {
margin-left: 20px;
height: 497px;
border: 2px solid;
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;
@@ -478,7 +535,7 @@ const tableData = ref([
align-items: center;
div {
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;
text-align: center;
padding: 14px;
@@ -497,7 +554,7 @@ const tableData = ref([
position: absolute;
right: 10px;
top: 0;
width: $width / 2;
width: calc($width / 2);
height: 100%;
transform: skew(30deg);
background: white;
@@ -529,7 +586,7 @@ const tableData = ref([
position: absolute;
left: 10px;
top: 0;
width: $width / 2;
width: calc($width / 2);
height: 100%;
transform: skew(-30deg);
background: white;
@@ -576,12 +633,17 @@ const tableData = ref([
.body {
font-size: 16px;
color: #222222;
padding: 30px;
padding: 20px;
.quicly_box {
display: grid;
grid-template-columns: repeat(3, 1fr);
display: flex;
align-items: center;
justify-content: start;
flex-wrap: wrap;
gap: 10px;
.quickly_item {
width: 125px;
min-width: 30%;
max-width: 33%;
margin-bottom: 20px;
height: 56px;
background: #ffffff;
@@ -590,6 +652,10 @@ const tableData = ref([
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
&:hover {
background-color: #0084ff09;
}
.quickly_item_content {
margin-left: 5px;
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 {
border-radius: 10px;
padding: 20px;
height: 550px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.2) 0%, #ffffff 70%);
border: 2px solid #ffffff;
display: flex;
flex-direction: column;
.title {
margin-bottom: 15px;
margin-bottom: 10px;
}
.searbox {
height: 35px;
@@ -631,7 +727,7 @@ const tableData = ref([
font-size: 16px;
display: flex;
align-items: center;
margin-bottom: 30px;
margin-bottom: 20px;
div {
width: 70px;
margin-right: 20px;

View File

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