From 2ba52666860b04bedff1da95af0f6445315e6128 Mon Sep 17 00:00:00 2001
From: zhangmei <645025773@qq.com>
Date: 星期二, 11 二月 2025 14:27:52 +0800
Subject: [PATCH] Merge branch 'xizang-changyun' of https://gitee.com/xiaochen991015/xizang into xizang-changyun

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillConfirmServiceImpl.java   |   20 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillConfirmMapper.java              |   16 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/TInvoiceToBillService.java          |    3 
 ruoyi-system/src/main/resources/mapper/system/TInvoiceToBillMapper.xml                  |   17 +
 ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java                 |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TDeptService.java                   |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java                            |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/TInvoiceDTO.java                        |   17 +
 ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml                           |    7 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillDetailController.java       |   20 +
 ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java                  |   46 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java                   |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/model/TInvoiceToBill.java                   |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TBillVO.java                             |   18 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java            |    9 
 generator/src/test/java/com/xizang/CodeGeneratorTests.java                              |    2 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java       |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java             |   11 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillController.java            |   65 +++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/TbillSaveDto.java                       |   17 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java                   |  183 +++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillDetailMapper.java               |   16 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDeptServiceImpl.java          |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TBillConfirmService.java            |   16 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDeptController.java             |    1 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TInformationController.java     |   27 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/TInvoiceToBillMapper.java            |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillConfirmController.java      |   20 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java          |   31 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInvoiceToBillServiceImpl.java |    6 
 ruoyi-system/src/main/resources/mapper/system/TBillDetailMapper.xml                     |   27 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayDto.java                      |   36 ++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java                           |    1 
 /dev/null                                                                               |   28 -
 ruoyi-system/src/main/resources/mapper/system/TBillConfirmMapper.xml                    |   18 +
 ruoyi-system/src/main/java/com/ruoyi/system/model/TBillConfirm.java                     |   46 ++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java         |   16 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TBillDetailService.java             |   16 +
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillConfirmController.java     |   20 +
 ruoyi-system/src/main/java/com/ruoyi/system/model/TBillDetail.java                      |   64 ++++
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/PayController.java              |   38 ++
 ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java                        |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillDetailServiceImpl.java    |   20 +
 43 files changed, 871 insertions(+), 64 deletions(-)

