完成Banner,设备管理模块,进行中 水电表

This commit is contained in:
Zy
2026-04-24 17:52:50 +08:00
parent 290db6ba5d
commit ab736fa15f
36 changed files with 2314 additions and 636 deletions

View File

@@ -0,0 +1,63 @@
import request from '@/utils/request';
import { AxiosPromise } from 'axios';
import { BannerVO, BannerForm, BannerQuery } from './type';
/**
* 查询Banner图管理列表
* @param query
* @returns {*}
*/
export const listBanner = (query?: BannerQuery): AxiosPromise<BannerVO[]> => {
return request({
url: '/banner/list',
method: 'get',
params: query
});
};
/**
* 查询Banner图管理详细
* @param id
*/
export const getBanner = (id: string | number): AxiosPromise<BannerVO> => {
return request({
url: '/banner/' + id,
method: 'get'
});
};
/**
* 新增Banner图管理
* @param data
*/
export const addBanner = (data: BannerForm) => {
return request({
url: '/banner',
method: 'post',
data: data
});
};
/**
* 修改Banner图管理
* @param data
*/
export const updateBanner = (data: BannerForm) => {
return request({
url: '/banner',
method: 'put',
data: data
});
};
/**
* 删除Banner图管理
* @param id
*/
export const delBanner = (id: string | number | Array<string | number>) => {
return request({
url: '/banner/' + id,
method: 'delete'
});
};

View File

@@ -0,0 +1,81 @@
export interface BannerVO {
/**
* Banner图管理表id
*/
id: string | number;
/**
* 名称
*/
name: string;
/**
* 状态 0启用 1停用
*/
status: string;
/**
* 排序
*/
order: number;
url: string;
jump_link: string;
/**
* 小区id
*/
villageId: string | number;
}
export interface BannerForm extends BaseEntity {
/**
* Banner图管理表id
*/
id?: string | number;
/**
* 名称
*/
name?: string;
/**
* 状态 0启用 1停用
*/
status?: string;
/**
* 排序
*/
order?: number;
/**
* 小区id
*/
villageId?: string | number;
}
export interface BannerQuery extends PageQuery {
/**
* 名称
*/
name?: string;
/**
* 状态 0启用 1停用
*/
status?: string;
/**
* 排序
*/
order?: number;
/**
* 小区id
*/
villageId?: string | number;
/**
* 日期范围参数
*/
params?: any;
}

View File

