【尚庭公寓SpringBoot + Vue 项目实战】租约管理(十四)

news2024/12/27 13:52:16

【尚庭公寓SpringBoot + Vue 项目实战】租约管理(十四)


文章目录

      • 【尚庭公寓SpringBoot + Vue 项目实战】租约管理(十四)
        • 1、业务介绍
        • 2、逻辑介绍
        • 3、接口开发
          • 3.1、保存或更新租约信息
          • 3.2、根据条件分页查询租约列表
          • 3.3、根据ID查询租约信息
          • 3.4、根据ID删除租约信息
          • 3.5、根据ID更新租约状态
          • 3.6、定时检查租约状态

1、业务介绍

租约管理共有五个接口需要实现,除此之外,还需实现一个定时任务,用于检查租约是否到期以及修改到期状态。

  1. 保存或更新租约信息
  2. 根据条件分页查询租约列表
  3. 根据ID查询租约信息
  4. 根据ID删除租约信息
  5. 根据ID更新租约状态
  6. 定时检查租约状态
2、逻辑介绍

接口定义-后台-租约管理-租约列表

image-20240617115436657

3、接口开发
3.1、保存或更新租约信息

查看接口

image-20240617115535417

代码开发

LeaseAgreementController中增加如下内容

@Tag(name = "租约管理")
@RestController
@RequestMapping("/admin/agreement")
public class LeaseAgreementController {

    @Autowired
    private LeaseAgreementService agreementService;

    @Operation(summary = "保存或修改租约信息")
    @PostMapping("saveOrUpdate")
    public Result saveOrUpdate(@RequestBody LeaseAgreement leaseAgreement) {
        agreementService.saveOrUpdate(leaseAgreement);
        return Result.ok();
    }

}
3.2、根据条件分页查询租约列表

查看接口

image-20240617121945789

  • 查看请求和响应的数据结构

    • 请求数据结构

      • currentsize为分页相关参数,分别表示当前所处页面每个页面的记录数

      • AgreementQueryVo为公寓的查询条件,详细结构如下:

        @Data
        @Schema(description = "租约查询实体")
        public class AgreementQueryVo {
        
            @Schema(description = "公寓所处省份id")
            private Long provinceId;
        
            @Schema(description = "公寓所处城市id")
            private Long cityId;
        
            @Schema(description = "公寓所处区域id")
            private Long districtId;
        
            @Schema(description = "公寓id")
            private Long apartmentId;
        
            @Schema(description = "房间号")
            private String roomNumber;
        
            @Schema(description = "用户姓名")
            private String name;
        
            @Schema(description = "用户手机号码")
            private String phone;
        }
        
    • 响应数据结构

      单个租约信息的结构可查看com.atguigu.lease.web.admin.vo.agreement.AgreementVo,内容如下:

      @Data
      @Schema(description = "租约信息")
      public class AgreementVo extends LeaseAgreement {
      
          @Schema(description = "签约公寓信息")
          private ApartmentInfo apartmentInfo;
      
          @Schema(description = "签约房间信息")
          private RoomInfo roomInfo;
      
          @Schema(description = "支付方式")
          private PaymentType paymentType;
      
          @Schema(description = "租期")
          private LeaseTerm leaseTerm;
      }
      

代码开发

LeaseAgreementController中增加如下内容

@Operation(summary = "根据条件分页查询租约列表")
@GetMapping("page")
public Result<IPage<AgreementVo>> page(@RequestParam long current, @RequestParam long size, AgreementQueryVo queryVo) {

    Page<AgreementVo> page = new Page<>(current, size);
    IPage<AgreementVo> result = agreementService.pageAgreement(page,queryVo);
    return Result.ok(result);
}

LeaseAgreementService中增加如下内容

IPage<AgreementVo> pageAgreementByQuery(IPage<AgreementVo> page, AgreementQueryVo queryVo);

LeaseAgreementServiceImpl中增加如下内容

@Autowired
private LeaseAgreementMapper leaseAgreementMapper;

/**
     * 分页查询
     *
     * @param page
     * @param queryVo
     * @return
     */