diff --git a/generator/src/main/java/com/ruoyi/system/controller/TOrderBillController.java b/generator/src/main/java/com/ruoyi/system/controller/TOrderBillController.java
deleted file mode 100644
index 4dab479..0000000
--- a/generator/src/main/java/com/ruoyi/system/controller/TOrderBillController.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.ruoyi.system.controller;
-
-
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * <p>
- * 订单表与账单的关联表 前端控制器
- * </p>
- *
- * @author xiaochen
- * @since 2025-02-07
- */
-@RestController
-@RequestMapping("/t-order-bill")
-public class TOrderBillController {
-
-}
-
diff --git a/generator/src/main/java/com/ruoyi/system/controller/TPayOrderController.java b/generator/src/main/java/com/ruoyi/system/controller/TPayOrderController.java
deleted file mode 100644
index 906d0c2..0000000
--- a/generator/src/main/java/com/ruoyi/system/controller/TPayOrderController.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.ruoyi.system.controller;
-
-
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * <p>
- * 支付订单表 前端控制器
- * </p>
- *
- * @author xiaochen
- * @since 2025-02-07
- */
-@RestController
-@RequestMapping("/t-pay-order")
-public class TPayOrderController {
-
-}
-
diff --git a/generator/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java b/generator/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java
deleted file mode 100644
index b1ee709..0000000
--- a/generator/src/main/java/com/ruoyi/system/mapper/TOrderBillMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.system.mapper;
-
-import com.ruoyi.system.model.TOrderBill;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- * <p>
- * 订单表与账单的关联表 Mapper 接口
- * </p>
- *
- * @author xiaochen
- * @since 2025-02-07
- */
-public interface TOrderBillMapper extends BaseMapper<TOrderBill> {
-
-}
diff --git a/generator/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java b/generator/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java
deleted file mode 100644
index 99f5e6a..0000000
--- a/generator/src/main/java/com/ruoyi/system/mapper/TPayOrderMapper.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.system.mapper;
-
-import com.ruoyi.system.model.TPayOrder;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-
-/**
- * <p>
- * 支付订单表 Mapper 接口
- * </p>
- *
- * @author xiaochen
- * @since 2025-02-07
- */
-public interface TPayOrderMapper extends BaseMapper<TPayOrder> {
-
-}
diff --git a/generator/src/main/java/com/ruoyi/system/model/TOrderBill.java b/generator/src/main/java/com/ruoyi/system/model/TOrderBill.java
deleted file mode 100644
index 9c1bb9c..0000000
--- a/generator/src/main/java/com/ruoyi/system/model/TOrderBill.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.ruoyi.system.model;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * <p>
- * 订单表与账单的关联表
- * </p>
- *
- * @author xiaochen
- * @since 2025-02-07
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-@TableName("t_order_bill")
-@ApiModel(value="TOrderBill对象", description="订单表与账单的关联表")
-public class TOrderBill implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    @TableId("id")
-    private String id;
-
-    @ApiModelProperty(value = "订单号")
-    @TableField("order_no")
-    private String orderNo;
-
-    @ApiModelProperty(value = "账单编号")
-    @TableField("bill_id")
-    private String billId;
-
-    @TableField("create_time")
-    private LocalDateTime createTime;
-
-    @TableField("update_time")
-    private LocalDateTime updateTime;
-
-
-}
diff --git a/generator/src/main/java/com/ruoyi/system/model/TPayOrder.java b/generator/src/main/java/com/ruoyi/system/model/TPayOrder.java
deleted file mode 100644
index ea80bf8..0000000
--- a/generator/src/main/java/com/ruoyi/system/model/TPayOrder.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package com.ruoyi.system.model;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-/**
- * <p>
- * 支付订单表
- * </p>
- *
- * @author xiaochen
- * @since 2025-02-07
- */
-@Data
-@EqualsAndHashCode(callSuper = false)
-@TableName("t_pay_order")
-@ApiModel(value="TPayOrder对象", description="支付订单表")
-public class TPayOrder implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    @ApiModelProperty(value = "订单号")
-    @TableId("id")
-    private String id;
-
-    @ApiModelProperty(value = "发起支付的用户ID")
-    @TableField("user_id")
-    private String userId;
-
-    @ApiModelProperty(value = "用户名称")
-    @TableField("user_name")
-    private String userName;
-
-    @ApiModelProperty(value = "用户微信openid或支付宝userid")
-    @TableField("open_id")
-    private String openId;
-
-    @ApiModelProperty(value = "用户手机号码")
-    @TableField("phone")
-    private String phone;
-
-    @ApiModelProperty(value = "订单金额")
-    @TableField("amount")
-    private Long amount;
-
-    @ApiModelProperty(value = "实付金额")
-    @TableField("act_pay_amount")
-    private Long actPayAmount;
-
-    @ApiModelProperty(value = "支付时间")
-    @TableField("pay_time")
-    private LocalDateTime payTime;
-
-    @ApiModelProperty(value = "支付方式")
-    @TableField("pay_type")
-    private String payType;
-
-    @ApiModelProperty(value = "支付的回调信息")
-    @TableField("pay_info")
-    private String payInfo;
-
-    @ApiModelProperty(value = "银行的支付流水编号")
-    @TableField("pay_no")
-    private String payNo;
-
-    @ApiModelProperty(value = "支付的回调时间")
-    @TableField("callback_time")
-    private LocalDateTime callbackTime;
-
-    @ApiModelProperty(value = "订单创建时间")
-    @TableField("create_time")
-    private LocalDateTime createTime;
-
-    @ApiModelProperty(value = "订单更新时间")
-    @TableField("update_time")
-    private LocalDateTime updateTime;
-
-
-}
diff --git a/generator/src/main/java/com/ruoyi/system/service/TOrderBillService.java b/generator/src/main/java/com/ruoyi/system/service/TOrderBillService.java
deleted file mode 100644
index 38df822..0000000
--- a/generator/src/main/java/com/ruoyi/system/service/TOrderBillService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.system.service;
-
-import com.ruoyi.system.model.TOrderBill;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- * <p>
- * 订单表与账单的关联表 服务类
- * </p>
- *
- * @author xiaochen
- * @since 2025-02-07
- */
-public interface TOrderBillService extends IService<TOrderBill> {
-
-}
diff --git a/generator/src/main/java/com/ruoyi/system/service/TPayOrderService.java b/generator/src/main/java/com/ruoyi/system/service/TPayOrderService.java
deleted file mode 100644
index eed48ac..0000000
--- a/generator/src/main/java/com/ruoyi/system/service/TPayOrderService.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.ruoyi.system.service;
-
-import com.ruoyi.system.model.TPayOrder;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- * <p>
- * 支付订单表 服务类
- * </p>
- *
- * @author xiaochen
- * @since 2025-02-07
- */
-public interface TPayOrderService extends IService<TPayOrder> {
-
-}
diff --git a/generator/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java b/generator/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java
deleted file mode 100644
index 5b67f76..0000000
--- a/generator/src/main/java/com/ruoyi/system/service/impl/TOrderBillServiceImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.ruoyi.system.service.impl;
-
-import com.ruoyi.system.model.TOrderBill;
-import com.ruoyi.system.mapper.TOrderBillMapper;
-import com.ruoyi.system.service.TOrderBillService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-
-/**
- * <p>
- * 订单表与账单的关联表 服务实现类
- * </p>
- *
- * @author xiaochen
- * @since 2025-02-07
- */
-@Service
-public class TOrderBillServiceImpl extends ServiceImpl<TOrderBillMapper, TOrderBill> implements TOrderBillService {
-
-}
diff --git a/generator/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java b/generator/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java
deleted file mode 100644
index e7941bb..0000000
--- a/generator/src/main/java/com/ruoyi/system/service/impl/TPayOrderServiceImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.ruoyi.system.service.impl;
-
-import com.ruoyi.system.model.TPayOrder;
-import com.ruoyi.system.mapper.TPayOrderMapper;
-import com.ruoyi.system.service.TPayOrderService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-
-/**
- * <p>
- * 支付订单表 服务实现类
- * </p>
- *
- * @author xiaochen
- * @since 2025-02-07
- */
-@Service
-public class TPayOrderServiceImpl extends ServiceImpl<TPayOrderMapper, TPayOrder> implements TPayOrderService {
-
-}
diff --git a/generator/src/main/resources/mapping/TBankFlowMapper.xml b/generator/src/main/resources/mapping/TBankFlowMapper.xml
deleted file mode 100644
index 61d5859..0000000
--- a/generator/src/main/resources/mapping/TBankFlowMapper.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ruoyi.system.mapper.TBankFlowMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TBankFlow">
-        <id column="id" property="id" />
-        <result column="bank_serial_number" property="bankSerialNumber" />
-        <result column="flow_money" property="flowMoney" />
-        <result column="deduction_money" property="deductionMoney" />
-        <result column="remaining_money" property="remainingMoney" />
-        <result column="pay_time" property="payTime" />
-        <result column="payer" property="payer" />
-        <result column="flow_status" property="flowStatus" />
-        <result column="pay_type" property="payType" />
-        <result column="payment_bill_id" property="paymentBillId" />
-        <result column="create_time" property="createTime" />
-        <result column="update_time" property="updateTime" />
-        <result column="create_by" property="createBy" />
-        <result column="update_by" property="updateBy" />
-        <result column="disabled" property="disabled" />
-    </resultMap>
-
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        id, bank_serial_number, flow_money, deduction_money, remaining_money, pay_time, payer, flow_status, pay_type, payment_bill_id, create_time, update_time, create_by, update_by, disabled
-    </sql>
-
-</mapper>
diff --git a/generator/src/main/resources/mapping/TOrderBillMapper.xml b/generator/src/main/resources/mapping/TOrderBillMapper.xml
deleted file mode 100644
index a0338ce..0000000
--- a/generator/src/main/resources/mapping/TOrderBillMapper.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ruoyi.system.mapper.TOrderBillMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TOrderBill">
-        <id column="id" property="id" />
-        <result column="order_no" property="orderNo" />
-        <result column="bill_id" property="billId" />
-        <result column="create_time" property="createTime" />
-        <result column="update_time" property="updateTime" />
-    </resultMap>
-
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        id, order_no, bill_id, create_time, update_time
-    </sql>
-
-</mapper>
diff --git a/generator/src/main/resources/mapping/TPayOrderMapper.xml b/generator/src/main/resources/mapping/TPayOrderMapper.xml
deleted file mode 100644
index 4f6a2e7..0000000
--- a/generator/src/main/resources/mapping/TPayOrderMapper.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ruoyi.system.mapper.TPayOrderMapper">
-
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TPayOrder">
-        <id column="id" property="id" />
-        <result column="user_id" property="userId" />
-        <result column="user_name" property="userName" />
-        <result column="open_id" property="openId" />
-        <result column="phone" property="phone" />
-        <result column="amount" property="amount" />
-        <result column="act_pay_amount" property="actPayAmount" />
-        <result column="pay_time" property="payTime" />
-        <result column="pay_type" property="payType" />
-        <result column="pay_info" property="payInfo" />
-        <result column="pay_no" property="payNo" />
-        <result column="callback_time" property="callbackTime" />
-        <result column="create_time" property="createTime" />
-        <result column="update_time" property="updateTime" />
-    </resultMap>
-
-    <!-- 通用查询结果列 -->
-    <sql id="Base_Column_List">
-        id, user_id, user_name, open_id, phone, amount, act_pay_amount, pay_time, pay_type, pay_info, pay_no, callback_time, create_time, update_time
-    </sql>
-
-</mapper>
diff --git a/generator/src/test/java/com/xizang/CodeGeneratorTests.java b/generator/src/test/java/com/xizang/CodeGeneratorTests.java
index eae6969..64dd914 100644
--- a/generator/src/test/java/com/xizang/CodeGeneratorTests.java
+++ b/generator/src/test/java/com/xizang/CodeGeneratorTests.java
@@ -35,7 +35,7 @@
 
         // 全局配置
         GlobalConfig gc = new GlobalConfig();