@@ -2,7 +2,7 @@ import request from '@/utils/request';
import { AxiosPromise } from 'axios';
/**
* 查询巡检数据
* 查询巡检数据 概况
* @param query
* @returns {*}
*/
@@ -68,14 +68,14 @@ export interface Request {
}
/**
* 查询业务统计
* 查询 巡检业务统计
* @param query
* @returns {*}
*/
export const list_statapi = (query?: { taskTimeBegin: string; taskTimeEnd: string }): AxiosPromise<any[]> => {
return request({
url: '/inspection/data/list',
url: '/inspection/data/role/stat',
method: 'get',
params: query
});

View File

@@ -121,7 +121,7 @@ export interface TopupRecordQuery extends PageQuery {
/**
* 1.电表 2.水表
*/
type?: number;
type?: string;
/**
* 订单状态(0.未支付 1.已支付 2.支付中3.支付失败 4.退款)

View File

@@ -8,7 +8,7 @@ export interface MaterialVO {
* 物料名称*
*/
materialName: string;
materialId: string;
/**
* 品牌*
*/

View File

@@ -10,7 +10,7 @@ import { DeviceCategoryVO, DeviceCategoryForm, DeviceCategoryQuery } from './typ
export const listDeviceCategory = (query?: DeviceCategoryQuery): AxiosPromise<DeviceCategoryVO[]> => {
return request({
url: '/system/deviceCategory/list',
url: '/warehouse/deviceCategory/list',
method: 'get',
params: query
});
@@ -22,7 +22,7 @@ export const listDeviceCategory = (query?: DeviceCategoryQuery): AxiosPromise<De
*/
export const getDeviceCategory = (id: string | number): AxiosPromise<DeviceCategoryVO> => {
return request({
url: '/system/deviceCategory/' + id,
url: '/warehouse/deviceCategory/' + id,
method: 'get'
});
};
@@ -33,7 +33,7 @@ export const getDeviceCategory = (id: string | number): AxiosPromise<DeviceCateg
*/
export const addDeviceCategory = (data: DeviceCategoryForm) => {
return request({
url: '/system/deviceCategory',
url: '/warehouse/deviceCategory',
method: 'post',
data: data
});
@@ -45,7 +45,7 @@ export const addDeviceCategory = (data: DeviceCategoryForm) => {
*/
export const updateDeviceCategory = (data: DeviceCategoryForm) => {
return request({
url: '/system/deviceCategory',
url: '/warehouse/deviceCategory',
method: 'put',
data: data
});
@@ -57,7 +57,7 @@ export const updateDeviceCategory = (data: DeviceCategoryForm) => {
*/
export const delDeviceCategory = (id: string | number | Array<string | number>) => {
return request({
url: '/system/deviceCategory/' + id,
url: '/warehouse/deviceCategory/' + id,
method: 'delete'
});
};

View File

@@ -12,7 +12,7 @@ export interface DeviceCategoryVO {
/**
* 状态 0正常 1停用
*/
status: number;
status: string;
/**
* 备注
@@ -34,7 +34,7 @@ export interface DeviceCategoryForm extends BaseEntity {
/**
* 状态 0正常 1停用
*/
status?: number;
status?: string;
/**
* 备注
@@ -51,7 +51,7 @@ export interface DeviceCategoryQuery extends PageQuery {
/**
* 状态 0正常 1停用
*/
status?: number;
status?: string;
/**
* 日期范围参数

View File

@@ -10,7 +10,7 @@ import { DeviceRepairVO, DeviceRepairForm, DeviceRepairQuery } from './type';
export const listDeviceRepair = (query?: DeviceRepairQuery): AxiosPromise<DeviceRepairVO[]> => {
return request({
url: '/system/deviceRepair/list',
url: '/warehouse/deviceRepair/list',
method: 'get',
params: query
});
@@ -22,7 +22,7 @@ export const listDeviceRepair = (query?: DeviceRepairQuery): AxiosPromise<Device
*/
export const getDeviceRepair = (id: string | number): AxiosPromise<DeviceRepairVO> => {
return request({
url: '/system/deviceRepair/' + id,
url: '/warehouse/deviceRepair/' + id,
method: 'get'
});
};
@@ -33,7 +33,7 @@ export const getDeviceRepair = (id: string | number): AxiosPromise<DeviceRepairV
*/
export const addDeviceRepair = (data: DeviceRepairForm) => {
return request({
url: '/system/deviceRepair',
url: '/warehouse/deviceRepair',
method: 'post',
data: data
});
@@ -45,7 +45,7 @@ export const addDeviceRepair = (data: DeviceRepairForm) => {
*/
export const updateDeviceRepair = (data: DeviceRepairForm) => {
return request({
url: '/system/deviceRepair',
url: '/warehouse/deviceRepair',
method: 'put',
data: data
});
@@ -57,7 +57,7 @@ export const updateDeviceRepair = (data: DeviceRepairForm) => {
*/
export const delDeviceRepair = (id: string | number | Array<string | number>) => {
return request({
url: '/system/deviceRepair/' + id,
url: '/warehouse/deviceRepair/' + id,
method: 'delete'
});
};

View File

@@ -7,7 +7,7 @@ export interface DeviceRepairVO {
/**
* 维修设备ID
*/
deviceId: string | number;
deviceId: string;
/**
* 设备名称
@@ -32,23 +32,32 @@ export interface DeviceRepairVO {
/**
* 维护人员ID多个用,分隔
*/
maintainUserIds: string | number;
maintainUserIds: string;
/**
* 故障描述
*/
faultDesc: string;
categoryName: string;
createTime: string;
/**
* 维修结果 0已修复 1未修复
*/
repairResult: number;
repairResult: string;
/**
* 维修时间
*/
repairTime: string;
maintainUserList: {
'userId': string;
'userName': string;
'nickName': string;
'phonenumber': number;
}[];
categoryId: string;
/**
* 备注
*/
@@ -59,12 +68,12 @@ export interface DeviceRepairForm extends BaseEntity {
/**
* 主键ID
*/
id?: string | number;
id?: string;
/**
* 维修设备ID
*/
deviceId?: string | number;
deviceId?: string;
/**
* 设备名称
@@ -89,7 +98,7 @@ export interface DeviceRepairForm extends BaseEntity {
/**
* 维护人员ID多个用,分隔
*/
maintainUserIds?: string | number;
maintainUserIds?: string;
/**
* 故障描述
@@ -99,7 +108,7 @@ export interface DeviceRepairForm extends BaseEntity {
/**
* 维修结果 0已修复 1未修复
*/
repairResult?: number;
repairResult?: string;
/**
* 维修时间
@@ -116,7 +125,7 @@ export interface DeviceRepairQuery extends PageQuery {
/**
* 维修设备ID
*/
deviceId?: string | number;
deviceId?: string;
/**
* 设备名称
@@ -141,7 +150,7 @@ export interface DeviceRepairQuery extends PageQuery {
/**
* 维护人员ID多个用,分隔
*/
maintainUserIds?: string | number;
maintainUserIds?: string;
/**
* 故障描述
@@ -151,7 +160,7 @@ export interface DeviceRepairQuery extends PageQuery {
/**
* 维修结果 0已修复 1未修复
*/
repairResult?: number;
repairResult?: string;
/**
* 维修时间

View File

@@ -2,12 +2,12 @@ export interface DeviceVO {
/**
* 主键ID
*/
id: string | number;
id: string;
/**
* 设备分类ID
*/
categoryId: string | number;
categoryId: string;
/**
* 设备名称
@@ -32,7 +32,7 @@ export interface DeviceVO {
/**
* 维护人员ID多个用,分隔
*/
maintainUserIds: string | number;
maintainUserIds: string;
/**
* 设备状态 0正常 1异常
@@ -43,18 +43,27 @@ export interface DeviceVO {
* 备注
*/
remark: string;
/** 人员信息 */
maintainUserList: {
'userId': string;
'userName': string;
'nickName': string;
'phonenumber': number;
}[];
createTime?: string;
}
export interface DeviceForm extends BaseEntity {
/**
* 主键ID
*/
id?: string | number;
id?: string;
/**
* 设备分类ID
*/
categoryId?: string | number;
categoryId?: string;
/**
* 设备名称
@@ -79,7 +88,7 @@ export interface DeviceForm extends BaseEntity {
/**
* 维护人员ID多个用,分隔
*/
maintainUserIds?: string | number;
maintainUserIds?: string;
/**
* 设备状态 0正常 1异常
@@ -96,7 +105,7 @@ export interface DeviceQuery extends PageQuery {
/**
* 设备分类ID
*/
categoryId?: string | number;
categoryId?: string;
/**
* 设备名称

View File

@@ -148,9 +148,6 @@ function getlist() {
tableData.value = res.rows;
total.value = res.total;
})
.catch((error) => {
console.error('获取用户列表失败:', error);
})
.finally(() => {
loading.value = false;
});

View File

@@ -12,6 +12,24 @@
</div>
<el-dialog append-to-body v-model="dialog.dialogVisible" :title="dialog.dialogTitle" width="1050">
<nav class="flex flex-items-center mb-8">
<div class="flex flex-items-center">
<div style="width: 70px; text-align: right; padding-right: 10px">员工姓名</div>
<div class="mr-5 flex-1">
<el-input style="width: 170px" clearable v-model="queryParams.nickName" placeholder="请输入员工姓名" />
</div>
</div>
<div class="flex flex-items-center">
<div style="width: 70px; text-align: right; padding-right: 10px">手机号</div>
<div class="mr-5 flex-1">
<el-input style="width: 170px" clearable v-model="queryParams.phonenumber" placeholder="请输入手机号" />
</div>
</div>
<div>
<el-button type="primary" @click="getlist">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
</div>
</nav>
<el-table @row-click="handleRowClick" ref="multipleTableRef" :data="tableData" border @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" width="55" type="index" />
@@ -21,7 +39,7 @@
<dict-tag :options="sys_user_sex" :value="row.sex" />
</template>
</el-table-column>
<el-table-column label="角色" align="center" width="85" prop="roleName" />
<el-table-column label="角色" align="center" prop="roleName" />
<el-table-column label="手机号码" align="center" prop="phonenumber" />
</el-table>
@@ -51,8 +69,6 @@ import { getUserByRoleKey } from '@/api/system/user';
import { ref, watch, nextTick, getCurrentInstance, ComponentInternalInstance, toRefs } from 'vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_resident_type } = toRefs<any>(proxy?.useDict('com_resident_type'));
const { com_certification_status } = toRefs<any>(proxy?.useDict('com_certification_status'));
const { sys_user_sex } = toRefs<any>(proxy?.useDict('sys_user_sex'));
interface tableType extends ResidentVO {
@@ -61,7 +77,7 @@ interface tableType extends ResidentVO {
const props = defineProps({
userid: {
type: [String, Number],
type: String,
default: ''
},
returnvalue: {
@@ -97,15 +113,8 @@ const dialog = ref({
const queryParams = ref({
pageNum: 1,
pageSize: 10,
date: null,
type: null,
status: '',
ownerRelationship: null,
name: null,
houseId: null,
villageId: null,
buildingId: null,
unitNo: null
nickName: null,
phonenumber: null
});
const multipleTableRef = ref();
@@ -121,21 +130,31 @@ const isMultiple = computed(() => props.isMultiple ?? false);
// 优化 handleUserSelection避免重复查找
const handleUserSelection = () => {
if (!userid.value || !tableData.value.length) return;
const target = tableData.value.find((item) => item.userId == userid.value);
if (target && !multipleSelection.value.some((sel) => sel.id === target.id)) {
multipleSelection.value = [target];
multipleSelection.value = [];
if (userid.value.trim() !== '') {
const arr = userid.value.split(',');
arr.forEach((item) => {
const target = tableData.value.find((row) => row.userId == item);
target && multipleSelection.value.push(target);
});
nextTick(() => {
multipleTableRef.value?.setSelection([target]);
if (multipleTableRef.value) {
multipleTableRef.value.clearSelection();
multipleSelection.value.forEach((item) => {
multipleTableRef.value.toggleRowSelection(item, true);
});
}
});
}
};
// 监听
// 监听优化:只在 userid 变化时触发
watch(userid, handleUserSelection, { immediate: true });
watch(tableData, () => {
if (userid.value) handleUserSelection(); // 仅在有 userid 时重新处理
});
// watch(userid, handleUserSelection, { immediate: true });
// watch(tableData, () => {
// if (userid.value) handleUserSelection(); // 仅在有 userid 时重新处理
// });
// ====================== 方法 ======================
// 打开选择框
@@ -172,18 +191,25 @@ function handleSelectionChange(selection: tableType[]) {
// ==============================================
// 优化 handleRowClick避免重复
function handleRowClick(row: tableType) {
if (!multipleTableRef.value) return;
if (isMultiple.value) {
const index = multipleSelection.value.findIndex((item) => item.id === row.id);
if (index > -1) {
// 取消选中
multipleSelection.value.splice(index, 1);
multipleTableRef.value?.toggleRowSelection(row, false);
} else {
// 选中
multipleSelection.value.push(row);
multipleTableRef.value?.toggleRowSelection(row, true);
}
} else {
// 【单选模式】先清空,再选中当前行
multipleSelection.value = [];
multipleTableRef.value.clearSelection();
multipleSelection.value = [row];
multipleTableRef.value?.setSelection([row]);
multipleTableRef.value.toggleRowSelection(row, true);
}
}
// 重置查询
@@ -191,15 +217,8 @@ function resetQuery() {
queryParams.value = {
pageNum: 1,
pageSize: 10,
ownerRelationship: null,
name: null,
date: null,
type: null,
status: '',
houseId: null,
villageId: null,
buildingId: null,
unitNo: null
nickName: null,
phonenumber: null
};
getlist();
}
@@ -215,31 +234,32 @@ function conback() {
// ==============================================
function confirm() {
dialog.value.dialogVisible = false;
if (multipleSelection.value.length > 0) {
if (isMultiple.value) {
// 多选
if (returnvalue.value === '*') {
// ✅ 返回整个对象数组
emit('change', multipleSelection.value);
} else {
// 返回指定字段数组
emit(
'change',
multipleSelection.value.map((item) => item[returnvalue.value as keyof tableType])
);
}
if (isMultiple.value) {
// 多选
if (returnvalue.value === '*') {
// ✅ 返回整个对象数组
emit('change', multipleSelection.value);
} else {
// 单选
if (returnvalue.value === '*') {
// ✅ 返回整个对象
emit('change', multipleSelection.value[0]);
} else {
console.log(multipleSelection.value[0], returnvalue.value);
// 返回指定字段
emit('change', multipleSelection.value[0][returnvalue.value as keyof tableType]);
}
// 返回指定字段数组
emit(
'change',
multipleSelection.value.map((item) => item[returnvalue.value as keyof tableType])
);
}
} else {
// 单选
if (returnvalue.value === '*') {
// ✅ 返回整个对象
emit('change', multipleSelection.value[0]);
} else {
console.log(multipleSelection.value[0], returnvalue.value);
// 返回指定字段
emit('change', multipleSelection.value[0][returnvalue.value as keyof tableType]);
}
}
multipleSelection.value = [];
multipleTableRef.value.clearSelection();
}
// 初始化
getlist();
@@ -247,6 +267,7 @@ getlist();
defineExpose({
open: () => {
dialog.value.dialogVisible = true;
handleUserSelection();
}
});
</script>

View File

@@ -0,0 +1,239 @@
<template>
<div class="AddBuildingBox">
<PageHeader></PageHeader>
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<div class="addBuildingFormBody">
<el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
<el-form-item label="Banner名称" prop="name">
<el-input v-model.trim="form.name" placeholder="请输入" />
</el-form-item>
<el-form-item label="Banner图" prop="url">
<el-upload
class="avatar-uploader"
ref="uploadRef"
accept=".png, .jpg"
:action="uploadUrl"
name="file"
:headers="headerToken()"
:show-file-list="false"
:on-success="handleAvatarSuccess"
v-on:error="handleAvatarError"
:before-upload="beforeAvatarUpload"
>
<img v-if="form.url" :src="form.url" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
<template #tip>
<div class="el-upload__tip">支持jpg, png等格式文件上传文件大小不超过10MB.</div>
</template>
</el-upload>
</el-form-item>
<el-form-item label="跳转链接" prop="jump_link">
<el-input v-model.trim="form.jump_link" placeholder="请输入跳转链接" />
</el-form-item>
<el-form-item label="排序号" prop="order">
<el-input-number v-model.trim="form.order" placeholder="请输入" />
</el-form-item>
<el-form-item style="margin-top: 30px">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="cancelForm">返回</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { addBanner, getBanner, updateBanner } from '@/api/system/Banner';
import { useUserStore } from '@/store/modules/user';
import { UploadProps, UploadRawFile } from 'element-plus';
const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/car/uploadImage';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const router = useRouter();
const route = useRoute();
function headerToken() {
const useStore = useUserStore();
return {
Authorization: 'Bearer ' + useStore.token
};
}
const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile: UploadRawFile) => {
const type = rawFile.type.split('/').pop();
if (['png', 'jpg'].includes(type)) {
if (rawFile.size / 1024 / 1024 <= 10) {
return true;
} else {
ElMessage.warning('图片大小超过10M,请重新上传');
return false;
}
} else {
ElMessage.warning('图片格式不是 png/jpg 格式, 请重新上传');
return false;
}
};
const handleAvatarSuccess: UploadProps['onSuccess'] = (response: any) => {
console.log(response);
if (response.code === 500) {
form.value.url = '';
} else if (response.code === 200) {
form.value.url = response.data.url;
}
};
const handleAvatarError: UploadProps['onError'] = (respones) => {
console.log(respones);
};
const formRef = ref();
const form = ref({
id: null,
name: '', // 分类id、
url: '', // 设备名称
jump_link: '', // 编号
order: null // 区域
});
const rules = ref({
name: [{ required: true, message: '请输入Banner图名称', trigger: 'blur' }],
url: [{ required: true, message: '请上传图片', trigger: 'blur' }]
});
const userid = ref(null);
function init() {
if (route.query.id) {
userid.value = route.query.id;
getBanner(userid.value).then((res) => {
form.value = {
id: res.data.id,
name: res.data.name, // 分类id、
url: res.data.url, // 设备名称
jump_link: res.data.jump_link, // 编号
order: res.data.order // 区域
};
});
}
}
init();
// TODO Banner 提交
// !== 提交 =============================================================================
// 提交
const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => {
if (valid) {
if (userid.value) {
updateBanner(form.value).then(() => {
ElMessage.success('编辑成功');
cancelForm();
});
} else {
addBanner(form.value).then(() => {
ElMessage.success('添加成功');
cancelForm();
});
}
}
});
};
// 推出
const cancelForm = () => {
router.back();
};
</script>
<style scoped lang="scss">
.avatar-uploader .avatar {
width: 178px;
height: 178px;
display: block;
}
:deep(.avatar-uploader .el-upload) {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
:deep(.avatar-uploader .el-upload:hover) {
border-color: var(--el-color-primary);
}
.avatar-uploader-icon {
font-size: 1.1rem;
color: #8c939d;
width: 178px;
height: 178px;
text-align: center;
}
.AddBuildingBox {
padding: 15px;
height: 100%;
width: 100%;
}
.AddBuildingBody {
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
background-color: white;
padding: 15px;
.title {
height: 40px;
line-height: 40px;
padding-left: 20px;
background-color: rgba(255, 255, 255, 1);
color: rgba(16, 16, 16, 1);
border-bottom: 1px solid #bbbbbb;
margin-bottom: 60px;
}
.formBody {
width: 650px;
margin: 0 auto;
.checkoutuserbox {
margin: 5px;
border: 1px solid #ccc;
padding: 5px 10px;
border-radius: 5px;
&.add {
cursor: pointer;
border-style: dashed;
&:hover {
color: #409eff;
border-color: #409eff;
}
}
& > div {
cursor: pointer;
margin-left: 10px;
&:hover {
color: red;
}
}
}
&:deep(.el-form-item__content, .el-select, .el-input) {
width: 350px !important;
margin-right: 10px;
.el-cascader {
width: 100%;
}
}
.el-form-item {
margin-bottom: 20px;
align-items: center;
}
.el-button {
width: 80px;
height: 35px;
margin-right: 20px;
}
}
}
</style>

View File

@@ -0,0 +1,249 @@
<template>
<div class="p-2 h-full flex flex-col">
<pageheader></pageheader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['banner:banner:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['banner:banner:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['banner:banner:remove']"
>删除</el-button
>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="bannerList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="Banner缩略图" align="center" prop="id">
<template #default="scope">
<el-image
v-if="scope.row.url && scope.row.url.includes('http')"
:src="scope.row.url"
:preview-src-list="[scope.row.url]"
style="width: 40px; height: 40px; border-radius: 4px; margin-right: 5px"
fit="cover"
preview-teleported
/>
<span v-else>暂时没有</span>
</template>
</el-table-column>
<el-table-column label="名称" align="center" prop="name" />
<el-table-column label="状态 0启用 1停用" align="center" prop="status">
<template #default="scope">
<el-switch inactive-text="启用" active-text="停用" inactive-value="0" active-value="1" v-model="scope.row.status"></el-switch>
</template>
</el-table-column>
<el-table-column label="排序" align="center" prop="order" />
<el-table-column label="添加时间" align="center" prop="order" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['banner:banner:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['banner:banner:remove']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改Banner图管理对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="bannerFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="排序" prop="order">
<el-input v-model="form.order" placeholder="请输入排序" />
</el-form-item>
<el-form-item label="小区id" prop="villageId">
<el-input v-model="form.villageId" placeholder="请输入小区id" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Banner" lang="ts">
import { listBanner, getBanner, delBanner, addBanner, updateBanner } from '@/api/system/Banner';
import { BannerVO, BannerQuery, BannerForm } from '@/api/system/Banner/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const bannerList = ref<BannerVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const bannerFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: BannerForm = {
id: undefined,
name: undefined,
status: undefined,
order: undefined,
villageId: undefined
};
const data = reactive<PageData<BannerForm, BannerQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
name: undefined,
status: undefined,
order: undefined,
villageId: undefined,
params: {}
}
});
const { queryParams, form } = toRefs(data);
/** 查询Banner图管理列表 */
const getList = async () => {
loading.value = true;
const res = await listBanner(queryParams.value);
bannerList.value = res.rows;
total.value = res.total;
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
bannerFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: BannerVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
const router = useRouter();
/** 新增按钮操作 */
const handleAdd = () => {
router.push({
path: '/system/addBanner'
});
};
/** 修改按钮操作 */
const handleUpdate = async (row?: BannerVO) => {
router.push({
path: '/system/addBanner',
query: {
id: row.id
}
});
};
/** 提交按钮 */
const submitForm = () => {
bannerFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateBanner(form.value).finally(() => (buttonLoading.value = false));
} else {
await addBanner(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: BannerVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除Banner图管理编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delBanner(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'banner/banner/export',
{
...queryParams.value
},
`banner_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});
</script>
<style lang="scss" scoped>
.el-table {
height: calc(100% - 80px);
}
</style>

View File

@@ -9,13 +9,14 @@
<el-input v-model.trim="form.name" placeholder="请输入项目名称" />
</el-form-item>
<el-form-item label="计费方式" prop="billingMethod">
<el-select v-model="form.billingMethod">
<!-- <el-select v-model="form.billingMethod">
<el-option v-for="(item, index) in com_charge_item_method" :key="index" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
<el-form-item label="费用单价" prop="price">
<el-input v-model.trim="form.price" placeholder="请输入费用单价" />
</el-select> -->
<el-radio-group v-model="form.billingMethod">
<el-radio value="0">固定单价</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="计算公式" prop="materialName">
<el-select v-model="form.formula">
<el-option v-for="(item, index) in com_charge_item_formula" :key="index" :value="item.value" :label="item.label"></el-option>
@@ -26,6 +27,9 @@
<el-option v-for="(item, index) in com_charge_item_unit" :key="index" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
<el-form-item label="费用单价" prop="price">
<el-input v-model.trim="form.price" placeholder="请输入费用单价" />
</el-form-item>
<el-form-item label="计算精度" prop="precision">
<el-select v-model="form.precision">
<el-option v-for="(item, index) in com_charge_item_precision" :key="index" :value="item.value" :label="item.label"></el-option>
@@ -36,18 +40,9 @@
<el-option v-for="(item, index) in com_charge_item_carry_method" :key="index" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
<el-form-item label="滞纳金比例" prop="lateFee">
<el-input v-model.trim="form.lateFee" placeholder="请输入滞纳金比例">
<template #suffix>%</template>
</el-input>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="(item, index) in com_charge_item_status" :key="index" :value="item.value">{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="unit">
<el-input type="textarea" :rows="5" v-model.trim="form.remark" placeholder="请输入当前库存" />
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="5" v-model.trim="form.remark" placeholder="请输入" />
</el-form-item>
<el-form-item style="margin-top: 30px">
@@ -66,11 +61,9 @@ import PageHeader from '@/components/Pageheader/index.vue';
import { getChargeItem, updateChargeItem, addChargeItem } from '@/api/system/SdbChargeItem';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_charge_item_method } = toRefs<any>(proxy?.useDict('com_charge_item_method'));
const { com_charge_item_unit } = toRefs<any>(proxy?.useDict('com_charge_item_unit'));
const { com_charge_item_precision } = toRefs<any>(proxy?.useDict('com_charge_item_precision'));
const { com_charge_item_carry_method } = toRefs<any>(proxy?.useDict('com_charge_item_carry_method'));
const { com_charge_item_status } = toRefs<any>(proxy?.useDict('com_charge_item_status'));
const { com_charge_item_formula } = toRefs<any>(proxy?.useDict('com_charge_item_formula'));
const router = useRouter();
@@ -80,15 +73,13 @@ const formRef = ref();
const form = ref({
'id': null,
'name': '',
'billingMethod': '',
'billingMethod': '0',
'price': null,
'unit': '',
'precision': '',
'carryMethod': '',
'lateFee': null,
'remark': '',
'formula': '',
'status': '0'
'formula': ''
});
const rules = ref({
name: [{ required: true, message: '请输入 项目名称', trigger: 'blur' }],
@@ -97,9 +88,7 @@ const rules = ref({
formula: [{ required: true, message: '请选择 计费公式', trigger: 'blur' }],
unit: [{ required: true, message: '请选择 计费单位', trigger: 'blur' }],
precision: [{ required: true, message: '选择 计算精度', trigger: 'blur' }],
carryMethod: [{ required: true, message: '请选择 进位方式', trigger: 'blur' }],
lateFee: [{ required: true, message: '请输入 滞纳金比例', trigger: 'blur' }],
status: [{ required: true, message: '请选择 状态', trigger: 'blur' }]
carryMethod: [{ required: true, message: '请选择 进位方式', trigger: 'blur' }]
});
const userid = ref(null);
if (route.query.id) {
@@ -113,6 +102,8 @@ if (route.query.id) {
}
// !== 提交 =============================================================================
// 提交
// TODO 收费项目提交
const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => {
if (valid) {

View File

@@ -45,13 +45,19 @@
<dict-tag :options="com_charge_item_method" :value="scope.row.billingMethod"></dict-tag>
</template>
</el-table-column>
<el-table-column label="单价" align="center" prop="price" />
<el-table-column label="单位" align="center" prop="unit">
<el-table-column label="单价" align="center" prop="price">
<template #default="scope">
{{ scope.row.price }}
<dict-tag :options="com_charge_item_unit" :value="scope.row.unit"></dict-tag>
</template>
</el-table-column>
<el-table-column label=" 计算方式" align="center" prop="price" />
<el-table-column label="计量单位" align="center" prop="unit">
<template #default="scope">
<dict-tag :options="com_charge_item_unit" :value="scope.row.unit"></dict-tag>
</template>
</el-table-column>
<el-table-column label="精度" align="center" prop="precision">
<el-table-column label="计算精度" align="center" prop="precision">
<template #default="scope">
<dict-tag :options="com_charge_item_precision" :value="scope.row.precision"></dict-tag>
</template>
@@ -61,17 +67,15 @@
<dict-tag :options="com_charge_item_carry_method" :value="scope.row.carryMethod"></dict-tag>
</template>
</el-table-column>
<el-table-column label="滞纳金比例" align="center" prop="lateFee" />
<el-table-column label="小区" align="center" prop="villageId" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<el-switch inactive-text="停用" active-text="启用" inactive-value="0" active-value="1" v-model="scope.row.status"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['chargeItem:chargeItem:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['chargeItem:chargeItem:remove']"></el-button>
</el-tooltip>
<el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['chargeItem:chargeItem:edit']">修改</el-button>
<el-button link type="primary" @click="handleDelete(scope.row)" v-hasPermi="['chargeItem:chargeItem:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>

View File

@@ -0,0 +1,161 @@
<template>
<div class="AddBuildingBox">
<PageHeader></PageHeader>
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<div class="addBuildingFormBody">
<el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
<el-form-item label="账单名称" prop="name">
<el-input v-model.trim="form.name" placeholder="请输入账单名称" />
</el-form-item>
<el-form-item label="收费项目" prop="materialName">
<el-select v-model="form.formula">
<el-option v-for="(item, index) in com_charge_item_formula" :key="index" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
<el-form-item label="收费范围" prop="billingMethod">
<el-radio-group v-model="form.billingMethod">
<el-radio value="0">固定单价</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="费用周期" prop="unit">
<el-select v-model="form.unit">
<el-option v-for="(item, index) in com_charge_item_unit" :key="index" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
<el-form-item label="起止日期" prop="price">
<el-input v-model.trim="form.price" placeholder="请输入费用单价" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="5" v-model.trim="form.remark" placeholder="请输入" />
</el-form-item>
<el-form-item style="margin-top: 30px">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="cancelForm">返回</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { getChargeItem, updateChargeItem, addChargeItem } from '@/api/system/SdbChargeItem';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_charge_item_unit } = toRefs<any>(proxy?.useDict('com_charge_item_unit'));
const { com_charge_item_precision } = toRefs<any>(proxy?.useDict('com_charge_item_precision'));
const { com_charge_item_carry_method } = toRefs<any>(proxy?.useDict('com_charge_item_carry_method'));
const { com_charge_item_formula } = toRefs<any>(proxy?.useDict('com_charge_item_formula'));
const router = useRouter();
const route = useRoute();
const formRef = ref();
const form = ref({
'id': null,
'name': '',
'billingMethod': '0',
'price': null,
'unit': '',
'precision': '',
'carryMethod': '',
'remark': '',
'formula': ''
});
const rules = ref({
name: [{ required: true, message: '请输入 项目名称', trigger: 'blur' }],
billingMethod: [{ required: true, message: '请输入 计费方式', trigger: 'blur' }],
price: [{ required: true, message: '请输入 费用单价', trigger: 'blur' }],
formula: [{ required: true, message: '请选择 计费公式', trigger: 'blur' }],
unit: [{ required: true, message: '请选择 计费单位', trigger: 'blur' }],
precision: [{ required: true, message: '选择 计算精度', trigger: 'blur' }],
carryMethod: [{ required: true, message: '请选择 进位方式', trigger: 'blur' }]
});
const userid = ref(null);
if (route.query.id) {
userid.value = route.query.id;
getChargeItem(userid.value).then((res) => {
form.value = {
...form.value,
...res.data
};
});
}
// !== 提交 =============================================================================
// 提交
// TODO 收费项目提交
const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => {
if (valid) {
if (userid.value) {
updateChargeItem(form.value).then((res) => {
ElMessage.success('编辑成功');
cancelForm();
});
} else {
addChargeItem(form.value).then((res) => {
ElMessage.success('添加成功');
cancelForm();
});
}
}
});
};
// 推出
const cancelForm = () => {
router.back();
};
</script>
<style scoped lang="scss">
.AddBuildingBox {
padding: 15px;
height: 100%;
width: 100%;
}
.AddBuildingBody {
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
background-color: white;
padding: 15px;
.title {
height: 40px;
line-height: 40px;
padding-left: 20px;
background-color: rgba(255, 255, 255, 1);
color: rgba(16, 16, 16, 1);
border-bottom: 1px solid #bbbbbb;
margin-bottom: 60px;
}
.formBody {
width: 650px;
margin: 0 auto;
&:deep(.el-form-item__content, .el-select, .el-input) {
width: 350px !important;
margin-right: 10px;
.el-cascader {
width: 100%;
}
}
.el-form-item {
margin-bottom: 20px;
align-items: center;
}
.el-button {
width: 80px;
height: 35px;
margin-right: 20px;
}
}
}
</style>

View File

@@ -0,0 +1,159 @@
<template>
<div class="AddBuildingBox">
<PageHeader></PageHeader>
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<div class="addBuildingFormBody">
<el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
<el-form-item label="账单名称" prop="name">
<el-input disabled v-model.trim="form.name" placeholder="请输入账单名称" />
</el-form-item>
<el-form-item label="收费项目" prop="materialName">
<el-select disabled v-model="form.formula">
<el-option v-for="(item, index) in com_charge_item_formula" :key="index" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
<el-form-item label="收费范围" prop="billingMethod">
<el-radio-group disabled v-model="form.billingMethod">
<el-radio value="0">固定单价</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="费用周期" prop="unit">
<el-select disabled v-model="form.unit">
<el-option v-for="(item, index) in com_charge_item_unit" :key="index" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
<el-form-item label="起止日期" prop="price">
<el-input disabled v-model.trim="form.price" placeholder="请输入费用单价" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input disabled type="textarea" :rows="5" v-model.trim="form.remark" placeholder="请输入" />
</el-form-item>
<el-form-item style="margin-top: 30px">
<el-button @click="cancelForm">返回</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { getChargeItem, updateChargeItem, addChargeItem } from '@/api/system/SdbChargeItem';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_charge_item_unit } = toRefs<any>(proxy?.useDict('com_charge_item_unit'));
const { com_charge_item_precision } = toRefs<any>(proxy?.useDict('com_charge_item_precision'));
const { com_charge_item_carry_method } = toRefs<any>(proxy?.useDict('com_charge_item_carry_method'));
const { com_charge_item_formula } = toRefs<any>(proxy?.useDict('com_charge_item_formula'));
const router = useRouter();
const route = useRoute();
const formRef = ref();
const form = ref({
'id': null,
'name': '',
'billingMethod': '0',
'price': null,
'unit': '',
'precision': '',
'carryMethod': '',
'remark': '',
'formula': ''
});
const rules = ref({
name: [{ required: true, message: '请输入 项目名称', trigger: 'blur' }],
billingMethod: [{ required: true, message: '请输入 计费方式', trigger: 'blur' }],
price: [{ required: true, message: '请输入 费用单价', trigger: 'blur' }],
formula: [{ required: true, message: '请选择 计费公式', trigger: 'blur' }],
unit: [{ required: true, message: '请选择 计费单位', trigger: 'blur' }],
precision: [{ required: true, message: '选择 计算精度', trigger: 'blur' }],
carryMethod: [{ required: true, message: '请选择 进位方式', trigger: 'blur' }]
});
const userid = ref(null);
if (route.query.id) {
userid.value = route.query.id;
getChargeItem(userid.value).then((res) => {
form.value = {
...form.value,
...res.data
};
});
}
// !== 提交 =============================================================================
// 提交
// TODO 收费项目提交
const submitForm = () => {
formRef.value?.validate(async (valid: boolean) => {
if (valid) {
if (userid.value) {
updateChargeItem(form.value).then((res) => {
ElMessage.success('编辑成功');
cancelForm();
});
} else {
addChargeItem(form.value).then((res) => {
ElMessage.success('添加成功');
cancelForm();
});
}
}
});
};
// 推出
const cancelForm = () => {
router.back();
};
</script>
<style scoped lang="scss">
.AddBuildingBox {
padding: 15px;
height: 100%;
width: 100%;
}
.AddBuildingBody {
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
background-color: white;
padding: 15px;
.title {
height: 40px;
line-height: 40px;
padding-left: 20px;
background-color: rgba(255, 255, 255, 1);
color: rgba(16, 16, 16, 1);
border-bottom: 1px solid #bbbbbb;
margin-bottom: 60px;
}
.formBody {
width: 650px;
margin: 0 auto;
&:deep(.el-form-item__content, .el-select, .el-input) {
width: 350px !important;
margin-right: 10px;
.el-cascader {
width: 100%;
}
}
.el-form-item {
margin-bottom: 20px;
align-items: center;
}
.el-button {
width: 80px;
height: 35px;
margin-right: 20px;
}
}
}
</style>

View File

@@ -1,247 +1,84 @@
<template>
<div class="flex flex-col h-full p-2">
<pageheader></pageheader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="充值金额" prop="rechargeAmount">
<el-input v-model="queryParams.rechargeAmount" placeholder="请输入充值金额" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="充值时间" prop="rechargeTime">
<el-date-picker clearable v-model="queryParams.rechargeTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择充值时间" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</transition>
<el-card class="flex-1" shadow="never">
<el-card class="flex-1 mt-10px" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<el-row :gutter="10" style="font-size: 0.8rem">
<el-col :span="3"> 设备号 {{ routeid }} </el-col>
<el-col :span="3"> 房间号 {{ housename }} </el-col>
<el-col :span="17"></el-col>
<el-col :span="1">
<el-button @click="confinem">返回</el-button>
</el-col>
</el-row>
</template>
<el-table v-loading="loading" border :data="topupRecordList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table v-loading="loading" border :data="topupRecordList">
<el-table-column label="订单号" align="center" prop="orderId" />
<el-table-column label="充值金额" align="center" prop="rechargeAmount" />
<el-table-column label="用户ID" align="center" prop="rechargeAmount" />
<el-table-column label="充值时间" align="center" prop="rechargeTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.rechargeTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="订单表" align="center" prop="orderId" />
<el-table-column label="充值金额" align="center" prop="rechargeAmount" />
<el-table-column label="类型" align="center" prop="type">
<template #default="scope">
<DictTag :options="com_waterelectricity_topup_type" :value="scope.row.type"></DictTag>
</template>
</el-table-column>
<el-table-column label="订单状态" align="center" prop="status">
<template #default="scope">
<DictTag :options="com_waterelectricity_topup_status" :value="scope.row.status"></DictTag>
</template>
</el-table-column>
<el-table-column label="缴费状态" align="center" prop="getOver">
<template #default="scope">
<DictTag :options="com_waterelectricity_topup_getOver" :value="scope.row.getOver"></DictTag>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改充值记录对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="topupRecordFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户ID" prop="userId">
<el-input v-model="form.userId" placeholder="请输入用户ID" />
</el-form-item>
<el-form-item label="充值金额" prop="rechargeAmount">
<el-input v-model="form.rechargeAmount" placeholder="请输入充值金额" />
</el-form-item>
<el-form-item label="充值时间" prop="rechargeTime">
<el-date-picker clearable v-model="form.rechargeTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择充值时间">
</el-date-picker>
</el-form-item>
<el-form-item label="设备ID" prop="deviceCode">
<el-input v-model="form.deviceCode" placeholder="请输入设备ID" />
</el-form-item>
<el-form-item label="订单表" prop="orderId">
<el-input v-model="form.orderId" placeholder="请输入订单表" />
</el-form-item>
<el-form-item label="0.待接收 1.已接收" prop="getOver">
<el-input v-model="form.getOver" placeholder="请输入0.待接收 1.已接收" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="TopupRecord" lang="ts">
import { listTopupRecord, getTopupRecord, delTopupRecord, addTopupRecord, updateTopupRecord } from '@/api/system/SdbTopupRecord';
import { listTopupRecord } from '@/api/system/SdbTopupRecord';
import { TopupRecordVO, TopupRecordQuery, TopupRecordForm } from '@/api/system/SdbTopupRecord/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_waterelectricity_topup_type } = toRefs<any>(proxy?.useDict('com_waterelectricity_topup_type'));
const { com_waterelectricity_topup_status } = toRefs<any>(proxy?.useDict('com_waterelectricity_topup_status'));
const { com_waterelectricity_topup_getOver } = toRefs<any>(proxy?.useDict('com_waterelectricity_topup_getOver'));
const router = useRouter();
const route = useRoute();
const routeid = ref(null);
const topupRecordList = ref<TopupRecordVO[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref<Array<string | number>>([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const topupRecordFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: TopupRecordForm = {
id: undefined,
userId: undefined,
rechargeAmount: undefined,
rechargeTime: undefined,
deviceCode: undefined,
orderId: undefined,
type: undefined,
status: undefined,
getOver: undefined
type: undefined
};
const data = reactive<PageData<TopupRecordForm, TopupRecordQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
userId: undefined,
rechargeAmount: undefined,
rechargeTime: undefined,
deviceCode: undefined,
orderId: undefined,
type: undefined,
status: undefined,
getOver: undefined,
params: {}
},
rules: {}
deviceCode: undefined
}
});
const { queryParams, form, rules } = toRefs(data);
const { queryParams } = toRefs(data);
const housename = ref('');
/** 查询充值记录列表 */
const getList = async () => {
loading.value = true;
const res = await listTopupRecord(queryParams.value);
topupRecordList.value = res.rows;
total.value = res.total;
housename.value = res.rows.pop().housname ?? '';
loading.value = false;
};
/** 取消按钮 */
const cancel = () => {
reset();
dialog.visible = false;
};
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
topupRecordFormRef.value?.resetFields();
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value?.resetFields();
handleQuery();
};
/** 多选框选中数据 */
const handleSelectionChange = (selection: TopupRecordVO[]) => {
ids.value = selection.map((item) => item.id);
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加充值记录';
};
/** 修改按钮操作 */
const handleUpdate = async (row?: TopupRecordVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getTopupRecord(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改充值记录';
};
/** 提交按钮 */
const submitForm = () => {
topupRecordFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateTopupRecord(form.value).finally(() => (buttonLoading.value = false));
} else {
await addTopupRecord(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: TopupRecordVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除充值记录编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delTopupRecord(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'topupRecord/topupRecord/export',
{
...queryParams.value
},
`topupRecord_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
if (route.query.id) {
routeid.value = route.query.id;
queryParams.value.type = route.query.type as string;
}
getList();
});
const confinem = () => {
router.back();
};
</script>
<style lang="scss" scoped>

View File

@@ -1,12 +0,0 @@
<template>
<div class="p-2 h-full flex flex-col">
<Pageheader title="充值记录"></Pageheader>
<div class="flex-1 color-gray flex h-full font-size-6 flex-center">系统还在维护中敬请期待...</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
</script>
<style scoped lang="scss"></style>

View File

@@ -5,7 +5,17 @@
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" label-width="100px" :model="queryParams" :inline="true">
<el-form-item label="水表设备编码" prop="deviceCode">
<el-form-item label="设备状态" prop="deviceCode">
<el-select v-model="queryParams.deleted">
<el-option v-for="(item, index) in com_waterdevice_on_status" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="分合状态" prop="waterRecord">
<el-select v-model="queryParams.waterRecord">
<el-option v-for="(item, index) in com_water_readrecord_status" :key="index" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="房间号" prop="deviceCode">
<el-input v-model="queryParams.deviceCode" placeholder="请输入水表设备编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
@@ -27,17 +37,12 @@
<el-table v-loading="loading" border :data="waterDeviceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="水表设备编码" align="center" prop="deviceCode" />
<el-table-column label="户号" align="center" prop="address">
<template #default="{ $index }">
{{ huhao + $index }}
</template>
</el-table-column>
<el-table-column label="设备状态" align="center" prop="deleted">
<el-table-column label="设备状态" width="100" align="center" prop="deleted">
<template #default="scope">
<dict-tag :options="com_waterdevice_on_status" :value="scope.row.deleted"></dict-tag>
</template>
</el-table-column>
<el-table-column label="分合状态" align="center">
<el-table-column label="分合状态" width="100" align="center">
<template #default="scope">
<div class="readRecord" v-if="scope.row.waterRecord">
<el-tag type="success" v-if="scope.row.waterRecord.status == 1">供水</el-tag>
@@ -46,13 +51,15 @@
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column label="图片" align="center" prop="deleted">
<el-table-column label="房间号" align="center" prop="deviceCode" />
<el-table-column label="余额" width="100" align="center" prop="deviceCode" />
<el-table-column label="条形码" width="140" align="center" prop="deleted">
<template #default="scope">
<el-image
v-if="scope.row.url && scope.row.url.includes('http')"
:src="scope.row.url"
:preview-src-list="[scope.row.url]"
style="width: 40px; height: 40px; border-radius: 4px; margin-right: 5px"
style="width: 90px; height: 30px; border-radius: 4px; margin-right: 5px"
fit="cover"
preview-teleported
/>
@@ -64,11 +71,25 @@
<span>{{ scope.row.waterRecord ? scope.row.waterRecord.readTime : '--' }}</span>
</template>
</el-table-column>
<el-table-column width="150" label="启停" align="center" prop="deleted">
<template #default="scope">
<el-switch
@change="(val: string) => handleChangeWater(val, scope.row)"
v-model="scope.row.deleted"
active-text="启用"
inactive-text="停止"
active-value="0"
inactive-value="1"
></el-switch>
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" @click="handleProject(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>
<el-button link type="primary" @click="handleOpenDialog('usedWater', scope.row)">用水量</el-button>
<el-button link type="primary" @click="handleOpenDialog('Upload', scope.row)">更新固件</el-button>
<el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['system:waterDevice:edit']">修改</el-button>
<el-button link type="primary" @click="handleDelete(scope.row)" v-hasPermi="['system:waterDevice:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -77,7 +98,7 @@
</el-card>
<!-- 添加或修改水 设备对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="waterDeviceFormRef" :model="form" :rules="rules" label-width="100px">
<el-form ref="waterDeviceFormRef" :model="form" label-width="100px">
<el-form-item label="水表设备编码" prop="deviceCode">
<el-input v-model="form.deviceCode" placeholder="请输入水表设备编码" />
</el-form-item>
@@ -103,6 +124,7 @@ const huhao = 3096371295;
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_waterdevice_on_status } = toRefs<any>(proxy?.useDict('com_waterdevice_on_status'));
const { com_water_readrecord_status } = toRefs<any>(proxy?.useDict('com_water_readrecord_status'));
const waterDeviceList = ref<WaterDeviceVO[]>([]);
const buttonLoading = ref(false);
@@ -116,27 +138,12 @@ const total = ref(0);
const queryFormRef = ref<ElFormInstance>();
const waterDeviceFormRef = ref<ElFormInstance>();
const splitImages = (url) => {
if (!url) return '';
const imgUrl = import.meta.env.VITE_IMG_URL + url;
return imgUrl;
};
const dialog = reactive<DialogOption>({
visible: false,
title: ''
});
const initFormData: WaterDeviceForm = {
id: undefined,
deviceCode: undefined,
address: undefined,
deleted: undefined,
url: undefined,
openid: undefined
};
const data = reactive<PageData<WaterDeviceForm, WaterDeviceQuery>>({
form: { ...initFormData },
const data = reactive({
queryParams: {
pageNum: 1,
pageSize: 10,
@@ -144,15 +151,11 @@ const data = reactive<PageData<WaterDeviceForm, WaterDeviceQuery>>({
address: undefined,
deleted: undefined,
url: undefined,
openid: undefined,
params: {}
},
rules: {
id: [{ required: true, message: 'id不能为空', trigger: 'blur' }]
openid: undefined
}
});
const { queryParams, form, rules } = toRefs(data);
const { queryParams } = toRefs(data);
/** 查询水 设备列表 */
const getList = async () => {
@@ -169,10 +172,36 @@ const cancel = () => {
dialog.visible = false;
};
const UsedWaterformRef = ref(null);
const UsedWaterform = ref({
water: 0,
startDate: '',
endDate: ''
});
const UploadFileformRef = ref(null);
const EditHouseformRef = ref(null);
const EditHouseform = ref({
houseid: ''
});
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
waterDeviceFormRef.value?.resetFields();
UsedWaterform.value = {
water: 0,
startDate: '',
endDate: ''
};
EditHouseform.value = {
houseid: ''
};
// 上传 清空
UploadFileformRef.value?.resetFields();
// 使用水量 清空
EditHouseformRef.value?.resetFields();
// 使用水量 清空
UsedWaterformRef.value?.resetFields();
};
/** 搜索按钮操作 */
@@ -194,21 +223,42 @@ const handleSelectionChange = (selection: WaterDeviceVO[]) => {
multiple.value = !selection.length;
};
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加水 设备';
const router = useRouter();
/** 充值记录 */
const handleRecode = (row: WaterDeviceVO) => {
// 1.电表 2.水表
router.push({
path: '/Sdb/TopupRecord',
query: {
type: '2',
id: row.id
}
});
};
/** 生成二维码 */
const handleQrCode = (row: WaterDeviceVO) => {
// 1.电表 2.水表
console.log('qrcode');
};
/** 修改按钮操作 */
/** 用水量 更新固件 */
const handleOpenDialog = (type: 'usedWater' | 'Upload', row: WaterDeviceVO) => {
reset();
dialog.visible = true;
dialog.title = type === 'usedWater' ? '用水量' : '更新固件';
};
/** 水表 启停*/
const handleChangeWater = (val: string, row: WaterDeviceVO) => {
console.log(val, row, typeof val);
};
/** 编辑房屋 按钮操作 */
const handleUpdate = async (row?: WaterDeviceVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getWaterDevice(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改水 设备';
dialog.title = '编辑房屋';
};
/** 提交按钮 */
@@ -228,28 +278,6 @@ const submitForm = () => {
});
};
/** 删除按钮操作 */
const handleDelete = async (row?: WaterDeviceVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除水 设备编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await delWaterDevice(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
const handleProject = (row) => {
row.url = 'https://www.bugtc.com/static/dsb/20260107/272d59d5-bff1-49b3-b899-046169c07257.png';
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'system/waterDevice/export',
{
...queryParams.value
},
`waterDevice_${new Date().getTime()}.xlsx`
);
};
onMounted(() => {
getList();
});

View File

@@ -0,0 +1,245 @@
<template>
<div class="AddBuildingBox">
<PageHeader></PageHeader>
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<div class="addBuildingFormBody">
<el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
<el-form-item label="设备分类" prop="categoryId">
<el-select v-model="form.categoryId">
<el-option v-for="(item, index) in deviceCategorylist" :key="index" :value="item.id" :label="item.categoryName"></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备名称" prop="deviceName">
<el-input v-model.trim="form.deviceName" placeholder="请输入设备名称" />
</el-form-item>
<el-form-item label="设备唯一编号" prop="deviceCode">
<el-input v-model.trim="form.deviceCode" placeholder="请输入设备唯一编号" />
</el-form-item>
<el-form-item label="设备型号" prop="deviceModel">
<el-input v-model.trim="form.deviceModel" placeholder="请输入设备型号" />
</el-form-item>
<el-form-item label="位置区域" prop="area">
<el-input type="textarea" :rows="2" v-model.trim="form.area" placeholder="请输入位置区域" />
</el-form-item>
<el-form-item label="维护人员" prop="maintainUserIds">
<repairUser
userType="EquipmentMaintenance"
:userid="checkoutuseid"
ref="repairUserRef"
returnvalue="*"
:is-multiple="true"
title-name="维护人员"
@change="handleCheckoutUser"
>
<template #default>
<div class="checkoutuserbox flex flex-items-center justify-around" v-for="(item, index) in checkoutuser" :key="index">
<span>{{ item.nickName }}</span>
<div @click="handleDelete(item.id)">
<el-icon>
<Delete></Delete>
</el-icon>
</div>
</div>
<div class="checkoutuserbox add flex flex-items-center justify-center" @click="() => repairUserRef.open()">
<el-icon>
<Plus></Plus>
</el-icon>
<span>添加</span>
</div>
</template>
</repairUser>
</el-form-item>
<el-form-item label="设备状态" prop="status">
<el-radio-group v-model.trim="form.status">
<el-radio v-for="(item, index) in com_equipment_archive_status" :value="item.value" :label="item.label" :key="index"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model.trim="form.remark" placeholder="请输入" />
</el-form-item>
<el-form-item style="margin-top: 30px">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="cancelForm">返回</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import repairUser from '@/components/Holder/repairUser.vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { getMaterial, updateMaterial, addMaterial } from '@/api/system/Tmaterial';
import { listDeviceCategory } from '@/api/system/equipment/Category';
import { addDevice, getDevice, updateDevice } from '@/api/system/equipment/archive';
import { Delete } from '@element-plus/icons-vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_equipment_archive_status } = toRefs<any>(proxy?.useDict('com_equipment_archive_status'));
const router = useRouter();
const route = useRoute();
const formRef = ref();
const repairUserRef = ref();
const form = ref({
id: null,
categoryId: '', // 分类id、
deviceName: '', // 设备名称
deviceCode: '', // 编号
deviceModel: '', // 型号
area: '', // 区域
status: '0', // 区域
maintainUserIds: '', // 设备维护人员
remark: '' // 备注
});
const rules = ref({
categoryId: [{ required: true, message: '请选择 设备类型', trigger: 'blur' }],
deviceCode: [{ required: true, message: '请选择 设备唯一编号', trigger: 'blur' }],
deviceName: [{ required: true, message: '请输入 设备名称', trigger: 'blur' }]
});
const userid = ref(null);
const deviceCategorylist = ref([]);
function init() {
listDeviceCategory().then((res) => {
deviceCategorylist.value = res.rows;
});
if (route.query.id) {
userid.value = route.query.id;
getDevice(userid.value).then((res) => {
form.value = {
id: res.data.id,
categoryId: res.data.categoryId,
deviceName: res.data.deviceName,
deviceCode: res.data.deviceCode,
deviceModel: res.data.deviceModel,
area: res.data.area,
status: res.data.status,
maintainUserIds: res.data.maintainUserIds,
remark: res.data.remark
};
checkoutuser.value = [];
checkoutuser.value = res.data.maintainUserList;
});
}
}
init();
const checkoutuseid = computed(() => {
return checkoutuser.value
.map((item) => item.userId)
.filter((item) => item)
.join(',');
});
const checkoutuser = ref([]);
function handleCheckoutUser(row) {
console.log(row);
checkoutuser.value = row;
}
function handleDelete(id: string) {
checkoutuser.value = checkoutuser.value.filter((item) => item.id !== id);
}
// !== 提交 =============================================================================
// 提交
const submitForm = () => {
form.value.maintainUserIds = checkoutuser.value
.map((itme) => itme.userId)
.filter((item) => item)
.join(',');
formRef.value?.validate(async (valid: boolean) => {
if (valid) {
if (userid.value) {
updateDevice(form.value).then(() => {
ElMessage.success('编辑成功');
cancelForm();
});
} else {
addDevice(form.value).then(() => {
ElMessage.success('添加成功');
cancelForm();
});
}
}
});
};
// 推出
const cancelForm = () => {
router.back();
};
</script>
<style scoped lang="scss">
.AddBuildingBox {
padding: 15px;
height: 100%;
width: 100%;
}
.AddBuildingBody {
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
background-color: white;
padding: 15px;
.title {
height: 40px;
line-height: 40px;
padding-left: 20px;
background-color: rgba(255, 255, 255, 1);
color: rgba(16, 16, 16, 1);
border-bottom: 1px solid #bbbbbb;
margin-bottom: 60px;
}
.formBody {
width: 650px;
margin: 0 auto;
.checkoutuserbox {
width: 120px;
margin: 5px;
border: 1px solid #ccc;
padding: 5px 10px;
border-radius: 5px;
&.add {
cursor: pointer;
border-style: dashed;
&:hover {
color: #409eff;
border-color: #409eff;
}
}
& > div {
cursor: pointer;
&:hover {
color: red;
}
}
}
&:deep(.el-form-item__content, .el-select, .el-input) {
width: 350px !important;
margin-right: 10px;
.el-cascader {
width: 100%;
}
}
.el-form-item {
margin-bottom: 20px;
align-items: center;
}
.el-button {
width: 80px;
height: 35px;
margin-right: 20px;
}
}
}
</style>

View File

@@ -1,12 +1,11 @@
<template>
<div class="p-2">
<div class="flex flex-col h-full p-2">
<pageheader></pageheader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="设备分类ID" prop="categoryId">
<el-input v-model="queryParams.categoryId" placeholder="请输入设备分类ID" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="设备名称" prop="deviceName">
<el-input v-model="queryParams.deviceName" placeholder="请输入设备名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
@@ -22,7 +21,7 @@
</div>
</transition>
<el-card shadow="never">
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
@@ -41,25 +40,25 @@
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="deviceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="设备分类" align="center" prop="categoryId" />
<el-table-column label="设备分类" align="center" prop="categoryName" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="设备编号" align="center" prop="deviceCode" />
<el-table-column label="设备型号" align="center" prop="deviceModel" />
<el-table-column label="位置区域" align="center" prop="area" />
<el-table-column label="维护人员" align="center" prop="maintainUserIds" />
<el-table-column label="设备状态 0正常 1异常" align="center" prop="status" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="位置区域" align="center" prop="area" show-overflow-tooltip />
<el-table-column label="维护人员" align="center" prop="maintainUserListName" show-overflow-tooltip />
<el-table-column label="设备状态" width="80" align="center" prop="status">
<template #default="scope">
<dict-tag :options="com_equipment_archive_status" :value="scope.row.status"></dict-tag>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:device:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:device:remove']"></el-button>
</el-tooltip>
<el-button link type="primary" @click="handleMain(scope.row)">查看详情</el-button>
<el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['system:device:edit']">修改</el-button>
<el-button link type="primary" @click="handleDelete(scope.row)" v-hasPermi="['system:device:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -74,8 +73,12 @@ import { listDevice, getDevice, delDevice, addDevice, updateDevice } from '@/api
import { DeviceVO, DeviceQuery, DeviceForm } from '@/api/system/equipment/archive/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_equipment_archive_status } = toRefs<any>(proxy?.useDict('com_equipment_archive_status'));
const deviceList = ref<DeviceVO[]>([]);
interface tableType extends DeviceVO {
maintainUserListName?: string;
}
const deviceList = ref<tableType[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
@@ -131,6 +134,14 @@ const getList = async () => {
loading.value = true;
const res = await listDevice(queryParams.value);
deviceList.value = res.rows;
deviceList.value.forEach((item) => {
if (item.maintainUserList && item.maintainUserList.length > 0) {
item.maintainUserListName = item.maintainUserList
.map((it) => (it.nickName ? it.nickName : null))
.filter((it) => it !== null)
.join(',');
}
});
total.value = res.total;
loading.value = false;
};
@@ -165,22 +176,31 @@ const handleSelectionChange = (selection: DeviceVO[]) => {
single.value = selection.length != 1;
multiple.value = !selection.length;
};
const router = useRouter();
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加设备';
router.push({
path: '/equipment/addArchive'
});
};
/** 修改按钮操作 */
const handleUpdate = async (row?: DeviceVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getDevice(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改设备';
router.push({
path: '/equipment/addArchive',
query: {
id: row.id
}
});
};
/** 详情按钮操作 */
const handleMain = async (row?: DeviceVO) => {
router.push({
path: '/equipment/archiveMain',
query: {
id: row.id
}
});
};
/** 提交按钮 */
@@ -224,3 +244,8 @@ onMounted(() => {
getList();
});
</script>
<style lang="scss" scoped>
.el-table {
height: calc(100% - 80px);
}
</style>

View File

@@ -0,0 +1,235 @@
<template>
<div class="AddBuildingBox">
<PageHeader></PageHeader>
<div class="AddBuildingBody">
<div class="title flex flex-items-center justify-between">
<div>
<span>基本信息</span>
<el-button class="ml-10px" link type="primary"> 编辑</el-button>
</div>
<el-button @click="cancelForm"> 返回</el-button>
</div>
<div class="addBuildingFormBody">
<div class="infobox">
<div class="info_item">
<div class="label">设备分类</div>
<span class="value">{{ form.categoryName }}</span>
</div>
<div class="info_item">
<div class="label">设备名称</div>
<span class="value">{{ form.deviceName }}</span>
</div>
<div class="info_item">
<div class="label">设备编号</div>
<span class="value">{{ form.deviceCode }}</span>
</div>
<div class="info_item">
<div class="label">品牌型号</div>
<span class="value">{{ form.deviceModel }}</span>
</div>
<div class="info_item">
<div class="label">所在区域</div>
<span class="value">{{ form.area }}</span>
</div>
<div class="info_item">
<div class="label">设备状态</div>
<span class="value">电梯</span>
</div>
<div class="info_item">
<div class="label">维护人员</div>
<span class="value">{{ form.maintainUserListName }}</span>
</div>
<div class="info_item">
<div class="label">添加时间</div>
<span class="value">{{ form.createTime }}</span>
</div>
<div></div>
<div class="info_item">
<div class="label">备注</div>
<span class="value">{{ form.remark }}</span>
</div>
</div>
</div>
</div>
<div class="AddBuildingBody">
<div class="title">维修记录</div>
<div class="addBuildingFormBody">
<el-table v-loading="loading" :data="deviceRepairList">
<el-table-column type="index" align="center" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="设备编号" align="center" prop="deviceCode" />
<el-table-column label="维修人员" align="center" prop="maintainUserNames" />
<el-table-column label="故障描述" align="center" prop="faultDesc" />
<el-table-column label="维修结果" align="center" prop="repairResult">
<template #default="scope">
<dict-tag :options="com_equipment_repair_status" :value="scope.row.repairResult"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" @click="handleMain(scope.row)">详情</el-button>
<el-button link type="primary" @click="handleEdit(scope.row)">修改</el-button>
<el-button link type="primary" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { getDevice } from '@/api/system/equipment/archive';
import { DeviceRepairVO } from '@/api/system/equipment/Repair/type';
import { delDeviceRepair, listDeviceRepair } from '@/api/system/equipment/Repair';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_equipment_repair_status } = toRefs<any>(proxy?.useDict('com_equipment_repair_status'));
const router = useRouter();
const route = useRoute();
const form = ref({
id: null,
categoryId: '', // 分类id、
deviceName: '', // 设备名称
deviceCode: '', // 编号
deviceModel: '', // 型号
area: '', // 区域
status: '0', // 区域
maintainUserIds: '', // 设备维护人员
maintainUserListName: '', // 设备维护人员
createTime: '', // 设备维护人员
remark: '' // 备注
});
const userid = ref(null);
const total = ref(0);
const loading = ref(false);
const deviceRepairList = ref([]);
const queryParams = ref({
pageNum: 1,
pageSize: 10
});
function init() {
if (route.query.id) {
userid.value = route.query.id;
getDevice(userid.value).then(async (res) => {
form.value = {
id: res.data.id,
categoryId: res.data.categoryId,
deviceName: res.data.deviceName,
deviceCode: res.data.deviceCode,
deviceModel: res.data.deviceModel,
area: res.data.area,
status: res.data.status,
maintainUserIds: res.data.maintainUserIds,
remark: res.data.remark,
createTime: res.data.createTime,
maintainUserListName: ''
};
if (res.data.maintainUserList && res.data.maintainUserList.length > 0) {
form.value.maintainUserListName = res.data.maintainUserList
.map((it) => (it.nickName ? it.nickName : null))
.filter((it) => it !== null)
.join(',');
}
getlist();
});
}
}
init();
async function getlist() {
loading.value = true;
const rows = await listDeviceRepair();
deviceRepairList.value = rows.rows;
deviceRepairList.value.forEach((item) => {
item.maintainUserNames = item.maintainUserList
.map((i) => i.nickName)
.filter((i) => i)
.join(',');
});
total.value = rows.total;
loading.value = false;
}
/** 删除按钮操作 */
const handleDelete = async (row?: DeviceRepairVO) => {
const _ids = row?.id;
await proxy?.$modal.confirm('是否确认删除维修工单?');
await delDeviceRepair(_ids);
proxy?.$modal.msgSuccess('删除成功');
getlist();
};
const handleMain = (row) => {
router.push({
path: '/equipment/equipmentRepairMain',
query: {
id: row.id
}
});
};
const handleEdit = (row) => {
router.push({
path: '/equipment/addEquipmentRepair',
query: {
id: row.id
}
});
};
// 推出
const cancelForm = () => {
router.back();
};
</script>
<style scoped lang="scss">
.AddBuildingBox {
padding: 15px;
height: 100%;
width: 100%;
}
.AddBuildingBody {
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
background-color: white;
padding: 15px;
.title {
height: 40px;
line-height: 40px;
padding-left: 20px;
background-color: rgba(255, 255, 255, 1);
color: rgba(16, 16, 16, 1);
border-bottom: 1px solid #bbbbbb;
margin-bottom: 30px;
}
.addBuildingFormBody {
padding-left: 20px;
.infobox {
display: grid;
gap: 20px;
grid-template-columns: repeat(3, 1fr);
.info_item {
display: flex;
align-items: center;
.label {
width: 100px;
text-align: right;
}
.value {
font-weight: 450;
}
}
}
}
}
</style>

View File

@@ -1,5 +1,5 @@
<template>
<div class="p-2">
<div class="p-2 flex flex-col h-full">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
@@ -16,7 +16,7 @@
</div>
</transition>
<el-card shadow="never">
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
@@ -32,18 +32,19 @@
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:deviceCategory:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="deviceCategoryList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键ID" align="center" prop="id" v-if="true" />
<el-table-column label="设备分类名称" align="center" prop="categoryName" />
<el-table-column label="状态 0正常 1停用" align="center" prop="status" />
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<el-switch inactive-text="停用" :inactive-value="1" :active-value="0" active-text="启用" v-model="scope.row.status"></el-switch>
</template>
</el-table-column>
<el-table-column label="添加时间" align="center" prop="createTime" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
@@ -61,10 +62,15 @@
</el-card>
<!-- 添加或修改设备分类对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="deviceCategoryFormRef" :model="form" :rules="rules" label-width="80px">
<el-form ref="deviceCategoryFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="设备分类名称" prop="categoryName">
<el-input v-model="form.categoryName" placeholder="请输入设备分类名称" />
</el-form-item>
<el-form-item label="设备分类状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="(item, index) in com_equipment_device_category" :key="index" :value="Number(item.value)" :label="item.label"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
@@ -84,6 +90,7 @@ import { listDeviceCategory, getDeviceCategory, delDeviceCategory, addDeviceCate
import { DeviceCategoryVO, DeviceCategoryQuery, DeviceCategoryForm } from '@/api/system/equipment/Category/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_equipment_device_category } = toRefs<any>(proxy?.useDict('com_equipment_device_category'));
const deviceCategoryList = ref<DeviceCategoryVO[]>([]);
const buttonLoading = ref(false);
@@ -104,21 +111,18 @@ const dialog = reactive<DialogOption>({
const initFormData: DeviceCategoryForm = {
id: undefined,
categoryName: undefined,
status: undefined,
remark: undefined
categoryName: '',
status: 0,
remark: ''
};
const data = reactive<PageData<DeviceCategoryForm, DeviceCategoryQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
categoryName: undefined,
status: undefined,
params: {}
categoryName: undefined
},
rules: {
id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
categoryName: [{ required: true, message: '设备分类名称不能为空', trigger: 'blur' }]
}
});
@@ -175,9 +179,12 @@ const handleAdd = () => {
/** 修改按钮操作 */
const handleUpdate = async (row?: DeviceCategoryVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getDeviceCategory(_id);
Object.assign(form.value, res.data);
Object.assign(form.value, {
id: row.id,
categoryName: row.categoryName,
status: row.status,
remark: row.remark
});
dialog.visible = true;
dialog.title = '修改设备分类';
};
@@ -202,7 +209,7 @@ const submitForm = () => {
/** 删除按钮操作 */
const handleDelete = async (row?: DeviceCategoryVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除设备分类编号为"' + _ids + '"的数据项').finally(() => (loading.value = false));
await proxy?.$modal.confirm('是否确认删除设备分类编号?').finally(() => (loading.value = false));
await delDeviceCategory(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
@@ -223,3 +230,9 @@ onMounted(() => {
getList();
});
</script>
<style lang="scss" scoped>
.el-table {
height: calc(100% - 80px);
}
</style>

View File

@@ -0,0 +1,248 @@
<template>
<div class="AddBuildingBox">
<PageHeader></PageHeader>
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<div class="addBuildingFormBody">
<el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
<el-form-item label="维修设备" prop="deviceId">
<el-select v-model="form.deviceId">
<el-option v-for="(item, index) in deviceCategorylist" :key="index" :value="item.id" :label="item.categoryName"></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备名称" prop="deviceName">
<el-input v-model.trim="form.deviceName" placeholder="请输入设备名称" />
</el-form-item>
<el-form-item label="设备编号" prop="deviceCode">
<el-input v-model.trim="form.deviceCode" placeholder="请输入设备编号" />
</el-form-item>
<el-form-item label="设备型号" prop="deviceModel">
<el-input v-model.trim="form.deviceModel" placeholder="请输入设备型号" />
</el-form-item>
<el-form-item label="位置区域" prop="area">
<el-input type="textarea" :rows="2" v-model.trim="form.area" placeholder="请输入位置区域" />
</el-form-item>
<el-form-item label="维护人员" prop="maintainUserIds">
<repairUser
userType="EquipmentMaintenance"
:userid="checkoutuseid"
ref="repairUserRef"
returnvalue="*"
:is-multiple="true"
title-name="维护人员"
@change="handleCheckoutUser"
>
<template #default>
<div class="checkoutuserbox flex flex-items-center justify-around" v-for="(item, index) in checkoutuser" :key="index">
<span>{{ item.nickName }}</span>
<div @click="handleDelete(item.id)">
<el-icon>
<Delete></Delete>
</el-icon>
</div>
</div>
<div class="checkoutuserbox add flex flex-items-center justify-center" @click="() => repairUserRef.open()">
<el-icon>
<Plus></Plus>
</el-icon>
<span>添加</span>
</div>
</template>
</repairUser>
</el-form-item>
<el-form-item label="故障描述" prop="faultDesc">
<el-input type="textarea" :rows="5" v-model.trim="form.faultDesc" placeholder="请输入" />
</el-form-item>
<el-form-item label="维修结果" prop="repairResult">
<el-radio-group v-model.trim="form.repairResult">
<el-radio v-for="(item, index) in com_equipment_repair_status" :value="item.value" :label="item.label" :key="index"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="5" v-model.trim="form.remark" placeholder="请输入" />
</el-form-item>
<el-form-item style="margin-top: 30px">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="cancelForm">返回</el-button>
</el-form-item>
</el-form>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import repairUser from '@/components/Holder/repairUser.vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { listDeviceCategory } from '@/api/system/equipment/Category';
import { Delete } from '@element-plus/icons-vue';
import { addDeviceRepair, getDeviceRepair, updateDeviceRepair } from '@/api/system/equipment/Repair';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_equipment_repair_status } = toRefs<any>(proxy?.useDict('com_equipment_repair_status'));
const router = useRouter();
const route = useRoute();
const formRef = ref();
const repairUserRef = ref();
const form = ref({
id: null,
deviceId: '', // 分类id、
deviceName: '', // 设备名称
deviceCode: '', // 编号
deviceModel: '', // 型号
area: '', // 区域
faultDesc: '', // 区域
repairResult: '0', // 区域
maintainUserIds: '', // 设备维护人员
remark: '' // 备注
});
const rules = ref({
deviceId: [{ required: true, message: '请选择 设备类型', trigger: 'blur' }],
deviceName: [{ required: true, message: '请输入 设备名称', trigger: 'blur' }]
});
const userid = ref(null);
const deviceCategorylist = ref([]);
function init() {
listDeviceCategory().then((res) => {
deviceCategorylist.value = res.rows;
});
if (route.query.id) {
userid.value = route.query.id;
getDeviceRepair(userid.value).then((res) => {
form.value = {
id: res.data.id,
deviceName: res.data.deviceName,
deviceCode: res.data.deviceCode,
deviceModel: res.data.deviceModel,
deviceId: res.data.deviceId, // 设备分类id
maintainUserIds: res.data.maintainUserIds,
area: res.data.area,
faultDesc: res.data.faultDesc,
repairResult: res.data.repairResult,
remark: res.data.remark
};
checkoutuser.value = [];
checkoutuser.value = res.data.maintainUserList;
});
}
}
init();
const checkoutuseid = computed(() => {
return checkoutuser.value
.map((item) => item.userId)
.filter((item) => item)
.join(',');
});
const checkoutuser = ref([]);
function handleCheckoutUser(row) {
console.log(row);
checkoutuser.value = row;
}
function handleDelete(id: string) {
checkoutuser.value = checkoutuser.value.filter((item) => item.id !== id);
}
// !== 提交 =============================================================================
// 提交
const submitForm = () => {
form.value.maintainUserIds = checkoutuser.value
.map((itme) => itme.userId)
.filter((item) => item)
.join(',');
formRef.value?.validate(async (valid: boolean) => {
if (valid) {
if (userid.value) {
updateDeviceRepair(form.value).then(() => {
ElMessage.success('编辑成功');
cancelForm();
});
} else {
addDeviceRepair(form.value).then(() => {
ElMessage.success('添加成功');
cancelForm();
});
}
}
});
};
// 推出
const cancelForm = () => {
router.back();
};
</script>
<style scoped lang="scss">
.AddBuildingBox {
padding: 15px;
height: 100%;
width: 100%;
}
.AddBuildingBody {
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
background-color: white;
padding: 15px;
.title {
height: 40px;
line-height: 40px;
padding-left: 20px;
background-color: rgba(255, 255, 255, 1);
color: rgba(16, 16, 16, 1);
border-bottom: 1px solid #bbbbbb;
margin-bottom: 60px;
}
.formBody {
width: 650px;
margin: 0 auto;
.checkoutuserbox {
margin: 5px;
border: 1px solid #ccc;
padding: 5px 10px;
border-radius: 5px;
&.add {
cursor: pointer;
border-style: dashed;
&:hover {
color: #409eff;
border-color: #409eff;
}
}
& > div {
cursor: pointer;
margin-left: 10px;
&:hover {
color: red;
}
}
}
&:deep(.el-form-item__content, .el-select, .el-input) {
width: 350px !important;
margin-right: 10px;
.el-cascader {
width: 100%;
}
}
.el-form-item {
margin-bottom: 20px;
align-items: center;
}
.el-button {
width: 80px;
height: 35px;
margin-right: 20px;
}
}
}
</style>

View File

@@ -1,5 +1,6 @@
<template>
<div class="p-2">
<div class="h-full flex flex-col p-2">
<pageheader></pageheader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
@@ -19,7 +20,7 @@
</div>
</transition>
<el-card shadow="never">
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
@@ -35,84 +36,40 @@
>删除</el-button
>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" border :data="deviceRepairList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键ID" align="center" prop="id" v-if="true" />
<el-table-column label="维修设备ID" align="center" prop="deviceId" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="设备编号" align="center" prop="deviceCode" />
<el-table-column label="设备型号" align="center" prop="deviceModel" />
<el-table-column label="位置区域" align="center" prop="area" />
<el-table-column label="维护人员ID多个用,分隔" align="center" prop="maintainUserIds" />
<el-table-column label="维护人员" align="center" prop="maintainUserNames" />
<el-table-column label="故障描述" align="center" prop="faultDesc" />
<el-table-column label="维修结果 0已修复 1未修复" align="center" prop="repairResult" />
<el-table-column label="维修结果" align="center" prop="repairResult">
<template #default="scope">
<dict-tag :options="com_equipment_repair_status" :value="scope.row.repairResult"></dict-tag>
</template>
</el-table-column>
<el-table-column label="维修时间" align="center" prop="repairTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.repairTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<el-table-column label="操作" width="160" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:deviceRepair:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:deviceRepair:remove']"></el-button>
</el-tooltip>
<el-button link type="primary" @click="handleMain(scope.row)">详情</el-button>
<el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['system:deviceRepair:edit']">修改</el-button>
<el-button link type="primary" @click="handleDelete(scope.row)" v-hasPermi="['system:deviceRepair:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
<!-- 添加或修改维修工单对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="deviceRepairFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="维修设备ID" prop="deviceId">
<el-input v-model="form.deviceId" placeholder="请输入维修设备ID" />
</el-form-item>
<el-form-item label="设备名称" prop="deviceName">
<el-input v-model="form.deviceName" placeholder="请输入设备名称" />
</el-form-item>
<el-form-item label="设备编号" prop="deviceCode">
<el-input v-model="form.deviceCode" placeholder="请输入设备编号" />
</el-form-item>
<el-form-item label="设备型号" prop="deviceModel">
<el-input v-model="form.deviceModel" placeholder="请输入设备型号" />
</el-form-item>
<el-form-item label="位置区域" prop="area">
<el-input v-model="form.area" placeholder="请输入位置区域" />
</el-form-item>
<el-form-item label="维护人员ID多个用,分隔" prop="maintainUserIds">
<el-input v-model="form.maintainUserIds" placeholder="请输入维护人员ID多个用,分隔" />
</el-form-item>
<el-form-item label="故障描述" prop="faultDesc">
<el-input v-model="form.faultDesc" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="维修结果 0已修复 1未修复" prop="repairResult">
<el-input v-model="form.repairResult" placeholder="请输入维修结果 0已修复 1未修复" />
</el-form-item>
<el-form-item label="维修时间" prop="repairTime">
<el-date-picker clearable v-model="form.repairTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择维修时间">
</el-date-picker>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
@@ -121,8 +78,12 @@ import { listDeviceRepair, getDeviceRepair, delDeviceRepair, addDeviceRepair, up
import { DeviceRepairVO, DeviceRepairQuery, DeviceRepairForm } from '@/api/system/equipment/Repair/type';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_equipment_repair_status } = toRefs<any>(proxy?.useDict('com_equipment_repair_status'));
const deviceRepairList = ref<DeviceRepairVO[]>([]);
interface tableType extends DeviceRepairVO {
maintainUserNames?: string;
}
const deviceRepairList = ref<tableType[]>([]);
const buttonLoading = ref(false);
const loading = ref(true);
const showSearch = ref(true);
@@ -167,23 +128,22 @@ const data = reactive<PageData<DeviceRepairForm, DeviceRepairQuery>>({
repairResult: undefined,
repairTime: undefined,
params: {}
},
rules: {
id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }],
deviceId: [{ required: true, message: '维修设备ID不能为空', trigger: 'blur' }],
deviceName: [{ required: true, message: '设备名称不能为空', trigger: 'blur' }],
maintainUserIds: [{ required: true, message: '维护人员ID多个用,分隔不能为空', trigger: 'blur' }],
faultDesc: [{ required: true, message: '故障描述不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
const { queryParams, form } = toRefs(data);
/** 查询维修工单列表 */
const getList = async () => {
loading.value = true;
const res = await listDeviceRepair(queryParams.value);
deviceRepairList.value = res.rows;
deviceRepairList.value.forEach((item) => {
item.maintainUserNames = item.maintainUserList
.map((i) => i.nickName)
.filter((i) => i)
.join(',');
});
total.value = res.total;
loading.value = false;
};
@@ -219,36 +179,20 @@ const handleSelectionChange = (selection: DeviceRepairVO[]) => {
multiple.value = !selection.length;
};
const router = useRouter();
/** 新增按钮操作 */
const handleAdd = () => {
reset();
dialog.visible = true;
dialog.title = '添加维修工单';
router.push({
path: '/equipment/addEquipmentRepair'
});
};
/** 修改按钮操作 */
const handleUpdate = async (row?: DeviceRepairVO) => {
reset();
const _id = row?.id || ids.value[0];
const res = await getDeviceRepair(_id);
Object.assign(form.value, res.data);
dialog.visible = true;
dialog.title = '修改维修工单';
};
/** 提交按钮 */
const submitForm = () => {
deviceRepairFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.id) {
await updateDeviceRepair(form.value).finally(() => (buttonLoading.value = false));
} else {
await addDeviceRepair(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
router.push({
path: '/equipment/addEquipmentRepair',
query: {
id: row.id
}
});
};
@@ -256,24 +200,28 @@ const submitForm = () => {
/** 删除按钮操作 */
const handleDelete = async (row?: DeviceRepairVO) => {
const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除维修工单编号为"' + _ids + '"的数据项').finally(() => (loading.value = false));
await proxy?.$modal.confirm('是否确认删除维修工单?').finally(() => (loading.value = false));
await delDeviceRepair(_ids);
proxy?.$modal.msgSuccess('删除成功');
await getList();
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'system/deviceRepair/export',
{
...queryParams.value
},
`deviceRepair_${new Date().getTime()}.xlsx`
);
const handleMain = (row) => {
router.push({
path: '/equipment/equipmentRepairMain',
query: {
id: row.id
}
});
};
onMounted(() => {
getList();
});
</script>
<style lang="scss" scoped>
.el-table {
height: calc(100% - 80px);
}
</style>

View File

@@ -0,0 +1,175 @@
<template>
<div class="AddBuildingBox">
<PageHeader></PageHeader>
<div class="AddBuildingBody">
<div class="title flex flex-items-center justify-between">
<div class="flex flex-items-center">
<h5>设备信息</h5>
<div style="font-size: 0.9rem; margin-left: 20px" class="mr-5px">{{ form.id }}</div>
<el-button class="ml-10px" link type="primary"> 编辑</el-button>
</div>
<el-button @click="cancelForm"> 返回</el-button>
</div>
<div class="addBuildingFormBody">
<div class="infobox">
<div class="info_item">
<div class="label">设备分类</div>
<span class="value">{{ form.categoryName }}</span>
</div>
<div class="info_item">
<div class="label">设备名称</div>
<span class="value">{{ form.deviceName }}</span>
</div>
<div class="info_item">
<div class="label">设备编号</div>
<span class="value">{{ form.deviceCode }}</span>
</div>
<div class="info_item">
<div class="label">品牌型号</div>
<span class="value">{{ form.deviceModel }}</span>
</div>
<div class="info_item">
<div class="label">所在区域</div>
<span class="value">{{ form.area }}</span>
</div>
<div class="info_item">
<div class="label">维护人员</div>
<span class="value">{{ form.maintainUserListName }}</span>
</div>
</div>
<div class="infobox">
<div class="info_item">
<div class="label">故障描述</div>
<span class="value">{{ form.faultDesc }}</span>
</div>
</div>
<div class="infobox">
<div class="info_item">
<div class="label">维修结果</div>
<DictTag :options="com_equipment_repair_status" :value="form.repairResult"></DictTag>
</div>
<div class="info_item">
<div class="label">维修时间</div>
<span class="value">{{ form.createTime }}</span>
</div>
<div></div>
<div class="info_item">
<div class="label">备注</div>
<span class="value">{{ form.remark }}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { getDeviceRepair } from '@/api/system/equipment/Repair';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_equipment_repair_status } = toRefs<any>(proxy?.useDict('com_equipment_repair_status'));
const router = useRouter();
const route = useRoute();
const form = ref({
id: null,
deviceId: '', // 分类id、
categoryName: '', // 分类id、
deviceName: '', // 设备名称
deviceCode: '', // 编号
deviceModel: '', // 型号
area: '', // 区域
maintainUserListName: '', // 区域
maintainUserIds: '', // 设备维护人员
repairResult: '', // 设备维护人员
faultDesc: '', // 设备维护人员
createTime: '', // 设备维护人员
remark: '' // 备注
});
const userid = ref(null);
function init() {
if (route.query.id) {
userid.value = route.query.id;
getDeviceRepair(userid.value).then(async (res) => {
form.value = {
id: res.data.id,
deviceId: res.data.deviceId,
faultDesc: res.data.faultDesc,
categoryName: res.data.categoryName,
repairResult: res.data.repairResult,
deviceName: res.data.deviceName,
deviceCode: res.data.deviceCode,
deviceModel: res.data.deviceModel,
area: res.data.area,
maintainUserIds: res.data.maintainUserIds,
remark: res.data.remark,
createTime: res.data.createTime,
maintainUserListName: ''
};
if (res.data.maintainUserList && res.data.maintainUserList.length > 0) {
form.value.maintainUserListName = res.data.maintainUserList
.map((it) => (it.nickName ? it.nickName : null))
.filter((it) => it !== null)
.join(',');
}
});
}
}
init();
// 推出
const cancelForm = () => {
router.back();
};
</script>
<style scoped lang="scss">
.AddBuildingBox {
padding: 15px;
height: 100%;
width: 100%;
}
.AddBuildingBody {
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
background-color: white;
padding: 15px;
.title {
height: 40px;
line-height: 40px;
padding-left: 20px;
background-color: rgba(255, 255, 255, 1);
color: rgba(16, 16, 16, 1);
border-bottom: 1px solid #bbbbbb;
margin-bottom: 30px;
}
.addBuildingFormBody {
padding-left: 20px;
.infobox {
display: grid;
gap: 20px;
margin-bottom: 20px;
grid-template-columns: repeat(3, 1fr);
font-size: 0.98rem;
.info_item {
display: flex;
align-items: center;
.label {
width: 120px;
text-align: right;
}
.value {
font-weight: 450;
}
}
}
}
}
</style>

View File

@@ -312,7 +312,7 @@ const getList = async () => {
list.value[4].value += item.outUncompletedTasks ?? 0;
});
if (!Number.isNaN(+list.value[2].value) && !Number.isNaN(+list.value[1].value)) {
list.value[3].value = Math.min((Number(list.value[2].value) / Number(list.value[1].value)) * 100, 100) + '%';
list.value[3].value = Math.min((Number(list.value[2].value) / Number(list.value[1].value)) * 100, 100).toFixed(2) + '%';
}
handleEcartsData(ecartslist.value.find((item) => item.key === activeEchartsindex.value));

View File

@@ -10,22 +10,8 @@
<el-form-item label="巡检计划名称" prop="planName">
<el-input v-model="form.planName" placeholder="请输入"></el-input>
</el-form-item>
<el-form-item label="执行周期">
<el-date-picker
@update:model-value="handleTime"
v-model="taskDate"
type="daterange"
range-separator=""
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
start-placeholder="开启日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item label="任务时间">
<el-select v-model="form.taskTime" placeholder="选择任务时间段" style="width: 100%">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<div flex flex-wrap>
<div
class="week-items"
@@ -43,6 +29,12 @@
</div>
</div>
</el-form-item>
<el-form-item label="任务时间">
<el-select v-model="form.taskTime" placeholder="选择任务时间段" style="width: 100%">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="提醒时间">
<el-select v-model="form.remindTime" placeholder="请选择" style="width: 100%">
<el-option v-for="item in com_inspection_remind_tiime" :key="item.value" :label="item.label" :value="item.value" />
@@ -72,7 +64,6 @@
<script setup lang="ts">
import { listRoute } from '@/api/system/InspectionRoute';
import RepairUser from '@/components/Holder/repairUser.vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { numToWeek } from '@/utils/time';
import { Delete } from '@element-plus/icons-vue';
@@ -92,7 +83,6 @@ const form = ref({
planName: '', // 巡检计划名称
inspectorIds: '', // 巡检人员
taskTime: '', // 任务时间段
executeCycle: '', // 执行周期
executeDay: '', // 执行周期具体的周几
remindTime: '', // 提醒时间
routeIds: '', // 计划路线id
@@ -101,17 +91,9 @@ const form = ref({
const rules = ref({
planName: [{ required: true, message: '请输入巡检计划名称', trigger: 'blur' }],
inspectorIds: [{ required: true, message: '请选择巡检人员', trigger: 'blur' }],
executeCycle: [{ required: true, message: '请输入执行周期', trigger: 'blur' }],
routeIds: [{ required: true, message: '请选择路线', trigger: 'blur' }]
});
// 执行周期
const taskDateSplit = ' - ';
const taskDate = ref([]);
function handleTime(val: string[]) {
taskDate.value = val;
form.value.executeCycle = `${val[0]}${taskDateSplit}${val[1]}`;
}
// 选择周几
const checkoutWeek = ref([]);
function checkoutWeekFun(val: number) {
@@ -132,21 +114,6 @@ const options = ref([
]);
// 提醒时间
const remindTimeoptions = ref([
{
value: 10,
label: '任务开始前10分钟'
},
{
value: 15,
label: '任务开始前15分钟'
},
{
value: 20,
label: '任务开始前30分钟'
}
]);
// 巡检计划id
const editid = ref(null);
@@ -164,13 +131,11 @@ async function init() {
planName: res.data.planName, // 巡检计划名称
inspectorIds: res.data.inspectorIds, // 巡检人员
taskTime: res.data.taskTime, // 任务时间段
executeCycle: res.data.executeCycle, // 执行周期
executeDay: res.data.executeDay, // 执行周期具体的周几
remindTime: res.data.remindTime, // 提醒时间
routeIds: res.data.routeIds, // 计划路线id
inspectSetting: String(res.data.inspectSetting) // 巡检设置
};
taskDate.value = res.data.executeCycle.split(taskDateSplit);
checkoutWeek.value = res.data.executeDay
.split(',')
.map((item) => Number(item))
@@ -183,19 +148,6 @@ async function init() {
init();
// 选择 巡检人员
const RepairUserRef = ref<InstanceType<typeof RepairUser>>();
function handleAddUser() {
RepairUserRef.value.open();
}
const checkoutUserlist = ref([]);
function handleUserChange(val) {
checkoutUserlist.value = val;
}
function handleDelete(id) {
checkoutUserlist.value = checkoutUserlist.value.filter((item) => item.userId !== id);
}
// 返回
function routeback() {
router.back();
@@ -275,7 +227,6 @@ const formRef = ref();
function submit() {
formRef.value?.validate(async (valid: boolean) => {
if (valid) {
form.value.inspectorIds = checkoutUserlist.value.map((item) => item.userId).join(',');
if (editid.value) {
updatePlan(form.value).then(() => {
ElMessage.success('编辑成功');

View File

@@ -38,7 +38,7 @@
<el-table v-loading="loading" border :data="planList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="巡检计划名称" align="center" prop="planName" />
<el-table-column label="执行周期" align="center" prop="executeCycle" />
<!-- <el-table-column label="执行周期" align="center" prop="executeCycle" /> -->
<el-table-column label="执行星期" align="center">
<template #default="scope">
<span v-for="(item, index) in scope.row.executeDayNames" :key="index" class="pl-5px">{{ numToWeek(item) }}</span>
@@ -46,19 +46,15 @@
</el-table-column>
<el-table-column label="任务时间" align="center" prop="taskTime" />
<el-table-column label="计划路线" align="center" prop="routeNames" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column label="状态" width="150" align="center" prop="status">
<template #default="scope">
<el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1" active-text="关闭" inactive-text="开启"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<el-table-column label="操作" width="110" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:plan:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:plan:remove']"></el-button>
</el-tooltip>
<el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['system:plan:edit']">修改</el-button>
<el-button link type="primary" @click="handleDelete(scope.row)" v-hasPermi="['system:plan:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>

View File

@@ -55,7 +55,6 @@
<script setup name="Route" lang="ts">
import { list_statapi } from '@/api/system/Inspection';
import { getUserByRoleKey } from '@/api/system/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -78,12 +77,9 @@ const checkdata = ref([]);
// TODO 巡检人员名称
const { queryParams } = toRefs(data);
const inspectionUserlist = ref([]);
/** 查询巡检路线列表 */
const getList = async () => {
loading.value = true;
// const inspectionUseres = await getUserByRoleKey('inspection');
// inspectionUserlist.value = inspectionUseres.data;
const res = await list_statapi(queryParams.value);
routeList.value = res.rows;
total.value = res.total;

View File

@@ -29,7 +29,15 @@
</div>
</el-form-item>
<el-form-item label="巡更日期" prop="taskTime">
<el-date-picker placeholder="年/月/日" v-model="form.taskTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
<el-date-picker
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
v-model="form.taskTime"
type="daterange"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item label="提醒时间" prop="remindTime">
<el-select v-model="form.remindTime" placeholder="请选择" style="width: 100%">

View File

@@ -1,5 +1,6 @@
<template>
<div class="h-full flex flex-col p-2">
<pageheader></pageheader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
@@ -51,7 +52,7 @@
<el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="巡检任务名称" align="center" prop="taskName" />
<el-table-column label="巡检人员" align="center" prop="inspectorId" />
<el-table-column label="巡检人员" align="center" prop="inspectorName" />
<el-table-column label="起止日期" align="center" prop="taskTime" />
<el-table-column label="巡检设置" align="center" prop="inspectSetting">
<template #default="scope">

View File

@@ -17,13 +17,11 @@
<el-form-item label="计量单位" prop="unit">
<span>{{ form.unit }}</span>
</el-form-item>
<el-form-item label="成本" prop="unit">
<span>{{ form.unit }}</span>
<el-input v-model.trim="form.remark" placeholder="请输入成本" />
<el-form-item label="成本" prop="totalInNum">
<el-input v-model.trim="form.totalInNum" placeholder="请输入成本" />
</el-form-item>
<el-form-item label="当前库存" prop="unit">
<span>{{ form.unit }}</span>
<el-input v-model.trim="form.remark" placeholder="请输入当前库存" />
<el-form-item label="当前库存" prop="totalStockNum">
<el-input-number v-model="form.totalStockNum" placeholder="请输入当前库存" />
</el-form-item>
<el-form-item style="margin-top: 30px">
@@ -41,18 +39,18 @@ import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { getMaterial, updateMaterial, addMaterial } from '@/api/system/Tmaterial';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const router = useRouter();
const route = useRoute();
const formRef = ref();
const form = ref({
id: null,
materialId: '', // 物料名称
materialName: '', // 物料名称
brand: '', // 联系电话
model: '', // 邮箱
unit: '', // 地址
avgCostPrice: '', // 地址
remark: '' // 备注
});
const rules = ref({
@@ -67,11 +65,14 @@ if (route.query.id) {
getMaterial(userid.value).then((res) => {
form.value = {
id: res.data.id,
materialName: res.data.materialName,
remark: res.data.remark,
'materialId': res.data.materialId,
'materialName': res.data.materialName,
brand: res.data.brand,
model: res.data.model,
unit: res.data.unit,
remark: res.data.remark
'avgCostPrice': res.data.avgCostPrice,
'totalStockValue': res.data.totalStockValue
};
});
}

View File

@@ -26,7 +26,7 @@
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-button type="primary" icon="Plus" @click="handleAdd">添加</el-button>
<!-- <el-button type="primary" icon="Plus" @click="handleAdd">添加</el-button> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
@@ -42,8 +42,8 @@
<el-table-column label="备注" show-overflow-tooltip align="center" prop="remark" />
<el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:material:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:material:remove']">删除</el-button>
<el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['system:material:edit']">修改</el-button>
<el-button link type="primary" @click="handleDelete(scope.row)" v-hasPermi="['system:material:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -54,7 +54,7 @@
</template>
<script setup name="Material" lang="ts">
import { listMaterial, getMaterial, delMaterial, addMaterial, updateMaterial } from '@/api/system/Tmaterial';
import { delMaterial } from '@/api/system/Tmaterial';
import { MaterialVO, MaterialQuery, MaterialForm } from '@/api/system/Tmaterial/type';
import { listStock } from '@/api/system/Tstock/index';
@@ -128,7 +128,7 @@ const handleUpdate = async (row?: MaterialVO) => {
router.push({
path: '/warehouse/editInventory',
query: {
id: row.id
id: row.materialId
}
});
};