9/2 禅道问题

This commit is contained in:
Zy
2026-09-02 17:32:15 +08:00
parent de4bae3bc1
commit e8564269b0
45 changed files with 1036 additions and 927 deletions

View File

@@ -48,6 +48,7 @@
<el-form-item label="活动时间" prop="startTime">
<el-date-picker
v-model="activityTime"
:disabled-date="disabledDate"
end-placeholder="结束活动"
format="YYYY-MM-DD HH:mm:ss"
range-separator="至"
@@ -354,7 +355,7 @@ const disabledDate = (time: string) => {
function disabledSignInDate(time: string) {
const selectDate = new Date(time);
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();
// 报名截止日期

View File

@@ -4,9 +4,9 @@
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
<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-button type="primary" @click="handleQuery">搜索</el-button>
@@ -24,8 +24,8 @@
:disable-delete="multiple"
:disable-edit="single"
:show-add="checkPermi(['activity:activity:add'])"
:show-edit="checkPermi(['activity:activity:edit'])"
:show-delete="checkPermi(['activity:activity:remove'])"
:show-edit="checkPermi(['activity:activity:edit'])"
@update:add="handleAdd"
@update:edit="handleUpdate()"
@update:delete="handleDelete()"
@@ -33,65 +33,65 @@
</el-row>
</template>
<el-table v-loading="loading" border :data="activityList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="封面" align="center">
<el-table v-loading="loading" :data="activityList" border @selection-change="handleSelectionChange">
<el-table-column align="center" type="selection" width="55" />
<el-table-column align="center" label="封面" min-width="130px">
<template #default="scope">
<el-image
preview-teleported
lazy
:preview-src-list="[scope.row.coverImage]"
v-if="scope.row.coverImage"
:preview-src-list="[scope.row.coverImage]"
:src="scope.row.coverImage"
fit="cover"
lazy
preview-teleported
style="width: 100px; height: 100px"
></el-image>
<span v-else style="color: grey">暂无</span>
</template>
</el-table-column>
<el-table-column label="标题" align="center" prop="title" />
<el-table-column label="主办方" align="center" prop="organizer" />
<el-table-column label="签到时间" width="120" align="center" prop="signInTime">
<el-table-column align="center" label="标题" prop="title" />
<el-table-column align="center" label="主办方" prop="organizer" />
<el-table-column align="center" label="签到时间" prop="signInTime" width="120">
<template #default="scope">
<span>{{ scope.row.signinStartTime }}-{{ scope.row.signinEndTime }}</span>
</template>
</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">
<DictTag :value="scope.row.status" :options="com_publish_status"></DictTag>
<DictTag :options="com_publish_status" :value="scope.row.status"></DictTag>
</template>
</el-table-column>
<el-table-column label="活动时间" align="center">
<el-table-column align="center" label="活动时间">
<template #default="scope">
<span>{{ scope.row.startTime }}</span>
<span> -- </span>
<span>{{ scope.row.endTime }}</span>
</template>
</el-table-column>
<el-table-column label="活动地点" align="center" prop="address" />
<el-table-column label="联系人" width="120" align="center" prop="contactName" />
<el-table-column label="联系电话" width="120" align="center" prop="contactPhone" />
<el-table-column align="center" label="活动地点" prop="address" />
<el-table-column align="center" label="联系人" prop="contactName" width="120" />
<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">
<span v-if="scope.row.quota === 0">无限制</span>
<span v-else>{{ scope.row.quota }}人</span>
</template>
</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">
<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 link type="primary" @click="handleDelete(scope.row)" v-has-permi="['activity:activity:remove']">删除</el-button>
<el-button v-has-permi="['activity:activity:edit']" link type="primary" @click="handleUpdate(scope.row)">编辑</el-button>
<el-button v-has-permi="['activity:activity:remove']" link type="primary" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
</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-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 label="发布后状态" prop="status">
<el-radio-group v-model="form.status">
@@ -109,7 +109,7 @@
</div>
</template>
<script setup name="Activity" lang="ts">
<script lang="ts" name="Activity" setup>
import { listActivity, delActivity, updateActivity } from '@/api/system/Activity';
import { ActivityVO, ActivityQuery, ActivityForm } from '@/api/system/Activity/type';
import { checkPermi } from '@/utils/permission';

View File

@@ -130,6 +130,8 @@ const form = ref({
});
const rules = {
content: [{ required: true, message: '请输入办事内容', trigger: 'blur' }],
handleTime: [{ required: true, message: '请输入办事时间', trigger: 'blur' }],
handlePosition: [{ required: true, message: '请输入办事地点', trigger: 'blur' }],
seekName: [
{ required: true, message: '请选择求助人', trigger: 'blur' },
{

View File

@@ -33,6 +33,7 @@
maxlength="10"
placeholder="请输入车牌号"
style="text-transform: uppercase; letter-spacing: 2px"
@input="handleInputCarNum"
/>
</el-form-item>
</el-col>
@@ -48,6 +49,7 @@
<el-form-item label="有效日期" prop="startTime">
<el-date-picker
v-model="checkDate"
:disabled-date="disableDate"
end-placeholder="结束日期"
placeholder="选择日期"
range-separator="到"
@@ -121,15 +123,22 @@ const form = ref({
endTime: '' // 结束日期
});
const checkDate = ref([]);
function handleDate() {
form.value.startTime = checkDate.value[0];
form.value.endTime = checkDate.value[1];
// 禁用 过去日期
function disableDate(time: Date) {
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() {
checkDate.value = [];
form.value.startTime = '';
form.value.endTime = '';
}
const rules = ref({
cardCode: [
{ required: true, message: '请输入月卡编号', trigger: 'blur' },
@@ -150,8 +159,15 @@ const rules = ref({
handleName: [
{ required: false, message: '请输入姓名', trigger: 'blur' },
{
validator: (_: any, value: string | number) => validator(value, 'ChineseName'),
message: '请输入正确的中文姓名',
validator: (_: any, value: string | number, callback: (error?: Error) => void) => {
if (value === '' || value === null || value === undefined) {
return callback();
}
if (!validator(value, 'ChineseName')) {
return callback(new Error('请输入正确的中文姓名'));
}
return callback();
},
trigger: 'blur'
}
],
@@ -210,6 +226,12 @@ if (route.query.id) {
checkDate.value = [form.value.startTime, form.value.endTime];
});
}
// 处理 车牌号 输入 大写问题
function handleInputCarNum(val: string) {
form.value.carNum = val.toUpperCase();
}
// !== 提交 =============================================================================
// 提交
const submitForm = () => {

View File

@@ -45,7 +45,7 @@
<el-table-column align="center" label="绑定车牌号" prop="carNum" width="150" />
<el-table-column align="center" label="剩余有效天数" prop="handleName" width="120">
<template #default="scope">
{{ formatTimeDiff(scope.row.endTime) }}
{{ handleDiffDays(scope.row.startTime, scope.row.endTime) }}
</template>
</el-table-column>
<el-table-column align="center" label="支付方式" prop="payMethod" width="150">
@@ -118,7 +118,6 @@
import { listMonthCard, delMonthCard, addMonthCard, updateMonthCard } from '@/api/system/MonthCard';
import { MonthCardVO, MonthCardQuery, MonthCardForm } from '@/api/system/MonthCard/type';
import { checkPermi } from '@/utils/permission';
import { diffDays, formatTimeDiff } from '@/utils/time';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
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 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 () => {
loading.value = true;

View File

@@ -2,7 +2,7 @@
<div class="AddBuildingBox">
<PageHeader :title="userid ? '编辑问卷' : '添加问卷'"></PageHeader>
<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>
<template #header>
<span>基本信息</span>
@@ -25,7 +25,7 @@
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="时间范围" prop="startTime">
<el-form-item label="时间范围" required>
<el-date-picker
v-model="timeData"
:disabled-date="handleDate"
@@ -82,12 +82,9 @@ const form = ref({
startTime: '',
endTime: ''
});
const rules = ref({
startTime: [{ required: true, message: '请选择日期范围', trigger: 'blur' }]
});
const timeData = ref([]);
function handleDate(data: string) {
const date = new Date();
const date = new Date(new Date().toLocaleDateString());
return date.getTime() > new Date(data).getTime();
}
function handleModelDate(date: string) {
@@ -157,12 +154,16 @@ async function handleSave(data: QuestionComponentnaireForm) {
if (timeData.value.length <= 0) {
return ElMessage.warning('请选择问卷时间范围');
}
const list = data.content ?? [];
if (list.length <= 0) {
return ElMessage.warning('请添加问卷题目');
}
try {
// 父组件自己调用接口提交
if (userid.value !== null) {
await updateQuestionnaire({
...data,
content: JSON.stringify(data.content),
content: JSON.stringify(list),
status: '0', // 草稿状态
startTime: timeData.value[0],
endTime: timeData.value[1],
@@ -171,7 +172,7 @@ async function handleSave(data: QuestionComponentnaireForm) {
} else {
await addQuestionnaire({
...data,
content: JSON.stringify(data.content),
content: JSON.stringify(list),
status: '0', // 草稿状态
startTime: timeData.value[0],
endTime: timeData.value[1],
@@ -191,11 +192,15 @@ async function handlePublish(data: QuestionComponentnaireForm) {
if (timeData.value.length <= 0) {
return ElMessage.warning('请选择问卷时间范围');
}
const list = data.content ?? [];
if (list.length <= 0) {
return ElMessage.warning('请添加问卷题目');
}
try {
if (userid.value !== null) {
await updateQuestionnaire({
...data,
content: JSON.stringify(data.content),
content: JSON.stringify(list),
status: '1', // 发布状态
startTime: timeData.value[0],
endTime: timeData.value[1],
@@ -204,7 +209,7 @@ async function handlePublish(data: QuestionComponentnaireForm) {
} else {
await addQuestionnaire({
...data,
content: JSON.stringify(data.content),
content: JSON.stringify(list),
status: '1', // 发布状态
endTime: timeData.value[1],
startTime: timeData.value[0],

View File

@@ -3,18 +3,18 @@
<el-row :gutter="20">
<!-- 左侧:组件库 -->
<el-col :span="4">
<el-card shadow="hover" class="component-panel sticky-card">
<el-card class="component-panel sticky-card" shadow="hover">
<template #header>
<div class="card-header">
<span>组件库</span>
</div>
</template>
<draggable
:list="componentList"
:group="{ name: 'components', pull: 'clone', put: false }"
:clone="cloneComponent"
item-key="type"
:group="{ name: 'components', pull: 'clone', put: false }"
:list="componentList"
class="component-list"
item-key="type"
>
<template #item="{ element }">
<div class="component-item">
@@ -28,7 +28,7 @@
<!-- 中间:设计画布 -->
<el-col :span="12">
<el-card shadow="hover" class="canvas-panel">
<el-card class="canvas-panel" shadow="hover">
<template #header>
<div class="card-header">
<span>设计画布</span>
@@ -36,24 +36,24 @@
</template>
<div class="question-title-area">
<el-input maxlength="20" show-word-limit v-model.trim="form.title" placeholder="请输入问卷标题" class="title-input" />
<el-input maxlength="200" show-word-limit v-model.trim="form.description" type="textarea" placeholder="请输入问卷描述(选填)" />
<el-input v-model.trim="form.title" class="title-input" maxlength="20" placeholder="请输入问卷标题" show-word-limit />
<el-input v-model.trim="form.description" maxlength="200" placeholder="请输入问卷描述(选填)" show-word-limit type="textarea" />
</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 }">
<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">
<el-icon><Rank /></el-icon>
</div>
<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) }}
</el-tag>
<span>Q{{ index + 1 }}. {{ element.title || '未命名题目' }}</span>
</div>
<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>
</template>
@@ -63,16 +63,16 @@
</el-col>
<!-- 右侧:属性配置 -->
<el-col style="position: sticky; top: 60px" :span="8">
<el-card shadow="hover" class="property-panel sticky-card" v-if="activeQuestion">
<el-col :span="8" style="position: sticky; top: 60px">
<el-card v-if="activeQuestion" class="property-panel sticky-card" shadow="hover">
<template #header>
<div class="card-header">
<span>属性配置</span>
</div>
</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-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 label="是否必填">
<el-switch v-model.trim="activeQuestion.required" />
@@ -82,18 +82,19 @@
<el-divider content-position="left">选项设置</el-divider>
<div v-for="(opt, idx) in activeQuestion.options" :key="idx" class="option-item">
<el-input
maxlength="20"
v-model.trim="opt.label"
:class="{ 'is-duplicate': isOptionDuplicate(idx) }"
maxlength="20"
placeholder="选项内容"
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>
</div>
<el-button type="primary" @click="activeQuestion.options.push({ label: '选项' + (activeQuestion.options.length + 1) })">
添加选项
</el-button>
<el-button type="primary" @click="addOption">添加选项</el-button>
</template>
</el-form>
</el-card>
@@ -110,11 +111,13 @@
</div>
</template>
<script setup lang="ts" name="QuestionnaireEdit">
<script lang="ts" name="QuestionnaireEdit" setup>
import draggable from 'vuedraggable';
import { Delete, Rank, Tickets, Document, Edit } from '@element-plus/icons-vue';
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 ====================
const props = defineProps<{
/** 初始问卷数据(编辑时传入) */
@@ -129,7 +132,7 @@ const emit = defineEmits<{
/** 发布问卷 */
publish: [data: QuestionComponentnaireForm];
}>();
import { markRaw } from 'vue'; // 👈 引入 markRaw
// ==================== 响应式数据 ====================
const componentList = ref<ComponentItem[]>([
{ type: 'radio', label: '单选题', icon: markRaw(Tickets) },
@@ -157,6 +160,46 @@ const activeQuestion = computed<QuestionComponentItem | null>(() => {
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 {
const item = componentList.value.find((c) => c.type === type);
@@ -166,7 +209,7 @@ function getComponentLabel(type: string): string {
// 克隆组件(用于从左侧拖入中间)
function cloneComponent(component: ComponentItem): QuestionComponentItem {
return {
cid: Date.now(), // 生成唯一ID
cid: Date.now(),
type: component.type,
title: '',
required: true,
@@ -181,7 +224,6 @@ function selectQuestion(index: number): void {
// 添加题目后的处理
function handleAddQuestion(evt: any): void {
// 自动选中新添加的题目
activeIndex.value = evt.newIndex;
}
@@ -198,15 +240,19 @@ function deleteQuestion(index: number): void {
// ==================== 业务方法 ====================
/** 表单验证 */
function validateForm(): boolean {
// 验证问卷标题
if (!form.value.title.trim()) {
ElMessage.error('请输入问卷标题');
return false;
}
if (form.value.content.some((item) => item.title === '')) {
if (form.value.content.some((item) => !item.title?.trim())) {
ElMessage.error('请填写所有题目标题');
return false;
}
const duplicateMsg = validateAllOptions();
if (duplicateMsg) {
ElMessage.error(duplicateMsg);
return false;
}
return true;
}
@@ -237,7 +283,6 @@ function init(data: Partial<QuestionComponentnaireForm>): void {
...data
};
// 处理content字符串转对象(如果是从数据库取的)
if (typeof form.value.content === 'string') {
try {
form.value.content = JSON.parse(form.value.content);
@@ -262,7 +307,6 @@ function reset(): void {
// ==================== 生命周期 ====================
onMounted(() => {
// 如果传入了初始数据,自动初始化
if (props.initialData) {
init(props.initialData);
}
@@ -272,7 +316,7 @@ onMounted(() => {
defineExpose({ init, reset });
</script>
<style scoped lang="scss">
<style lang="scss" scoped>
.edit-container {
position: relative;
@@ -333,8 +377,27 @@ defineExpose({ init, reset });
}
}
}
.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 {
width: 100%;
background: #fff;

View File

@@ -8,7 +8,7 @@
<el-row>
<el-col v-if="type === 'private'" :span="11">
<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-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';
const houseStore = useHouseStore();
const { treedata } = storeToRefs(houseStore);
const treeData = ref([]);
const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/repair/uploadImages';
const router = useRouter();
@@ -176,6 +176,9 @@ function init() {
const obj = {
projectType: type.value === 'private' ? '1' : '0'
};
houseStore.getCurrentVilageTreeHouse().then((res) => {
treeData.value = res;
});
gettreelistRepairProject(obj).then((res) => {
maintenanceItemTreeData.value = handleTreeDisable(res.data);
if (route.query.id) {
@@ -256,9 +259,11 @@ function handleChange(pop) {
holderInfo.value = pop;
form.value.residentId = '';
form.value.residentName = '';
form.value.phone = null;
if (pop !== null) {
form.value.residentId = holderInfo.value.id;
form.value.residentName = holderInfo.value.name;
form.value.phone = holderInfo.value.phone;
}
}

View File

@@ -2,7 +2,7 @@
<div class="ResidentMainBox p-2 w-full">
<PageHeader title="报修详情"></PageHeader>
<div class="ResidentMainBody">
<el-row :span="24" :gutter="20">
<el-row :gutter="20" :span="24">
<el-col :span="16">
<!-- 车位信息 -->
<div class="mb-10">
@@ -69,20 +69,20 @@
<el-col :span="24">
<div class="carInfo_Item">
<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
:preview-teleported="true"
:zoom-rate="1.2"
v-for="(item, index) in form.problemImageUrlList"
:key="index"
:initial-index="index"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="form.problemImageUrlList"
show-progress
v-for="(item, index) in form.problemImageUrlList"
:initial-index="index"
:key="index"
:preview-teleported="true"
:src="item"
lazy
:zoom-rate="1.2"
class="carInfoImage"
lazy
show-progress
></el-image>
</div>
</div>
@@ -100,10 +100,10 @@
<div class="repair w-full h-full flex flex-items-start mt-2">
<div class="title">维修师傅</div>
<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">
<el-button v-if="form.problemStatus === '0'" @click="handleSend" type="primary">确定派单</el-button>
<el-button v-if="form.problemStatus === '1'" @click="handleChangeRepairUser" type="primary">变更人员</el-button>
<el-button v-if="form.problemStatus === '0'" type="primary" @click="handleSend">确定派单</el-button>
<el-button v-if="form.problemStatus === '1'" type="primary" @click="handleChangeRepairUser">变更人员</el-button>
<el-button @click="backRouter">返回</el-button>
</div>
</div>
@@ -133,7 +133,7 @@
</div>
</div>
</template>
<script setup lang="ts">
<script lang="ts" setup>
import { ref } from 'vue';
import StepTimeline, { StepItem } from '@/components/StepTimeline/index.vue';
import repairUser from '@/components/Holder/repairUser.vue';
@@ -222,7 +222,7 @@ async function init() {
});
}
// 处理审核╬╬
// 处理审核
function handleReview() {
if (reviewInfo.value.submitStatus === '1') {
// 提交完成
@@ -315,7 +315,7 @@ function handleEdit() {
}
</script>
<style scoped lang="scss">
<style lang="scss" scoped>
.ResidentMainBox {
display: flex;
flex-direction: column;

View File

@@ -4,49 +4,47 @@
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<div class="addBuildingFormBody">
<el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
<el-form ref="formRef" :model="form" :rules="rules" class="formBody" label-position="right" label-width="130px">
<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 label="收费类型" prop="typeId">
<el-select v-model="form.typeId">
<el-option
:disabled="item.status === '1'"
v-for="(item, index) in chargeItemList"
:key="index"
:value="item.id"
:disabled="item.status === '1'"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="计费方式" prop="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-form-item>
<el-form-item label="计算公式" prop="formula">
<el-select
v-model="form.formula"
>
<el-option v-for="(item, index) in com_charge_item_formula" :key="index" :value="item.value" :label="item.label"></el-option>
<el-select 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-select>
</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-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-form-item>
<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 label="计算精度" prop="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-form-item>
<el-form-item label="进位方式" prop="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-form-item>
<!-- <el-form-item label="启用/停用" prop="status">
@@ -56,7 +54,7 @@
</el-radio-group>
</el-form-item> -->
<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 style="margin-top: 30px">
<el-button type="primary" @click="submitForm">提交</el-button>
@@ -68,7 +66,7 @@
</div>
</template>
<script setup lang="ts">
<script lang="ts" setup>
import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { getChargeItem, updateChargeItem, addChargeItem } from '@/api/system/SdbChargeItem';
@@ -103,11 +101,16 @@ const rules = ref({
{ required: true, message: '请输入 项目名称', trigger: 'blur' },
{
validator: (_: any, value: string | number, callback: (arg0?: Error) => any) => {
if (value === '' || value === undefined) {
if (value === null || value === undefined || value === '') {
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' }],
@@ -153,7 +156,7 @@ if (route.query.id) {
}
// !== 提交 =============================================================================
// 提交
const submitForm = () => {
const submitForm = async () => {
if (form.value.formula === '2') {
form.value.unit = '';
}
@@ -185,7 +188,7 @@ function placeHolderFun(typeId: string) {
}
</script>
<style scoped lang="scss">
<style lang="scss" scoped>
.AddBuildingBox {
padding: 15px;
height: 100%;

View File

@@ -642,7 +642,7 @@ const resetQuery = () => {
payTime: undefined,
pageNum: 1,
pageSize: 20,
payStatus: null,
payStatus: queryParams.value.payStatus,
villageId: undefined,
buildingId: undefined,
unitNoId: undefined,

View File

@@ -329,7 +329,7 @@ const submitForm = () => {
// 有 公摊面积 / 房屋面积
if (shareArea || internalArea) {
if (shareArea + internalArea !== Number(form.value.houseArea)) {
return ElMessage.warning('您填写的【套内面积】+【公摊面积】计算结果,和【建筑面积】不相等');
return ElMessage.warning('填写的【套内面积】+【公摊面积】计算结果,和【建筑面积】不相等');
}
}
formRef.value?.validate(async (valid: boolean) => {

View File

@@ -1,7 +1,7 @@
<template>
<div class="UnitBox">
<div class="Unit_top flex align-center justify-between">
<div style="text-wrap: nowrap">
<div class="Unit_top flex align-center justify-between flex-wrap">
<div style="text-wrap: wrap">
<span class="text-size-16px text-color-black text-widget-bold mr-30px">
<strong>{{ houseStore.currentBuildingInfo?.buildingName }}</strong>
</span>
@@ -17,7 +17,7 @@
<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 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-option v-for="item in houseUseTypeList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
@@ -200,7 +200,7 @@ function reset() {
houseStore.getHouseBybuildingNo(housename.value, houseUse.value);
}
async function deleteAllhouse() {
async function deleteAllHouse() {
await proxy?.$modal.confirm('该信息删除后无法恢复,确定要删除吗?');
const checkhouse = houseStore.checkoutHouses;
if (checkhouse.length > 0) {
@@ -229,12 +229,16 @@ $primary_color: #1978fe;
min-height: 0;
.Unit_top {
padding: 20px;
height: 60px;
padding: 20px 20px 0;
flex-wrap: wrap;
box-sizing: border-box;
color: rgba(102, 102, 102, 1);
& > div {
margin-bottom: 10px;
}
.rightActions {
color: $primary_color;
height: 35px;
height: 25px;
span {
cursor: pointer;
}
@@ -245,17 +249,17 @@ $primary_color: #1978fe;
width: 120px;
}
@media (max-width: 1400px) {
width: 80px;
width: 100px;
}
}
.searchbox {
s .searchbox {
.searchinput {
width: 250px;
@media (max-width: 1550px) {
width: 130px;
}
@media (max-width: 1400px) {
width: 50px;
width: 80px;
}
}
}

View File

@@ -117,6 +117,7 @@
<el-form-item label="租赁起始日" prop="leaseStartDate">
<el-date-picker
v-model.trim="form.leaseStartDate"
:disabled-date="disabledStartDate"
format="YYYY-MM-DD"
placeholder="请选择租赁起始日"
style="width: 100%"
@@ -127,6 +128,7 @@
<el-form-item label="租赁终止日" prop="leaseEndDate">
<el-date-picker
v-model.trim="form.leaseEndDate"
:disabled-date="disabledEndDate"
format="YYYY-MM-DD"
placeholder="请选择租赁终止日"
style="width: 100%"
@@ -306,6 +308,33 @@ const data = reactive<PageData<HouseRentalFormType, HouseRentalQuery>>({
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 () => {
loading.value = true;
@@ -455,6 +484,12 @@ const handleExceed = () => {
ElMessage.warning(`最多只能上传 ${MAX_UPLOAD_FILES} 个附件`);
};
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) {
ElMessage.warning(`最多上传${MAX_UPLOAD_FILES}个附件,无法继续添加`);
@@ -463,6 +498,7 @@ const handleChange = (file: UploadUserFile) => {
return;
}
};
// 批量上传校验图片数量,前后端数量匹配校验
const uploadAllCarousel = async () => {
const filterArr = showImgList.value.filter((item) => {

View File

@@ -28,22 +28,19 @@
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10">
<el-col :span="5">
<span style="font-size: 1.2rem">日报列表</span>
</el-col>
<el-col :span="14"></el-col>
<el-col :span="5" style="text-align: right">
<div class="flex justify-between items-center">
<span style="font-size: 1.2rem">日报列表</span>
<div>
<el-button type="primary" @click="exportChecked">导出选中</el-button>
<el-button type="primary" @click="exportCurrentPage">导出当前页</el-button>
<el-button type="primary" @click="exportAll">导出所有</el-button>
</el-col>
</el-row>
</div>
</div>
</template>
<el-table v-loading="loading" :data="itemList" border row-key="id" @selectionChange="handleChange">
<el-table-column type="selection" width="55" />
<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="outCompletedTasks" />
<el-table-column align="center" label="超时未完成" prop="outUncompletedTasks" />

View File

@@ -28,23 +28,20 @@
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10">
<el-col :span="5">
<span style="font-size: 1.2rem">月报列表</span>
</el-col>
<el-col :span="14"> </el-col>
<el-col :span="5" style="text-align: right">
<div class="flex justify-between items-center">
<span style="font-size: 1.2rem">月报列表</span>
<div>
<el-button type="primary" @click="exportCurrentPage">导出当前页</el-button>
<el-button type="primary" @click="exportAll">导出所有</el-button>
<el-button type="primary" @click="exportChecked">导出选中</el-button>
</el-col>
</el-row>
</div>
</div>
</template>
<el-table v-loading="loading" :data="itemList" border @selectionChange="handleChange">
<el-table-column type="selection" width="55" />
<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="outCompletedTasks" />
<el-table-column align="center" label="超时未完成" prop="outUncompletedTasks" />

View File

@@ -296,7 +296,7 @@ const getList = async () => {
});
list.value[3].value = itemList.value[0].completionRateDisplay || '0%';
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[4].value += item.outUncompletedTasks ?? 0;
const num = item.outCompletedTasks + item.completedTasks || 0;

View File

@@ -71,35 +71,51 @@
>
<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="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">
<template #default="scope">
<el-tag v-if="scope.row.status === 0" type="success">正常</el-tag>
<el-tag v-else type="danger">异常</el-tag>
<div v-if="scope.row.status !== null">
<el-tag v-if="scope.row.status === 0" type="success">正常</el-tag>
<el-tag v-else type="danger">异常</el-tag>
</div>
<div v-else>---</div>
</template>
</el-table-column>
<!-- <el-table-column prop="location" align="center" label="巡检地址" /> -->
<el-table-column align="left" label="巡检结果" prop="remark" />
<el-table-column label="图片">
<el-table-column align="left" label="巡检结果" prop="remark">
<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
v-for="(item, index) in scope.row.photoslist"
:key="index"
:initial-index="0"
:initial-index="index"
:preview-src-list="scope.row.photoslist"
:preview-teleported="true"
:src="item"
fit="cover"
show-progress
style="width: 80px; height: 50px; margin-right: 10px"
/>
</div>
<div v-else>---</div>
</template>
</el-table-column>
<el-table-column align="left" label="执行结果" prop="completionStatus">
<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>
</el-table-column>
</el-table>
@@ -273,4 +289,19 @@ const cancelForm = () => {
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>

View File

@@ -28,23 +28,20 @@
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10">
<el-col :span="5">
<span style="font-size: 1.2rem">周报列表</span>
</el-col>
<el-col :span="14"> </el-col>
<el-col :span="5" style="text-align: right">
<div class="flex justify-between items-center">
<span style="font-size: 1.2rem">周报列表</span>
<div>
<el-button type="primary" @click="exportCurrentPage">导出当前页</el-button>
<el-button type="primary" @click="exportAll">导出所有</el-button>
<el-button type="primary" @click="exportChecked">导出选中</el-button>
</el-col>
</el-row>
</div>
</div>
</template>
<el-table v-loading="loading" :data="itemList" border @selectionChange="handleChange">
<el-table-column type="selection" width="55" />
<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="outCompletedTasks" />
<el-table-column align="center" label="超时未完成" prop="outUncompletedTasks" />

View File

@@ -190,7 +190,7 @@ const rules = ref({
{
validator: (_: any, value: string | number, callback: (arg0?: Error) => void) => {
if (value === '' || value === null) {
return callback(new Error('请输入车位面积'));
return callback();
}
const val = Number(value);
if (Number.isNaN(val)) {

View File

@@ -4,19 +4,19 @@
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
<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-select>
</el-form-item>
<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-select>
</el-form-item>
<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-button type="primary" @click="handleQuery">搜索</el-button>
@@ -34,8 +34,8 @@
:disable-delete="multiple"
:disable-edit="single"
:show-add="checkPermi(['parking:parking:add'])"
:show-edit="checkPermi(['parking:parking:edit'])"
:show-delete="checkPermi(['parking:parking:remove'])"
:show-edit="checkPermi(['parking:parking:edit'])"
@update:add="handleAdd"
@update:edit="handleUpdate()"
@update:delete="handleDelete()"
@@ -43,59 +43,61 @@
</el-row>
</template>
<el-table v-loading="loading" border :data="parkingList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="区域" align="center" prop="areaName"> </el-table-column>
<el-table-column label="车位编号" align="center" prop="parkingCode" />
<el-table-column label="车位面积" align="center" prop="parkingArea">
<template #default="scope"> {{ scope.row.parkingArea }}㎡ </template>
<el-table v-loading="loading" :data="parkingList" border @selection-change="handleSelectionChange">
<el-table-column align="center" type="selection" width="55" />
<el-table-column align="center" label="区域" prop="areaName"> </el-table-column>
<el-table-column align="center" label="车位编号" prop="parkingCode" />
<el-table-column align="center" label="车位面积" prop="parkingArea">
<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 label="楼层" width="80" align="center" prop="parkingFloor" />
<el-table-column label="车位类型" align="center" prop="type">
<el-table-column align="center" label="楼层" prop="parkingFloor" width="80" />
<el-table-column align="center" label="车位类型" prop="type">
<template #default="scope">
<dict-tag :options="com_parking_type" :value="scope.row.type" />
</template>
</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">
<dict-tag :options="com_parking_status" :value="scope.row.parkingStatus" />
</template>
</el-table-column>
<el-table-column label="持有人" align="center" prop="residentName">
<el-table-column align="center" label="持有人" prop="residentName">
<template #default="scope">
<span>{{ scope.row.residentName ?? scope.row.contactName }}</span>
</template>
</el-table-column>
<el-table-column label="审核状态" align="center" prop="checkStatus">
<el-table-column align="center" label="审核状态" prop="checkStatus">
<template #default="scope">
<dict-tag v-if="scope.row.checkStatus" :options="com_review" :value="scope.row.checkStatus" />
<span v-else>---</span>
</template>
</el-table-column>
<el-table-column label="备注" align="center" 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" label="备注" prop="remark" show-overflow-tooltip />
<el-table-column align="center" class-name="small-padding fixed-width" fixed="right" label="操作" width="180">
<template #default="scope">
<!-- 待审核 审核不通过 -->
<el-button
v-if="scope.row.checkStatus === '0' || scope.row.checkStatus === '2'"
v-has-permi="['parking:parking:query']"
link
type="primary"
v-if="scope.row.checkStatus === '0' || scope.row.checkStatus === '2'"
@click="handleReview(scope.row)"
v-has-permi="['parking:parking:query']"
>审核</el-button
>
<el-button link type="primary" v-else @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 link type="primary" @click="handleDelete(scope.row)" v-has-permi="['parking:parking:remove']">删除</el-button>
<el-button v-else link type="primary" @click="handleMain(scope.row)">详情</el-button>
<el-button v-has-permi="['parking:parking:edit']" link type="primary" @click="handleUpdate(scope.row)">编辑</el-button>
<el-button v-has-permi="['parking:parking:remove']" link type="primary" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<Pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
<Pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
</el-card>
</div>
</template>
<script setup name="Parking" lang="ts">
<script lang="ts" name="Parking" setup>
import pageHeader from '@/components/Pageheader/index.vue';
import Pagination from '@/components/Pagination/index.vue';
import RightToolbar from '@/components/RightToolbar/index.vue';

View File

@@ -2,7 +2,7 @@
<div class="ResidentMainBox p-2 w-full h-full">
<PageHeader></PageHeader>
<div class="ResidentMainBody">
<el-row :span="24" :gutter="20">
<el-row :gutter="20" :span="24">
<el-col :span="16">
<!-- 车位信息 -->
<div class="mb-10">
@@ -41,7 +41,7 @@
<DictTag :options="com_parking_status" :value="parkingReviewInfo.parking.parkingStatus"></DictTag>
</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="main">
<span>
@@ -59,11 +59,11 @@
</div>
</div>
<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="main">{{ parkingReviewInfo.parking.contactName }}</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="main">{{ parkingReviewInfo.parking.contactPhone }}</div>
</div>
@@ -75,14 +75,14 @@
</el-card>
</div>
<!-- 车辆信息 -->
<div class="mb-10" v-if="!showCar">
<div v-if="!showCar" class="mb-10">
<el-card>
<template #header>
<div class="card-header">
<span>车辆信息</span>
</div>
</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-col :span="8">
<div class="carInfo_item">
@@ -126,10 +126,10 @@
<el-image
v-for="(item, index) in parkingReviewInfo.car.carImageUrlList"
:key="index"
class="carInfoImage"
:src="item"
:initial-index="index"
:preview-src-list="parkingReviewInfo.car.carImageUrlList"
:src="item"
class="carInfoImage"
preview-teleported
></el-image>
</div>
@@ -137,7 +137,7 @@
</el-col>
</el-row>
</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>
</div>
</el-card>
@@ -152,7 +152,7 @@
<div class="w-full h-full flex mt-2">
<div class="title">审批意见</div>
<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">
<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)"
@@ -166,7 +166,7 @@
</div>
</el-col>
<el-col :span="8">
<el-card style="position: relative" class="h-full">
<el-card class="h-full" style="position: relative">
<template #header>
<div class="asideCardHeader w-full h-full">
<div class="cardSubtitle">
@@ -175,34 +175,12 @@
</div>
</div>
</template>
<div class="w-full h-50%">
<el-steps space="200px" direction="vertical" :active="activeStop">
<el-step :description="active <= 0 ? '' : parkingReviewInfo.parkingReviewProcess.submitTime">
<template #title>
<span v-if="active === 0">未提交信息</span>
<span v-if="active >= 1">已提交信息</span>
</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 class="w-full h-full">
<StepTimeline :steps="stepList">
<template #title="{ item }">{{ item.title }}</template>
<template #subtitle="{ item }">{{ item.subtitle }}</template>
<template #time="{ item }">{{ item.time }}</template>
</StepTimeline>
</div>
</el-card>
</el-col>
@@ -210,11 +188,12 @@
</div>
</div>
</template>
<script setup lang="ts">
<script lang="ts" setup>
import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { getParkingReview, getParkingReviewInfo } from '@/api/system/parking';
import DictTag from '@/components/DictTag/index.vue';
import StepTimeline, { StepItem } from '@/components/StepTimeline/index.vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_parking_status } = toRefs<any>(proxy?.useDict('com_parking_status'));
@@ -373,6 +352,12 @@ function 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) {
if (!rows) {
@@ -389,6 +374,11 @@ function handleActiveStaus(rows: parkingReviewProcess) {
active.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) {
active.value = 2; // 待审核
@@ -398,6 +388,10 @@ function handleActiveStaus(rows: parkingReviewProcess) {
active.value = 4; // 审核通过
activeStop.value = 2;
stepList.value[1].time = rows.propertyTime;
stepList.value[1].status = 'completed';
stepList.value[2].status = 'pending';
// 认证
if (rows.certificationStatus === certificationStatus.uncertification) {
active.value = 5; // 未认证
@@ -406,6 +400,10 @@ function handleActiveStaus(rows: parkingReviewProcess) {
} else if (rows.certificationStatus === certificationStatus.Certification) {
active.value = 6; // 已认证
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>
<style scoped lang="scss">
<style lang="scss" scoped>
.ResidentMainBox {
display: flex;
flex-direction: column;

View File

@@ -1,200 +1,197 @@
<template>
<div class="p-2 h-full flex flex-col">
<pageHeader></pageHeader>
<el-card shadow="hover">
<el-form ref="queryFormRef" :inline="true" :model="queryParams" :rules="formRules" label-width="140" @submit.prevent="handleQuery">
<div>
<el-form-item label="小区(多选)" prop="villageIds">
<el-select v-model="queryParams.villageIds" :multiple="true" placeholder="请选择小区">
<el-option v-for="item in villageList" :key="item.villageId" :label="item.villageName" :value="item.villageId" />
</el-select>
</el-form-item>
<el-form-item label="承租方" prop="lessee">
<el-input v-model.trim="queryParams.lessee" placeholder="请输入承租方" />
</el-form-item>
<el-form-item label="电话" prop="phone">
<el-input v-model.trim="queryParams.phone" placeholder="请输入电话" type="tel" />
</el-form-item>
<el-form-item label="房号" prop="roomNumber">
<el-input v-model.trim="queryParams.roomNumber" placeholder="请输入房号" />
</el-form-item>
</div>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]" style="overflow: auto; overflow-y: hidden">
<div>
<!-- 搜索条件: 面积/收费模式/收费标准 -->
<div>
<el-form-item label="面积" prop="areaSize" style="margin-bottom: 0">
<el-input v-model.trim="queryParams.areaSize" placeholder="请输入面积区间" />
</el-form-item>
<el-form-item label="收费模式(多选)" prop="chargeModes" style="margin-bottom: 0">
<el-select v-model="queryParams.chargeModes" :multiple="true" placeholder="请选择收费模式">
<el-option v-for="item in com_house_rental_pricing_model" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="收费标准(多选)" prop="chargeStandards" style="margin-bottom: 0">
<el-select v-model="queryParams.chargeStandards" :multiple="true" placeholder="请选择收费标准">
<el-option v-for="item in com_house_rental_pricing" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</div>
<div v-if="queryParams.chargeTypeFilters.length > 0" class="line"></div>
<el-scrollbar>
<div style="width: fit-content">
<!-- 搜索条件: 应收/已收/未收 ▐╬╬-->
<div class="queryBox_over">
<el-form-item
v-for="(item, index) in queryParams.chargeTypeFilters"
:key="index"
:label="`${item.chargeTypeName}(应收)`"
:prop="`chargeTypeFilters[${index}].receivable`"
>
<el-input v-model.trim="queryParams.chargeTypeFilters[index].receivable" placeholder="区间搜索 示例:100-2000" />
</el-form-item>
</div>
<div class="queryBox_over">
<el-form-item
v-for="(item, index) in queryParams.chargeTypeFilters"
:key="index"
:label="`${item.chargeTypeName}(已收)`"
:prop="`chargeTypeFilters[${index}].received`"
>
<el-input v-model.trim="queryParams.chargeTypeFilters[index].received" placeholder="区间搜索 示例:100-2000" />
</el-form-item>
</div>
<div class="queryBox_over">
<el-form-item
v-for="(item, index) in [...queryParams.chargeTypeFilters]"
:key="index"
:label="`${item.chargeTypeName}(未收)`"
:prop="`chargeTypeFilters[${index}].uncollected`"
style="margin-bottom: 0"
>
<el-input v-model.trim="queryParams.chargeTypeFilters[index].uncollected" placeholder="区间搜索 示例:100-2000" />
</el-form-item>
</div>
</div>
</el-scrollbar>
<div class="line"></div>
<!-- 搜索条件: 租赁起始日期/租赁终止日期 -->
<div class="flex justify-between">
<div>
<el-form-item label="租赁起始日期" prop="leaseStartDate">
<el-date-picker
v-model="leaseStartDate"
end-placeholder="结束日期"
format="YYYY-MM-DD"
placeholder="请选择"
range-separator="至"
start-placeholder="开始日期"
type="daterange"
value-format="YYYY-MM-DD"
@clear="handleClear('leaseStartDate')"
@update:model-value="(val: string[]) => handleUpdateLeaseDate('leaseStartDate', val)"
/>
</el-form-item>
<el-form-item label="租赁终止日期" prop="leaseEndDate">
<el-date-picker
v-model="leaseEndDate"
end-placeholder="结束日期"
format="YYYY-MM-DD"
placeholder="请选择"
range-separator="至"
start-placeholder="开始日期"
type="daterange"
value-format="YYYY-MM-DD"
@clear="handleClear('leaseEndDate')"
@update:model-value="(val: string[]) => handleUpdateLeaseDate('leaseEndDate', val)"
/>
</el-form-item>
</div>
<div v-if="showSearch">
<el-form-item label="">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
<div v-if="showSearch" class="arrowBox" style="margin-left: 10px" @click="ChangeShowSearch(false)">
<span>收起</span>
<el-icon style="margin-left: 5px"><ArrowUpBold /></el-icon>
</div>
<div v-else class="arrowBox" style="margin-left: 10px" @click="ChangeShowSearch(true)">
<span>展开</span>
<el-icon style="margin-left: 5px"><ArrowDownBold /></el-icon>
</div>
</el-form-item>
</div>
</div>
</div>
<div class="overflow-auto flex-1">
<el-card shadow="hover">
<el-form ref="queryFormRef" :inline="true" :model="queryParams" :rules="formRules" label-width="140" @submit.prevent="handleQuery">
<div>
<el-form-item label="小区(多选)" prop="villageIds">
<el-select v-model="queryParams.villageIds" :multiple="true" placeholder="请选择小区">
<el-option v-for="item in villageList" :key="item.villageId" :label="item.villageName" :value="item.villageId" />
</el-select>
</el-form-item>
<el-form-item label="承租方" prop="lessee">
<el-input v-model.trim="queryParams.lessee" placeholder="请输入承租方" />
</el-form-item>
<el-form-item label="电话" prop="phone">
<el-input v-model.trim="queryParams.phone" placeholder="请输入电话" type="tel" />
</el-form-item>
<el-form-item label="房号" prop="roomNumber">
<el-input v-model.trim="queryParams.roomNumber" placeholder="请输入房号" />
</el-form-item>
</div>
</transition>
<div v-if="!showSearch">
<el-form-item label="">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
<div v-if="showSearch" class="arrowBox" style="margin-left: 10px" @click="ChangeShowSearch(false)">
<span>收起</span>
<el-icon style="margin-left: 5px"><ArrowUpBold /></el-icon>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]" style="overflow: auto; overflow-y: hidden">
<div>
<!-- 搜索条件: 面积/收费模式/收费标准 -->
<div>
<el-form-item label="面积" prop="areaSize" style="margin-bottom: 0">
<el-input v-model.trim="queryParams.areaSize" placeholder="请输入面积区间" />
</el-form-item>
<el-form-item label="收费模式(多选)" prop="chargeModes" style="margin-bottom: 0">
<el-select v-model="queryParams.chargeModes" :multiple="true" placeholder="请选择收费模式">
<el-option v-for="item in com_house_rental_pricing_model" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item label="收费标准(多选)" prop="chargeStandards" style="margin-bottom: 0">
<el-select v-model="queryParams.chargeStandards" :multiple="true" placeholder="请选择收费标准">
<el-option v-for="item in com_house_rental_pricing" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</div>
<div v-if="queryParams.chargeTypeFilters.length > 0" class="line"></div>
<el-scrollbar>
<div style="width: fit-content">
<!-- 搜索条件: 应收/已收/未收 ▐╬╬-->
<div class="queryBox_over">
<el-form-item
v-for="(item, index) in queryParams.chargeTypeFilters"
:key="index"
:label="`${item.chargeTypeName}(应收)`"
:prop="`chargeTypeFilters[${index}].receivable`"
>
<el-input v-model.trim="queryParams.chargeTypeFilters[index].receivable" placeholder="区间搜索 示例:100-2000" />
</el-form-item>
</div>
<div class="queryBox_over">
<el-form-item
v-for="(item, index) in queryParams.chargeTypeFilters"
:key="index"
:label="`${item.chargeTypeName}(已收)`"
:prop="`chargeTypeFilters[${index}].received`"
>
<el-input v-model.trim="queryParams.chargeTypeFilters[index].received" placeholder="区间搜索 示例:100-2000" />
</el-form-item>
</div>
<div class="queryBox_over">
<el-form-item
v-for="(item, index) in [...queryParams.chargeTypeFilters]"
:key="index"
:label="`${item.chargeTypeName}(未收)`"
:prop="`chargeTypeFilters[${index}].uncollected`"
style="margin-bottom: 0"
>
<el-input v-model.trim="queryParams.chargeTypeFilters[index].uncollected" placeholder="区间搜索 示例:100-2000" />
</el-form-item>
</div>
</div>
</el-scrollbar>
<div class="line"></div>
<!-- 搜索条件: 租赁起始日期/租赁终止日期 -->
<div class="flex justify-between">
<div>
<el-form-item label="租赁起始日期" prop="leaseStartDate">
<el-date-picker
v-model="leaseStartDate"
end-placeholder="结束日期"
format="YYYY-MM-DD"
placeholder="请选择"
range-separator="至"
start-placeholder="开始日期"
type="daterange"
value-format="YYYY-MM-DD"
@clear="handleClear('leaseStartDate')"
@update:model-value="(val: string[]) => handleUpdateLeaseDate('leaseStartDate', val)"
/>
</el-form-item>
<el-form-item label="租赁终止日期" prop="leaseEndDate">
<el-date-picker
v-model="leaseEndDate"
end-placeholder="结束日期"
format="YYYY-MM-DD"
placeholder="请选择"
range-separator="至"
start-placeholder="开始日期"
type="daterange"
value-format="YYYY-MM-DD"
@clear="handleClear('leaseEndDate')"
@update:model-value="(val: string[]) => handleUpdateLeaseDate('leaseEndDate', val)"
/>
</el-form-item>
</div>
<div v-if="showSearch">
<el-form-item label="">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
<div v-if="showSearch" class="arrowBox" style="margin-left: 10px" @click="ChangeShowSearch(false)">
<span>收起</span>
<el-icon style="margin-left: 5px"><ArrowUpBold /></el-icon>
</div>
<div v-else class="arrowBox" style="margin-left: 10px" @click="ChangeShowSearch(true)">
<span>展开</span>
<el-icon style="margin-left: 5px"><ArrowDownBold /></el-icon>
</div>
</el-form-item>
</div>
</div>
</div>
</div>
<div v-else class="arrowBox" style="margin-left: 10px" @click="ChangeShowSearch(true)">
<span>展开</span>
<el-icon style="margin-left: 5px"><ArrowDownBold /></el-icon>
</div>
</el-form-item>
</div>
</el-form>
</el-card>
<el-card class="flex-1" shadow="never" style="margin-top: 5px">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="5">
</transition>
<div v-if="!showSearch">
<el-form-item label="">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
<div v-if="showSearch" class="arrowBox" style="margin-left: 10px" @click="ChangeShowSearch(false)">
<span>收起</span>
<el-icon style="margin-left: 5px"><ArrowUpBold /></el-icon>
</div>
<div v-else class="arrowBox" style="margin-left: 10px" @click="ChangeShowSearch(true)">
<span>展开</span>
<el-icon style="margin-left: 5px"><ArrowDownBold /></el-icon>
</div>
</el-form-item>
</div>
</el-form>
</el-card>
<el-card shadow="never" style="margin-top: 5px; height: 800px">
<template #header>
<div class="flex justify-between items-center">
<span>租赁管理明细</span>
</el-col>
<el-col :span="18"></el-col>
<el-col :span="1">
<el-button type="primary" @click="handleExport">导出</el-button>
</el-col>
</el-row>
</template>
<el-table v-loading="loading" :data="ArrearsDetailList" border>
<el-table-column align="center" label="区域" prop="area" />
<el-table-column align="center" label="承租方" prop="lessee" />
<el-table-column align="center" label="电话" prop="phone" width="120" />
<el-table-column align="center" label="房号" prop="roomNumber" />
<el-table-column align="center" label="面积" prop="areaSize" width="80" />
<el-table-column align="center" label="收费模式" prop="chargeMode" />
<el-table-column align="center" label="收费标准" prop="chargeStandard" />
<el-table-column align="center" label="租赁起始日" prop="leaseStartDate" />
<el-table-column align="center" label="租赁终止日" prop="leaseEndDate" />
<el-table-column align="center" label="应收项目">
<template #default>
<el-table-column v-for="(item, index) in dynamicColumns" :key="index" :label="item.chargeTypeName" align="center" prop="totalAmount">
<template #default="scope">
<span>{{ scope.row.receivableAmounts[item.chargeTypeId] }}</span>
</template>
</el-table-column>
</template>
</el-table-column>
<el-table-column align="center" label="已收项目">
<template #default>
<el-table-column v-for="(item, index) in dynamicColumns" :key="index" :label="item.chargeTypeName" align="center" prop="totalAmount">
<template #default="scope">
<span>{{ scope.row.receivedAmounts[item.chargeTypeId] }}</span>
</template>
</el-table-column>
</template>
</el-table-column>
<el-table-column align="center" label="未收项目">
<template #default>
<el-table-column v-for="(item, index) in dynamicColumns" :key="index" :label="item.chargeTypeName" align="center" prop="totalAmount">
<template #default="scope">
<span>{{ scope.row.uncollectedAmounts[item.chargeTypeId] }}</span>
</template>
</el-table-column>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
</el-card>
</div>
</template>
<el-table v-loading="loading" :data="ArrearsDetailList" border>
<el-table-column align="center" label="区域" prop="area" />
<el-table-column align="center" label="承租方" prop="lessee" />
<el-table-column align="center" label="电话" prop="phone" width="120" />
<el-table-column align="center" label="房号" prop="roomNumber" />
<el-table-column align="center" label="面积" prop="areaSize" width="80" />
<el-table-column align="center" label="收费模式" prop="chargeMode" />
<el-table-column align="center" label="收费标准" prop="chargeStandard" />
<el-table-column align="center" label="租赁起始日" prop="leaseStartDate" />
<el-table-column align="center" label="租赁终止日" prop="leaseEndDate" />
<el-table-column align="center" label="应收项目">
<template #default>
<el-table-column v-for="(item, index) in dynamicColumns" :key="index" :label="item.chargeTypeName" align="center" prop="totalAmount">
<template #default="scope">
<span>{{ scope.row.receivableAmounts[item.chargeTypeId] }}</span>
</template>
</el-table-column>
</template>
</el-table-column>
<el-table-column align="center" label="已收项目">
<template #default>
<el-table-column v-for="(item, index) in dynamicColumns" :key="index" :label="item.chargeTypeName" align="center" prop="totalAmount">
<template #default="scope">
<span>{{ scope.row.receivedAmounts[item.chargeTypeId] }}</span>
</template>
</el-table-column>
</template>
</el-table-column>
<el-table-column align="center" label="未收项目">
<template #default>
<el-table-column v-for="(item, index) in dynamicColumns" :key="index" :label="item.chargeTypeName" align="center" prop="totalAmount">
<template #default="scope">
<span>{{ scope.row.uncollectedAmounts[item.chargeTypeId] }}</span>
</template>
</el-table-column>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
</el-card>
</div>
</div>
</template>
<script lang="ts" name="Arrears" setup>

View File

@@ -4,19 +4,19 @@
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
<div class="flex justify-between">
<div>
<el-form-item label-width="100" label="截至应收账期" prop="villageId">
<el-form-item label="截至应收账期" label-width="100" prop="villageId">
<el-date-picker
v-model="queryTime"
type="daterange"
@update:model-value="handleQueryTime"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM"
range-separator="至"
start-placeholder="开始日期"
type="daterange"
value-format="YYYY-MM"
@update:model-value="handleQueryTime"
/>
</el-form-item>
<el-form-item label="小区" prop="villageId">
@@ -30,12 +30,12 @@
</el-select>
</el-form-item>
<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-select>
</el-form-item>
</div>
<div>
<div style="width: 180px">
<el-button type="primary" @click="handleQuery">搜索</el-button>
<el-button @click="resetQuery">重置</el-button>
</div>
@@ -45,37 +45,32 @@
</div>
</transition>
<el-card shadow="never" class="flex-1">
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="5">
<span>账龄分析汇总表</span>
</el-col>
<el-col :span="18"></el-col>
<el-col :span="1">
<el-button type="primary" @click="handleExport">导出</el-button>
</el-col>
</el-row>
<div class="flex justify-between items-center">
<span>账龄分析汇总表</span>
<el-button type="primary" @click="handleExport">导出</el-button>
</div>
</template>
<el-table :span-method="arraySpanMethod" v-loading="loading" border :data="AgingList">
<el-table-column label="截至应收账期" align="center" prop="cutoffPeriod" />
<el-table-column label="小区项目" align="center" prop="villageName" />
<el-table-column label="房屋类型" align="center" prop="houseTypeName" />
<el-table-column label="≤6个月" align="center" prop="amountLe6" />
<el-table-column label="6个月-12个月" align="center" prop="amountM6To12" />
<el-table-column label="1年-2年" align="center" prop="amountY1To2" />
<el-table-column label="2年-3年" align="center" prop="amountY2To3" />
<el-table-column label="3年-4年" align="center" prop="amountY3To4" />
<el-table-column label="4年-5年" align="center" prop="amountY4To5" />
<el-table-column label="5年以上" align="center" prop="amountOver5" />
<el-table-column label="合计" align="center" prop="totalAmount" />
<el-table v-loading="loading" :data="AgingList" :span-method="arraySpanMethod" border>
<el-table-column align="center" label="截至应收账期" prop="cutoffPeriod" />
<el-table-column align="center" label="小区项目" prop="villageName" />
<el-table-column align="center" label="房屋类型" prop="houseTypeName" />
<el-table-column align="center" label="≤6个月" prop="amountLe6" />
<el-table-column align="center" label="6个月-12个月" prop="amountM6To12" />
<el-table-column align="center" label="1年-2年" prop="amountY1To2" />
<el-table-column align="center" label="2年-3年" prop="amountY2To3" />
<el-table-column align="center" label="3年-4年" prop="amountY3To4" />
<el-table-column align="center" label="4年-5年" prop="amountY4To5" />
<el-table-column align="center" label="5年以上" prop="amountOver5" />
<el-table-column align="center" label="合计" prop="totalAmount" />
</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>
</div>
</template>
<script setup name="Arrears" lang="ts">
<script lang="ts" name="Arrears" setup>
import pagination from '@/components/Pagination/index.vue';
import pageHeader from '@/components/Pageheader/index.vue';
import { listHouseUseType } from '@/api/system/houseUse';

View File

@@ -4,11 +4,11 @@
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" @submit.prevent="handleQuery" :inline="true">
<el-form ref="queryFormRef" :inline="true" :model="queryParams" @submit.prevent="handleQuery">
<div class="flex justify-between">
<div>
<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-select>
</el-form-item>
@@ -26,12 +26,12 @@
</el-select>
</el-form-item>
<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-select>
</el-form-item>
</div>
<div>
<div style="width: 200px">
<el-button type="primary" @click="handleQuery">搜索</el-button>
<el-button @click="resetQuery">重置</el-button>
</div>
@@ -41,40 +41,35 @@
</div>
</transition>
<el-card shadow="never" class="flex-1">
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="5">
<span>账龄分析明细表</span>
</el-col>
<el-col :span="18"></el-col>
<el-col :span="1">
<el-button type="primary" @click="handleExport">导出</el-button>
</el-col>
</el-row>
<div class="flex justify-between items-center">
<span>账龄分析明细表</span>
<el-button type="primary" @click="handleExport">导出</el-button>
</div>
</template>
<el-table :span-method="arraySpanMethod" v-loading="loading" border :data="AgingList">
<el-table-column label="截至应收账期" align="center" prop="cutoffPeriod" />
<el-table-column label="小区项目" align="center" prop="villageName" />
<el-table-column label="楼栋" align="center" prop="buildingName" />
<el-table-column label="客户名称" align="center" prop="customerName" />
<el-table-column label="房号编号" align="center" prop="roomNo" />
<el-table-column label="欠费月数" align="center" prop="arrearsMonthsLabel" />
<el-table-column label="≤6个月" align="center" prop="amountLe6" />
<el-table-column label="6个月-12个月" align="center" prop="amountM6To12" />
<el-table-column label="1年-2年" align="center" prop="amountY1To2" />
<el-table-column label="2年-3年" align="center" prop="amountY2To3" />
<el-table-column label="3年-4年" align="center" prop="amountY3To4" />
<el-table-column label="4年-5年" align="center" prop="amountY4To5" />
<el-table-column label="5年以上" align="center" prop="amountOver5" />
<el-table-column label="合计" align="center" prop="totalAmount" />
<el-table v-loading="loading" :data="AgingList" :span-method="arraySpanMethod" border>
<el-table-column align="center" label="截至应收账期" prop="cutoffPeriod" />
<el-table-column align="center" label="小区项目" prop="villageName" />
<el-table-column align="center" label="楼栋" prop="buildingName" />
<el-table-column align="center" label="客户名称" prop="customerName" />
<el-table-column align="center" label="房号编号" prop="roomNo" />
<el-table-column align="center" label="欠费月数" prop="arrearsMonthsLabel" />
<el-table-column align="center" label="≤6个月" prop="amountLe6" />
<el-table-column align="center" label="6个月-12个月" prop="amountM6To12" />
<el-table-column align="center" label="1年-2年" prop="amountY1To2" />
<el-table-column align="center" label="2年-3年" prop="amountY2To3" />
<el-table-column align="center" label="3年-4年" prop="amountY3To4" />
<el-table-column align="center" label="4年-5年" prop="amountY4To5" />
<el-table-column align="center" label="5年以上" prop="amountOver5" />
<el-table-column align="center" label="合计" prop="totalAmount" />
</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>
</div>
</template>
<script setup name="Arrears" lang="ts">
<script lang="ts" name="Arrears" setup>
import pagination from '@/components/Pagination/index.vue';
import pageHeader from '@/components/Pageheader/index.vue';
import { getCommunitylistAPI } from '@/api/system/community';

View File

@@ -35,21 +35,18 @@
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" style="margin-bottom: 30px">
<el-col :span="5">
<div class="flex items-center">
<div style="width: 200px; font-size: 15px; margin-right: 10px">应收欠费汇总列表</div>
<el-select v-model="queryParams.viewType" placeholder="请选择视图类型" @change="handleViewTypeChange">
<el-option :value="1" label="维度1(按收费类型)" />
<el-option :value="2" label="维度2(按房屋类型)" />
</el-select>
</div>
</el-col>
<el-col :span="18"></el-col>
<el-col :span="1">
<div class="flex justify-between items-center" style="height: 40px; margin-bottom: 60px">
<div class="flex items-center">
<div style="width: 125px; font-size: 15px; margin-right: 10px">应收欠费汇总列表</div>
<el-select v-model="queryParams.viewType" placeholder="请选择视图类型" style="width: 200px" @change="handleViewTypeChange">
<el-option :value="1" label="维度1(按收费类型)" />
<el-option :value="2" label="维度2(按房屋类型)" />
</el-select>
</div>
<div>
<el-button type="primary" @click="handleExport">导出</el-button>
</el-col>
</el-row>
</div>
</div>
</template>
<el-table

View File

@@ -25,18 +25,13 @@
</transition>
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="4">
<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="fourth"></el-tab-pane>
</el-tabs>
</el-col>
<el-col :span="19"></el-col>
<el-col :span="1">
<el-button type="primary" @click="exportData">导出</el-button>
</el-col>
</el-row>
<div class="flex justify-between items-center">
<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="fourth"></el-tab-pane>
</el-tabs>
<el-button type="primary" @click="exportData">导出</el-button>
</div>
</template>
<el-table v-loading="loading" :data="AgingList" border>
<el-table-column v-if="activeName === 'first'" align="center" label="小区名称" prop="villageName" />

View File

@@ -1,246 +1,242 @@
<template>
<div class="p-2 h-full flex flex-col">
<pageHeader></pageHeader>
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form
ref="queryFormRef"
:inline="true"
:model="queryParams"
:rules="formRules"
label-position="right"
label-width="180px"
@submit.prevent="handleQuery"
>
<div>
<el-form-item label="日期" prop="payTime">
<el-date-picker
v-model="payTime"
end-placeholder="结束日期"
format="YYYY-MM-DD"
range-separator="至"
start-placeholder="开始日期"
type="daterange"
value-format="YYYY-MM-DD"
@clear="handleClear()"
@update:model-value="(val: string[]) => handleUpdateLeaseDate(val)"
/>
</el-form-item>
<el-form-item label="户主" prop="residentName">
<el-input v-model.trim="queryParams.residentName" placeholder="请输入户主姓名"></el-input>
</el-form-item>
<el-form-item label="房号" prop="houseName">
<el-input v-model.trim="queryParams.houseName" placeholder="请输入房号"></el-input>
</el-form-item>
<el-form-item label="">
<div v-show="!isShow" class="flex justify-end">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
<div class="flex items-center cursor-pointer hover:color-blue" style="margin-left: 10px; font-size: 13px" @click="toggleShow">
<span>展开</span>
<el-icon style="margin-left: 5px"><ArrowDownBold /></el-icon>
<div class="flex-1 overflow-auto">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form
ref="queryFormRef"
:inline="true"
:model="queryParams"
:rules="formRules"
label-position="right"
label-width="170px"
@submit.prevent="handleQuery"
>
<div>
<el-form-item label="日期" prop="payTime">
<el-date-picker
v-model="payTime"
end-placeholder="结束日期"
format="YYYY-MM-DD"
range-separator="至"
start-placeholder="开始日期"
type="daterange"
value-format="YYYY-MM-DD"
@clear="handleClear()"
@update:model-value="(val: string[]) => handleUpdateLeaseDate(val)"
/>
</el-form-item>
<el-form-item label="户主" prop="residentName">
<el-input v-model.trim="queryParams.residentName" placeholder="请输入户主姓名"></el-input>
</el-form-item>
<el-form-item label="房号" prop="houseName">
<el-input v-model.trim="queryParams.houseName" placeholder="请输入房号"></el-input>
</el-form-item>
<el-form-item label="">
<div v-show="!isShow" class="flex justify-end">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
<div class="flex items-center cursor-pointer hover:color-blue" style="margin-left: 10px; font-size: 13px" @click="toggleShow">
<span>展开</span>
<el-icon style="margin-left: 5px"><ArrowDownBold /></el-icon>
</div>
</div>
</el-form-item>
</div>
<div v-show="isShow">
<el-form-item label="现金" prop="cashAmount">
<el-input v-model.trim="queryParams.cashAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="支付宝" prop="alipayAmount">
<el-input v-model.trim="queryParams.alipayAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="宜当付" prop="yiDangFuAmount">
<el-input v-model.trim="queryParams.yiDangFuAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="银联" prop="unionPayAmount">
<el-input v-model.trim="queryParams.unionPayAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="转账" prop="transferAmount">
<el-input v-model.trim="queryParams.transferAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="微信" prop="wechatAmount">
<el-input v-model.trim="queryParams.wechatAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="押金抵顶" prop="depositAmount">
<el-input v-model.trim="queryParams.depositAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="房产抵顶" prop="propertyOffsetAmount">
<el-input v-model.trim="queryParams.propertyOffsetAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="减免优惠" prop="discountAmount">
<el-input v-model.trim="queryParams.discountAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
</div>
<div v-show="isShow">
<el-form-item label="水费" prop="waterFee">
<el-input v-model.trim="queryParams.waterFee" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="电费" prop="electricFee">
<el-input v-model.trim="queryParams.electricFee" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="押金" prop="deposit">
<el-input v-model.trim="queryParams.deposit" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
</div>
<div v-show="isShow" class="flex justify-between flex-wrap">
<div v-for="(item, index) in queryParamsList" :key="index">
<el-form-item :label="`${item.chargeTypeName} (金额)`">
<el-input v-model.trim="queryParams.chargeTypeFilters[index].amount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item :label="`${item.chargeTypeName} (开始时间)`">
<el-date-picker
v-model="queryParams.chargeTypeFilters[index].startDate"
clearable
end-placeholder="结束时间"
format="YYYY-MM-DD HH:mm:ss"
range-separator="到"
start-placeholder="开始时间"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
@clear="
() => {
queryParams.chargeTypeFilters[index].startDate = '';
queryParams.chargeTypeFilters[index].startDateBegin = '';
queryParams.chargeTypeFilters[index].startDateEnd = '';
}
"
@update:model-value="
(val: string[]) => {
if (val.length === 0) {
return;
}
queryParams.chargeTypeFilters[index].startDateBegin = val[0];
queryParams.chargeTypeFilters[index].startDateEnd = val[1];
}
"
/>
</el-form-item>
<el-form-item :label="`${item.chargeTypeName} (结束时间)`">
<el-date-picker
v-model="queryParams.chargeTypeFilters[index].endDate"
clearable
end-placeholder="结束时间"
format="YYYY-MM-DD HH:mm:ss"
range-separator="到"
start-placeholder="开始时间"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
@clear="
() => {
queryParams.chargeTypeFilters[index].endDate = '';
queryParams.chargeTypeFilters[index].endDateBegin = '';
queryParams.chargeTypeFilters[index].endDateEnd = '';
}
"
@update:model-value="
(val: string[]) => {
if (val.length === 0) {
return;
}
queryParams.chargeTypeFilters[index].endDateBegin = val[0];
queryParams.chargeTypeFilters[index].endDateEnd = val[1];
}
"
/>
</el-form-item>
</div>
</el-form-item>
</div>
<div v-show="isShow">
<el-form-item label="现金" prop="cashAmount">
<el-input v-model.trim="queryParams.cashAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="支付宝" prop="alipayAmount">
<el-input v-model.trim="queryParams.alipayAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="宜当付" prop="yiDangFuAmount">
<el-input v-model.trim="queryParams.yiDangFuAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="银联" prop="unionPayAmount">
<el-input v-model.trim="queryParams.unionPayAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="转账" prop="transferAmount">
<el-input v-model.trim="queryParams.transferAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="微信" prop="wechatAmount">
<el-input v-model.trim="queryParams.wechatAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="押金抵顶" prop="depositAmount">
<el-input v-model.trim="queryParams.depositAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="房产抵顶" prop="propertyOffsetAmount">
<el-input v-model.trim="queryParams.propertyOffsetAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="减免优惠" prop="discountAmount">
<el-input v-model.trim="queryParams.discountAmount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
</div>
<div v-show="isShow">
<el-form-item label="水费" prop="waterFee">
<el-input v-model.trim="queryParams.waterFee" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="电费" prop="electricFee">
<el-input v-model.trim="queryParams.electricFee" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item label="押金" prop="deposit">
<el-input v-model.trim="queryParams.deposit" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
</div>
<div v-show="isShow" class="flex justify-between flex-wrap">
<div v-for="(item, index) in queryParamsList" :key="index">
<el-form-item :label="`${item.chargeTypeName} (金额)`">
<el-input v-model.trim="queryParams.chargeTypeFilters[index].amount" placeholder="区间搜索 1000-10000"></el-input>
</el-form-item>
<el-form-item :label="`${item.chargeTypeName} (开始时间)`">
<el-date-picker
v-model="queryParams.chargeTypeFilters[index].startDate"
clearable
end-placeholder="结束时间"
format="YYYY-MM-DD HH:mm:ss"
range-separator="到"
start-placeholder="开始时间"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
@clear="
() => {
queryParams.chargeTypeFilters[index].startDate = '';
queryParams.chargeTypeFilters[index].startDateBegin = '';
queryParams.chargeTypeFilters[index].startDateEnd = '';
}
"
@update:model-value="
(val: string[]) => {
if (val.length === 0) {
return;
}
queryParams.chargeTypeFilters[index].startDateBegin = val[0];
queryParams.chargeTypeFilters[index].startDateEnd = val[1];
}
"
/>
</el-form-item>
<el-form-item :label="`${item.chargeTypeName} (结束时间)`">
<el-date-picker
v-model="queryParams.chargeTypeFilters[index].endDate"
clearable
end-placeholder="结束时间"
format="YYYY-MM-DD HH:mm:ss"
range-separator="到"
start-placeholder="开始时间"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
@clear="
() => {
queryParams.chargeTypeFilters[index].endDate = '';
queryParams.chargeTypeFilters[index].endDateBegin = '';
queryParams.chargeTypeFilters[index].endDateEnd = '';
}
"
@update:model-value="
(val: string[]) => {
if (val.length === 0) {
return;
}
queryParams.chargeTypeFilters[index].endDateBegin = val[0];
queryParams.chargeTypeFilters[index].endDateEnd = val[1];
}
"
/>
</el-form-item>
</div>
</div>
<!-- <div v-show="isShow">-->
<!-- <el-form-item label="经办人" prop="handler">-->
<!-- <el-input v-model.trim="queryParams.handler" placeholder="请输入经办人姓名"></el-input>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="备注" prop="remark">-->
<!-- <el-input v-model.trim="queryParams.remark" placeholder="请输入备注"></el-input>-->
<!-- </el-form-item>-->
<!-- </div>-->
<div v-show="isShow" class="flex justify-end">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
<div class="flex items-center cursor-pointer hover:color-blue" style="margin-left: 10px; font-size: 13px" @click="toggleShow">
<span>收起</span>
<el-icon style="margin-left: 5px"><ArrowUpBold /></el-icon>
<!-- <div v-show="isShow">-->
<!-- <el-form-item label="经办人" prop="handler">-->
<!-- <el-input v-model.trim="queryParams.handler" placeholder="请输入经办人姓名"></el-input>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="备注" prop="remark">-->
<!-- <el-input v-model.trim="queryParams.remark" placeholder="请输入备注"></el-input>-->
<!-- </el-form-item>-->
<!-- </div>-->
<div v-show="isShow" class="flex justify-end">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
<div class="flex items-center cursor-pointer hover:color-blue" style="margin-left: 10px; font-size: 13px" @click="toggleShow">
<span>收起</span>
<el-icon style="margin-left: 5px"><ArrowUpBold /></el-icon>
</div>
</div>
</div>
</el-form>
</el-card>
</div>
</transition>
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10">
<el-col :span="5">
<span> 收费日报 </span>
</el-col>
<el-col :span="18"></el-col>
<el-col :span="1">
</el-form>
</el-card>
</div>
</transition>
<el-card class="el-table-box" shadow="never">
<template #header>
<div class="flex items-center justify-between">
<span>收费日报</span>
<el-button type="primary" @click="handleExport">导出</el-button>
</el-col>
</el-row>
</template>
<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="房屋信息">
<template #default>
<el-table-column align="center" label="户主" prop="residentName" width="100"></el-table-column>
<el-table-column align="center" label="房号" prop="houseName" width="100"></el-table-column>
</template>
</el-table-column>
<el-table-column align="center" label="支付方式">
<template #default>
<el-table-column align="center" label="现金类" prop="cashAmount">
<template #default>
<el-table-column align="center" label="现金" prop="cashAmount"></el-table-column>
<el-table-column align="center" label="支付宝" prop="alipayAmount"></el-table-column>
<el-table-column align="center" label="宜当付" prop="yiDangFuAmount"></el-table-column>
<el-table-column align="center" label="银联" prop="unionPayAmount"></el-table-column>
<el-table-column align="center" label="转账" prop="transferAmount"></el-table-column>
<el-table-column align="center" label="微信" prop="wechatAmount"></el-table-column>
</template>
</el-table-column>
<el-table-column align="center" label="顶账类" prop="deposit">
<template #default>
<el-table-column align="center" label="押金抵顶" prop="depositAmount"></el-table-column>
<el-table-column align="center" label="房产抵顶" prop="propertyOffsetAmount"></el-table-column>
<el-table-column align="center" label="减免优惠" prop="discountAmount"></el-table-column>
</template>
</el-table-column>
</template>
</el-table-column>
<el-table-column align="center" label="水费" prop="waterFee" />
<el-table-column align="center" label="电费" prop="electricFee" />
<el-table-column align="center" label="押金" prop="deposit" />
<el-table-column align="center" label="收费项目" prop="chargeTypeAmounts">
<template #default>
<el-table-column v-for="(item, index) in rowChargeTypesList" :key="index" :label="item" align="center">
<template #default="scope">
<el-table-column v-if="item !== '卡表' && item !== '其他'" align="center" label="金额">
<template #default="scope">
{{ scope.row.chargeTypeAmounts[item].amount }}
</template>
</el-table-column>
<el-table-column v-if="item !== '卡表' && item !== '其他'" align="center" label="开始时间" width="100">
<template #default="scope">
{{ scope.row.chargeTypeAmounts[item].startDate }}
</template>
</el-table-column>
<el-table-column v-if="item !== '卡表' && item !== '其他'" align="center" label="结束时间" width="100">
<template #default="scope">
{{ scope.row.chargeTypeAmounts[item].endDate }}
</template>
</el-table-column>
<span v-if="item == '卡表' || item == '其他'">{{ scope.row.chargeTypeAmounts[item].amount }}</span>
</template>
</el-table-column>
</template>
</el-table-column>
<!-- <el-table-column label="经办人" align="center" prop="handler" />-->
<!-- <el-table-column show-overflow-tooltip width="250" label="备注" align="center" prop="remark" />-->
</el-table>
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
</el-card>
</div>
</template>
<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="房屋信息">
<template #default>
<el-table-column align="center" label="户主" prop="residentName" width="100"></el-table-column>
<el-table-column align="center" label="房号" prop="houseName" width="100"></el-table-column>
</template>
</el-table-column>
<el-table-column align="center" label="支付方式">
<template #default>
<el-table-column align="center" label="现金类" prop="cashAmount">
<template #default>
<el-table-column align="center" label="现金" prop="cashAmount"></el-table-column>
<el-table-column align="center" label="支付宝" prop="alipayAmount"></el-table-column>
<el-table-column align="center" label="宜当付" prop="yiDangFuAmount"></el-table-column>
<el-table-column align="center" label="银联" prop="unionPayAmount"></el-table-column>
<el-table-column align="center" label="转账" prop="transferAmount"></el-table-column>
<el-table-column align="center" label="微信" prop="wechatAmount"></el-table-column>
</template>
</el-table-column>
<el-table-column align="center" label="顶账类" prop="deposit">
<template #default>
<el-table-column align="center" label="押金抵顶" prop="depositAmount"></el-table-column>
<el-table-column align="center" label="房产抵顶" prop="propertyOffsetAmount"></el-table-column>
<el-table-column align="center" label="减免优惠" prop="discountAmount"></el-table-column>
</template>
</el-table-column>
</template>
</el-table-column>
<el-table-column align="center" label="水费" prop="waterFee" />
<el-table-column align="center" label="电费" prop="electricFee" />
<el-table-column align="center" label="押金" prop="deposit" />
<el-table-column align="center" label="收费项目" prop="chargeTypeAmounts">
<template #default>
<el-table-column v-for="(item, index) in rowChargeTypesList" :key="index" :label="item" align="center">
<template #default="scope">
<el-table-column v-if="item !== '卡表' && item !== '其他'" align="center" label="金额">
<template #default="scope">
{{ scope.row.chargeTypeAmounts[item].amount }}
</template>
</el-table-column>
<el-table-column v-if="item !== '卡表' && item !== '其他'" align="center" label="开始时间" width="100">
<template #default="scope">
{{ scope.row.chargeTypeAmounts[item].startDate }}
</template>
</el-table-column>
<el-table-column v-if="item !== '卡表' && item !== '其他'" align="center" label="结束时间" width="100">
<template #default="scope">
{{ scope.row.chargeTypeAmounts[item].endDate }}
</template>
</el-table-column>
<span v-if="item == '卡表' || item == '其他'">{{ scope.row.chargeTypeAmounts[item].amount }}</span>
</template>
</el-table-column>
</template>
</el-table-column>
<!-- <el-table-column label="经办人" align="center" prop="handler" />-->
<!-- <el-table-column show-overflow-tooltip width="250" label="备注" align="center" prop="remark" />-->
</el-table>
<pagination v-show="total > 0" v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNum" :total="total" @pagination="getList" />
</el-card>
</div>
</div>
</template>
@@ -428,7 +424,9 @@ const getList = async () => {
getDailyFeeReportList(search)
.then((res) => {
ArrearsDetailList.value = [...(res.rows ?? [])];
rowChargeTypesList.value = Object.keys(res.rows[0].chargeTypeAmounts) ?? [];
if (res.rows) {
rowChargeTypesList.value = Object.keys(res.rows[0].chargeTypeAmounts) ?? [];
}
total.value = res.total;
})
.finally(() => {
@@ -568,6 +566,9 @@ onMounted(() => {
</script>
<style lang="scss" scoped>
.el-table-box {
height: 800px;
}
.el-table {
height: calc(100% - 80px);
}

View File

@@ -33,7 +33,7 @@
</el-select>
</el-form-item>
</div>
<div>
<div style="width: 180px">
<el-button :loading="loading" type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
</div>
@@ -45,16 +45,13 @@
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="5">
<span>应收欠费明细表</span>
</el-col>
<el-col :span="15"></el-col>
<el-col :span="3">
<div class="flex justify-between items-center" style="height: 40px; margin-bottom: 15px">
<span>应收欠费明细表</span>
<div>
<el-button type="primary" @click="handleExport">导出本页</el-button>
<el-button type="primary" @click="handleExportAll">导出全部</el-button>
</el-col>
</el-row>
</div>
</div>
</template>
<el-table v-loading="loading" :data="ArrearsDetailList" :span-method="mergeSpanMethod" border>

View File

@@ -4,11 +4,11 @@
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" label-width="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>
<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-select>
</el-form-item>
@@ -39,7 +39,7 @@
</el-form-item>
</div>
</div>
<div>
<div style="width: 210px">
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
</div>
@@ -49,46 +49,40 @@
</div>
</transition>
<el-card shadow="never" class="flex-1">
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" style="margin-bottom: 30px">
<el-col :span="5">
<span> 收费月报 </span>
</el-col>
<el-col :span="18"></el-col>
<el-col :span="1">
<el-button type="primary" @click="handleExport">导出</el-button>
</el-col>
</el-row>
<div class="flex justify-between items-center">
<span> 收费月报 </span>
<el-button type="primary" @click="handleExport">导出</el-button>
</div>
</template>
<el-table v-loading="loading" border :data="ArrearsDetailList">
<el-table-column label="楼栋" align="center" prop="buildingName" />
<el-table-column label="本月应收" align="center" prop="monthReceivable" />
<el-table-column label="本月已收" align="center" prop="monthReceived" />
<el-table-column label="本月未收" align="center" prop="monthUnpaid" />
<el-table-column label="月收费率" align="center" prop="monthRate">
<el-table v-loading="loading" :data="ArrearsDetailList" border>
<el-table-column align="center" label="楼栋" prop="buildingName" />
<el-table-column align="center" label="本月应收" prop="monthReceivable" />
<el-table-column align="center" label="本月已收" prop="monthReceived" />
<el-table-column align="center" label="本月未收" prop="monthUnpaid" />
<el-table-column align="center" label="月收费率" prop="monthRate">
<template #default="scope">
{{ `${scope.row.monthRate}%` || '0%' }}
</template>
</el-table-column>
<el-table-column label="本年应收" align="center" prop="yearReceivable" />
<el-table-column label="本年已收" align="center" prop="yearReceived" />
<el-table-column label="本年未收" align="center" prop="yearUnpaid" />
<el-table-column label="年收费率" align="center" prop="yearRate">
<el-table-column align="center" label="本年应收" prop="yearReceivable" />
<el-table-column align="center" label="本年已收" prop="yearReceived" />
<el-table-column align="center" label="本年未收" prop="yearUnpaid" />
<el-table-column align="center" label="年收费率" prop="yearRate">
<template #default="scope">
{{ `${scope.row.yearRate}%` || '0%' }}
</template>
</el-table-column>
<el-table-column label="综合欠收" align="center" prop="totalPrepaid" />
<el-table-column label="综合预收" align="center" prop="totalArrears" />
<el-table-column align="center" label="综合欠收" prop="totalPrepaid" />
<el-table-column align="center" label="综合预收" prop="totalArrears" />
</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>
</div>
</template>
<script setup lang="ts">
<script lang="ts" setup>
import pagination from '@/components/Pagination/index.vue';
import pageHeader from '@/components/Pageheader/index.vue';
import { ColumnConfig, exportToExcel } from '@/utils/xlsx';

View File

@@ -42,17 +42,11 @@
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="5">
<span>实收物业费详情 </span>
</el-col>
<el-col :span="18"></el-col>
<el-col :span="1">
<el-button type="primary" @click="handleExport">导出</el-button>
</el-col>
</el-row>
<div class="flex justify-between items-center">
<span>实收物业费详情 </span>
<el-button type="primary" @click="handleExport">导出</el-button>
</div>
</template>
<el-table v-loading="loading" :data="ArrearsDetailList" border>
<el-table-column align="center" label="收费所属期" prop="name" />
<el-table-column align="center" label="序号" prop="sequence" />
@@ -70,7 +64,6 @@
</el-card>
</div>
</template>
账龄
<script lang="ts" setup>
import pagination from '@/components/Pagination/index.vue';
import pageHeader from '@/components/Pageheader/index.vue';

View File

@@ -39,20 +39,13 @@
</el-card>
</div>
</transition>
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="5">
<span>应收物业费详情 </span>
</el-col>
<el-col :span="18"></el-col>
<el-col :span="1">
<el-button type="primary" @click="handleExport">导出</el-button>
</el-col>
</el-row>
<div class="flex justify-between items-center">
<span>应收物业费详情 </span>
<el-button type="primary" @click="handleExport">导出</el-button>
</div>
</template>
<el-table v-loading="loading" :data="ArrearsDetailList" border>
<el-table-column align="center" label="收费所属期" prop="name" />
<el-table-column align="center" label="序号" prop="sequence" />
@@ -70,7 +63,6 @@
</el-card>
</div>
</template>
账龄
<script lang="ts" setup>
import pagination from '@/components/Pagination/index.vue';
import pageHeader from '@/components/Pageheader/index.vue';

View File

@@ -35,15 +35,10 @@
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="5">
<span> 预收费用余额汇总 </span>
</el-col>
<el-col :span="18"></el-col>
<el-col :span="1">
<el-button type="primary" @click="handleExport">导出</el-button>
</el-col>
</el-row>
<div class="flex justify-between items-center">
<span> 预收费用余额汇总 </span>
<el-button type="primary" @click="handleExport">导出</el-button>
</div>
</template>
<el-table v-loading="loading" :data="ArrearsDetailList" border>
@@ -64,7 +59,6 @@
</el-card>
</div>
</template>
账龄
<script lang="ts" setup>
import pagination from '@/components/Pagination/index.vue';
import pageHeader from '@/components/Pageheader/index.vue';

View File

@@ -33,15 +33,10 @@
<el-card class="flex-1" shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="5">
<span> 预收费用余额详细 </span>
</el-col>
<el-col :span="18"></el-col>
<el-col :span="1">
<el-button type="primary" @click="handleExport">导出</el-button>
</el-col>
</el-row>
<div class="flex justify-between items-center">
<span> 预收费用余额明细 </span>
<el-button type="primary" @click="handleExport">导出</el-button>
</div>
</template>
<el-table v-loading="loading" :data="ArrearsDetailList" border>

View File

@@ -76,7 +76,7 @@
</div>
</el-card>
</div>
<div v-if="activeStop !== 4" class="previewbox">
<div v-if="active < 4" class="previewbox">
<el-card>
<template #header>
<div class="card-header">
@@ -115,29 +115,12 @@
</div>
</div>
</template>
<div class="w-full h-50%">
<el-steps :active="activeStop" direction="vertical" space="200px">
<el-step :description="reviewInfo.submitTime">
<template #title>
<DictTag :options="com_sub_status" :value="reviewInfo.submitStatus || '0'"></DictTag>
</template>
</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 class="w-full h-50%" style="padding-top: 20px">
<StepTimeline :steps="stepList">
<template #title="{ item }">{{ item.title }}</template>
<template #subtitle="{ item }">{{ item.subtitle }}</template>
<template #time="{ item }">{{ item.time }}</template>
</StepTimeline>
</div>
</el-card>
</el-col>
@@ -150,12 +133,10 @@ import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { getResident, getresidentReviewlistAPI, UpdateResidentReviewAPI } from '@/api/system/residentReviewProcess/resident';
import { ResidentVO } from '@/api/system/residentReviewProcess/resident/type';
import StepTimeline, { StepItem } from '@/components/StepTimeline/index.vue';
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_certification_status } = toRefs<any>(proxy?.useDict('com_certification_status'));
const userInfo = ref<ResidentVO>({
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) {
// 提交状态 0未提交 1已提交
if (rews.submitStatus === '0') {
active.value = 0;
} 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审核未通过
// 待认证
if (rews.propertyStatus === '0') {
@@ -228,38 +209,29 @@ function handleActiveStaus(rews) {
active.value = 3;
} else if (rews.propertyStatus === '1') {
active.value = 4;
stepList.value[1].time = reviewInfo.value.propertyTime;
stepList.value[1].status = 'completed';
stepList.value[2].status = 'pending';
// 认证状态 0未认证 1已认证
if (rews.certificationStatus === '0') {
active.value = 5;
} else if (rews.certificationStatus === '1') {
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') {
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') {
reviewInfo.value = {

View File

@@ -4,11 +4,11 @@
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<div class="addBuildingFormBody">
<el-form class="formBody" label-position="left" ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form ref="formRef" :model="form" :rules="rules" class="formBody" label-position="left" label-width="100px">
<el-row>
<el-col :span="11">
<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-select>
</el-form-item>
@@ -25,13 +25,13 @@
<el-row>
<el-col :span="11">
<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-col>
<el-col :span="2"></el-col>
<el-col :span="11">
<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>
<span>㎡</span>
</template>
@@ -42,7 +42,7 @@
<el-row>
<el-col :span="11">
<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>
<span>㎡</span>
</template>
@@ -52,7 +52,7 @@
<el-col :span="2"></el-col>
<el-col :span="11">
<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>
<span>㎡</span>
</template>
@@ -61,7 +61,7 @@
</el-col>
</el-row>
<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 style="margin-top: 30px">
<el-button type="primary" @click="submitForm">提交</el-button>
@@ -73,7 +73,7 @@
</div>
</template>
<script setup lang="ts">
<script lang="ts" setup>
import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { getBuildinglistAPI } from '@/api/system/house';
@@ -211,6 +211,19 @@ function handleChangeBuild(val: string, callback?: () => void) {
});
}
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) => {
if (valid) {
const data = {
@@ -235,7 +248,7 @@ const cancelForm = () => {
};
</script>
<style scoped lang="scss">
<style lang="scss" scoped>
.AddBuildingBox {
padding: 15px;
height: 100%;

View File

@@ -4,7 +4,7 @@
<div class="AddBuildingBody">
<div class="title">基本信息</div>
<div class="addBuildingFormBody">
<el-form class="formBody" label-position="right" ref="formRef" :model="form" :rules="rules" label-width="130px">
<el-form ref="formRef" :model="form" :rules="rules" class="formBody" label-position="right" label-width="130px">
<el-form-item label="物料名称" prop="materialName">
<span>{{ form.materialName }}</span>
</el-form-item>
@@ -17,9 +17,9 @@
<el-form-item label="计量单位" prop="unit">
<span>{{ form.unit }}</span>
</el-form-item>
<el-form-item label="成本" prop="costPrice">
{{ form.costPrice }}
</el-form-item>
<!-- <el-form-item label="成本" prop="costPrice">-->
<!-- {{ form.costPrice }}-->
<!-- </el-form-item>-->
<el-form-item label="当前库存" prop="stockNum">
{{ form.stockNum }}
</el-form-item>
@@ -32,7 +32,7 @@
</div>
</template>
<script setup lang="ts">
<script lang="ts" setup>
import { ref } from 'vue';
import PageHeader from '@/components/Pageheader/index.vue';
import { listStockMain } from '@/api/system/Tstock';
@@ -86,7 +86,7 @@ const cancelForm = () => {
};
</script>
<style scoped lang="scss">
<style lang="scss" scoped>
.AddBuildingBox {
padding: 15px;
height: 100%;

View File

@@ -24,21 +24,6 @@
</transition>
<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-column align="center" type="selection" width="55" />
<el-table-column align="center" label="物料名称" prop="materialName" />

View File

@@ -62,12 +62,12 @@
<el-table-column align="center" label="出库价">
<template #default="scope">
<!-- <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>
</el-table-column>
<el-table-column align="center" label="数量" prop="inNo">
<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>
</el-table-column>
<el-table-column align="center" label="备注" prop="remark">
@@ -164,14 +164,14 @@ function handleChangeitem(row: MaterialVO[]) {
return {
...item,
materialId: item.id,
outNum: 0,
outPrice: 0,
outNum: 1,
outPrice: 1,
...find
};
} else {
return {
outNum: 0,
outPrice: 0,
outNum: 1,
outPrice: 1,
...item,
materialId: item.id
};
@@ -198,7 +198,7 @@ const submitForm = () => {
return item.costPrice !== 0 && item.costPrice !== null && item.outNum !== 0 && item.outNum !== null;
});
if (!bol) {
ElMessage.warning('出库数量,出库价格 不能未空或者0');
ElMessage.warning('出库价格 不能为0');
return;
}

View File

@@ -64,7 +64,8 @@
<el-input-number
v-model.trim.number="scope.row.costPrice"
:max="9999999"
:min="1"
:min="0.1"
:step="0.1"
maxlength="7"
placeholder="请输入"
></el-input-number>
@@ -169,16 +170,16 @@ function handleChangeitem(row: MaterialVO[]) {
if (find || form.value.items.length <= 0) {
return {
...item,
costPrice: 0,
inNum: 0,
costPrice: 1,
inNum: 1,
materialId: item.id,
...find
};
} else {
return {
...item,
costPrice: 0,
inNum: 0,
costPrice: 1,
inNum: 1,
materialId: item.id
};
}