-        String projectPath = "D:\\畅云\\项目\\xizangweb\\xizang\\generator";
+        String projectPath = "F:\\workSpace\\xizang\\generator";
         gc.setOutputDir(projectPath + "/src/main/java")
                 .setAuthor("xiaochen")
                 .setMapperName("%sMapper")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillConfirmController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillConfirmController.java
new file mode 100644
index 0000000..79345e1
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillConfirmController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.web.controller.api;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 账单线下缴费关联表 前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+@RestController
+@RequestMapping("/t-bill-confirm")
+public class TBillConfirmController {
+
+}
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java
index a922d24..5322e03 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillController.java
@@ -3,11 +3,14 @@
 
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.system.dto.TBillDto;
+import com.ruoyi.system.dto.TbillSaveDto;
 import com.ruoyi.system.model.TBill;
 import com.ruoyi.system.query.TBillQuery;
 import com.ruoyi.system.service.TBillService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -34,6 +37,14 @@
         return R.ok(pageInfo);
     }
 
+    @PostMapping("add")
+    public R<PageInfo<TBillDto>> add(@Validated @RequestBody TbillSaveDto bill){
+        tBillService.saveBill(bill);
+        return R.ok();
+    }
+
+
+
 
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillDetailController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillDetailController.java
new file mode 100644
index 0000000..f036960
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TBillDetailController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.web.controller.api;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 账单水电费子表 前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+@RestController
+@RequestMapping("/t-bill-detail")
+public class TBillDetailController {
+
+}
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
index 6bc7ae8..711e8bf 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
@@ -37,6 +37,7 @@
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -72,12 +73,15 @@
     private TCheckAcceptRecordService checkAcceptRecordService;
     @ApiOperation(value = "获取合同分页列表")
     @PostMapping(value = "/contractList")
+    @PreAuthorize("@ss.hasPermi('system:contract:list')")
+
     public R<PageInfo<TContract>> contractList(@RequestBody TContractQuery query) {
         return R.ok(contractService.contractList(query));
     }
     @Log(title = "合同管理-新增合同", businessType = BusinessType.INSERT)
     @ApiOperation(value = "新增合同")
     @PostMapping(value = "/addContract")
