pc管理后台常见功能

<template>
    <div class="container">
        <el-row class="header" style="margin-bottom: 10px;">
            <el-card shadow="never">
                <el-form :inline="true" :model="payload" status-icon label-width="80px" class="searchForm">
                    <el-form-item label="摊位名称">
                        <el-select v-model="payload.sid" placeholder="请选择摊位(单元)">
                            <el-option v-for="item in rentStallList" :label="item.stallName" :value="item.id"></el-option>
                        </el-select>
                    </el-form-item>
                    <el-form-item label="所属市场">
                        <el-select v-model="payload.aid" placeholder="请选择所属市场">
                            <el-option v-for="item in areaList" :label="item.areaName" :value="item.id"></el-option>
                        </el-select>
                    </el-form-item>
                    <el-form-item label="合同编号">
                        <el-input clearable v-model="payload.contractNumber" placeholder="请输入合同编号"></el-input>
                    </el-form-item>
                    <el-form-item label="租户姓名">
                        <el-input clearable v-model="payload.tenantName" placeholder="请输入合同编号"></el-input>
                    </el-form-item>
                    <el-form-item label="合同状态">
                        <el-select v-model="payload.stus" placeholder="请选择合同状态">
                            <el-option label="生效中" :value="0"></el-option>
                            <el-option label="已到期" :value="1"></el-option>
                            <el-option label="已退租" :value="2"></el-option>
                        </el-select>
                    </el-form-item>
                    <el-form-item label="租赁结束日期" label-width="150">
                        <el-date-picker v-model="timeRange" size="mini" type="daterange" align="right" unlink-panels
                            range-separator="至" value-format="yyyy-MM-dd" format="yyyy-MM-dd">
                        </el-date-picker>
                    </el-form-item>
                    <!-- #409EFF -->
                    <el-button @click="getContractList()" type="primary" icon="el-icon-search">查询</el-button>
                    <el-button @click="handleReset" icon="el-icon-refresh-right">重置</el-button>
                </el-form>
            </el-card>
        </el-row>
        <el-row class="body">
            <el-card shadow="never">
                <div class="table-header">
                    <!-- 导出/新增按钮 -->
                    <div>
                        <el-button @click="exportDialogVisible = true" type="primary" icon="el-icon-download">导出</el-button>
                        <el-button @click="handelOpenEditDialog('新增')" type="primary" icon="el-icon-plus">新增</el-button>
                        <!-- <el-button @click="openUpdateDialog" type="success" icon="el-icon-edit-outline">批量续租</el-button> -->
                    </div>
                    <!-- 刷新按钮 -->
                    <div>
                        <el-tooltip class="item" effect="dark" content="刷新" placement="top">
                            <i @click="getContractList()" class="el-icon-refresh" style="cursor: pointer;"></i>
                        </el-tooltip>
                    </div>
                </div>
                <el-table @selection-change="handleSelectionChange" height="80%" class="table-content" :data="tableData"
                    style="width: 100%" v-loading="loading" ref="myTable">
                    <!-- 空状态 -->
                    <template slot="empty">
                        <el-empty description="暂无数据"></el-empty>
                    </template>
                    <!-- 列表数据 -->
                    <el-table-column type="selection" width="55">
                    </el-table-column>
                    <el-table-column label="序号" width="60" align="center">
                        <template slot-scope="{ $index }">
                            <div>
                                <span> {{ $index + 1 }}</span>
                            </div>
                        </template>
                    </el-table-column>
                    <el-table-column prop="stallNumber" label="单元id">
                    </el-table-column>
                    <el-table-column prop="stallName" label="摊位名称" width="100">
                    </el-table-column>
                    <el-table-column prop="contractNumber" label="合同编号" width="150">
                    </el-table-column>
                    <el-table-column prop="tenantName" label="租户姓名" width="150" fixed="left">
                    </el-table-column>
                    <el-table-column prop="tenantPhone" label="租户联系电话" width="150">
                    </el-table-column>
                    <el-table-column prop="areaName" label="所属市场">
                    </el-table-column>
                    <el-table-column prop="startTime" label="租赁开始日期" width="150">
                    </el-table-column>
                    <el-table-column prop="endTime" label="租赁结束日期" width="150">
                    </el-table-column>
                    <el-table-column prop="leaseTerm" label="租期">
                    </el-table-column>
                    <el-table-column label="到期提醒" width="150">
                        <template slot-scope="scope">
                            <span v-if="scope.row.expirationReminder == 0">提前一周</span>
                            <span v-if="scope.row.expirationReminder == 1">提前一月</span>
                            <span v-if="scope.row.expirationReminder == 2">提前三月</span>
                            <span v-if="scope.row.expirationReminder == 3"> 提前半年</span>
                        </template>
                    </el-table-column>
                    <el-table-column prop="stus" label="合同状态" width="150">
                        <template slot-scope="scope">
                            <el-tag :type="calculateDayDiff(scope.row.endTime)" v-if="scope.row.stus == 0">生效中</el-tag>
                            <el-tag type="info" v-if="scope.row.stus == 1">已到期</el-tag>
                            <el-tag type="info" v-if="scope.row.stus == 2">已退租</el-tag>
                        </template>
                    </el-table-column>
                    <el-table-column prop="foodBusinessNumber" label="食品经营许可证编号" width="150">
                    </el-table-column>
                    <el-table-column prop="businessNumber" label="营业执照编号" width="150">
                    </el-table-column>
                    <el-table-column prop="businessName" label="企业名称" width="150">
                    </el-table-column>
                    <el-table-column label="操作" fixed="right" width="160">
                        <template slot-scope="scope">
                            <el-button v-if="scope.row.stus != 2" @click="handelOpenEditDialog('编辑', scope.row)" type="text"
                                size="small">编辑</el-button>
                            <el-button @click="handelOpenEditDialog('详情', scope.row)" type="text"
                                size="small">详情</el-button>
                            <el-dropdown v-if="scope.row.stus != 2">
                                <span class="el-dropdown-link" style="color: #409EFF;cursor:pointer;">
                                    更多<i class="el-icon-arrow-down el-icon--right"></i>
                                </span>
                                <el-dropdown-menu slot="dropdown">
                                    <el-dropdown-item
                                        @click.native="handelOpenEditDialog('续签', scope.row)">续签</el-dropdown-item>
                                    <el-dropdown-item @click.native="handleRentOut(scope.row)">退租</el-dropdown-item>
                               <!-- <el-dropdown-item v-if="scope.row.stus != 2"
                                        @click.native="handleDelete(scope.row)">删除
                                    </el-dropdown-item> -->
                                </el-dropdown-menu>
                            </el-dropdown>
                        </template>
                    </el-table-column>
                </el-table>
                <div class="table-footer">
                    <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
                        :current-page="pagination.currentPage" :page-sizes="[1, 50, 100, 500]"
                        :page-size="pagination.pageSize" layout="total, sizes, prev, pager, next, jumper"
                        :total="pagination.total" background>
                    </el-pagination>
                </div>
                <!-- 编辑(新增、续签、详情)弹框 -->
                <el-dialog :close-on-click-modal="false" v-loading="dialog_loading" :title="dialogTitle"
                    :visible.sync="editDialogVisible" :modal="true" append-to-body width="60%" class="detail-dialog"
                    @close="handleCloseEditDialog()">
                    <el-form label-position="top" :model="editForm" label-width="100px" :rules="rules" ref="editForm"
                        class="demo-ruleForm">
                        <el-row :gutter="10">
                            <div style="height: 500px;overflow-y: auto;">
                                <el-col :span="12">
                                    <el-form-item label="合同编号" prop="contractNumber">
                                        <el-input :disabled="dialogTitle == '详情'" clearable maxlength="50"
                                            v-model="editForm.contractNumber" placeholder="请输入合同编号(若无将自动生成)"></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item prop="sid" label="选择摊位(单位)" v-if="dialogTitle == '新增'">
                                        <el-select @click.native="handleOpenRadioTable()" clearable
                                            v-model="editForm.stallName" placeholder="请选择摊位"></el-select>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12" v-if="dialogTitle != '新增'">
                                    <el-form-item label="选择摊位" prop="sid">
                                        <el-input disabled v-model="editForm.stallName"></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item label="租户姓名" prop="tenantName">
                                        <el-input :disabled="dialogTitle == '详情'" clearable v-model="editForm.tenantName"
                                            placeholder="请输入租户姓名"></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item label="摊位面积(平方米)" prop="stallExtent">
                                        <el-input disabled clearable v-model="editForm.stallExtent"
                                            placeholder="请输入摊位面积"></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item label="租户联系电话" prop="tenantPhone">
                                        <el-input :disabled="dialogTitle == '详情'" clearable v-model="editForm.tenantPhone"
                                            placeholder="请输入联系电话"></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item label="所属市场" prop="aid">
                                        <el-input disabled clearable v-model="editForm.aName" placeholder="所属市场"></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item label="租户身份证" prop="idCard">
                                        <el-input :disabled="dialogTitle == '详情'" clearable v-model="editForm.idCard"
                                            placeholder="请输入租户身份证"></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item label="摊位类型" prop="stallType">
                                        <el-select disabled clearable v-model="editForm.stallType" placeholder="请选择摊位类型">
                                            <el-option v-for="item in stallTypes" :label="item.styleName"
                                                :value="item.fid"></el-option>
                                        </el-select>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item label="租赁开始时间" prop="startTime">
                                        <el-date-picker :disabled="dialogTitle == '详情'||dialogTitle == '编辑'" format="yyyy-MM-dd"
                                            value-format="yyyy-MM-dd" v-model="editForm.startTime" type="date"
                                            placeholder="选择开始日期">
                                        </el-date-picker>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item label="租赁结束时间" prop="endTime">
                                        <el-date-picker :disabled="dialogTitle == '详情'||dialogTitle == '编辑'" format="yyyy-MM-dd"
                                            value-format="yyyy-MM-dd" v-model="editForm.endTime" type="date"
                                            placeholder="选择结束日期">
                                        </el-date-picker>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item label="租期" prop="leaseTerm">
                                        <el-input-number v-model="editForm.leaseTerm" :precision="1" :step="1"
                                            disabled></el-input-number>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="12">
                                    <el-form-item label="保证金" prop="deposit">
                                        <el-input-number :disabled="dialogTitle == '详情'" v-model="editForm.deposit" :min="0"
                                            :max="1000000" :precision="2" :step="100" ></el-input-number>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="24">
                                    <el-form-item label="合同附件">
                                        <UploadFz v-model="contractAnnex" :showTip="true" fileSize="60" accept=".pdf">
                                        </UploadFz>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="24">
                                    <el-form-item label="食品经营许可证编号" prop="foodBusinessNumber">
                                        <el-input :disabled="dialogTitle == '详情'" clearable
                                            v-model="editForm.foodBusinessNumber" placeholder="请输入食品经营许可证编号"></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="24">
                                    <el-form-item label="企业名称" prop="businessName ">
                                        <el-input :disabled="dialogTitle == '详情'" clearable v-model="editForm.businessName"
                                            placeholder="请输入企业名称"></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="24">
                                    <el-form-item label="营业执照编号" prop="businessNumber">
                                        <el-input :disabled="dialogTitle == '详情'" clearable
                                            v-model="editForm.businessNumber" placeholder="请输入营业执照编号"></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="24">
                                    <el-card>
                                        <div slot="header" class="clearfix">
                                            <span>租赁到期提醒</span>
                                        </div>
                                        <el-col :span="24">
                                            <el-form-item label="到期提醒" prop="expirationReminder">
                                                <el-select :disabled="dialogTitle == '详情'" clearable
                                                    v-model="editForm.expirationReminder" placeholder="到期提醒">
                                                    <el-option label="提前一周" :value="0"></el-option>
                                                    <el-option label="提前一个月" :value="1"></el-option>
                                                    <el-option label="提前三个月" :value="2"></el-option>
                                                    <el-option label="提前半年" :value="3"></el-option>
                                                </el-select>
                                            </el-form-item>
                                        </el-col>
                                        <el-col :span="12">
                                            <el-form-item label="提醒间隔" prop="reminderInterval">
                                                <el-input-number :disabled="dialogTitle == '详情'"
                                                    v-model="editForm.reminderInterval" :precision="0" :step="1" :min="0"
                                                    :max="1000"></el-input-number>
                                            </el-form-item>
                                        </el-col>
                                        <el-col :span="12">
                                            <el-form-item label="提醒次数" prop="reminderTotal">
                                                <el-input-number :disabled="dialogTitle == '详情'"
                                                    v-model="editForm.reminderTotal" :precision="0" :step="1" :min="0"
                                                    :max="1000"></el-input-number>
                                            </el-form-item>
                                        </el-col>
                                    </el-card>
                                </el-col>
                                <el-col :span="24">
                                    <el-form-item label="单元编号">
                                        <el-input disabled clearable v-model="editForm.stallNumber"
                                            placeholder=""></el-input>
                                    </el-form-item>
                                </el-col>
                                <el-col :span="24">
                                    <el-form-item disabled label="合同状态" prop="stus">
                                        <el-select :disabled="dialogTitle == '详情'" clearable v-model="editForm.stus"
                                            placeholder="合同状态">
                                            <el-option label="生效中" :value="0"></el-option>
                                            <el-option label="已到期" :value="1"></el-option>
                                            <el-option label="已退租" :value="2"></el-option>
                                        </el-select>
                                    </el-form-item>
                                </el-col>
                            </div>
                            <el-col :span="24">
                                <div style="text-align: right;">
                                    <el-button @click="handleEdit" type="primary">确定</el-button>
                                    <el-button @click="handleCloseEditDialog()">取消</el-button>
                                </div>
                            </el-col>
                        </el-row>
                    </el-form>
                </el-dialog>
                <!-- 导出弹框 -->
                <el-dialog title="导出数据" :visible.sync="exportDialogVisible" top="30vh" :modal="true" append-to-body
                    width="40%" class="export-dialog">
                    <el-radio-group v-model="export_payload.dataType">
                        <el-radio :label="0">当前页面数据</el-radio>
                        <el-radio :label="1">全部页面数据</el-radio>
                    </el-radio-group>
                    <div style="margin-top: 20px;border-bottom: 1px solid #DCDFE6;padding: 5px 0;"><span
                            style="font-weight: bold;font-size: 20px;margin-right: 5px;">列表数据</span><span>请选择导出字段</span>
                    </div>
                    <el-checkbox :indeterminate="isIndeterminate" v-model="checkAllColumn"
                        @change="handleCheckAllChange">全选</el-checkbox>
                    <div style="margin: 15px 0;"></div>
                    <el-checkbox-group v-model="export_payload.selectKey" @change="handleCheckedCitiesChange">
                        <el-checkbox v-for="(column, i) in export_list" :label="column.prop" :key="i">
                            {{ column.lable }}</el-checkbox>
                    </el-checkbox-group>
                </el-dialog>
                <!-- 批量续租 -->
                <el-dialog title="批量续租" :visible.sync="updateDialogVisible" :modal="true" append-to-body width="40%"
                    class="export-dialog">
                    <el-form :model="payload_ids" ref="payload_ids" :rules="rules2" label-position="top" label-width="100px"
                        class="demo-ruleForm">
                        <el-row :gutter="10">
                            <el-col :span="12">
                                <el-form-item label="租赁开始时间" prop="starttime">
                                    <el-date-picker format="yyyy-MM-dd" value-format="yyyy-MM-dd"
                                        v-model="payload_ids.starttime" type="date" placeholder="选择开始日期">
                                    </el-date-picker>
                                </el-form-item>
                            </el-col>
                            <el-col :span="12">
                                <el-form-item label="租赁结束时间" prop="endtime">
                                    <el-date-picker format="yyyy-MM-dd" value-format="yyyy-MM-dd"
                                        v-model="payload_ids.endtime" type="date" placeholder="选择结束日期">
                                    </el-date-picker>
                                </el-form-item>
                            </el-col>
                            <el-col :span="24">
                                <div style="text-align: right;">
                                    <el-button @click="handelUpdateByIds" type="primary">确定</el-button>
                                    <el-button @click="updateDialogVisible = false">取消</el-button>
                                </div>
                            </el-col>
                        </el-row>
                    </el-form>
                </el-dialog>
            </el-card>
        </el-row>
        <TableSelect @select="setStall" @close="handleCloseTableDialog" :dialogTableVisible="dialogTableVisible"
            title="选择摊位" v-if="dialogTableVisible">
        </TableSelect>
    </div>
