完成Banner,设备管理模块,进行中 水电表
This commit is contained in:
63
src/api/system/Banner/index.ts
Normal file
63
src/api/system/Banner/index.ts
Normal 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'
|
||||
});
|
||||
};
|
||||
81
src/api/system/Banner/type.ts
Normal file
81
src/api/system/Banner/type.ts
Normal 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;
|
||||
}
|
||||
@@ -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
|
||||
});
|
||||
|
||||
@@ -121,7 +121,7 @@ export interface TopupRecordQuery extends PageQuery {
|
||||
/**
|
||||
* 1.电表 2.水表
|
||||
*/
|
||||
type?: number;
|
||||
type?: string;
|
||||
|
||||
/**
|
||||
* 订单状态(0.未支付 1.已支付 2.支付中,3.支付失败 4.退款)
|
||||
|
||||
@@ -8,7 +8,7 @@ export interface MaterialVO {
|
||||
* 物料名称*
|
||||
*/
|
||||
materialName: string;
|
||||
|
||||
materialId: string;
|
||||
/**
|
||||
* 品牌*
|
||||
*/
|
||||
|
||||
@@ -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'
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* 日期范围参数
|
||||
|
||||
@@ -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'
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* 维修时间
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* 设备名称
|
||||
|
||||
@@ -148,9 +148,6 @@ function getlist() {
|
||||
tableData.value = res.rows;
|
||||
total.value = res.total;
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('获取用户列表失败:', error);
|
||||
})
|
||||
.finally(() => {
|
||||
loading.value = false;
|
||||
});
|
||||
|
||||
@@ -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,7 +234,6 @@ function conback() {
|
||||
// ==============================================
|
||||
function confirm() {
|
||||
dialog.value.dialogVisible = false;
|
||||
if (multipleSelection.value.length > 0) {
|
||||
if (isMultiple.value) {
|
||||
// 多选
|
||||
if (returnvalue.value === '*') {
|
||||
@@ -239,7 +257,9 @@ function confirm() {
|
||||
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>
|
||||
|
||||
239
src/views/system/Banner/add.vue
Normal file
239
src/views/system/Banner/add.vue
Normal 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>
|
||||
249
src/views/system/Banner/index.vue
Normal file
249
src/views/system/Banner/index.vue
Normal 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>
|
||||
@@ -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) {
|
||||
|
||||
@@ -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>
|
||||
|
||||
161
src/views/system/Sdb/SdbBill/add.vue
Normal file
161
src/views/system/Sdb/SdbBill/add.vue
Normal 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>
|
||||
159
src/views/system/Sdb/SdbBill/main.vue
Normal file
159
src/views/system/Sdb/SdbBill/main.vue
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
245
src/views/system/equipment/Archive/add.vue
Normal file
245
src/views/system/equipment/Archive/add.vue
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
235
src/views/system/equipment/Archive/main.vue
Normal file
235
src/views/system/equipment/Archive/main.vue
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
248
src/views/system/equipment/Repair/add.vue
Normal file
248
src/views/system/equipment/Repair/add.vue
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
175
src/views/system/equipment/Repair/main.vue
Normal file
175
src/views/system/equipment/Repair/main.vue
Normal 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>
|
||||
@@ -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));
|
||||
|
||||
@@ -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('编辑成功');
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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%">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user