@Override
public IPage<AgreementVo> pageAgreement(Page<AgreementVo> page, AgreementQueryVo queryVo) {

    IPage<AgreementVo> agreementVoIPage = leaseAgreementMapper.pageAgreement(page,queryVo);

    return agreementVoIPage;
}

LeaseAgreementMapper中增加如下内容

IPage<AgreementVo> pageAgreementByQuery(IPage<AgreementVo> page, AgreementQueryVo queryVo);

LeaseAgreementMapper.xml中增加如下内容

<resultMap id="agreementVoMap" type="com.atguigu.lease.web.admin.vo.agreement.AgreementVo" autoMapping="true">
    <id property="id" column="id"/>
    <association property="apartmentInfo" javaType="com.atguigu.lease.model.entity.ApartmentInfo" autoMapping="true">
        <id property="id" column="apartment_id"/>
        <result property="name" column="apartment_name"/>
    </association>
    <association property="roomInfo" javaType="com.atguigu.lease.model.entity.RoomInfo" autoMapping="true">
        <id property="id" column="room_id"/>
    </association>
    <association property="paymentType" javaType="com.atguigu.lease.model.entity.PaymentType" autoMapping="true">
        <id property="id" column="payment_type_id"/>
        <result property="name" column="payment_type_name"/>
    </association>
    <association property="leaseTerm" javaType="com.atguigu.lease.model.entity.LeaseTerm" autoMapping="true">
        <id property="id" column="lease_term_id"/>
    </association>
</resultMap>