+    @PreAuthorize("@ss.hasPermi('system:contract:add')")
     public R<Boolean> addContract(@Validated @RequestBody TContractDTO dto) {
         contractService.save(dto);
         if (dto.getIsIncreasing()){
@@ -210,17 +214,13 @@
         String url = wordUtil.generatePdf("/templates", "1_yzj_租赁合同.xml", templateParam, "租赁合同", "E:\\");
         return R.ok(url);
     }
-    @ApiOperation(value = "导出")
-    @PostMapping("/export")
-    public void export(@RequestBody TContractQuery query){
-        contractService.export(query);
-    }
+
     /**
      * 光缆巡检列表导出
      */
-    @ApiOperation(value = "光缆巡检列表导出")
-    @Log(title = "现场作业-光缆巡检列表导出", businessType = BusinessType.EXPORT)
-    @PostMapping("/exportOpticalInspection")
+    @ApiOperation(value = "导出")
+    @Log(title = "导出", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
     public void exportOpticalInspection(@RequestBody TContractQuery query)
     {
         List<ContractExport> contractExports = new ArrayList<>();
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDeptController.java
index ad9a031..91e2ac2 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDeptController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDeptController.java
@@ -6,7 +6,6 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.dto.TDeptUpAndDownDTO;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java
index 196fc9a..894920c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/THouseController.java
@@ -22,6 +22,7 @@
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreInvocationAuthorizationAdviceVoter;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -45,18 +46,21 @@
     @Log(title = "房屋基础信息管理-新增房屋", businessType = BusinessType.INSERT)
     @ApiOperation(value = "新增房屋")
     @PostMapping(value = "/addHouse")
+    @PreAuthorize("@ss.hasPermi('system:house:add')")
     public R<Boolean> addHouse(@Validated @RequestBody THouseDTO dto) {
         return R.ok(tHouseService.save(dto));
     }
     @Log(title = "房屋基础信息管理-编辑房屋", businessType = BusinessType.UPDATE)
     @ApiOperation(value = "编辑房屋")
     @PostMapping(value = "/updateHouse")
+    @PreAuthorize("@ss.hasPermi('system:house:edit')")
     public R<Boolean> updateHouse(@Validated @RequestBody THouseDTO dto) {
         return R.ok(tHouseService.updateById(dto));
     }
     @Log(title = "房屋基础信息管理-查询房屋信息", businessType = BusinessType.DELETE)
     @ApiOperation(value = "查询房屋信息")
     @GetMapping(value = "/getHouseById")
+    @PreAuthorize("@ss.hasPermi('system:house:detail')")
     public R<THouse> getHouseById(@RequestParam String id) {
         THouse tHouse = tHouseService.getById(id);
         tHouse.setLeaseStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_LEASE_STATUS,tHouse.getLeaseStatus()));
@@ -66,16 +70,21 @@
     @Log(title = "房屋基础信息管理-删除房屋", businessType = BusinessType.DELETE)
     @ApiOperation(value = "删除房屋")
     @DeleteMapping(value = "/deleteHouseById")
+    @PreAuthorize("@ss.hasPermi('system:house:delete')")
+
     public R<Boolean> deleteHouseById(@RequestParam String id) {
         return R.ok(tHouseService.removeById(id));
     }
     @ApiOperation(value = "获取房屋分页列表")
     @PostMapping(value = "/houseList")
+    @PreAuthorize("@ss.hasPermi('system:house:list')")
+
     public R<PageInfo<THouse>> houseList(@RequestBody THouseQuery query) {
         return R.ok(tHouseService.houseList(query));
     }
     @ApiOperation(value = "历史租户列表")
     @PostMapping(value = "/userHistoryList")
+    @PreAuthorize("@ss.hasPermi('system:house:historyList')")
     public R<PageInfo<HouseVO>> userHistoryList(@RequestBody TUserHistoryQuery query) {
         return R.ok(tHouseService.userHistoryList(query));
     }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
new file mode 100644
index 0000000..34d7837
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
@@ -0,0 +1,183 @@
+package com.ruoyi.web.controller.task;
+
+
+import com.ruoyi.system.model.TBill;
+import com.ruoyi.system.model.TContract;
+import com.ruoyi.system.service.TBillService;
+import com.ruoyi.system.service.TContractService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/11 8:39
+ */
+@Component
+public class TaskUtil {
+    @Autowired
+    private TContractService contractService;
+    @Autowired
+    private TBillService billService;
+
+
+
+
+    // 每天凌晨00点执行的定时任务 用于合同生成第一笔账单
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void dayOfFirstBill() {
+        try {
+            // 查询所有已签订的合同并且未生成第一笔账单的
+            List<TContract> list = contractService.lambdaQuery().eq(TContract::getStatus, 4).isNull(TContract::getFirstPayTime).list();
+            List<TBill> bills = new ArrayList<>();
+            for (TContract contract : list) {
+                contract.setFirstPayTime(contract.getStartTime().plusDays(10));
+                // 第一次应缴费日期
+                LocalDateTime firstPayTime = contract.getStartTime().plusDays(10);
+                LocalDate localDate = contract.getStartTime().plusDays(10).toLocalDate();
+                LocalDate now = LocalDate.now();
+                // 如果应缴费日期和当前时间不相同 跳过
+                if (!localDate.equals(now)) {
+                    continue;
+                }
+                TBill rentBill = new TBill();
+                rentBill.setContractId(contract.getId());
+                rentBill.setContractNumber(contract.getContractNumber());
+                LocalDateTime startPayTime = contract.getStartPayTime();
+                LocalDateTime endTime1 = contract.getEndTime();
+                // 计算两个时间相差多少天
+                long days = ChronoUnit.DAYS.between(startPayTime, endTime1)+1L;
+                // 如果时间小于30天 需要计算每日租金
+                if (days<30){
+                    rentBill.setPayableFeesMoney(contract.getMonthRent().divide(new BigDecimal("30"),2,BigDecimal.ROUND_DOWN).multiply(new BigDecimal(days)));
+                }else{
+                    rentBill.setPayableFeesMoney(contract.getPayType().equals("1")?contract.getMonthRent():
+                            contract.getPayType().equals("2")?contract.getMonthRent().multiply(new BigDecimal("3")):contract.getMonthRent().multiply(new BigDecimal("12")).setScale(2,BigDecimal.ROUND_DOWN));
+                }
+                rentBill.setPayableFeesTime(firstPayTime);
+                rentBill.setPayFeesStatus("1");
+                rentBill.setBillType("1");
+                rentBill.setStartTime(contract.getStartPayTime());
+                if ((contract.getEndTime().getYear() == contract.getStartTime().getYear()) && (contract.getEndTime().getMonth() == contract.getStartTime().getMonth())) {
+                    // 如果同年同月 那么账单周期为合同结束时间
+                    rentBill.setEndTime(contract.getEndTime());
+                } else {
+                    // 否则 取当月最后一天
+                    LocalDateTime endTime = contract.getStartTime().with(TemporalAdjusters.lastDayOfMonth()).withSecond(59).withHour(23).withMinute(59);
+                    rentBill.setEndTime(endTime);
+                }
+                // 租金账单
+                bills.add(rentBill);
+                // 押金账单
+                TBill depositBill = new TBill();
+                depositBill.setContractId(contract.getId());
+                depositBill.setContractNumber(contract.getContractNumber());
+                depositBill.setPayableFeesMoney(contract.getDeposit());
+                depositBill.setPayableFeesTime(firstPayTime);
+                depositBill.setPayFeesStatus("1");
+                depositBill.setBillType("2");
+                bills.add(depositBill);
+            }
+            contractService.updateBatchById(list);
+            billService.saveBatch(bills);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    // 每天凌晨00点执行的定时任务 用于生成合同期最后一笔账单
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void dayOfEndBill() {
+        try {
+            // 查询所有已签订的合同并且已经生成第一笔账单的
+            List<TContract> list = contractService.lambdaQuery().eq(TContract::getStatus, 4).isNotNull(TContract::getFirstPayTime).list();
+            List<TBill> bills = new ArrayList<>();
+            for (TContract contract : list) {
+                TBill beforeBill = billService.lambdaQuery().eq(TBill::getContractId, contract.getId()).eq(TBill::getBillType, 1).orderByDesc(TBill::getCreateTime)
+                        .last("limit 1").one();
+                if (!(beforeBill.getEndTime().toLocalDate().equals(contract.getEndTime().toLocalDate()))&&beforeBill.getEndTime().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).isAfter(contract.getEndTime())){
+                    TBill tBill = new TBill();
+                    tBill.setContractId(contract.getId());
+                    tBill.setContractNumber(contract.getContractNumber());
+                    tBill.setPayableFeesMoney(contract.getMonthRent());
+                    tBill.setPayableFeesTime(LocalDateTime.now());
+                    tBill.setPayFeesStatus("1");
+                    tBill.setBillType("1");
+                    tBill.setStartTime(beforeBill.getEndTime().plusMonths(1).with(TemporalAdjusters.firstDayOfMonth()));
+                    tBill.setEndTime(contract.getEndTime());
+                    bills.add(tBill);
+                }
+            }
+            billService.saveBatch(bills);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    // 每月15号凌晨执行的定时任务 用于生成租金账单
+    @Scheduled(cron = "0 0 0 15 * ?")
+    public void monthOfBill() {
+        try {
+            // 查询所有已签订的合同 且合同时间大于15号
+            List<TContract> list = contractService.lambdaQuery().eq(TContract::getStatus, 4)
+                    .isNotNull(TContract::getFirstPayTime)
+                    .ge(TContract::getEndTime, LocalDateTime.now())
+                    .list();
+            List<TBill> bills = new ArrayList<>();
+            for (TContract contract : list) {
+                TBill beforeBill = billService.lambdaQuery().eq(TBill::getContractId, contract.getId()).eq(TBill::getBillType, 1).orderByDesc(TBill::getCreateTime)
+                        .last("limit 1").one();
+                if (beforeBill.getEndTime().toLocalDate().equals(contract.getEndTime().toLocalDate()))continue;
+                if (beforeBill.getEndTime().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).isBefore(contract.getEndTime())){
+                    TBill tBill = new TBill();
+                    tBill.setContractId(contract.getId());
+                    tBill.setContractNumber(contract.getContractNumber());
+                    tBill.setPayableFeesMoney(contract.getMonthRent());
+                    tBill.setPayableFeesTime(LocalDateTime.now());
+                    tBill.setPayFeesStatus("1");
+                    tBill.setBillType("1");
+                    tBill.setStartTime(beforeBill.getEndTime().plusMonths(1).with(TemporalAdjusters.firstDayOfMonth()));
+                    tBill.setEndTime(beforeBill.getEndTime().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth()));
+                    bills.add(tBill);
+
+                }
+            }
+            billService.saveBatch(bills);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    public static void main(String[] args) {
+        LocalDateTime now = LocalDateTime.now().minusMonths(1).withDayOfMonth(31);
+        System.err.println(now);
+        LocalDateTime now2 = now.plusMonths(1);
+        System.err.println(now2);
+
+        LocalDateTime now1 = LocalDateTime.now();
+        long days = ChronoUnit.DAYS.between(now, now1);
+        long days2 = ChronoUnit.DAYS.between(now.plusDays(1), now1);
+
+        System.err.println(days);
+        System.err.println(days2);
+//        LocalDateTime endTime = now.with(TemporalAdjusters.lastDayOfMonth()).withSecond(59).withHour(23).withMinute(59);
+//
+//        System.err.println(endTime);
+
+    }
+
+}
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/PayController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/PayController.java
index 12cf9b6..70cdda4 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/PayController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/PayController.java
@@ -1,17 +1,30 @@
 package com.ruoyi.web.controller.api;
 
+import cn.hutool.core.collection.CollectionUtil;
+import com.ruoyi.common.constant.AmountConstant;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.system.dto.MakeOrderDto;
 import com.ruoyi.system.dto.MakeOrderResp;
+import com.ruoyi.system.dto.OfflinePayDto;
+import com.ruoyi.system.model.TBill;
+import com.ruoyi.system.model.TBillConfirm;
+import com.ruoyi.system.service.TBillConfirmService;
+import com.ruoyi.system.service.TBillService;
 import com.ruoyi.system.service.TPayOrderService;
 import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Collections;
+import java.util.List;
 
 @RestController
 @RequestMapping("/t-pay")
@@ -22,6 +35,12 @@
     @Autowired
     TPayOrderService tPayOrderService;
 
+    @Autowired
+    TBillService tBillService;
+
+    @Autowired
+    TBillConfirmService tBillConfirmService;
+
     @ApiOperation(value = "创建支付订单")
     @PostMapping("makeOrder")
     public R<MakeOrderResp> makeOrder(@Validated @RequestBody MakeOrderDto dto){
@@ -30,6 +49,23 @@
     }
 
 
-
+    @PostMapping("offlinePay")
+    public R offlinePay(@Validated @RequestBody OfflinePayDto dto){
+        List<TBill> tBills = tBillService.listByIds(dto.getBillIds());
+        for (TBill tBill : tBills) {
+            TBill save = new TBill();
+            save.setId(tBill.getId());
+            save.setPayFeesType(2);
+            save.setVoucher(dto.getVoucher());
+            save.setPayFeesStatus("2");
+            tBillService.lockAndUpdateInfo(save);
+        }
+        TBillConfirm confirm = new TBillConfirm();
+        confirm.setBillId(CollectionUtil.join(dto.getBillIds(),","));
+        confirm.setVoucher(dto.getVoucher());
+        confirm.setPayFeesMoney(new BigDecimal(dto.getAmount()).divide(AmountConstant.b100).setScale(2, RoundingMode.HALF_DOWN).doubleValue());
+        tBillConfirmService.save(confirm);
+        return R.ok();
+    }
 
 }
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillConfirmController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillConfirmController.java
new file mode 100644
index 0000000..79345e1
--- /dev/null
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillConfirmController.java
@@ -0,0 +1,20 @@
+package com.ruoyi.web.controller.api;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 账单线下缴费关联表 前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+@RestController
+@RequestMapping("/t-bill-confirm")
+public class TBillConfirmController {
+
+}
+
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillController.java
index 386fce2..41dbec5 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TBillController.java
@@ -1,18 +1,30 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.constant.DictConstants;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DictUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.dto.TBillDto;
+import com.ruoyi.system.dto.TInvoiceDTO;
+import com.ruoyi.system.model.*;
 import com.ruoyi.system.query.TBillQuery;
+import com.ruoyi.system.service.TBillDetailService;
 import com.ruoyi.system.service.TBillService;
+import com.ruoyi.system.service.TInvoiceService;
+import com.ruoyi.system.service.TInvoiceToBillService;
+import com.ruoyi.system.vo.TBillVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -22,13 +34,21 @@
  * @author xiaochen
  * @since 2025-01-17
  */
+@Api(tags = "缴费账单")
 @RestController
 @RequestMapping("/t-bill")
 public class TBillController {
 
     @Autowired
     TBillService tBillService;
+    @Autowired
+    TBillDetailService billDetailService;
+    @Autowired
+    TInvoiceService invoiceService;
+    @Autowired
+    TInvoiceToBillService invoiceToBillService;
 
+    @ApiOperation(value = "缴费账单查询分页列表")
     @PostMapping("list")
     public R<PageInfo<TBillDto>> list(@RequestBody TBillQuery query){
         if (StringUtils.isEmpty(query.getUserId())){
@@ -38,6 +58,43 @@
         return R.ok(pageInfo);
     }
 
+    @ApiOperation(value = "查看缴费账单详情")
+    @GetMapping(value = "/getDetailById")
+    public R<TBillVO> getDetailById(@RequestParam String id) {
+        TBill bill = tBillService.getById(id);
+        TBillVO billVO = new TBillVO();
+        BeanUtils.copyProperties(bill, billVO);
+        // 查询水电费列表
+        if("3".equals(bill.getBillType())){
+            List<TBillDetail> list = billDetailService.list(Wrappers.lambdaQuery(TBillDetail.class)
+                    .eq(TBillDetail::getBillId, id));
+            billVO.setBillDetailList(list);
+        }
+        billVO.setBillType(DictUtils.getDictLabel(DictConstants.DICT_TYPE_BILL_TYPE,billVO.getBillType()));
+        billVO.setPayFeesStatus(DictUtils.getDictLabel(DictConstants.DICT_TYPE_PAY_FEES_STATUS,billVO.getPayFeesStatus()));
+        return R.ok(billVO);
+    }
+
+    @ApiOperation(value = "缴费账单开票")
+    @PostMapping(value = "/invoice")
+    public R<String> invoice(@RequestBody TInvoiceDTO dto) {
+        // 添加开票信息
+        invoiceService.save(dto);
+
+        // 添加开票信息中间表信息
+        List<String> billIds = dto.getBillIds();
+        List<TInvoiceToBill> sysInvoiceToBills = new ArrayList<>();
+        for (String billId : billIds) {
+            TInvoiceToBill tInvoiceToBill = new TInvoiceToBill();
+            tInvoiceToBill.setInvoiceId(dto.getId());
+            tInvoiceToBill.setBillId(billId);
+            sysInvoiceToBills.add(tInvoiceToBill);
+        }
+        invoiceToBillService.saveBatch(sysInvoiceToBills);
+        return R.ok();
+    }
+
+
 
 }
 
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TInformationController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TInformationController.java
index 1917c1a..dd18571 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TInformationController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TInformationController.java
@@ -1,6 +1,17 @@
 package com.ruoyi.web.controller.api;
 
 
+import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.model.TInformation;
+import com.ruoyi.system.query.TInformationQuery;
+import com.ruoyi.system.service.TInformationService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -13,9 +24,25 @@
  * @author xiaochen
  * @since 2025-01-17
  */
+@Api(tags = "资讯管理")
 @RestController
 @RequestMapping("/t-information")
 public class TInformationController {
 
+    private final TInformationService informationService;
+    @Autowired
+    public TInformationController(TInformationService informationService) {
+        this.informationService = informationService;
+    }
+
+    /**
+     * 获取资讯管理管理列表
+     */
+    @ApiOperation(value = "获取资讯管理分页列表")
+    @PostMapping(value = "/pageList")
+    public R<PageInfo<TInformation>> pageList(@RequestBody TInformationQuery query) {
+        return R.ok(informationService.pageList(query));
+    }
+
 }
 
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
index fa44b77..3aeaac9 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -66,7 +66,7 @@
     @PostMapping("/list")
     public AjaxResult list(@RequestBody SysRoleQuery query)
     {
-        PageInfo<SysRole> list = roleService.selectList(query);
+        PageInfo<SysRole> list = roleService.selectPageList(query);
         return AjaxResult.success(list);
     }
 
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java
index 068e4f0..19a3caf 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/DictConstants.java
@@ -39,4 +39,8 @@
      * 缴费状态 1=未缴费 2=待确认 3=已缴费 4=已逾期 5=已失效
      */
     public static final String DICT_TYPE_PAY_FEES_STATUS = "t_pay_fees_status";
+    /**
+     * 账单类型 1=租金 2=押金 3=生活费用
+     */
+    public static final String DICT_TYPE_BILL_TYPE = "t_bill_type";
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
index 44e80d8..932a4af 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
@@ -1,16 +1,14 @@
 package com.ruoyi.common.core.redis;
 
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.BoundSetOperations;
 import org.springframework.data.redis.core.HashOperations;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.data.redis.core.script.DefaultRedisScript;
+import org.springframework.data.redis.core.script.RedisScript;
 import org.springframework.stereotype.Component;
 
 /**
@@ -22,6 +20,15 @@
 @Component
 public class RedisCache
 {
+    private static final String LOCK_PREFIX = "lock:";
+    private static final RedisScript<Long> UNLOCK_SCRIPT = new DefaultRedisScript<>(
+            "if redis.call('get', KEYS[1]) == ARGV[1] then " +
+                    "  return redis.call('del', KEYS[1]) " +
+                    "else " +
+                    "  return 0 " +
+                    "end",
+            Long.class
+    );
     @Autowired
     public RedisTemplate redisTemplate;
 
@@ -265,4 +272,33 @@
     {
         return redisTemplate.keys(pattern);
     }
+
+    /**
+     * 尝试加锁
+     *
+     * @param lockKey   锁的key
+     * @param requestId 锁的持有者标识符(如UUID)
+     * @param expireTime 锁的过期时间(秒)
+     * @return 加锁成功返回true,否则返回false
+     */
+    public boolean tryLock(String lockKey, String requestId, long expireTime) {
+        String lockKeyWithPrefix = LOCK_PREFIX + lockKey;
+        // 使用SET命令的NX和PX选项来加锁
+        Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKeyWithPrefix, requestId, expireTime, TimeUnit.SECONDS);
+        return result != null && result;
+    }
+
+    /**
+     * 解锁
+     *
+     * @param lockKey   锁的key
+     * @param requestId 锁的持有者标识符(如UUID)
+     * @return 解锁成功返回true,否则返回false
+     */
+    public boolean unlock(String lockKey, String requestId) {
+        String lockKeyWithPrefix = LOCK_PREFIX + lockKey;
+        // 使用Lua脚本来验证锁的持有者并解锁
+        Long result = (Long) redisTemplate.execute(UNLOCK_SCRIPT, Collections.singletonList(lockKeyWithPrefix), requestId);
+        return result != null && result == 1L;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayDto.java
new file mode 100644
index 0000000..d4f5661
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/OfflinePayDto.java
@@ -0,0 +1,36 @@
+package com.ruoyi.system.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class OfflinePayDto implements Serializable {
+    /**
+     * 用户ID
+     */
+    @ApiModelProperty(value = "用户ID")
+    private String userId;
+
+    @ApiModelProperty(value = "支付金额,单位:分")
+    @NotNull(message = "金额不能为空")
+    private Long amount;
+    /**
+     * 账单列表
+     */
+    @ApiModelProperty(value = "账单列表")
+    @NotEmpty(message = "账单ID不能为空")
+    private List<String> billIds;
+    /**
+     * 凭证文件ID
+     */
+    @ApiModelProperty(value = "凭证文件ID")
+    @NotEmpty(message = "凭证文件不能为空")
+    private String voucher;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java
index ba94ba9..6a76c57 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TBillDto.java
@@ -16,4 +16,5 @@
 
     private String houseName;
 
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/TInvoiceDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TInvoiceDTO.java
new file mode 100644
index 0000000..471288d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TInvoiceDTO.java
@@ -0,0 +1,17 @@
+package com.ruoyi.system.dto;
+
+import com.ruoyi.system.model.TInvoice;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "开票DTO")
+public class TInvoiceDTO extends TInvoice {
+
+    @ApiModelProperty(value = "账单id集合")
+    private List<String> billIds;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/TbillSaveDto.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TbillSaveDto.java
new file mode 100644
index 0000000..f40a77b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/TbillSaveDto.java
@@ -0,0 +1,17 @@
+package com.ruoyi.system.dto;
+
+import com.ruoyi.system.model.TBill;
+import com.ruoyi.system.model.TBillDetail;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class TbillSaveDto extends TBill implements Serializable {
+
+    @ApiModelProperty(value = "水单费列表")
+    private List<TBillDetail> details;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillConfirmMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillConfirmMapper.java
new file mode 100644
index 0000000..e5800e8
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillConfirmMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.TBillConfirm;
+
+/**
+ * <p>
+ * 账单线下缴费关联表 Mapper 接口
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+public interface TBillConfirmMapper extends BaseMapper<TBillConfirm> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillDetailMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillDetailMapper.java
new file mode 100644
index 0000000..c56ac36
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TBillDetailMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.TBillDetail;
+
+/**
+ * <p>
+ * 账单水电费子表 Mapper 接口
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+public interface TBillDetailMapper extends BaseMapper<TBillDetail> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TInvoiceToBillMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TInvoiceToBillMapper.java
index 5e10748..9325307 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TInvoiceToBillMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/TInvoiceToBillMapper.java
@@ -1,7 +1,7 @@
 package com.ruoyi.system.mapper;
 
-import com.ruoyi.system.model.TInvoiceToBill;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.model.TInvoiceToBill;
 
 /**
  * <p>
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java
index 68ea69f..bb355e1 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TBill.java
@@ -8,6 +8,7 @@
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.common.core.domain.BaseModel;
@@ -16,6 +17,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springframework.data.annotation.Transient;
 
 /**
  * <p>
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TBillConfirm.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TBillConfirm.java
new file mode 100644
index 0000000..c1b1ff4
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TBillConfirm.java
@@ -0,0 +1,46 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 账单线下缴费关联表
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_bill_confirm")
+@ApiModel(value="TBillConfirm对象", description="账单线下缴费关联表")
+public class TBillConfirm implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+
+    @ApiModelProperty(value = "账单id,逗号分隔")
+    @TableField("bill_id")
+    private String billId;
+
+    @ApiModelProperty(value = "缴费金额")
+    @TableField("pay_fees_money")
+    private Double payFeesMoney;
+
+    @ApiModelProperty(value = "凭证上传")
+    @TableField("voucher")
+    private String voucher;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TBillDetail.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TBillDetail.java
new file mode 100644
index 0000000..ee01b72
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TBillDetail.java
@@ -0,0 +1,64 @@
+package com.ruoyi.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BaseModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 账单水电费子表
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_bill_detail")
+@ApiModel(value="TBillDetail对象", description="账单水电费子表")
+public class TBillDetail extends BaseModel {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+
+    @ApiModelProperty(value = "账单id")
+    @TableField("bill_id")
+    private String billId;
+
+    @ApiModelProperty(value = "初始读数")
+    @TableField("start_reading")
+    private BigDecimal startReading;
+
+    @ApiModelProperty(value = "结束读数")
+    @TableField("end_reading")
+    private BigDecimal endReading;
+
+    @ApiModelProperty(value = "使用量")
+    @TableField("usage_measure")
+    private BigDecimal usageMeasure;
+
+    @ApiModelProperty(value = "单价")
+    @TableField("unit_price")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "总金额")
+    @TableField("total_amount")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "费用类型 1=水费 2=电费")
+    @TableField("live_type")
+    private Integer liveType;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java
index 635c6cb..3edeb3f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java
@@ -52,6 +52,10 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @TableField("end_time")
     private LocalDateTime endTime;
+    @ApiModelProperty(value = "开始计费时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField("start_pay_time")
+    private LocalDateTime startPayTime;
 
     @ApiModelProperty(value = "每月租金")
     @TableField("month_rent")
@@ -65,7 +69,7 @@
     @TableField("pay_type")
     private String payType;
 
-    @ApiModelProperty(value = "第一次支付日期")
+    @ApiModelProperty(value = "账单第一次支付日期 合同生效日期+10天 (不是真正的支付日期)生成第一次帐单后存值")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @TableField("first_pay_time")
     private LocalDateTime firstPayTime;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/TInvoiceToBill.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/TInvoiceToBill.java
index 9320378..4f5db5b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/TInvoiceToBill.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/TInvoiceToBill.java
@@ -1,13 +1,15 @@
 package com.ruoyi.system.model;
 
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
-import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
 
 /**
  * <p>
@@ -25,7 +27,7 @@
 
     private static final long serialVersionUID = 1L;
 
-    @TableId("id")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
     private String id;
 
     @ApiModelProperty(value = "开票id")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillConfirmService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillConfirmService.java
new file mode 100644
index 0000000..ca84e44
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillConfirmService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.TBillConfirm;
+
+/**
+ * <p>
+ * 账单线下缴费关联表 服务类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+public interface TBillConfirmService extends IService<TBillConfirm> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillDetailService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillDetailService.java
new file mode 100644
index 0000000..36d0bed
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillDetailService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.TBillDetail;
+
+/**
+ * <p>
+ * 账单水电费子表 服务类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+public interface TBillDetailService extends IService<TBillDetail> {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java
index 22feecc..ccf44e6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TBillService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.dto.TBillDto;
+import com.ruoyi.system.dto.TbillSaveDto;
 import com.ruoyi.system.model.TBill;
 import com.ruoyi.system.query.TBillQuery;
 
@@ -18,4 +19,7 @@
 
     PageInfo<TBillDto> queryPage(TBillQuery query);
 
+    Boolean lockAndUpdateInfo(TBill save);
+
+    void saveBill(TbillSaveDto bill);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TDeptService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TDeptService.java
index 8dea4e2..6da81ba 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TDeptService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TDeptService.java
@@ -1,7 +1,6 @@
 package com.ruoyi.system.service;
 
 import com.ruoyi.common.basic.PageInfo;
-import com.ruoyi.system.dto.TDeptUpAndDownDTO;
 import com.ruoyi.system.model.TDept;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.system.query.TDeptQuery;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TInvoiceToBillService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TInvoiceToBillService.java
index f20ee3d..79150fd 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TInvoiceToBillService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TInvoiceToBillService.java
@@ -1,5 +1,7 @@
 package com.ruoyi.system.service;
 
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.model.TInvoiceToBill;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.system.model.TInvoice;
 import com.ruoyi.system.model.TInvoiceToBill;
@@ -18,6 +20,7 @@
  * @since 2025-02-10
  */
 public interface TInvoiceToBillService extends IService<TInvoiceToBill> {
+
     List<TInvoiceToBill> makeQuery(TInvoiceToBillQuery query);
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillConfirmServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillConfirmServiceImpl.java
new file mode 100644
index 0000000..2c2eb01
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillConfirmServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.TBillConfirmMapper;
+import com.ruoyi.system.model.TBillConfirm;
+import com.ruoyi.system.service.TBillConfirmService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 账单线下缴费关联表 服务实现类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+@Service
+public class TBillConfirmServiceImpl extends ServiceImpl<TBillConfirmMapper, TBillConfirm> implements TBillConfirmService {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillDetailServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillDetailServiceImpl.java
new file mode 100644
index 0000000..44e6404
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.TBillDetailMapper;
+import com.ruoyi.system.model.TBillDetail;
+import com.ruoyi.system.service.TBillDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 账单水电费子表 服务实现类
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2025-02-10
+ */
+@Service
+public class TBillDetailServiceImpl extends ServiceImpl<TBillDetailMapper, TBillDetail> implements TBillDetailService {
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
index 3a0bdc6..390106e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
@@ -4,17 +4,23 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.dto.TBillDto;
+import com.ruoyi.system.dto.TbillSaveDto;
 import com.ruoyi.system.mapper.TBillMapper;
 import com.ruoyi.system.model.TBill;
+import com.ruoyi.system.model.TBillDetail;
 import com.ruoyi.system.model.TContract;
 import com.ruoyi.system.model.THouse;
 import com.ruoyi.system.query.TBillQuery;
+import com.ruoyi.system.service.TBillDetailService;
 import com.ruoyi.system.service.TBillService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import io.jsonwebtoken.lang.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 
@@ -35,6 +41,10 @@
     @Autowired
     TBillMapper tBillMapper;
 
+    @Autowired
+    TBillDetailService tBillDetailService;
+
+
     public PageInfo<TBillDto> queryPage(TBillQuery query){
         PageInfo<TBill> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
         PageInfo<TBillDto> info = tBillMapper.page(pageInfo, query);
@@ -42,17 +52,32 @@
     }
 
 
-
     /**
      * 传的金额
      * @param tBill
      * @return
      */
-    public Boolean checkAndUpdateBill(TBill tBill){
+    public Boolean lockAndUpdateInfo(TBill tBill){
+        if (StringUtils.isEmpty(tBill.getId())){
+            throw new ServiceException("账单主键ID不能为空");
+        }
         return true;
     }
 
-
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveBill(TbillSaveDto bill) {
+        save(bill);
+        if (bill.getBillType().equals("3")){
+            if (bill.getDetails()==null || bill.getDetails().size()==0){
+                throw new ServiceException("生活费用列表不能为空");
+            }
+            for (TBillDetail detail : bill.getDetails()) {
+                detail.setBillId(bill.getId());
+                tBillDetailService.save(detail);
+            }
+        }
+    }
 
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDeptServiceImpl.java
index a994a66..730c8cf 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDeptServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TDeptServiceImpl.java
@@ -3,7 +3,7 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.dto.TDeptUpAndDownDTO;
+import com.ruoyi.system.mapper.SysMenuMapper;
 import com.ruoyi.system.model.TDept;
 import com.ruoyi.system.mapper.TDeptMapper;
 import com.ruoyi.system.query.TDeptQuery;
@@ -13,7 +13,6 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -27,6 +26,8 @@
 @Service
 public class TDeptServiceImpl extends ServiceImpl<TDeptMapper, TDept> implements TDeptService {
 
+    @Autowired
+    private SysMenuMapper sysMenuMapper;
     @Override
     public boolean isExit(TDept dto) {
         if(StringUtils.isNotEmpty(dto.getDeptId())){
@@ -46,4 +47,5 @@
         return pageInfo;
     }
 
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInvoiceToBillServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInvoiceToBillServiceImpl.java
index e4658b3..aacd7b8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInvoiceToBillServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInvoiceToBillServiceImpl.java
@@ -12,6 +12,12 @@
 
 import java.util.List;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.TInvoiceToBillMapper;
+import com.ruoyi.system.model.TInvoiceToBill;
+import com.ruoyi.system.service.TInvoiceToBillService;
+import org.springframework.stereotype.Service;
+
 /**
  * <p>
  * 账单开票中间表 服务实现类
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TBillVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TBillVO.java
new file mode 100644
index 0000000..60ad80c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TBillVO.java
@@ -0,0 +1,18 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.system.model.TBill;
+import com.ruoyi.system.model.TBillDetail;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "缴费账单VO")
+public class TBillVO extends TBill {
+
+    @ApiModelProperty(value = "水电费明细")
+    private List<TBillDetail> billDetailList;
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TBillConfirmMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TBillConfirmMapper.xml
new file mode 100644
index 0000000..5ca0a5a
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/TBillConfirmMapper.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.TBillConfirmMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TBillConfirm">
+        <id column="id" property="id" />
+        <result column="bill_id" property="billId" />
+        <result column="pay_fees_money" property="payFeesMoney" />
+        <result column="voucher" property="voucher" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, bill_id, pay_fees_money, voucher
+    </sql>
+
+</mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TBillDetailMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TBillDetailMapper.xml
new file mode 100644
index 0000000..a2009d7
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/TBillDetailMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.TBillDetailMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TBillDetail">
+        <id column="id" property="id" />
+        <result column="bill_id" property="billId" />
+        <result column="start_reading" property="startReading" />
+        <result column="end_reading" property="endReading" />
+        <result column="usage_measure" property="usageMeasure" />
+        <result column="unit_price" property="unitPrice" />
+        <result column="total_amount" property="totalAmount" />
+        <result column="live_type" property="liveType" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="disabled" property="disabled" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, bill_id, start_reading, end_reading, usage_measure, unit_price, total_amount,live_type, create_time, update_time, create_by, update_by, disabled
+    </sql>
+
+</mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml
index 2f8fbd8..80587c7 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TBillMapper.xml
@@ -42,10 +42,11 @@
             h.house_name as houseName
         FROM
             t_bill b
-        LEFT JOIN t_contract c ON c.contract_number = b.contract_number
-        LEFT JOIN t_house h ON h.id = c.house_id
-        LEFT JOIN t_tenant t ON t.id = c.tenant_id
+        LEFT JOIN t_contract c ON c.contract_number = b.contract_number and c.disabled=0
+        LEFT JOIN t_house h ON h.id = c.house_id and h.disabled=0
+        LEFT JOIN t_tenant t ON t.id = c.tenant_id and t.disabled=0
         <where>
+            b.disabled=0
             <if test="query.payFeesStatus != null">
                 and b.pay_fees_status = #{query.payFeesStatus}
             </if>
diff --git a/ruoyi-system/src/main/resources/mapper/system/TInvoiceToBillMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TInvoiceToBillMapper.xml
new file mode 100644
index 0000000..fe804dc
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/TInvoiceToBillMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.TInvoiceToBillMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TInvoiceToBill">
+        <id column="id" property="id" />
+        <result column="invoice_id" property="invoiceId" />
+        <result column="bill_id" property="billId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, invoice_id, bill_id
+    </sql>
+
+</mapper>

--
Gitblit v1.7.1