</template>
<script>
import {
    ContractList,
    AddContract,
    EditContract,
    DeleteContract,
    ContractDetail,
    ContractOut,
    UpdateRent,
    UpdateRentOut,
    BatchUpdate,
    RentStallList,
    StallTypes,
    AreaName,
    AreaList,
} from '@/api/property/contract'
import { getModelList, deleteModel, exportModel } from '@/api/onlineDev/visualDev'
import UploadFz from '@/components/Generator/components/Upload/UploadFz.vue'
import TableSelect from './TableSelect.vue';
// 438753154494901893 modelId

export default {
    name: 'contract',
    components: {
        UploadFz,
        TableSelect,
    },
    data() {
        return {
            contractAnnex: [],
            dialogTableVisible: false,
            // 批量续租表单验证
            rules2: {
                starttime: [
                    { required: true, message: '请选择开始时间', trigger: 'blur' },
                ],
                endtime: [
                    { required: true, message: '请选择结束时间', trigger: 'blur' },
                ],
            },
            // 表单验证规则
            rules: {
                sid: [
                    { required: true, message: '请选择摊位', trigger: 'blur' },
                ],
                tenantName: [
                    { required: true, message: '请填写租户名称', trigger: 'blur' },
                    { max: 20, message: '租户名称不能超过20个字符', trigger: 'blur' },
                ],
                stallExtent: [
                    { required: true, message: '请输入摊位面积', trigger: 'blur' },
                ],
                tenantPhone: [
                    { required: true, message: '请输入租户联系方式', trigger: 'blur' },
                    { validator: this.validatePhone, message: '请填写正确的手机号', trigger: 'blur' },
                ],
                aid: [
                    { required: true, message: '请选择所属市场', trigger: 'blur' },
                ],
                idCard: [
                    { required: true, message: '请输入租户身份证', trigger: 'blur' },
                    {
                        pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
                        message: '请输入正确的身份证号码',
                        trigger: 'blur'
                    }
                ],
                startTime: [
                    { required: true, message: '请选择开始时间', trigger: 'blur' },
                ],
                endTime: [
                    { required: true, message: '请选择结束时间', trigger: 'blur' },
                ],
                leaseTerm: [
                    { required: true, message: '请输入租期', trigger: 'blur' },
                ],
                deposit: [
                    { required: true, message: '请输入保证金', trigger: 'blur' },
                ],
                expirationReminder: [
                    { required: true, message: '请选择到期提醒', trigger: 'blur' },
                ],
                reminderInterval: [
                    { required: true, message: '请输入提醒间隔', trigger: 'blur' },
                ],
                reminderTotal: [
                    { required: true, message: '请输入提醒次数', trigger: 'blur' },
                ],
                stus: [
                    { required: true, message: '请选择合同状态', trigger: 'blur' },
                ],
                // 食品经营许可证和营业执照格式暂不明确,只做长度限制不做格式限制
                foodBusinessNumber: [
                    // { pattern: /^[\d]{15}$/, message: '食品经营许可证格式不正确', trigger: 'blur' },
                    { max: 30, message: '食品经营许可证编号不能超过30个字符', trigger: 'blur' },

                ],
                businessName: [
                    { max: 50, message: '企业名称不能超过50个字符', trigger: 'blur' },
                ],
                businessNumber: [
                    // { pattern: /^[A-Za-z0-9]{15}$/, message: '营业执照编号格式不正确', trigger: 'blur' },
                    { max: 30, message: '营业执照编号不能超过30个字符', trigger: 'blur' },
                ],
            },
            updateDialogVisible: false,
            payload_ids: {
                ids: [],
                starttime: '',
                endtime: '',
            },
            dialog_loading: false,
            areaList: [],//市场列表
            // 摊位类型
            stallTypes: [],
            curRentStall: {},//当前选中摊位
            rentStallList: [],//摊位列表
            // 摊位请求载荷
            listPayLoad: {
                pageNum: 1,
                pageSize: 20,
                stallStatus: '',
                stallName: "",
                areaName: "",
                stallType: "",
                ascNum: 1
            },
            // 弹框标题
            dialogTitle: '编辑',
            dialogType: 0,
            sids: [],
            editForm: {
                contractNumber: "",
                tenantName: "",
                tenantPhone: "",
                idCard: "",
                startTime: "",
                endTime: "",
                leaseTerm: '',
                deposit: '',
                contractAnnex: "",
                expirationReminder: '',
                reminderInterval: '',
                reminderTotal: '',
                stus: 0,
                sid: "",
                stallName: "",
                stallNumber: "",
                stallExtent: '',
                aid: "",
                stallType: "",
                foodBusinessNumber: null,
                businessName: null,
                businessNumber: '',
                permission:this.$store.state.user.userInfo.organizeId,
            },
            editFormCache: {},
            multipleSelection: [],
            timeRange: [],
            is_expand: false,
            editDialogVisible: false,
            // 列表请求载荷
            payload: {
                contractNumber: "",
                tenantName: "",
                aid: "",//
                sid: "",//
                stus: '',
                startTime: "",
                endTime: "",
                pageNum: 1,
                pageSize: 20,
                permission:this.$store.state.user.userInfo.organizeId
            },
            // 重置查询表单
            searchFormReset: {
                contractNumber: "",
                tenantName: "",
                aid: "",//
                sid: "",//
                startTime: "",
                endTime: "",
                pageNum: 1,
                pageSize: 20,
                permission:this.$store.state.user.userInfo.organizeId
            },
            is_reset: false,// 是否重置标识
            //列表数据
            tableData: [],
            //分页数据
            pagination: {},
            loading: false,//列表加载控制
            detail: {},
            is_detail: false,
            btn_type: 0,//自定义按钮类型
            orderId: '',//订单id
            listRow: {},
            // 导出
            export_list: [
                { lable: '单元ID', prop: 'stall_number' },
                { lable: '摊位名称', prop: 'sid' },
                { lable: '合同编号', prop: 'contract_number' },
                { lable: '租户姓名', prop: 'tenant_name' },
                { lable: '租户联系电话', prop: 'tenant_phone' },
                { lable: '所属市场', prop: 'aid' },
                { lable: '租赁开始日期', prop: 'start_time' },
                { lable: '租赁结束日期', prop: 'end_time' },
                { lable: '租期', prop: 'lease_term' },
                { lable: '到期提醒', prop: 'expiration_reminder' },
                { lable: '合同状态', prop: 'stus' },
                { lable: '食品经营许可证编号', prop: 'food_business_number' },
                { lable: '营业执照编号', prop: 'business_number' },
                { lable: '企业名称', prop: 'business_name' },
            ],
            exportDialogVisible: false,//控制导出对话框状态
            checkAllColumn: true,//控制全选框是否勾选
            isIndeterminate: false,//控制全选框半选状态
            // 导出请求载荷
            export_payload: {
                dataType: 0,// 导出类型 0当前页面1全部页面
                selectKey:
                    [
                        "stall_number",
                        "sid",
                        "contract_number",
                        "tenant_name",
                        "tenant_phone",
                        "aid",
                        "start_time",
                        "end_time",
                        "lease_term",
                        "expiration_reminder",
                        "stus",
                        "food_business_number",
                        "business_number",
                        "business_name"
                    ],
            },
        }
    },
    computed: {
        export_options() {
            return this.export_list.map(item => item.prop);
        },
        calculatedLeaseTerm() {
            if (this.editForm.startTime && this.editForm.endTime) {
                const startDate = new Date(this.editForm.startTime);
                const endDate = new Date(this.editForm.endTime);
                const leaseTerm = Number(((endDate - startDate) / (1000 * 60 * 60 * 24 * 365 / 12)).toFixed(1));
                return leaseTerm;
            } else {
                return 0;
            }
        },
    },
    watch: {
        payload: {
            deep: true,
            immediate: true,
            async handler(newVal) {
                this.export_payload = { ...this.export_payload, ...newVal };
                await this.getContractList();
            }
        }
    },
    methods: {
        validatePhone(rule, value, callback) {
            const reg = /^[1][3-9][0-9]{9}$/; // 手机号正则表达式
            if (!reg.test(value)) {
                callback(new Error('请输入有效的手机号'));
            } else {
                callback();
            }
        },
        getDaysBetweenDates(date1, date2) {
            const [year1, month1, day1] = date1.split('-');
            const [year2, month2, day2] = date2.split('-');

            const timestamp1 = new Date(year1, month1 - 1, day1).getTime();
            const timestamp2 = new Date(year2, month2 - 1, day2).getTime();

            const timeDiff = Math.abs(timestamp2 - timestamp1);
            const daysDiff = Math.floor(timeDiff / (24 * 60 * 60 * 1000));

            return daysDiff;
        },
        calculateDayDiff(targetDateStr) {
            // 获取当前日期
            const currentDate = new Date();

            // 解析目标日期
            const targetDateParts = targetDateStr.split('-');
            const targetYear = parseInt(targetDateParts[0]);
            const targetMonth = parseInt(targetDateParts[1]) - 1; // 月份从 0 开始,所以需要减去 1
            const targetDay = parseInt(targetDateParts[2]);

            // 构造目标日期对象
            const targetDate = new Date(targetYear, targetMonth, targetDay);

            // 计算日期差距(以天为单位)
            const timeDiff = Math.abs(targetDate.getTime() - currentDate.getTime());
            const dayDiff = Math.ceil(timeDiff / (1000 * 3600 * 24));

            if (dayDiff < 7 || dayDiff == 7) {
                return 'danger'
            } else if (dayDiff > 7 && dayDiff < 30) {
                return 'warning'
            } else if (dayDiff > 30 || dayDiff == 30) {
                return 'success'
            }
        },
        openUpdateDialog() {
            if (this.multipleSelection.length < 1) {
                this.$message.warning('请勾选要续租的合同!');
            } else {
                this.updateDialogVisible = true;
                this.payload_ids.ids = this.multipleSelection.map(item => item.id);
            }
        },
        async handelUpdateByIds() {
            this.$refs['payload_ids'].validate(async (valid) => {
                if (valid) {
                    let res = await BatchUpdate({ ...this.payload_ids });
                    if (res.code == 200) {
                        this.$message.success('续租成功');
                        this.updateDialogVisible = false;
                        this.getContractList();
                    } else {
                        this.$message.error('续租失败');
                    }
                } else {
                    console.log('error submit!!');
                    return false;
                }
            });
        },
        async handleRentOut(data) {
            let payload = {
                sid: data.sid,
                contractNumber: data.contractNumber,
            }
            this.$confirm('确定要退租吗, 是否继续?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(async () => {
                let res = await ContractOut(data.id);
                if (res.code == 200) {
                    this.$message.success('退租成功');
                }
                await this.getContractList();
            }).catch(() => {
                this.$message({
                    type: 'info',
                    message: '已取消'
                });
            });
        },
        // 获取摊位类型
        async getStallTypes(payload) {
            let { code, data } = await StallTypes(payload);
            if (code == 200) {
                this.stallTypes = data;
            }
        },
        handleClearRentStall() {
            this.editForm.stallExtent = '';
            this.editForm.stallType = '';
            this.editForm.aid = '';
            this.editForm.aName = '';
            this.editForm.stallName = '';
        },
        // 选择摊位
        setStall(current) {
            if (current) {
                console.log(current);
                this.editForm.sid = current.id;
                this.editForm.stallExtent = current.stallExtent;
                this.editForm.stallType = current.stallType;
                this.editForm.aid = current.aid;
                this.editForm.stallName = current.stallName;
                this.editForm.stallNumber = current.stallNumber;
            }
        },
        //关闭摊位选择
        handleCloseTableDialog(val) {
            this.dialogTableVisible = val;
        },
        // 打开摊位选择
        handleOpenRadioTable() {
            this.dialogTableVisible = true;
        },
        // 获取摊位列表
        async getRentStallList() {
            let { code, data } = await RentStallList({ ...this.listPayLoad });
            if (code == 200) {
                this.rentStallList = data.list;
            }
        },
        // 获取市场列表
        async getAreaList(data) {
            let res = await AreaList(data);
            if (res.code == 200) {
                this.areaList = res.data
                console.log(res.data);
            }
        },
        // 打开弹框
        async handelOpenEditDialog(type, data) {
            this.editFormCache = JSON.parse(JSON.stringify(this.editForm));
            this.dialogTitle = type;
            if (type == '编辑' || type == '续签' || type == '详情') {
                let res = await ContractDetail(data.id);
                if (res.code == 200) {
                    this.editForm = Object.assign(this.editForm, res.data);
                }
            } else {
                this.editForm = Object.assign(this.editForm, {});
            }
            if (type == '续签') {
                this.editForm.contractNumber = '';
            }
            this.dialogType = type;
            this.editDialogVisible = true;
        },
        // 关闭弹框
        handleCloseEditDialog() {
            this.editForm = JSON.parse(JSON.stringify(this.editFormCache));
            this.editDialogVisible = false;
            this.$refs['editForm'].resetFields(); // 重置表单字段
            this.$refs['editForm'].clearValidate(); // 清空表单验证状态
        },
        // 新增合同/编辑合同
        async handleEdit() {
            this.$refs['editForm'].validate(async (valid) => {
                if (valid) {
                    this.dialogTitle == '新增' || this.dialogTitle == '续签' ? this.editForm.id = '' : '';
                    let res = this.dialogTitle == '新增' || this.dialogTitle == '续签' ? await AddContract({ ...this.editForm }) : await EditContract({ ...this.editForm });
                    if (res.code == 200) {
                        this.editDialogVisible = false;
                        this.editForm = JSON.parse(JSON.stringify(this.editFormCache));
                        this.$message.success(`${this.dialogTitle}成功`);
                        this.contractAnnex = [];
                        await this.getContractList();
                    }
                } else {
                    console.log('error submit!!');
                    return false;
                }
            });
        },
        // 多选表格项
        handleSelectionChange(val) {
            this.multipleSelection = val;
        },
        // 加载列表数据
        async getContractList() {
            this.loading = true;
            if (this.is_reset) {
                // 重置查询表单,注意深拷贝
                this.payload = JSON.parse(JSON.stringify(this.searchFormReset));
            }
            this.is_reset = false;

            let res = await ContractList({ ...this.payload });
            if (res.code == 200) {
                this.tableData = res.data.list;
                this.pagination.currentPage = res.data.pageNum;
                this.pagination.pageSize = res.data.pageSize;
                this.pagination.total = res.data.total;

                this.loading = false;
            }
        },
        // 重置列表数据
        async handleReset() {
            this.timeRange = [];
            this.is_reset = true;
            await this.getContractList();
        },
        // 更改每页显示条数
        async handleSizeChange(size) {
            this.payload.pageSize = size;
            await this.getContractList();
        },
        // 换页
        async handleCurrentChange(current) {
            this.payload.pageNum = current;
            await this.getContractList();
        },
        // 删除订单
        async handleDelete(data) {
            this.$confirm('此操作将永久删除该合同, 是否继续?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(async () => {
                let res = await DeleteContract(data.id);
                if (res.code == 200) {
                    this.$message({
                        type: 'success',
                        message: '删除成功!'
                    });
                    await this.getContractList();
                }

            }).catch((error) => {
                this.$message({
                    type: 'info',
                    message: '已取消删除'
                });
            });

        },
        // 导出模块
        handleCheckAllChange(val) {
            this.export_payload.selectKey = val ? this.export_options : [];
            this.isIndeterminate = false;
        },
        handleCheckedCitiesChange(value) {
            let checkedCount = value.length;
            this.checkAllColumn = checkedCount === this.export_options.length;
            this.isIndeterminate = checkedCount > 0 && checkedCount < this.export_options.length;
        },
        async handleExport() {
            let res = await exportModel('438753154494901893', { ...this.export_payload });
            if (res.code == 200) {
                const fileUrl = process.env.VUE_APP_BASE_API + res.data.url;
                this.downloadFileWithProgress(fileUrl, res.data.name);
                this.exportDialogVisible = false;
            }
        },
        downloadFileWithProgress(fileUrl, fileName) {
            const xhr = new XMLHttpRequest();
            xhr.open('GET', fileUrl, true);
            xhr.responseType = 'blob';

            xhr.onprogress = (event) => {
                if (event.lengthComputable) {
                    const percentComplete = (event.loaded / event.total) * 100;
                    console.log(`下载进度:${percentComplete.toFixed(2)}%`);
                }
            };

            xhr.onload = () => {
                if (xhr.status === 200) {
                    // 创建一个下载链接
                    const link = document.createElement('a');
                    link.href = window.URL.createObjectURL(xhr.response);
                    link.download = fileName;

                    // 触发点击事件,开始下载
                    link.click();

                    // 释放资源
                    window.URL.revokeObjectURL(xhr.response);
                }
            };

            xhr.send();
        }
    },
    watch: {
        timeRange: {
            handler: function (newValue, oldValue) {
                this.payload.startTime = newValue[0];
                this.payload.endTime = newValue[1];
            },
            deep: true,
            immediate: true,
        },
        'editForm.aid': {
            handler(newVal) {
                if (newVal) {
                    AreaName(newVal)
                        .then(res => {
                            // 触发Vue的响应式更新,确保视图正确地反映数据的变化
                            this.$set(this.editForm, 'aName', res.data.areaName);
                        })
                        .catch(error => {
                            console.error('获取数据失败:', error);
                        });
                }
            }
        },
        calculatedLeaseTerm(newVal) {
            this.editForm.leaseTerm = newVal;
        },
        contractAnnex(newVal) {
            this.editForm.contractAnnex = JSON.stringify(newVal);
        }
    },
    async created() {
        await this.getContractList();
        await this.getRentStallList();
        await this.getAreaList({ pid: '' });
        await this.getStallTypes({
            areaType: "440854091313203781"
        });
    },
    mounted() {
        console.log(this.$store.state.user.userInfo,'state.user.userInfo')
    }
}
</script>
<style lang="scss" scoped>
.export-dialog {

    .dialog-footer {
        display: flex;
        align-items: center;
        justify-content: space-between;
        width: 100%;
    }
}