<select id="pageAgreementByQuery" resultMap="agreementVoMap">
    select la.id,
           la.phone,
           la.name,
           la.identification_number,
           la.lease_start_date,
           la.lease_end_date,
           la.rent,
           la.deposit,
           la.status,
           la.source_type,
           la.additional_info,
           ai.id   apartment_id,
           ai.name apartment_name,
           ai.district_id,
           ai.district_name,
           ai.city_id,
           ai.city_name,
           ai.province_id,
           ai.province_name,
           ri.id   room_id,
           ri.room_number,
           pt.id   payment_type_id,
           pt.name payment_type_name,
           pt.pay_month_count,
           lt.id   lease_term_id,
           lt.month_count,
           lt.unit
    from  lease_agreement la
             left join
          apartment_info ai
         on la.apartment_id = ai.id and ai.is_deleted=0
             left join
          room_info ri
         on la.room_id = ri.id and ri.is_deleted=0
             left join
          payment_type pt
         on la.payment_type_id = pt.id and pt.is_deleted=0
             left join
          lease_term lt
         on la.lease_term_id = lt.id and lt.is_deleted=0
        <where>
            la.is_deleted = 0
            <if test="queryVo.provinceId != null">
                and ai.province_id = #{queryVo.provinceId}
            </if>
            <if test="queryVo.cityId != null">
                and ai.city_id = #{queryVo.cityId}
            </if>
            <if test="queryVo.districtId != null">
                and ai.district_id = #{queryVo.districtId}
            </if>
            <if test="queryVo.apartmentId != null">
                and la.apartment_id = #{queryVo.apartmentId}
            </if>
            <if test="queryVo.roomNumber != null and queryVo.roomNumber != ''">
                and ri.room_number like concat('%',#{queryVo.roomNumber},'%')
            </if>
            <if test="queryVo.name != null and queryVo.name != ''">
                and la.name like concat('%',#{queryVo.name},'%')
            </if>
            <if test="queryVo.phone != null and queryVo.phone != ''">
                and la.phone like concat('%',#{queryVo.phone},'%')
            </if>
        </where>
</select>
3.3、根据ID查询租约信息

查看接口

image-20240617122500927

代码开发

LeaseAgreementController中增加如下内容

@Operation(summary = "根据id查询租约信息")
@GetMapping(name = "getById")
public Result<AgreementVo> getById(@RequestParam Long id) {
    AgreementVo apartment = service.getAgreementById(id);
    return Result.ok(apartment);
}

LeaseAgreementService中增加如下内容

AgreementVo getAgreementById(Long id);

LeaseAgreementServiceImpl中增加如下内容

    @Autowired
    private ApartmentInfoMapper apartmentInfoMapper;

    @Autowired
    private RoomInfoMapper roomInfoMapper;

    @Autowired
    private PaymentTypeMapper paymentTypeMapper;

    @Autowired
    private LeaseTermMapper leaseTermMapper;

    /**
     * 根据id查询租约信息
     *
     * @param id
     * @return
     */
    @Override
    public AgreementVo getLeaseAgreementById(Long id) {
        //查询租约信息
        LeaseAgreement leaseAgreement = this.getById(id);

        //查询签约公寓信息
        ApartmentInfo apartmentInfo = apartmentInfoMapper.selectById(leaseAgreement.getApartmentId());

        //查询签约信息房间
        RoomInfo roomInfo = roomInfoMapper.selectById(leaseAgreement.getRoomId());

        //查询支付方式
        PaymentType paymentType = paymentTypeMapper.selectById(leaseAgreement.getPaymentTypeId());

        //查询租期
        LeaseTerm leaseTerm = leaseTermMapper.selectById(leaseAgreement.getLeaseTermId());

        AgreementVo agreementVo = new AgreementVo();
        BeanUtils.copyProperties(leaseAgreement,agreementVo);
        agreementVo.setApartmentInfo(apartmentInfo);
        agreementVo.setRoomInfo(roomInfo);
        agreementVo.setPaymentType(paymentType);
        agreementVo.setLeaseTerm(leaseTerm);

        return agreementVo;
    }
3.4、根据ID删除租约信息

查看接口

image-20240617122845574

代码开发

LeaseAgreementController中增加如下内容

@Operation(summary = "根据id删除租约信息")
@DeleteMapping("removeById")
public Result removeById(@RequestParam Long id) {
    agreementService.removeById(id);
    return Result.ok();
}
3.5、根据ID更新租约状态

查看接口

image-20240617123014998

代码开发

后台管理系统需要多个修改租约状态的接口,例如修改租约状态为已取消修改租约状态为已退租等等。为省去重复编码,此处将多个接口合并为一个如下,注意,在生产中应避免这样的写法。

LeaseAgreementController中增加如下内容

@Operation(summary = "根据id更新租约状态")
@PostMapping("updateStatusById")
public Result updateStatusById(@RequestParam Long id, @RequestParam LeaseStatus status) {
    LambdaUpdateWrapper<LeaseAgreement> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper.eq(LeaseAgreement::getId,id);
    updateWrapper.set(LeaseAgreement::getStatus,status);
    agreementService.update(updateWrapper);
    return Result.ok();
}
3.6、定时检查租约状态

通过定时任务定时检查租约是否到期。SpringBoot内置了定时任务,具体实现如下。

  • 启用Spring Boot定时任务

    在SpringBoot启动类上增加@EnableScheduling注解,如下

    @SpringBootApplication
    @EnableScheduling
    public class AdminWebApplication {
        public static void main(String[] args) {
            SpringApplication.run(AdminWebApplication.class, args);
        }
    }
    
  • 编写定时逻辑

    web-admin模块下创建com.atguigu.lease.web.admin.schedule.ScheduledTasks类,内容如下

    @Component
    public class ScheduledTasks {
    
        @Autowired
        private LeaseAgreementService leaseAgreementService;
    
        @Scheduled(cron = "0 0 0 * * *")
        public void checkLeaseStatus() {
    
            LambdaUpdateWrapper<LeaseAgreement> updateWrapper = new LambdaUpdateWrapper<>();
            Date now = new Date();
            updateWrapper.le(LeaseAgreement::getLeaseEndDate, now);
            updateWrapper.eq(LeaseAgreement::getStatus, LeaseStatus.SIGNED);
            updateWrapper.in(LeaseAgreement::getStatus, LeaseStatus.SIGNED, LeaseStatus.WITHDRAWING);
    
            leaseAgreementService.update(updateWrapper);
        }
    }
    

    知识点:

    SpringBoot中的cron表达式语法如下

      ┌───────────── second (0-59)
      │ ┌───────────── minute (0 - 59)
      │ │ ┌───────────── hour (0 - 23)
      │ │ │ ┌───────────── day of the month (1 - 31)
      │ │ │ │ ┌───────────── month (1 - 12) (or JAN-DEC)
      │ │ │ │ │ ┌───────────── day of the week (0 - 7)
      │ │ │ │ │ │          (0 or 7 is Sunday, or MON-SUN)
      │ │ │ │ │ │
      * * * * * *
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生成对抗网络——GAN(代码+理解)

目录 一、GAN模型介绍 二、GAN模型的训练过程 1. 初始化网络&#xff1a; 2. 训练判别器&#xff1a; 3. 训练生成器&#xff1a; 4. 重复步骤 2和步骤 3&#xff1a; 三、GAN实现 1. 模型结构 &#xff08;1&#xff09;生成器&#xff08;Generator&#xff09; &a…

动态 ETL 管道:使用非结构化 IO 将 AI 与 MinIO 和 Weaviate 的 Web

在现代数据驱动的环境中&#xff0c;网络是一个无穷无尽的信息来源&#xff0c;为洞察力和创新提供了巨大的潜力。然而&#xff0c;挑战在于提取、构建和分析这片浩瀚的数据海洋&#xff0c;使其具有可操作性。这就是Unstructured-IO 的创新&#xff0c;结合MinIO的对象存储和W…

存储器的分类以及介绍

1.存储器的分类 2.按存储介质分 按照存储介质可以分为三类&#xff0c;电/磁/光 1.半导体存储器&#xff08;电&#xff09; 存储元件由半导体器件组储层的存储器称为半导体存储器。 现代的半导体存储器都是超大规模集成电路工艺制成芯片。 其优点是&#xff1a;体积小、功…

Nature 苏浩团队发表创新人工智能“仿真中学习”框架,实现外骨骼的智能性和通用性

北京时间2024年6月12日23时&#xff0c;美国北卡罗来纳州立大学与北卡罗来纳大学教堂山分校的苏浩团队在《自然》&#xff08;Nature&#xff09;上发表了一篇关于机器人和人工智能算法相结合服务人类的突破性研究论文&#xff0c;标题为“Experiment-free Exoskeleton Assista…

transformers 不同精度float16、bfloat16、float32加载模型对比

参考&#xff1a; https://github.com/chunhuizhang/pytorch_distribute_tutorials/blob/main/tutorials/amp_autocast_mixed_precision_training.ipynb from transformers import AutoModelForCausalLM, AutoTokenizer device "cuda" # the device to load the m…

MySQL初学知识总篇

MySQL入门篇 MySQL下载并安装教程推荐&#xff1a;聚精会神搞学习的文章 图形化工具使用&#xff1a;Dbeaver下载官网 目录 &#x1f349;概述&#xff1a;什么是MySQL&#xff1f;一、&#x1f349;MySQL语言特点&#xff1a;二、&#x1f349;数据库管理系统&#xff08;数据…

家庭智能助手:Kompas AI引领家居智能化新纪元

一、引言 在数字化浪潮的推动下&#xff0c;现代家庭生活正迅速向智能化转型。从简单的自动化设备到复杂的智能家居系统&#xff0c;智能技术正悄无声息地改变我们的日常生活。Kompas AI作为一款前沿的家庭智能助手&#xff0c;不仅预示着家庭生活的未来趋势&#xff0c;更以其…

Unity EasyRoads3D插件使用

一、插件介绍 描述 Unity 中的道路基础设施和参数化建模 在 Unity 中使用内置的可自定义动态交叉预制件和基于您自己导入的模型的自定义交叉预制件&#xff0c;直接创建独特的道路网络。 添加额外辅助对象&#xff0c;让你的场景栩栩如生&#xff1a;桥梁、安全护栏、栅栏、墙壁…

不可思议!这款 Python 库竟然能自动生成GUI界面:MagicGUI

目录 什么是MagicGUI&#xff1f; ​编辑 MagicGUI的工作原理 安装MagicGUI 创建你的第一个GUI ​编辑 其他案例 输入值对话框 大家好&#xff0c;今天我们来聊一聊一个非常有趣且实用的Python库——MagicGUI。这个库可以让你用最少的代码&#xff0c;快速创建图形用户…

GStreamer——教程——基础教程7:Multithreading and Pad Availability

基础教程7&#xff1a;多线程和Pad可用性 目标 GStreamer自动处理多线程&#xff0c;但是在某些情况下&#xff0c;用户可能需要手动解耦线程。这篇教程将展示如何解耦线程以及完善关于Pad Availability的描述。更准确来说&#xff0c;这篇文档解释了&#xff1a; 如何为pipe…

不会策划营销活动?教你一步步成为策划高手

要想让活动大获成功&#xff0c;不仅需要创意十足&#xff0c;更要有严谨的策划和执行&#xff0c;确实新人会有点感觉不知所措。 但其实也不用怕&#xff0c;只要按照以下五个关键步骤&#xff0c;一步步来&#xff0c;也可以轻松策划及格的好活动。 步骤一&#xff1a;锁定目…

AIGC绘画设计基础——十分钟读懂Stable Diffusion

写在最前面&#xff1a; 由于Stable Diffusion里面有关扩散过程的描述&#xff0c;描述方法有很多版本&#xff0c;比如前向过程也可以叫加噪过程&#xff0c;为了便于理解&#xff0c;这里把各种描述统一说明一下。 Diffusion扩散模型&#xff1a;文章里面所有出现Diffusion…

志全重庆官网下载

baidu搜索&#xff1a;如何联系八爪鱼SEO? baidu搜索&#xff1a;如何联系八爪鱼SEO? baidu搜索&#xff1a;如何联系八爪鱼SEO? 现在越来越多的人抱怨说搜索引擎收录很难做,站群程序似乎不在是那么重要, 花费高价购买域名成为了做出高收录站群的越来越重要的建站前提。实上…

Python文本处理:初探《三国演义》

Python文本处理&#xff1a;初探《三国演义》 三国演义获取文本文本预处理分词与词频统计引入停用词后进行词频统计分析人物出场次数结果可视化完整代码 三国演义 《三国演义》是中国古代四大名著之一&#xff0c;它以东汉末年到晋朝统一之间的历史为背景&#xff0c;讲述了魏…

2024下《软件设计师》50个高频考点汇总,背就有效!

宝子们&#xff01;上半年软考已经结束一段时间了&#xff0c;准备考下半年软考中级-软件设计师的小伙伴们可以开始准备了&#xff0c;这里给大家整理了50个高频考点&#xff0c;涵盖全书90%以上重点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这个…

CNN和Transformer创新结合,模型性能炸裂!

CNN结合Transformer 【CNNTransformer】这个研究方向通过结合卷积神经网络&#xff08;CNN&#xff09;的局部特征提取能力和Transformer的全局上下文建模优势&#xff0c;旨在提升模型对数据的理解力。这一方向在图像处理、自然语言处理等多个领域展现出强大的应用潜力&#…

告诉你提升UI质感的两个秘密,谁用谁知道。

秘密一&#xff1a;善用头部装饰 秘密二&#xff1a;设计好瓷片区

老电脑焕发第二春,玩转 Stable Diffusion 3

几年前&#xff0c;我头脑一热&#xff0c;配置了一台顶配级消费 PC&#xff08;RTX 2080 Ti GPU i9 CPU&#xff09;&#xff0c;打算用来学习 AI。然而&#xff0c;起初我并没有找到合适的切入点。深度学习早期阶段&#xff0c;消费级显卡根本无法承担训练大模型、微调大模型…

优思学院|精益管理是什么?3大问题帮你彻底搞懂

有一位朋友他喜欢投资&#xff0c;他偶然看中了一家公司&#xff0c;从公司的一些新闻稿中表示他们因为实施了“精益管理”&#xff08;Lean Management&#xff09;&#xff0c;因此每股盈余&#xff08;EPS&#xff09;长期稳定增长&#xff0c;甚至在行业内的重要指标——库…

微信小游戏备案 之 游戏内容介绍编写实例

微信小游戏备案 之 游戏内容介绍编写实例 前言一,编写规范二,内容填写2.1 本游戏不涉及2.2 游戏场景2.3 游戏玩法2.4 功能系统2.5 主要特点三,小结前言 对于游戏开发者来说,微信小游戏备案是让游戏合法上线的重要步骤,而其中游戏内容介绍的编写尤为关键。下面为大家提供一…