9/2 禅道问题
This commit is contained in:
@@ -14,6 +14,13 @@ export const listItem = (query?: Request): AxiosPromise<any[]> => {
|
|||||||
params: query
|
params: query
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
export const overview = (query?: Request): AxiosPromise<any[]> => {
|
||||||
|
return request({
|
||||||
|
url: '/inspection/data/generate/overview',
|
||||||
|
method: 'POST',
|
||||||
|
params: query
|
||||||
|
});
|
||||||
|
};
|
||||||
export interface Request {
|
export interface Request {
|
||||||
/**
|
/**
|
||||||
* 进行中的任务数
|
* 进行中的任务数
|
||||||
|
|||||||
@@ -154,7 +154,6 @@ export interface QuestionComponentItem {
|
|||||||
type: string;
|
type: string;
|
||||||
title: string;
|
title: string;
|
||||||
required: boolean;
|
required: boolean;
|
||||||
|
|
||||||
options: QuestionComponentOption[];
|
options: QuestionComponentOption[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="step-timeline">
|
<div class="step-timeline">
|
||||||
<div v-for="(item, index) in steps" :key="index" class="step-item" :class="item.status">
|
<div v-for="(item, index) in steps" :key="index" :class="item.status" class="step-item">
|
||||||
<div class="step-node">
|
<div class="step-node">
|
||||||
<div class="step-circle">
|
<div class="step-circle">
|
||||||
<el-icon v-if="item.status === 'completed'" :size="12"><Check /></el-icon>
|
<el-icon v-if="item.status === 'completed'" :size="12"><Check /></el-icon>
|
||||||
@@ -10,23 +10,23 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="step-content">
|
<div class="step-content">
|
||||||
<div class="step-title">
|
<div class="step-title">
|
||||||
<slot name="title" :item="item" :index="index"></slot>
|
<slot :index="index" :item="item" name="title"></slot>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="item.wrap === true">
|
<div v-if="item.wrap === true">
|
||||||
<div class="step-subtitle">
|
<div class="step-subtitle">
|
||||||
<slot name="subtitle" :item="item" :index="index"></slot>
|
<slot :index="index" :item="item" name="subtitle"></slot>
|
||||||
</div>
|
</div>
|
||||||
<div class="step-time">
|
<div class="step-time">
|
||||||
<slot name="time" :item="item" :index="index"></slot>
|
<slot :index="index" :item="item" name="time"></slot>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<span>
|
<span>
|
||||||
<slot name="subtitle" :item="item" :index="index"></slot>
|
<slot :index="index" :item="item" name="subtitle"></slot>
|
||||||
</span>
|
</span>
|
||||||
|
<span> </span>
|
||||||
<span>
|
<span>
|
||||||
<slot name="time" :item="item" :index="index"></slot>
|
<slot :index="index" :item="item" name="time"></slot>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -253,7 +253,6 @@ export const useHouseStore = defineStore(
|
|||||||
treedata.value = [];
|
treedata.value = [];
|
||||||
const res = await getVillageTree(villageid);
|
const res = await getVillageTree(villageid);
|
||||||
treedata.value = convertBuildingToTree(res.data.buildings || []);
|
treedata.value = convertBuildingToTree(res.data.buildings || []);
|
||||||
|
|
||||||
buildHousePathCache(treedata.value);
|
buildHousePathCache(treedata.value);
|
||||||
return treedata.value;
|
return treedata.value;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ const reg = {
|
|||||||
number: /^[0-9]+$/,
|
number: /^[0-9]+$/,
|
||||||
// 完整版:所有emoji+肤色修饰+组合连接符+全部颜文字符号
|
// 完整版:所有emoji+肤色修饰+组合连接符+全部颜文字符号
|
||||||
fullFilterReg:
|
fullFilterReg:
|
||||||
/[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F1E0}-\u{1F1FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{FE00}-\u{FE0F}\u{1F900}-\u{1F9FF}\u{1F3FB}-\u{1F3FF}\u{200D}。「」、・~ー『』「」・ヽヾゝゞ〆゛゜○●△▲□■◇◆◎▽▼┐┌└┘╮╭╰╯┬┴┼│─╱╲╳︵︶︹︺︿﹀︽︾﹁﹂﹃﹄ァ-ヺヽヾ]/gu
|
/[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F1E0}-\u{1F1FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}\u{FE00}-\u{FE0F}\u{1F900}-\u{1F9FF}\u{1F3FB}-\u{1F3FF}\u{200D}。「」、・~ー『』「」・ヽヾゝゞ〆゛゜○●△▲□■◇◆◎▽▼┐┌└┘╮╭╰╯┬┴┼│─╱╲╳︵︶︹︺︿﹀︽︾﹁﹂﹃﹄ァ-ヺヽヾ]/u
|
||||||
};
|
};
|
||||||
// 自动推导 TS 类型(最标准)
|
// 自动推导 TS 类型(最标准)
|
||||||
export type RegType = keyof typeof reg;
|
export type RegType = keyof typeof reg;
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
<el-form-item label="活动时间" prop="startTime">
|
<el-form-item label="活动时间" prop="startTime">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="activityTime"
|
v-model="activityTime"
|
||||||
|
:disabled-date="disabledDate"
|
||||||
end-placeholder="结束活动"
|
end-placeholder="结束活动"
|
||||||
format="YYYY-MM-DD HH:mm:ss"
|
format="YYYY-MM-DD HH:mm:ss"
|
||||||
range-separator="至"
|
range-separator="至"
|
||||||
@@ -354,7 +355,7 @@ const disabledDate = (time: string) => {
|
|||||||
function disabledSignInDate(time: string) {
|
function disabledSignInDate(time: string) {
|
||||||
const selectDate = new Date(time);
|
const selectDate = new Date(time);
|
||||||
const today = new Date(form.value.endTime);
|
const today = new Date(form.value.endTime);
|
||||||
return selectDate.getTime() > today.getTime();
|
return selectDate.getTime() > today.getTime() || selectDate.getTime() < new Date(new Date().toLocaleDateString()).getTime();
|
||||||
}
|
}
|
||||||
const userid = ref();
|
const userid = ref();
|
||||||
// 报名截止日期
|
// 报名截止日期
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||||
<div v-show="showSearch" class="mb-[10px]">
|
<div v-show="showSearch" class="mb-[10px]">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
|
||||||
<el-form-item label="标题" prop="title">
|
<el-form-item label="标题" prop="title">
|
||||||
<el-input v-model="queryParams.title" placeholder="请输入标题" clearable @keyup.enter="handleQuery" />
|
<el-input v-model="queryParams.title" clearable placeholder="请输入标题" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||||
@@ -24,8 +24,8 @@
|
|||||||
:disable-delete="multiple"
|
:disable-delete="multiple"
|
||||||
:disable-edit="single"
|
:disable-edit="single"
|
||||||
:show-add="checkPermi(['activity:activity:add'])"
|
:show-add="checkPermi(['activity:activity:add'])"
|
||||||
:show-edit="checkPermi(['activity:activity:edit'])"
|
|
||||||
:show-delete="checkPermi(['activity:activity:remove'])"
|
:show-delete="checkPermi(['activity:activity:remove'])"
|
||||||
|
:show-edit="checkPermi(['activity:activity:edit'])"
|
||||||
@update:add="handleAdd"
|
@update:add="handleAdd"
|
||||||
@update:edit="handleUpdate()"
|
@update:edit="handleUpdate()"
|
||||||
@update:delete="handleDelete()"
|
@update:delete="handleDelete()"
|
||||||
@@ -33,65 +33,65 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" border :data="activityList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="activityList" border @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column label="封面" align="center">
|
<el-table-column align="center" label="封面" min-width="130px">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-image
|
<el-image
|
||||||
preview-teleported
|
|
||||||
lazy
|
|
||||||
:preview-src-list="[scope.row.coverImage]"
|
|
||||||
v-if="scope.row.coverImage"
|
v-if="scope.row.coverImage"
|
||||||
|
:preview-src-list="[scope.row.coverImage]"
|
||||||
:src="scope.row.coverImage"
|
:src="scope.row.coverImage"
|
||||||
fit="cover"
|
fit="cover"
|
||||||
|
lazy
|
||||||
|
preview-teleported
|
||||||
style="width: 100px; height: 100px"
|
style="width: 100px; height: 100px"
|
||||||
></el-image>
|
></el-image>
|
||||||
<span v-else style="color: grey">暂无</span>
|
<span v-else style="color: grey">暂无</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="标题" align="center" prop="title" />
|
<el-table-column align="center" label="标题" prop="title" />
|
||||||
<el-table-column label="主办方" align="center" prop="organizer" />
|
<el-table-column align="center" label="主办方" prop="organizer" />
|
||||||
<el-table-column label="签到时间" width="120" align="center" prop="signInTime">
|
<el-table-column align="center" label="签到时间" prop="signInTime" width="120">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ scope.row.signinStartTime }}-{{ scope.row.signinEndTime }}</span>
|
<span>{{ scope.row.signinStartTime }}-{{ scope.row.signinEndTime }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="发布状态" width="100" align="center" prop="status">
|
<el-table-column align="center" label="发布状态" prop="status" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<DictTag :value="scope.row.status" :options="com_publish_status"></DictTag>
|
<DictTag :options="com_publish_status" :value="scope.row.status"></DictTag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="活动时间" align="center">
|
<el-table-column align="center" label="活动时间">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ scope.row.startTime }}</span>
|
<span>{{ scope.row.startTime }}</span>
|
||||||
<span> -- </span>
|
<span> -- </span>
|
||||||
<span>{{ scope.row.endTime }}</span>
|
<span>{{ scope.row.endTime }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="活动地点" align="center" prop="address" />
|
<el-table-column align="center" label="活动地点" prop="address" />
|
||||||
<el-table-column label="联系人" width="120" align="center" prop="contactName" />
|
<el-table-column align="center" label="联系人" prop="contactName" width="120" />
|
||||||
<el-table-column label="联系电话" width="120" align="center" prop="contactPhone" />
|
<el-table-column align="center" label="联系电话" prop="contactPhone" width="120" />
|
||||||
|
|
||||||
<el-table-column label="活动名额" width="80" align="center" prop="contactPhone">
|
<el-table-column align="center" label="活动名额" prop="contactPhone" width="80">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span v-if="scope.row.quota === 0">无限制</span>
|
<span v-if="scope.row.quota === 0">无限制</span>
|
||||||
<span v-else>{{ scope.row.quota }}人</span>
|
<span v-else>{{ scope.row.quota }}人</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" align="center" width="200px" fixed="right">
|
<el-table-column align="center" fixed="right" label="操作" width="200px">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button v-if="scope.row.status === '0'" link type="primary" @click="handleSend(scope.row)">发布</el-button>
|
<el-button v-if="scope.row.status === '0'" link type="primary" @click="handleSend(scope.row)">发布</el-button>
|
||||||
<el-button link type="primary" @click="handleUpdate(scope.row)" v-has-permi="['activity:activity:edit']">编辑</el-button>
|
<el-button v-has-permi="['activity:activity:edit']" link type="primary" @click="handleUpdate(scope.row)">编辑</el-button>
|
||||||
<el-button link type="primary" @click="handleDelete(scope.row)" v-has-permi="['activity:activity:remove']">删除</el-button>
|
<el-button v-has-permi="['activity:activity:remove']" link type="primary" @click="handleDelete(scope.row)">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
|
<el-dialog v-model="dialog.visible" :title="dialog.title" append-to-body width="500px">
|
||||||
<el-form ref="activityFormRef" :model="form" :rules="rules" label-width="120px">
|
<el-form ref="activityFormRef" :model="form" :rules="rules" label-width="120px">
|
||||||
<el-form-item label="发布人姓名" prop="createName">
|
<el-form-item label="发布人姓名" prop="createName">
|
||||||
<el-input maxlength="20" v-model.trim="form.createName" placeholder="请输入发布人姓名" />
|
<el-input v-model.trim="form.createName" maxlength="20" placeholder="请输入发布人姓名" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="发布后状态" prop="status">
|
<el-form-item label="发布后状态" prop="status">
|
||||||
<el-radio-group v-model="form.status">
|
<el-radio-group v-model="form.status">
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="Activity" lang="ts">
|
<script lang="ts" name="Activity" setup>
|
||||||
import { listActivity, delActivity, updateActivity } from '@/api/system/Activity';
|
import { listActivity, delActivity, updateActivity } from '@/api/system/Activity';
|
||||||
import { ActivityVO, ActivityQuery, ActivityForm } from '@/api/system/Activity/type';
|
import { ActivityVO, ActivityQuery, ActivityForm } from '@/api/system/Activity/type';
|
||||||
import { checkPermi } from '@/utils/permission';
|
import { checkPermi } from '@/utils/permission';
|
||||||
|
|||||||
@@ -130,6 +130,8 @@ const form = ref({
|
|||||||
});
|
});
|
||||||
const rules = {
|
const rules = {
|
||||||
content: [{ required: true, message: '请输入办事内容', trigger: 'blur' }],
|
content: [{ required: true, message: '请输入办事内容', trigger: 'blur' }],
|
||||||
|
handleTime: [{ required: true, message: '请输入办事时间', trigger: 'blur' }],
|
||||||
|
handlePosition: [{ required: true, message: '请输入办事地点', trigger: 'blur' }],
|
||||||
seekName: [
|
seekName: [
|
||||||
{ required: true, message: '请选择求助人', trigger: 'blur' },
|
{ required: true, message: '请选择求助人', trigger: 'blur' },
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
maxlength="10"
|
maxlength="10"
|
||||||
placeholder="请输入车牌号"
|
placeholder="请输入车牌号"
|
||||||
style="text-transform: uppercase; letter-spacing: 2px"
|
style="text-transform: uppercase; letter-spacing: 2px"
|
||||||
|
@input="handleInputCarNum"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -48,6 +49,7 @@
|
|||||||
<el-form-item label="有效日期" prop="startTime">
|
<el-form-item label="有效日期" prop="startTime">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="checkDate"
|
v-model="checkDate"
|
||||||
|
:disabled-date="disableDate"
|
||||||
end-placeholder="结束日期"
|
end-placeholder="结束日期"
|
||||||
placeholder="选择日期"
|
placeholder="选择日期"
|
||||||
range-separator="到"
|
range-separator="到"
|
||||||
@@ -121,15 +123,22 @@ const form = ref({
|
|||||||
endTime: '' // 结束日期
|
endTime: '' // 结束日期
|
||||||
});
|
});
|
||||||
const checkDate = ref([]);
|
const checkDate = ref([]);
|
||||||
function handleDate() {
|
// 禁用 过去日期
|
||||||
form.value.startTime = checkDate.value[0];
|
function disableDate(time: Date) {
|
||||||
form.value.endTime = checkDate.value[1];
|
return time.getTime() < new Date(new Date().toLocaleDateString()).getTime();
|
||||||
}
|
}
|
||||||
|
// 处理日期选择
|
||||||
|
function handleDate(data: string[]) {
|
||||||
|
form.value.startTime = data[0] + ' 00:00:00';
|
||||||
|
form.value.endTime = data[1] + ' 23:59:59';
|
||||||
|
}
|
||||||
|
// 清空日期选择
|
||||||
function handleClear() {
|
function handleClear() {
|
||||||
checkDate.value = [];
|
checkDate.value = [];
|
||||||
form.value.startTime = '';
|
form.value.startTime = '';
|
||||||
form.value.endTime = '';
|
form.value.endTime = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
const rules = ref({
|
const rules = ref({
|
||||||
cardCode: [
|
cardCode: [
|
||||||
{ required: true, message: '请输入月卡编号', trigger: 'blur' },
|
{ required: true, message: '请输入月卡编号', trigger: 'blur' },
|
||||||
@@ -150,8 +159,15 @@ const rules = ref({
|
|||||||
handleName: [
|
handleName: [
|
||||||
{ required: false, message: '请输入姓名', trigger: 'blur' },
|
{ required: false, message: '请输入姓名', trigger: 'blur' },
|
||||||
{
|
{
|
||||||
validator: (_: any, value: string | number) => validator(value, 'ChineseName'),
|
validator: (_: any, value: string | number, callback: (error?: Error) => void) => {
|
||||||
message: '请输入正确的中文姓名',
|
if (value === '' || value === null || value === undefined) {
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
|
if (!validator(value, 'ChineseName')) {
|
||||||
|
return callback(new Error('请输入正确的中文姓名'));
|
||||||
|
}
|
||||||
|
return callback();
|
||||||
|
},
|
||||||
trigger: 'blur'
|
trigger: 'blur'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -210,6 +226,12 @@ if (route.query.id) {
|
|||||||
checkDate.value = [form.value.startTime, form.value.endTime];
|
checkDate.value = [form.value.startTime, form.value.endTime];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 处理 车牌号 输入 大写问题
|
||||||
|
function handleInputCarNum(val: string) {
|
||||||
|
form.value.carNum = val.toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
// !== 提交 =============================================================================
|
// !== 提交 =============================================================================
|
||||||
// 提交
|
// 提交
|
||||||
const submitForm = () => {
|
const submitForm = () => {
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
<el-table-column align="center" label="绑定车牌号" prop="carNum" width="150" />
|
<el-table-column align="center" label="绑定车牌号" prop="carNum" width="150" />
|
||||||
<el-table-column align="center" label="剩余有效天数" prop="handleName" width="120">
|
<el-table-column align="center" label="剩余有效天数" prop="handleName" width="120">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ formatTimeDiff(scope.row.endTime) }}
|
{{ handleDiffDays(scope.row.startTime, scope.row.endTime) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="支付方式" prop="payMethod" width="150">
|
<el-table-column align="center" label="支付方式" prop="payMethod" width="150">
|
||||||
@@ -118,7 +118,6 @@
|
|||||||
import { listMonthCard, delMonthCard, addMonthCard, updateMonthCard } from '@/api/system/MonthCard';
|
import { listMonthCard, delMonthCard, addMonthCard, updateMonthCard } from '@/api/system/MonthCard';
|
||||||
import { MonthCardVO, MonthCardQuery, MonthCardForm } from '@/api/system/MonthCard/type';
|
import { MonthCardVO, MonthCardQuery, MonthCardForm } from '@/api/system/MonthCard/type';
|
||||||
import { checkPermi } from '@/utils/permission';
|
import { checkPermi } from '@/utils/permission';
|
||||||
import { diffDays, formatTimeDiff } from '@/utils/time';
|
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||||
const { com_pay_method } = toRefs<any>(proxy?.useDict('com_pay_method'));
|
const { com_pay_method } = toRefs<any>(proxy?.useDict('com_pay_method'));
|
||||||
@@ -179,6 +178,32 @@ const data = reactive<PageData<MonthCardForm, MonthCardQuery>>({
|
|||||||
|
|
||||||
const { queryParams, form, rules } = toRefs(data);
|
const { queryParams, form, rules } = toRefs(data);
|
||||||
|
|
||||||
|
/** 一天对应的毫秒数 */
|
||||||
|
const ONE_DAY_MS = 1000 * 60 * 60 * 24;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算月卡剩余有效天数
|
||||||
|
* 规则:
|
||||||
|
* - endTime <= 当前时间 → 已过期,返回 0
|
||||||
|
* - startTime > endTime → 参数非法,返回 0
|
||||||
|
* - 同一天(如 9/2 00:00:00 ~ 9/2 23:59:59)视为 1 天
|
||||||
|
*/
|
||||||
|
function handleDiffDays(startTime: Date | string | number, endTime: Date | string | number): number {
|
||||||
|
const now = Date.now();
|
||||||
|
const start = new Date(startTime).getTime();
|
||||||
|
const end = new Date(endTime).getTime();
|
||||||
|
|
||||||
|
// 非法参数:开始时间晚于结束时间
|
||||||
|
if (start > end) return 0;
|
||||||
|
// 已过期
|
||||||
|
if (end <= now) return 0;
|
||||||
|
|
||||||
|
// 取「开始时间」和「当前时间」中较晚的那个作为计算起点
|
||||||
|
const effectiveStart = Math.max(start, now);
|
||||||
|
const diff = end - effectiveStart;
|
||||||
|
|
||||||
|
return Math.round(diff / ONE_DAY_MS);
|
||||||
|
}
|
||||||
/** 查询月卡管理列表 */
|
/** 查询月卡管理列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="AddBuildingBox">
|
<div class="AddBuildingBox">
|
||||||
<PageHeader :title="userid ? '编辑问卷' : '添加问卷'"></PageHeader>
|
<PageHeader :title="userid ? '编辑问卷' : '添加问卷'"></PageHeader>
|
||||||
<div class="AddBuildingBody">
|
<div class="AddBuildingBody">
|
||||||
<el-form :rules="rules" class="formBody" label-position="right" label-width="130px">
|
<el-form class="formBody" label-position="right" label-width="130px">
|
||||||
<el-card>
|
<el-card>
|
||||||
<template #header>
|
<template #header>
|
||||||
<span>基本信息</span>
|
<span>基本信息</span>
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-form-item label="时间范围" prop="startTime">
|
<el-form-item label="时间范围" required>
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="timeData"
|
v-model="timeData"
|
||||||
:disabled-date="handleDate"
|
:disabled-date="handleDate"
|
||||||
@@ -82,12 +82,9 @@ const form = ref({
|
|||||||
startTime: '',
|
startTime: '',
|
||||||
endTime: ''
|
endTime: ''
|
||||||
});
|
});
|
||||||
const rules = ref({
|
|
||||||
startTime: [{ required: true, message: '请选择日期范围', trigger: 'blur' }]
|
|
||||||
});
|
|
||||||
const timeData = ref([]);
|
const timeData = ref([]);
|
||||||
function handleDate(data: string) {
|
function handleDate(data: string) {
|
||||||
const date = new Date();
|
const date = new Date(new Date().toLocaleDateString());
|
||||||
return date.getTime() > new Date(data).getTime();
|
return date.getTime() > new Date(data).getTime();
|
||||||
}
|
}
|
||||||
function handleModelDate(date: string) {
|
function handleModelDate(date: string) {
|
||||||
@@ -157,12 +154,16 @@ async function handleSave(data: QuestionComponentnaireForm) {
|
|||||||
if (timeData.value.length <= 0) {
|
if (timeData.value.length <= 0) {
|
||||||
return ElMessage.warning('请选择问卷时间范围');
|
return ElMessage.warning('请选择问卷时间范围');
|
||||||
}
|
}
|
||||||
|
const list = data.content ?? [];
|
||||||
|
if (list.length <= 0) {
|
||||||
|
return ElMessage.warning('请添加问卷题目');
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
// 父组件自己调用接口提交
|
// 父组件自己调用接口提交
|
||||||
if (userid.value !== null) {
|
if (userid.value !== null) {
|
||||||
await updateQuestionnaire({
|
await updateQuestionnaire({
|
||||||
...data,
|
...data,
|
||||||
content: JSON.stringify(data.content),
|
content: JSON.stringify(list),
|
||||||
status: '0', // 草稿状态
|
status: '0', // 草稿状态
|
||||||
startTime: timeData.value[0],
|
startTime: timeData.value[0],
|
||||||
endTime: timeData.value[1],
|
endTime: timeData.value[1],
|
||||||
@@ -171,7 +172,7 @@ async function handleSave(data: QuestionComponentnaireForm) {
|
|||||||
} else {
|
} else {
|
||||||
await addQuestionnaire({
|
await addQuestionnaire({
|
||||||
...data,
|
...data,
|
||||||
content: JSON.stringify(data.content),
|
content: JSON.stringify(list),
|
||||||
status: '0', // 草稿状态
|
status: '0', // 草稿状态
|
||||||
startTime: timeData.value[0],
|
startTime: timeData.value[0],
|
||||||
endTime: timeData.value[1],
|
endTime: timeData.value[1],
|
||||||
@@ -191,11 +192,15 @@ async function handlePublish(data: QuestionComponentnaireForm) {
|
|||||||
if (timeData.value.length <= 0) {
|
if (timeData.value.length <= 0) {
|
||||||
return ElMessage.warning('请选择问卷时间范围');
|
return ElMessage.warning('请选择问卷时间范围');
|
||||||
}
|
}
|
||||||
|
const list = data.content ?? [];
|
||||||
|
if (list.length <= 0) {
|
||||||
|
return ElMessage.warning('请添加问卷题目');
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
if (userid.value !== null) {
|
if (userid.value !== null) {
|
||||||
await updateQuestionnaire({
|
await updateQuestionnaire({
|
||||||
...data,
|
...data,
|
||||||
content: JSON.stringify(data.content),
|
content: JSON.stringify(list),
|
||||||
status: '1', // 发布状态
|
status: '1', // 发布状态
|
||||||
startTime: timeData.value[0],
|
startTime: timeData.value[0],
|
||||||
endTime: timeData.value[1],
|
endTime: timeData.value[1],
|
||||||
@@ -204,7 +209,7 @@ async function handlePublish(data: QuestionComponentnaireForm) {
|
|||||||
} else {
|
} else {
|
||||||
await addQuestionnaire({
|
await addQuestionnaire({
|
||||||
...data,
|
...data,
|
||||||
content: JSON.stringify(data.content),
|
content: JSON.stringify(list),
|
||||||
status: '1', // 发布状态
|
status: '1', // 发布状态
|
||||||
endTime: timeData.value[1],
|
endTime: timeData.value[1],
|
||||||
startTime: timeData.value[0],
|
startTime: timeData.value[0],
|
||||||
|
|||||||
@@ -3,18 +3,18 @@
|
|||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<!-- 左侧:组件库 -->
|
<!-- 左侧:组件库 -->
|
||||||
<el-col :span="4">
|
<el-col :span="4">
|
||||||
<el-card shadow="hover" class="component-panel sticky-card">
|
<el-card class="component-panel sticky-card" shadow="hover">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<span>组件库</span>
|
<span>组件库</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<draggable
|
<draggable
|
||||||
:list="componentList"
|
|
||||||
:group="{ name: 'components', pull: 'clone', put: false }"
|
|
||||||
:clone="cloneComponent"
|
:clone="cloneComponent"
|
||||||
item-key="type"
|
:group="{ name: 'components', pull: 'clone', put: false }"
|
||||||
|
:list="componentList"
|
||||||
class="component-list"
|
class="component-list"
|
||||||
|
item-key="type"
|
||||||
>
|
>
|
||||||
<template #item="{ element }">
|
<template #item="{ element }">
|
||||||
<div class="component-item">
|
<div class="component-item">
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
<!-- 中间:设计画布 -->
|
<!-- 中间:设计画布 -->
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-card shadow="hover" class="canvas-panel">
|
<el-card class="canvas-panel" shadow="hover">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<span>设计画布</span>
|
<span>设计画布</span>
|
||||||
@@ -36,24 +36,24 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<div class="question-title-area">
|
<div class="question-title-area">
|
||||||
<el-input maxlength="20" show-word-limit v-model.trim="form.title" placeholder="请输入问卷标题" class="title-input" />
|
<el-input v-model.trim="form.title" class="title-input" maxlength="20" placeholder="请输入问卷标题" show-word-limit />
|
||||||
<el-input maxlength="200" show-word-limit v-model.trim="form.description" type="textarea" placeholder="请输入问卷描述(选填)" />
|
<el-input v-model.trim="form.description" maxlength="200" placeholder="请输入问卷描述(选填)" show-word-limit type="textarea" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<draggable v-model="form.content" group="components" item-key="cid" class="question-list" @add="handleAddQuestion">
|
<draggable v-model="form.content" class="question-list" group="components" item-key="cid" @add="handleAddQuestion">
|
||||||
<template #item="{ element, index }">
|
<template #item="{ element, index }">
|
||||||
<div class="question-item" :class="{ 'is-active': activeIndex === index }" @click="selectQuestion(index)">
|
<div :class="{ 'is-active': activeIndex === index }" class="question-item" @click="selectQuestion(index)">
|
||||||
<div class="question-handle">
|
<div class="question-handle">
|
||||||
<el-icon><Rank /></el-icon>
|
<el-icon><Rank /></el-icon>
|
||||||
</div>
|
</div>
|
||||||
<div class="question-content">
|
<div class="question-content">
|
||||||
<el-tag size="small" type="success" class="question-type-tag">
|
<el-tag class="question-type-tag" size="small" type="success">
|
||||||
{{ getComponentLabel(element.type) }}
|
{{ getComponentLabel(element.type) }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
<span>Q{{ index + 1 }}. {{ element.title || '未命名题目' }}</span>
|
<span>Q{{ index + 1 }}. {{ element.title || '未命名题目' }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="question-actions">
|
<div class="question-actions">
|
||||||
<el-button link type="danger" :icon="Delete" @click.stop="deleteQuestion(index)"> 删除 </el-button>
|
<el-button :icon="Delete" link type="danger" @click.stop="deleteQuestion(index)"> 删除 </el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -63,16 +63,16 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
|
|
||||||
<!-- 右侧:属性配置 -->
|
<!-- 右侧:属性配置 -->
|
||||||
<el-col style="position: sticky; top: 60px" :span="8">
|
<el-col :span="8" style="position: sticky; top: 60px">
|
||||||
<el-card shadow="hover" class="property-panel sticky-card" v-if="activeQuestion">
|
<el-card v-if="activeQuestion" class="property-panel sticky-card" shadow="hover">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<span>属性配置</span>
|
<span>属性配置</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<el-form :rules="rules" :model="activeQuestion" style="position: sticky; top: 60px" label-width="80px">
|
<el-form :model="activeQuestion" :rules="rules" label-width="80px" style="position: sticky; top: 60px">
|
||||||
<el-form-item label="题目标题" prop="title">
|
<el-form-item label="题目标题" prop="title">
|
||||||
<el-input maxlength="50" v-model.trim="activeQuestion.title" placeholder="请输入题目标题" />
|
<el-input v-model.trim="activeQuestion.title" maxlength="50" placeholder="请输入题目标题" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="是否必填">
|
<el-form-item label="是否必填">
|
||||||
<el-switch v-model.trim="activeQuestion.required" />
|
<el-switch v-model.trim="activeQuestion.required" />
|
||||||
@@ -82,18 +82,19 @@
|
|||||||
<el-divider content-position="left">选项设置</el-divider>
|
<el-divider content-position="left">选项设置</el-divider>
|
||||||
<div v-for="(opt, idx) in activeQuestion.options" :key="idx" class="option-item">
|
<div v-for="(opt, idx) in activeQuestion.options" :key="idx" class="option-item">
|
||||||
<el-input
|
<el-input
|
||||||
maxlength="20"
|
|
||||||
v-model.trim="opt.label"
|
v-model.trim="opt.label"
|
||||||
|
:class="{ 'is-duplicate': isOptionDuplicate(idx) }"
|
||||||
|
maxlength="20"
|
||||||
placeholder="选项内容"
|
placeholder="选项内容"
|
||||||
style="width: 200px; margin-right: 10px; margin-bottom: 10px"
|
style="width: 200px; margin-right: 10px; margin-bottom: 10px"
|
||||||
|
@blur="handleOptionBlur(idx)"
|
||||||
/>
|
/>
|
||||||
<el-button link type="danger" v-if="activeQuestion.options.length > 2" :icon="Delete" @click="activeQuestion.options.splice(idx, 1)">
|
<span v-if="isOptionDuplicate(idx)" class="duplicate-tip">选项重复</span>
|
||||||
|
<el-button v-if="activeQuestion.options.length > 2" :icon="Delete" link type="danger" @click="activeQuestion.options.splice(idx, 1)">
|
||||||
删除
|
删除
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-button type="primary" @click="activeQuestion.options.push({ label: '选项' + (activeQuestion.options.length + 1) })">
|
<el-button type="primary" @click="addOption">添加选项</el-button>
|
||||||
添加选项
|
|
||||||
</el-button>
|
|
||||||
</template>
|
</template>
|
||||||
</el-form>
|
</el-form>
|
||||||
</el-card>
|
</el-card>
|
||||||
@@ -110,11 +111,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts" name="QuestionnaireEdit">
|
<script lang="ts" name="QuestionnaireEdit" setup>
|
||||||
import draggable from 'vuedraggable';
|
import draggable from 'vuedraggable';
|
||||||
import { Delete, Rank, Tickets, Document, Edit } from '@element-plus/icons-vue';
|
import { Delete, Rank, Tickets, Document, Edit } from '@element-plus/icons-vue';
|
||||||
import { ComponentItem, QuestionComponentItem, QuestionComponentnaireForm } from '@/api/system/Questionnaire/type';
|
import { ComponentItem, QuestionComponentItem, QuestionComponentnaireForm } from '@/api/system/Questionnaire/type';
|
||||||
import { ElMessage } from 'element-plus'; // 👈 补充引入
|
import { ElMessage } from 'element-plus';
|
||||||
|
import { markRaw } from 'vue';
|
||||||
|
|
||||||
// ==================== Props & Emit ====================
|
// ==================== Props & Emit ====================
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
/** 初始问卷数据(编辑时传入) */
|
/** 初始问卷数据(编辑时传入) */
|
||||||
@@ -129,7 +132,7 @@ const emit = defineEmits<{
|
|||||||
/** 发布问卷 */
|
/** 发布问卷 */
|
||||||
publish: [data: QuestionComponentnaireForm];
|
publish: [data: QuestionComponentnaireForm];
|
||||||
}>();
|
}>();
|
||||||
import { markRaw } from 'vue'; // 👈 引入 markRaw
|
|
||||||
// ==================== 响应式数据 ====================
|
// ==================== 响应式数据 ====================
|
||||||
const componentList = ref<ComponentItem[]>([
|
const componentList = ref<ComponentItem[]>([
|
||||||
{ type: 'radio', label: '单选题', icon: markRaw(Tickets) },
|
{ type: 'radio', label: '单选题', icon: markRaw(Tickets) },
|
||||||
@@ -157,6 +160,46 @@ const activeQuestion = computed<QuestionComponentItem | null>(() => {
|
|||||||
return form.value.content[activeIndex.value];
|
return form.value.content[activeIndex.value];
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// ==================== 选项重复校验 ====================
|
||||||
|
/** 判断指定选项是否与其他选项内容重复(同一题内,trim 后比对) */
|
||||||
|
function isOptionDuplicate(idx: number): boolean {
|
||||||
|
const options = activeQuestion.value?.options;
|
||||||
|
if (!options) return false;
|
||||||
|
const label = options[idx]?.label?.trim();
|
||||||
|
if (!label) return false;
|
||||||
|
return options.some((opt, i) => i !== idx && opt.label?.trim() === label);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 选项失焦时弹提示 */
|
||||||
|
function handleOptionBlur(idx: number): void {
|
||||||
|
if (isOptionDuplicate(idx)) {
|
||||||
|
ElMessage.warning('选项内容不能重复');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加选项:智能生成不冲突的默认名称(避免重名) */
|
||||||
|
function addOption(): void {
|
||||||
|
const options = activeQuestion.value!.options;
|
||||||
|
let nextIndex = options.length + 1;
|
||||||
|
while (options.some((opt) => opt.label === '选项' + nextIndex)) {
|
||||||
|
nextIndex++;
|
||||||
|
}
|
||||||
|
options.push({ label: '选项' + nextIndex });
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 遍历所有题目,校验选项是否重复;有重复返回错误信息,否则返回空串 */
|
||||||
|
function validateAllOptions(): string {
|
||||||
|
for (const q of form.value.content) {
|
||||||
|
if (q.type === 'radio' || q.type === 'checkbox') {
|
||||||
|
const labels = q.options.map((o) => o.label?.trim()).filter(Boolean);
|
||||||
|
if (new Set(labels).size !== labels.length) {
|
||||||
|
return `题目「${q.title || '未命名题目'}」存在重复选项`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
// ==================== 辅助方法 ====================
|
// ==================== 辅助方法 ====================
|
||||||
function getComponentLabel(type: string): string {
|
function getComponentLabel(type: string): string {
|
||||||
const item = componentList.value.find((c) => c.type === type);
|
const item = componentList.value.find((c) => c.type === type);
|
||||||
@@ -166,7 +209,7 @@ function getComponentLabel(type: string): string {
|
|||||||
// 克隆组件(用于从左侧拖入中间)
|
// 克隆组件(用于从左侧拖入中间)
|
||||||
function cloneComponent(component: ComponentItem): QuestionComponentItem {
|
function cloneComponent(component: ComponentItem): QuestionComponentItem {
|
||||||
return {
|
return {
|
||||||
cid: Date.now(), // 生成唯一ID
|
cid: Date.now(),
|
||||||
type: component.type,
|
type: component.type,
|
||||||
title: '',
|
title: '',
|
||||||
required: true,
|
required: true,
|
||||||
@@ -181,7 +224,6 @@ function selectQuestion(index: number): void {
|
|||||||
|
|
||||||
// 添加题目后的处理
|
// 添加题目后的处理
|
||||||
function handleAddQuestion(evt: any): void {
|
function handleAddQuestion(evt: any): void {
|
||||||
// 自动选中新添加的题目
|
|
||||||
activeIndex.value = evt.newIndex;
|
activeIndex.value = evt.newIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,15 +240,19 @@ function deleteQuestion(index: number): void {
|
|||||||
// ==================== 业务方法 ====================
|
// ==================== 业务方法 ====================
|
||||||
/** 表单验证 */
|
/** 表单验证 */
|
||||||
function validateForm(): boolean {
|
function validateForm(): boolean {
|
||||||
// 验证问卷标题
|
|
||||||
if (!form.value.title.trim()) {
|
if (!form.value.title.trim()) {
|
||||||
ElMessage.error('请输入问卷标题');
|
ElMessage.error('请输入问卷标题');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (form.value.content.some((item) => item.title === '')) {
|
if (form.value.content.some((item) => !item.title?.trim())) {
|
||||||
ElMessage.error('请填写所有题目标题');
|
ElMessage.error('请填写所有题目标题');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
const duplicateMsg = validateAllOptions();
|
||||||
|
if (duplicateMsg) {
|
||||||
|
ElMessage.error(duplicateMsg);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,7 +283,6 @@ function init(data: Partial<QuestionComponentnaireForm>): void {
|
|||||||
...data
|
...data
|
||||||
};
|
};
|
||||||
|
|
||||||
// 处理content字符串转对象(如果是从数据库取的)
|
|
||||||
if (typeof form.value.content === 'string') {
|
if (typeof form.value.content === 'string') {
|
||||||
try {
|
try {
|
||||||
form.value.content = JSON.parse(form.value.content);
|
form.value.content = JSON.parse(form.value.content);
|
||||||
@@ -262,7 +307,6 @@ function reset(): void {
|
|||||||
|
|
||||||
// ==================== 生命周期 ====================
|
// ==================== 生命周期 ====================
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 如果传入了初始数据,自动初始化
|
|
||||||
if (props.initialData) {
|
if (props.initialData) {
|
||||||
init(props.initialData);
|
init(props.initialData);
|
||||||
}
|
}
|
||||||
@@ -272,7 +316,7 @@ onMounted(() => {
|
|||||||
defineExpose({ init, reset });
|
defineExpose({ init, reset });
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.edit-container {
|
.edit-container {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
@@ -333,8 +377,27 @@ defineExpose({ init, reset });
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.canvas-panel {
|
.canvas-panel {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.option-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
.is-duplicate {
|
||||||
|
:deep(.el-input__wrapper) {
|
||||||
|
box-shadow: 0 0 0 1px #f56c6c inset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.duplicate-tip {
|
||||||
|
color: #f56c6c;
|
||||||
|
font-size: 12px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.footer-actions {
|
.footer-actions {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<el-row>
|
<el-row>
|
||||||
<el-col v-if="type === 'private'" :span="11">
|
<el-col v-if="type === 'private'" :span="11">
|
||||||
<el-form-item label="关联房屋" prop="houseId">
|
<el-form-item label="关联房屋" prop="houseId">
|
||||||
<el-cascader v-model="form.houseId" :options="treedata" @change="handleChangeHouse" />
|
<el-cascader v-model="form.houseId" :options="treeData" @change="handleChangeHouse" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col v-if="type === 'private'" :span="2"></el-col>
|
<el-col v-if="type === 'private'" :span="2"></el-col>
|
||||||
@@ -126,7 +126,7 @@ import { Plus } from '@element-plus/icons-vue';
|
|||||||
import { RepairProjectVO } from '@/api/system/RepairProject/type';
|
import { RepairProjectVO } from '@/api/system/RepairProject/type';
|
||||||
|
|
||||||
const houseStore = useHouseStore();
|
const houseStore = useHouseStore();
|
||||||
const { treedata } = storeToRefs(houseStore);
|
const treeData = ref([]);
|
||||||
const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/repair/uploadImages';
|
const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/repair/uploadImages';
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -176,6 +176,9 @@ function init() {
|
|||||||
const obj = {
|
const obj = {
|
||||||
projectType: type.value === 'private' ? '1' : '0'
|
projectType: type.value === 'private' ? '1' : '0'
|
||||||
};
|
};
|
||||||
|
houseStore.getCurrentVilageTreeHouse().then((res) => {
|
||||||
|
treeData.value = res;
|
||||||
|
});
|
||||||
gettreelistRepairProject(obj).then((res) => {
|
gettreelistRepairProject(obj).then((res) => {
|
||||||
maintenanceItemTreeData.value = handleTreeDisable(res.data);
|
maintenanceItemTreeData.value = handleTreeDisable(res.data);
|
||||||
if (route.query.id) {
|
if (route.query.id) {
|
||||||
@@ -256,9 +259,11 @@ function handleChange(pop) {
|
|||||||
holderInfo.value = pop;
|
holderInfo.value = pop;
|
||||||
form.value.residentId = '';
|
form.value.residentId = '';
|
||||||
form.value.residentName = '';
|
form.value.residentName = '';
|
||||||
|
form.value.phone = null;
|
||||||
if (pop !== null) {
|
if (pop !== null) {
|
||||||
form.value.residentId = holderInfo.value.id;
|
form.value.residentId = holderInfo.value.id;
|
||||||
form.value.residentName = holderInfo.value.name;
|
form.value.residentName = holderInfo.value.name;
|
||||||
|
form.value.phone = holderInfo.value.phone;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="ResidentMainBox p-2 w-full">
|
<div class="ResidentMainBox p-2 w-full">
|
||||||
<PageHeader title="报修详情"></PageHeader>
|
<PageHeader title="报修详情"></PageHeader>
|
||||||
<div class="ResidentMainBody">
|
<div class="ResidentMainBody">
|
||||||
<el-row :span="24" :gutter="20">
|
<el-row :gutter="20" :span="24">
|
||||||
<el-col :span="16">
|
<el-col :span="16">
|
||||||
<!-- 车位信息 -->
|
<!-- 车位信息 -->
|
||||||
<div class="mb-10">
|
<div class="mb-10">
|
||||||
@@ -69,20 +69,20 @@
|
|||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<div class="carInfo_Item">
|
<div class="carInfo_Item">
|
||||||
<div class="label">附件:</div>
|
<div class="label">附件:</div>
|
||||||
<div class="main fileImagebox" v-if="form.problemImageUrlList.length > 0">
|
<div v-if="form.problemImageUrlList.length > 0" class="main fileImagebox">
|
||||||
<el-image
|
<el-image
|
||||||
:preview-teleported="true"
|
v-for="(item, index) in form.problemImageUrlList"
|
||||||
:zoom-rate="1.2"
|
:key="index"
|
||||||
|
:initial-index="index"
|
||||||
:max-scale="7"
|
:max-scale="7"
|
||||||
:min-scale="0.2"
|
:min-scale="0.2"
|
||||||
:preview-src-list="form.problemImageUrlList"
|
:preview-src-list="form.problemImageUrlList"
|
||||||
show-progress
|
:preview-teleported="true"
|
||||||
v-for="(item, index) in form.problemImageUrlList"
|
|
||||||
:initial-index="index"
|
|
||||||
:key="index"
|
|
||||||
:src="item"
|
:src="item"
|
||||||
lazy
|
:zoom-rate="1.2"
|
||||||
class="carInfoImage"
|
class="carInfoImage"
|
||||||
|
lazy
|
||||||
|
show-progress
|
||||||
></el-image>
|
></el-image>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -100,10 +100,10 @@
|
|||||||
<div class="repair w-full h-full flex flex-items-start mt-2">
|
<div class="repair w-full h-full flex flex-items-start mt-2">
|
||||||
<div class="title">维修师傅</div>
|
<div class="title">维修师傅</div>
|
||||||
<div class="preivewBodybox flex-1 ml-5">
|
<div class="preivewBodybox flex-1 ml-5">
|
||||||
<repairUser :is-multiple="false" :username="form.repairName" :userid="form.repairUserId" @change="handleChange"> </repairUser>
|
<repairUser :is-multiple="false" :userid="form.repairUserId" :username="form.repairName" @change="handleChange"> </repairUser>
|
||||||
<div class="actions mt-5">
|
<div class="actions mt-5">
|
||||||
<el-button v-if="form.problemStatus === '0'" @click="handleSend" type="primary">确定派单</el-button>
|
<el-button v-if="form.problemStatus === '0'" type="primary" @click="handleSend">确定派单</el-button>
|
||||||
<el-button v-if="form.problemStatus === '1'" @click="handleChangeRepairUser" type="primary">变更人员</el-button>
|
<el-button v-if="form.problemStatus === '1'" type="primary" @click="handleChangeRepairUser">变更人员</el-button>
|
||||||
<el-button @click="backRouter">返回</el-button>
|
<el-button @click="backRouter">返回</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import StepTimeline, { StepItem } from '@/components/StepTimeline/index.vue';
|
import StepTimeline, { StepItem } from '@/components/StepTimeline/index.vue';
|
||||||
import repairUser from '@/components/Holder/repairUser.vue';
|
import repairUser from '@/components/Holder/repairUser.vue';
|
||||||
@@ -222,7 +222,7 @@ async function init() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理审核╬╬
|
// 处理审核
|
||||||
function handleReview() {
|
function handleReview() {
|
||||||
if (reviewInfo.value.submitStatus === '1') {
|
if (reviewInfo.value.submitStatus === '1') {
|
||||||
// 提交完成
|
// 提交完成
|
||||||
@@ -315,7 +315,7 @@ function handleEdit() {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.ResidentMainBox {
|
.ResidentMainBox {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|||||||
@@ -4,49 +4,47 @@
|
|||||||
<div class="AddBuildingBody">
|
<div class="AddBuildingBody">
|
||||||
<div class="title">基本信息</div>
|
<div class="title">基本信息</div>
|
||||||
<div class="addBuildingFormBody">
|
<div class="addBuildingFormBody">
|
||||||
<el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
|
<el-form ref="formRef" :model="form" :rules="rules" class="formBody" label-position="right" label-width="130px">
|
||||||
<el-form-item label="项目名称" prop="itemName">
|
<el-form-item label="项目名称" prop="itemName">
|
||||||
<el-input maxlength="20" v-model.trim="form.itemName" placeholder="请输入项目名称" />
|
<el-input v-model.trim="form.itemName" maxlength="20" placeholder="请输入项目名称" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="收费类型" prop="typeId">
|
<el-form-item label="收费类型" prop="typeId">
|
||||||
<el-select v-model="form.typeId">
|
<el-select v-model="form.typeId">
|
||||||
<el-option
|
<el-option
|
||||||
:disabled="item.status === '1'"
|
|
||||||
v-for="(item, index) in chargeItemList"
|
v-for="(item, index) in chargeItemList"
|
||||||
:key="index"
|
:key="index"
|
||||||
:value="item.id"
|
:disabled="item.status === '1'"
|
||||||
:label="item.name"
|
:label="item.name"
|
||||||
|
:value="item.id"
|
||||||
></el-option>
|
></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="计费方式" prop="billingType">
|
<el-form-item label="计费方式" prop="billingType">
|
||||||
<el-radio-group v-model="form.billingType">
|
<el-radio-group v-model="form.billingType">
|
||||||
<el-radio v-for="(item, index) in com_charge_item_method" :key="index" :value="item.value" :label="item.label"></el-radio>
|
<el-radio v-for="(item, index) in com_charge_item_method" :key="index" :label="item.label" :value="item.value"></el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="计算公式" prop="formula">
|
<el-form-item label="计算公式" prop="formula">
|
||||||
<el-select
|
<el-select v-model="form.formula">
|
||||||
v-model="form.formula"
|
<el-option v-for="(item, index) in com_charge_item_formula" :key="index" :label="item.label" :value="item.value"></el-option>
|
||||||
>
|
|
||||||
<el-option v-for="(item, index) in com_charge_item_formula" :key="index" :value="item.value" :label="item.label"></el-option>
|
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="计量单位" prop="unit" v-if="form.formula !== '2'">
|
<el-form-item v-if="form.formula !== '2'" label="计量单位" prop="unit">
|
||||||
<el-select v-model="form.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-option v-for="(item, index) in com_charge_item_unit" :key="index" :label="item.label" :value="item.value"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="费用单价">
|
<el-form-item label="费用单价">
|
||||||
<el-input maxlength="10" v-model.trim.number="form.fixedPrice" :placeholder="placeHolderFun(form.typeId)" />
|
<el-input v-model.trim.number="form.fixedPrice" :placeholder="placeHolderFun(form.typeId)" maxlength="10" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="计算精度" prop="accuracy">
|
<el-form-item label="计算精度" prop="accuracy">
|
||||||
<el-select v-model="form.accuracy">
|
<el-select v-model="form.accuracy">
|
||||||
<el-option v-for="(item, index) in com_charge_item_precision" :key="index" :value="item.value" :label="item.label"></el-option>
|
<el-option v-for="(item, index) in com_charge_item_precision" :key="index" :label="item.label" :value="item.value"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="进位方式" prop="carryMethod">
|
<el-form-item label="进位方式" prop="carryMethod">
|
||||||
<el-select v-model="form.carryMethod">
|
<el-select v-model="form.carryMethod">
|
||||||
<el-option v-for="(item, index) in com_charge_item_carry_method" :key="index" :value="item.value" :label="item.label"></el-option>
|
<el-option v-for="(item, index) in com_charge_item_carry_method" :key="index" :label="item.label" :value="item.value"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- <el-form-item label="启用/停用" prop="status">
|
<!-- <el-form-item label="启用/停用" prop="status">
|
||||||
@@ -56,7 +54,7 @@
|
|||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item> -->
|
</el-form-item> -->
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
<el-input type="textarea" maxlength="200" show-word-limit :rows="5" v-model.trim="form.remark" placeholder="请输入" />
|
<el-input v-model.trim="form.remark" :rows="5" maxlength="200" placeholder="请输入" show-word-limit type="textarea" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="margin-top: 30px">
|
<el-form-item style="margin-top: 30px">
|
||||||
<el-button type="primary" @click="submitForm">提交</el-button>
|
<el-button type="primary" @click="submitForm">提交</el-button>
|
||||||
@@ -68,7 +66,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { getChargeItem, updateChargeItem, addChargeItem } from '@/api/system/SdbChargeItem';
|
import { getChargeItem, updateChargeItem, addChargeItem } from '@/api/system/SdbChargeItem';
|
||||||
@@ -103,11 +101,16 @@ const rules = ref({
|
|||||||
{ required: true, message: '请输入 项目名称', trigger: 'blur' },
|
{ required: true, message: '请输入 项目名称', trigger: 'blur' },
|
||||||
{
|
{
|
||||||
validator: (_: any, value: string | number, callback: (arg0?: Error) => any) => {
|
validator: (_: any, value: string | number, callback: (arg0?: Error) => any) => {
|
||||||
if (value === '' || value === undefined) {
|
if (value === null || value === undefined || value === '') {
|
||||||
return callback(new Error('请输入项目名称'));
|
return callback(new Error('请输入项目名称'));
|
||||||
}
|
}
|
||||||
return !validator(value, 'fullFilterReg') ? callback() : callback(new Error('请输入正确的项目名称'));
|
const strVal = String(value).trim();
|
||||||
|
if (validator(strVal, 'fullFilterReg')) {
|
||||||
|
return callback(new Error('请输入正确的项目名称'));
|
||||||
}
|
}
|
||||||
|
callback();
|
||||||
|
},
|
||||||
|
trigger: ['blur', 'change']
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
typeId: [{ required: true, message: '请选择 收费类型', trigger: 'blur' }],
|
typeId: [{ required: true, message: '请选择 收费类型', trigger: 'blur' }],
|
||||||
@@ -153,7 +156,7 @@ if (route.query.id) {
|
|||||||
}
|
}
|
||||||
// !== 提交 =============================================================================
|
// !== 提交 =============================================================================
|
||||||
// 提交
|
// 提交
|
||||||
const submitForm = () => {
|
const submitForm = async () => {
|
||||||
if (form.value.formula === '2') {
|
if (form.value.formula === '2') {
|
||||||
form.value.unit = '';
|
form.value.unit = '';
|
||||||
}
|
}
|
||||||
@@ -185,7 +188,7 @@ function placeHolderFun(typeId: string) {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.AddBuildingBox {
|
.AddBuildingBox {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -642,7 +642,7 @@ const resetQuery = () => {
|
|||||||
payTime: undefined,
|
payTime: undefined,
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 20,
|
pageSize: 20,
|
||||||
payStatus: null,
|
payStatus: queryParams.value.payStatus,
|
||||||
villageId: undefined,
|
villageId: undefined,
|
||||||
buildingId: undefined,
|
buildingId: undefined,
|
||||||
unitNoId: undefined,
|
unitNoId: undefined,
|
||||||
|
|||||||
@@ -329,7 +329,7 @@ const submitForm = () => {
|
|||||||
// 有 公摊面积 / 房屋面积
|
// 有 公摊面积 / 房屋面积
|
||||||
if (shareArea || internalArea) {
|
if (shareArea || internalArea) {
|
||||||
if (shareArea + internalArea !== Number(form.value.houseArea)) {
|
if (shareArea + internalArea !== Number(form.value.houseArea)) {
|
||||||
return ElMessage.warning('您填写的【套内面积】+【公摊面积】计算结果,和【建筑面积】不相等');
|
return ElMessage.warning('填写的【套内面积】+【公摊面积】计算结果,和【建筑面积】不相等');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
formRef.value?.validate(async (valid: boolean) => {
|
formRef.value?.validate(async (valid: boolean) => {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="UnitBox">
|
<div class="UnitBox">
|
||||||
<div class="Unit_top flex align-center justify-between">
|
<div class="Unit_top flex align-center justify-between flex-wrap">
|
||||||
<div style="text-wrap: nowrap">
|
<div style="text-wrap: wrap">
|
||||||
<span class="text-size-16px text-color-black text-widget-bold mr-30px">
|
<span class="text-size-16px text-color-black text-widget-bold mr-30px">
|
||||||
<strong>{{ houseStore.currentBuildingInfo?.buildingName }}</strong>
|
<strong>{{ houseStore.currentBuildingInfo?.buildingName }}</strong>
|
||||||
</span>
|
</span>
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
<span v-has-permi="['unitNo:unitNo:add']" class="mr-20px" @click="handleAddUnit">+添加单元</span>
|
<span v-has-permi="['unitNo:unitNo:add']" class="mr-20px" @click="handleAddUnit">+添加单元</span>
|
||||||
<span v-has-permi="['system:house:add']" class="mr-20px" @click="handleAddHouse">+增加房屋</span>
|
<span v-has-permi="['system:house:add']" class="mr-20px" @click="handleAddHouse">+增加房屋</span>
|
||||||
<!-- <span class="mr-20px">收费标准设置</span> -->
|
<!-- <span class="mr-20px">收费标准设置</span> -->
|
||||||
<span v-has-permi="['system:house:remove']" @click="deleteAllhouse">批量删除房屋</span>
|
<span v-has-permi="['system:house:remove']" @click="deleteAllHouse">批量删除房屋</span>
|
||||||
<el-select v-model="houseUse" class="selectbox" clearable placeholder="筛选房屋类型" @change="handleChangeUse" @clear="handleClearUse">
|
<el-select v-model="houseUse" class="selectbox" clearable placeholder="筛选房屋类型" @change="handleChangeUse" @clear="handleClearUse">
|
||||||
<el-option v-for="item in houseUseTypeList" :key="item.id" :label="item.name" :value="item.id" />
|
<el-option v-for="item in houseUseTypeList" :key="item.id" :label="item.name" :value="item.id" />
|
||||||
</el-select>
|
</el-select>
|
||||||
@@ -200,7 +200,7 @@ function reset() {
|
|||||||
houseStore.getHouseBybuildingNo(housename.value, houseUse.value);
|
houseStore.getHouseBybuildingNo(housename.value, houseUse.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function deleteAllhouse() {
|
async function deleteAllHouse() {
|
||||||
await proxy?.$modal.confirm('该信息删除后无法恢复,确定要删除吗?');
|
await proxy?.$modal.confirm('该信息删除后无法恢复,确定要删除吗?');
|
||||||
const checkhouse = houseStore.checkoutHouses;
|
const checkhouse = houseStore.checkoutHouses;
|
||||||
if (checkhouse.length > 0) {
|
if (checkhouse.length > 0) {
|
||||||
@@ -229,12 +229,16 @@ $primary_color: #1978fe;
|
|||||||
min-height: 0;
|
min-height: 0;
|
||||||
|
|
||||||
.Unit_top {
|
.Unit_top {
|
||||||
padding: 20px;
|
padding: 20px 20px 0;
|
||||||
height: 60px;
|
flex-wrap: wrap;
|
||||||
|
box-sizing: border-box;
|
||||||
color: rgba(102, 102, 102, 1);
|
color: rgba(102, 102, 102, 1);
|
||||||
|
& > div {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
.rightActions {
|
.rightActions {
|
||||||
color: $primary_color;
|
color: $primary_color;
|
||||||
height: 35px;
|
height: 25px;
|
||||||
span {
|
span {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
@@ -245,17 +249,17 @@ $primary_color: #1978fe;
|
|||||||
width: 120px;
|
width: 120px;
|
||||||
}
|
}
|
||||||
@media (max-width: 1400px) {
|
@media (max-width: 1400px) {
|
||||||
width: 80px;
|
width: 100px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.searchbox {
|
s .searchbox {
|
||||||
.searchinput {
|
.searchinput {
|
||||||
width: 250px;
|
width: 250px;
|
||||||
@media (max-width: 1550px) {
|
@media (max-width: 1550px) {
|
||||||
width: 130px;
|
width: 130px;
|
||||||
}
|
}
|
||||||
@media (max-width: 1400px) {
|
@media (max-width: 1400px) {
|
||||||
width: 50px;
|
width: 80px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,6 +117,7 @@
|
|||||||
<el-form-item label="租赁起始日" prop="leaseStartDate">
|
<el-form-item label="租赁起始日" prop="leaseStartDate">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model.trim="form.leaseStartDate"
|
v-model.trim="form.leaseStartDate"
|
||||||
|
:disabled-date="disabledStartDate"
|
||||||
format="YYYY-MM-DD"
|
format="YYYY-MM-DD"
|
||||||
placeholder="请选择租赁起始日"
|
placeholder="请选择租赁起始日"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
@@ -127,6 +128,7 @@
|
|||||||
<el-form-item label="租赁终止日" prop="leaseEndDate">
|
<el-form-item label="租赁终止日" prop="leaseEndDate">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model.trim="form.leaseEndDate"
|
v-model.trim="form.leaseEndDate"
|
||||||
|
:disabled-date="disabledEndDate"
|
||||||
format="YYYY-MM-DD"
|
format="YYYY-MM-DD"
|
||||||
placeholder="请选择租赁终止日"
|
placeholder="请选择租赁终止日"
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
@@ -306,6 +308,33 @@ const data = reactive<PageData<HouseRentalFormType, HouseRentalQuery>>({
|
|||||||
|
|
||||||
const { queryParams, form, rules } = toRefs(data);
|
const { queryParams, form, rules } = toRefs(data);
|
||||||
|
|
||||||
|
/** 获取今日零点时间戳 */
|
||||||
|
const todayStart = new Date();
|
||||||
|
todayStart.setHours(0, 0, 0, 0);
|
||||||
|
const TODAY = todayStart.getTime();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 起始日禁用规则:
|
||||||
|
* 1. 今日之前不可选
|
||||||
|
* 2. 若已选结束日,则结束日之后不可选
|
||||||
|
*/
|
||||||
|
function disabledStartDate(date: Date): boolean {
|
||||||
|
if (date.getTime() < TODAY) return true;
|
||||||
|
if (!form.value.leaseEndDate) return false;
|
||||||
|
return date.getTime() > new Date(form.value.leaseEndDate).getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束日禁用规则:
|
||||||
|
* 1. 今日之前不可选
|
||||||
|
* 2. 若已选起始日,则起始日之前不可选
|
||||||
|
*/
|
||||||
|
function disabledEndDate(date: Date): boolean {
|
||||||
|
if (date.getTime() < TODAY) return true;
|
||||||
|
if (!form.value.leaseStartDate) return false;
|
||||||
|
return date.getTime() < new Date(form.value.leaseStartDate).getTime();
|
||||||
|
}
|
||||||
|
|
||||||
/** 查询房屋租赁管理列表 */
|
/** 查询房屋租赁管理列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
@@ -455,6 +484,12 @@ const handleExceed = () => {
|
|||||||
ElMessage.warning(`最多只能上传 ${MAX_UPLOAD_FILES} 个附件`);
|
ElMessage.warning(`最多只能上传 ${MAX_UPLOAD_FILES} 个附件`);
|
||||||
};
|
};
|
||||||
const handleChange = (file: UploadUserFile) => {
|
const handleChange = (file: UploadUserFile) => {
|
||||||
|
// 过滤上传文件-只允许图片,pdf格式
|
||||||
|
if (!/^\.(jpg|jpeg|png|gif|pdf)$/i.test(file.name)) {
|
||||||
|
ElMessage.warning('只允许上传图片,pdf格式');
|
||||||
|
uploadRef.value?.handleRemove(file);
|
||||||
|
return;
|
||||||
|
}
|
||||||
// 实时判断当前已存在图片总数
|
// 实时判断当前已存在图片总数
|
||||||
if (showImgList.value.length > MAX_UPLOAD_FILES) {
|
if (showImgList.value.length > MAX_UPLOAD_FILES) {
|
||||||
ElMessage.warning(`最多上传${MAX_UPLOAD_FILES}个附件,无法继续添加`);
|
ElMessage.warning(`最多上传${MAX_UPLOAD_FILES}个附件,无法继续添加`);
|
||||||
@@ -463,6 +498,7 @@ const handleChange = (file: UploadUserFile) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 批量上传校验图片数量,前后端数量匹配校验
|
// 批量上传校验图片数量,前后端数量匹配校验
|
||||||
const uploadAllCarousel = async () => {
|
const uploadAllCarousel = async () => {
|
||||||
const filterArr = showImgList.value.filter((item) => {
|
const filterArr = showImgList.value.filter((item) => {
|
||||||
|
|||||||
@@ -28,22 +28,19 @@
|
|||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
|
||||||
<span style="font-size: 1.2rem">日报列表</span>
|
<span style="font-size: 1.2rem">日报列表</span>
|
||||||
</el-col>
|
<div>
|
||||||
<el-col :span="14"></el-col>
|
|
||||||
<el-col :span="5" style="text-align: right">
|
|
||||||
<el-button type="primary" @click="exportChecked">导出选中</el-button>
|
<el-button type="primary" @click="exportChecked">导出选中</el-button>
|
||||||
<el-button type="primary" @click="exportCurrentPage">导出当前页</el-button>
|
<el-button type="primary" @click="exportCurrentPage">导出当前页</el-button>
|
||||||
<el-button type="primary" @click="exportAll">导出所有</el-button>
|
<el-button type="primary" @click="exportAll">导出所有</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<el-table v-loading="loading" :data="itemList" border row-key="id" @selectionChange="handleChange">
|
<el-table v-loading="loading" :data="itemList" border row-key="id" @selectionChange="handleChange">
|
||||||
<el-table-column type="selection" width="55" />
|
<el-table-column type="selection" width="55" />
|
||||||
<el-table-column align="center" label="日期" prop="statDate" width="100" />
|
<el-table-column align="center" label="日期" prop="statDate" width="100" />
|
||||||
<el-table-column align="center" label="计划巡检任务" prop="totalPlans" width="120" />
|
<el-table-column align="center" label="计划巡检任务" prop="totalTasks" width="120" />
|
||||||
<el-table-column align="center" label="按时完成" prop="completedTasks" />
|
<el-table-column align="center" label="按时完成" prop="completedTasks" />
|
||||||
<el-table-column align="center" label="超时完成" prop="outCompletedTasks" />
|
<el-table-column align="center" label="超时完成" prop="outCompletedTasks" />
|
||||||
<el-table-column align="center" label="超时未完成" prop="outUncompletedTasks" />
|
<el-table-column align="center" label="超时未完成" prop="outUncompletedTasks" />
|
||||||
|
|||||||
@@ -28,23 +28,20 @@
|
|||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
|
||||||
<span style="font-size: 1.2rem">月报列表</span>
|
<span style="font-size: 1.2rem">月报列表</span>
|
||||||
</el-col>
|
<div>
|
||||||
<el-col :span="14"> </el-col>
|
|
||||||
<el-col :span="5" style="text-align: right">
|
|
||||||
<el-button type="primary" @click="exportCurrentPage">导出当前页</el-button>
|
<el-button type="primary" @click="exportCurrentPage">导出当前页</el-button>
|
||||||
<el-button type="primary" @click="exportAll">导出所有</el-button>
|
<el-button type="primary" @click="exportAll">导出所有</el-button>
|
||||||
<el-button type="primary" @click="exportChecked">导出选中</el-button>
|
<el-button type="primary" @click="exportChecked">导出选中</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="itemList" border @selectionChange="handleChange">
|
<el-table v-loading="loading" :data="itemList" border @selectionChange="handleChange">
|
||||||
<el-table-column type="selection" width="55" />
|
<el-table-column type="selection" width="55" />
|
||||||
<el-table-column align="center" label="日期" prop="statDate" width="100" />
|
<el-table-column align="center" label="日期" prop="statDate" width="100" />
|
||||||
<el-table-column align="center" label="计划巡检任务" prop="totalPlans" width="120" />
|
<el-table-column align="center" label="计划巡检任务" prop="totalTasks" width="120" />
|
||||||
<el-table-column align="center" label="按时完成" prop="completedTasks" />
|
<el-table-column align="center" label="按时完成" prop="completedTasks" />
|
||||||
<el-table-column align="center" label="超时完成" prop="outCompletedTasks" />
|
<el-table-column align="center" label="超时完成" prop="outCompletedTasks" />
|
||||||
<el-table-column align="center" label="超时未完成" prop="outUncompletedTasks" />
|
<el-table-column align="center" label="超时未完成" prop="outUncompletedTasks" />
|
||||||
|
|||||||
@@ -296,7 +296,7 @@ const getList = async () => {
|
|||||||
});
|
});
|
||||||
list.value[3].value = itemList.value[0].completionRateDisplay || '0%';
|
list.value[3].value = itemList.value[0].completionRateDisplay || '0%';
|
||||||
itemList.value.forEach((item) => {
|
itemList.value.forEach((item) => {
|
||||||
list.value[0].value += item.totalPlans ?? 0;
|
list.value[0].value = item.villagePlanCount ?? 0;
|
||||||
list.value[1].value += item.totalTasks ?? 0;
|
list.value[1].value += item.totalTasks ?? 0;
|
||||||
list.value[4].value += item.outUncompletedTasks ?? 0;
|
list.value[4].value += item.outUncompletedTasks ?? 0;
|
||||||
const num = item.outCompletedTasks + item.completedTasks || 0;
|
const num = item.outCompletedTasks + item.completedTasks || 0;
|
||||||
|
|||||||
@@ -71,35 +71,51 @@
|
|||||||
>
|
>
|
||||||
<el-table-column align="center" label="序号" type="index" width="85" />
|
<el-table-column align="center" label="序号" type="index" width="85" />
|
||||||
<el-table-column align="center" label="巡检点" prop="pointName" />
|
<el-table-column align="center" label="巡检点" prop="pointName" />
|
||||||
<el-table-column align="center" label=" 巡检时间" prop="checkTime" sortable />
|
<el-table-column align="center" label=" 巡检时间" prop="checkTime">
|
||||||
|
<template #default="scope">
|
||||||
|
<span v-if="scope.row.checkTime !== null">{{ scope.row.checkTime }}</span>
|
||||||
|
<span v-else>---</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column align="center" label="巡检状态" prop="status">
|
<el-table-column align="center" label="巡检状态" prop="status">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
|
<div v-if="scope.row.status !== null">
|
||||||
<el-tag v-if="scope.row.status === 0" type="success">正常</el-tag>
|
<el-tag v-if="scope.row.status === 0" type="success">正常</el-tag>
|
||||||
<el-tag v-else type="danger">异常</el-tag>
|
<el-tag v-else type="danger">异常</el-tag>
|
||||||
|
</div>
|
||||||
|
<div v-else>---</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- <el-table-column prop="location" align="center" label="巡检地址" /> -->
|
<!-- <el-table-column prop="location" align="center" label="巡检地址" /> -->
|
||||||
<el-table-column align="left" label="巡检结果" prop="remark" />
|
<el-table-column align="left" label="巡检结果" prop="remark">
|
||||||
<el-table-column label="图片">
|
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<div>
|
<div v-if="scope.row.remark !== null">
|
||||||
|
{{ scope.row.remark }}
|
||||||
|
</div>
|
||||||
|
<div v-else>---</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="图片" width="220">
|
||||||
|
<template #default="scope">
|
||||||
|
<div v-if="scope.row.photoslist" class="showImages">
|
||||||
<el-image
|
<el-image
|
||||||
v-for="(item, index) in scope.row.photoslist"
|
v-for="(item, index) in scope.row.photoslist"
|
||||||
:key="index"
|
:key="index"
|
||||||
:initial-index="0"
|
:initial-index="index"
|
||||||
:preview-src-list="scope.row.photoslist"
|
:preview-src-list="scope.row.photoslist"
|
||||||
:preview-teleported="true"
|
:preview-teleported="true"
|
||||||
:src="item"
|
:src="item"
|
||||||
fit="cover"
|
fit="cover"
|
||||||
show-progress
|
show-progress
|
||||||
style="width: 80px; height: 50px; margin-right: 10px"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else>---</div>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="left" label="执行结果" prop="completionStatus">
|
<el-table-column align="left" label="执行结果" prop="completionStatus">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<DictTag :options="com_inspection_task_status" :value="scope.row.completionStatus"></DictTag>
|
<el-tag v-if="scope.row.completionStatus === null" type="danger">未完成</el-tag>
|
||||||
|
<DictTag v-else :options="com_inspection_task_status" :value="scope.row.completionStatus"></DictTag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -273,4 +289,19 @@ const cancelForm = () => {
|
|||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.showImages {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
grid-gap: 5px;
|
||||||
|
.el-image {
|
||||||
|
width: 50px;
|
||||||
|
height: 30px;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
//display: flex;
|
||||||
|
//align-items: center;
|
||||||
|
//justify-content: center;
|
||||||
|
//flex-wrap: wrap;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -28,23 +28,20 @@
|
|||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
|
||||||
<span style="font-size: 1.2rem">周报列表</span>
|
<span style="font-size: 1.2rem">周报列表</span>
|
||||||
</el-col>
|
<div>
|
||||||
<el-col :span="14"> </el-col>
|
|
||||||
<el-col :span="5" style="text-align: right">
|
|
||||||
<el-button type="primary" @click="exportCurrentPage">导出当前页</el-button>
|
<el-button type="primary" @click="exportCurrentPage">导出当前页</el-button>
|
||||||
<el-button type="primary" @click="exportAll">导出所有</el-button>
|
<el-button type="primary" @click="exportAll">导出所有</el-button>
|
||||||
<el-button type="primary" @click="exportChecked">导出选中</el-button>
|
<el-button type="primary" @click="exportChecked">导出选中</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="itemList" border @selectionChange="handleChange">
|
<el-table v-loading="loading" :data="itemList" border @selectionChange="handleChange">
|
||||||
<el-table-column type="selection" width="55" />
|
<el-table-column type="selection" width="55" />
|
||||||
<el-table-column align="center" label="日期" prop="statDate" width="120" />
|
<el-table-column align="center" label="日期" prop="statDate" width="120" />
|
||||||
<el-table-column align="center" label="计划巡检任务" prop="totalPlans" width="120" />
|
<el-table-column align="center" label="计划巡检任务" prop="totalTasks" width="120" />
|
||||||
<el-table-column align="center" label="按时完成" prop="completedTasks" />
|
<el-table-column align="center" label="按时完成" prop="completedTasks" />
|
||||||
<el-table-column align="center" label="超时完成" prop="outCompletedTasks" />
|
<el-table-column align="center" label="超时完成" prop="outCompletedTasks" />
|
||||||
<el-table-column align="center" label="超时未完成" prop="outUncompletedTasks" />
|
<el-table-column align="center" label="超时未完成" prop="outUncompletedTasks" />
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ const rules = ref({
|
|||||||
{
|
{
|
||||||
validator: (_: any, value: string | number, callback: (arg0?: Error) => void) => {
|
validator: (_: any, value: string | number, callback: (arg0?: Error) => void) => {
|
||||||
if (value === '' || value === null) {
|
if (value === '' || value === null) {
|
||||||
return callback(new Error('请输入车位面积'));
|
return callback();
|
||||||
}
|
}
|
||||||
const val = Number(value);
|
const val = Number(value);
|
||||||
if (Number.isNaN(val)) {
|
if (Number.isNaN(val)) {
|
||||||
|
|||||||
@@ -4,19 +4,19 @@
|
|||||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||||
<div v-show="showSearch" class="mb-[10px]">
|
<div v-show="showSearch" class="mb-[10px]">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
|
||||||
<el-form-item label="车位状态" prop="parkingStatus">
|
<el-form-item label="车位状态" prop="parkingStatus">
|
||||||
<el-select v-model="queryParams.parkingStatus" placeholder="请选择" clearable>
|
<el-select v-model="queryParams.parkingStatus" clearable placeholder="请选择">
|
||||||
<el-option v-for="dict in com_parking_status" :key="dict.value" :label="dict.label" :value="dict.value" />
|
<el-option v-for="dict in com_parking_status" :key="dict.value" :label="dict.label" :value="dict.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="审核状态" prop="checkStatus">
|
<el-form-item label="审核状态" prop="checkStatus">
|
||||||
<el-select v-model="queryParams.checkStatus" placeholder="请选择" clearable>
|
<el-select v-model="queryParams.checkStatus" clearable placeholder="请选择">
|
||||||
<el-option v-for="dict in com_review" :key="dict.value" :label="dict.label" :value="dict.value" />
|
<el-option v-for="dict in com_review" :key="dict.value" :label="dict.label" :value="dict.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="车位编号" prop="parkingCode">
|
<el-form-item label="车位编号" prop="parkingCode">
|
||||||
<el-input maxlength="20" v-model="queryParams.parkingCode" placeholder="请输入车位编号" clearable @keyup.enter="handleQuery" />
|
<el-input v-model="queryParams.parkingCode" clearable maxlength="20" placeholder="请输入车位编号" @keyup.enter="handleQuery" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||||
@@ -34,8 +34,8 @@
|
|||||||
:disable-delete="multiple"
|
:disable-delete="multiple"
|
||||||
:disable-edit="single"
|
:disable-edit="single"
|
||||||
:show-add="checkPermi(['parking:parking:add'])"
|
:show-add="checkPermi(['parking:parking:add'])"
|
||||||
:show-edit="checkPermi(['parking:parking:edit'])"
|
|
||||||
:show-delete="checkPermi(['parking:parking:remove'])"
|
:show-delete="checkPermi(['parking:parking:remove'])"
|
||||||
|
:show-edit="checkPermi(['parking:parking:edit'])"
|
||||||
@update:add="handleAdd"
|
@update:add="handleAdd"
|
||||||
@update:edit="handleUpdate()"
|
@update:edit="handleUpdate()"
|
||||||
@update:delete="handleDelete()"
|
@update:delete="handleDelete()"
|
||||||
@@ -43,59 +43,61 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" border :data="parkingList" @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="parkingList" border @selection-change="handleSelectionChange">
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column label="区域" align="center" prop="areaName"> </el-table-column>
|
<el-table-column align="center" label="区域" prop="areaName"> </el-table-column>
|
||||||
<el-table-column label="车位编号" align="center" prop="parkingCode" />
|
<el-table-column align="center" label="车位编号" prop="parkingCode" />
|
||||||
<el-table-column label="车位面积" align="center" prop="parkingArea">
|
<el-table-column align="center" label="车位面积" prop="parkingArea">
|
||||||
<template #default="scope"> {{ scope.row.parkingArea }}㎡ </template>
|
<template #default="scope">
|
||||||
|
<span v-if="scope.row.parkingArea">{{ scope.row.parkingArea }} </span> <span v-if="scope.row.parkingArea">㎡</span>
|
||||||
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="楼层" width="80" align="center" prop="parkingFloor" />
|
<el-table-column align="center" label="楼层" prop="parkingFloor" width="80" />
|
||||||
<el-table-column label="车位类型" align="center" prop="type">
|
<el-table-column align="center" label="车位类型" prop="type">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<dict-tag :options="com_parking_type" :value="scope.row.type" />
|
<dict-tag :options="com_parking_type" :value="scope.row.type" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="车位状态" width="80" align="center" prop="parkingStatus">
|
<el-table-column align="center" label="车位状态" prop="parkingStatus" width="80">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<dict-tag :options="com_parking_status" :value="scope.row.parkingStatus" />
|
<dict-tag :options="com_parking_status" :value="scope.row.parkingStatus" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="持有人" align="center" prop="residentName">
|
<el-table-column align="center" label="持有人" prop="residentName">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{ scope.row.residentName ?? scope.row.contactName }}</span>
|
<span>{{ scope.row.residentName ?? scope.row.contactName }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="审核状态" align="center" prop="checkStatus">
|
<el-table-column align="center" label="审核状态" prop="checkStatus">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<dict-tag v-if="scope.row.checkStatus" :options="com_review" :value="scope.row.checkStatus" />
|
<dict-tag v-if="scope.row.checkStatus" :options="com_review" :value="scope.row.checkStatus" />
|
||||||
<span v-else>---</span>
|
<span v-else>---</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
|
<el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip />
|
||||||
<el-table-column label="操作" width="180" align="center" fixed="right" class-name="small-padding fixed-width">
|
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作" width="180">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<!-- 待审核 审核不通过 -->
|
<!-- 待审核 审核不通过 -->
|
||||||
<el-button
|
<el-button
|
||||||
|
v-if="scope.row.checkStatus === '0' || scope.row.checkStatus === '2'"
|
||||||
|
v-has-permi="['parking:parking:query']"
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
v-if="scope.row.checkStatus === '0' || scope.row.checkStatus === '2'"
|
|
||||||
@click="handleReview(scope.row)"
|
@click="handleReview(scope.row)"
|
||||||
v-has-permi="['parking:parking:query']"
|
|
||||||
>审核</el-button
|
>审核</el-button
|
||||||
>
|
>
|
||||||
<el-button link type="primary" v-else @click="handleMain(scope.row)">详情</el-button>
|
<el-button v-else link type="primary" @click="handleMain(scope.row)">详情</el-button>
|
||||||
<el-button link type="primary" @click="handleUpdate(scope.row)" v-has-permi="['parking:parking:edit']">编辑</el-button>
|
<el-button v-has-permi="['parking:parking:edit']" link type="primary" @click="handleUpdate(scope.row)">编辑</el-button>
|
||||||
<el-button link type="primary" @click="handleDelete(scope.row)" v-has-permi="['parking:parking:remove']">删除</el-button>
|
<el-button v-has-permi="['parking:parking:remove']" link type="primary" @click="handleDelete(scope.row)">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<Pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<Pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="Parking" lang="ts">
|
<script lang="ts" name="Parking" setup>
|
||||||
import pageHeader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
import Pagination from '@/components/Pagination/index.vue';
|
import Pagination from '@/components/Pagination/index.vue';
|
||||||
import RightToolbar from '@/components/RightToolbar/index.vue';
|
import RightToolbar from '@/components/RightToolbar/index.vue';
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="ResidentMainBox p-2 w-full h-full">
|
<div class="ResidentMainBox p-2 w-full h-full">
|
||||||
<PageHeader></PageHeader>
|
<PageHeader></PageHeader>
|
||||||
<div class="ResidentMainBody">
|
<div class="ResidentMainBody">
|
||||||
<el-row :span="24" :gutter="20">
|
<el-row :gutter="20" :span="24">
|
||||||
<el-col :span="16">
|
<el-col :span="16">
|
||||||
<!-- 车位信息 -->
|
<!-- 车位信息 -->
|
||||||
<div class="mb-10">
|
<div class="mb-10">
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
<DictTag :options="com_parking_status" :value="parkingReviewInfo.parking.parkingStatus"></DictTag>
|
<DictTag :options="com_parking_status" :value="parkingReviewInfo.parking.parkingStatus"></DictTag>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="carInfo_item" v-if="parkingReviewInfo.parking.residentId">
|
<div v-if="parkingReviewInfo.parking.residentId" class="carInfo_item">
|
||||||
<div class="label">持有人:</div>
|
<div class="label">持有人:</div>
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<span>
|
<span>
|
||||||
@@ -59,11 +59,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="CarInfoBox" style="margin-top: 20px">
|
<div class="CarInfoBox" style="margin-top: 20px">
|
||||||
<div class="carInfo_item" v-if="parkingReviewInfo.parking.contactName">
|
<div v-if="parkingReviewInfo.parking.contactName" class="carInfo_item">
|
||||||
<div class="label">非业主联系人:</div>
|
<div class="label">非业主联系人:</div>
|
||||||
<div class="main">{{ parkingReviewInfo.parking.contactName }}</div>
|
<div class="main">{{ parkingReviewInfo.parking.contactName }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="carInfo_item" style="margin-top: 20px" v-if="parkingReviewInfo.parking.contactPhone">
|
<div v-if="parkingReviewInfo.parking.contactPhone" class="carInfo_item" style="margin-top: 20px">
|
||||||
<div class="label">联系电话:</div>
|
<div class="label">联系电话:</div>
|
||||||
<div class="main">{{ parkingReviewInfo.parking.contactPhone }}</div>
|
<div class="main">{{ parkingReviewInfo.parking.contactPhone }}</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -75,14 +75,14 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
<!-- 车辆信息 -->
|
<!-- 车辆信息 -->
|
||||||
<div class="mb-10" v-if="!showCar">
|
<div v-if="!showCar" class="mb-10">
|
||||||
<el-card>
|
<el-card>
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<span>车辆信息</span>
|
<span>车辆信息</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div class="w-full h-full CarInfoBox" v-if="parkingReviewInfo.car">
|
<div v-if="parkingReviewInfo.car" class="w-full h-full CarInfoBox">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<div class="carInfo_item">
|
<div class="carInfo_item">
|
||||||
@@ -126,10 +126,10 @@
|
|||||||
<el-image
|
<el-image
|
||||||
v-for="(item, index) in parkingReviewInfo.car.carImageUrlList"
|
v-for="(item, index) in parkingReviewInfo.car.carImageUrlList"
|
||||||
:key="index"
|
:key="index"
|
||||||
class="carInfoImage"
|
|
||||||
:src="item"
|
|
||||||
:initial-index="index"
|
:initial-index="index"
|
||||||
:preview-src-list="parkingReviewInfo.car.carImageUrlList"
|
:preview-src-list="parkingReviewInfo.car.carImageUrlList"
|
||||||
|
:src="item"
|
||||||
|
class="carInfoImage"
|
||||||
preview-teleported
|
preview-teleported
|
||||||
></el-image>
|
></el-image>
|
||||||
</div>
|
</div>
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
<div class="w-full h-full CarInfoBox flex flex-center min-h-17rem" v-else>
|
<div v-else class="w-full h-full CarInfoBox flex flex-center min-h-17rem">
|
||||||
<span style="color: #999; font-weight: 500; font-size: larger; letter-spacing: 10px">暂无信息</span>
|
<span style="color: #999; font-weight: 500; font-size: larger; letter-spacing: 10px">暂无信息</span>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
<div class="w-full h-full flex mt-2">
|
<div class="w-full h-full flex mt-2">
|
||||||
<div class="title">审批意见</div>
|
<div class="title">审批意见</div>
|
||||||
<div class="preivewBodybox flex-1 ml-5">
|
<div class="preivewBodybox flex-1 ml-5">
|
||||||
<el-input maxlength="200" show-word-limit v-model="form.propertyReviewFeedback" type="textarea" :rows="5"></el-input>
|
<el-input v-model="form.propertyReviewFeedback" :rows="5" maxlength="200" show-word-limit type="textarea"></el-input>
|
||||||
<div class="actions mt-5">
|
<div class="actions mt-5">
|
||||||
<el-button :disabled="parkingReviewInfo.parking.checkStatus === '1'" type="primary" @click="handlePreview(1)">审核通过</el-button>
|
<el-button :disabled="parkingReviewInfo.parking.checkStatus === '1'" type="primary" @click="handlePreview(1)">审核通过</el-button>
|
||||||
<el-button :disabled="parkingReviewInfo.parking.checkStatus === '1'" type="danger" @click="handlePreview(2)"
|
<el-button :disabled="parkingReviewInfo.parking.checkStatus === '1'" type="danger" @click="handlePreview(2)"
|
||||||
@@ -166,7 +166,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<el-card style="position: relative" class="h-full">
|
<el-card class="h-full" style="position: relative">
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="asideCardHeader w-full h-full">
|
<div class="asideCardHeader w-full h-full">
|
||||||
<div class="cardSubtitle">
|
<div class="cardSubtitle">
|
||||||
@@ -175,34 +175,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div class="w-full h-50%">
|
<div class="w-full h-full">
|
||||||
<el-steps space="200px" direction="vertical" :active="activeStop">
|
<StepTimeline :steps="stepList">
|
||||||
<el-step :description="active <= 0 ? '' : parkingReviewInfo.parkingReviewProcess.submitTime">
|
<template #title="{ item }">{{ item.title }}</template>
|
||||||
<template #title>
|
<template #subtitle="{ item }">{{ item.subtitle }}</template>
|
||||||
<span v-if="active === 0">未提交信息</span>
|
<template #time="{ item }">{{ item.time }}</template>
|
||||||
<span v-if="active >= 1">已提交信息</span>
|
</StepTimeline>
|
||||||
</template>
|
|
||||||
</el-step>
|
|
||||||
<el-step :description="active <= 2 ? '' : parkingReviewInfo.parkingReviewProcess.propertyTime">
|
|
||||||
<template #title>
|
|
||||||
<span v-if="active <= 2">待审核</span>
|
|
||||||
<span v-if="active === 3">物业审核不通过</span>
|
|
||||||
<span v-if="active >= 4">物业审核通过</span>
|
|
||||||
</template>
|
|
||||||
</el-step>
|
|
||||||
<el-step :description="active <= 5 ? '' : parkingReviewInfo.parkingReviewProcess.certificationTime">
|
|
||||||
<template #title>
|
|
||||||
<span v-if="active <= 5">未认证</span>
|
|
||||||
<span v-if="active === 6">已认证</span>
|
|
||||||
</template>
|
|
||||||
</el-step>
|
|
||||||
<el-step>
|
|
||||||
<template #title>
|
|
||||||
<span v-if="active <= 5">审核未完成</span>
|
|
||||||
<span v-else>审核完成</span>
|
|
||||||
</template>
|
|
||||||
</el-step>
|
|
||||||
</el-steps>
|
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -210,11 +188,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { getParkingReview, getParkingReviewInfo } from '@/api/system/parking';
|
import { getParkingReview, getParkingReviewInfo } from '@/api/system/parking';
|
||||||
import DictTag from '@/components/DictTag/index.vue';
|
import DictTag from '@/components/DictTag/index.vue';
|
||||||
|
import StepTimeline, { StepItem } from '@/components/StepTimeline/index.vue';
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||||
const { com_parking_status } = toRefs<any>(proxy?.useDict('com_parking_status'));
|
const { com_parking_status } = toRefs<any>(proxy?.useDict('com_parking_status'));
|
||||||
@@ -373,6 +352,12 @@ function getInfo() {
|
|||||||
}
|
}
|
||||||
getInfo();
|
getInfo();
|
||||||
|
|
||||||
|
const stepList = ref<StepItem[]>([
|
||||||
|
{ status: 'completed', title: '提交信息', subtitle: '', time: '', wrap: true },
|
||||||
|
{ status: 'pending', title: '物业审核', subtitle: '', time: '', wrap: true },
|
||||||
|
{ status: 'waiting', title: '认证通过', subtitle: '', time: '', wrap: true }
|
||||||
|
]);
|
||||||
|
|
||||||
// 处理审核进度
|
// 处理审核进度
|
||||||
function handleActiveStaus(rows: parkingReviewProcess) {
|
function handleActiveStaus(rows: parkingReviewProcess) {
|
||||||
if (!rows) {
|
if (!rows) {
|
||||||
@@ -389,6 +374,11 @@ function handleActiveStaus(rows: parkingReviewProcess) {
|
|||||||
active.value = 1; // 提交信息
|
active.value = 1; // 提交信息
|
||||||
activeStop.value = 1;
|
activeStop.value = 1;
|
||||||
|
|
||||||
|
stepList.value[0].status = 'completed';
|
||||||
|
stepList.value[0].subtitle = '';
|
||||||
|
stepList.value[0].time = rows.submitTime;
|
||||||
|
stepList.value[1].status = 'pending';
|
||||||
|
|
||||||
// 审核
|
// 审核
|
||||||
if (rows.propertyStatus === ReviewStatus.awaitReview) {
|
if (rows.propertyStatus === ReviewStatus.awaitReview) {
|
||||||
active.value = 2; // 待审核
|
active.value = 2; // 待审核
|
||||||
@@ -398,6 +388,10 @@ function handleActiveStaus(rows: parkingReviewProcess) {
|
|||||||
active.value = 4; // 审核通过
|
active.value = 4; // 审核通过
|
||||||
activeStop.value = 2;
|
activeStop.value = 2;
|
||||||
|
|
||||||
|
stepList.value[1].time = rows.propertyTime;
|
||||||
|
stepList.value[1].status = 'completed';
|
||||||
|
stepList.value[2].status = 'pending';
|
||||||
|
|
||||||
// 认证
|
// 认证
|
||||||
if (rows.certificationStatus === certificationStatus.uncertification) {
|
if (rows.certificationStatus === certificationStatus.uncertification) {
|
||||||
active.value = 5; // 未认证
|
active.value = 5; // 未认证
|
||||||
@@ -406,6 +400,10 @@ function handleActiveStaus(rows: parkingReviewProcess) {
|
|||||||
} else if (rows.certificationStatus === certificationStatus.Certification) {
|
} else if (rows.certificationStatus === certificationStatus.Certification) {
|
||||||
active.value = 6; // 已认证
|
active.value = 6; // 已认证
|
||||||
activeStop.value = 4;
|
activeStop.value = 4;
|
||||||
|
|
||||||
|
stepList.value[2].time = rows.certificationTime;
|
||||||
|
stepList.value[2].status = 'completed';
|
||||||
|
stepList.value[3].status = 'completed';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -430,7 +428,7 @@ function handleBack() {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.ResidentMainBox {
|
.ResidentMainBox {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="p-2 h-full flex flex-col">
|
<div class="p-2 h-full flex flex-col">
|
||||||
<pageHeader></pageHeader>
|
<pageHeader></pageHeader>
|
||||||
|
<div class="overflow-auto flex-1">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<el-form ref="queryFormRef" :inline="true" :model="queryParams" :rules="formRules" label-width="140" @submit.prevent="handleQuery">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" :rules="formRules" label-width="140" @submit.prevent="handleQuery">
|
||||||
<div>
|
<div>
|
||||||
@@ -143,17 +144,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-form>
|
</el-form>
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-card class="flex-1" shadow="never" style="margin-top: 5px">
|
<el-card shadow="never" style="margin-top: 5px; height: 800px">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" class="mb8">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
|
||||||
<span>租赁管理明细</span>
|
<span>租赁管理明细</span>
|
||||||
</el-col>
|
|
||||||
<el-col :span="18"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</template>
|
</template>
|
||||||
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
||||||
<el-table-column align="center" label="区域" prop="area" />
|
<el-table-column align="center" label="区域" prop="area" />
|
||||||
@@ -196,6 +192,7 @@
|
|||||||
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" name="Arrears" setup>
|
<script lang="ts" name="Arrears" setup>
|
||||||
import pagination from '@/components/Pagination/index.vue';
|
import pagination from '@/components/Pagination/index.vue';
|
||||||
|
|||||||
@@ -4,19 +4,19 @@
|
|||||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||||
<div v-show="showSearch" class="mb-[10px]">
|
<div v-show="showSearch" class="mb-[10px]">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
|
||||||
<div class="flex justify-between">
|
<div class="flex justify-between">
|
||||||
<div>
|
<div>
|
||||||
<el-form-item label-width="100" label="截至应收账期" prop="villageId">
|
<el-form-item label="截至应收账期" label-width="100" prop="villageId">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="queryTime"
|
v-model="queryTime"
|
||||||
type="daterange"
|
|
||||||
@update:model-value="handleQueryTime"
|
|
||||||
range-separator="至"
|
|
||||||
start-placeholder="开始日期"
|
|
||||||
end-placeholder="结束日期"
|
end-placeholder="结束日期"
|
||||||
format="YYYY-MM"
|
format="YYYY-MM"
|
||||||
|
range-separator="至"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
type="daterange"
|
||||||
value-format="YYYY-MM"
|
value-format="YYYY-MM"
|
||||||
|
@update:model-value="handleQueryTime"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="小区" prop="villageId">
|
<el-form-item label="小区" prop="villageId">
|
||||||
@@ -30,12 +30,12 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="账龄区间" prop="agingRange">
|
<el-form-item label="账龄区间" prop="agingRange">
|
||||||
<el-select :multiple="true" v-model="queryParams.agingRange" placeholder="请选择">
|
<el-select v-model="queryParams.agingRange" :multiple="true" placeholder="请选择">
|
||||||
<el-option v-for="item in [...com_report_age_list]" :key="item.value" :label="item.label" :value="item.value" />
|
<el-option v-for="item in [...com_report_age_list]" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div style="width: 180px">
|
||||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||||
<el-button @click="resetQuery">重置</el-button>
|
<el-button @click="resetQuery">重置</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -45,37 +45,32 @@
|
|||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
|
|
||||||
<el-card shadow="never" class="flex-1">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" class="mb8">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
|
||||||
<span>账龄分析汇总表</span>
|
<span>账龄分析汇总表</span>
|
||||||
</el-col>
|
|
||||||
<el-col :span="18"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</template>
|
</template>
|
||||||
<el-table :span-method="arraySpanMethod" v-loading="loading" border :data="AgingList">
|
<el-table v-loading="loading" :data="AgingList" :span-method="arraySpanMethod" border>
|
||||||
<el-table-column label="截至应收账期" align="center" prop="cutoffPeriod" />
|
<el-table-column align="center" label="截至应收账期" prop="cutoffPeriod" />
|
||||||
<el-table-column label="小区项目" align="center" prop="villageName" />
|
<el-table-column align="center" label="小区项目" prop="villageName" />
|
||||||
<el-table-column label="房屋类型" align="center" prop="houseTypeName" />
|
<el-table-column align="center" label="房屋类型" prop="houseTypeName" />
|
||||||
<el-table-column label="≤6个月" align="center" prop="amountLe6" />
|
<el-table-column align="center" label="≤6个月" prop="amountLe6" />
|
||||||
<el-table-column label="6个月-12个月" align="center" prop="amountM6To12" />
|
<el-table-column align="center" label="6个月-12个月" prop="amountM6To12" />
|
||||||
<el-table-column label="1年-2年" align="center" prop="amountY1To2" />
|
<el-table-column align="center" label="1年-2年" prop="amountY1To2" />
|
||||||
<el-table-column label="2年-3年" align="center" prop="amountY2To3" />
|
<el-table-column align="center" label="2年-3年" prop="amountY2To3" />
|
||||||
<el-table-column label="3年-4年" align="center" prop="amountY3To4" />
|
<el-table-column align="center" label="3年-4年" prop="amountY3To4" />
|
||||||
<el-table-column label="4年-5年" align="center" prop="amountY4To5" />
|
<el-table-column align="center" label="4年-5年" prop="amountY4To5" />
|
||||||
<el-table-column label="5年以上" align="center" prop="amountOver5" />
|
<el-table-column align="center" label="5年以上" prop="amountOver5" />
|
||||||
<el-table-column label="合计" align="center" prop="totalAmount" />
|
<el-table-column align="center" label="合计" prop="totalAmount" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="Arrears" lang="ts">
|
<script lang="ts" name="Arrears" setup>
|
||||||
import pagination from '@/components/Pagination/index.vue';
|
import pagination from '@/components/Pagination/index.vue';
|
||||||
import pageHeader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { listHouseUseType } from '@/api/system/houseUse';
|
import { listHouseUseType } from '@/api/system/houseUse';
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||||
<div v-show="showSearch" class="mb-[10px]">
|
<div v-show="showSearch" class="mb-[10px]">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
|
||||||
<div class="flex justify-between">
|
<div class="flex justify-between">
|
||||||
<div>
|
<div>
|
||||||
<el-form-item label="小区" prop="villageId">
|
<el-form-item label="小区" prop="villageId">
|
||||||
<el-select @change="handleChangeVillage" v-model="queryParams.villageId" placeholder="请选择">
|
<el-select v-model="queryParams.villageId" placeholder="请选择" @change="handleChangeVillage">
|
||||||
<el-option v-for="item in villageList" :key="item.villageId" :label="item.villageName" :value="item.villageId" />
|
<el-option v-for="item in villageList" :key="item.villageId" :label="item.villageName" :value="item.villageId" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -26,12 +26,12 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="账龄区间" prop="agingRange">
|
<el-form-item label="账龄区间" prop="agingRange">
|
||||||
<el-select :multiple="true" v-model="queryParams.agingRange" placeholder="请选择">
|
<el-select v-model="queryParams.agingRange" :multiple="true" placeholder="请选择">
|
||||||
<el-option v-for="item in [...com_report_age_list]" :key="item.value" :label="item.label" :value="item.value" />
|
<el-option v-for="item in [...com_report_age_list]" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div style="width: 200px">
|
||||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||||
<el-button @click="resetQuery">重置</el-button>
|
<el-button @click="resetQuery">重置</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -41,40 +41,35 @@
|
|||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
|
|
||||||
<el-card shadow="never" class="flex-1">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" class="mb8">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
|
||||||
<span>账龄分析明细表</span>
|
<span>账龄分析明细表</span>
|
||||||
</el-col>
|
|
||||||
<el-col :span="18"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</template>
|
</template>
|
||||||
<el-table :span-method="arraySpanMethod" v-loading="loading" border :data="AgingList">
|
<el-table v-loading="loading" :data="AgingList" :span-method="arraySpanMethod" border>
|
||||||
<el-table-column label="截至应收账期" align="center" prop="cutoffPeriod" />
|
<el-table-column align="center" label="截至应收账期" prop="cutoffPeriod" />
|
||||||
<el-table-column label="小区项目" align="center" prop="villageName" />
|
<el-table-column align="center" label="小区项目" prop="villageName" />
|
||||||
<el-table-column label="楼栋" align="center" prop="buildingName" />
|
<el-table-column align="center" label="楼栋" prop="buildingName" />
|
||||||
<el-table-column label="客户名称" align="center" prop="customerName" />
|
<el-table-column align="center" label="客户名称" prop="customerName" />
|
||||||
<el-table-column label="房号编号" align="center" prop="roomNo" />
|
<el-table-column align="center" label="房号编号" prop="roomNo" />
|
||||||
<el-table-column label="欠费月数" align="center" prop="arrearsMonthsLabel" />
|
<el-table-column align="center" label="欠费月数" prop="arrearsMonthsLabel" />
|
||||||
<el-table-column label="≤6个月" align="center" prop="amountLe6" />
|
<el-table-column align="center" label="≤6个月" prop="amountLe6" />
|
||||||
<el-table-column label="6个月-12个月" align="center" prop="amountM6To12" />
|
<el-table-column align="center" label="6个月-12个月" prop="amountM6To12" />
|
||||||
<el-table-column label="1年-2年" align="center" prop="amountY1To2" />
|
<el-table-column align="center" label="1年-2年" prop="amountY1To2" />
|
||||||
<el-table-column label="2年-3年" align="center" prop="amountY2To3" />
|
<el-table-column align="center" label="2年-3年" prop="amountY2To3" />
|
||||||
<el-table-column label="3年-4年" align="center" prop="amountY3To4" />
|
<el-table-column align="center" label="3年-4年" prop="amountY3To4" />
|
||||||
<el-table-column label="4年-5年" align="center" prop="amountY4To5" />
|
<el-table-column align="center" label="4年-5年" prop="amountY4To5" />
|
||||||
<el-table-column label="5年以上" align="center" prop="amountOver5" />
|
<el-table-column align="center" label="5年以上" prop="amountOver5" />
|
||||||
<el-table-column label="合计" align="center" prop="totalAmount" />
|
<el-table-column align="center" label="合计" prop="totalAmount" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="Arrears" lang="ts">
|
<script lang="ts" name="Arrears" setup>
|
||||||
import pagination from '@/components/Pagination/index.vue';
|
import pagination from '@/components/Pagination/index.vue';
|
||||||
import pageHeader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { getCommunitylistAPI } from '@/api/system/community';
|
import { getCommunitylistAPI } from '@/api/system/community';
|
||||||
|
|||||||
@@ -35,21 +35,18 @@
|
|||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" style="margin-bottom: 30px">
|
<div class="flex justify-between items-center" style="height: 40px; margin-bottom: 60px">
|
||||||
<el-col :span="5">
|
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<div style="width: 200px; font-size: 15px; margin-right: 10px">应收欠费汇总列表</div>
|
<div style="width: 125px; font-size: 15px; margin-right: 10px">应收欠费汇总列表</div>
|
||||||
<el-select v-model="queryParams.viewType" placeholder="请选择视图类型" @change="handleViewTypeChange">
|
<el-select v-model="queryParams.viewType" placeholder="请选择视图类型" style="width: 200px" @change="handleViewTypeChange">
|
||||||
<el-option :value="1" label="维度1(按收费类型)" />
|
<el-option :value="1" label="维度1(按收费类型)" />
|
||||||
<el-option :value="2" label="维度2(按房屋类型)" />
|
<el-option :value="2" label="维度2(按房屋类型)" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
<div>
|
||||||
<el-col :span="18"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table
|
<el-table
|
||||||
|
|||||||
@@ -25,18 +25,13 @@
|
|||||||
</transition>
|
</transition>
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" class="mb8">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="4">
|
|
||||||
<el-tabs v-model="activeName" class="demo-tabs" @tab-change="handleTabClick">
|
<el-tabs v-model="activeName" class="demo-tabs" @tab-change="handleTabClick">
|
||||||
<el-tab-pane label="按小区统计" name="first"> </el-tab-pane>
|
<el-tab-pane label="按小区统计" name="first"> </el-tab-pane>
|
||||||
<el-tab-pane label="按收费项目统计" name="fourth"></el-tab-pane>
|
<el-tab-pane label="按收费项目统计" name="fourth"></el-tab-pane>
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</el-col>
|
|
||||||
<el-col :span="19"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="exportData">导出</el-button>
|
<el-button type="primary" @click="exportData">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</template>
|
</template>
|
||||||
<el-table v-loading="loading" :data="AgingList" border>
|
<el-table v-loading="loading" :data="AgingList" border>
|
||||||
<el-table-column v-if="activeName === 'first'" align="center" label="小区名称" prop="villageName" />
|
<el-table-column v-if="activeName === 'first'" align="center" label="小区名称" prop="villageName" />
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="p-2 h-full flex flex-col">
|
<div class="p-2 h-full flex flex-col">
|
||||||
<pageHeader></pageHeader>
|
<pageHeader></pageHeader>
|
||||||
|
<div class="flex-1 overflow-auto">
|
||||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||||
<div v-show="showSearch" class="mb-[10px]">
|
<div v-show="showSearch" class="mb-[10px]">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
@@ -10,7 +11,7 @@
|
|||||||
:model="queryParams"
|
:model="queryParams"
|
||||||
:rules="formRules"
|
:rules="formRules"
|
||||||
label-position="right"
|
label-position="right"
|
||||||
label-width="180px"
|
label-width="170px"
|
||||||
@submit.prevent="handleQuery"
|
@submit.prevent="handleQuery"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
@@ -167,18 +168,12 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
|
<el-card class="el-table-box" shadow="never">
|
||||||
<el-card class="flex-1" shadow="never">
|
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10">
|
<div class="flex items-center justify-between">
|
||||||
<el-col :span="5">
|
<span>收费日报</span>
|
||||||
<span> 收费日报 </span>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="18"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</template>
|
</template>
|
||||||
<el-table v-loading="loading" :data="ArrearsDetailList" :row-class-name="handleRowClass" border>
|
<el-table v-loading="loading" :data="ArrearsDetailList" :row-class-name="handleRowClass" border>
|
||||||
<el-table-column align="center" fixed="left" label="日期" prop="payTime" width="100" />
|
<el-table-column align="center" fixed="left" label="日期" prop="payTime" width="100" />
|
||||||
@@ -242,6 +237,7 @@
|
|||||||
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
@@ -428,7 +424,9 @@ const getList = async () => {
|
|||||||
getDailyFeeReportList(search)
|
getDailyFeeReportList(search)
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
ArrearsDetailList.value = [...(res.rows ?? [])];
|
ArrearsDetailList.value = [...(res.rows ?? [])];
|
||||||
|
if (res.rows) {
|
||||||
rowChargeTypesList.value = Object.keys(res.rows[0].chargeTypeAmounts) ?? [];
|
rowChargeTypesList.value = Object.keys(res.rows[0].chargeTypeAmounts) ?? [];
|
||||||
|
}
|
||||||
total.value = res.total;
|
total.value = res.total;
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
@@ -568,6 +566,9 @@ onMounted(() => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
.el-table-box {
|
||||||
|
height: 800px;
|
||||||
|
}
|
||||||
.el-table {
|
.el-table {
|
||||||
height: calc(100% - 80px);
|
height: calc(100% - 80px);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div style="width: 180px">
|
||||||
<el-button :loading="loading" type="primary" @click="handleQuery">查询</el-button>
|
<el-button :loading="loading" type="primary" @click="handleQuery">查询</el-button>
|
||||||
<el-button @click="resetQuery">重置</el-button>
|
<el-button @click="resetQuery">重置</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -45,16 +45,13 @@
|
|||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" class="mb8">
|
<div class="flex justify-between items-center" style="height: 40px; margin-bottom: 15px">
|
||||||
<el-col :span="5">
|
|
||||||
<span>应收欠费明细表</span>
|
<span>应收欠费明细表</span>
|
||||||
</el-col>
|
<div>
|
||||||
<el-col :span="15"></el-col>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-button type="primary" @click="handleExport">导出本页</el-button>
|
<el-button type="primary" @click="handleExport">导出本页</el-button>
|
||||||
<el-button type="primary" @click="handleExportAll">导出全部</el-button>
|
<el-button type="primary" @click="handleExportAll">导出全部</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="ArrearsDetailList" :span-method="mergeSpanMethod" border>
|
<el-table v-loading="loading" :data="ArrearsDetailList" :span-method="mergeSpanMethod" border>
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
|
||||||
<div v-show="showSearch" class="mb-[10px]">
|
<div v-show="showSearch" class="mb-[10px]">
|
||||||
<el-card shadow="hover">
|
<el-card shadow="hover">
|
||||||
<el-form ref="queryFormRef" label-width="80px" :model="queryParams" :rules="rules" @submit.prevent="handleQuery" :inline="true">
|
<el-form ref="queryFormRef" :inline="true" :model="queryParams" :rules="rules" label-width="80px" @submit.prevent="handleQuery">
|
||||||
<div class="flex justify-between">
|
<div class="flex justify-between">
|
||||||
<div>
|
<div>
|
||||||
<el-form-item label="楼栋(多选)" prop="buildingIds">
|
<el-form-item label="楼栋(多选)" prop="buildingIds">
|
||||||
<el-select multiple v-model="queryParams.buildingIds" placeholder="请选择">
|
<el-select v-model="queryParams.buildingIds" multiple placeholder="请选择">
|
||||||
<el-option v-for="item in allHouseUseList" :key="item.id" :label="item.name" :value="item.id" />
|
<el-option v-for="item in allHouseUseList" :key="item.id" :label="item.name" :value="item.id" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div style="width: 210px">
|
||||||
<el-button type="primary" @click="handleQuery">查询</el-button>
|
<el-button type="primary" @click="handleQuery">查询</el-button>
|
||||||
<el-button @click="resetQuery">重置</el-button>
|
<el-button @click="resetQuery">重置</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -49,46 +49,40 @@
|
|||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
|
|
||||||
<el-card shadow="never" class="flex-1">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" style="margin-bottom: 30px">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
|
||||||
<span> 收费月报 </span>
|
<span> 收费月报 </span>
|
||||||
</el-col>
|
|
||||||
<el-col :span="18"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</template>
|
</template>
|
||||||
|
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
||||||
<el-table v-loading="loading" border :data="ArrearsDetailList">
|
<el-table-column align="center" label="楼栋" prop="buildingName" />
|
||||||
<el-table-column label="楼栋" align="center" prop="buildingName" />
|
<el-table-column align="center" label="本月应收" prop="monthReceivable" />
|
||||||
<el-table-column label="本月应收" align="center" prop="monthReceivable" />
|
<el-table-column align="center" label="本月已收" prop="monthReceived" />
|
||||||
<el-table-column label="本月已收" align="center" prop="monthReceived" />
|
<el-table-column align="center" label="本月未收" prop="monthUnpaid" />
|
||||||
<el-table-column label="本月未收" align="center" prop="monthUnpaid" />
|
<el-table-column align="center" label="月收费率" prop="monthRate">
|
||||||
<el-table-column label="月收费率" align="center" prop="monthRate">
|
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ `${scope.row.monthRate}%` || '0%' }}
|
{{ `${scope.row.monthRate}%` || '0%' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="本年应收" align="center" prop="yearReceivable" />
|
<el-table-column align="center" label="本年应收" prop="yearReceivable" />
|
||||||
<el-table-column label="本年已收" align="center" prop="yearReceived" />
|
<el-table-column align="center" label="本年已收" prop="yearReceived" />
|
||||||
<el-table-column label="本年未收" align="center" prop="yearUnpaid" />
|
<el-table-column align="center" label="本年未收" prop="yearUnpaid" />
|
||||||
<el-table-column label="年收费率" align="center" prop="yearRate">
|
<el-table-column align="center" label="年收费率" prop="yearRate">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
{{ `${scope.row.yearRate}%` || '0%' }}
|
{{ `${scope.row.yearRate}%` || '0%' }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="综合欠收" align="center" prop="totalPrepaid" />
|
<el-table-column align="center" label="综合欠收" prop="totalPrepaid" />
|
||||||
<el-table-column label="综合预收" align="center" prop="totalArrears" />
|
<el-table-column align="center" label="综合预收" prop="totalArrears" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import pagination from '@/components/Pagination/index.vue';
|
import pagination from '@/components/Pagination/index.vue';
|
||||||
import pageHeader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { ColumnConfig, exportToExcel } from '@/utils/xlsx';
|
import { ColumnConfig, exportToExcel } from '@/utils/xlsx';
|
||||||
|
|||||||
@@ -42,17 +42,11 @@
|
|||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" class="mb8">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
|
||||||
<span>实收物业费详情 </span>
|
<span>实收物业费详情 </span>
|
||||||
</el-col>
|
|
||||||
<el-col :span="18"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
||||||
<el-table-column align="center" label="收费所属期" prop="name" />
|
<el-table-column align="center" label="收费所属期" prop="name" />
|
||||||
<el-table-column align="center" label="序号" prop="sequence" />
|
<el-table-column align="center" label="序号" prop="sequence" />
|
||||||
@@ -70,7 +64,6 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
账龄
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import pagination from '@/components/Pagination/index.vue';
|
import pagination from '@/components/Pagination/index.vue';
|
||||||
import pageHeader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
|
|||||||
@@ -39,20 +39,13 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" class="mb8">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
|
||||||
<span>应收物业费详情 </span>
|
<span>应收物业费详情 </span>
|
||||||
</el-col>
|
|
||||||
<el-col :span="18"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
||||||
<el-table-column align="center" label="收费所属期" prop="name" />
|
<el-table-column align="center" label="收费所属期" prop="name" />
|
||||||
<el-table-column align="center" label="序号" prop="sequence" />
|
<el-table-column align="center" label="序号" prop="sequence" />
|
||||||
@@ -70,7 +63,6 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
账龄
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import pagination from '@/components/Pagination/index.vue';
|
import pagination from '@/components/Pagination/index.vue';
|
||||||
import pageHeader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
|
|||||||
@@ -35,15 +35,10 @@
|
|||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" class="mb8">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
|
||||||
<span> 预收费用余额汇总 </span>
|
<span> 预收费用余额汇总 </span>
|
||||||
</el-col>
|
|
||||||
<el-col :span="18"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
||||||
@@ -64,7 +59,6 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
账龄
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import pagination from '@/components/Pagination/index.vue';
|
import pagination from '@/components/Pagination/index.vue';
|
||||||
import pageHeader from '@/components/Pageheader/index.vue';
|
import pageHeader from '@/components/Pageheader/index.vue';
|
||||||
|
|||||||
@@ -33,15 +33,10 @@
|
|||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
<template #header>
|
||||||
<el-row :gutter="10" class="mb8">
|
<div class="flex justify-between items-center">
|
||||||
<el-col :span="5">
|
<span> 预收费用余额明细 </span>
|
||||||
<span> 预收费用余额详细 </span>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="18"></el-col>
|
|
||||||
<el-col :span="1">
|
|
||||||
<el-button type="primary" @click="handleExport">导出</el-button>
|
<el-button type="primary" @click="handleExport">导出</el-button>
|
||||||
</el-col>
|
</div>
|
||||||
</el-row>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
<el-table v-loading="loading" :data="ArrearsDetailList" border>
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="activeStop !== 4" class="previewbox">
|
<div v-if="active < 4" class="previewbox">
|
||||||
<el-card>
|
<el-card>
|
||||||
<template #header>
|
<template #header>
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
@@ -115,29 +115,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div class="w-full h-50%">
|
<div class="w-full h-50%" style="padding-top: 20px">
|
||||||
<el-steps :active="activeStop" direction="vertical" space="200px">
|
<StepTimeline :steps="stepList">
|
||||||
<el-step :description="reviewInfo.submitTime">
|
<template #title="{ item }">{{ item.title }}</template>
|
||||||
<template #title>
|
<template #subtitle="{ item }">{{ item.subtitle }}</template>
|
||||||
<DictTag :options="com_sub_status" :value="reviewInfo.submitStatus || '0'"></DictTag>
|
<template #time="{ item }">{{ item.time }}</template>
|
||||||
</template>
|
</StepTimeline>
|
||||||
</el-step>
|
|
||||||
<el-step :description="reviewInfo.propertyTime">
|
|
||||||
<template #title>
|
|
||||||
<span>{{ getReviewStatusLabel(reviewInfo.propertyStatus || '0') }}</span>
|
|
||||||
</template>
|
|
||||||
</el-step>
|
|
||||||
<el-step :description="reviewInfo.certificationTime">
|
|
||||||
<template #title>
|
|
||||||
<DictTag :options="com_certification_status" :value="reviewInfo.certificationStatus || '0'"></DictTag>
|
|
||||||
</template>
|
|
||||||
</el-step>
|
|
||||||
<el-step>
|
|
||||||
<template #title>
|
|
||||||
<span>审核完成</span>
|
|
||||||
</template>
|
|
||||||
</el-step>
|
|
||||||
</el-steps>
|
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
@@ -150,12 +133,10 @@ import { ref } from 'vue';
|
|||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { getResident, getresidentReviewlistAPI, UpdateResidentReviewAPI } from '@/api/system/residentReviewProcess/resident';
|
import { getResident, getresidentReviewlistAPI, UpdateResidentReviewAPI } from '@/api/system/residentReviewProcess/resident';
|
||||||
import { ResidentVO } from '@/api/system/residentReviewProcess/resident/type';
|
import { ResidentVO } from '@/api/system/residentReviewProcess/resident/type';
|
||||||
|
import StepTimeline, { StepItem } from '@/components/StepTimeline/index.vue';
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||||
const { com_review } = toRefs<any>(proxy?.useDict('com_review'));
|
|
||||||
const { com_sub_status } = toRefs<any>(proxy?.useDict('com_sub_status'));
|
|
||||||
const { com_resident_relationship, com_id_card_type } = toRefs<any>(proxy?.useDict('com_resident_relationship', 'com_id_card_type'));
|
const { com_resident_relationship, com_id_card_type } = toRefs<any>(proxy?.useDict('com_resident_relationship', 'com_id_card_type'));
|
||||||
const { com_certification_status } = toRefs<any>(proxy?.useDict('com_certification_status'));
|
|
||||||
|
|
||||||
const userInfo = ref<ResidentVO>({
|
const userInfo = ref<ResidentVO>({
|
||||||
code: null,
|
code: null,
|
||||||
@@ -209,17 +190,17 @@ if (route.query.id) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// 在 script setup 中添加
|
|
||||||
const getReviewStatusLabel = (status: string) => {
|
|
||||||
const item = com_review.value?.find((i: any) => i.value === status);
|
|
||||||
return item ? item.label : '未知状态';
|
|
||||||
};
|
|
||||||
function handleActiveStaus(rews) {
|
function handleActiveStaus(rews) {
|
||||||
// 提交状态 0未提交 1已提交
|
// 提交状态 0未提交 1已提交
|
||||||
if (rews.submitStatus === '0') {
|
if (rews.submitStatus === '0') {
|
||||||
active.value = 0;
|
active.value = 0;
|
||||||
} else if (rews.submitStatus === '1') {
|
} else if (rews.submitStatus === '1') {
|
||||||
active.value = 1;
|
// 提交完成
|
||||||
|
stepList.value[0].status = 'completed';
|
||||||
|
stepList.value[0].subtitle = '';
|
||||||
|
stepList.value[0].time = reviewInfo.value.submitTime;
|
||||||
|
stepList.value[1].status = 'pending';
|
||||||
|
|
||||||
// 物业审核状态 0 待审核 1审核通过 2审核未通过
|
// 物业审核状态 0 待审核 1审核通过 2审核未通过
|
||||||
// 待认证
|
// 待认证
|
||||||
if (rews.propertyStatus === '0') {
|
if (rews.propertyStatus === '0') {
|
||||||
@@ -228,38 +209,29 @@ function handleActiveStaus(rews) {
|
|||||||
active.value = 3;
|
active.value = 3;
|
||||||
} else if (rews.propertyStatus === '1') {
|
} else if (rews.propertyStatus === '1') {
|
||||||
active.value = 4;
|
active.value = 4;
|
||||||
|
stepList.value[1].time = reviewInfo.value.propertyTime;
|
||||||
|
stepList.value[1].status = 'completed';
|
||||||
|
stepList.value[2].status = 'pending';
|
||||||
// 认证状态 0未认证 1已认证
|
// 认证状态 0未认证 1已认证
|
||||||
if (rews.certificationStatus === '0') {
|
if (rews.certificationStatus === '0') {
|
||||||
active.value = 5;
|
active.value = 5;
|
||||||
} else if (rews.certificationStatus === '1') {
|
} else if (rews.certificationStatus === '1') {
|
||||||
active.value = 6;
|
active.value = 6;
|
||||||
|
stepList.value[2].time = reviewInfo.value.certificationTime;
|
||||||
|
stepList.value[2].status = 'completed';
|
||||||
|
stepList.value[3].status = 'completed';
|
||||||
} else if (rews.certificationStatus === '2') {
|
} else if (rews.certificationStatus === '2') {
|
||||||
active.value = 5;
|
active.value = 5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const activeStop = computed(() => {
|
|
||||||
let status = 0;
|
|
||||||
switch (active.value) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
case 2:
|
|
||||||
case 3:
|
|
||||||
status = 1;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
case 5:
|
|
||||||
status = 2;
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
status = 4;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
});
|
|
||||||
|
|
||||||
|
const stepList = ref<StepItem[]>([
|
||||||
|
{ status: 'completed', title: '提交信息', subtitle: '', time: '', wrap: true },
|
||||||
|
{ status: 'pending', title: '物业审核', subtitle: '', time: '', wrap: true },
|
||||||
|
{ status: 'waiting', title: '认证通过', subtitle: '', time: '', wrap: true }
|
||||||
|
]);
|
||||||
// 审核通过
|
// 审核通过
|
||||||
function updatePass(val: '0' | '1' | '2') {
|
function updatePass(val: '0' | '1' | '2') {
|
||||||
reviewInfo.value = {
|
reviewInfo.value = {
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
<div class="AddBuildingBody">
|
<div class="AddBuildingBody">
|
||||||
<div class="title">基本信息</div>
|
<div class="title">基本信息</div>
|
||||||
<div class="addBuildingFormBody">
|
<div class="addBuildingFormBody">
|
||||||
<el-form class="formBody" label-position="left" ref="formRef" :model="form" :rules="rules" label-width="100px">
|
<el-form ref="formRef" :model="form" :rules="rules" class="formBody" label-position="left" label-width="100px">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<el-form-item label="楼栋" prop="buildingId">
|
<el-form-item label="楼栋" prop="buildingId">
|
||||||
<el-select @change="handleChangeBuild" v-model="form.buildingId" placeholder="请选择楼栋">
|
<el-select v-model="form.buildingId" placeholder="请选择楼栋" @change="handleChangeBuild">
|
||||||
<el-option v-for="item in BuildingLists" :key="item.id" :label="item.buildingName" :value="item.id" />
|
<el-option v-for="item in BuildingLists" :key="item.id" :label="item.buildingName" :value="item.id" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -25,13 +25,13 @@
|
|||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<el-form-item label="储藏室号" prop="storeroomNo">
|
<el-form-item label="储藏室号" prop="storeroomNo">
|
||||||
<el-input maxlength="15" v-model.trim="form.storeroomNo" placeholder="请输入储藏室号" />
|
<el-input v-model.trim="form.storeroomNo" maxlength="15" placeholder="请输入储藏室号" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="2"></el-col>
|
<el-col :span="2"></el-col>
|
||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<el-form-item label="建筑面积" prop="houseArea">
|
<el-form-item label="建筑面积" prop="houseArea">
|
||||||
<el-input maxlength="8" v-model.trim="form.houseArea" placeholder="请输入建筑面积">
|
<el-input v-model.trim.number="form.houseArea" maxlength="8" placeholder="请输入建筑面积">
|
||||||
<template #append>
|
<template #append>
|
||||||
<span>㎡</span>
|
<span>㎡</span>
|
||||||
</template>
|
</template>
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<el-form-item label="公摊面积" prop="shareArea">
|
<el-form-item label="公摊面积" prop="shareArea">
|
||||||
<el-input maxlength="8" v-model.trim="form.shareArea" placeholder="请输入公摊面积">
|
<el-input v-model.trim.number="form.shareArea" maxlength="8" placeholder="请输入公摊面积">
|
||||||
<template #append>
|
<template #append>
|
||||||
<span>㎡</span>
|
<span>㎡</span>
|
||||||
</template>
|
</template>
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
<el-col :span="2"></el-col>
|
<el-col :span="2"></el-col>
|
||||||
<el-col :span="11">
|
<el-col :span="11">
|
||||||
<el-form-item label="实用面积" prop="internalArea">
|
<el-form-item label="实用面积" prop="internalArea">
|
||||||
<el-input maxlength="8" v-model.trim="form.internalArea" placeholder="请输入实用面积">
|
<el-input v-model.trim.number="form.internalArea" maxlength="8" placeholder="请输入实用面积">
|
||||||
<template #append>
|
<template #append>
|
||||||
<span>㎡</span>
|
<span>㎡</span>
|
||||||
</template>
|
</template>
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
<el-input type="textarea" maxlength="200" show-word-limit :rows="5" v-model.trim="form.remark" placeholder="请输入备注" />
|
<el-input v-model.trim="form.remark" :rows="5" maxlength="200" placeholder="请输入备注" show-word-limit type="textarea" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item style="margin-top: 30px">
|
<el-form-item style="margin-top: 30px">
|
||||||
<el-button type="primary" @click="submitForm">提交</el-button>
|
<el-button type="primary" @click="submitForm">提交</el-button>
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { getBuildinglistAPI } from '@/api/system/house';
|
import { getBuildinglistAPI } from '@/api/system/house';
|
||||||
@@ -211,6 +211,19 @@ function handleChangeBuild(val: string, callback?: () => void) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
const submitForm = () => {
|
const submitForm = () => {
|
||||||
|
if (form.value.houseArea === null || form.value.houseArea === 0) {
|
||||||
|
ElMessage.error('请输入建筑面积');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const houseArea = Number(form.value.houseArea) || 0;
|
||||||
|
if (form.value.shareArea || form.value.internalArea) {
|
||||||
|
const shareArea = Number(form.value.shareArea) || 0;
|
||||||
|
const internalArea = Number(form.value.internalArea) || 0;
|
||||||
|
if (shareArea + internalArea != houseArea) {
|
||||||
|
return ElMessage.warning('填写的【实用面积】与【公摊面积】之和 应等于【建筑面积】');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
formRef.value?.validate(async (valid: boolean) => {
|
formRef.value?.validate(async (valid: boolean) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
const data = {
|
const data = {
|
||||||
@@ -235,7 +248,7 @@ const cancelForm = () => {
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.AddBuildingBox {
|
.AddBuildingBox {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<div class="AddBuildingBody">
|
<div class="AddBuildingBody">
|
||||||
<div class="title">基本信息</div>
|
<div class="title">基本信息</div>
|
||||||
<div class="addBuildingFormBody">
|
<div class="addBuildingFormBody">
|
||||||
<el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
|
<el-form ref="formRef" :model="form" :rules="rules" class="formBody" label-position="right" label-width="130px">
|
||||||
<el-form-item label="物料名称" prop="materialName">
|
<el-form-item label="物料名称" prop="materialName">
|
||||||
<span>{{ form.materialName }}</span>
|
<span>{{ form.materialName }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -17,9 +17,9 @@
|
|||||||
<el-form-item label="计量单位" prop="unit">
|
<el-form-item label="计量单位" prop="unit">
|
||||||
<span>{{ form.unit }}</span>
|
<span>{{ form.unit }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="成本" prop="costPrice">
|
<!-- <el-form-item label="成本" prop="costPrice">-->
|
||||||
{{ form.costPrice }}
|
<!-- {{ form.costPrice }}-->
|
||||||
</el-form-item>
|
<!-- </el-form-item>-->
|
||||||
<el-form-item label="当前库存" prop="stockNum">
|
<el-form-item label="当前库存" prop="stockNum">
|
||||||
{{ form.stockNum }}
|
{{ form.stockNum }}
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script lang="ts" setup>
|
||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
import PageHeader from '@/components/Pageheader/index.vue';
|
import PageHeader from '@/components/Pageheader/index.vue';
|
||||||
import { listStockMain } from '@/api/system/Tstock';
|
import { listStockMain } from '@/api/system/Tstock';
|
||||||
@@ -86,7 +86,7 @@ const cancelForm = () => {
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style lang="scss" scoped>
|
||||||
.AddBuildingBox {
|
.AddBuildingBox {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -24,21 +24,6 @@
|
|||||||
</transition>
|
</transition>
|
||||||
|
|
||||||
<el-card class="flex-1" shadow="never">
|
<el-card class="flex-1" shadow="never">
|
||||||
<template #header>
|
|
||||||
<el-row :gutter="10" class="mb8">
|
|
||||||
<right-toolbar
|
|
||||||
:disable-delete="multiple"
|
|
||||||
:disable-edit="single"
|
|
||||||
:show-add="false"
|
|
||||||
:show-delete="false"
|
|
||||||
:show-edit="false"
|
|
||||||
@update:add="handleAdd"
|
|
||||||
@update:edit="handleUpdate()"
|
|
||||||
@update:delete="handleDelete()"
|
|
||||||
></right-toolbar>
|
|
||||||
</el-row>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="materialList" border @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="materialList" border @selection-change="handleSelectionChange">
|
||||||
<el-table-column align="center" type="selection" width="55" />
|
<el-table-column align="center" type="selection" width="55" />
|
||||||
<el-table-column align="center" label="物料名称" prop="materialName" />
|
<el-table-column align="center" label="物料名称" prop="materialName" />
|
||||||
|
|||||||
@@ -62,12 +62,12 @@
|
|||||||
<el-table-column align="center" label="出库价">
|
<el-table-column align="center" label="出库价">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<!-- <el-input v-model.trim.number="scope.row.outPrice"></el-input> -->
|
<!-- <el-input v-model.trim.number="scope.row.outPrice"></el-input> -->
|
||||||
<el-input-number v-model.trim.number="scope.row.outPrice" :max="9999999" :min="0" maxlength="7" placeholder="价格" />
|
<el-input-number v-model.trim.number="scope.row.outPrice" :max="9999999" :min="0" :step="0.01" maxlength="7" placeholder="价格" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="数量" prop="inNo">
|
<el-table-column align="center" label="数量" prop="inNo">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-input-number v-model.trim.number="scope.row.outNum" :max="9999999" :min="0" maxlength="7" placeholder="个数" />
|
<el-input-number v-model.trim.number="scope.row.outNum" :max="9999999" :min="1" maxlength="7" placeholder="个数" />
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="备注" prop="remark">
|
<el-table-column align="center" label="备注" prop="remark">
|
||||||
@@ -164,14 +164,14 @@ function handleChangeitem(row: MaterialVO[]) {
|
|||||||
return {
|
return {
|
||||||
...item,
|
...item,
|
||||||
materialId: item.id,
|
materialId: item.id,
|
||||||
outNum: 0,
|
outNum: 1,
|
||||||
outPrice: 0,
|
outPrice: 1,
|
||||||
...find
|
...find
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
outNum: 0,
|
outNum: 1,
|
||||||
outPrice: 0,
|
outPrice: 1,
|
||||||
...item,
|
...item,
|
||||||
materialId: item.id
|
materialId: item.id
|
||||||
};
|
};
|
||||||
@@ -198,7 +198,7 @@ const submitForm = () => {
|
|||||||
return item.costPrice !== 0 && item.costPrice !== null && item.outNum !== 0 && item.outNum !== null;
|
return item.costPrice !== 0 && item.costPrice !== null && item.outNum !== 0 && item.outNum !== null;
|
||||||
});
|
});
|
||||||
if (!bol) {
|
if (!bol) {
|
||||||
ElMessage.warning('出库数量,出库价格 不能未空或者0');
|
ElMessage.warning('出库价格 不能为0');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,8 @@
|
|||||||
<el-input-number
|
<el-input-number
|
||||||
v-model.trim.number="scope.row.costPrice"
|
v-model.trim.number="scope.row.costPrice"
|
||||||
:max="9999999"
|
:max="9999999"
|
||||||
:min="1"
|
:min="0.1"
|
||||||
|
:step="0.1"
|
||||||
maxlength="7"
|
maxlength="7"
|
||||||
placeholder="请输入"
|
placeholder="请输入"
|
||||||
></el-input-number>
|
></el-input-number>
|
||||||
@@ -169,16 +170,16 @@ function handleChangeitem(row: MaterialVO[]) {
|
|||||||
if (find || form.value.items.length <= 0) {
|
if (find || form.value.items.length <= 0) {
|
||||||
return {
|
return {
|
||||||
...item,
|
...item,
|
||||||
costPrice: 0,
|
costPrice: 1,
|
||||||
inNum: 0,
|
inNum: 1,
|
||||||
materialId: item.id,
|
materialId: item.id,
|
||||||
...find
|
...find
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
...item,
|
...item,
|
||||||
costPrice: 0,
|
costPrice: 1,
|
||||||
inNum: 0,
|
inNum: 1,
|
||||||
materialId: item.id
|
materialId: item.id
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user