.container {
    width: 100%;
    height: 100%;
    background-color: #F1F7FE;
    position: relative;
    z-index: 10;

    .danger-text-button {
        color: #F56C6C;
    }

    ::v-deep .el-card {
        height: 100%;
        overflow-y: auto;
    }

    .header {

        margin-bottom: 20px;
        // height: 10%;

        ::v-deep .el-card__body {
            padding-bottom: 0;
        }

        .searchForm {
            ::v-deep .el-form-item .el-form-item__label {
                font-weight: bold;
            }
        }
    }

    .body {
        height: 90%;

        ::v-deep .el-card {
            height: 100%;
        }

        ::v-deep .el-card .el-card__body {
            height: 100%;
        }

        .table-header {
            display: flex;
            align-items: center;
            justify-content: space-between;
            margin-bottom: 10px;
            height: 10%;
        }

        // .table-content {
        //     height: 80%;
        //     overflow-y: auto;
        // }

        .table-footer {
            text-align: right;
            height: 10%;
        }


    }

}
</style>

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
后台管理系统菜单管理是指对系统中的菜单进行设置和管理的过程。菜单管理的目的是为了实现不同用户、不同角色所能看见和操作的菜单的个性化定制。通过菜单管理,可以根据用户的身份和权限设置不同的菜单展示和操作功能。 在设计菜单管理功能时,首先要了解用户的需求,并进行功能划分。常见功能包括页面导航、功能划分和权限管理。页面导航是菜单最基本的功能,它可以在系统内部或系统外部进行自由切换。功能划分是通过模块划分和层级结构展示系统架构。权限管理则是针对不同角色和用户,对菜单的展示和操作进行控制。 在菜单权限管理中,服务器会根据用户的身份返回相应的菜单权限信息。通过对比用户的身份,系统可以确定当前用户需要展示哪些菜单。同时,菜单的权限也可以和用户的角色进行关联,以实现不同角色所能看见和操作的菜单不同。 为了实现个性化的菜单管理后台管理系统还需要进行路由模块划分。路由的配置决定了不同用户登录系统时所能看见的菜单是不同的。通过拆分项目中的路由,可以实现不同用户所能看见和操作的菜单个性化定制。 总结来说,后台管理系统菜单管理是通过对菜单进行设置和管理,实现不同用户、不同角色所能看见和操作的菜单个性化定制的过程。通过菜单权限管理和路由模块划分,可以实现系统中菜单的灵活管理和个性化展示。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [后台管理系统](https://blog.csdn.net/weixin_48020259/article/details/123535921)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [ruoyi是怎么点击菜单跳转页面的_电商后台设计:系统管理、菜单管理](https://blog.csdn.net/weixin_40007175/article/details/110195289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值