9/10
This commit is contained in:
@@ -9,9 +9,9 @@ VITE_APP_ENV='development'
|
|||||||
# 开发环境
|
# 开发环境
|
||||||
VITE_APP_BASE_API='/dev-api'
|
VITE_APP_BASE_API='/dev-api'
|
||||||
# # 开发环境 接口代理地址
|
# # 开发环境 接口代理地址
|
||||||
#VITE_APP_PROXY_API='http://192.168.1.222:8080'
|
VITE_APP_PROXY_API='http://192.168.1.222:8080'
|
||||||
# 开发环境 接口代理地址
|
# 开发环境 接口代理地址
|
||||||
VITE_APP_PROXY_API='http://192.168.1.6:8080'
|
#VITE_APP_PROXY_API='http://192.168.1.6:8080'
|
||||||
# 图片基础地址
|
# 图片基础地址
|
||||||
VITE_IMG_URL='http://192.168.1.222:8080'
|
VITE_IMG_URL='http://192.168.1.222:8080'
|
||||||
|
|
||||||
|
|||||||
@@ -82,8 +82,8 @@ export interface RecordQuery extends PageQuery {
|
|||||||
*/
|
*/
|
||||||
taskName?: string;
|
taskName?: string;
|
||||||
|
|
||||||
taskTimeBegin?: '';
|
taskTimeBegin?: string;
|
||||||
taskTimeEnd?: '';
|
taskTimeEnd?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DetailsVo {
|
export interface DetailsVo {
|
||||||
|
|||||||
@@ -84,9 +84,11 @@ export const billPrint = (data: { 'detailsIds': string[]; 'residentId': string }
|
|||||||
export const getAllAccount = (
|
export const getAllAccount = (
|
||||||
data = {}
|
data = {}
|
||||||
): AxiosPromise<{
|
): AxiosPromise<{
|
||||||
/** 总金额 */
|
/** 原始金额之和(应收+优惠) */
|
||||||
|
originalAmount: string;
|
||||||
|
/** 总 应收金额 */
|
||||||
'receivableAmount': string;
|
'receivableAmount': string;
|
||||||
/** 总实收金额 */
|
/** 总已收金额 */
|
||||||
'receivedAmount': string;
|
'receivedAmount': string;
|
||||||
/** 总优惠金额 */
|
/** 总优惠金额 */
|
||||||
'discountAmount': string;
|
'discountAmount': string;
|
||||||
|
|||||||
@@ -96,3 +96,63 @@ export const ElectricityDeviceUnbind = (deviceCode: string) => {
|
|||||||
method: 'PUT'
|
method: 'PUT'
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* 充值
|
||||||
|
*/
|
||||||
|
export const ElectricityDeviceRecharge = (data: { 'deviceCode': string; 'amount': number }) => {
|
||||||
|
return request({
|
||||||
|
url: '/electricityDevice/recharge',
|
||||||
|
method: 'POST',
|
||||||
|
data
|
||||||
|
});
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* 设置电表价格
|
||||||
|
*/
|
||||||
|
export const setElectricityDevicePrice = (data: { 'deviceCode': string; 'price': number }) => {
|
||||||
|
return request({
|
||||||
|
url: '/electricityDevice/setPrice',
|
||||||
|
method: 'POST',
|
||||||
|
data
|
||||||
|
});
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* 设置电表开关状态
|
||||||
|
*/
|
||||||
|
export const setElectricityDeviceSwitchStatus = (data: { 'deviceCode': string; 'status': number }) => {
|
||||||
|
return request({
|
||||||
|
url: '/electricityDevice/controlSwitch',
|
||||||
|
method: 'POST',
|
||||||
|
data
|
||||||
|
});
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* 电表数据上传
|
||||||
|
*/
|
||||||
|
export const updateElectricityDeviceData = (data: { 'deviceCode': string }) => {
|
||||||
|
return request({
|
||||||
|
url: '/electricityDevice/triggerReport',
|
||||||
|
method: 'POST',
|
||||||
|
data
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上传电表设备
|
||||||
|
*/
|
||||||
|
export const uploadElectricityDevices = (data: FormData) => {
|
||||||
|
return request({
|
||||||
|
url: '/electricityDevice/importData',
|
||||||
|
method: 'POST',
|
||||||
|
data
|
||||||
|
});
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* 获取模板设备
|
||||||
|
*/
|
||||||
|
export const getElectricityDeviceFormartValue = () => {
|
||||||
|
return request({
|
||||||
|
url: '/electricityDevice/importTemplate',
|
||||||
|
method: 'POST'
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
@@ -25,11 +25,30 @@ export interface ElectricityDeviceVO {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
url: string;
|
url: string;
|
||||||
|
/**
|
||||||
|
* 电价
|
||||||
|
*/
|
||||||
|
price: number | null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
openid: string;
|
openid: string;
|
||||||
|
|
||||||
|
electricityRecord?: {
|
||||||
|
'id': string;
|
||||||
|
'deviceCode': string;
|
||||||
|
'totalEnergy': string;
|
||||||
|
'readTime': string;
|
||||||
|
'balance': string;
|
||||||
|
'status': number;
|
||||||
|
'event': string;
|
||||||
|
'rangeTime': string;
|
||||||
|
'rangeFee': number;
|
||||||
|
'price': number | null;
|
||||||
|
'type': number | null;
|
||||||
|
'updateTime': string | null;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ElectricityDeviceForm extends BaseEntity {
|
export interface ElectricityDeviceForm extends BaseEntity {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ export interface MaterialVO {
|
|||||||
* 规格型号*
|
* 规格型号*
|
||||||
*/
|
*/
|
||||||
model: string;
|
model: string;
|
||||||
|
villageId: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计量单位
|
* 计量单位
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export type Datum = {
|
|||||||
houseName: string;
|
houseName: string;
|
||||||
payTime: string;
|
payTime: string;
|
||||||
propertyOffsetAmount: string;
|
propertyOffsetAmount: string;
|
||||||
remark: null;
|
remark: string;
|
||||||
residentName: string;
|
residentName: string;
|
||||||
transferAmount: string;
|
transferAmount: string;
|
||||||
unionPayAmount: string;
|
unionPayAmount: string;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import request from '@/utils/request';
|
import request from '@/utils/request';
|
||||||
|
import { AxiosPromise } from 'axios';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询小区概况
|
* 查询小区概况
|
||||||
@@ -335,7 +336,16 @@ type LifeIndices = {
|
|||||||
* 查询 快捷入口
|
* 查询 快捷入口
|
||||||
* @returns {*}
|
* @returns {*}
|
||||||
*/
|
*/
|
||||||
export const getQuicklyshortcut = (query?: {}) => {
|
export const getQuicklyshortcut = (query?: {}): AxiosPromise<
|
||||||
|
{
|
||||||
|
id: string;
|
||||||
|
menuId: string;
|
||||||
|
menuName: string;
|
||||||
|
menuPath: string;
|
||||||
|
menuIcon: string;
|
||||||
|
sortOrder: number;
|
||||||
|
}[]
|
||||||
|
> => {
|
||||||
return request({
|
return request({
|
||||||
url: '/workSpace/shortcut/list',
|
url: '/workSpace/shortcut/list',
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
|
|||||||
@@ -273,7 +273,6 @@ defineExpose({
|
|||||||
parkingId: id
|
parkingId: id
|
||||||
}) as BillUserlist
|
}) as BillUserlist
|
||||||
);
|
);
|
||||||
console.log(multipleSelection.value);
|
|
||||||
} else {
|
} else {
|
||||||
multipleSelection.value = [];
|
multipleSelection.value = [];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -222,7 +222,6 @@ function handleSelectionChange(selection: tableType[]) {
|
|||||||
const uniqueMap = new Map();
|
const uniqueMap = new Map();
|
||||||
finalSelection.forEach((item) => uniqueMap.set(item.id, item));
|
finalSelection.forEach((item) => uniqueMap.set(item.id, item));
|
||||||
multipleSelection.value = Array.from(uniqueMap.values());
|
multipleSelection.value = Array.from(uniqueMap.values());
|
||||||
console.log(multipleSelection.value.map((item) => item.id));
|
|
||||||
} else {
|
} else {
|
||||||
// --- 单选逻辑 ---
|
// --- 单选逻辑 ---
|
||||||
if (selection.length > 0) {
|
if (selection.length > 0) {
|
||||||
|
|||||||
@@ -301,7 +301,6 @@ defineExpose({
|
|||||||
...queryParams.value,
|
...queryParams.value,
|
||||||
...params
|
...params
|
||||||
};
|
};
|
||||||
console.log(queryParams.value);
|
|
||||||
getList();
|
getList();
|
||||||
dialog.value.dialogVisible = true;
|
dialog.value.dialogVisible = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
<el-table-column align="center" label="品牌" prop="brand" />
|
<el-table-column align="center" label="品牌" prop="brand" />
|
||||||
<el-table-column align="center" label="规格型号" prop="model" />
|
<el-table-column align="center" label="规格型号" prop="model" />
|
||||||
<el-table-column align="center" label="单位" prop="unit" />
|
<el-table-column align="center" label="单位" prop="unit" />
|
||||||
|
<el-table-column v-if="!isHidden" align="center" label="数量" prop="stockNum" />
|
||||||
<el-table-column align="center" label="备注" prop="remark" />
|
<el-table-column align="center" label="备注" prop="remark" />
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
@@ -77,6 +78,10 @@ const props = defineProps({
|
|||||||
isMultiple: {
|
isMultiple: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
|
},
|
||||||
|
isHidden: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -236,8 +236,6 @@ function handleSelectionChange(selection: tableType[]) {
|
|||||||
multipleSelection.value = [];
|
multipleSelection.value = [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('handleSelectionChange', selection);
|
|
||||||
}
|
}
|
||||||
// 重置查询
|
// 重置查询
|
||||||
function resetQuery() {
|
function resetQuery() {
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ const currentYear = ref(initYear);
|
|||||||
// 输入框展示文本
|
// 输入框展示文本
|
||||||
const displayText = computed(() => {
|
const displayText = computed(() => {
|
||||||
if (!props.modelValue) return '';
|
if (!props.modelValue) return '';
|
||||||
console.log(props.modelValue, props.modelValue.trim().split('-'));
|
|
||||||
const [y, q] = props.modelValue.split('-').map(Number);
|
const [y, q] = props.modelValue.split('-').map(Number);
|
||||||
return `${y}年${q}季度`;
|
return `${y}年${q}季度`;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,10 +2,11 @@
|
|||||||
<div v-if="!item.hidden">
|
<div v-if="!item.hidden">
|
||||||
<template v-if="hasOneShowingChild(item, item.children) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow">
|
<template v-if="hasOneShowingChild(item, item.children) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow">
|
||||||
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)">
|
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)">
|
||||||
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
|
<el-menu-item :class="{ 'submenu-title-noDropdown': !isNest }" :index="resolvePath(onlyOneChild.path)">
|
||||||
<svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" />
|
<svg-icon v-if="onlyOneChild.path === '/index'" :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" />
|
||||||
|
<div v-else style="margin-right: 14px; width: 14px"></div>
|
||||||
<template #title>
|
<template #title>
|
||||||
<span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span>
|
<span :title="hasTitle(onlyOneChild.meta.title)" class="menu-title">{{ onlyOneChild.meta.title }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-menu-item>
|
</el-menu-item>
|
||||||
</app-link>
|
</app-link>
|
||||||
@@ -14,22 +15,22 @@
|
|||||||
<el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported>
|
<el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported>
|
||||||
<template v-if="item.meta" #title>
|
<template v-if="item.meta" #title>
|
||||||
<svg-icon :icon-class="item.meta ? item.meta.icon : ''" />
|
<svg-icon :icon-class="item.meta ? item.meta.icon : ''" />
|
||||||
<span class="menu-title" :title="hasTitle(item.meta?.title)">{{ item.meta?.title }}</span>
|
<span :title="hasTitle(item.meta?.title)" class="menu-title">{{ item.meta?.title }}</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<sidebar-item
|
<sidebar-item
|
||||||
v-for="(child, index) in item.children"
|
v-for="(child, index) in item.children"
|
||||||
:key="child.path + index"
|
:key="child.path + index"
|
||||||
|
:base-path="resolvePath(child.path)"
|
||||||
:is-nest="true"
|
:is-nest="true"
|
||||||
:item="child"
|
:item="child"
|
||||||
:base-path="resolvePath(child.path)"
|
|
||||||
class="nest-menu"
|
class="nest-menu"
|
||||||
/>
|
/>
|
||||||
</el-sub-menu>
|
</el-sub-menu>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { isExternal } from '@/utils/validate';
|
import { isExternal } from '@/utils/validate';
|
||||||
import AppLink from './Link.vue';
|
import AppLink from './Link.vue';
|
||||||
import { getNormalPath } from '@/utils/ruoyi';
|
import { getNormalPath } from '@/utils/ruoyi';
|
||||||
@@ -49,9 +50,7 @@ const props = defineProps({
|
|||||||
default: ''
|
default: ''
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const onlyOneChild = ref<any>({});
|
const onlyOneChild = ref<any>({});
|
||||||
|
|
||||||
const hasOneShowingChild = (parent: RouteRecordRaw, children?: RouteRecordRaw[]) => {
|
const hasOneShowingChild = (parent: RouteRecordRaw, children?: RouteRecordRaw[]) => {
|
||||||
if (!children) {
|
if (!children) {
|
||||||
children = [];
|
children = [];
|
||||||
|
|||||||
@@ -205,7 +205,6 @@ export const useHouseStore = defineStore(
|
|||||||
floorslist.value.add(floor.floorNo);
|
floorslist.value.add(floor.floorNo);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
console.log(units);
|
|
||||||
return;
|
return;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
66
src/utils/html.ts
Normal file
66
src/utils/html.ts
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
/**
|
||||||
|
* 剥离 HTML 标签,提取纯文本
|
||||||
|
* - 自动将 <img>/<video>/<audio> 替换为 [图片]/[视频]/[音频] 占位
|
||||||
|
* - 自动解码 & 等 HTML entity
|
||||||
|
* - 自动合并多余空白
|
||||||
|
* - 可按需截断
|
||||||
|
*/
|
||||||
|
export function stripHtml(html: string | null | undefined, maxLen?: number): string {
|
||||||
|
if (!html) return '';
|
||||||
|
|
||||||
|
let text: string = html;
|
||||||
|
|
||||||
|
// 1. 媒体标签替换为占位符(保留语义提示)
|
||||||
|
text = text
|
||||||
|
.replace(/<img[^>]*>/gi, '[图片]')
|
||||||
|
.replace(/<video[^>]*>.*?<\/video>/gi, '[视频]')
|
||||||
|
.replace(/<audio[^>]*>.*?<\/audio>/gi, '[音频]')
|
||||||
|
.replace(/<iframe[^>]*>.*?<\/iframe>/gi, '[嵌入内容]');
|
||||||
|
|
||||||
|
// 2. 剥离所有剩余 HTML 标签(<p> <br> <div> ...)
|
||||||
|
text = text.replace(/<[^>]+>/g, '');
|
||||||
|
|
||||||
|
// 3. HTML entity 解码
|
||||||
|
text = decodeHtmlEntity(text);
|
||||||
|
|
||||||
|
// 4. 合并多余空白(多个空格/换行 → 单个空格)
|
||||||
|
text = text.replace(/\s+/g, ' ').trim();
|
||||||
|
|
||||||
|
// 5. 截断
|
||||||
|
if (maxLen && text.length > maxLen) {
|
||||||
|
text = text.slice(0, maxLen) + '...';
|
||||||
|
}
|
||||||
|
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解码 HTML 实体
|
||||||
|
* 浏览器环境用 DOMParser,非浏览器环境用正则 fallback
|
||||||
|
*/
|
||||||
|
function decodeHtmlEntity(str: string): string {
|
||||||
|
if (typeof DOMParser === 'undefined') {
|
||||||
|
const entityMap: Record<string, string> = {
|
||||||
|
' ': ' ',
|
||||||
|
'&': '&',
|
||||||
|
'<': '<',
|
||||||
|
'>': '>',
|
||||||
|
'"': '"',
|
||||||
|
''': "'",
|
||||||
|
''': "'",
|
||||||
|
'/': '/',
|
||||||
|
'©': '©',
|
||||||
|
'®': '®'
|
||||||
|
};
|
||||||
|
return str.replace(/&[a-z]+;|&#\d+;|&#x[0-9a-f]+;/gi, (match) => {
|
||||||
|
if (entityMap[match]) return entityMap[match];
|
||||||
|
const num = match.match(/&#(\d+);/)?.[1];
|
||||||
|
if (num) return String.fromCharCode(Number(num));
|
||||||
|
const hex = match.match(/&#x([0-9a-f]+);/i)?.[1];
|
||||||
|
if (hex) return String.fromCharCode(parseInt(hex, 16));
|
||||||
|
return match;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const doc = new DOMParser().parseFromString(str, 'text/html');
|
||||||
|
return doc.documentElement.textContent ?? '';
|
||||||
|
}
|
||||||
@@ -52,7 +52,10 @@ const whiteVillageId = [
|
|||||||
'/paidInExpenses/*',
|
'/paidInExpenses/*',
|
||||||
// 租赁管理明细
|
// 租赁管理明细
|
||||||
'/leaseManagementDetail/*',
|
'/leaseManagementDetail/*',
|
||||||
'/warehouse/*'
|
'/warehouse/*',
|
||||||
|
|
||||||
|
// 电表启停
|
||||||
|
'/electricityDevice/controlSwitch'
|
||||||
// '/building/list'
|
// '/building/list'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -26,18 +26,61 @@ export const initSSE = (url: any) => {
|
|||||||
|
|
||||||
watch(data, () => {
|
watch(data, () => {
|
||||||
if (!data.value) return;
|
if (!data.value) return;
|
||||||
const notice = JSON.parse(data.value);
|
const notice = tryParseJson(data.value);
|
||||||
|
if (typeof notice === 'string') {
|
||||||
useNoticeStore().addNotice({
|
useNoticeStore().addNotice({
|
||||||
message: notice.message,
|
message: notice,
|
||||||
read: false,
|
read: false,
|
||||||
time: new Date().toLocaleString()
|
time: new Date().toLocaleString()
|
||||||
});
|
});
|
||||||
ElNotification({
|
ElNotification({
|
||||||
title: notice.title,
|
title: '消息',
|
||||||
message: notice.message,
|
message: notice,
|
||||||
type: notice.type,
|
type: 'success',
|
||||||
duration: 3000
|
duration: 3000
|
||||||
});
|
});
|
||||||
data.value = null;
|
data.value = null;
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
// 此处 notice 类型为 Record<string, unknown>,安全取出属性
|
||||||
|
const title = typeof notice.title === 'string' ? notice.title : '消息';
|
||||||
|
const message = typeof notice.message === 'string' ? notice.message : '';
|
||||||
|
const type = typeof notice.type === 'string' ? notice.type : 'info';
|
||||||
|
useNoticeStore().addNotice({
|
||||||
|
message,
|
||||||
|
read: false,
|
||||||
|
time: new Date().toLocaleString()
|
||||||
|
});
|
||||||
|
ElNotification({
|
||||||
|
title,
|
||||||
|
message,
|
||||||
|
type: type as 'success' | 'warning' | 'info' | 'error',
|
||||||
|
duration: 3000
|
||||||
|
});
|
||||||
|
data.value = null;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 尝试解析后端返回的字符串
|
||||||
|
* 如果是合法JSON对象 → 返回 Record<string, unknown>
|
||||||
|
* 否则(数组/null/基础值/非JSON字符串) → 返回原字符串
|
||||||
|
* @param str 后端传过来的字符串
|
||||||
|
*/
|
||||||
|
function tryParseJson(str: string): string | Record<string, unknown> {
|
||||||
|
if (typeof str !== 'string' || str === '') return str;
|
||||||
|
|
||||||
|
const trimStr = str.trim();
|
||||||
|
if (trimStr === '') return str;
|
||||||
|
try {
|
||||||
|
const parsed = JSON.parse(trimStr);
|
||||||
|
// 只有"纯对象"才返回对象,数组/null/基础值等统一当作字符串处理
|
||||||
|
if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
||||||
|
return parsed as Record<string, unknown>;
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
} catch {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,10 +18,22 @@ export type ColumnConfig = {
|
|||||||
*/
|
*/
|
||||||
export type SpanMethodCallback = (params: { row: any; rowIndex: number; columnIndex: number }) => { rowspan: number; colspan: number };
|
export type SpanMethodCallback = (params: { row: any; rowIndex: number; columnIndex: number }) => { rowspan: number; colspan: number };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 行样式回调函数类型
|
||||||
|
* 返回的样式会 merge 到该行所有单元格上
|
||||||
|
*/
|
||||||
|
export type RowStyleCallback = (params: { row: any; rowIndex: number }) => Partial<XLSX.CellStyle> | undefined;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 前端导出Excel(支持多级表头)
|
* 前端导出Excel(支持多级表头)
|
||||||
*/
|
*/
|
||||||
export function exportToExcel(data: any[], columns: ColumnConfig[], filename: string, spanMethod?: SpanMethodCallback) {
|
export function exportToExcel(
|
||||||
|
data: any[],
|
||||||
|
columns: ColumnConfig[],
|
||||||
|
filename: string,
|
||||||
|
spanMethod?: SpanMethodCallback,
|
||||||
|
rowStyleCallback?: RowStyleCallback
|
||||||
|
) {
|
||||||
if (!data || data.length === 0) {
|
if (!data || data.length === 0) {
|
||||||
ElMessage.warning('没有可导出的数据');
|
ElMessage.warning('没有可导出的数据');
|
||||||
return;
|
return;
|
||||||
@@ -80,27 +92,35 @@ export function exportToExcel(data: any[], columns: ColumnConfig[], filename: st
|
|||||||
worksheet[cellAddress] = { t: 's', v: '' };
|
worksheet[cellAddress] = { t: 's', v: '' };
|
||||||
}
|
}
|
||||||
const isHeader = R < headerRows;
|
const isHeader = R < headerRows;
|
||||||
|
const dataRowIndex = R - headerRows;
|
||||||
|
// 用户自定义的行样式(仅对数据行生效)
|
||||||
|
const customRowStyle =
|
||||||
|
!isHeader && rowStyleCallback && dataRowIndex >= 0 ? rowStyleCallback({ row: data[dataRowIndex], rowIndex: dataRowIndex }) : undefined;
|
||||||
worksheet[cellAddress].s = {
|
worksheet[cellAddress].s = {
|
||||||
fill: isHeader
|
fill:
|
||||||
|
customRowStyle?.fill ??
|
||||||
|
(isHeader
|
||||||
? {
|
? {
|
||||||
fgColor: { rgb: 'bec4cb' },
|
fgColor: { rgb: 'bec4cb' },
|
||||||
patternType: 'solid'
|
patternType: 'solid'
|
||||||
}
|
}
|
||||||
: undefined,
|
: undefined),
|
||||||
font: isHeader
|
font:
|
||||||
|
customRowStyle?.font ??
|
||||||
|
(isHeader
|
||||||
? {
|
? {
|
||||||
color: { rgb: 'FFFFFF' },
|
color: { rgb: 'FFFFFF' },
|
||||||
bold: true,
|
bold: true,
|
||||||
sz: 11
|
sz: 11
|
||||||
}
|
}
|
||||||
: undefined,
|
: undefined),
|
||||||
border: {
|
border: customRowStyle?.border ?? {
|
||||||
top: { style: 'thin', color: { rgb: '000000' } },
|
top: { style: 'thin', color: { rgb: '000000' } },
|
||||||
bottom: { style: 'thin', color: { rgb: '000000' } },
|
bottom: { style: 'thin', color: { rgb: '000000' } },
|
||||||
left: { style: 'thin', color: { rgb: '000000' } },
|
left: { style: 'thin', color: { rgb: '000000' } },
|
||||||
right: { style: 'thin', color: { rgb: '000000' } }
|
right: { style: 'thin', color: { rgb: '000000' } }
|
||||||
},
|
},
|
||||||
alignment: {
|
alignment: customRowStyle?.alignment ?? {
|
||||||
horizontal: 'center',
|
horizontal: 'center',
|
||||||
vertical: 'center'
|
vertical: 'center'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,11 +24,11 @@
|
|||||||
<el-form-item label="建成时间" prop="buildingArea">
|
<el-form-item label="建成时间" prop="buildingArea">
|
||||||
<el-date-picker v-model="builtTime" placeholder="选择建成时间" type="date" value-format="YYYY-MM-DD" @change="changeBuiltTime" />
|
<el-date-picker v-model="builtTime" placeholder="选择建成时间" type="date" value-format="YYYY-MM-DD" @change="changeBuiltTime" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="房屋用途" prop="buildingArea">
|
<!-- <el-form-item label="房屋用途" prop="houseUse">-->
|
||||||
<el-select v-model="form.houseUse" placeholder="请选择房屋用途" style="width: 240px">
|
<!-- <el-select v-model="form.houseUse" placeholder="请选择房屋用途" style="width: 240px">-->
|
||||||
<el-option v-for="item in houseUserList" :key="item.value" :label="item.label" :value="item.value" />
|
<!-- <el-option v-for="item in houseUserList" :key="item.id" :label="item.name" :value="item.id" />-->
|
||||||
</el-select>
|
<!-- </el-select>-->
|
||||||
</el-form-item>
|
<!-- </el-form-item>-->
|
||||||
<el-form-item label="小区面积" prop="villageArea">
|
<el-form-item label="小区面积" prop="villageArea">
|
||||||
<el-input v-model.trim="form.villageArea" maxlength="8" placeholder="请输入小区面积"><template #append>㎡</template> </el-input>
|
<el-input v-model.trim="form.villageArea" maxlength="8" placeholder="请输入小区面积"><template #append>㎡</template> </el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -106,6 +106,7 @@ import { CascaderValue } from 'element-plus';
|
|||||||
import { addVillageAPI, editVillageAPI, getVillageByIdAPI, uploadVillageImageAPI } from '@/api/system/community';
|
import { addVillageAPI, editVillageAPI, getVillageByIdAPI, uploadVillageImageAPI } from '@/api/system/community';
|
||||||
import { communitylist_rows_type } from '@/api/system/community/type';
|
import { communitylist_rows_type } from '@/api/system/community/type';
|
||||||
import { Delete, Plus } from '@element-plus/icons-vue';
|
import { Delete, Plus } from '@element-plus/icons-vue';
|
||||||
|
import { listHouseUseType_add_house } from '@/api/system/houseUse';
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -116,24 +117,7 @@ const uploadFileUrl = `${apiPrefix}/village/uploadImages`;
|
|||||||
// 获取省 市 区╬╬╬╬╬╬╬
|
// 获取省 市 区╬╬╬╬╬╬╬
|
||||||
const pcaTextArrList = ref<DataItem[]>(pcaTextArr);
|
const pcaTextArrList = ref<DataItem[]>(pcaTextArr);
|
||||||
// 获取小区用途
|
// 获取小区用途
|
||||||
const houseUserList = ref([
|
const houseUserList = ref([]);
|
||||||
{
|
|
||||||
value: 0,
|
|
||||||
label: '住宅'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 1,
|
|
||||||
label: '商住两用'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 2,
|
|
||||||
label: '商业'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 3,
|
|
||||||
label: '办公'
|
|
||||||
}
|
|
||||||
]);
|
|
||||||
const formRef = ref();
|
const formRef = ref();
|
||||||
const uploadRef = ref();
|
const uploadRef = ref();
|
||||||
|
|
||||||
@@ -420,7 +404,6 @@ const submitForm = () => {
|
|||||||
// 3) 有新文件:先上传新文件,再与已有URL合并
|
// 3) 有新文件:先上传新文件,再与已有URL合并
|
||||||
const formdata = new FormData();
|
const formdata = new FormData();
|
||||||
newFiles.forEach((file) => formdata.append('files', file));
|
newFiles.forEach((file) => formdata.append('files', file));
|
||||||
console.log('newFiles', newFiles);
|
|
||||||
uploadVillageImageAPI(formdata).then((res) => {
|
uploadVillageImageAPI(formdata).then((res) => {
|
||||||
const uploadedUrls = res.data.success.map((x) => x.url).filter(Boolean);
|
const uploadedUrls = res.data.success.map((x) => x.url).filter(Boolean);
|
||||||
// 4) 最终图片 = 已有图片 + 新上传图片(避免覆盖)
|
// 4) 最终图片 = 已有图片 + 新上传图片(避免覆盖)
|
||||||
@@ -473,13 +456,21 @@ function submitFormInfo() {
|
|||||||
const cancelForm = () => {
|
const cancelForm = () => {
|
||||||
router.back();
|
router.back();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 获取房屋用途
|
||||||
|
const getHouseUserList = () => {
|
||||||
|
listHouseUseType_add_house().then((res) => {
|
||||||
|
houseUserList.value = res.data;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
getHouseUserList();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.box {
|
.box {
|
||||||
background: #deedff;
|
background: #deedff;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow: hidden;
|
overflow: auto;
|
||||||
.header {
|
.header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|||||||
@@ -21,30 +21,6 @@
|
|||||||
<!-- </el-form-item>-->
|
<!-- </el-form-item>-->
|
||||||
<!-- </el-col>-->
|
<!-- </el-col>-->
|
||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<el-form-item label="报名截止日期" prop="applyDeadline">
|
|
||||||
<el-date-picker
|
|
||||||
v-model="deadline"
|
|
||||||
:disabled-date="disabledDate"
|
|
||||||
format="YYYY-MM-DD HH:mm:ss"
|
|
||||||
placeholder="请选择报名截止日期"
|
|
||||||
style="width: 100%"
|
|
||||||
type="datetime"
|
|
||||||
value-format="YYYY-MM-DD HH:mm:ss"
|
|
||||||
@update:model-value="
|
|
||||||
(data) => {
|
|
||||||
if (data) {
|
|
||||||
form.applyDeadline = data;
|
|
||||||
} else {
|
|
||||||
form.applyDeadline = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
<el-row>
|
|
||||||
<el-col :span="13">
|
|
||||||
<el-form-item label="活动时间" prop="startTime">
|
<el-form-item label="活动时间" prop="startTime">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="activityTime"
|
v-model="activityTime"
|
||||||
@@ -69,6 +45,31 @@
|
|||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="13">
|
||||||
|
<el-form-item label="报名截止日期" prop="applyDeadline">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="deadline"
|
||||||
|
:disabled="!Boolean(form.startTime)"
|
||||||
|
:disabled-date="disabledDateDeadline"
|
||||||
|
format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
placeholder="请选择报名截止日期"
|
||||||
|
style="width: 100%"
|
||||||
|
type="datetime"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
@update:model-value="
|
||||||
|
(data) => {
|
||||||
|
if (data) {
|
||||||
|
form.applyDeadline = data;
|
||||||
|
} else {
|
||||||
|
form.applyDeadline = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<el-form-item label="活动地点" prop="address">
|
<el-form-item label="活动地点" prop="address">
|
||||||
<el-input v-model.trim="form.address" maxlength="50" placeholder="请输入活动地点" show-word-limit type="textarea" />
|
<el-input v-model.trim="form.address" maxlength="50" placeholder="请输入活动地点" show-word-limit type="textarea" />
|
||||||
@@ -352,6 +353,11 @@ const disabledDate = (time: string) => {
|
|||||||
const selectDate = new Date(time);
|
const selectDate = new Date(time);
|
||||||
return selectDate.getTime() < today.getTime();
|
return selectDate.getTime() < today.getTime();
|
||||||
};
|
};
|
||||||
|
const disabledDateDeadline = (time: string) => {
|
||||||
|
const today = new Date(form.value.endTime);
|
||||||
|
const selectDate = new Date(time);
|
||||||
|
return selectDate.getTime() > today.getTime();
|
||||||
|
};
|
||||||
function disabledSignInDate(time: string) {
|
function disabledSignInDate(time: string) {
|
||||||
const selectDate = new Date(time);
|
const selectDate = new Date(time);
|
||||||
const today = new Date(form.value.endTime);
|
const today = new Date(form.value.endTime);
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" class="mb8">
|
<el-row :gutter="10" class="mb10">
|
||||||
<right-toolbar
|
<right-toolbar
|
||||||
:disable-delete="multiple"
|
:disable-delete="multiple"
|
||||||
:disable-edit="single"
|
:disable-edit="single"
|
||||||
|
|||||||
@@ -93,7 +93,7 @@
|
|||||||
<el-input v-model.trim="form.handleContent" :rows="5" maxlength="200" show-word-limit type="textarea"></el-input>
|
<el-input v-model.trim="form.handleContent" :rows="5" maxlength="200" show-word-limit type="textarea"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button v-if="form.status !== '0'" type="primary" @click="submitForm">提交</el-button>
|
<el-button v-if="formInfo.status !== '1'" type="primary" @click="submitForm">提交</el-button>
|
||||||
<el-button @click="handleBack">返回</el-button>
|
<el-button @click="handleBack">返回</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|||||||
@@ -4,14 +4,14 @@
|
|||||||
<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">
|
||||||
<el-form ref="queryFormRef" label-width="90px" label-position="left" :model="queryParams" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" label-position="left" label-width="90px">
|
||||||
<el-form-item label="投诉类型" prop="typeId">
|
<el-form-item label="投诉状态" prop="status">
|
||||||
<el-select @clear="handleClear" clearable v-model="queryParams.typeId" placeholder="请选择投诉类型" style="width: 240px">
|
<el-select v-model="queryParams.status" clearable placeholder="请选择投诉状态" style="width: 240px" @clear="handleClear">
|
||||||
<el-option :disabled="item.status === '1'" v-for="item in complainTypeList" :key="item.id" :label="item.name" :value="item.id" />
|
<el-option v-for="item in com_complaint_status" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="投诉人姓名" prop="complaintName">
|
<el-form-item label="投诉人姓名" prop="complaintName">
|
||||||
<el-input v-model="queryParams.complaintName" placeholder="请输入投诉人姓名" clearable @keyup.enter="handleQuery" />
|
<el-input v-model="queryParams.complaintName" clearable placeholder="请输入投诉人姓名" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||||
@@ -22,31 +22,31 @@
|
|||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<el-table v-loading="loading" border :data="complaintList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="complaintList" border @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column label="投诉类型" align="center" prop="typeName" />
|
<el-table-column align="center" label="投诉类型" prop="typeName" />
|
||||||
<el-table-column label="问题描述" show-overflow-tooltip align="center" prop="problemDes" />
|
<el-table-column align="center" label="问题描述" prop="problemDes" show-overflow-tooltip />
|
||||||
<el-table-column label="投诉人姓名" align="center" prop="complaintName" />
|
<el-table-column align="center" label="投诉人姓名" prop="complaintName" />
|
||||||
<el-table-column label="手机号" align="center" prop="phone" />
|
<el-table-column align="center" label="手机号" prop="phone" />
|
||||||
<el-table-column label="投诉时间" align="center" prop="createTime" />
|
<el-table-column align="center" label="投诉时间" prop="createTime" />
|
||||||
<el-table-column label="投诉状态" align="center" prop="status">
|
<el-table-column align="center" label="投诉状态" prop="status">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<dict-tag :options="com_complaint_status" :value="scope.row.status"></dict-tag>
|
<dict-tag :options="com_complaint_status" :value="scope.row.status"></dict-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="处理人" align="center" prop="handleName" />
|
<el-table-column align="center" label="处理人" prop="handleName" />
|
||||||
<el-table-column label="处理描述" show-overflow-tooltip align="center" prop="handleContent" />
|
<el-table-column align="center" label="处理描述" prop="handleContent" show-overflow-tooltip />
|
||||||
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
|
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button link type="primary" @click="handleUpdate(scope.row)" v-has-permi="['complaint:complaint:query']">查看详情</el-button>
|
<el-button v-has-permi="['complaint:complaint:query']" link type="primary" @click="handleUpdate(scope.row)">查看详情</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup name="Complaint" lang="ts">
|
<script lang="ts" name="Complaint" setup>
|
||||||
import { listComplaint } from '@/api/system/Complaint';
|
import { listComplaint } from '@/api/system/Complaint';
|
||||||
import { ComplaintVO, ComplaintQuery, ComplaintForm } from '@/api/system/Complaint/type';
|
import { ComplaintVO, ComplaintQuery, ComplaintForm } from '@/api/system/Complaint/type';
|
||||||
import { listComplaintType } from '@/api/system/ComplainType';
|
import { listComplaintType } from '@/api/system/ComplainType';
|
||||||
@@ -120,9 +120,9 @@ const handleQuery = () => {
|
|||||||
getList();
|
getList();
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 清空投诉类型 */
|
/** 清空投诉状态 */
|
||||||
const handleClear = () => {
|
const handleClear = () => {
|
||||||
queryParams.value.typeId = undefined;
|
queryParams.value.status = undefined;
|
||||||
handleQuery();
|
handleQuery();
|
||||||
};
|
};
|
||||||
/** 重置按钮操作 */
|
/** 重置按钮操作 */
|
||||||
|
|||||||
@@ -46,9 +46,14 @@
|
|||||||
></el-switch>
|
></el-switch>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="添加人" prop="createName" width="180">
|
||||||
|
<template #default="scope">
|
||||||
|
<span>{{ scope.row.createName }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column align="center" label="创建时间" prop="createTime" width="180">
|
<el-table-column align="center" label="创建时间" prop="createTime" width="180">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
|
<span>{{ scope.row.createTime }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作">
|
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作">
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ function handleChange(val: (string | number)[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ! 投诉 ====================================================================================================
|
// ! 投诉 蚱蝉====================================================================================================
|
||||||
function getTree() {
|
function getTree() {
|
||||||
houseStore.getCurrentVilageTreeHouse().then((res) => {
|
houseStore.getCurrentVilageTreeHouse().then((res) => {
|
||||||
treedata.value = res;
|
treedata.value = res;
|
||||||
|
|||||||
@@ -37,7 +37,9 @@
|
|||||||
<el-table-column align="center" type="selection" width="55" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column align="center" label="办事内容" prop="content">
|
<el-table-column align="center" label="办事内容" prop="content">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div class="color-blue moreRowEllipsis" v-html="scope.row.content"></div>
|
<div class="color-blue moreRowEllipsis">
|
||||||
|
{{ stripHtml(scope.row.content) }}
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="求助人" prop="seekName" width="120" />
|
<el-table-column align="center" label="求助人" prop="seekName" width="120" />
|
||||||
@@ -48,7 +50,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="办事地点" prop="handlePosition" />
|
<el-table-column align="center" label="办事地点" prop="handlePosition" />
|
||||||
<el-table-column align="center" label="附属材料" prop="handlePosition" width="100">
|
<el-table-column align="center" label="附属材料" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button v-if="scope.row.handleLogFileList?.length > 0" link type="primary" @click="openDialog(scope.row)">点击查看</el-button>
|
<el-button v-if="scope.row.handleLogFileList?.length > 0" link type="primary" @click="openDialog(scope.row)">点击查看</el-button>
|
||||||
</template>
|
</template>
|
||||||
@@ -86,6 +88,7 @@
|
|||||||
import { listHandleLog, delHandleLog } from '@/api/system/HandleLog';
|
import { listHandleLog, delHandleLog } from '@/api/system/HandleLog';
|
||||||
import { HandleLogVO, HandleLogQuery, HandleLogForm, FileVO } from '@/api/system/HandleLog/type';
|
import { HandleLogVO, HandleLogQuery, HandleLogForm, FileVO } from '@/api/system/HandleLog/type';
|
||||||
import { checkPermi } from '@/utils/permission';
|
import { checkPermi } from '@/utils/permission';
|
||||||
|
import { stripHtml } from '@/utils/html';
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||||
|
|
||||||
|
|||||||
@@ -61,8 +61,9 @@
|
|||||||
<el-card v-else-if="activeTab == 'detail'">
|
<el-card v-else-if="activeTab == 'detail'">
|
||||||
<div>
|
<div>
|
||||||
<el-table :data="list" style="width: 100%">
|
<el-table :data="list" style="width: 100%">
|
||||||
|
<el-table-column type="index" />
|
||||||
<el-table-column label="答题人" prop="answerName" />
|
<el-table-column label="答题人" prop="answerName" />
|
||||||
<el-table-column label="提交时间" prop="type" />
|
<el-table-column label="提交时间" prop="updateTime" />
|
||||||
<el-table-column label="操作" prop="options">
|
<el-table-column label="操作" prop="options">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button link type="primary" @click="handleGetMain(scope.row.id)">查看详情</el-button>
|
<el-button link type="primary" @click="handleGetMain(scope.row.id)">查看详情</el-button>
|
||||||
@@ -261,6 +262,7 @@ function handleGetMain(id: string) {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
letter-spacing: 3px;
|
letter-spacing: 3px;
|
||||||
|
font-size: 16px;
|
||||||
&:hover {
|
&:hover {
|
||||||
color: #409eff;
|
color: #409eff;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,20 +4,20 @@
|
|||||||
<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">
|
||||||
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
|
||||||
<el-form-item label="报修状态" prop="problemStatus">
|
<el-form-item label="报修状态" prop="problemStatus">
|
||||||
<el-select v-model="queryParams.problemStatus" placeholder="请选择" clearable>
|
<el-select v-model="queryParams.problemStatus" clearable placeholder="请选择">
|
||||||
<el-option v-for="dict in com_repair_status" :key="dict.value" :label="dict.label" :value="dict.value" />
|
<el-option v-for="dict in com_repair_status" :key="dict.value" :label="dict.label" :value="dict.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="预约日期" prop="maintenanceItemId">
|
<el-form-item label="预约日期" prop="maintenanceItemId">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
clearable
|
|
||||||
v-model="queryParams.orderDate"
|
v-model="queryParams.orderDate"
|
||||||
|
clearable
|
||||||
|
format="YYYY-MM-DD"
|
||||||
placeholder="请选择"
|
placeholder="请选择"
|
||||||
type="date"
|
type="date"
|
||||||
value-format="YYYY-MM-DD"
|
value-format="YYYY-MM-DD"
|
||||||
format="YYYY-MM-DD"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
@@ -36,58 +36,58 @@
|
|||||||
:disable-delete="multiple"
|
:disable-delete="multiple"
|
||||||
:disable-edit="single"
|
:disable-edit="single"
|
||||||
:show-add="checkPermi(['repair:repair:add'])"
|
:show-add="checkPermi(['repair:repair:add'])"
|
||||||
:show-edit="checkPermi(['repair:repair:edit'])"
|
|
||||||
:show-delete="checkPermi(['repair:repair:remove'])"
|
:show-delete="checkPermi(['repair:repair:remove'])"
|
||||||
|
:show-edit="checkPermi(['repair:repair:edit'])"
|
||||||
add-title="个人报修"
|
add-title="个人报修"
|
||||||
@update:add="handleAdd"
|
@update:add="handleAdd"
|
||||||
@update:edit="handleUpdate()"
|
@update:edit="handleUpdate()"
|
||||||
@update:delete="handleDelete()"
|
@update:delete="handleDelete()"
|
||||||
>
|
>
|
||||||
<template #actions>
|
<template #actions>
|
||||||
<el-button type="default" icon="Plus" v-hasPermi="['repair:repair:add']" @click="handleAdd('public')">公共报修</el-button>
|
<el-button v-hasPermi="['repair:repair:add']" icon="Plus" type="default" @click="handleAdd('public')">公共报修</el-button>
|
||||||
</template>
|
</template>
|
||||||
</right-toolbar>
|
</right-toolbar>
|
||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" border :data="repairList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="repairList" border @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column label="报修房屋" align="center" show-overflow-tooltip prop="houseName" />
|
<el-table-column align="center" label="报修房屋" prop="houseName" show-overflow-tooltip />
|
||||||
<el-table-column label="维修项目" align="center" prop="maintenanceItemName" />
|
<el-table-column align="center" label="维修项目" prop="maintenanceItemName" />
|
||||||
<el-table-column label="问题描述" align="center" prop="problem" />
|
<el-table-column align="center" label="问题描述" prop="problem" />
|
||||||
<el-table-column label="报修人" width="100" align="center" prop="residentName" />
|
<el-table-column align="center" label="报修人" prop="residentName" width="100" />
|
||||||
<el-table-column label="联系电话" width="120" align="center" prop="phone" />
|
<el-table-column align="center" label="联系电话" prop="phone" width="120" />
|
||||||
<el-table-column label="维修人员" width="100" align="center" prop="repairName">
|
<el-table-column align="center" label="维修人员" prop="repairName" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ scope.row.repairName ?? '---' }}</span>
|
<span>{{ scope.row.repairName ?? '---' }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="预约日期" align="center" prop="orderDate" width="150">
|
<el-table-column align="center" label="预约日期" prop="orderDate" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ parseTime(scope.row.orderDate, '{y}-{m}-{d}') }}</span>
|
<span>{{ parseTime(scope.row.orderDate, '{y}-{m}-{d}') }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="维修状态" align="center" width="100" prop="problemStatus">
|
<el-table-column align="center" label="维修状态" prop="problemStatus" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<dict-tag :options="com_repair_status" :value="scope.row.problemStatus || ''"></dict-tag>
|
<dict-tag :options="com_repair_status" :value="scope.row.problemStatus || ''"></dict-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
|
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button link type="primary" @click="handleShare(scope.row)" v-has-permi="['repair:repair:query']">{{
|
<el-button v-has-permi="['repair:repair:query']" link type="primary" @click="handleShare(scope.row)">{{
|
||||||
scope.row.problemStatus === '0' ? '分配' : '详情'
|
scope.row.problemStatus === '0' ? '分配' : '详情'
|
||||||
}}</el-button>
|
}}</el-button>
|
||||||
<el-button link type="primary" @click="handleUpdate(scope.row)" v-has-permi="['repair:repair:edit']">编辑</el-button>
|
<el-button v-has-permi="['repair:repair:edit']" link type="primary" @click="handleUpdate(scope.row)">编辑</el-button>
|
||||||
<el-button link type="primary" @click="handleDelete(scope.row)" v-has-permi="['repair:repair:remove']">删除</el-button>
|
<el-button v-has-permi="['repair:repair:remove']" link type="primary" @click="handleDelete(scope.row)">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="Repair" lang="ts">
|
<script lang="ts" name="Repair" setup>
|
||||||
import Pagination from '@/components/Pagination/index.vue';
|
import Pagination from '@/components/Pagination/index.vue';
|
||||||
import pageHeader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
import RightToolbar from '@/components/RightToolbar/index.vue';
|
import RightToolbar from '@/components/RightToolbar/index.vue';
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
<el-option v-for="(item, index) in com_charge_item_unit" :key="index" :label="item.label" :value="item.value"></el-option>
|
<el-option v-for="(item, index) in com_charge_item_unit" :key="index" :label="item.label" :value="item.value"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="费用单价">
|
<el-form-item label="费用单价" prop="fixedPrice">
|
||||||
<el-input v-model.trim.number="form.fixedPrice" :placeholder="placeHolderFun(form.typeId)" maxlength="10" />
|
<el-input v-model.trim.number="form.fixedPrice" :placeholder="placeHolderFun(form.typeId)" maxlength="10" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="计算精度" prop="accuracy">
|
<el-form-item label="计算精度" prop="accuracy">
|
||||||
@@ -184,7 +184,7 @@ const cancelForm = () => {
|
|||||||
// 车位费 物业费
|
// 车位费 物业费
|
||||||
const typeNameList = ref(['2049026520314445826']);
|
const typeNameList = ref(['2049026520314445826']);
|
||||||
function placeHolderFun(typeId: string) {
|
function placeHolderFun(typeId: string) {
|
||||||
return typeNameList.value.includes(typeId) ? '请输入每日费用单价' : '请输入费用单价';
|
return typeNameList.value.includes(typeId) ? '请输入费用单价' : '请输入费用单价';
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -4,9 +4,23 @@
|
|||||||
<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">
|
||||||
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
|
||||||
<el-form-item label="仪表名称" prop="houseId">
|
<el-form-item label="抄表周期" prop="recordMonth">
|
||||||
<el-input maxlength="20" v-model="queryParams.houseId" placeholder="请输入仪表名称" clearable @keyup.enter="handleQuery" />
|
<el-date-picker v-model="queryParams.recordMonth" format="YYYY-MM" placeholder="抄表月份" type="month" value-format="YYYY-MM" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="起止日期" prop="dateRange">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="StartEndDate"
|
||||||
|
clearable
|
||||||
|
end-placeholder="结束"
|
||||||
|
format="YYYY-MM-DD"
|
||||||
|
range-separator="到"
|
||||||
|
start-placeholder="开始"
|
||||||
|
type="daterange"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
@clear="hanleClear"
|
||||||
|
@update:model-value="handleDate"
|
||||||
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||||
@@ -22,56 +36,56 @@
|
|||||||
<el-row :gutter="10" class="mb8">
|
<el-row :gutter="10" class="mb8">
|
||||||
<right-toolbar
|
<right-toolbar
|
||||||
:disable-delete="multiple"
|
:disable-delete="multiple"
|
||||||
:show-edit="false"
|
|
||||||
:show-add="checkPermi(['payRecord:payRecord:add'])"
|
:show-add="checkPermi(['payRecord:payRecord:add'])"
|
||||||
:show-delete="checkPermi(['payRecord:payRecord:remove'])"
|
:show-delete="checkPermi(['payRecord:payRecord:remove'])"
|
||||||
|
:show-edit="false"
|
||||||
@update:add="handleAdd"
|
@update:add="handleAdd"
|
||||||
@update:delete="handleDelete()"
|
@update:delete="handleDelete()"
|
||||||
></right-toolbar>
|
></right-toolbar>
|
||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" border :data="payRecordList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="payRecordList" border @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column label="收费设备类型" align="center" prop="deviceType">
|
<el-table-column align="center" label="收费设备类型" prop="deviceType">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<dict-tag :options="com_waterelectricity_topup_type" :value="scope.row.deviceType"></dict-tag>
|
<dict-tag :options="com_waterelectricity_topup_type" :value="scope.row.deviceType"></dict-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="收费项目" align="center" prop="payType">
|
<el-table-column align="center" label="收费项目" prop="payType">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<dict-tag :options="com_payrecord_pay_type" :value="scope.row.payType"></dict-tag>
|
<dict-tag :options="com_payrecord_pay_type" :value="scope.row.payType"></dict-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="抄表周期" align="center" prop="recordMonth" width="180">
|
<el-table-column align="center" label="抄表周期" prop="recordMonth" width="180">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ parseTime(scope.row.recordMonth, '{y}-{m}') }}</span>
|
<span>{{ parseTime(scope.row.recordMonth, '{y}-{m}') }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="起止日期" width="250" align="center">
|
<el-table-column align="center" label="起止日期" width="250">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ parseTime(scope.row.startTime, '{y}/{m}/{d}') }}</span>
|
<span>{{ parseTime(scope.row.startTime, '{y}/{m}/{d}') }}</span>
|
||||||
<span> - </span>
|
<span> - </span>
|
||||||
<span>{{ parseTime(scope.row.endTime, '{y}/{m}/{d}') }}</span>
|
<span>{{ parseTime(scope.row.endTime, '{y}/{m}/{d}') }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="创建时间" align="center" prop="recordMonth" width="180">
|
<el-table-column align="center" label="创建时间" prop="recordMonth" width="180">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ parseTime(scope.row.recordMonth, '{y}-{m}-{d}') }}</span>
|
<span>{{ parseTime(scope.row.recordMonth, '{y}-{m}-{d}') }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
|
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button link type="primary" @click="handleMain(scope.row)" v-has-permi="['payRecord:payRecord:query']">明细</el-button>
|
<el-button v-has-permi="['payRecord:payRecord:query']" link type="primary" @click="handleMain(scope.row)">明细</el-button>
|
||||||
<el-button link type="primary" @click="handleDelete(scope.row)" v-has-permi="['payRecord:payRecord:remove']">删除</el-button>
|
<el-button v-has-permi="['payRecord:payRecord:remove']" link type="primary" @click="handleDelete(scope.row)">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
<!-- 添加或修改抄表周期明细对话框 -->
|
<!-- 添加或修改抄表周期明细对话框 -->
|
||||||
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body>
|
<el-dialog v-model="dialog.visible" :title="dialog.title" append-to-body width="800px">
|
||||||
<el-form ref="payRecordListFormRef" :model="form" label-position="left">
|
<el-form ref="payRecordListFormRef" :model="form" label-position="left">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
@@ -148,7 +162,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="PayRecord" lang="ts">
|
<script lang="ts" name="PayRecord" setup>
|
||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import pagination from '@/components/Pagination/index.vue';
|
import pagination from '@/components/Pagination/index.vue';
|
||||||
import DictTag from '@/components/DictTag/index.vue';
|
import DictTag from '@/components/DictTag/index.vue';
|
||||||
@@ -162,7 +176,6 @@ const { com_waterelectricity_topup_type } = toRefs<any>(proxy?.useDict('com_wate
|
|||||||
const { com_payrecord_pay_type } = toRefs<any>(proxy?.useDict('com_payrecord_pay_type'));
|
const { com_payrecord_pay_type } = toRefs<any>(proxy?.useDict('com_payrecord_pay_type'));
|
||||||
|
|
||||||
const payRecordList = ref<PayRecordVO[]>([]);
|
const payRecordList = ref<PayRecordVO[]>([]);
|
||||||
const buttonLoading = ref(false);
|
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
const showSearch = ref(true);
|
const showSearch = ref(true);
|
||||||
const ids = ref<Array<string | number>>([]);
|
const ids = ref<Array<string | number>>([]);
|
||||||
@@ -171,13 +184,20 @@ const multiple = ref(true);
|
|||||||
const total = ref(0);
|
const total = ref(0);
|
||||||
|
|
||||||
const queryFormRef = ref<ElFormInstance>();
|
const queryFormRef = ref<ElFormInstance>();
|
||||||
const payRecordFormRef = ref<ElFormInstance>();
|
|
||||||
|
|
||||||
const dialog = reactive<DialogOption>({
|
const dialog = reactive<DialogOption>({
|
||||||
visible: false,
|
visible: false,
|
||||||
title: ''
|
title: ''
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const StartEndDate = ref([]);
|
||||||
|
function handleDate(data: string[]) {
|
||||||
|
if (data !== null) {
|
||||||
|
queryParams.value.startTime = data[0];
|
||||||
|
queryParams.value.endTime = data[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const initFormData: PayRecordListForm = {
|
const initFormData: PayRecordListForm = {
|
||||||
id: undefined,
|
id: undefined,
|
||||||
recordId: undefined,
|
recordId: undefined,
|
||||||
@@ -205,13 +225,9 @@ const data = reactive<PageData<PayRecordListForm, PayRecordQuery>>({
|
|||||||
queryParams: {
|
queryParams: {
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
deviceType: undefined,
|
|
||||||
houseId: undefined,
|
|
||||||
payType: undefined,
|
|
||||||
recordMonth: undefined,
|
recordMonth: undefined,
|
||||||
startTime: undefined,
|
startTime: undefined,
|
||||||
endTime: undefined,
|
endTime: undefined
|
||||||
params: {}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -232,8 +248,18 @@ const handleQuery = () => {
|
|||||||
getList();
|
getList();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function hanleClear() {
|
||||||
|
queryParams.value.startTime = undefined;
|
||||||
|
queryParams.value.endTime = undefined;
|
||||||
|
StartEndDate.value = [];
|
||||||
|
}
|
||||||
|
|
||||||
/** 重置按钮操作 */
|
/** 重置按钮操作 */
|
||||||
const resetQuery = () => {
|
const resetQuery = () => {
|
||||||
|
queryParams.value.recordMonth = undefined;
|
||||||
|
queryParams.value.startTime = undefined;
|
||||||
|
queryParams.value.endTime = undefined;
|
||||||
|
StartEndDate.value = [];
|
||||||
queryFormRef.value?.resetFields();
|
queryFormRef.value?.resetFields();
|
||||||
handleQuery();
|
handleQuery();
|
||||||
};
|
};
|
||||||
@@ -254,7 +280,7 @@ const handleAdd = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/** 详情按钮操作 */
|
/** 详情按钮操作 */
|
||||||
const handleMain = async (row?: PayRecordVO) => {
|
const handleMain = (row?: PayRecordVO) => {
|
||||||
router.push({
|
router.push({
|
||||||
path: '/sdb/PayRecordMain',
|
path: '/sdb/PayRecordMain',
|
||||||
query: {
|
query: {
|
||||||
@@ -263,13 +289,6 @@ const handleMain = async (row?: PayRecordVO) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 修改按钮操作 */
|
|
||||||
const handleUpdate = async (id: string) => {
|
|
||||||
// const res = await getPayRecordList(id);
|
|
||||||
// Object.assign(form.value, res.data);
|
|
||||||
dialog.visible = true;
|
|
||||||
dialog.title = '最新抄表详细';
|
|
||||||
};
|
|
||||||
/** 取消按钮 */
|
/** 取消按钮 */
|
||||||
const cancel = () => {
|
const cancel = () => {
|
||||||
reset();
|
reset();
|
||||||
@@ -297,7 +316,7 @@ onMounted(() => {
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.el-table {
|
.el-table {
|
||||||
height: calc(100% - 80px);
|
height: calc(100% - 80px);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,9 +55,11 @@
|
|||||||
<span>{{ scope.row.fixedPrice }}</span> /
|
<span>{{ scope.row.fixedPrice }}</span> /
|
||||||
<DictTag :options="com_charge_item_unit" :value="scope.row.unit"></DictTag>
|
<DictTag :options="com_charge_item_unit" :value="scope.row.unit"></DictTag>
|
||||||
</div>
|
</div>
|
||||||
|
<span v-else-if="scope.row.fixedPrice">{{ scope.row.fixedPrice }}{{ handleChargePeriod(scope.row.chargePeriod) }}</span>
|
||||||
<span v-else>---</span>
|
<span v-else>---</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip />
|
||||||
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作" width="200">
|
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作" width="200">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button link type="primary" @click="handleChange(scope.row)">生成账单</el-button>
|
<el-button link type="primary" @click="handleChange(scope.row)">生成账单</el-button>
|
||||||
@@ -277,7 +279,7 @@ const BillForm = ref<{
|
|||||||
title: string;
|
title: string;
|
||||||
billId: string;
|
billId: string;
|
||||||
/**
|
/**
|
||||||
* 收费周期 0年 1月 2日 3 季度 4永久;为空时取账单配置
|
* 收费周期 0年 1月 2日 3 季度 ;为空时取账单配置
|
||||||
*/
|
*/
|
||||||
chargePeriod: string;
|
chargePeriod: string;
|
||||||
chargeScope: string;
|
chargeScope: string;
|
||||||
@@ -297,6 +299,19 @@ const BillForm = ref<{
|
|||||||
periodCalcType: '0',
|
periodCalcType: '0',
|
||||||
houseId: []
|
houseId: []
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function handleChargePeriod(chargePeriod: string) {
|
||||||
|
if (chargePeriod === '0') {
|
||||||
|
return '/年';
|
||||||
|
} else if (chargePeriod === '1') {
|
||||||
|
return '/月';
|
||||||
|
} else if (chargePeriod === '2') {
|
||||||
|
return '/日';
|
||||||
|
} else if (chargePeriod === '3') {
|
||||||
|
return '/季度';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// const HolderRef = ref<InstanceType<typeof House>>();
|
// const HolderRef = ref<InstanceType<typeof House>>();
|
||||||
// // 打开模态框
|
// // 打开模态框
|
||||||
// function OpenUseTablesFun() {
|
// function OpenUseTablesFun() {
|
||||||
|
|||||||
@@ -11,17 +11,23 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="楼栋" prop="buildingId">
|
<el-form-item label="楼栋" prop="buildingId">
|
||||||
<el-select v-model="queryParams.buildingId" placeholder="请选择楼栋" @change="handleChangeBuilding">
|
<el-select
|
||||||
|
v-model="queryParams.buildingId"
|
||||||
|
clearable
|
||||||
|
placeholder="请选择楼栋"
|
||||||
|
@change="handleChangeBuilding"
|
||||||
|
@clear="handleClearBuildingId"
|
||||||
|
>
|
||||||
<el-option v-for="(item, index) in buildingList" :key="index" :label="item.buildingName" :value="item.id"></el-option>
|
<el-option v-for="(item, index) in buildingList" :key="index" :label="item.buildingName" :value="item.id"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="单元" prop="unitNoId">
|
<el-form-item label="单元" prop="unitNoId">
|
||||||
<el-select v-model="queryParams.unitNoId" placeholder="请选择单元" @change="handleChangeUnit">
|
<el-select v-model="queryParams.unitNoId" clearable placeholder="请选择单元" @change="handleChangeUnit" @clear="handleClearUnit">
|
||||||
<el-option v-for="(item, index) in unitList" :key="index" :label="item.unitNoName" :value="item.unitNoId"></el-option>
|
<el-option v-for="(item, index) in unitList" :key="index" :label="item.unitNoName" :value="item.unitNoId"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="房号" prop="houseId" @change="handleChangeHouseNo">
|
<el-form-item label="房号" prop="houseId">
|
||||||
<el-select v-model="queryParams.houseId" placeholder="请选择房号">
|
<el-select v-model="queryParams.houseId" clearable placeholder="请选择房号" @clear="handleClear('houseId')">
|
||||||
<el-option-group v-for="group in houseList" :key="group.floorNo" :label="String(group.floorNo) + ' 楼'">
|
<el-option-group v-for="group in houseList" :key="group.floorNo" :label="String(group.floorNo) + ' 楼'">
|
||||||
<el-option v-for="item in group.houses" :key="item.houseId" :label="item.houseNo" :value="item.houseId" />
|
<el-option v-for="item in group.houses" :key="item.houseId" :label="item.houseNo" :value="item.houseId" />
|
||||||
</el-option-group>
|
</el-option-group>
|
||||||
@@ -30,7 +36,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<el-form-item label="收费项目" prop="itemId">
|
<el-form-item label="收费项目" prop="itemId">
|
||||||
<el-select v-model="queryParams.chargeItemId" multiple placeholder="请选择收费项目">
|
<el-select v-model="queryParams.chargeItemId" clearable multiple placeholder="请选择收费项目" @clear="handleClear('chargeItemId')">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="(item, index) in chargeItems"
|
v-for="(item, index) in chargeItems"
|
||||||
:key="index"
|
:key="index"
|
||||||
@@ -43,6 +49,7 @@
|
|||||||
<el-form-item label="缴费周期">
|
<el-form-item label="缴费周期">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="queryParams.startDate"
|
v-model="queryParams.startDate"
|
||||||
|
clearable
|
||||||
format="YYYY-MM-DD"
|
format="YYYY-MM-DD"
|
||||||
placeholder="请选择开始缴费日期"
|
placeholder="请选择开始缴费日期"
|
||||||
type="date"
|
type="date"
|
||||||
@@ -60,31 +67,39 @@
|
|||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="房屋分类" prop="houseUseTypeId">
|
<el-form-item label="房屋分类" prop="houseUseTypeId">
|
||||||
<el-select v-model="queryParams.houseUseTypeId">
|
<el-select v-model="queryParams.houseUseTypeId" clearable @clear="handleClear('houseUseTypeId')">
|
||||||
<el-option v-for="item in houseUseTypeList" :key="item.id" :label="item.name" :value="item.id" />
|
<el-option v-for="item in houseUseTypeList" :key="item.id" :label="item.name" :value="item.id" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="缴费时间">
|
<el-form-item label="缴费时间">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="queryParams.payTimeBegin"
|
v-model="queryParams.payTimeBegin"
|
||||||
|
clearable
|
||||||
format="YYYY-MM-DD HH:mm:ss"
|
format="YYYY-MM-DD HH:mm:ss"
|
||||||
placeholder="请选择开始缴费时间"
|
placeholder="请选择开始缴费时间"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
value-format="YYYY-MM-DD HH:mm:ss"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
@clear="handleClearPayTime('payTimeBegin')"
|
@clear="handleClear('payTimeBegin')"
|
||||||
/>
|
/>
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="queryParams.payTimeEnd"
|
v-model="queryParams.payTimeEnd"
|
||||||
|
clearable
|
||||||
format="YYYY-MM-DD HH:mm:ss"
|
format="YYYY-MM-DD HH:mm:ss"
|
||||||
placeholder="请选择结束缴费时间"
|
placeholder="请选择结束缴费时间"
|
||||||
style="margin-left: 10px"
|
style="margin-left: 10px"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
value-format="YYYY-MM-DD HH:mm:ss"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
@clear="handleClearPayTime('payTimeEnd')"
|
@clear="handleClear('payTimeEnd')"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="业主姓名" prop="residentName">
|
<el-form-item label="业主姓名" prop="residentName">
|
||||||
<el-input v-model.trim="queryParams.residentName" maxlength="30" placeholder="请选择业主姓名"></el-input>
|
<el-input
|
||||||
|
v-model.trim="queryParams.residentName"
|
||||||
|
clearable
|
||||||
|
maxlength="30"
|
||||||
|
placeholder="请选择业主姓名"
|
||||||
|
@clear="handleClear('residentName')"
|
||||||
|
></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<div style="text-align: right">
|
<div style="text-align: right">
|
||||||
@@ -154,13 +169,13 @@
|
|||||||
<el-table-column align="center" label="应收金额" prop="amount" width="100" />
|
<el-table-column align="center" label="应收金额" prop="amount" width="100" />
|
||||||
<el-table-column align="center" label="缴费状态" prop="payStatus" width="100">
|
<el-table-column align="center" label="缴费状态" prop="payStatus" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span v-if="scope.row.payStatus === '0'">未缴纳</span>
|
<span v-if="scope.row.payStatus === PayStatus.PENDING">未缴纳</span>
|
||||||
<span v-else-if="scope.row.payStatus === '1'">已缴纳</span>
|
<span v-else-if="scope.row.payStatus === PayStatus.PAID">已缴纳</span>
|
||||||
<span v-else-if="scope.row.payStatus === '2'">缴纳失败</span>
|
<span v-else-if="scope.row.payStatus === PayStatus.FAILED">缴纳失败</span>
|
||||||
<span v-else-if="scope.row.payStatus === '3'">部分缴纳</span>
|
<span v-else-if="scope.row.payStatus === PayStatus.PARTIAL">部分缴纳</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="应缴金额" prop="amount" width="100" />
|
<el-table-column align="center" label="应缴金额" prop="needPayAmount" width="100" />
|
||||||
<el-table-column align="center" label="优惠金额" prop="singleDiscountAmount" width="100" />
|
<el-table-column align="center" label="优惠金额" prop="singleDiscountAmount" width="100" />
|
||||||
<el-table-column align="center" label="实缴金额" prop="actualAccount" width="100" />
|
<el-table-column align="center" label="实缴金额" prop="actualAccount" width="100" />
|
||||||
<el-table-column align="center" label="缴费人" prop="residentName" width="120" />
|
<el-table-column align="center" label="缴费人" prop="residentName" width="120" />
|
||||||
@@ -168,8 +183,8 @@
|
|||||||
<el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip />
|
<el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip />
|
||||||
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="150">
|
<el-table-column align="center" class-name="small-padding fixed-width" label="操作" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button v-if="scope.row.payStatus !== '1'" link type="primary" @click="handleIncome(scope.row)">收款</el-button>
|
<el-button v-if="scope.row.payStatus !== PayStatus.PAID" link type="primary" @click="handleIncome(scope.row)">收款</el-button>
|
||||||
<el-button v-if="scope.row.payStatus === '1'" link type="success" @click="printPIaoJuByOnly(scope.row)">打印票据</el-button>
|
<el-button v-if="scope.row.payStatus === PayStatus.PAID" link type="success" @click="printPIaoJuByOnly(scope.row)">打印票据</el-button>
|
||||||
<el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
|
<el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -177,12 +192,10 @@
|
|||||||
<div class="footerBox">
|
<div class="footerBox">
|
||||||
<div class="totalBox">
|
<div class="totalBox">
|
||||||
<span>合计:</span>
|
<span>合计:</span>
|
||||||
<span style="padding: 0 10px">应收:{{ totalAll.totalAccount }}元</span>
|
<span>应收:{{ totalAll.totalAccount }}元(原金额:{{ totalAll.originalAmount }}元, 优惠:{{ totalAll.totalDiscountAmount }}元)</span>
|
||||||
<span style="padding: 0 10px">实收:{{ totalAll.TotalPaymentAmount }}元</span>
|
<span style="padding: 0 5px">已收:{{ totalAll.TotalPaymentAmount }}元</span>
|
||||||
<span style="padding: 0 10px">优惠:{{ totalAll.totalDiscountAmount }}元</span>
|
<span style="padding: 0 5px">未收:{{ totalAll.TotalUnPaymentAmount }}元</span>
|
||||||
<span style="padding: 0 10px">未收:{{ totalAll.TotalUnPaymentAmount }}元</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<pagination
|
<pagination
|
||||||
v-show="total > 0"
|
v-show="total > 0"
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@@ -214,7 +227,7 @@
|
|||||||
<div style="text-decoration: underline; padding-right: 5px; text-align: center">
|
<div style="text-decoration: underline; padding-right: 5px; text-align: center">
|
||||||
{{ item.detailsName }} (应缴:¥{{ item.needPayAmount }})
|
{{ item.detailsName }} (应缴:¥{{ item.needPayAmount }})
|
||||||
</div>
|
</div>
|
||||||
<el-tooltip v-if="item.payStatus === '3'" class="box-item" effect="light" placement="top">
|
<el-tooltip v-if="item.payStatus === PayStatus.PENDING" class="box-item" effect="light" placement="top">
|
||||||
<el-icon color="#909399"><QuestionFilled /></el-icon>
|
<el-icon color="#909399"><QuestionFilled /></el-icon>
|
||||||
<template #content>
|
<template #content>
|
||||||
<div style="line-height: 1.8; font-size: 13px; width: 180px">
|
<div style="line-height: 1.8; font-size: 13px; width: 180px">
|
||||||
@@ -241,7 +254,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</div>
|
</div>
|
||||||
<span v-if="item.payStatus === '1'">(已缴费,不计入金额)</span>
|
<span v-if="item.payStatus === PayStatus.PAID">(已缴费,不计入金额)</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -288,7 +301,7 @@
|
|||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item v-if="inComeFrom.payStatus !== '0'" label="优惠方式" prop="discountMethod">
|
<el-form-item v-if="inComeFrom.payStatus !== PayStatus.PENDING" label="优惠方式" prop="discountMethod">
|
||||||
<el-select v-model="inComeFrom.discountMethod" placeholder="请选择" style="width: 400px" @change="handleChangeDisCountMethod">
|
<el-select v-model="inComeFrom.discountMethod" placeholder="请选择" style="width: 400px" @change="handleChangeDisCountMethod">
|
||||||
<el-option :value="0" label="不优惠"></el-option>
|
<el-option :value="0" label="不优惠"></el-option>
|
||||||
<el-option :value="2" label="金额"></el-option>
|
<el-option :value="2" label="金额"></el-option>
|
||||||
@@ -325,7 +338,7 @@
|
|||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
<el-form-item v-if="inComeFrom.payStatus !== '0'" label="支付方式" prop="payType">
|
<el-form-item v-if="inComeFrom.payStatus !== PayStatus.PENDING" label="支付方式" prop="payType">
|
||||||
<div class="flex-1">
|
<div class="flex-1">
|
||||||
<div v-for="(item, index) in payList" :key="index" class="flex flex-items-center">
|
<div v-for="(item, index) in payList" :key="index" class="flex flex-items-center">
|
||||||
<div class="flex-1 flex">
|
<div class="flex-1 flex">
|
||||||
@@ -452,7 +465,7 @@ import { getCommunitylistAPI } from '@/api/system/community';
|
|||||||
import { billDelete, billEdit, billlistType, billPrint, BillPrintType, billQuery, getAllAccount } from '@/api/system/SdbCashier';
|
import { billDelete, billEdit, billlistType, billPrint, BillPrintType, billQuery, getAllAccount } from '@/api/system/SdbCashier';
|
||||||
import { listChargeItem } from '@/api/system/SdbChargeItem';
|
import { listChargeItem } from '@/api/system/SdbChargeItem';
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import { add, div, eq, eqMoney, gtMoney, ltMoney, minMoney, moneyAdd, mul, sub, sum, toBig } from '@/utils/money';
|
import { add, div, eq, eqMoney, gtMoney, minMoney, moneyAdd, mul, sub, sum, toBig } from '@/utils/money';
|
||||||
import { BuildingUnitlist, BuildingVo, FloorsType } from '@/api/system/house/type';
|
import { BuildingUnitlist, BuildingVo, FloorsType } from '@/api/system/house/type';
|
||||||
import { ChargeItemVO } from '@/api/system/SdbChargeItem/type';
|
import { ChargeItemVO } from '@/api/system/SdbChargeItem/type';
|
||||||
import { communitylist_rows_type } from '@/api/system/community/type';
|
import { communitylist_rows_type } from '@/api/system/community/type';
|
||||||
@@ -464,6 +477,18 @@ import { useUserStore } from '@/store/modules/user';
|
|||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||||
const { com_pay_method, com_charge_item_unit } = toRefs<any>(proxy?.useDict('com_pay_method', 'com_charge_item_unit'));
|
const { com_pay_method, com_charge_item_unit } = toRefs<any>(proxy?.useDict('com_pay_method', 'com_charge_item_unit'));
|
||||||
|
|
||||||
|
/** 支付状态 */
|
||||||
|
const PayStatus = {
|
||||||
|
/** 待缴纳 */
|
||||||
|
PENDING: '0',
|
||||||
|
/** 已缴纳 */
|
||||||
|
PAID: '1',
|
||||||
|
/** 缴纳失败 */
|
||||||
|
FAILED: '2',
|
||||||
|
/** 部分缴纳 */
|
||||||
|
PARTIAL: '3'
|
||||||
|
} as const;
|
||||||
|
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
const ids = ref<Array<billlistType>>([]);
|
const ids = ref<Array<billlistType>>([]);
|
||||||
@@ -476,15 +501,15 @@ const tabs = [
|
|||||||
type: '全部'
|
type: '全部'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 0,
|
value: PayStatus.PENDING,
|
||||||
type: '待缴纳'
|
type: '待缴纳'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 1,
|
value: PayStatus.PAID,
|
||||||
type: '已缴纳'
|
type: '已缴纳'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: 3,
|
value: PayStatus.PARTIAL,
|
||||||
type: '部分缴纳'
|
type: '部分缴纳'
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
@@ -520,6 +545,8 @@ const queryParams = ref({
|
|||||||
// 结束时间
|
// 结束时间
|
||||||
endDate: undefined
|
endDate: undefined
|
||||||
});
|
});
|
||||||
|
// ts工具 排除参数
|
||||||
|
type ExcludeType = keyof Omit<typeof queryParams.value, 'villageId' | 'pageSize' | 'pageNum'>;
|
||||||
|
|
||||||
const villageList = ref<communitylist_rows_type[]>([]); // 小区列表
|
const villageList = ref<communitylist_rows_type[]>([]); // 小区列表
|
||||||
const buildingList = ref<BuildingVo[]>([]); // 楼栋列表
|
const buildingList = ref<BuildingVo[]>([]); // 楼栋列表
|
||||||
@@ -538,7 +565,7 @@ function getHouseTypeList() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
// 切换 账单类型
|
// 切换 账单类型
|
||||||
function changeTabs(value: number) {
|
function changeTabs(value: string) {
|
||||||
activeTabs.value = value;
|
activeTabs.value = value;
|
||||||
queryParams.value.payStatus = value;
|
queryParams.value.payStatus = value;
|
||||||
getList();
|
getList();
|
||||||
@@ -575,12 +602,17 @@ function handleChangeBuilding(val: string): void {
|
|||||||
queryParams.value.unitNoId = undefined;
|
queryParams.value.unitNoId = undefined;
|
||||||
queryParams.value.houseId = undefined;
|
queryParams.value.houseId = undefined;
|
||||||
unitList.value = [];
|
unitList.value = [];
|
||||||
|
if (val !== undefined) {
|
||||||
getHouselistAPI(val).then((res) => {
|
getHouselistAPI(val).then((res) => {
|
||||||
unitList.value = res.data.units;
|
unitList.value = res.data.units;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// 选择 单元
|
// 选择 单元
|
||||||
function handleChangeUnit(val: string) {
|
function handleChangeUnit(val: string) {
|
||||||
|
if (val === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
const find = unitList.value.find((item) => item.unitNoId === val);
|
const find = unitList.value.find((item) => item.unitNoId === val);
|
||||||
queryParams.value.houseId = undefined;
|
queryParams.value.houseId = undefined;
|
||||||
houseList.value = [];
|
houseList.value = [];
|
||||||
@@ -588,13 +620,7 @@ function handleChangeUnit(val: string) {
|
|||||||
houseList.value = find.floors;
|
houseList.value = find.floors;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 选择房屋
|
|
||||||
function handleChangeHouseNo() {}
|
|
||||||
|
|
||||||
// 清空缴费时间
|
|
||||||
function handleClearPayTime(type: 'payTimeBegin' | 'payTimeEnd') {
|
|
||||||
queryParams.value[type] = undefined;
|
|
||||||
}
|
|
||||||
// 清空缴费周期
|
// 清空缴费周期
|
||||||
function handleClearChargePeriod(type: 'start' | 'end' = 'start') {
|
function handleClearChargePeriod(type: 'start' | 'end' = 'start') {
|
||||||
if (type === 'start') {
|
if (type === 'start') {
|
||||||
@@ -622,7 +648,8 @@ function getAllBillAmount() {
|
|||||||
totalAll.value = {
|
totalAll.value = {
|
||||||
totalDiscountAmount: res.data.discountAmount, // 总优惠金额
|
totalDiscountAmount: res.data.discountAmount, // 总优惠金额
|
||||||
TotalPaymentAmount: res.data.receivedAmount, // 总实收金额
|
TotalPaymentAmount: res.data.receivedAmount, // 总实收金额
|
||||||
totalAccount: res.data.receivableAmount, // 总金额
|
totalAccount: res.data.receivableAmount, // 总 应收金额
|
||||||
|
originalAmount: res.data.originalAmount, // 原始金额之和(应收+优惠)
|
||||||
TotalUnPaymentAmount: res.data.unpaidAmount // 未收金额
|
TotalUnPaymentAmount: res.data.unpaidAmount // 未收金额
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@@ -634,30 +661,51 @@ const handleQuery = () => {
|
|||||||
getList();
|
getList();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 优化后
|
||||||
|
const defaultQueryParams = () => ({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
payStatus: null as number | null,
|
||||||
|
villageId: villageId as string | undefined,
|
||||||
|
buildingId: undefined,
|
||||||
|
unitNoId: undefined,
|
||||||
|
houseId: undefined,
|
||||||
|
houseUseTypeId: undefined,
|
||||||
|
payTime: undefined,
|
||||||
|
residentName: undefined,
|
||||||
|
chargeItemId: undefined,
|
||||||
|
period: undefined,
|
||||||
|
payTimeBegin: undefined,
|
||||||
|
payTimeEnd: undefined,
|
||||||
|
startDate: undefined,
|
||||||
|
endDate: undefined
|
||||||
|
});
|
||||||
/** 重置按钮操作 */
|
/** 重置按钮操作 */
|
||||||
const resetQuery = () => {
|
const resetQuery = () => {
|
||||||
queryFormRef.value?.resetFields();
|
queryFormRef.value?.resetFields();
|
||||||
queryParams.value = {
|
queryParams.value = {
|
||||||
startDate: undefined,
|
...defaultQueryParams(),
|
||||||
payTime: undefined,
|
payStatus: queryParams.value.payStatus // 保留当前 tab
|
||||||
pageNum: 1,
|
|
||||||
pageSize: 20,
|
|
||||||
payStatus: queryParams.value.payStatus,
|
|
||||||
villageId: undefined,
|
|
||||||
buildingId: undefined,
|
|
||||||
unitNoId: undefined,
|
|
||||||
houseId: undefined,
|
|
||||||
chargeItemId: undefined,
|
|
||||||
period: undefined,
|
|
||||||
houseUseTypeId: undefined,
|
|
||||||
residentName: undefined,
|
|
||||||
payTimeBegin: undefined,
|
|
||||||
payTimeEnd: undefined,
|
|
||||||
endDate: undefined
|
|
||||||
};
|
};
|
||||||
queryParams.value.villageId = villageId;
|
|
||||||
handleQuery();
|
handleQuery();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 清空楼栋
|
||||||
|
function handleClearBuildingId() {
|
||||||
|
queryParams.value.buildingId = undefined;
|
||||||
|
queryParams.value.unitNoId = undefined;
|
||||||
|
queryParams.value.houseId = undefined;
|
||||||
|
}
|
||||||
|
// 清空单元
|
||||||
|
function handleClearUnit() {
|
||||||
|
queryParams.value.unitNoId = undefined;
|
||||||
|
queryParams.value.houseId = undefined;
|
||||||
|
}
|
||||||
|
// 清空其他参数
|
||||||
|
function handleClear(type: ExcludeType) {
|
||||||
|
queryParams.value[type] = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
// 控制收费 按钮 不能有已缴纳的(后端会校验)
|
// 控制收费 按钮 不能有已缴纳的(后端会校验)
|
||||||
const single = ref(true);
|
const single = ref(true);
|
||||||
// 控制打印票据的 按钮 不能有收费的
|
// 控制打印票据的 按钮 不能有收费的
|
||||||
@@ -666,9 +714,9 @@ const printSingle = ref(true);
|
|||||||
const handleSelectionChange = (selection: billlistType[]) => {
|
const handleSelectionChange = (selection: billlistType[]) => {
|
||||||
ids.value = selection.map((item) => item);
|
ids.value = selection.map((item) => item);
|
||||||
// 不能全部都是已缴纳的 0待缴纳 1已缴纳 2缴纳失败 3混合缴纳
|
// 不能全部都是已缴纳的 0待缴纳 1已缴纳 2缴纳失败 3混合缴纳
|
||||||
single.value = ids.value.every((item) => item.payStatus === '0' || item.payStatus === '3');
|
single.value = ids.value.every((item) => item.payStatus === PayStatus.PENDING || item.payStatus === PayStatus.PARTIAL);
|
||||||
// 必须都要缴费后打印
|
// 必须都要缴费后打印
|
||||||
printSingle.value = ids.value.every((item) => item.payStatus === '1');
|
printSingle.value = ids.value.every((item) => item.payStatus === PayStatus.PAID);
|
||||||
};
|
};
|
||||||
const buttonLoading = ref(false);
|
const buttonLoading = ref(false);
|
||||||
// 是否多选
|
// 是否多选
|
||||||
@@ -760,7 +808,7 @@ function handleChangeDiscountMoney(val: string) {
|
|||||||
if (isMore) {
|
if (isMore) {
|
||||||
// 过滤:只保留未支付账单,已支付直接丢弃
|
// 过滤:只保留未支付账单,已支付直接丢弃
|
||||||
const unPaidList = ids.value.filter((item) => {
|
const unPaidList = ids.value.filter((item) => {
|
||||||
return item.payStatus !== '1';
|
return item.payStatus !== PayStatus.PAID;
|
||||||
});
|
});
|
||||||
|
|
||||||
// 计算优惠总额
|
// 计算优惠总额
|
||||||
@@ -819,7 +867,7 @@ function handleChangeDiscountRate(val: string) {
|
|||||||
// 批量多选模式
|
// 批量多选模式
|
||||||
if (isMore) {
|
if (isMore) {
|
||||||
const unPaidList = ids.value.filter((item) => {
|
const unPaidList = ids.value.filter((item) => {
|
||||||
return item.payStatus !== '1';
|
return item.payStatus !== PayStatus.PAID;
|
||||||
});
|
});
|
||||||
// 总价格
|
// 总价格
|
||||||
const sourceTotal = sum(unPaidList.map((item) => item.needPayAmount ?? 0));
|
const sourceTotal = sum(unPaidList.map((item) => item.needPayAmount ?? 0));
|
||||||
@@ -864,7 +912,7 @@ function handleIncome(row: billlistType | false) {
|
|||||||
ids.value.forEach((item) => {
|
ids.value.forEach((item) => {
|
||||||
set.add(item.residentId);
|
set.add(item.residentId);
|
||||||
});
|
});
|
||||||
if (ids.value.some((item) => item.payStatus === '1')) {
|
if (ids.value.some((item) => item.payStatus === PayStatus.PAID)) {
|
||||||
return ElMessage.warning('存在已支付账单,请重新选择');
|
return ElMessage.warning('存在已支付账单,请重新选择');
|
||||||
}
|
}
|
||||||
if (set.size > 1) {
|
if (set.size > 1) {
|
||||||
@@ -875,7 +923,7 @@ function handleIncome(row: billlistType | false) {
|
|||||||
inComeFrom.value.residentName = ids.value[0].residentName;
|
inComeFrom.value.residentName = ids.value[0].residentName;
|
||||||
ids.value.forEach((item) => {
|
ids.value.forEach((item) => {
|
||||||
inComeFrom.value.billResidentId.push(item);
|
inComeFrom.value.billResidentId.push(item);
|
||||||
if (item.payStatus === '0' || item.payStatus === '3') {
|
if (item.payStatus === PayStatus.PENDING || item.payStatus === PayStatus.PARTIAL) {
|
||||||
inComeFrom.value.allCost = moneyAdd(inComeFrom.value.allCost || 0, item.needPayAmount);
|
inComeFrom.value.allCost = moneyAdd(inComeFrom.value.allCost || 0, item.needPayAmount);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -899,17 +947,17 @@ const submitForm = () => {
|
|||||||
}
|
}
|
||||||
buttonLoading.value = true;
|
buttonLoading.value = true;
|
||||||
// 部分缴纳时 判断 支付金额 和 预计支付金额 是否相等 ,相等 则 可选择 部分缴纳 方式
|
// 部分缴纳时 判断 支付金额 和 预计支付金额 是否相等 ,相等 则 可选择 部分缴纳 方式
|
||||||
if (inComeFrom.value.payStatus === '3') {
|
if (inComeFrom.value.payStatus === PayStatus.PARTIAL) {
|
||||||
if (eqMoney(totalPayAmount.value, payListAllAmount.value)) {
|
if (eqMoney(totalPayAmount.value, payListAllAmount.value)) {
|
||||||
buttonLoading.value = false;
|
buttonLoading.value = false;
|
||||||
return ElMessage.warning('实缴金额等于应收金额时,请选择 【已缴纳】 状态');
|
return ElMessage.warning('实缴金额等于应收金额时,请选择 【已缴纳】 状态');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 已缴纳时 判断 支付金额 和 预计支付金额 是否相等
|
// 已缴纳时 判断 支付金额 和 预计支付金额 是否相等
|
||||||
if (inComeFrom.value.payStatus === '1') {
|
if (inComeFrom.value.payStatus === PayStatus.PAID) {
|
||||||
if (!eqMoney(totalPayAmount.value, payListAllAmount.value)) {
|
if (!eqMoney(totalPayAmount.value, payListAllAmount.value)) {
|
||||||
buttonLoading.value = false;
|
buttonLoading.value = false;
|
||||||
return ElMessage.warning('支付金额不足,请选择 【部分缴纳】 状态');
|
return ElMessage.warning('支付金额不足,可以选择 【部分缴纳】 状态');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const obj = {
|
const obj = {
|
||||||
@@ -1097,22 +1145,14 @@ function conFimPrint() {
|
|||||||
|
|
||||||
// 删除
|
// 删除
|
||||||
async function handleDelete(row: billlistType | false) {
|
async function handleDelete(row: billlistType | false) {
|
||||||
if (row) {
|
const targetIds = row ? [row.detailsId] : ids.value.map((item) => item.detailsId);
|
||||||
await proxy?.$modal.confirm('该信息删除后无法恢复,确定要删除吗?');
|
if (targetIds.length === 0) {
|
||||||
billDelete(row.detailsId).then(() => {
|
|
||||||
ElMessage.success('删除成功');
|
|
||||||
getList();
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
if (ids.value.length <= 0) {
|
|
||||||
return ElMessage.warning('请选择账单!');
|
return ElMessage.warning('请选择账单!');
|
||||||
}
|
}
|
||||||
await proxy?.$modal.confirm('该信息删除后无法恢复,确定要删除吗?');
|
await proxy?.$modal.confirm('该信息删除后无法恢复,确定要删除吗?');
|
||||||
billDelete(ids.value.map((item) => item.detailsId)).then(() => {
|
await billDelete(targetIds);
|
||||||
ElMessage.success('删除成功');
|
ElMessage.success('删除成功');
|
||||||
getList();
|
getList();
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
@@ -1129,8 +1169,9 @@ onMounted(() => {
|
|||||||
// 总 表单
|
// 总 表单
|
||||||
const totalAll = ref({
|
const totalAll = ref({
|
||||||
totalDiscountAmount: '0', // 总优惠金额
|
totalDiscountAmount: '0', // 总优惠金额
|
||||||
TotalPaymentAmount: '0', // 总实收金额
|
TotalPaymentAmount: '0', // 总已收金额
|
||||||
totalAccount: '0', // 总金额
|
totalAccount: '0', // 总 应收金额
|
||||||
|
originalAmount: '0', // 原始金额之和(应收+优惠)
|
||||||
TotalUnPaymentAmount: '0' // 未收金额
|
TotalUnPaymentAmount: '0' // 未收金额
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1138,7 +1179,7 @@ function handleChangePayTypeId(val: string, index: number) {
|
|||||||
// 【可选兜底校验】防止异常数据出现重复
|
// 【可选兜底校验】防止异常数据出现重复
|
||||||
const repeatCount = usedPayValues.value.filter((v) => v === val).length;
|
const repeatCount = usedPayValues.value.filter((v) => v === val).length;
|
||||||
if (repeatCount > 1) {
|
if (repeatCount > 1) {
|
||||||
payList.value[index].payType = null;
|
payList.value[index].payType = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const usedPayValues = computed(() => {
|
const usedPayValues = computed(() => {
|
||||||
@@ -1150,15 +1191,20 @@ const isOptionDisabled = (optVal: string, currentVal: any) => {
|
|||||||
return usedPayValues.value.includes(optVal);
|
return usedPayValues.value.includes(optVal);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** 支付列表项类型 */
|
||||||
|
interface PayListItem {
|
||||||
|
payType: string;
|
||||||
|
payAmount: number | null;
|
||||||
|
}
|
||||||
// 混合支付 列表
|
// 混合支付 列表
|
||||||
const payList = ref([
|
const payList = ref<PayListItem[]>([
|
||||||
{
|
{
|
||||||
payType: '',
|
payType: '',
|
||||||
payAmount: null
|
payAmount: null
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
// 混合支付 总金额
|
// 混合支付 总金额
|
||||||
const payListAllAmount = computed(() => {
|
const payListAllAmount = computed<number>(() => {
|
||||||
return sum(payList.value.map((item) => item.payAmount ?? 0));
|
return sum(payList.value.map((item) => item.payAmount ?? 0));
|
||||||
});
|
});
|
||||||
// 添加支付方式
|
// 添加支付方式
|
||||||
@@ -1172,27 +1218,32 @@ function addPayList() {
|
|||||||
function removePayList(index: number) {
|
function removePayList(index: number) {
|
||||||
payList.value.splice(index, 1);
|
payList.value.splice(index, 1);
|
||||||
}
|
}
|
||||||
// 数据框改变时 检测数据是否大于 总金额
|
// 数据框改变时 检测数据是否大于 总金额, 如果大于则自动回填剩余金额
|
||||||
function handleChangePay(val: string, index: number = -1) {
|
function handleChangePay(val: string, index: number = -1) {
|
||||||
if (!checkMoney(val)) {
|
if (!checkMoney(val)) {
|
||||||
ElMessage.warning('金额格式错误');
|
ElMessage.warning('金额格式错误');
|
||||||
payList.value[index].payAmount = null;
|
payList.value[index].payAmount = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// 如果 当前行输入的金额 大于 总实缴金额
|
||||||
|
// 则在当前行,自动回填正确剩余金额
|
||||||
if (gtMoney(payListAllAmount.value, totalPayAmount.value)) {
|
if (gtMoney(payListAllAmount.value, totalPayAmount.value)) {
|
||||||
ElMessage.warning('输入金额 总和 不能大于 总实缴金额');
|
ElMessage.warning('输入金额 总和 不能大于 总实缴金额');
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
payList.value[index].payAmount = 0;
|
|
||||||
// 自动回填
|
// 自动回填
|
||||||
payList.value[index].payAmount = sub(totalPayAmount.value, payListAllAmount.value);
|
// BUG: payAmount=0,让 payListAllAmount’s computed 只算其他行,然后 补 回来
|
||||||
}
|
// payList.value[index].payAmount = 0;
|
||||||
}
|
// payList.value[index].payAmount = sub(totalPayAmount.value, payListAllAmount.value);
|
||||||
// 已缴纳状态时,输入金额 总和 不能小于 总实缴金额
|
// 总实缴 - (全部总和 - 当前行刚输入的值) = 总实缴 - 其他行总和 = 当前行剩余应缴金额
|
||||||
if (inComeFrom.value.payStatus === '1') {
|
payList.value[index].payAmount = sub(totalPayAmount.value, sub(payListAllAmount.value, val));
|
||||||
if (ltMoney(payListAllAmount.value, totalPayAmount.value)) {
|
|
||||||
ElMessage.warning('输入金额 总和 不能小于 总实缴金额');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// // 已缴纳状态时,输入金额 总和 不能小于 总实缴金额
|
||||||
|
// if (inComeFrom.value.payStatus === PayStatus.PAID) {
|
||||||
|
// if (ltMoney(payListAllAmount.value, totalPayAmount.value)) {
|
||||||
|
// ElMessage.warning('输入金额 总和 不能小于 总实缴金额');
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
function handlePayListIsEmpty() {
|
function handlePayListIsEmpty() {
|
||||||
@@ -1201,13 +1252,7 @@ function handlePayListIsEmpty() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const invalidIndex = payList.value.findIndex(
|
const invalidIndex = payList.value.findIndex(
|
||||||
(item) =>
|
(item) => item.payType === null || item.payType === undefined || item.payType === '' || item.payAmount === null || item.payAmount === undefined
|
||||||
item.payType === null ||
|
|
||||||
item.payType === undefined ||
|
|
||||||
item.payType === '' ||
|
|
||||||
item.payAmount === null ||
|
|
||||||
item.payAmount === undefined ||
|
|
||||||
item.payAmount === ''
|
|
||||||
);
|
);
|
||||||
return invalidIndex === -1;
|
return invalidIndex === -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,12 +4,12 @@
|
|||||||
<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">
|
||||||
<el-form ref="queryFormRef" label-width="100px" @submit.prevent="handleQuery" :model="queryParams" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" label-width="100px" @submit.prevent="handleQuery">
|
||||||
<el-form-item label="设备编号" prop="deviceCode">
|
<el-form-item label="设备编号" prop="deviceCode">
|
||||||
<el-input maxlength="25" v-model="queryParams.deviceCode" placeholder="请输入" clearable />
|
<el-input v-model="queryParams.deviceCode" clearable maxlength="25" placeholder="请输入" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="房屋号" prop="houseName">
|
<el-form-item label="房屋号" prop="houseName">
|
||||||
<el-input maxlength="20" v-model="queryParams.houseName" placeholder="请输入" clearable @keyup.enter="handleQuery" />
|
<el-input v-model="queryParams.houseName" clearable maxlength="20" placeholder="请输入" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||||
@@ -26,7 +26,11 @@
|
|||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<div style="font-size: 0.8rem">电表列表</div>
|
<div style="font-size: 0.8rem">电表列表</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
<right-toolbar :show-add="false" :show-edit="false" :show-delete="false">
|
<right-toolbar :show-add="false" :show-delete="false" :show-edit="false">
|
||||||
|
<template #actions>
|
||||||
|
<el-button icon="Upload" plain type="success" @click="handleOpenDialog('UploadDevices')">导入设备</el-button>
|
||||||
|
<el-button icon="Download" plain type="warning" @click="handleExport">获取导入模板</el-button>
|
||||||
|
</template>
|
||||||
<template #dropdown>
|
<template #dropdown>
|
||||||
<el-dropdown-item @click="handleMarkQRCode">
|
<el-dropdown-item @click="handleMarkQRCode">
|
||||||
<span>批量生成条形码</span>
|
<span>批量生成条形码</span>
|
||||||
@@ -34,7 +38,7 @@
|
|||||||
<el-dropdown-item @click="handleMarkQrcodeZip">
|
<el-dropdown-item @click="handleMarkQrcodeZip">
|
||||||
<span>批量下载条形码</span>
|
<span>批量下载条形码</span>
|
||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
<!-- <el-dropdown-item v-has-permi="['equipment:addqrcode:electricitydevice']">
|
<!-- <el-dropdown-item >
|
||||||
<div @click="handleMarkQRCode">批量更新固件</div>
|
<div @click="handleMarkQRCode">批量更新固件</div>
|
||||||
</el-dropdown-item> -->
|
</el-dropdown-item> -->
|
||||||
</template>
|
</template>
|
||||||
@@ -42,41 +46,41 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" border :data="ElectricityDeviceList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="ElectricityDeviceList" border @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column label="设备编码" width="250" align="center" prop="deviceCode" />
|
<el-table-column align="center" label="设备编码" prop="deviceCode" width="250" />
|
||||||
<el-table-column label="设备状态" width="100" align="center" prop="status">
|
<el-table-column align="center" label="设备状态" prop="status" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div class="readRecord" v-if="scope.row.status !== null">
|
<div v-if="scope.row.status !== null" class="readRecord">
|
||||||
<DictTag :options="com_waterdevice_on_status" :value="scope.row.status"></DictTag>
|
<DictTag :options="com_waterdevice_on_status" :value="scope.row.status"></DictTag>
|
||||||
</div>
|
</div>
|
||||||
<span v-else>---</span>
|
<span v-else>---</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="分合状态" width="100" align="center">
|
<el-table-column align="center" label="分合状态" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div class="readRecord" v-if="scope.row.electricityRecord">
|
<div v-if="scope.row.electricityRecord" class="readRecord">
|
||||||
<DictTag :options="com_electricity_readrecord_status" :value="scope.row.electricityRecord.status"></DictTag>
|
<DictTag :options="com_electricity_readrecord_status" :value="scope.row.electricityRecord.status"></DictTag>
|
||||||
</div>
|
</div>
|
||||||
<span v-else>---</span>
|
<span v-else>---</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="房屋号" align="center" prop="houseName" />
|
<el-table-column align="center" label="房屋号" prop="houseName" />
|
||||||
<el-table-column label="余额" width="100" align="center">
|
<el-table-column align="center" label="余额" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span v-if="scope.row.electricityRecord">{{ scope.row.electricityRecord.balance }}</span>
|
<span v-if="scope.row.electricityRecord">{{ scope.row.electricityRecord.balance }}</span>
|
||||||
<span v-else>---</span>
|
<span v-else>---</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="条码" width="250" align="center" prop="deleted">
|
<el-table-column align="center" label="条码" prop="deleted" width="250">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-image
|
<el-image
|
||||||
v-if="scope.row.url && scope.row.url.includes('http')"
|
v-if="scope.row.url && scope.row.url.includes('http')"
|
||||||
:src="scope.row.url"
|
|
||||||
:preview-src-list="[scope.row.url]"
|
:preview-src-list="[scope.row.url]"
|
||||||
style="width: 90%; height: 100%"
|
:src="scope.row.url"
|
||||||
fit="cover"
|
fit="cover"
|
||||||
preview-teleported
|
preview-teleported
|
||||||
|
style="width: 90%; height: 100%"
|
||||||
>
|
>
|
||||||
<template #toolbar>
|
<template #toolbar>
|
||||||
<el-icon @click="download(scope.row.url)"><Download /></el-icon>
|
<el-icon @click="download(scope.row.url)"><Download /></el-icon>
|
||||||
@@ -85,99 +89,70 @@
|
|||||||
<span v-else>暂未生成</span>
|
<span v-else>暂未生成</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="抄表时间" align="center">
|
<el-table-column align="center" label="抄表时间">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ scope.row.electricityRecord ? scope.row.electricityRecord.readTime : '--' }}</span>
|
<span>{{ scope.row.electricityRecord ? scope.row.electricityRecord.readTime : '--' }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- <el-table-column width="150" label="启停" align="center" prop="deleted" v-has-permi="['equipment:isUse:electricitydevice']">
|
<el-table-column align="center" label="启停" prop="deleted" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-switch
|
<el-switch
|
||||||
@change="(val: string) => handleChangeWater(val, scope.row)"
|
v-if="scope.row.electricityRecord"
|
||||||
v-model="scope.row.deleted"
|
v-model="scope.row.electricityRecord.status"
|
||||||
active-text="启用"
|
:active-value="0"
|
||||||
inactive-text="停止"
|
:before-change="
|
||||||
active-value="0"
|
() => {
|
||||||
inactive-value="1"
|
const status = scope.row.status === 1 ? 0 : 1;
|
||||||
|
return handleChangeWater(status, scope.row);
|
||||||
|
}
|
||||||
|
"
|
||||||
|
:inactive-value="1"
|
||||||
|
active-text="合闸"
|
||||||
|
inactive-text="拉闸"
|
||||||
></el-switch>
|
></el-switch>
|
||||||
|
<span v-else>---</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column> -->
|
</el-table-column>
|
||||||
<el-table-column min-width="120" label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
|
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作" min-width="120">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<el-button link type="primary" @click="handleRecode(scope.row)">充值记录</el-button>
|
<el-button link type="primary" @click="handleRecode(scope.row)">充值记录</el-button>
|
||||||
<el-button link type="primary" @click="handleQrCode(scope.row)"
|
<el-button link type="primary" @click="handleQrCode(scope.row)">生成条码</el-button>
|
||||||
>生成条码</el-button
|
<el-button link type="primary" @click="handleOpenDialog('usedWater', scope.row)">用电量</el-button>
|
||||||
>
|
<el-button link type="primary" @click="handleOpenDialog('recharge', scope.row)">充值</el-button>
|
||||||
<el-button link type="primary" @click="handleOpenDialog('usedWater', scope.row)"
|
<!-- <el-button link type="primary" @click="handleOpenDialog('price', scope.row)">设置价格</el-button>-->
|
||||||
>用电量</el-button
|
<el-button v-if="!scope.row.houseName" link type="primary" @click="handleOpenDialog('UpdateHouse', scope.row)">绑定房屋</el-button>
|
||||||
>
|
<el-button v-else link type="primary" @click="handleUnbind(scope.row)">解绑房屋</el-button>
|
||||||
<!-- <el-button
|
<el-button link type="primary" @click="handleUpload(scope.row)">更新数据</el-button>
|
||||||
link
|
|
||||||
type="primary"
|
|
||||||
@click="handleOpenDialog('Upload', scope.row)"
|
|
||||||
v-has-permi="['equipment:updatehardware:electricitydevice']"
|
|
||||||
>更新固件</el-button
|
|
||||||
> -->
|
|
||||||
<el-button
|
|
||||||
link
|
|
||||||
v-if="!scope.row.houseName"
|
|
||||||
type="primary"
|
|
||||||
@click="handleOpenDialog('UpdateHouse', scope.row)"
|
|
||||||
>绑定房屋</el-button
|
|
||||||
>
|
|
||||||
<el-button v-else link type="primary" @click="handleUnbind(scope.row)"
|
|
||||||
>解绑房屋</el-button
|
|
||||||
>
|
|
||||||
<!-- <el-dropdown style="vertical-align: text-top">
|
|
||||||
<el-button link type="primary">
|
|
||||||
<div>
|
|
||||||
更多<el-icon><arrow-down /></el-icon>
|
|
||||||
</div>
|
|
||||||
</el-button>
|
|
||||||
<template #dropdown>
|
|
||||||
<el-dropdown-menu>
|
|
||||||
<el-dropdown-item>
|
|
||||||
<div @click="handleOpenDialog('usedWater', scope.row)" v-has-permi="['equipment:used:electricitydevice']">用电量</div>
|
|
||||||
</el-dropdown-item>
|
|
||||||
<el-dropdown-item>
|
|
||||||
<div @click="handleOpenDialog('Upload', scope.row)" v-has-permi="['equipment:updatehardware:electricitydevice']">更新固件</div>
|
|
||||||
</el-dropdown-item>
|
|
||||||
<el-dropdown-item>
|
|
||||||
<div @click="handleOpenDialog('UpdateHouse', scope.row)" v-has-permi="['equipment:edithouse:electricitydevice']">修改</div>
|
|
||||||
</el-dropdown-item>
|
|
||||||
</el-dropdown-menu>
|
|
||||||
</template>
|
|
||||||
</el-dropdown> -->
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
<!-- 添加或修改电 设备对话框 -->
|
<!-- 添加或修改电 设备对话框 -->
|
||||||
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
|
<el-dialog v-model="dialog.visible" :title="dialog.title" append-to-body width="500px">
|
||||||
<el-form v-if="dialogType === 'usedWater'" :rules="rules" ref="UsedWaterFormRef" :model="UsedWaterform" label-width="100px">
|
<el-form v-if="dialogType === 'usedWater'" ref="UsedWaterFormRef" :model="UsedWaterForm" :rules="rules" label-width="100px">
|
||||||
<el-form-item label="设备编号" prop="deviceCode"> {{ UsedWaterform.deviceCode }} </el-form-item>
|
<el-form-item label="设备编号" prop="deviceCode"> {{ UsedWaterForm.deviceCode }} </el-form-item>
|
||||||
<el-form-item label="开始时间" prop="startTime">
|
<el-form-item label="开始时间" prop="startTime">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
|
v-model="UsedWaterForm.startTime"
|
||||||
format="YYYY-MM-DD HH:mm:ss"
|
format="YYYY-MM-DD HH:mm:ss"
|
||||||
value-format="YYYY-MM-DD HH:mm:ss"
|
|
||||||
v-model="UsedWaterform.startTime"
|
|
||||||
type="datetime"
|
|
||||||
@update:model-value="handleStarTime"
|
|
||||||
placeholder="开始时间"
|
placeholder="开始时间"
|
||||||
|
type="datetime"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
@update:model-value="handleStarTime"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="结束时间" prop="endTime">
|
<el-form-item label="结束时间" prop="endTime">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
|
v-model="UsedWaterForm.endTime"
|
||||||
format="YYYY-MM-DD HH:mm:ss"
|
format="YYYY-MM-DD HH:mm:ss"
|
||||||
value-format="YYYY-MM-DD HH:mm:ss"
|
|
||||||
v-model="UsedWaterform.endTime"
|
|
||||||
type="datetime"
|
|
||||||
@update:model-value="handleEndTime"
|
|
||||||
placeholder="结束时间"
|
placeholder="结束时间"
|
||||||
|
type="datetime"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
@update:model-value="handleEndTime"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
@@ -189,14 +164,14 @@
|
|||||||
<el-form-item label="上传更新文件" prop="file">
|
<el-form-item label="上传更新文件" prop="file">
|
||||||
<el-upload
|
<el-upload
|
||||||
ref="uploadRef"
|
ref="uploadRef"
|
||||||
accept=".bin"
|
|
||||||
:action="uploadUrl"
|
:action="uploadUrl"
|
||||||
name="file"
|
|
||||||
:headers="headerToken()"
|
|
||||||
:show-file-list="true"
|
|
||||||
class="upload-demo"
|
|
||||||
:on-success="handleAvatarSuccess"
|
|
||||||
:before-upload="beforeAvatarUpload"
|
:before-upload="beforeAvatarUpload"
|
||||||
|
:headers="headerToken()"
|
||||||
|
:on-success="handleAvatarSuccess"
|
||||||
|
:show-file-list="true"
|
||||||
|
accept=".bin"
|
||||||
|
class="upload-demo"
|
||||||
|
name="file"
|
||||||
>
|
>
|
||||||
<div class="uploadFileBox flex flex-items-center">
|
<div class="uploadFileBox flex flex-items-center">
|
||||||
<el-icon>
|
<el-icon>
|
||||||
@@ -223,40 +198,112 @@
|
|||||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm">更新到设备</el-button>
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">更新到设备</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
<el-form v-else-if="dialogType === 'recharge'" ref="rechargeFormRef" :model="reChargeForm" label-width="100px">
|
||||||
|
<el-form-item label="充值金额" prop="amount">
|
||||||
|
<el-input-number v-model.trim.number="reChargeForm.amount" :max="99999" :min="0" :step="0.1"> </el-input-number
|
||||||
|
><span style="padding-left: 10px">¥</span>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="支付方式" prop="payType">
|
||||||
|
<el-select v-model="reChargeForm.payType" placeholder="请选择支付方式">
|
||||||
|
<el-option v-for="(item, index) in com_pay_method" :key="index" :label="item.label" :value="item.value"></el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="unSubmit">取消</el-button>
|
||||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">充值</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<el-form v-else-if="dialogType === 'price'" ref="priceFormRef" :model="priceForm" label-width="100px">
|
||||||
|
<el-form-item label="电表价格" prop="price">
|
||||||
|
<el-input-number v-model.trim.number="priceForm.price" :max="99999" :min="0" :step="0.1"> </el-input-number
|
||||||
|
><span style="padding-left: 10px">(元/kw·h)</span>
|
||||||
|
</el-form-item>
|
||||||
|
<!-- <el-form-item label="欠费阈值" prop="arrearsThreshold">-->
|
||||||
|
<!-- <el-input-number v-model.trim.number="priceForm.arrearsThreshold" :max="99999" :min="0" :step="0.1"> </el-input-number-->
|
||||||
|
<!-- ><span style="padding-left: 10px">元</span>-->
|
||||||
|
<!-- </el-form-item>-->
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="unSubmit">取消</el-button>
|
||||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">设置价格</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<el-form
|
||||||
|
v-else-if="dialogType === 'UploadDevices'"
|
||||||
|
ref="UploadDevicesFormRef"
|
||||||
|
:model="UploadDevicesFiles"
|
||||||
|
:rule="UploadDevicesFilesRules"
|
||||||
|
label-width="120px"
|
||||||
|
>
|
||||||
|
<el-form-item label="上传设备文件" prop="file">
|
||||||
|
<el-upload
|
||||||
|
ref="UploadDevicesRef"
|
||||||
|
v-model:file-list="UploadDevicesFiles.file"
|
||||||
|
:action="uploadDevicesUrl"
|
||||||
|
:auto-upload="false"
|
||||||
|
:headers="headerToken()"
|
||||||
|
:limit="1"
|
||||||
|
:on-change="handleChangeUploadDevices"
|
||||||
|
:on-exceed="handleExceed"
|
||||||
|
:show-file-list="true"
|
||||||
|
accept=".xls, .xlsx"
|
||||||
|
class="upload-demo"
|
||||||
|
name="file"
|
||||||
|
>
|
||||||
|
<div class="uploadFileBox flex flex-items-center">
|
||||||
|
<el-icon>
|
||||||
|
<upload></upload>
|
||||||
|
</el-icon>
|
||||||
|
<div style="margin-left: 10px">上传文件</div>
|
||||||
|
</div>
|
||||||
|
<template #tip>
|
||||||
|
<div class="el-upload__tip">文件必须是 <strong>excel</strong> 文件</div>
|
||||||
|
</template>
|
||||||
|
</el-upload>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="unSubmit">取消</el-button>
|
||||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> 上传 </el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
<div v-show="!usedWaterInfo" class="usedWaterbox">
|
<div v-show="!usedWaterInfo" class="usedWaterBox">
|
||||||
<div class="useditem">查询用电量开始时间</div>
|
<div class="usedItem">查询用电量开始时间</div>
|
||||||
<div class="useditem value">{{ UsedWaterInfo.startTime }}</div>
|
<div class="usedItem value">{{ UsedWaterInfo.startTime }}</div>
|
||||||
<div class="useditem">查询用电量结束时间</div>
|
<div class="usedItem">查询用电量结束时间</div>
|
||||||
<div class="useditem value">{{ UsedWaterInfo.endTime }}</div>
|
<div class="usedItem value">{{ UsedWaterInfo.endTime }}</div>
|
||||||
<div class="useditem">用电量</div>
|
<div class="usedItem">用电量</div>
|
||||||
<div class="useditem value">{{ UsedWaterInfo.count }}</div>
|
<div class="usedItem value">{{ UsedWaterInfo.count }}</div>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="WaterDevice" lang="ts">
|
<script lang="ts" name="WaterDevice" setup>
|
||||||
import {
|
import {
|
||||||
ElectricityDeviceMakerQrcode,
|
ElectricityDeviceMakerQrcode,
|
||||||
|
ElectricityDeviceRecharge,
|
||||||
ElectricityDeviceUnbind,
|
ElectricityDeviceUnbind,
|
||||||
getElectricityDeviceTimeRangeUsedWater,
|
getElectricityDeviceTimeRangeUsedWater,
|
||||||
listElectricityDevice,
|
listElectricityDevice,
|
||||||
updateElectricityDevice
|
setElectricityDevicePrice,
|
||||||
|
setElectricityDeviceSwitchStatus,
|
||||||
|
updateElectricityDevice,
|
||||||
|
updateElectricityDeviceData,
|
||||||
|
uploadElectricityDevices
|
||||||
} from '@/api/system/SdbElectricityDevice';
|
} from '@/api/system/SdbElectricityDevice';
|
||||||
import { ElectricityDeviceVO } from '@/api/system/SdbElectricityDevice/type';
|
import { ElectricityDeviceVO } from '@/api/system/SdbElectricityDevice/type';
|
||||||
import { useHouseStore } from '@/store/modules/house';
|
import { useHouseStore } from '@/store/modules/house';
|
||||||
import { useUserStore } from '@/store/modules/user';
|
import { useUserStore } from '@/store/modules/user';
|
||||||
import { checkPermi } from '@/utils/permission';
|
|
||||||
import { Upload } from '@element-plus/icons-vue';
|
import { Upload } from '@element-plus/icons-vue';
|
||||||
import { CascaderValue, UploadProps, UploadRawFile } from 'element-plus';
|
import { CascaderValue, genFileId, UploadProps, UploadRawFile } from 'element-plus';
|
||||||
import { exportImagesToZip } from '@/utils/exportZip';
|
import { exportImagesToZip } from '@/utils/exportZip';
|
||||||
|
|
||||||
const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/electricityDevice/upload';
|
const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/electricityDevice/upload';
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||||
const { com_waterdevice_on_status } = toRefs<any>(proxy?.useDict('com_waterdevice_on_status'));
|
const { com_waterdevice_on_status, com_electricity_readrecord_status, com_pay_method } = toRefs<any>(
|
||||||
const { com_electricity_readrecord_status } = toRefs<any>(proxy?.useDict('com_electricity_readrecord_status'));
|
proxy?.useDict('com_waterdevice_on_status', 'com_electricity_readrecord_status', 'com_pay_method')
|
||||||
|
);
|
||||||
|
|
||||||
const ElectricityDeviceList = ref<ElectricityDeviceVO[]>([]);
|
const ElectricityDeviceList = ref<ElectricityDeviceVO[]>([]);
|
||||||
const buttonLoading = ref(false);
|
const buttonLoading = ref(false);
|
||||||
@@ -297,7 +344,7 @@ const getList = async () => {
|
|||||||
// ! 用电量 =============================================================================
|
// ! 用电量 =============================================================================
|
||||||
const usedWaterInfo = ref(true);
|
const usedWaterInfo = ref(true);
|
||||||
const UsedWaterFormRef = ref(null);
|
const UsedWaterFormRef = ref(null);
|
||||||
const UsedWaterform = ref({
|
const UsedWaterForm = ref({
|
||||||
deviceCode: '',
|
deviceCode: '',
|
||||||
startTime: '',
|
startTime: '',
|
||||||
endTime: ''
|
endTime: ''
|
||||||
@@ -314,9 +361,9 @@ const rules = {
|
|||||||
function handleStarTime(val: string) {
|
function handleStarTime(val: string) {
|
||||||
if (!val) return;
|
if (!val) return;
|
||||||
const current = new Date(val).getTime();
|
const current = new Date(val).getTime();
|
||||||
if (UsedWaterform.value.endTime && UsedWaterform.value.startTime) {
|
if (UsedWaterForm.value.endTime && UsedWaterForm.value.startTime) {
|
||||||
if (current > new Date(UsedWaterform.value.endTime).getTime()) {
|
if (current > new Date(UsedWaterForm.value.endTime).getTime()) {
|
||||||
UsedWaterform.value.endTime = '';
|
UsedWaterForm.value.endTime = '';
|
||||||
ElMessage.warning('开始时间不能大于结束时间');
|
ElMessage.warning('开始时间不能大于结束时间');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -324,9 +371,9 @@ function handleStarTime(val: string) {
|
|||||||
function handleEndTime(val: string) {
|
function handleEndTime(val: string) {
|
||||||
if (!val) return;
|
if (!val) return;
|
||||||
const current = new Date(val).getTime();
|
const current = new Date(val).getTime();
|
||||||
if (UsedWaterform.value.startTime && UsedWaterform.value.endTime) {
|
if (UsedWaterForm.value.startTime && UsedWaterForm.value.endTime) {
|
||||||
if (current < new Date(UsedWaterform.value.startTime).getTime()) {
|
if (current < new Date(UsedWaterForm.value.startTime).getTime()) {
|
||||||
UsedWaterform.value.startTime = '';
|
UsedWaterForm.value.startTime = '';
|
||||||
ElMessage.warning('结束时间不能小于开始时间');
|
ElMessage.warning('结束时间不能小于开始时间');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -457,28 +504,108 @@ function handleChange(val: CascaderValue) {
|
|||||||
EditHouseForm.value.houseId = val[2];
|
EditHouseForm.value.houseId = val[2];
|
||||||
}
|
}
|
||||||
// * house
|
// * house
|
||||||
const dialogType = ref<'usedWater' | 'Upload' | 'UpdateHouse'>('usedWater');
|
|
||||||
|
// recharge
|
||||||
|
const reChargeForm = ref({
|
||||||
|
deviceCode: '',
|
||||||
|
amount: 0,
|
||||||
|
payType: ''
|
||||||
|
});
|
||||||
|
// recharge
|
||||||
|
|
||||||
|
const priceFormRef = ref(null);
|
||||||
|
const priceForm = ref({
|
||||||
|
deviceCode: '',
|
||||||
|
// 电价
|
||||||
|
price: 0,
|
||||||
|
// 欠费阈值
|
||||||
|
arrearsThreshold: 0
|
||||||
|
});
|
||||||
|
// devices
|
||||||
|
const UploadDevicesFormRef = ref(null);
|
||||||
|
const UploadDevicesRef = ref(null);
|
||||||
|
const UploadDevicesLoading = ref(false);
|
||||||
|
const UploadDevicesFiles = ref({
|
||||||
|
file: []
|
||||||
|
});
|
||||||
|
const UploadDevicesFilesRules = ref({
|
||||||
|
file: [{ required: true, message: '设备文件不能为空', trigger: 'blur' }],
|
||||||
|
manufacturer: [{ required: true, message: '厂商标识不能为空', trigger: 'blur' }]
|
||||||
|
});
|
||||||
|
const uploadDevicesUrl = import.meta.env.VITE_APP_BASE_API + '/electricityDevice/importData';
|
||||||
|
const beforeAvatarUploadDevices: UploadProps['beforeUpload'] = (rawFile: UploadRawFile) => {
|
||||||
|
// 1. 校验后缀
|
||||||
|
if (!rawFile.name.endsWith('.xls') && !rawFile.name.endsWith('.xlsx')) {
|
||||||
|
ElMessage.warning('请上传 .xls, .xlsx 后缀的文件');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const typeList = ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/octet-stream'];
|
||||||
|
// 2. 校验文件类型(bin 文件类型)
|
||||||
|
if (!typeList.includes(rawFile.type) && rawFile.type !== '') {
|
||||||
|
ElMessage.warning('文件类型不正确,请上传标准 excel 文件');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 校验文件大小(不能空)
|
||||||
|
// 小于5m 1024 * 1024 * 5
|
||||||
|
if (rawFile.size <= 0) {
|
||||||
|
ElMessage.warning('上传 excel 文件不能为空');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rawFile.size >= 1024 * 1024 * 5) {
|
||||||
|
ElMessage.warning('上传 excel 文件不能超过5M');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
const handleExceed: UploadProps['onExceed'] = (files) => {
|
||||||
|
UploadDevicesRef.value!.clearFiles();
|
||||||
|
const file = files[0] as UploadRawFile;
|
||||||
|
file.uid = genFileId();
|
||||||
|
UploadDevicesRef.value!.handleStart(file);
|
||||||
|
};
|
||||||
|
const handleChangeUploadDevices: UploadProps['onChange'] = (uploadFile: UploadFile) => {
|
||||||
|
if (!beforeAvatarUploadDevices(uploadFile.raw)) {
|
||||||
|
UploadDevicesRef.value!.clearFiles();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
type dialogTypeList = 'usedWater' | 'Upload' | 'UpdateHouse' | 'UploadDevices' | 'recharge' | 'price';
|
||||||
|
|
||||||
|
const dialogType = ref<dialogTypeList>('usedWater');
|
||||||
/** 用电量 更新固件 */
|
/** 用电量 更新固件 */
|
||||||
const handleOpenDialog = (type: 'usedWater' | 'Upload' | 'UpdateHouse', row: ElectricityDeviceVO) => {
|
const handleOpenDialog = (type: dialogTypeList, row?: ElectricityDeviceVO) => {
|
||||||
reset();
|
reset();
|
||||||
dialog.visible = true;
|
dialog.visible = true;
|
||||||
dialogType.value = type;
|
dialogType.value = type;
|
||||||
dialog.title = type === 'usedWater' ? '用电量' : type === 'UpdateHouse' ? '编辑户号' : '更新固件';
|
|
||||||
|
|
||||||
if (type === 'usedWater') {
|
if (type === 'usedWater') {
|
||||||
UsedWaterform.value.deviceCode = row.deviceCode;
|
dialog.title = '用电量';
|
||||||
UsedWaterform.value.startTime = '';
|
UsedWaterForm.value.deviceCode = row.deviceCode;
|
||||||
UsedWaterform.value.endTime = '';
|
UsedWaterForm.value.startTime = '';
|
||||||
|
UsedWaterForm.value.endTime = '';
|
||||||
usedWaterInfo.value = true;
|
usedWaterInfo.value = true;
|
||||||
} else if (type === 'Upload') {
|
} else if (type === 'Upload') {
|
||||||
|
dialog.title = '更新固件';
|
||||||
UploadFileForm.value.file = '';
|
UploadFileForm.value.file = '';
|
||||||
UploadFileForm.value.deviceCode = row.deviceCode;
|
UploadFileForm.value.deviceCode = row.deviceCode;
|
||||||
UploadFileForm.value.id = row.id;
|
UploadFileForm.value.id = row.id;
|
||||||
|
} else if (type === 'recharge') {
|
||||||
|
// 充值
|
||||||
|
dialog.title = '充值';
|
||||||
|
reChargeForm.value.deviceCode = row.deviceCode;
|
||||||
|
reChargeForm.value.amount = 0;
|
||||||
|
} else if (type === 'price') {
|
||||||
|
dialog.title = '设置电价';
|
||||||
|
priceForm.value.deviceCode = row.deviceCode;
|
||||||
|
priceForm.value.price = row.price ? Number(row.price) : 0;
|
||||||
} else if (type === 'UpdateHouse') {
|
} else if (type === 'UpdateHouse') {
|
||||||
|
dialog.title = '编辑户号';
|
||||||
EditHouseForm.value.id = row.id;
|
EditHouseForm.value.id = row.id;
|
||||||
EditHouseForm.value.deviceCode = row.deviceCode;
|
EditHouseForm.value.deviceCode = row.deviceCode;
|
||||||
EditHouseForm.value.houseId = '';
|
EditHouseForm.value.houseId = '';
|
||||||
getTree();
|
getTree();
|
||||||
|
} else if (dialogType.value === 'UploadDevices') {
|
||||||
|
dialog.title = '上传设备文件';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -501,20 +628,40 @@ function getTree() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 数据上传
|
||||||
|
function handleUpload(row: ElectricityDeviceVO) {
|
||||||
|
updateElectricityDeviceData({
|
||||||
|
deviceCode: row.deviceCode
|
||||||
|
}).then(() => {
|
||||||
|
proxy?.$modal.msgSuccess('操作成功');
|
||||||
|
getList();
|
||||||
|
});
|
||||||
|
}
|
||||||
/** 电表 启停*/
|
/** 电表 启停*/
|
||||||
// TODO 修改电表 启停
|
const handleChangeWater = (val: number, row: ElectricityDeviceVO): Promise<boolean> => {
|
||||||
// const handleChangeWater = (val: string, row: ElectricityDeviceVO) => {};
|
return new Promise((resolve, reject) => {
|
||||||
|
setElectricityDeviceSwitchStatus({
|
||||||
|
deviceCode: row.deviceCode,
|
||||||
|
status: val
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
proxy?.$modal.msgSuccess('操作成功');
|
||||||
|
resolve(true);
|
||||||
|
})
|
||||||
|
.catch(() => reject(false));
|
||||||
|
});
|
||||||
|
};
|
||||||
/** 提交按钮 */
|
/** 提交按钮 */
|
||||||
const submitForm = () => {
|
const submitForm = () => {
|
||||||
if (dialogType.value === 'usedWater') {
|
if (dialogType.value === 'usedWater') {
|
||||||
if (UsedWaterform.value.startTime === '' || UsedWaterform.value.endTime === '') {
|
if (UsedWaterForm.value.startTime === '' || UsedWaterForm.value.endTime === '') {
|
||||||
ElMessage.warning('请选择时间');
|
ElMessage.warning('请选择时间');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
UsedWaterFormRef.value?.validate(async (valid: boolean) => {
|
UsedWaterFormRef.value?.validate(async (valid: boolean) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
buttonLoading.value = true;
|
buttonLoading.value = true;
|
||||||
await getElectricityDeviceTimeRangeUsedWater(UsedWaterform.value)
|
await getElectricityDeviceTimeRangeUsedWater(UsedWaterForm.value)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
UsedWaterInfo.value.endTime = res.data.endTime;
|
UsedWaterInfo.value.endTime = res.data.endTime;
|
||||||
UsedWaterInfo.value.startTime = res.data.startTime;
|
UsedWaterInfo.value.startTime = res.data.startTime;
|
||||||
@@ -535,18 +682,58 @@ const submitForm = () => {
|
|||||||
unSubmit();
|
unSubmit();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else if (dialogType.value === 'UploadDevices') {
|
||||||
|
UploadDevicesFormRef.value?.validate(async (valid: boolean) => {
|
||||||
|
if (valid) {
|
||||||
|
if (UploadDevicesFiles.value.file.length <= 0) {
|
||||||
|
return ElMessage.warning('上传文件不能为空');
|
||||||
|
}
|
||||||
|
UploadDevicesLoading.value = true;
|
||||||
|
buttonLoading.value = true;
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('file', UploadDevicesFiles.value.file[0].raw);
|
||||||
|
uploadElectricityDevices(formData)
|
||||||
|
.then(() => {
|
||||||
|
proxy?.$modal.msgSuccess('操作成功');
|
||||||
|
getList();
|
||||||
|
unSubmit();
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
buttonLoading.value = false;
|
||||||
|
UploadDevicesLoading.value = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else if (dialogType.value === 'recharge') {
|
||||||
|
buttonLoading.value = true;
|
||||||
|
ElectricityDeviceRecharge(reChargeForm.value)
|
||||||
|
.then(() => {
|
||||||
|
getList();
|
||||||
|
proxy?.$modal.msgSuccess('操作成功');
|
||||||
|
unSubmit();
|
||||||
|
})
|
||||||
|
.finally(() => (buttonLoading.value = false));
|
||||||
|
} else if (dialogType.value === 'price') {
|
||||||
|
buttonLoading.value = true;
|
||||||
|
setElectricityDevicePrice(priceForm.value)
|
||||||
|
.then(() => {
|
||||||
|
getList();
|
||||||
|
proxy?.$modal.msgSuccess('操作成功');
|
||||||
|
unSubmit();
|
||||||
|
})
|
||||||
|
.finally(() => (buttonLoading.value = false));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const unSubmit = () => {
|
const unSubmit = () => {
|
||||||
reset();
|
reset();
|
||||||
dialog.visible = false;
|
dialog.visible = false;
|
||||||
dialog.title = '';
|
dialog.title = '';
|
||||||
uploadRef?.value.clearFiles();
|
uploadRef.value && uploadRef?.value.clearFiles();
|
||||||
};
|
};
|
||||||
/** 表单重置 */
|
/** 表单重置 */
|
||||||
const reset = () => {
|
const reset = () => {
|
||||||
usedWaterInfo.value = true;
|
usedWaterInfo.value = true;
|
||||||
UsedWaterform.value = {
|
UsedWaterForm.value = {
|
||||||
deviceCode: '',
|
deviceCode: '',
|
||||||
startTime: '',
|
startTime: '',
|
||||||
endTime: ''
|
endTime: ''
|
||||||
@@ -561,13 +748,20 @@ const reset = () => {
|
|||||||
deviceCode: '',
|
deviceCode: '',
|
||||||
id: ''
|
id: ''
|
||||||
};
|
};
|
||||||
|
UploadDevicesFiles.value = {
|
||||||
|
file: []
|
||||||
|
};
|
||||||
UploadFileForm.value.file = '';
|
UploadFileForm.value.file = '';
|
||||||
// 上传 清空
|
// 上传 清空
|
||||||
UploadFileFormRef.value?.resetFields();
|
UploadFileFormRef.value?.resetFields();
|
||||||
// 使用电量 清空
|
// 绑定房屋 清空
|
||||||
EditHouseFormRef.value?.resetFields();
|
EditHouseFormRef.value?.resetFields();
|
||||||
// 使用电量 清空
|
// 使用电量 清空
|
||||||
UsedWaterFormRef.value?.resetFields();
|
UsedWaterFormRef.value?.resetFields();
|
||||||
|
|
||||||
|
UploadDevicesFormRef.value?.resetFields();
|
||||||
|
UploadDevicesRef.value && UploadDevicesRef.value?.clearFiles();
|
||||||
|
UploadDevicesLoading.value = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 搜索按钮操作 */
|
/** 搜索按钮操作 */
|
||||||
@@ -586,11 +780,11 @@ const router = useRouter();
|
|||||||
|
|
||||||
/** 充值记录 */
|
/** 充值记录 */
|
||||||
const handleRecode = (row: ElectricityDeviceVO) => {
|
const handleRecode = (row: ElectricityDeviceVO) => {
|
||||||
// 1.电表 2.电表
|
// 1.电表 2.水表
|
||||||
router.push({
|
router.push({
|
||||||
path: '/equipment/electricityTopupRecord',
|
path: '/equipment/electricityTopupRecord',
|
||||||
query: {
|
query: {
|
||||||
type: '2',
|
type: '1',
|
||||||
houseName: row.houseName,
|
houseName: row.houseName,
|
||||||
deviceCode: row.deviceCode,
|
deviceCode: row.deviceCode,
|
||||||
id: row.id
|
id: row.id
|
||||||
@@ -613,6 +807,12 @@ const download = (url: string) => {
|
|||||||
link.click();
|
link.click();
|
||||||
document.body.removeChild(link);
|
document.body.removeChild(link);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
const handleExport = () => {
|
||||||
|
proxy?.download('/electricityDevice/importTemplate', {}, `电表导入设备模板_${new Date().getTime()}.xlsx`);
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@@ -644,10 +844,10 @@ const download = (url: string) => {
|
|||||||
height: calc(100% - 80px);
|
height: calc(100% - 80px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.usedWaterbox {
|
.usedWaterBox {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border: 1px solid #eef0ff;
|
border: 1px solid #eef0ff;
|
||||||
.useditem {
|
.usedItem {
|
||||||
height: 42px;
|
height: 42px;
|
||||||
line-height: 42px;
|
line-height: 42px;
|
||||||
background-color: rgba(26, 117, 255, 0.1);
|
background-color: rgba(26, 117, 255, 0.1);
|
||||||
|
|||||||
@@ -4,24 +4,24 @@
|
|||||||
<div class="AddBuildingBody">
|
<div class="AddBuildingBody">
|
||||||
<div class="title">基本信息</div>
|
<div class="title">基本信息</div>
|
||||||
<div class="addBuildingFormBody">
|
<div class="addBuildingFormBody">
|
||||||
<el-form label-position="right" class="formBody" ref="formRef" :model="form" :rules="rules" label-width="130px">
|
<el-form ref="formRef" :model="form" :rules="rules" class="formBody" label-position="right" label-width="130px">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<el-form-item label="区域名称" prop="areaName">
|
<el-form-item label="区域名称" prop="areaName">
|
||||||
<el-input maxlength="8" show-word-limit v-model.trim="form.areaName" placeholder="请输入区域名称" />
|
<el-input v-model.trim="form.areaName" maxlength="8" placeholder="请输入区域名称" show-word-limit />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<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="areaCode">
|
<el-form-item label="区域编号" prop="areaCode">
|
||||||
<el-input maxlength="8" v-model.trim="form.areaCode" placeholder="请输入区域编号" />
|
<el-input v-model.trim="form.areaCode" maxlength="8" placeholder="请输入区域编号" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<el-form-item label="区域面积" prop="area">
|
<el-form-item label="区域面积" prop="area">
|
||||||
<el-input maxlength="8" v-model.number.trim="form.area" placeholder="请输入区域面积">
|
<el-input v-model.number.trim="form.area" maxlength="8" placeholder="请输入区域面积">
|
||||||
<template #suffix>㎡</template>
|
<template #suffix>㎡</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -29,14 +29,14 @@
|
|||||||
<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="parkingCount">
|
<el-form-item label="车位数量" prop="parkingCount">
|
||||||
<el-input maxlength="5" v-model.number.trim="form.parkingCount" placeholder="请输入车位数量" />
|
<el-input v-model.number.trim="form.parkingCount" maxlength="5" placeholder="请输入车位数量" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
<el-input type="textarea" maxlength="200" show-word-limit :rows="5" v-model.trim="form.remark" placeholder="请输入" />
|
<el-input v-model.trim="form.remark" :rows="5" maxlength="200" placeholder="请输入" show-word-limit type="textarea" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { addArea, getArea, updateArea } from '@/api/system/carArea';
|
import { addArea, getArea, updateArea } from '@/api/system/carArea';
|
||||||
@@ -114,7 +114,7 @@ const rules = ref({
|
|||||||
{
|
{
|
||||||
validator: (_: any, value: string | number, callback: (arg0?: Error) => void) => {
|
validator: (_: any, value: string | number, callback: (arg0?: Error) => void) => {
|
||||||
if (value === '' || value === null) {
|
if (value === '' || value === null) {
|
||||||
return callback(new Error('请输入区域面积'));
|
return callback();
|
||||||
}
|
}
|
||||||
const val = Number(value);
|
const val = Number(value);
|
||||||
if (Number.isNaN(val)) {
|
if (Number.isNaN(val)) {
|
||||||
@@ -165,7 +165,7 @@ const cancelForm = () => {
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.AddBuildingBox {
|
.AddBuildingBox {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="flex flex-col h-full 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]">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
|
||||||
<el-form-item label="车牌号" prop="carNum">
|
<el-form-item label="车牌号" prop="carNum">
|
||||||
<el-input maxlength="12" v-model.trim="queryParams.carNum" placeholder="请输入车牌号" clearable @keyup.enter="handleQuery" />
|
<el-input v-model.trim="queryParams.carNum" clearable maxlength="12" placeholder="请输入车牌号" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="车辆品牌" prop="carBrand">
|
<el-form-item label="车辆品牌" prop="carBrand">
|
||||||
<el-input maxlength="12" v-model.trim="queryParams.carBrand" placeholder="请输入车辆品牌" clearable @keyup.enter="handleQuery" />
|
<el-input v-model.trim="queryParams.carBrand" clearable maxlength="12" placeholder="请输入车辆品牌" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="车身颜色" prop="carColor">
|
<el-form-item label="车身颜色" prop="carColor">
|
||||||
<el-input maxlength="12" v-model.trim="queryParams.carColor" placeholder="请输入车身颜色" clearable @keyup.enter="handleQuery" />
|
<el-input v-model.trim="queryParams.carColor" clearable maxlength="12" placeholder="请输入车身颜色" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||||
@@ -30,8 +30,8 @@
|
|||||||
:disable-delete="multiple"
|
:disable-delete="multiple"
|
||||||
:disable-edit="single"
|
:disable-edit="single"
|
||||||
:show-add="checkPermi(['car:car:add'])"
|
:show-add="checkPermi(['car:car:add'])"
|
||||||
:show-edit="checkPermi(['car:car:edit'])"
|
|
||||||
:show-delete="checkPermi(['car:car:remove'])"
|
:show-delete="checkPermi(['car:car:remove'])"
|
||||||
|
:show-edit="checkPermi(['car:car:edit'])"
|
||||||
@update:add="handleAdd"
|
@update:add="handleAdd"
|
||||||
@update:edit="handleUpdate()"
|
@update:edit="handleUpdate()"
|
||||||
@update:delete="handleDelete()"
|
@update:delete="handleDelete()"
|
||||||
@@ -39,31 +39,31 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" border :data="carList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="carList" border @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column label="车牌号" align="center" prop="carNum" />
|
<el-table-column align="center" label="车牌号" prop="carNum" />
|
||||||
<el-table-column label="车辆品牌" align="center" prop="carBrand" />
|
<el-table-column align="center" label="车辆品牌" prop="carBrand" />
|
||||||
<el-table-column label="车辆型号" align="center" prop="carModel" />
|
<el-table-column align="center" label="车辆型号" prop="carModel" />
|
||||||
<el-table-column label="车身颜色" align="center" prop="carColor" />
|
<el-table-column align="center" label="车身颜色" prop="carColor" />
|
||||||
<el-table-column label="持有人" align="center" prop="userName">
|
<el-table-column align="center" label="持有人" prop="userName">
|
||||||
<template #default="scope"> {{ scope.row.userName }} </template>
|
<template #default="scope"> {{ scope.row.userName }} </template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
|
<el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip />
|
||||||
<el-table-column label="操作" align="center">
|
<el-table-column align="center" label="操作">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button link type="primary" @click="handleUpdate(scope.row)" v-has-permi="['car:car:edit']">修改</el-button>
|
<el-button v-has-permi="['car:car:edit']" link type="primary" @click="handleUpdate(scope.row)">修改</el-button>
|
||||||
<el-button link type="primary" @click="handleDelete(scope.row)" v-has-permi="['car:car:remove']">删除</el-button>
|
<el-button v-has-permi="['car:car:remove']" link type="primary" @click="handleDelete(scope.row)">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="Car" lang="ts">
|
<script lang="ts" name="Car" setup>
|
||||||
import Pageheader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { listCar, delCar } from '@/api/system/cars';
|
import { listCar, delCar } from '@/api/system/cars';
|
||||||
import { CarVO, CarQuery, CarForm } from '@/api/system/cars/type';
|
import { CarVO, CarQuery, CarForm } from '@/api/system/cars/type';
|
||||||
import { checkPermi } from '@/utils/permission';
|
import { checkPermi } from '@/utils/permission';
|
||||||
|
|||||||
@@ -62,7 +62,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="储藏室" prop="storeroomId">
|
<el-form-item label="储藏室" prop="storeroomId">
|
||||||
<el-select v-model="form.storeroomId" class="m-2" placeholder="请选择储藏室">
|
<el-select v-model="form.storeroomId" class="m-2" clearable placeholder="请选择储藏室" @clear="handleClearStoreRoomId">
|
||||||
<el-option v-for="(item, index) in storeRoomList" :key="index" :label="item.storeroomName" :value="item.id" />
|
<el-option v-for="(item, index) in storeRoomList" :key="index" :label="item.storeroomName" :value="item.id" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -132,7 +132,7 @@ const rules = ref({
|
|||||||
trigger: 'blur'
|
trigger: 'blur'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
validator: (_, value, callback) => {
|
validator: (_: any, value: string, callback: (arg0?: Error) => void) => {
|
||||||
if (value === '' || value === null) {
|
if (value === '' || value === null) {
|
||||||
return callback(new Error('请输入建筑面积'));
|
return callback(new Error('请输入建筑面积'));
|
||||||
} else {
|
} else {
|
||||||
@@ -156,7 +156,7 @@ const rules = ref({
|
|||||||
trigger: 'blur'
|
trigger: 'blur'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
validator: (rule, value, callback) => {
|
validator: (_: any, value: string, callback: (arg0?: Error) => void) => {
|
||||||
if (value === '' || value === null) {
|
if (value === '' || value === null) {
|
||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
@@ -178,7 +178,7 @@ const rules = ref({
|
|||||||
trigger: 'blur'
|
trigger: 'blur'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
validator: (rule, value, callback) => {
|
validator: (_: any, value: string, callback: (arg0?: Error) => void) => {
|
||||||
if (value === '' || value === null) {
|
if (value === '' || value === null) {
|
||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
@@ -259,6 +259,11 @@ async function getEditInfo() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 清空储藏室
|
||||||
|
function handleClearStoreRoomId() {
|
||||||
|
form.value.storeroomId = '';
|
||||||
|
}
|
||||||
// 选择楼栋
|
// 选择楼栋
|
||||||
function handleChangeBuild(id: string) {
|
function handleChangeBuild(id: string) {
|
||||||
queryChangeStore.value.buildingId = id;
|
queryChangeStore.value.buildingId = id;
|
||||||
|
|||||||
@@ -485,7 +485,7 @@ const handleExceed = () => {
|
|||||||
};
|
};
|
||||||
const handleChange = (file: UploadUserFile) => {
|
const handleChange = (file: UploadUserFile) => {
|
||||||
// 过滤上传文件-只允许图片,pdf格式
|
// 过滤上传文件-只允许图片,pdf格式
|
||||||
if (!/^\.(jpg|jpeg|png|gif|pdf)$/i.test(file.name)) {
|
if (!/\.(jpg|jpeg|png|gif|pdf)$/i.test(file.name)) {
|
||||||
ElMessage.warning('只允许上传图片,pdf格式');
|
ElMessage.warning('只允许上传图片,pdf格式');
|
||||||
uploadRef.value?.handleRemove(file);
|
uploadRef.value?.handleRemove(file);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
<el-form-item label="选择日期" prop="statDate">
|
<el-form-item label="选择日期" prop="statDate">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="starDate"
|
v-model="starDate"
|
||||||
|
clearable
|
||||||
end-placeholder="结束日期"
|
end-placeholder="结束日期"
|
||||||
format="YYYY/MM/DD"
|
format="YYYY/MM/DD"
|
||||||
range-separator="到"
|
range-separator="到"
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
type="daterange"
|
type="daterange"
|
||||||
unlink-panels
|
unlink-panels
|
||||||
value-format="YYYY/MM/DD"
|
value-format="YYYY/MM/DD"
|
||||||
|
@clear="handleClear"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
@@ -75,13 +77,18 @@ const data = reactive({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
const starDate = ref([]);
|
const starDate = ref([]);
|
||||||
|
function handleClear() {
|
||||||
|
starDate.value = [];
|
||||||
|
queryParams.value.queryDateBegin = undefined;
|
||||||
|
queryParams.value.queryDateEnd = undefined;
|
||||||
|
}
|
||||||
const { queryParams } = toRefs(data);
|
const { queryParams } = toRefs(data);
|
||||||
|
|
||||||
/** 查询巡检项目列表 */
|
/** 查询巡检项目列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
queryParams.value.statDate = starDate.value.join('-');
|
queryParams.value.statDate = starDate.value.join('-');
|
||||||
queryParams.value.queryDateBegin = starDate.value[0];
|
queryParams.value.queryDateBegin = starDate.value[0] || undefined;
|
||||||
queryParams.value.queryDateEnd = starDate.value[1];
|
queryParams.value.queryDateEnd = starDate.value[1] || undefined;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
listItem(queryParams.value)
|
listItem(queryParams.value)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
<el-form-item label="选择日期" prop="itemName">
|
<el-form-item label="选择日期" prop="itemName">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="starDate"
|
v-model="starDate"
|
||||||
|
clearable
|
||||||
end-placeholder="结束日期"
|
end-placeholder="结束日期"
|
||||||
format="YYYY/MM/DD"
|
format="YYYY/MM/DD"
|
||||||
range-separator="到"
|
range-separator="到"
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
type="daterange"
|
type="daterange"
|
||||||
unlink-panels
|
unlink-panels
|
||||||
value-format="YYYY/MM/DD"
|
value-format="YYYY/MM/DD"
|
||||||
|
@clear="handleClear"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
@@ -64,6 +66,11 @@ const total = ref(0);
|
|||||||
const queryFormRef = ref<ElFormInstance>();
|
const queryFormRef = ref<ElFormInstance>();
|
||||||
|
|
||||||
const starDate = ref([]);
|
const starDate = ref([]);
|
||||||
|
function handleClear() {
|
||||||
|
starDate.value = [];
|
||||||
|
queryParams.value.queryDateBegin = undefined;
|
||||||
|
queryParams.value.queryDateEnd = undefined;
|
||||||
|
}
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
queryParams: {
|
queryParams: {
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
@@ -80,8 +87,8 @@ const { queryParams } = toRefs(data);
|
|||||||
/** 查询巡检项目列表 */
|
/** 查询巡检项目列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
queryParams.value.statDate = starDate.value.join('-');
|
queryParams.value.statDate = starDate.value.join('-');
|
||||||
queryParams.value.queryDateBegin = starDate.value[0];
|
queryParams.value.queryDateBegin = starDate.value[0] || undefined;
|
||||||
queryParams.value.queryDateEnd = starDate.value[1];
|
queryParams.value.queryDateEnd = starDate.value[1] || undefined;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
listItem(queryParams.value)
|
listItem(queryParams.value)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
|
|||||||
@@ -103,10 +103,10 @@ const checkoutWeek = ref([]);
|
|||||||
function checkoutWeekFun(val: number) {
|
function checkoutWeekFun(val: number) {
|
||||||
if (!checkoutWeek.value.includes(val)) {
|
if (!checkoutWeek.value.includes(val)) {
|
||||||
checkoutWeek.value.push(val);
|
checkoutWeek.value.push(val);
|
||||||
form.value.executeDay = checkoutWeek.value.join(',');
|
|
||||||
} else {
|
} else {
|
||||||
checkoutWeek.value = checkoutWeek.value.filter((item) => item !== val);
|
checkoutWeek.value = checkoutWeek.value.filter((item) => item !== val);
|
||||||
}
|
}
|
||||||
|
form.value.executeDay = checkoutWeek.value.join(',');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 提醒时间
|
// 提醒时间
|
||||||
|
|||||||
@@ -118,8 +118,7 @@ const data = reactive<PageData<PlanForm, PlanQuery>>({
|
|||||||
inspectSetting: undefined,
|
inspectSetting: undefined,
|
||||||
routeIds: undefined,
|
routeIds: undefined,
|
||||||
status: undefined,
|
status: undefined,
|
||||||
executeDay: undefined,
|
executeDay: undefined
|
||||||
params: {}
|
|
||||||
},
|
},
|
||||||
rules: {}
|
rules: {}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -13,12 +13,14 @@
|
|||||||
<el-form-item label="巡检日期" prop="taskTime">
|
<el-form-item label="巡检日期" prop="taskTime">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="taskTime"
|
v-model="taskTime"
|
||||||
|
clearable
|
||||||
end-placeholder="结束日期"
|
end-placeholder="结束日期"
|
||||||
format="YYYY-MM-DD"
|
format="YYYY-MM-DD"
|
||||||
range-separator="到"
|
range-separator="到"
|
||||||
start-placeholder="开始日期"
|
start-placeholder="开始日期"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
value-format="YYYY-MM-DD"
|
value-format="YYYY-MM-DD"
|
||||||
|
@clear="handleClear"
|
||||||
@update:model-value="handleDate"
|
@update:model-value="handleDate"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -69,7 +71,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" name="Record" setup>
|
<script lang="ts" name="Record" setup>
|
||||||
import { listRecord, delRecord, addRecord, updateRecord } from '@/api/system/InspectionRecord/index';
|
import { listRecord } from '@/api/system/InspectionRecord';
|
||||||
import { RecordVO, RecordQuery, RecordForm } from '@/api/system/InspectionRecord/type';
|
import { RecordVO, RecordQuery, RecordForm } from '@/api/system/InspectionRecord/type';
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||||
@@ -84,12 +86,6 @@ const multiple = ref(true);
|
|||||||
const total = ref(0);
|
const total = ref(0);
|
||||||
|
|
||||||
const queryFormRef = ref<ElFormInstance>();
|
const queryFormRef = ref<ElFormInstance>();
|
||||||
const recordFormRef = ref<ElFormInstance>();
|
|
||||||
|
|
||||||
const dialog = reactive<DialogOption>({
|
|
||||||
visible: false,
|
|
||||||
title: ''
|
|
||||||
});
|
|
||||||
|
|
||||||
const initFormData: RecordForm = {
|
const initFormData: RecordForm = {
|
||||||
id: undefined,
|
id: undefined,
|
||||||
@@ -115,7 +111,7 @@ const data = reactive<PageData<RecordForm, RecordQuery>>({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const { queryParams, form } = toRefs(data);
|
const { queryParams } = toRefs(data);
|
||||||
|
|
||||||
/** 查询巡检记录主列表 */
|
/** 查询巡检记录主列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
@@ -132,21 +128,15 @@ const getList = async () => {
|
|||||||
|
|
||||||
// 处理日期选择
|
// 处理日期选择
|
||||||
const taskTime = ref([]);
|
const taskTime = ref([]);
|
||||||
const handleDate = (val) => {
|
function handleClear() {
|
||||||
|
queryParams.value.taskTimeBegin = '';
|
||||||
|
queryParams.value.taskTimeEnd = '';
|
||||||
|
}
|
||||||
|
const handleDate = (val: string[]) => {
|
||||||
|
if (val !== null) {
|
||||||
queryParams.value.taskTimeBegin = val[0];
|
queryParams.value.taskTimeBegin = val[0];
|
||||||
queryParams.value.taskTimeEnd = val[1];
|
queryParams.value.taskTimeEnd = val[1];
|
||||||
};
|
}
|
||||||
|
|
||||||
/** 取消按钮 */
|
|
||||||
const cancel = () => {
|
|
||||||
reset();
|
|
||||||
dialog.visible = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** 表单重置 */
|
|
||||||
const reset = () => {
|
|
||||||
form.value = { ...initFormData };
|
|
||||||
recordFormRef.value?.resetFields();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 搜索按钮操作 */
|
/** 搜索按钮操作 */
|
||||||
|
|||||||
@@ -5,9 +5,10 @@
|
|||||||
<div v-show="showSearch" class="mb-[10px]">
|
<div v-show="showSearch" class="mb-[10px]">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<el-form ref="queryFormRef" :inline="true" label-width="120px">
|
<el-form ref="queryFormRef" :inline="true" label-width="120px">
|
||||||
<el-form-item label="选择日期" prop="checkdata">
|
<el-form-item label="选择日期" prop="checkData">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="checkdata"
|
v-model="checkData"
|
||||||
|
clearable
|
||||||
end-placeholder="结束日期"
|
end-placeholder="结束日期"
|
||||||
format="YYYY/MM/DD"
|
format="YYYY/MM/DD"
|
||||||
placeholder="选择日期"
|
placeholder="选择日期"
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
start-placeholder="开始日期"
|
start-placeholder="开始日期"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
value-format="YYYY/MM/DD"
|
value-format="YYYY/MM/DD"
|
||||||
|
@clear="handleClear"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
@@ -75,7 +77,12 @@ const data = reactive({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const checkdata = ref([]);
|
const checkData = ref([]);
|
||||||
|
function handleClear() {
|
||||||
|
checkData.value = [];
|
||||||
|
queryParams.value.queryDateBegin = undefined;
|
||||||
|
queryParams.value.queryDateEnd = undefined;
|
||||||
|
}
|
||||||
const { queryParams } = toRefs(data);
|
const { queryParams } = toRefs(data);
|
||||||
/** 查询巡检路线列表*/
|
/** 查询巡检路线列表*/
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
@@ -92,14 +99,17 @@ const getList = async () => {
|
|||||||
|
|
||||||
/** 搜索按钮操作 */
|
/** 搜索按钮操作 */
|
||||||
const handleQuery = () => {
|
const handleQuery = () => {
|
||||||
queryParams.value.queryDateBegin = checkdata.value[0];
|
queryParams.value.queryDateBegin = checkData.value[0] || undefined;
|
||||||
queryParams.value.queryDateEnd = checkdata.value[1];
|
queryParams.value.queryDateEnd = checkData.value[1] || undefined;
|
||||||
queryParams.value.pageNum = 1;
|
queryParams.value.pageNum = 1;
|
||||||
getList();
|
getList();
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 重置按钮操作 */
|
/** 重置按钮操作 */
|
||||||
const resetQuery = () => {
|
const resetQuery = () => {
|
||||||
|
queryParams.value.queryDateBegin = '';
|
||||||
|
queryParams.value.queryDateEnd = '';
|
||||||
|
checkData.value = [];
|
||||||
queryFormRef.value?.resetFields();
|
queryFormRef.value?.resetFields();
|
||||||
handleQuery();
|
handleQuery();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -6,28 +6,28 @@
|
|||||||
<div>基本信息</div>
|
<div>基本信息</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="bodyBox">
|
<div class="bodyBox">
|
||||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px" label-position="right">
|
<el-form ref="formRef" :model="form" :rules="rules" label-position="right" label-width="120px">
|
||||||
<el-form-item label="任务名称" prop="taskName">
|
<el-form-item label="任务名称" prop="taskName">
|
||||||
<el-input maxlength="20" v-model="form.taskName" placeholder="请输入"></el-input>
|
<el-input v-model="form.taskName" maxlength="20" placeholder="请输入"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="巡检人员" prop="inspectorId">
|
<el-form-item label="巡检人员" prop="inspectorId">
|
||||||
<div class="inspectorIdsBox">
|
<div class="inspectorIdsBox">
|
||||||
<div v-for="(item, index) in checkoutUserlist" :key="index" class="inspector_items">
|
<div v-for="(item, index) in checkoutUserlist" :key="index" class="inspector_items">
|
||||||
<div class="name">{{ item.nickName }}</div>
|
<div class="name">{{ item.nickName }}</div>
|
||||||
<i @click="handleDelete(item.userId)" class="deleteAction">
|
<i class="deleteAction" @click="handleDelete(item.userId)">
|
||||||
<el-icon><Delete /></el-icon>
|
<el-icon><Delete /></el-icon>
|
||||||
</i>
|
</i>
|
||||||
</div>
|
</div>
|
||||||
<RepairUser
|
<RepairUser
|
||||||
titleName="巡检人员"
|
|
||||||
@change="handleUserChange"
|
|
||||||
returnvalue="*"
|
|
||||||
:is-multiple="true"
|
|
||||||
user-type="inspection"
|
|
||||||
ref="RepairUserRef"
|
ref="RepairUserRef"
|
||||||
|
:is-multiple="true"
|
||||||
|
returnvalue="*"
|
||||||
|
titleName="巡检人员"
|
||||||
|
user-type="inspection"
|
||||||
|
@change="handleUserChange"
|
||||||
>
|
>
|
||||||
<template #default>
|
<template #default>
|
||||||
<div @click="handleAddUser" class="inspector_items add flex flex-items-center justify-center">
|
<div class="inspector_items add flex flex-items-center justify-center" @click="handleAddUser">
|
||||||
<el-icon><Plus /></el-icon>
|
<el-icon><Plus /></el-icon>
|
||||||
<span class="ml-10px"> 添加 </span>
|
<span class="ml-10px"> 添加 </span>
|
||||||
</div>
|
</div>
|
||||||
@@ -37,10 +37,13 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="巡更日期" prop="taskTime">
|
<el-form-item label="巡更日期" prop="taskTime">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
|
v-model="taskTime"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
format="YYYY-MM-DD"
|
||||||
range-separator="到"
|
range-separator="到"
|
||||||
start-placeholder="开始日期"
|
start-placeholder="开始日期"
|
||||||
end-placeholder="结束日期"
|
type="daterange"
|
||||||
v-model="taskTime"
|
value-format="YYYY-MM-DD"
|
||||||
@update:model-value="
|
@update:model-value="
|
||||||
(val) => {
|
(val) => {
|
||||||
if (val.length > 0) {
|
if (val.length > 0) {
|
||||||
@@ -48,9 +51,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
"
|
"
|
||||||
type="daterange"
|
|
||||||
format="YYYY-MM-DD"
|
|
||||||
value-format="YYYY-MM-DD"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="提醒时间" prop="remindTime">
|
<el-form-item label="提醒时间" prop="remindTime">
|
||||||
@@ -59,12 +59,12 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="关联计划" prop="planId">
|
<el-form-item label="关联计划" prop="planId">
|
||||||
<el-select @change="handleChangeMap" v-model="form.planId" placeholder="请选择" style="width: 100%">
|
<el-select v-model="form.planId" placeholder="请选择" style="width: 100%" @change="handleChangeMap">
|
||||||
<el-option v-for="item in planList" :disabled="item.status === '1'" :key="item.id" :label="item.planName" :value="item.id" />
|
<el-option v-for="item in planList" :key="item.id" :disabled="item.status === '1'" :label="item.planName" :value="item.id" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="计划路线" prop="planId">
|
<el-form-item label="计划路线" prop="planId">
|
||||||
<MapWrapper v-loading="mapLoading" :disabled="true" ref="MapWrapperRef"></MapWrapper>
|
<MapWrapper ref="MapWrapperRef" v-loading="mapLoading" :disabled="true"></MapWrapper>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="submit">提交</el-button>
|
<el-button type="primary" @click="submit">提交</el-button>
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import RepairUser from '@/components/Holder/repairUser.vue';
|
import RepairUser from '@/components/Holder/repairUser.vue';
|
||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { Delete, Plus } from '@element-plus/icons-vue';
|
import { Delete, Plus } from '@element-plus/icons-vue';
|
||||||
@@ -157,6 +157,7 @@ const mapLoading = ref(false);
|
|||||||
|
|
||||||
const MapWrapperRef = ref<InstanceType<typeof MapWrapper>>();
|
const MapWrapperRef = ref<InstanceType<typeof MapWrapper>>();
|
||||||
|
|
||||||
|
let planWeek = '';
|
||||||
function handleChangeMap(val: string) {
|
function handleChangeMap(val: string) {
|
||||||
mapLoading.value = true;
|
mapLoading.value = true;
|
||||||
const find = planList.value.find((item) => item.id === val);
|
const find = planList.value.find((item) => item.id === val);
|
||||||
@@ -185,8 +186,10 @@ function handleChangeMap(val: string) {
|
|||||||
} else {
|
} else {
|
||||||
mapLoading.value = false;
|
mapLoading.value = false;
|
||||||
}
|
}
|
||||||
|
planWeek = find.executeDay || '';
|
||||||
} else {
|
} else {
|
||||||
mapLoading.value = false;
|
mapLoading.value = false;
|
||||||
|
planWeek = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,6 +204,13 @@ function submit() {
|
|||||||
} else {
|
} else {
|
||||||
form.value.taskTime = '';
|
form.value.taskTime = '';
|
||||||
}
|
}
|
||||||
|
if (planWeek) {
|
||||||
|
const result = hasDateWeekIntersection(taskTime.value[0], taskTime.value[1], planWeek);
|
||||||
|
if (!result) {
|
||||||
|
ElMessage.warning('所选【巡更日期】与【选定计划中执行星期】无重合,请重新选择');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
form.value.inspectorId = checkoutUserlist.value.map((item) => item.userId).join(',');
|
form.value.inspectorId = checkoutUserlist.value.map((item) => item.userId).join(',');
|
||||||
formRef.value?.validate(async (valid: boolean) => {
|
formRef.value?.validate(async (valid: boolean) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
@@ -218,9 +228,39 @@ function submit() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param start "2026-09-11"
|
||||||
|
* @param end "2026-09-15"
|
||||||
|
* @param weekStr "1,2,3" 1周一,2周二,3周三...0周日
|
||||||
|
* @returns boolean 是否存在
|
||||||
|
*/
|
||||||
|
function hasDateWeekIntersection(start: string, end: string, weekStr: string): boolean {
|
||||||
|
const allowWeek = weekStr
|
||||||
|
.split(',')
|
||||||
|
.map(Number)
|
||||||
|
.sort((a, b) => a - b);
|
||||||
|
|
||||||
|
const startDate = new Date(start);
|
||||||
|
const endDate = new Date(end);
|
||||||
|
|
||||||
|
// 循环 可执行星期
|
||||||
|
for (const w of allowWeek) {
|
||||||
|
const startWeek = startDate.getDay();
|
||||||
|
// 计算从start往后到该星期需要的天数偏移
|
||||||
|
const offset = (w - startWeek + 7) % 7;
|
||||||
|
// 判断开始日期到最近的 可执行星期 是否在日期范围内
|
||||||
|
const target = new Date(startDate);
|
||||||
|
target.setDate(target.getDate() + offset);
|
||||||
|
if (target <= endDate) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.EditBody {
|
.EditBody {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
padding: 30px;
|
padding: 30px;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
<el-form-item label="巡检日期" prop="taskTime">
|
<el-form-item label="巡检日期" prop="taskTime">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="taskTime"
|
v-model="taskTime"
|
||||||
|
clearable
|
||||||
end-placeholder="结束日期"
|
end-placeholder="结束日期"
|
||||||
format="YYYY-MM-DD"
|
format="YYYY-MM-DD"
|
||||||
range-separator="到"
|
range-separator="到"
|
||||||
@@ -136,9 +137,11 @@ const getList = async () => {
|
|||||||
};
|
};
|
||||||
const taskTime = ref([]);
|
const taskTime = ref([]);
|
||||||
function handleDate(data: string[]) {
|
function handleDate(data: string[]) {
|
||||||
|
if (data !== null) {
|
||||||
queryParams.value.taskTimeBegin = data[0];
|
queryParams.value.taskTimeBegin = data[0];
|
||||||
queryParams.value.taskTimeEnd = data[1];
|
queryParams.value.taskTimeEnd = data[1];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
function handleClear() {
|
function handleClear() {
|
||||||
queryParams.value.taskTimeBegin = '';
|
queryParams.value.taskTimeBegin = '';
|
||||||
queryParams.value.taskTimeEnd = '';
|
queryParams.value.taskTimeEnd = '';
|
||||||
@@ -153,10 +156,10 @@ const handleQuery = () => {
|
|||||||
|
|
||||||
/** 重置按钮操作 */
|
/** 重置按钮操作 */
|
||||||
const resetQuery = () => {
|
const resetQuery = () => {
|
||||||
queryFormRef.value?.resetFields();
|
|
||||||
queryParams.value.taskTimeBegin = '';
|
queryParams.value.taskTimeBegin = '';
|
||||||
queryParams.value.taskTimeEnd = '';
|
queryParams.value.taskTimeEnd = '';
|
||||||
taskTime.value = [];
|
taskTime.value = [];
|
||||||
|
queryFormRef.value?.resetFields();
|
||||||
handleQuery();
|
handleQuery();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
<el-form-item label="选择日期" prop="itemName">
|
<el-form-item label="选择日期" prop="itemName">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="starDate"
|
v-model="starDate"
|
||||||
|
clearable
|
||||||
end-placeholder="结束日期"
|
end-placeholder="结束日期"
|
||||||
format="YYYY/MM/DD"
|
format="YYYY/MM/DD"
|
||||||
range-separator="到"
|
range-separator="到"
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
type="daterange"
|
type="daterange"
|
||||||
unlink-panels
|
unlink-panels
|
||||||
value-format="YYYY/MM/DD"
|
value-format="YYYY/MM/DD"
|
||||||
|
@clear="handleClear"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
@@ -76,13 +78,18 @@ const data = reactive({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
const starDate = ref([]);
|
const starDate = ref([]);
|
||||||
|
function handleClear() {
|
||||||
|
starDate.value = [];
|
||||||
|
queryParams.value.queryDateBegin = undefined;
|
||||||
|
queryParams.value.queryDateEnd = undefined;
|
||||||
|
}
|
||||||
const { queryParams } = toRefs(data);
|
const { queryParams } = toRefs(data);
|
||||||
|
|
||||||
/** 查询巡检项目列表 */
|
/** 查询巡检项目列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
queryParams.value.statDate = starDate.value.join('-');
|
queryParams.value.statDate = starDate.value.join('-');
|
||||||
queryParams.value.queryDateBegin = starDate.value[0];
|
queryParams.value.queryDateBegin = starDate.value[0] || undefined;
|
||||||
queryParams.value.queryDateEnd = starDate.value[1];
|
queryParams.value.queryDateEnd = starDate.value[1] || undefined;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
listItem(queryParams.value)
|
listItem(queryParams.value)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
|
|||||||
@@ -168,6 +168,10 @@ const rules = ref({
|
|||||||
if (Number.isNaN(val)) {
|
if (Number.isNaN(val)) {
|
||||||
return callback(new Error('请输入数字'));
|
return callback(new Error('请输入数字'));
|
||||||
}
|
}
|
||||||
|
if (val === 0) {
|
||||||
|
//不能输入0
|
||||||
|
return callback(new Error('请输入不等于0的数字'));
|
||||||
|
}
|
||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="ResidentMainBox p-2 w-full h-full">
|
<div class="ResidentMainBox p-2 w-full h-full">
|
||||||
<PageHeader></PageHeader>
|
<PageHeader></PageHeader>
|
||||||
<div class="ResidentMainBody">
|
<div class="ResidentMainBody">
|
||||||
<el-row :span="24" :gutter="20">
|
<el-row :gutter="20" :span="24">
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<!-- 车位信息 -->
|
<!-- 车位信息 -->
|
||||||
<div class="mb-10">
|
<div class="mb-10">
|
||||||
@@ -41,13 +41,13 @@
|
|||||||
<DictTag :options="com_parking_status" :value="parkingReviewInfo.parking.parkingStatus"></DictTag>
|
<DictTag :options="com_parking_status" :value="parkingReviewInfo.parking.parkingStatus"></DictTag>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="carInfo_item" v-if="parkingReviewInfo.parking.residentId">
|
<div v-if="parkingReviewInfo.parking.residentId" class="carInfo_item">
|
||||||
<div class="label">持有人:</div>
|
<div class="label">持有人:</div>
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<span>
|
<span>
|
||||||
{{ parkingReviewInfo.parking.residentName }}
|
{{ parkingReviewInfo.parking.residentName }}
|
||||||
</span>
|
</span>
|
||||||
<el-button @click="getUserInfo" type="primary" link style="font-size: smaller; margin-left: 15px">详情</el-button>
|
<el-button link style="font-size: smaller; margin-left: 15px" type="primary" @click="getUserInfo">详情</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="carInfo_item">
|
<div class="carInfo_item">
|
||||||
@@ -60,16 +60,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="CarInfoBox" style="margin-top: 20px">
|
<div class="CarInfoBox" style="margin-top: 20px">
|
||||||
<div class="carInfo_item" v-if="parkingReviewInfo.parking.contactName">
|
<div v-if="parkingReviewInfo.parking.contactName" class="carInfo_item">
|
||||||
<div class="label">非业主联系人:</div>
|
<div class="label">非业主联系人:</div>
|
||||||
<div class="main">{{ parkingReviewInfo.parking.contactName }}</div>
|
<div class="main">{{ parkingReviewInfo.parking.contactName }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="carInfo_item" style="margin-top: 20px" v-if="parkingReviewInfo.parking.contactPhone">
|
<div v-if="parkingReviewInfo.parking.contactPhone" class="carInfo_item" style="margin-top: 20px">
|
||||||
<div class="label">联系电话:</div>
|
<div class="label">联系电话:</div>
|
||||||
<div class="main">{{ parkingReviewInfo.parking.contactPhone }}</div>
|
<div class="main">{{ parkingReviewInfo.parking.contactPhone }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="carInfo_item" style="margin-top: 20px">
|
<div class="carInfo_item" style="margin-top: 20px">
|
||||||
<div class="label">备注:</div>
|
<div class="label" style="min-width: 120px">备注:</div>
|
||||||
<div class="main">{{ parkingReviewInfo.parking.remark }}</div>
|
<div class="main">{{ parkingReviewInfo.parking.remark }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
<span>车辆信息</span>
|
<span>车辆信息</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div class="w-full h-full CarInfoBox" v-if="parkingReviewInfo.car">
|
<div v-if="parkingReviewInfo.car" class="w-full h-full CarInfoBox">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<div class="carInfo_item">
|
<div class="carInfo_item">
|
||||||
@@ -127,10 +127,10 @@
|
|||||||
<el-image
|
<el-image
|
||||||
v-for="(item, index) in parkingReviewInfo.car.carImageUrlList"
|
v-for="(item, index) in parkingReviewInfo.car.carImageUrlList"
|
||||||
:key="index"
|
:key="index"
|
||||||
class="carInfoImage"
|
|
||||||
:src="item"
|
|
||||||
:initial-index="index"
|
:initial-index="index"
|
||||||
:preview-src-list="parkingReviewInfo.car.carImageUrlList"
|
:preview-src-list="parkingReviewInfo.car.carImageUrlList"
|
||||||
|
:src="item"
|
||||||
|
class="carInfoImage"
|
||||||
preview-teleported
|
preview-teleported
|
||||||
></el-image>
|
></el-image>
|
||||||
</div>
|
</div>
|
||||||
@@ -138,7 +138,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full h-full CarInfoBox flex flex-center min-h-17rem" v-else>
|
<div v-else class="w-full h-full CarInfoBox flex flex-center min-h-17rem">
|
||||||
<span style="color: #999; font-weight: 500; font-size: larger; letter-spacing: 10px">暂无信息</span>
|
<span style="color: #999; font-weight: 500; font-size: larger; letter-spacing: 10px">暂无信息</span>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
@@ -147,7 +147,7 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-dialog width="500" @close="handleClose" v-model="MainForm.visible" title="车位持有人详情">
|
<el-dialog v-model="MainForm.visible" title="车位持有人详情" width="500" @close="handleClose">
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="label">姓名</div>
|
<div class="label">姓名</div>
|
||||||
<div class="value">{{ MainFormInfo.name }}</div>
|
<div class="value">{{ MainFormInfo.name }}</div>
|
||||||
@@ -155,13 +155,13 @@
|
|||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="label">类型</div>
|
<div class="label">类型</div>
|
||||||
<div class="value">
|
<div class="value">
|
||||||
<DictTag :value="MainFormInfo.type" :options="com_resident_relationship"></DictTag>
|
<DictTag :options="com_resident_relationship" :value="MainFormInfo.type"></DictTag>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="label">状态</div>
|
<div class="label">状态</div>
|
||||||
<div class="value">
|
<div class="value">
|
||||||
<DictTag :value="MainFormInfo.status" :options="com_review"></DictTag>
|
<DictTag :options="com_review" :value="MainFormInfo.status"></DictTag>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
<div class="item">
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
</el-dialog>
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { getParkingReviewInfo, getParkingResidentInfo } from '@/api/system/parking';
|
import { getParkingReviewInfo, getParkingResidentInfo } from '@/api/system/parking';
|
||||||
@@ -351,7 +351,7 @@ getInfo();
|
|||||||
// 物业审核状态 0 待审核 1审核通过 2审核未通过
|
// 物业审核状态 0 待审核 1审核通过 2审核未通过
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.ResidentMainBox {
|
.ResidentMainBox {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
<div class="main">{{ parkingReviewInfo.parking.contactPhone }}</div>
|
<div class="main">{{ parkingReviewInfo.parking.contactPhone }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="carInfo_item" style="margin-top: 20px">
|
<div class="carInfo_item" style="margin-top: 20px">
|
||||||
<div class="label">备注:</div>
|
<div class="label" style="min-width: 120px">备注:</div>
|
||||||
<div class="main">{{ parkingReviewInfo.parking.remark }}</div>
|
<div class="main">{{ parkingReviewInfo.parking.remark }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -250,7 +250,7 @@ type parkingReviewType = {
|
|||||||
'carImageUrl': string;
|
'carImageUrl': string;
|
||||||
'userName': null;
|
'userName': null;
|
||||||
'userId': string;
|
'userId': string;
|
||||||
carImageUrlList?: string[];
|
'carImageUrlList'?: string[];
|
||||||
};
|
};
|
||||||
parkingReviewProcess: parkingReviewProcess;
|
parkingReviewProcess: parkingReviewProcess;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="chargeTrendList" border>
|
<el-table v-loading="loading" :data="chargeTrendList" border style="min-height: 80px">
|
||||||
<el-table-column v-for="(item, index) in rows" :key="index" :label="item" align="center">
|
<el-table-column v-for="(item, index) in rows" :key="index" :label="item" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ scope.row[item] }}</span>
|
<span>{{ scope.row[item] }}</span>
|
||||||
|
|||||||
@@ -52,8 +52,13 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="chargeTrendList" border>
|
<el-table v-loading="loading" :data="chargeTrendList" border style="min-height: 80px">
|
||||||
<el-table-column v-for="(item, index) in rows" :key="index" :label="item" align="center">
|
<el-table-column align="center" fixed="left" label="月份">
|
||||||
|
<template #default>
|
||||||
|
<span>金额</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column v-for="(item, index) in rows" :key="index" :label="item" align="center" min-width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ scope.row[item] }}</span>
|
<span>{{ scope.row[item] }}</span>
|
||||||
</template>
|
</template>
|
||||||
@@ -66,7 +71,6 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
账龄
|
|
||||||
<script lang="ts" name="Arrears" setup>
|
<script lang="ts" name="Arrears" setup>
|
||||||
import pagination from '@/components/Pagination/index.vue';
|
import pagination from '@/components/Pagination/index.vue';
|
||||||
import pageHeader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
@@ -85,8 +89,13 @@ const total = ref(0);
|
|||||||
const queryFormRef = ref<ElFormInstance>();
|
const queryFormRef = ref<ElFormInstance>();
|
||||||
const queryTime = ref([]);
|
const queryTime = ref([]);
|
||||||
function handleQueryTime(val: string[]) {
|
function handleQueryTime(val: string[]) {
|
||||||
|
if (val && val.length > 0) {
|
||||||
queryParams.value.startTime = val[0];
|
queryParams.value.startTime = val[0];
|
||||||
queryParams.value.endTime = val[1];
|
queryParams.value.endTime = val[1];
|
||||||
|
} else {
|
||||||
|
queryParams.value.startTime = '';
|
||||||
|
queryParams.value.endTime = '';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
queryParams: {
|
queryParams: {
|
||||||
@@ -145,9 +154,11 @@ const getList = async () => {
|
|||||||
getChargeTend(search)
|
getChargeTend(search)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
const obj = {};
|
const obj = {};
|
||||||
|
const length = res.data.length;
|
||||||
res.data.forEach((item) => {
|
res.data.forEach((item) => {
|
||||||
const label = item.month.split('-')[1];
|
const label = item.month.split('-')[1];
|
||||||
const key = `${label}月`;
|
// const key = `${label}月`;
|
||||||
|
const key = length > 12 ? `${item.month}月` : `${label}月`;
|
||||||
rows.value.push(key);
|
rows.value.push(key);
|
||||||
obj[key] = item.amount;
|
obj[key] = item.amount;
|
||||||
});
|
});
|
||||||
@@ -219,6 +230,7 @@ const chartConfig = shallowRef<EChartsOption>({
|
|||||||
|
|
||||||
function handleChartsData() {
|
function handleChartsData() {
|
||||||
const data = Object.entries(chargeTrendList.value[0]);
|
const data = Object.entries(chargeTrendList.value[0]);
|
||||||
|
console.log(data);
|
||||||
const x = data.map((item) => item[0]);
|
const x = data.map((item) => item[0]);
|
||||||
const y = data.map((item) => item[1]);
|
const y = data.map((item) => item[1]);
|
||||||
// 如果使用的是 ref,直接修改属性即可触发响应式
|
// 如果使用的是 ref,直接修改属性即可触发响应式
|
||||||
|
|||||||
@@ -172,7 +172,10 @@
|
|||||||
<template #header>
|
<template #header>
|
||||||
<div class="flex items-center justify-between">
|
<div class="flex items-center justify-between">
|
||||||
<span>收费日报</span>
|
<span>收费日报</span>
|
||||||
|
<div>
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
|
<el-button type="primary" @click="handleExportAll">导出所有</el-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<el-table v-loading="loading" :data="ArrearsDetailList" :row-class-name="handleRowClass" border>
|
<el-table v-loading="loading" :data="ArrearsDetailList" :row-class-name="handleRowClass" border>
|
||||||
@@ -483,7 +486,30 @@ const handleExport = () => {
|
|||||||
proxy?.$modal.msgWarning('没有可导出的数据');
|
proxy?.$modal.msgWarning('没有可导出的数据');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
handleExportDate(ArrearsDetailList.value);
|
||||||
|
};
|
||||||
|
/** 导出所有Excel */
|
||||||
|
const handleExportAll = () => {
|
||||||
|
let data = [];
|
||||||
|
const search = {
|
||||||
|
...queryParams.value
|
||||||
|
};
|
||||||
|
// 移除空字符串字段
|
||||||
|
Object.keys(search).forEach((key) => {
|
||||||
|
if (search[key] === '-1') {
|
||||||
|
search[key] = undefined;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getDailyFeeReportList(search)
|
||||||
|
.then((res) => {
|
||||||
|
data = [...(res.rows ?? [])];
|
||||||
|
handleExportDate(data);
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
loading.value = false;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
const handleExportDate = (data: Datum[], title: string = '收费日报') => {
|
||||||
// 显示加载提示
|
// 显示加载提示
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
// 使用 setTimeout 让出主线程,避免阻塞UI
|
// 使用 setTimeout 让出主线程,避免阻塞UI
|
||||||
@@ -548,7 +574,16 @@ const handleExport = () => {
|
|||||||
// { label: '经办人', prop: 'inspectorName' },
|
// { label: '经办人', prop: 'inspectorName' },
|
||||||
// { label: '备注', prop: 'remark' }
|
// { label: '备注', prop: 'remark' }
|
||||||
];
|
];
|
||||||
exportToExcel(ArrearsDetailList.value, columns, `日报_${new Date().getTime()}`);
|
exportToExcel(data, columns, `${title}_${new Date().getTime()}`, undefined, ({ row }) => {
|
||||||
|
if (row.residentName === '当日合计') {
|
||||||
|
return {
|
||||||
|
fill: {
|
||||||
|
fgColor: { rgb: 'E2EFDA' },
|
||||||
|
patternType: 'solid'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
proxy?.$modal.msgError('导出失败,请重试');
|
proxy?.$modal.msgError('导出失败,请重试');
|
||||||
console.error('导出错误:', error);
|
console.error('导出错误:', error);
|
||||||
@@ -557,6 +592,7 @@ const handleExport = () => {
|
|||||||
}
|
}
|
||||||
}, 100);
|
}, 100);
|
||||||
};
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getList();
|
getList();
|
||||||
getHouseUseList();
|
getHouseUseList();
|
||||||
|
|||||||
@@ -27,11 +27,11 @@
|
|||||||
<el-form-item label="房号" prop="houseNo">
|
<el-form-item label="房号" prop="houseNo">
|
||||||
<el-input v-model.trim="queryParams.houseNo" placeholder="请输入房号" />
|
<el-input v-model.trim="queryParams.houseNo" placeholder="请输入房号" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="欠费月数" prop="arrearsMonths">
|
<!-- <el-form-item label="欠费月数" prop="arrearsMonths">-->
|
||||||
<el-select v-model="queryParams.arrearsMonths" placeholder="请选择">
|
<!-- <el-select v-model="queryParams.arrearsMonths" placeholder="请选择">-->
|
||||||
<el-option v-for="item in MonthList" :key="item.id" :label="item.name" :value="item.id" />
|
<!-- <el-option v-for="item in MonthList" :key="item.id" :label="item.name" :value="item.id" />-->
|
||||||
</el-select>
|
<!-- </el-select>-->
|
||||||
</el-form-item>
|
<!-- </el-form-item>-->
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 180px">
|
<div style="width: 180px">
|
||||||
<el-button :loading="loading" type="primary" @click="handleQuery">查询</el-button>
|
<el-button :loading="loading" type="primary" @click="handleQuery">查询</el-button>
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
<el-table-column align="center" label="户号" prop="houseNo" />
|
<el-table-column align="center" label="户号" prop="houseNo" />
|
||||||
<el-table-column align="center" label="客户" prop="customerName" />
|
<el-table-column align="center" label="客户" prop="customerName" />
|
||||||
<el-table-column align="center" label="预收账期" prop="prepaidPeriod" />
|
<el-table-column align="center" label="预收账期" prop="prepaidPeriod" />
|
||||||
<el-table-column align="center" label="预收月份" prop="prepaidMonths" />
|
<el-table-column align="center" label="预收月数" prop="prepaidMonths" />
|
||||||
<el-table-column align="center" label="收费项目" prop="chargeItemAmounts">
|
<el-table-column align="center" label="收费项目" prop="chargeItemAmounts">
|
||||||
<template #default>
|
<template #default>
|
||||||
<el-table-column v-for="item in rowChargeTypesList" :key="item" :label="item.chargeItemName" align="center">
|
<el-table-column v-for="item in rowChargeTypesList" :key="item" :label="item.chargeItemName" align="center">
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<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">
|
||||||
<el-form ref="queryFormRef" label-width="100" label-position="left" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" label-position="left" label-width="100" @submit.prevent="handleQuery">
|
||||||
<el-form-item label="与主业主关系" prop="ownerRelationship">
|
<el-form-item label="与主业主关系" prop="ownerRelationship">
|
||||||
<el-select v-model="queryParams.ownerRelationship" placeholder="请选择与主业主关系" style="width: 240px">
|
<el-select v-model="queryParams.ownerRelationship" placeholder="请选择与主业主关系" style="width: 240px">
|
||||||
<el-option v-for="item in com_resident_relationship" :key="item.value" :label="item.label" :value="item.value" />
|
<el-option v-for="item in com_resident_relationship" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
@@ -30,13 +30,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
|
|
||||||
<el-card style="flex: 1" shadow="never">
|
<el-card shadow="never" style="flex: 1">
|
||||||
<div class="residentBody h-full">
|
<div class="residentBody h-full">
|
||||||
<div class="treebox h-full">
|
<div class="treeBox h-full">
|
||||||
<div class="treeTitlebox">{{ currentVilageInfo.villageName ?? '--' }}</div>
|
<div class="treeTitleBox">{{ currentVilageInfo.villageName ?? '--' }}</div>
|
||||||
<div class="treeboxbody">
|
<div class="treeBoxBody">
|
||||||
<!-- 树状+ -->
|
<!-- 树状+ -->
|
||||||
<el-tree :highlight-current="true" style="max-width: 600px" :data="treated" :props="defaultProps" @node-click="handleNodeClick" />
|
<el-tree :data="treated" :highlight-current="true" :props="defaultProps" style="max-width: 600px" @node-click="handleNodeClick" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-1 h-full">
|
<div class="flex-1 h-full">
|
||||||
@@ -45,50 +45,50 @@
|
|||||||
:disable-delete="multiple"
|
:disable-delete="multiple"
|
||||||
:disable-edit="single"
|
:disable-edit="single"
|
||||||
:show-add="checkPermi(['resident:resident:add'])"
|
:show-add="checkPermi(['resident:resident:add'])"
|
||||||
:show-edit="checkPermi(['resident:resident:edit'])"
|
|
||||||
:show-delete="checkPermi(['resident:resident:remove'])"
|
:show-delete="checkPermi(['resident:resident:remove'])"
|
||||||
|
:show-edit="checkPermi(['resident:resident:edit'])"
|
||||||
@update:add="handleAdd"
|
@update:add="handleAdd"
|
||||||
@update:edit="handleUpdate()"
|
@update:edit="handleUpdate()"
|
||||||
@update:delete="handleDelete()"
|
@update:delete="handleDelete()"
|
||||||
></right-toolbar>
|
></right-toolbar>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-table class="tablebox" v-loading="loading" border :data="residentList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="residentList" border class="tablebox" @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column label="姓名" min-width="120" align="center" prop="name" />
|
<el-table-column align="center" label="姓名" min-width="120" prop="name" />
|
||||||
<el-table-column label="类型" width="100" align="center" prop="type">
|
<el-table-column align="center" label="类型" prop="type" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag v-if="scope.row.type === '0'" type="success">业主</el-tag>
|
<el-tag v-if="scope.row.type === '0'" type="success">业主</el-tag>
|
||||||
<el-tag v-else type="danger">租户</el-tag>
|
<el-tag v-else type="danger">租户</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="与主业主关系" min-width="120" align="center" prop="ownerRelationship">
|
<el-table-column align="center" label="与主业主关系" min-width="120" prop="ownerRelationship">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<DictTag :value="scope.row.ownerRelationship" :options="com_resident_relationship"></DictTag>
|
<DictTag :options="com_resident_relationship" :value="scope.row.ownerRelationship"></DictTag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="状态" width="120" align="center" prop="status">
|
<el-table-column align="center" label="状态" prop="status" width="120">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<DictTag :value="scope.row.status" :options="com_review"></DictTag>
|
<DictTag :options="com_review" :value="scope.row.status"></DictTag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="证件号" min-width="120" align="center" prop="idCard" />
|
<el-table-column align="center" label="证件号" min-width="120" prop="idCard" />
|
||||||
<el-table-column label="手机号码" min-width="120" align="center" prop="phone" />
|
<el-table-column align="center" label="手机号码" min-width="120" prop="phone" />
|
||||||
<el-table-column label="房间" min-width="120" align="center" prop="houseName" />
|
<el-table-column align="center" label="房间" min-width="120" prop="houseName" />
|
||||||
<el-table-column label="操作" align="center" min-width="120" fixed="right" class-name="small-padding fixed-width">
|
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作" min-width="120">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button v-if="scope.row.status !== '1'" link type="primary" @click="handleMain(scope.row)" v-has-permi="['resident:resident:edit']"
|
<el-button v-if="scope.row.status !== '1'" v-has-permi="['resident:resident:edit']" link type="primary" @click="handleMain(scope.row)"
|
||||||
>审核</el-button
|
>审核</el-button
|
||||||
>
|
>
|
||||||
<el-button link type="primary" @click="handleUpdate(scope.row)" v-has-permi="['resident:resident:edit']">编辑</el-button>
|
<el-button v-has-permi="['resident:resident:edit']" link type="primary" @click="handleUpdate(scope.row)">编辑</el-button>
|
||||||
<el-button link type="primary" @click="handleDelete(scope.row)" v-has-permi="['resident:resident:remove']">删除 </el-button>
|
<el-button v-has-permi="['resident:resident:remove']" link type="primary" @click="handleDelete(scope.row)">删除 </el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<Pagination
|
<Pagination
|
||||||
v-show="total > 0"
|
v-show="total > 0"
|
||||||
:total="total"
|
|
||||||
v-model:page="queryParams.pageNum"
|
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
|
v-model:page="queryParams.pageNum"
|
||||||
|
:total="total"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup name="Resident" lang="ts">
|
<script lang="ts" name="Resident" setup>
|
||||||
import Pagination from '@/components/Pagination/index.vue';
|
import Pagination from '@/components/Pagination/index.vue';
|
||||||
import pageHeader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
import RightToolbar from '@/components/RightToolbar/index.vue';
|
import RightToolbar from '@/components/RightToolbar/index.vue';
|
||||||
@@ -324,14 +324,15 @@ onMounted(() => {
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.residentBody {
|
.residentBody {
|
||||||
display: flex;
|
display: flex;
|
||||||
.treebox {
|
.treeBox {
|
||||||
width: 250px;
|
width: 250px;
|
||||||
min-width: 250px;
|
min-width: 150px;
|
||||||
|
max-width: 250px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
.treeTitlebox {
|
.treeTitleBox {
|
||||||
height: 60px;
|
height: 60px;
|
||||||
line-height: 60px;
|
line-height: 60px;
|
||||||
padding-left: 20px;
|
padding-left: 20px;
|
||||||
@@ -341,7 +342,7 @@ onMounted(() => {
|
|||||||
color: rgba(16, 16, 16, 1);
|
color: rgba(16, 16, 16, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.treeboxbody {
|
.treeBoxBody {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
|||||||
@@ -152,7 +152,6 @@ function handleHiddeMenu(menu: MenuTreeOption[]) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
obj = null;
|
obj = null;
|
||||||
console.log('找到了', item);
|
|
||||||
}
|
}
|
||||||
if (obj) arr.push(obj);
|
if (obj) arr.push(obj);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,27 +4,27 @@
|
|||||||
<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">
|
||||||
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
|
||||||
<el-form-item label="角色名称" prop="roleName">
|
<el-form-item label="角色名称" prop="roleName">
|
||||||
<el-input v-model="queryParams.roleName" placeholder="请输入角色名称" clearable @keyup.enter="handleQuery" />
|
<el-input v-model="queryParams.roleName" clearable placeholder="请输入角色名称" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="权限字符" prop="roleKey">
|
<el-form-item label="权限字符" prop="roleKey">
|
||||||
<el-input v-model="queryParams.roleKey" placeholder="请输入权限字符" clearable @keyup.enter="handleQuery" />
|
<el-input v-model="queryParams.roleKey" clearable placeholder="请输入权限字符" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="角色状态" clearable>
|
<el-select v-model="queryParams.status" clearable placeholder="角色状态">
|
||||||
<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
|
<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="创建时间" style="width: 308px">
|
<el-form-item label="创建时间" style="width: 308px">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dateRange"
|
v-model="dateRange"
|
||||||
value-format="YYYY-MM-DD HH:mm:ss"
|
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
|
||||||
type="daterange"
|
end-placeholder="结束日期"
|
||||||
range-separator="-"
|
range-separator="-"
|
||||||
start-placeholder="开始日期"
|
start-placeholder="开始日期"
|
||||||
end-placeholder="结束日期"
|
type="daterange"
|
||||||
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
></el-date-picker>
|
></el-date-picker>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
@@ -44,8 +44,8 @@
|
|||||||
:disable-delete="multiple"
|
:disable-delete="multiple"
|
||||||
:disable-edit="single"
|
:disable-edit="single"
|
||||||
:show-add="checkPermi(['system:role:add'])"
|
:show-add="checkPermi(['system:role:add'])"
|
||||||
:show-edit="false"
|
|
||||||
:show-delete="false"
|
:show-delete="false"
|
||||||
|
:show-edit="false"
|
||||||
@update:add="handleAdd"
|
@update:add="handleAdd"
|
||||||
@update:delete="handleDelete()"
|
@update:delete="handleDelete()"
|
||||||
>
|
>
|
||||||
@@ -53,35 +53,33 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table ref="roleTableRef" border v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
|
<el-table ref="roleTableRef" v-loading="loading" :data="roleList" border @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" />
|
<el-table-column :show-overflow-tooltip="true" label="角色名称" prop="roleName" />
|
||||||
<el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" />
|
<el-table-column :show-overflow-tooltip="true" label="权限字符" prop="roleKey" />
|
||||||
|
<el-table-column align="center" label="角色人数" prop="userCount" />
|
||||||
<el-table-column label="显示顺序" prop="roleSort" />
|
<el-table-column label="显示顺序" prop="roleSort" />
|
||||||
<el-table-column label="状态" align="center">
|
<el-table-column align="center" label="状态">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="创建时间" align="center" prop="createTime">
|
<el-table-column align="center" label="添加人" prop="createByName" />
|
||||||
<template #default="scope">
|
<el-table-column align="center" label="创建时间" prop="createTime" />
|
||||||
<span>{{ proxy.parseTime(scope.row.createTime) }}</span>
|
<el-table-column :show-overflow-tooltip="true" label="备注" prop="remark" />
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column fixed="right" label="操作" width="200">
|
<el-table-column fixed="right" label="操作" width="200">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tooltip v-if="scope.row.roleId !== 1" content="修改" placement="top">
|
<el-tooltip v-if="scope.row.roleId !== 1" content="修改" placement="top">
|
||||||
<el-button v-has-permi="['system:role:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
|
<el-button v-has-permi="['system:role:edit']" icon="Edit" link type="primary" @click="handleUpdate(scope.row)"></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip v-if="scope.row.roleId !== 1" content="删除" placement="top">
|
<el-tooltip v-if="scope.row.roleId !== 1" content="删除" placement="top">
|
||||||
<el-button v-has-permi="['system:role:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
|
<el-button v-has-permi="['system:role:remove']" icon="Delete" link type="primary" @click="handleDelete(scope.row)"></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip v-if="scope.row.roleId !== 1" content="数据权限" placement="top">
|
<el-tooltip v-if="scope.row.roleId !== 1" content="数据权限" placement="top">
|
||||||
<el-button v-has-permi="['system:role:edit']" link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)"></el-button>
|
<el-button v-has-permi="['system:role:edit']" icon="CircleCheck" link type="primary" @click="handleDataScope(scope.row)"></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip v-if="scope.row.roleId !== 1" content="分配用户" placement="top">
|
<el-tooltip v-if="scope.row.roleId !== 1" content="分配用户" placement="top">
|
||||||
<el-button v-has-permi="['system:role:edit']" link type="primary" icon="User" @click="handleAuthUser(scope.row)"></el-button>
|
<el-button v-has-permi="['system:role:edit']" icon="User" link type="primary" @click="handleAuthUser(scope.row)"></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@@ -89,14 +87,14 @@
|
|||||||
|
|
||||||
<pagination
|
<pagination
|
||||||
v-if="total > 0"
|
v-if="total > 0"
|
||||||
v-model:total="total"
|
|
||||||
v-model:page="queryParams.pageNum"
|
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
|
v-model:page="queryParams.pageNum"
|
||||||
|
v-model:total="total"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<el-dialog v-model="dialog.visible" :title="dialog.title" width="650px" append-to-body>
|
<el-dialog v-model="dialog.visible" :title="dialog.title" append-to-body width="650px">
|
||||||
<el-form ref="roleFormRef" :model="form" :rules="rules" label-width="100px">
|
<el-form ref="roleFormRef" :model="form" :rules="rules" label-width="100px">
|
||||||
<el-form-item label="角色名称" prop="roleName">
|
<el-form-item label="角色名称" prop="roleName">
|
||||||
<el-input v-model="form.roleName" placeholder="请输入角色名称" />
|
<el-input v-model="form.roleName" placeholder="请输入角色名称" />
|
||||||
@@ -113,7 +111,7 @@
|
|||||||
<el-input v-model="form.roleKey" placeholder="请输入权限字符" />
|
<el-input v-model="form.roleKey" placeholder="请输入权限字符" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="角色顺序" prop="roleSort">
|
<el-form-item label="角色顺序" prop="roleSort">
|
||||||
<el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
|
<el-input-number v-model="form.roleSort" :min="0" controls-position="right" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态">
|
<el-form-item label="状态">
|
||||||
<el-radio-group v-model="form.status">
|
<el-radio-group v-model="form.status">
|
||||||
@@ -126,18 +124,18 @@
|
|||||||
<el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
|
<el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
|
||||||
<el-tree
|
<el-tree
|
||||||
ref="menuRef"
|
ref="menuRef"
|
||||||
class="tree-border"
|
|
||||||
:data="menuOptions"
|
|
||||||
show-checkbox
|
|
||||||
node-key="id"
|
|
||||||
:check-strictly="!form.menuCheckStrictly"
|
:check-strictly="!form.menuCheckStrictly"
|
||||||
empty-text="加载中,请稍候"
|
:data="menuOptions"
|
||||||
:props="{ label: 'label', children: 'children' }"
|
:props="{ label: 'label', children: 'children' }"
|
||||||
|
class="tree-border"
|
||||||
|
empty-text="加载中,请稍候"
|
||||||
|
node-key="id"
|
||||||
|
show-checkbox
|
||||||
>
|
>
|
||||||
</el-tree>
|
</el-tree>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="备注">
|
<el-form-item label="备注">
|
||||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
|
<el-input v-model="form.remark" placeholder="请输入内容" type="textarea"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
@@ -149,7 +147,7 @@
|
|||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
<!-- 分配角色数据权限对话框 -->
|
<!-- 分配角色数据权限对话框 -->
|
||||||
<el-dialog v-model="openDataScope" :title="dialog.title" width="650px" append-to-body>
|
<el-dialog v-model="openDataScope" :title="dialog.title" append-to-body width="650px">
|
||||||
<el-form ref="dataScopeRef" :model="form" label-width="80px">
|
<el-form ref="dataScopeRef" :model="form" label-width="80px">
|
||||||
<el-form-item label="角色名称">
|
<el-form-item label="角色名称">
|
||||||
<el-input v-model="form.roleName" :disabled="true" />
|
<el-input v-model="form.roleName" :disabled="true" />
|
||||||
@@ -168,14 +166,14 @@
|
|||||||
<el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
|
<el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
|
||||||
<el-tree
|
<el-tree
|
||||||
ref="deptRef"
|
ref="deptRef"
|
||||||
class="tree-border"
|
|
||||||
:data="deptOptions"
|
|
||||||
show-checkbox
|
|
||||||
default-expand-all
|
|
||||||
node-key="id"
|
|
||||||
:check-strictly="!form.deptCheckStrictly"
|
:check-strictly="!form.deptCheckStrictly"
|
||||||
empty-text="加载中,请稍候"
|
:data="deptOptions"
|
||||||
:props="{ label: 'label', children: 'children' }"
|
:props="{ label: 'label', children: 'children' }"
|
||||||
|
class="tree-border"
|
||||||
|
default-expand-all
|
||||||
|
empty-text="加载中,请稍候"
|
||||||
|
node-key="id"
|
||||||
|
show-checkbox
|
||||||
>
|
>
|
||||||
</el-tree>
|
</el-tree>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -190,7 +188,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="Role" lang="ts">
|
<script lang="ts" name="Role" setup>
|
||||||
import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from '@/api/system/role';
|
import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from '@/api/system/role';
|
||||||
import { roleMenuTreeselect, treeselect as menuTreeselect } from '@/api/system/menu/index';
|
import { roleMenuTreeselect, treeselect as menuTreeselect } from '@/api/system/menu/index';
|
||||||
import { RoleVO, RoleForm, RoleQuery, DeptTreeOption } from '@/api/system/role/types';
|
import { RoleVO, RoleForm, RoleQuery, DeptTreeOption } from '@/api/system/role/types';
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
<div class="searchLabel">选择日期</div>
|
<div class="searchLabel">选择日期</div>
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dataTime"
|
v-model="dataTime"
|
||||||
type="date"
|
|
||||||
placeholder="选择日期"
|
|
||||||
value-format="YYYY-MM-DD"
|
|
||||||
format="YYYY-MM-DD"
|
format="YYYY-MM-DD"
|
||||||
|
placeholder="选择日期"
|
||||||
style="width: 400px; margin-right: 10px"
|
style="width: 400px; margin-right: 10px"
|
||||||
|
type="date"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
></el-date-picker>
|
></el-date-picker>
|
||||||
<el-button type="primary" @click="querySearch">查询</el-button>
|
<el-button type="primary" @click="querySearch">查询</el-button>
|
||||||
<el-button @click="reset">重置</el-button>
|
<el-button @click="reset">重置</el-button>
|
||||||
@@ -23,13 +23,13 @@
|
|||||||
<div>已收:{{ sourceFrom.totalReceived }}元</div>
|
<div>已收:{{ sourceFrom.totalReceived }}元</div>
|
||||||
<div>待收:{{ sourceFrom.totalPending }}元</div>
|
<div>待收:{{ sourceFrom.totalPending }}元</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cardBody" style="display: flex; flex-wrap: wrap" v-if="sourceFromIsComputed">
|
<div v-if="sourceFromIsComputed" class="cardBody" style="display: flex; flex-wrap: wrap">
|
||||||
<RingProgress name="停车费" color="#1a75ff" :value="sourceFrom.parkingFeePercent"></RingProgress>
|
<RingProgress :value="sourceFrom.parkingFeePercent" color="#1a75ff" name="停车费"></RingProgress>
|
||||||
<RingProgress name="物业费" color="#ffbf05" :value="sourceFrom.propertyFeePercent"></RingProgress>
|
<RingProgress :value="sourceFrom.propertyFeePercent" color="#ffbf05" name="物业费"></RingProgress>
|
||||||
<RingProgress name="水电费" color="#6c76f4" :value="sourceFrom.utilityFeePercent"></RingProgress>
|
<RingProgress :value="sourceFrom.utilityFeePercent" color="#6c76f4" name="水电费"></RingProgress>
|
||||||
<RingProgress name="商铺租金" color="#fa746b" :value="sourceFrom.shopRentPercent"></RingProgress>
|
<RingProgress :value="sourceFrom.shopRentPercent" color="#fa746b" name="商铺租金"></RingProgress>
|
||||||
<RingProgress name="维修费" color="#3fdf95" :value="sourceFrom.repairFeePercent"></RingProgress>
|
<RingProgress :value="sourceFrom.repairFeePercent" color="#3fdf95" name="维修费"></RingProgress>
|
||||||
<RingProgress name="垃圾处理费" color="#1e1b39" :value="sourceFrom.garbageFeePercent"></RingProgress>
|
<RingProgress :value="sourceFrom.garbageFeePercent" color="#1e1b39" name="垃圾处理费"></RingProgress>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="circleBox">
|
<ul class="circleBox">
|
||||||
<li :data-level="index" :style="{ backgroundColor: item.color }" v-for="(item, index) in sortPayList" :key="index">
|
<li v-for="(item, index) in sortPayList" :key="index" :data-level="index" :style="{ backgroundColor: item.color }">
|
||||||
{{ item.number }}%
|
{{ item.number }}%
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
// TODO 缴费分析
|
// TODO 缴费分析
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import Echarts from '@/components/Echarts/index.vue';
|
import Echarts from '@/components/Echarts/index.vue';
|
||||||
@@ -237,7 +237,7 @@ const options3 = shallowRef<EChartsOption>({
|
|||||||
tooltip: {
|
tooltip: {
|
||||||
trigger: 'item',
|
trigger: 'item',
|
||||||
formatter: (params: any) => {
|
formatter: (params: any) => {
|
||||||
return `${params.name}<br/>欠费金额: <b>${formatMoneyWithUnit(params.value[1])}</b>`;
|
return `${params.name}<br/>欠费金额: <b>${params.value[1]}元</b>`;
|
||||||
},
|
},
|
||||||
backgroundColor: 'rgba(255, 255, 255, 0.9)',
|
backgroundColor: 'rgba(255, 255, 255, 0.9)',
|
||||||
borderColor: '#eee',
|
borderColor: '#eee',
|
||||||
@@ -276,7 +276,7 @@ const options3 = shallowRef<EChartsOption>({
|
|||||||
},
|
},
|
||||||
yAxis: {
|
yAxis: {
|
||||||
type: 'value',
|
type: 'value',
|
||||||
name: '金额(万元)',
|
name: '金额(元)',
|
||||||
nameTextStyle: { color: '#999', padding: [0, 0, 0, 10] },
|
nameTextStyle: { color: '#999', padding: [0, 0, 0, 10] },
|
||||||
splitLine: {
|
splitLine: {
|
||||||
show: true,
|
show: true,
|
||||||
@@ -335,7 +335,7 @@ function UpdateOptions3(data: Arrears_distrubution[]): EChartsOption {
|
|||||||
tooltip: {
|
tooltip: {
|
||||||
trigger: 'item',
|
trigger: 'item',
|
||||||
formatter: (params: any) => {
|
formatter: (params: any) => {
|
||||||
return `${params.name}<br/>欠费金额: <b>${formatMoneyWithUnit(params.value[1])}</b>`;
|
return `${params.name}<br/>欠费金额: <b>${params.value[1]}元</b>`;
|
||||||
},
|
},
|
||||||
backgroundColor: 'rgba(255, 255, 255, 0.9)',
|
backgroundColor: 'rgba(255, 255, 255, 0.9)',
|
||||||
borderColor: '#eee',
|
borderColor: '#eee',
|
||||||
@@ -374,7 +374,7 @@ function UpdateOptions3(data: Arrears_distrubution[]): EChartsOption {
|
|||||||
},
|
},
|
||||||
yAxis: {
|
yAxis: {
|
||||||
type: 'value',
|
type: 'value',
|
||||||
name: '金额(万元)',
|
name: '金额(元)',
|
||||||
nameTextStyle: { color: '#999', padding: [0, 0, 0, 10] },
|
nameTextStyle: { color: '#999', padding: [0, 0, 0, 10] },
|
||||||
splitLine: {
|
splitLine: {
|
||||||
show: true,
|
show: true,
|
||||||
@@ -655,7 +655,7 @@ onUnmounted(() => {
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.personnel {
|
.personnel {
|
||||||
background: linear-gradient(180deg, #deedff 0%, #f8f9fe 50%);
|
background: linear-gradient(180deg, #deedff 0%, #f8f9fe 50%);
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|||||||
@@ -4,10 +4,10 @@
|
|||||||
<div class="searchLabel">选择日期</div>
|
<div class="searchLabel">选择日期</div>
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="date"
|
v-model="date"
|
||||||
type="date"
|
|
||||||
placeholder="选择日期"
|
placeholder="选择日期"
|
||||||
value-format="YYYY-MM-DD"
|
|
||||||
style="width: 400px; margin-right: 10px"
|
style="width: 400px; margin-right: 10px"
|
||||||
|
type="date"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
></el-date-picker>
|
></el-date-picker>
|
||||||
<el-button type="primary" @click="querySelect">查询</el-button>
|
<el-button type="primary" @click="querySelect">查询</el-button>
|
||||||
<el-button @click="reset">重置</el-button>
|
<el-button @click="reset">重置</el-button>
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row style="margin-top: 20px; position: relative; z-index: 2" :gutter="20">
|
<el-row :gutter="20" style="margin-top: 20px; position: relative; z-index: 2">
|
||||||
<el-col :lg="24" :xl="24">
|
<el-col :lg="24" :xl="24">
|
||||||
<div class="cardbox w-full" style="height: 400px">
|
<div class="cardbox w-full" style="height: 400px">
|
||||||
<Echarts :options="options3"></Echarts>
|
<Echarts :options="options3"></Echarts>
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import Echarts from '@/components/Echarts/index.vue';
|
import Echarts from '@/components/Echarts/index.vue';
|
||||||
import { EChartsOption } from 'echarts';
|
import { EChartsOption } from 'echarts';
|
||||||
@@ -589,7 +589,7 @@ function MoveInFun() {
|
|||||||
const total = res.data.totalHouse;
|
const total = res.data.totalHouse;
|
||||||
const occupied = res.data.occupiedHouse || 0; // 确保有值
|
const occupied = res.data.occupiedHouse || 0; // 确保有值
|
||||||
// 计算入住率,防止除以0
|
// 计算入住率,防止除以0
|
||||||
const rate = total > 0 ? ((occupied / total) * 100).toFixed(1) : '0.0';
|
const rate = total > 0 ? ((occupied / total) * 100).toFixed(2) : '0.0';
|
||||||
// 返回带换行符的字符串:第一行是百分比,第二行是文字
|
// 返回带换行符的字符串:第一行是百分比,第二行是文字
|
||||||
return `{rate|${rate}%}\n{title|入住率}`;
|
return `{rate|${rate}%}\n{title|入住率}`;
|
||||||
};
|
};
|
||||||
@@ -644,7 +644,7 @@ function MoveInPersonAge() {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.personnel {
|
.personnel {
|
||||||
position: relative;
|
position: relative;
|
||||||
background: #deedff;
|
background: #deedff;
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
<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">
|
||||||
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
|
||||||
<el-form-item label="员工姓名" prop="nickName">
|
<el-form-item label="员工姓名" prop="nickName">
|
||||||
<el-input maxlength="30" v-model="queryParams.nickName" placeholder="请输入员工姓名" clearable @keyup.enter="handleQuery" />
|
<el-input v-model="queryParams.nickName" clearable maxlength="30" placeholder="请输入员工姓名" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||||
@@ -21,12 +21,12 @@
|
|||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10">
|
<el-row :gutter="10">
|
||||||
<right-toolbar
|
<right-toolbar
|
||||||
|
:columns="columns"
|
||||||
:show-add="checkPermi(['system:user:add'])"
|
:show-add="checkPermi(['system:user:add'])"
|
||||||
:show-delete="false"
|
:show-delete="false"
|
||||||
:show-edit="false"
|
:show-edit="false"
|
||||||
@update:add="handleAdd"
|
|
||||||
more-title="更多"
|
more-title="更多"
|
||||||
:columns="columns"
|
@update:add="handleAdd"
|
||||||
>
|
>
|
||||||
<!-- <template #dropdown>-->
|
<!-- <template #dropdown>-->
|
||||||
<!-- <el-dropdown-item @click="importTemplate">下载模板</el-dropdown-item>-->
|
<!-- <el-dropdown-item @click="importTemplate">下载模板</el-dropdown-item>-->
|
||||||
@@ -38,59 +38,57 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" border :data="userList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="userList" border @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="50" align="center" />
|
<el-table-column align="center" type="selection" width="50" />
|
||||||
<el-table-column v-if="columns[0].visible" key="userId" label="员工编号" align="center" prop="userId" />
|
<el-table-column v-if="columns[0].visible" key="userId" align="center" label="员工编号" prop="userId" />
|
||||||
<el-table-column v-if="columns[2].visible" key="nickName" label="员工姓名" align="center" prop="nickName" :show-overflow-tooltip="true" />
|
<el-table-column v-if="columns[2].visible" key="nickName" :show-overflow-tooltip="true" align="center" label="员工姓名" prop="nickName" />
|
||||||
<el-table-column v-if="columns[1].visible" key="userName" label="员工账号" align="center" prop="userName" :show-overflow-tooltip="true" />
|
<el-table-column v-if="columns[1].visible" key="userName" :show-overflow-tooltip="true" align="center" label="员工账号" prop="userName" />
|
||||||
<el-table-column v-if="columns[4].visible" key="phonenumber" label="手机号码" align="center" prop="phonenumber" width="120" />
|
|
||||||
<el-table-column v-if="columns[5].visible" key="status" label="状态" align="center">
|
<el-table-column v-if="columns[4].visible" key="phonenumber" align="center" label="手机号码" prop="phonenumber" width="120" />
|
||||||
|
<el-table-column v-if="columns[7].visible" key="roleName" align="center" label="角色" prop="roleName" width="120" />
|
||||||
|
<el-table-column v-if="columns[5].visible" key="status" align="center" label="状态">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column v-if="columns[6].visible" label="创建时间" align="center" prop="createTime" width="160">
|
<el-table-column v-if="columns[6].visible" align="center" label="创建时间" prop="createTime" width="160" />
|
||||||
<template #default="scope">
|
|
||||||
<span>{{ scope.row.createTime }}</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
|
|
||||||
<el-table-column align="center" label="操作" fixed="right" width="200">
|
<el-table-column align="center" fixed="right" label="操作" width="200">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tooltip v-if="scope.row.userId !== 1" content="修改" placement="top">
|
<el-tooltip v-if="scope.row.userId !== 1" content="修改" placement="top">
|
||||||
<el-button v-has-permi="['system:user:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
|
<el-button v-has-permi="['system:user:edit']" icon="Edit" link type="primary" @click="handleUpdate(scope.row)"></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip v-if="scope.row.userId !== 1" content="删除" placement="top">
|
<el-tooltip v-if="scope.row.userId !== 1" content="删除" placement="top">
|
||||||
<el-button v-has-permi="['system:user:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
|
<el-button v-has-permi="['system:user:remove']" icon="Delete" link type="primary" @click="handleDelete(scope.row)"></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
|
||||||
<el-tooltip v-if="scope.row.userId !== 1" content="重置密码" placement="top">
|
<el-tooltip v-if="scope.row.userId !== 1" content="重置密码" placement="top">
|
||||||
<el-button v-has-permi="['system:user:resetPwd']" link type="primary" icon="Key" @click="handleResetPwd(scope.row)"></el-button>
|
<el-button v-has-permi="['system:user:resetPwd']" icon="Key" link type="primary" @click="handleResetPwd(scope.row)"></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
|
|
||||||
<el-tooltip v-if="scope.row.userId !== 1" content="分配角色" placement="top">
|
<el-tooltip v-if="scope.row.userId !== 1" content="分配角色" placement="top">
|
||||||
<el-button v-has-permi="['system:user:edit']" link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)"></el-button>
|
<el-button v-has-permi="['system:user:edit']" icon="CircleCheck" link type="primary" @click="handleAuthRole(scope.row)"></el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
||||||
<pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<!-- 添加或修改员工配置对话框 -->
|
<!-- 添加或修改员工配置对话框 -->
|
||||||
<el-dialog ref="formDialogRef" v-model="dialog.visible" :title="dialog.title" width="600px" append-to-body @close="closeDialog">
|
<el-dialog ref="formDialogRef" v-model="dialog.visible" :title="dialog.title" append-to-body width="600px" @close="closeDialog">
|
||||||
<el-form ref="userFormRef" :model="form" :rules="rules" label-width="80px">
|
<el-form ref="userFormRef" :model="form" :rules="rules" label-width="80px">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="员工姓名" prop="nickName">
|
<el-form-item label="员工姓名" prop="nickName">
|
||||||
<el-input v-model="form.nickName" placeholder="请输入员工姓名" maxlength="30" />
|
<el-input v-model="form.nickName" maxlength="30" placeholder="请输入员工姓名" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12" v-if="form.userId == null || form.userId != useUserStore().userId">
|
<el-col v-if="form.userId == null || form.userId != useUserStore().userId" :span="12">
|
||||||
<el-form-item label="管理小区" prop="villageIds">
|
<el-form-item label="管理小区" prop="villageIds">
|
||||||
<el-select @change="handleChangeVillage" v-model="villags" multiple placeholder="请选择管理小区">
|
<el-select v-model="villags" multiple placeholder="请选择管理小区" @change="handleChangeVillage">
|
||||||
<el-option v-for="item in vilageList" :key="item.villageId" :label="item.villageName" :value="item.villageId" />
|
<el-option v-for="item in vilageList" :key="item.villageId" :label="item.villageName" :value="item.villageId" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -99,24 +97,24 @@
|
|||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="手机号码" prop="phonenumber">
|
<el-form-item label="手机号码" prop="phonenumber">
|
||||||
<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
|
<el-input v-model="form.phonenumber" maxlength="11" placeholder="请输入手机号码" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="邮箱" prop="email">
|
<el-form-item label="邮箱" prop="email">
|
||||||
<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
|
<el-input v-model="form.email" maxlength="50" placeholder="请输入邮箱" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item v-if="form.userId == undefined" label="员工账号" prop="userName">
|
<el-form-item v-if="form.userId == undefined" label="员工账号" prop="userName">
|
||||||
<el-input v-model="form.userName" placeholder="请输入员工账号" maxlength="30" />
|
<el-input v-model="form.userName" maxlength="30" placeholder="请输入员工账号" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item v-if="form.userId == undefined" label="员工密码" prop="password">
|
<el-form-item v-if="form.userId == undefined" label="员工密码" prop="password">
|
||||||
<el-input v-model="form.password" placeholder="请输入员工密码" type="password" maxlength="20" show-password />
|
<el-input v-model="form.password" maxlength="20" placeholder="请输入员工密码" show-password type="password" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -137,15 +135,15 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12" v-if="form.userId == null || form.userId != useUserStore().userId">
|
<el-col v-if="form.userId == null || form.userId != useUserStore().userId" :span="12">
|
||||||
<el-form-item label="角色" prop="roleIds">
|
<el-form-item label="角色" prop="roleIds">
|
||||||
<el-select v-model="form.roleIds" filterable multiple placeholder="请选择">
|
<el-select v-model="form.roleIds" filterable multiple placeholder="请选择">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in roleOptions"
|
v-for="item in roleOptions"
|
||||||
:key="item.roleId"
|
:key="item.roleId"
|
||||||
|
:disabled="item.status == '1'"
|
||||||
:label="item.roleName"
|
:label="item.roleName"
|
||||||
:value="item.roleId"
|
:value="item.roleId"
|
||||||
:disabled="item.status == '1'"
|
|
||||||
></el-option>
|
></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -154,7 +152,7 @@
|
|||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="备注">
|
<el-form-item label="备注">
|
||||||
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
|
<el-input v-model="form.remark" placeholder="请输入内容" type="textarea"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -168,18 +166,18 @@
|
|||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
<!-- 员工导入对话框 -->
|
<!-- 员工导入对话框 -->
|
||||||
<el-dialog v-model="upload.open" :title="upload.title" width="400px" append-to-body>
|
<el-dialog v-model="upload.open" :title="upload.title" append-to-body width="400px">
|
||||||
<el-upload
|
<el-upload
|
||||||
ref="uploadRef"
|
ref="uploadRef"
|
||||||
:limit="1"
|
|
||||||
accept=".xlsx, .xls"
|
|
||||||
:headers="upload.headers"
|
|
||||||
:action="upload.url + '?updateSupport=' + upload.updateSupport"
|
:action="upload.url + '?updateSupport=' + upload.updateSupport"
|
||||||
|
:auto-upload="false"
|
||||||
:disabled="upload.isUploading"
|
:disabled="upload.isUploading"
|
||||||
|
:headers="upload.headers"
|
||||||
|
:limit="1"
|
||||||
|
:on-change="handleChangeFile"
|
||||||
:on-progress="handleFileUploadProgress"
|
:on-progress="handleFileUploadProgress"
|
||||||
:on-success="handleFileSuccess"
|
:on-success="handleFileSuccess"
|
||||||
:auto-upload="false"
|
accept=".xlsx, .xls"
|
||||||
:on-change="handleChangeFile"
|
|
||||||
drag
|
drag
|
||||||
>
|
>
|
||||||
<el-icon class="el-icon--upload">
|
<el-icon class="el-icon--upload">
|
||||||
@@ -190,7 +188,7 @@
|
|||||||
<div class="text-center el-upload__tip">
|
<div class="text-center el-upload__tip">
|
||||||
<div class="el-upload__tip"><el-checkbox v-model="upload.updateSupport" />是否更新已经存在的员工数据</div>
|
<div class="el-upload__tip"><el-checkbox v-model="upload.updateSupport" />是否更新已经存在的员工数据</div>
|
||||||
<span>仅允许导入xls、xlsx格式文件。</span>
|
<span>仅允许导入xls、xlsx格式文件。</span>
|
||||||
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板</el-link>
|
<el-link :underline="false" style="font-size: 12px; vertical-align: baseline" type="primary" @click="importTemplate">下载模板</el-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
@@ -204,7 +202,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="User" lang="ts">
|
<script lang="ts" name="User" setup>
|
||||||
import api from '@/api/system/user';
|
import api from '@/api/system/user';
|
||||||
import { UserForm, UserQuery, UserVO } from '@/api/system/user/types';
|
import { UserForm, UserQuery, UserVO } from '@/api/system/user/types';
|
||||||
import { RoleVO } from '@/api/system/role/types';
|
import { RoleVO } from '@/api/system/role/types';
|
||||||
@@ -257,7 +255,8 @@ const columns = ref<FieldOption[]>([
|
|||||||
{ key: 3, label: `部门`, visible: true, children: [] },
|
{ key: 3, label: `部门`, visible: true, children: [] },
|
||||||
{ key: 4, label: `手机号码`, visible: true, children: [] },
|
{ key: 4, label: `手机号码`, visible: true, children: [] },
|
||||||
{ key: 5, label: `状态`, visible: true, children: [] },
|
{ key: 5, label: `状态`, visible: true, children: [] },
|
||||||
{ key: 6, label: `创建时间`, visible: true, children: [] }
|
{ key: 6, label: `创建时间`, visible: true, children: [] },
|
||||||
|
{ key: 7, label: `角色`, visible: true, children: [] }
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const deptTreeRef = ref<ElTreeInstance>();
|
const deptTreeRef = ref<ElTreeInstance>();
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
<div class="AddBuildingBody">
|
<div class="AddBuildingBody">
|
||||||
<div style="margin-bottom: 20px">
|
<div style="margin-bottom: 20px">
|
||||||
<span>详细出库列表</span>
|
<span>详细出库列表</span>
|
||||||
<material ref="materialRef" :is-multiple="true" :userid="itemsid" returnvalue="*" @change="handleChangeitem">
|
<material ref="materialRef" :is-multiple="true" :isHidden="false" :userid="itemsid" returnvalue="*" @change="handleChangeitem">
|
||||||
<template #default>
|
<template #default>
|
||||||
<el-button icon="Plus" style="margin-left: 20px" type="primary" @click="() => materialRef.open()">添加</el-button>
|
<el-button icon="Plus" style="margin-left: 20px" type="primary" @click="() => materialRef.open()">添加</el-button>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -4,21 +4,21 @@
|
|||||||
<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="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
|
<el-form ref="formRef" :model="form" :rules="rules" class="formBody" label-position="right" label-width="130px">
|
||||||
<el-form-item label="物料名称" prop="materialName">
|
<el-form-item label="物料名称" prop="materialName">
|
||||||
<el-input maxlength="20" v-model.trim="form.materialName" placeholder="请输入物料名称" />
|
<el-input v-model.trim="form.materialName" maxlength="20" placeholder="请输入物料名称" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="品牌" prop="brand">
|
<el-form-item label="品牌" prop="brand">
|
||||||
<el-input maxlength="20" v-model.trim="form.brand" placeholder="请输入品牌" />
|
<el-input v-model.trim="form.brand" maxlength="20" placeholder="请输入品牌" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="规格型号" prop="model">
|
<el-form-item label="规格型号" prop="model">
|
||||||
<el-input maxlength="20" v-model.trim="form.model" placeholder="请输入规格型号" />
|
<el-input v-model.trim="form.model" maxlength="20" placeholder="请输入规格型号" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="计量单位" prop="unit">
|
<el-form-item label="计量单位" prop="unit">
|
||||||
<el-input maxlength="20" v-model.trim="form.unit" placeholder="请输入计量单位" />
|
<el-input v-model.trim="form.unit" maxlength="20" placeholder="请输入计量单位" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
<el-input type="textarea" maxlength="200" show-word-limit :rows="5" v-model.trim="form.remark" placeholder="请输入备注" />
|
<el-input v-model.trim="form.remark" :rows="5" maxlength="200" placeholder="请输入备注" show-word-limit type="textarea" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="margin-top: 30px">
|
<el-form-item style="margin-top: 30px">
|
||||||
<el-button type="primary" @click="submitForm">提交</el-button>
|
<el-button type="primary" @click="submitForm">提交</el-button>
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { getMaterial, updateMaterial, addMaterial } from '@/api/system/Tmaterial';
|
import { getMaterial, updateMaterial, addMaterial } from '@/api/system/Tmaterial';
|
||||||
@@ -45,7 +45,8 @@ const form = ref({
|
|||||||
brand: '', // 联系电话
|
brand: '', // 联系电话
|
||||||
model: '', // 邮箱
|
model: '', // 邮箱
|
||||||
unit: '', // 地址
|
unit: '', // 地址
|
||||||
remark: '' // 备注
|
remark: '', // 备注
|
||||||
|
villageId: ''
|
||||||
});
|
});
|
||||||
const rules = ref({
|
const rules = ref({
|
||||||
materialName: [{ required: true, message: '请输入 物料名称', trigger: 'blur' }],
|
materialName: [{ required: true, message: '请输入 物料名称', trigger: 'blur' }],
|
||||||
@@ -63,13 +64,16 @@ if (route.query.id) {
|
|||||||
brand: res.data.brand,
|
brand: res.data.brand,
|
||||||
model: res.data.model,
|
model: res.data.model,
|
||||||
unit: res.data.unit,
|
unit: res.data.unit,
|
||||||
remark: res.data.remark
|
remark: res.data.remark,
|
||||||
|
villageId: res.data.villageId
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// !== 提交 =============================================================================
|
// !== 提交 =============================================================================
|
||||||
// 提交
|
// 提交
|
||||||
const submitForm = () => {
|
const submitForm = () => {
|
||||||
|
const villageId = localStorage.getItem('villageid');
|
||||||
|
form.value.villageId = villageId;
|
||||||
formRef.value?.validate(async (valid: boolean) => {
|
formRef.value?.validate(async (valid: boolean) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
if (userid.value) {
|
if (userid.value) {
|
||||||
@@ -92,7 +96,7 @@ const cancelForm = () => {
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.AddBuildingBox {
|
.AddBuildingBox {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -28,7 +28,13 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="入库仓库" prop="warehouseId">
|
<el-form-item label="入库仓库" prop="warehouseId">
|
||||||
<el-select v-model="form.warehouseId" placeholder="请选择入库仓库">
|
<el-select v-model="form.warehouseId" placeholder="请选择入库仓库">
|
||||||
<el-option v-for="(item, index) in warehouselist" :key="index" :label="item.warehouseName" :value="item.id" />
|
<el-option
|
||||||
|
v-for="(item, index) in warehouselist"
|
||||||
|
:key="index"
|
||||||
|
:disabled="item.status === '1'"
|
||||||
|
:label="item.warehouseName"
|
||||||
|
:value="item.id"
|
||||||
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item label="入库状态" prop="operateStatus">-->
|
<!-- <el-form-item label="入库状态" prop="operateStatus">-->
|
||||||
@@ -47,7 +53,7 @@
|
|||||||
<div class="AddBuildingBody">
|
<div class="AddBuildingBody">
|
||||||
<div style="margin-bottom: 20px">
|
<div style="margin-bottom: 20px">
|
||||||
<span>详细入库列表</span>
|
<span>详细入库列表</span>
|
||||||
<material ref="materialRef" :is-multiple="true" :userid="itemsid" returnvalue="*" @change="handleChangeitem">
|
<material ref="materialRef" :is-multiple="true" :isHidden="true" :userid="itemsid" returnvalue="*" @change="handleChangeitem">
|
||||||
<template #default>
|
<template #default>
|
||||||
<el-button icon="Plus" style="margin-left: 20px" type="primary" @click="() => materialRef.open()">添加</el-button>
|
<el-button icon="Plus" style="margin-left: 20px" type="primary" @click="() => materialRef.open()">添加</el-button>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -4,24 +4,24 @@
|
|||||||
<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="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
|
<el-form ref="formRef" :model="form" :rules="rules" class="formBody" label-position="right" label-width="130px">
|
||||||
<el-form-item label="供应商名称" prop="supplierName">
|
<el-form-item label="供应商名称" prop="supplierName">
|
||||||
<el-input maxlength="20" v-model.trim="form.supplierName" placeholder="请输入供应商名称" />
|
<el-input v-model.trim="form.supplierName" maxlength="20" placeholder="请输入供应商名称" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="联系人" prop="contactPerson">
|
<el-form-item label="联系人" prop="contactPerson">
|
||||||
<el-input maxlength="20" v-model.trim="form.contactPerson" placeholder="请输入联系人" />
|
<el-input v-model.trim="form.contactPerson" maxlength="20" placeholder="请输入联系人" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="联系电话" prop="contactPhone">
|
<el-form-item label="联系电话" prop="contactPhone">
|
||||||
<el-input maxlength="11" v-model.trim="form.contactPhone" placeholder="请输入联系电话" />
|
<el-input v-model.trim="form.contactPhone" maxlength="11" placeholder="请输入联系电话" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="邮箱" props="email">
|
<el-form-item label="邮箱" props="email">
|
||||||
<el-input maxlength="30" v-model.trim="form.email" placeholder="请输入邮箱" />
|
<el-input v-model.trim="form.email" maxlength="30" placeholder="请输入邮箱" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="地址" prop="address">
|
<el-form-item label="地址" prop="address">
|
||||||
<el-input type="textarea" maxlength="100" show-word-limit :rows="2" v-model.trim="form.address" placeholder="请输入地址" />
|
<el-input v-model.trim="form.address" :rows="2" maxlength="100" placeholder="请输入地址" show-word-limit type="textarea" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
<el-input type="textarea" maxlength="200" show-word-limit :rows="5" v-model.trim="form.remark" placeholder="请输入备注" />
|
<el-input v-model.trim="form.remark" :rows="5" maxlength="200" placeholder="请输入备注" show-word-limit type="textarea" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="margin-top: 30px">
|
<el-form-item style="margin-top: 30px">
|
||||||
<el-button type="primary" @click="submitForm">提交</el-button>
|
<el-button type="primary" @click="submitForm">提交</el-button>
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { getSupplier, updateSupplier, addSupplier } from '@/api/system/Tsupplier';
|
import { getSupplier, updateSupplier, addSupplier } from '@/api/system/Tsupplier';
|
||||||
@@ -50,6 +50,7 @@ const form = ref({
|
|||||||
email: '', // 邮箱
|
email: '', // 邮箱
|
||||||
address: '', // 地址
|
address: '', // 地址
|
||||||
remark: '', // 备注
|
remark: '', // 备注
|
||||||
|
villageId: '', // 小区id
|
||||||
contactPerson: '' // 联系人
|
contactPerson: '' // 联系人
|
||||||
});
|
});
|
||||||
const rules = ref({
|
const rules = ref({
|
||||||
@@ -88,6 +89,7 @@ if (route.query.id) {
|
|||||||
email: res.data.email,
|
email: res.data.email,
|
||||||
address: res.data.address,
|
address: res.data.address,
|
||||||
remark: res.data.remark,
|
remark: res.data.remark,
|
||||||
|
villageId: res.data.villageId,
|
||||||
contactPerson: res.data.contactPerson
|
contactPerson: res.data.contactPerson
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@@ -95,6 +97,8 @@ if (route.query.id) {
|
|||||||
// !== 提交 =============================================================================
|
// !== 提交 =============================================================================
|
||||||
// 提交
|
// 提交
|
||||||
const submitForm = () => {
|
const submitForm = () => {
|
||||||
|
const villageId = localStorage.getItem('villageid') || '';
|
||||||
|
form.value.villageId = villageId;
|
||||||
formRef.value?.validate(async (valid: boolean) => {
|
formRef.value?.validate(async (valid: boolean) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
if (userid.value) {
|
if (userid.value) {
|
||||||
@@ -117,7 +121,7 @@ const cancelForm = () => {
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.AddBuildingBox {
|
.AddBuildingBox {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ const submitForm = () => {
|
|||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
const handleDelete = async (row?: SupplierVO) => {
|
const handleDelete = async (row?: SupplierVO) => {
|
||||||
const _ids = row?.id || ids.value;
|
const _ids = row?.id || ids.value;
|
||||||
await proxy?.$modal.confirm('是否确认删除供应商编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
|
await proxy?.$modal.confirm('是否确认删除选中供应商?').finally(() => (loading.value = false));
|
||||||
await delSupplier(_ids);
|
await delSupplier(_ids);
|
||||||
proxy?.$modal.msgSuccess('删除成功');
|
proxy?.$modal.msgSuccess('删除成功');
|
||||||
await getList();
|
await getList();
|
||||||
|
|||||||
@@ -1,38 +1,38 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="quicly_box">
|
<div class="quickly_box">
|
||||||
<div class="quickly_item" v-for="(item, index) in quickBox" :key="index" @click="handleRouter(item.menuPath)">
|
<div v-for="(item, index) in quickBox" :key="index" class="quickly_item" @click="handleRouter(item.menuPath)">
|
||||||
<div class="quickly_item_icon" v-if="item.menuIcon">
|
<div v-if="item.menuIcon" class="quickly_item_icon">
|
||||||
<svg-icon :icon-class="item.menuIcon" />
|
<svg-icon :icon-class="item.menuIcon" />
|
||||||
</div>
|
</div>
|
||||||
<div class="quickly_item_content">{{ item.menuName }}</div>
|
<div class="quickly_item_content">{{ item.menuName }}</div>
|
||||||
<div class="deleteaction" @click="delteRoute($event, item.id)">
|
<div class="deleteAction" @click="deleteRoute($event, item.id)">
|
||||||
<el-icon class="icons"><Remove /></el-icon>
|
<el-icon class="icons"><Remove /></el-icon>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div @click="addQuieckDialog" class="quickly_item add">
|
<div class="quickly_item add" @click="addQuickDialog">
|
||||||
<el-icon><Plus /></el-icon>
|
<el-icon><Plus /></el-icon>
|
||||||
<span>添加</span>
|
<span>添加</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 添加快捷入口 -->
|
<!-- 添加快捷入口 -->
|
||||||
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
|
<el-dialog v-model="dialog.visible" :title="dialog.title" append-to-body width="500px">
|
||||||
<el-form ref="repairProjectFormRef" :model="form" :rules="rules" label-width="80px">
|
<el-form ref="repairProjectFormRef" :model="form" :rules="rules" label-width="80px">
|
||||||
<el-form-item label="展示页面" prop="path">
|
<el-form-item label="展示页面" prop="path">
|
||||||
<el-cascader
|
<el-cascader
|
||||||
@change="handleCascader"
|
|
||||||
clearable
|
|
||||||
:props="{ value: 'path', label: 'name', children: 'children' }"
|
|
||||||
v-model="path"
|
v-model="path"
|
||||||
:options="quicklylist"
|
:options="quicklyList"
|
||||||
|
:props="{ value: 'path', label: 'name', children: 'children' }"
|
||||||
|
clearable
|
||||||
|
@change="handleCascader"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="排序" prop="path">
|
<el-form-item label="排序" prop="sortOrder">
|
||||||
<el-input-number v-model="form.sortOrder"></el-input-number>
|
<el-input-number v-model="form.sortOrder"></el-input-number>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div class="dialog-footer">
|
<div class="dialog-footer">
|
||||||
<el-button type="primary" @click="submitQuick">确 定</el-button>
|
<el-button :loading="buttonLoading" type="primary" @click="submitQuick">确 定</el-button>
|
||||||
<el-button @click="close">取 消</el-button>
|
<el-button @click="close">取 消</el-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -76,37 +76,45 @@ const path = ref([]);
|
|||||||
const rules = {
|
const rules = {
|
||||||
menuPath: [{ required: true, trigger: 'blur', message: '请选择快捷入口页面' }]
|
menuPath: [{ required: true, trigger: 'blur', message: '请选择快捷入口页面' }]
|
||||||
};
|
};
|
||||||
const quicklylist = ref([]);
|
type RouteItem = {
|
||||||
function addQuieckDialog() {
|
name: string;
|
||||||
|
icon: string;
|
||||||
|
path: string;
|
||||||
|
level: number;
|
||||||
|
children: RouteItem[];
|
||||||
|
};
|
||||||
|
const quicklyList = ref<RouteItem[]>([]);
|
||||||
|
function addQuickDialog() {
|
||||||
form.value = {
|
form.value = {
|
||||||
menuName: '',
|
menuName: '',
|
||||||
menuPath: '',
|
menuPath: '',
|
||||||
menuIcon: '',
|
menuIcon: '',
|
||||||
sortOrder: 1
|
sortOrder: 1
|
||||||
};
|
};
|
||||||
|
path.value = [];
|
||||||
const permissionStore = usePermissionStore();
|
const permissionStore = usePermissionStore();
|
||||||
const routes = permissionStore.getDefaultRoutes();
|
const routes = permissionStore.getDefaultRoutes();
|
||||||
handleroutestoshowlist(routes);
|
handleRoutesToShowList(routes);
|
||||||
dialog.visible = true;
|
dialog.visible = true;
|
||||||
}
|
}
|
||||||
function getquicklist() {
|
function getQuickList() {
|
||||||
getQuicklyshortcut({}).then((res) => {
|
getQuicklyshortcut({}).then((res) => {
|
||||||
quickBox.value = res.data;
|
quickBox.value = res.data.sort((a, b) => a.sortOrder - b.sortOrder);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
getquicklist();
|
getQuickList();
|
||||||
function handleroutestoshowlist(rotues) {
|
function handleRoutesToShowList(routes: any[]) {
|
||||||
// 1. 输入校验:确保 routes 是数组
|
// 1. 输入校验:确保 routes 是数组
|
||||||
if (!Array.isArray(rotues)) {
|
if (!Array.isArray(routes)) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
quicklylist.value = rotues.map((ele) => _handle(null, ele, 1)).filter((item) => item);
|
quicklyList.value = routes.map((ele) => _handle(null, ele, 1)).filter((item) => item);
|
||||||
}
|
}
|
||||||
function _handle(
|
function _handle(
|
||||||
parentRoute: { name?: any; icon?: any; path: any; level?: any; children?: any[] },
|
parentRoute: { name?: any; icon?: any; path: any; level?: any; children?: any[] },
|
||||||
currentRoute: { hidden: any; path: string; meta: { title: any; icon: any }; children: any[] },
|
currentRoute: { hidden: any; path: string; meta: { title: any; icon: any }; children: any[] },
|
||||||
level: number
|
level: number
|
||||||
) {
|
): RouteItem | null {
|
||||||
// 非页面路由
|
// 非页面路由
|
||||||
if (currentRoute.hidden && level === 1) {
|
if (currentRoute.hidden && level === 1) {
|
||||||
return null;
|
return null;
|
||||||
@@ -148,12 +156,12 @@ function _handle(
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleCascader(val) {
|
function handleCascader(val: string[]) {
|
||||||
const parentpath = val[0];
|
const parentPath = val[0];
|
||||||
const childrenpath = val[1];
|
const childrenPath = val[1];
|
||||||
const find = quicklylist.value.find((item) => item.path === parentpath);
|
const find = quicklyList.value.find((item) => item.path === parentPath);
|
||||||
if (find) {
|
if (find) {
|
||||||
const find2 = find.children.find((item) => item.path === childrenpath);
|
const find2 = find.children.find((item) => item.path === childrenPath);
|
||||||
if (find2) {
|
if (find2) {
|
||||||
form.value = {
|
form.value = {
|
||||||
...form.value,
|
...form.value,
|
||||||
@@ -164,26 +172,32 @@ function handleCascader(val) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const buttonLoading = ref(false);
|
||||||
function submitQuick() {
|
function submitQuick() {
|
||||||
addQuicklyshortcut(form.value).then((res) => {
|
buttonLoading.value = true;
|
||||||
|
addQuicklyshortcut(form.value)
|
||||||
|
.then((res) => {
|
||||||
ElMessage.success(res.msg);
|
ElMessage.success(res.msg);
|
||||||
dialog.visible = false;
|
dialog.visible = false;
|
||||||
getquicklist();
|
getQuickList();
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
buttonLoading.value = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function close() {
|
function close() {
|
||||||
dialog.visible = false;
|
dialog.visible = false;
|
||||||
}
|
}
|
||||||
function delteRoute(e: MouseEvent, id: string) {
|
function deleteRoute(e: MouseEvent, id: string) {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
delQuicklyshortcut(id).then(() => {
|
delQuicklyshortcut(id).then(() => {
|
||||||
getquicklist();
|
getQuickList();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// ! 快捷入口
|
// ! 快捷入口
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.quicly_box {
|
.quickly_box {
|
||||||
max-height: 410px;
|
max-height: 410px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding-top: 20px;
|
padding-top: 20px;
|
||||||
@@ -244,25 +258,13 @@ function delteRoute(e: MouseEvent, id: string) {
|
|||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: #222222;
|
color: #222222;
|
||||||
}
|
}
|
||||||
|
|
||||||
// &:hover {
|
|
||||||
// .actionsbox {
|
|
||||||
// opacity: 1;
|
|
||||||
// .routeactions {
|
|
||||||
// transform: rotateY(0deg);
|
|
||||||
// }
|
|
||||||
// .deleteaction {
|
|
||||||
// transform: rotateY(0deg);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
&:hover {
|
&:hover {
|
||||||
.deleteaction {
|
.deleteAction {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.deleteaction {
|
.deleteAction {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
transition: all 0.3s;
|
transition: all 0.3s;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
@@ -317,7 +319,7 @@ function delteRoute(e: MouseEvent, id: string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.actionsbox {
|
.actionsBox {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transition: all 0.3s;
|
transition: all 0.3s;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -328,8 +330,8 @@ function delteRoute(e: MouseEvent, id: string) {
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
.routeactions,
|
.routeActions,
|
||||||
.deleteaction {
|
.deleteAction {
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
flex: 0.5;
|
flex: 0.5;
|
||||||
@@ -346,12 +348,12 @@ function delteRoute(e: MouseEvent, id: string) {
|
|||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.routeactions {
|
.routeActions {
|
||||||
background-color: #0083ff;
|
background-color: #0083ff;
|
||||||
transform-origin: left center;
|
transform-origin: left center;
|
||||||
transform: rotateY(90deg);
|
transform: rotateY(90deg);
|
||||||
}
|
}
|
||||||
.deleteaction {
|
.deleteAction {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
background-color: red;
|
background-color: red;
|
||||||
|
|||||||
Reference in New Issue
Block a user