From b70eec17ac045cdc2de640092c96037f1e7b0d2e Mon Sep 17 00:00:00 2001
From: shinnosuke <tantao@1hoper.com>
Date: 星期二, 23 六月 2026 16:06:37 +0800
Subject: [PATCH] 新增了部分v2.0 p1功能

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java                          |   40 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java                                         |   17 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java                               |  140 +++--
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/TAccountingStrategyQuery.java                |    3 
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml                                            |   72 ++
 sql/20260618_order_invoice_v2.sql                                                                                            |   69 ++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/PayOrderExport.java                                           |   49 +
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PartnerListDTO.java                            |    8 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java                      |    2 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java |    7 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java                                    |   15 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java                              |   92 +++
 sql/20260616_parking_lot_barrier_brand.sql                                                                                   |   21 
 sql/20260617_accounting_strategy_partner.sql                                                                                 |   17 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java                         |    2 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java          |   77 ++
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/PartnerMapper.java                              |    5 
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java                               |   54 +
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java                   |   36 +
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java                               |    5 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java                                 |   12 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java                        |    2 
 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml                        |   45 +
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java                             |   87 +++
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/GetPartnerList.java                          |    2 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java                                       |   57 +
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java                             |    4 
 ruoyi-gateway/src/main/resources/bootstrap.yml                                                                               |    6 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TAccountingStrategyVO.java                      |    3 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java               |  125 +++-
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java             |   14 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ManageOrderAppealQuery.java                                      |   16 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java                |    4 
 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml                              |   10 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TVipOrderExport.java                                          |   34 +
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java                          |    6 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TAccountingStrategy.java                     |    4 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java                           |  127 ++++
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java             |    8 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java                                  |   83 +++
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/ParkingRecordPageQuery.java                        |    3 
 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingLotMapper.xml                                |    4 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java                      |    2 
 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml                                    |   43 +
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java                           |    9 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java                                          |    6 
 sql/20260616_partner_type.sql                                                                                                |   21 
 47 files changed, 1,193 insertions(+), 275 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
index 75cc7a1..13dad3b 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
@@ -3,6 +3,7 @@
 import com.ruoyi.account.api.dto.GiveVipDto;
 import com.ruoyi.account.api.dto.SendMessageDTO;
 import com.ruoyi.account.api.dto.UploadPdfDTO;
+import com.ruoyi.account.api.dto.UserListQueryDto;
 import com.ruoyi.account.api.feignClient.AppUserClient;
 import com.ruoyi.account.api.model.TAppCoupon;
 import com.ruoyi.account.api.model.TAppUser;
@@ -37,6 +38,11 @@
             }
 
             @Override
+            public R<List<Long>> getVipUserIds(UserListQueryDto query) {
+                return R.fail("会员列表筛选用户ids失败:" + throwable.getMessage());
+            }
+
+            @Override
             public R uploadPdf(UploadPdfDTO dto) {
                 return R.fail("开票发送邮件失败:"+throwable.getMessage());
             }
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
index a175afa..6a23925 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -3,6 +3,7 @@
 import com.ruoyi.account.api.dto.GiveVipDto;
 import com.ruoyi.account.api.dto.SendMessageDTO;
 import com.ruoyi.account.api.dto.UploadPdfDTO;
+import com.ruoyi.account.api.dto.UserListQueryDto;
 import com.ruoyi.account.api.model.TAppCoupon;
 import com.ruoyi.account.api.model.TAppUser;
 import com.ruoyi.account.api.model.TAppUserAddress;
@@ -25,6 +26,10 @@
     @ApiOperation(value = "管理后台-根据手机号查询用户ids", tags = {"管理后台-活动费用统计"})
     @PostMapping(value = "/t-app-user/user/getUserIdsByPhone")
     public R<List<Long>> getUserIdsByPhone(@RequestParam("phone") String phone);
+
+    @ApiOperation(value = "管理后台-会员列表筛选用户ids", tags = {"管理后台-会员列表"})
+    @PostMapping(value = "/t-app-user/user/vip/userIds")
+    R<List<Long>> getVipUserIds(@RequestBody UserListQueryDto query);
     @ApiOperation(value = "管理后台-开票发送邮件", tags = {"管理后台-开票发送邮件"})
     @PostMapping(value = "/t-app-user/uploadPdf")
     public R uploadPdf(@RequestBody UploadPdfDTO dto);
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PartnerListDTO.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PartnerListDTO.java
index 2844a86..397bc76 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PartnerListDTO.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/PartnerListDTO.java
@@ -17,6 +17,12 @@
 	private Integer id;
 	@ApiModelProperty(value = "合作商名称")
 	private String name;
+	@ApiModelProperty(value = "合作商类型:1=合作商,2=场地方,3=服务商")
+	private Integer partnerType;
+	@ApiModelProperty(value = "角色id")
+	private Integer roleId;
+	@ApiModelProperty(value = "角色名称")
+	private String roleName;
 	@ApiModelProperty(value = "合作商电话1")
 	private String phoneOne;
 	@ApiModelProperty(value = "注册地址")
@@ -29,4 +35,6 @@
 	private BigDecimal electricityShareRatio;
 	@ApiModelProperty(value = "服务费分成比例")
 	private BigDecimal serviceShareRatio;
+	@ApiModelProperty(value = "场地方合作商分账金额")
+	private BigDecimal venueShareAmount;
 }
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java
index 29be5e5..c6c2ea0 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Partner.java
@@ -45,6 +45,12 @@
 	@ApiModelProperty(value = "角色id", required = true)
 	private Integer roleId;
 	/**
+	 * 合作商类型:1=合作商,2=场地方,3=服务商
+	 */
+	@TableField("partner_type")
+	@ApiModelProperty(value = "合作商类型:1=合作商,2=场地方,3=服务商", required = true)
+	private Integer partnerType;
+	/**
 	 * 角色名称
 	 */
 	@TableField(exist = false)
@@ -81,6 +87,12 @@
 	@ApiModelProperty(value = "服务费分成比例")
 	private BigDecimal serviceShareRatio;
 	/**
+	 * 场地方合作商分账金额
+	 */
+	@TableField("venue_share_amount")
+	@ApiModelProperty(value = "场地方合作商分账金额")
+	private BigDecimal venueShareAmount;
+	/**
 	 * 注册地址
 	 */
 	@TableField("address")
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TAccountingStrategy.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TAccountingStrategy.java
index c9c09f2..908db46 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TAccountingStrategy.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TAccountingStrategy.java
@@ -39,6 +39,10 @@
     @TableField("site_id")
     private Integer siteId;
 
+    @ApiModelProperty(value = "归属合作商id")
+    @TableField("partner_id")
+    private Integer partnerId;
+
     @ApiModelProperty(value = "申请人id")
     @TableField("user_id")
     private Long userId;
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java
index 5dbc974..8741283 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java
@@ -54,6 +54,15 @@
     @TableField(exist = false)
     private String chargingPileName;
 
+    @TableField(exist = false)
+    private String brand;
+
+    @TableField(exist = false)
+    private String deviceName;
+
+    @TableField(exist = false)
+    private String alarmCode;
+
     @ApiModelProperty(value = "状态(1=离线,2=故障)")
     @TableField("status")
     private Integer status;
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java
index 288c211..00018d6 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java
@@ -38,6 +38,10 @@
     @TableField("type")
     private Integer type;
 
+    @ApiModelProperty(value = "道闸品牌(1=顺捷,2=吉联)")
+    @TableField("barrier_brand")
+    private Integer barrierBrand;
+
     @ApiModelProperty(value = "车场名称")
     @TableField("name")
     private String name;
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/GetPartnerList.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/GetPartnerList.java
index 0f97179..8a0c19f 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/GetPartnerList.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/GetPartnerList.java
@@ -14,4 +14,6 @@
 public class GetPartnerList extends BasePage {
 	@ApiModelProperty(value = "合作商名称")
 	private String name;
+	@ApiModelProperty(value = "合作商类型:1=合作商,2=场地方,3=服务商")
+	private Integer partnerType;
 }
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/TAccountingStrategyQuery.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/TAccountingStrategyQuery.java
index 80ffa4d..c5f4b53 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/TAccountingStrategyQuery.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/TAccountingStrategyQuery.java
@@ -14,5 +14,8 @@
     @ApiModelProperty(value = "1=待审核一级,2=待审核二级,3=审核通过,4=驳回")
     private Integer auditStatus;
 
+    @ApiModelProperty(value = "归属合作商id")
+    private Integer partnerId;
+
 
 }
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TAccountingStrategyVO.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TAccountingStrategyVO.java
index 40ea660..9e45255 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TAccountingStrategyVO.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TAccountingStrategyVO.java
@@ -24,5 +24,8 @@
     @ApiModelProperty(value = "申请人名字")
     private String userName;
 
+    @ApiModelProperty(value = "归属合作商名称")
+    private String partnerName;
+
 
 }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
index 133959d..9d10938 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
@@ -42,6 +42,14 @@
     @TableField("app_user_id")
     private Long appUserId;
 
+    @ApiModelProperty(value = "站点id")
+    @TableField("site_id")
+    private Integer siteId;
+
+    @ApiModelProperty(value = "合作商id")
+    @TableField("partner_id")
+    private Integer partnerId;
+
     @ApiModelProperty(value = "开票订单类型(1=充电订单,2=购物订单,3=兑换订单,4=会员订单)")
     @TableField("order_type")
     private Integer orderType;
@@ -106,6 +114,10 @@
     @TableField("mailbox")
     private String mailbox;
 
+    @ApiModelProperty(value = "备注")
+    @TableField("remark")
+    private String remark;
+
     @ApiModelProperty(value = "状态(1=待开票,2=开票中,3=已开票)")
     @TableField("status")
     private Integer status;
@@ -124,4 +136,9 @@
     @TableField("billing_user_id")
     private Integer billingUserId;
 
+    @ApiModelProperty(value = "取消时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField("cancel_time")
+    private LocalDateTime cancelTime;
+
 }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java
index d12f20b..505e061 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java
@@ -11,6 +11,9 @@
 @ApiModel(value = "发票管理Query")
 public class TOrderInvoiceQuery extends TimeRangePageQuery {
 
+    @ApiModelProperty(value = "开票申请id")
+    private Long id;
+
     @ApiModelProperty(value = "开票公司")
     private String invoicingCompany;
 
@@ -25,7 +28,8 @@
 
     @ApiModelProperty(value = "开票方式(1=人工,2=自动)")
     private Integer invoicingMethod;
-    @ApiModelProperty(value = "状态(1=待开票,2=开票中,3=已开票)")
+
+    @ApiModelProperty(value = "状态(1=待开票,2=开票中,3=已开票,4=已取消)")
     private Integer status;
 
     @ApiModelProperty(value = "申请人电话")
@@ -40,4 +44,13 @@
     @ApiModelProperty(value = "用户id 前端忽略")
     private List<Long> userIds;
 
+    @ApiModelProperty(value = "站点id")
+    private Integer siteId;
+
+    @ApiModelProperty(value = "合作商id")
+    private Integer partnerId;
+
+    @ApiModelProperty(value = "仅看直营,1=是")
+    private Integer directOnly;
+
 }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java
index dd9e4f5..3d50dc5 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java
@@ -34,4 +34,10 @@
     @ApiModelProperty("站点名称")
     private String siteName;
 
+    @ApiModelProperty("合作商名称")
+    private String partnerName;
+
+    @ApiModelProperty("经营类型")
+    private Integer businessCategory;
+
 }
diff --git a/ruoyi-gateway/src/main/resources/bootstrap.yml b/ruoyi-gateway/src/main/resources/bootstrap.yml
index 4b6a008..7c24fc9 100644
--- a/ruoyi-gateway/src/main/resources/bootstrap.yml
+++ b/ruoyi-gateway/src/main/resources/bootstrap.yml
@@ -23,7 +23,7 @@
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: 192.168.110.64:8848
+        server-addr: 192.168.110.80:8848
         service: ${spring.application.name}
         group: DEFAULT_GROUP
         namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
@@ -31,7 +31,7 @@
         password: nacos
       config:
         # 配置中心地址
-        server-addr: 192.168.110.64:8848
+        server-addr: 192.168.110.80:8848
         namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
         username: nacos
         password: nacos
@@ -52,7 +52,7 @@
       datasource:
         ds1:
           nacos:
-            server-addr: 192.168.110.64:8848
+            server-addr: 192.168.110.80:8848
             dataId: sentinel-ruoyi-gateway
             groupId: DEFAULT_GROUP
             username: nacos
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
index 8035f12..4e970b4 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -9,6 +9,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.account.api.dto.*;
 import com.ruoyi.account.api.model.*;
@@ -444,17 +445,7 @@
             end2 = LocalDateTime.now().plusDays(userListQueryDto.getVipEndTime2());
         }
         //列表查询
-        Page<TAppUser> page = appUserService.lambdaQuery()
-                .ge(TAppUser::getVipEndTime, LocalDateTime.now())
-                .like(userListQueryDto.getUserPhone() != null && !"".equals(userListQueryDto.getUserPhone()), TAppUser::getPhone, userListQueryDto.getUserPhone())
-                .eq(userListQueryDto.getCompanyId() != null, TAppUser::getCompanyId, userListQueryDto.getCompanyId())
-                .eq(userListQueryDto.getProvinceCode() != null && !"".equals(userListQueryDto.getProvinceCode()), TAppUser::getProvinceCode, userListQueryDto.getProvinceCode())
-                .eq(userListQueryDto.getCityCode() != null && !"".equals(userListQueryDto.getCityCode()), TAppUser::getCityCode, userListQueryDto.getCityCode())
-                .eq(userListQueryDto.getStatus() != null, TAppUser::getStatus, userListQueryDto.getStatus())
-                .eq(userListQueryDto.getVipTypeId() != null, TAppUser::getVipId, userListQueryDto.getVipTypeId())
-                .ge(userListQueryDto.getVipEndTime1() != null, TAppUser::getVipEndTime, end1 )
-                .le(userListQueryDto.getVipEndTime2() != null, TAppUser::getVipEndTime, end2)
-                .in(!userIds.isEmpty(), TAppUser::getId, userIds)
+        Page<TAppUser> page = buildVipUserQuery(userListQueryDto)
                 .page(Page.of(userListQueryDto.getPageCurr(), userListQueryDto.getPageSize()));
         if (page.getRecords().isEmpty()){
             return R.ok(page);
@@ -492,6 +483,47 @@
         }
         return R.ok(page);
     }
+
+    @ApiOperation(value = "会员列表筛选用户ids", tags = {"用户管理-会员列表"})
+    @PostMapping(value = "/user/vip/userIds")
+    public R<List<Long>> vipUserIds(@RequestBody UserListQueryDto userListQueryDto) {
+        List<Long> userIds = buildVipUserQuery(userListQueryDto).list().stream()
+                .map(TAppUser::getId)
+                .collect(Collectors.toList());
+        return R.ok(userIds);
+    }
+
+    private LambdaQueryChainWrapper<TAppUser> buildVipUserQuery(UserListQueryDto userListQueryDto) {
+        if (userListQueryDto == null) {
+            userListQueryDto = new UserListQueryDto();
+        }
+        List<Long> userIds = new ArrayList<>();
+        if (userListQueryDto.getUserTagId() != null){
+            userIds = appUserTagService.lambdaQuery().eq(TAppUserTag::getUserTagId, userListQueryDto.getUserTagId()).list().stream().map(TAppUserTag::getAppUserId).collect(Collectors.toList());
+            if (userIds.isEmpty()) {
+                userIds.add(-1L);
+            }
+        }
+        LocalDateTime end1 = null;
+        LocalDateTime end2 = null ;
+        if (userListQueryDto.getVipEndTime1()!=null) {
+            end1 = LocalDateTime.now().plusDays(userListQueryDto.getVipEndTime1());
+        }
+        if (userListQueryDto.getVipEndTime2()!=null){
+            end2 = LocalDateTime.now().plusDays(userListQueryDto.getVipEndTime2());
+        }
+        return appUserService.lambdaQuery()
+                .ge(TAppUser::getVipEndTime, LocalDateTime.now())
+                .like(userListQueryDto.getUserPhone() != null && !"".equals(userListQueryDto.getUserPhone()), TAppUser::getPhone, userListQueryDto.getUserPhone())
+                .eq(userListQueryDto.getCompanyId() != null, TAppUser::getCompanyId, userListQueryDto.getCompanyId())
+                .eq(userListQueryDto.getProvinceCode() != null && !"".equals(userListQueryDto.getProvinceCode()), TAppUser::getProvinceCode, userListQueryDto.getProvinceCode())
+                .eq(userListQueryDto.getCityCode() != null && !"".equals(userListQueryDto.getCityCode()), TAppUser::getCityCode, userListQueryDto.getCityCode())
+                .eq(userListQueryDto.getStatus() != null, TAppUser::getStatus, userListQueryDto.getStatus())
+                .eq(userListQueryDto.getVipTypeId() != null, TAppUser::getVipId, userListQueryDto.getVipTypeId())
+                .ge(userListQueryDto.getVipEndTime1() != null, TAppUser::getVipEndTime, end1 )
+                .le(userListQueryDto.getVipEndTime2() != null, TAppUser::getVipEndTime, end2)
+                .in(!userIds.isEmpty(), TAppUser::getId, userIds);
+    }
     
     
     @RequiresPermissions(value = {"/coupon/send"}, logical = Logical.OR)
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java
index a3396bf..cd2d053 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java
@@ -57,7 +57,7 @@
 	
 	
 	
-	@RequiresPermissions(value = {"/balanceSheetRecord", "/partners", "/chargingPile/add", "/chargingPile/select", "/chargingPile/update"}, logical = Logical.OR)
+	@RequiresPermissions(value = {"/balanceSheetRecord", "/partners", "/chargingPile/add", "/chargingPile/select", "/chargingPile/update", "/invoiceManagement"}, logical = Logical.OR)
 	@ResponseBody
 	@GetMapping("/getPartnerList")
 	@ApiOperation(value = "获取合作商列表", tags = {"管理后台-合作商管理"})
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
index 4e7cbe6..c04c493 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -270,7 +270,7 @@
 	
 	@RequiresPermissions(value = {"/systemUserManagement/update", "/site", "/platformRevenueAnalysis", "/chargingOperationAnalysis",
 			"/chargingUserAnalysis", "/operationMaintenanceAnalysis", "/chargingEquipmentMonitoring", "/activityExpense", "/chargeEvaluation/list",
-			"/parkingLot", "/workbench"}, logical = Logical.OR)
+			"/parkingLot", "/workbench", "/invoiceManagement"}, logical = Logical.OR)
 	@GetMapping("/getSiteList")
 	@ApiOperation(value = "获取站点列表", tags = {"管理后台-站点管理"})
 	public AjaxResult<PageInfo<GetSiteListDTO>> getSiteList(GetSiteList siteList){
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
index 5d7e960..8c5dd94 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -11,6 +11,7 @@
 import com.ruoyi.chargingPile.api.query.TAccountingStrategyQuery;
 import com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO;
 import com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO;
+import com.ruoyi.chargingPile.service.IPartnerService;
 import com.ruoyi.chargingPile.service.ISiteService;
 import com.ruoyi.chargingPile.service.TAccountingStrategyDetailService;
 import com.ruoyi.chargingPile.service.TAccountingStrategyService;
@@ -73,6 +74,9 @@
     private SysUserClient sysUserClient;
     
     @Resource
+    private IPartnerService partnerService;
+    
+    @Resource
     private IntegrationClient integrationClient;
     
     @Resource
@@ -98,6 +102,10 @@
     @ApiOperation(tags = {"后台-计费策略"},value = "查询计费策略分页列表")
     @PostMapping(value = "/pageList")
     public AjaxResult<PageInfo<TAccountingStrategyVO>> pageList(@RequestBody TAccountingStrategyQuery query) {
+        SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData();
+        if (sysUser != null && Objects.equals(sysUser.getRoleType(), 2)) {
+            query.setPartnerId(sysUser.getObjectId());
+        }
         return AjaxResult.ok(accountingStrategyService.pageList(query));
     }
 
@@ -123,6 +131,10 @@
     @PostMapping(value = "/add")
     @Log(title = "【计费策略】添加计费策略", businessType = BusinessType.INSERT)
     public AjaxResult<Integer> add(@RequestBody TAccountingStrategyDTO dto) {
+        String partnerCheck = fillAndCheckPartner(dto);
+        if (partnerCheck != null) {
+            return AjaxResult.error(partnerCheck);
+        }
         if(null != dto.getSiteId()){
             dto.setAuditStatus(3);
         }else{
@@ -162,6 +174,10 @@
     @ApiOperation(tags = {"后台-计费策略", "管理后台-站点管理"},value = "修改计费策略")
     @PostMapping(value = "/update")
     public AjaxResult<String> update(@RequestBody TAccountingStrategyDTO dto) {
+        String partnerCheck = fillAndCheckPartner(dto);
+        if (partnerCheck != null) {
+            return AjaxResult.error(partnerCheck);
+        }
         Boolean flag = accountingStrategyDetailService.isStrategy24Hour(dto.getAccountingStrategyDetails());
         if(flag){
             return AjaxResult.error("计费模板时间设置有误差");
@@ -255,6 +271,7 @@
             String twoUserName = sysUserClient.getSysUser(accountingStrategy.getTwoUserId()).getData().getNickName();
             accountingStrategyVO.setTwoUserName(twoUserName);
         }
+        fillPartnerName(accountingStrategyVO);
         return AjaxResult.ok(accountingStrategyVO);
     }
 
@@ -307,7 +324,32 @@
             accountingStrategyVO.setAccountingStrategyDetailList(accountingStrategyDetailService.list(Wrappers.lambdaQuery(TAccountingStrategyDetail.class)
                     .eq(TAccountingStrategyDetail::getAccountingStrategyId, id).eq(TAccountingStrategyDetail::getDelFlag, 0)));
         }
+        fillPartnerName(accountingStrategyVO);
         return AjaxResult.ok(accountingStrategyVO);
+    }
+
+    private String fillAndCheckPartner(TAccountingStrategyDTO dto) {
+        SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData();
+        if (sysUser != null && Objects.equals(sysUser.getRoleType(), 2)) {
+            Integer objectId = sysUser.getObjectId();
+            if (dto.getPartnerId() != null && !Objects.equals(dto.getPartnerId(), objectId)) {
+                return "合作商账号只能选择自己的合作商";
+            }
+            dto.setPartnerId(objectId);
+        }
+        if (dto.getSiteId() == null && dto.getPartnerId() == null) {
+            return "归属合作商不能为空";
+        }
+        return null;
+    }
+
+    private void fillPartnerName(TAccountingStrategyVO vo) {
+        if (vo.getPartnerId() != null) {
+            Partner partner = partnerService.getById(vo.getPartnerId());
+            if (partner != null) {
+                vo.setPartnerName(partner.getName());
+            }
+        }
     }
 
     /**
@@ -365,6 +407,10 @@
     @ApiOperation(tags = {"后台-申请表单-计费模板审核"},value = "查询计费审核分页列表")
     @PostMapping(value = "/auth/pageList")
     public AjaxResult<PageInfo<TAccountingStrategyVO>> authPageList(@RequestBody TAccountingStrategyQuery query) {
+        SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData();
+        if (sysUser != null && Objects.equals(sysUser.getRoleType(), 2)) {
+            query.setPartnerId(sysUser.getObjectId());
+        }
         return AjaxResult.ok(accountingStrategyService.pageList1(query));
     }
     
@@ -493,25 +539,20 @@
                 electronic = tAccountingStrategyDetail.getElectrovalence();
                 // 非会员下的服务费
                 BigDecimal multiply = beforeMoney.multiply(tAccountingStrategyDetail.getServiceCharge()).divide(electronic, 2, RoundingMode.HALF_UP);
-                if (byId.getBusinessCategory() == 1){
-                    // 直营才享受会员折扣
-                    // 根据电价和预付金额 是否有会员折扣 计算最终服务费
-                    if (split[1].equals("1")){
-                        // 抵扣金额
-                        BigDecimal multiply1 = multiply.multiply(discount);
-                        if (multiply1.compareTo(discountMoney)>0){
-                            multiply1 = discountMoney;
-                        }
-                        // 普通最终服务费
-                        res = multiply.subtract(multiply1);
+                res = multiply;
+                // 根据电价和预付金额 是否有会员折扣 计算最终服务费
+                if (split[1].equals("1")){
+                    // 抵扣金额
+                    BigDecimal multiply1 = multiply.multiply(discount);
+                    if (multiply1.compareTo(discountMoney)>0){
+                        multiply1 = discountMoney;
                     }
-                    if (split[1].equals("2")){
-                        // 内部会员折扣 最终服务费
-                        res = discountInner.multiply(multiply);
-                    }
-                }else{
-                    // 非直营
-                    res = multiply;
+                    // 普通最终服务费
+                    res = multiply.subtract(multiply1);
+                }
+                if (split[1].equals("2")){
+                    // 内部会员折扣 最终服务费
+                    res = discountInner.multiply(multiply);
                 }
                 break;
             }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java
index b47e05b..9b63e18 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java
@@ -75,9 +75,9 @@
     @ResponseBody
     @GetMapping("/getFaultMessageList")
     @ApiOperation(value = "获取故障信息列表数据", tags = {"管理后台-设备监控"})
-    public AjaxResult<PageInfo<TFaultMessage>> getFaultMessageList(Integer siteId, BasePage basePage){
+    public AjaxResult<PageInfo<TFaultMessage>> getFaultMessageList(Integer siteId, Integer partnerId, Integer partnerType, Integer alarmType, BasePage basePage){
         PageInfo<TFaultMessage> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize());
-        List<TFaultMessage> faultMessageList = faultMessageService.getFaultMessageList(pageInfo, siteId);
+        List<TFaultMessage> faultMessageList = faultMessageService.getFaultMessageList(pageInfo, siteId, partnerId, partnerType, alarmType);
         pageInfo.setRecords(faultMessageList);
         return AjaxResult.success(pageInfo);
     }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java
index a6a753d..170150d 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java
@@ -79,75 +79,112 @@
     @PostMapping(value = "/page")
     public R<Page<TParkingRecord>> page(@RequestBody ParkingRecordPageQuery query) {
         Long userid = tokenService.getLoginUser().getUserid();
-        SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
+        SysUser sysUser = sysUserClient.getSysUser(userid).getData();
         Integer roleType = sysUser.getRoleType();
-        List<Integer> siteIds = new ArrayList<>();
-
-        List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userid).getData();
-        for (GetSiteListDTO datum : data) {
-            siteIds.add(datum.getId());
-        }
-        if (siteIds.isEmpty()){
-            siteIds.add(-1);
-        }else{
-            if (roleType == 2){
-                List<Integer> integers = new ArrayList<>();
-                for (Integer siteId : siteIds) {
-                    // 校验有没有这个站点的权限
-                    List<Boolean> t1= partnerClient.parkingRecordListMenu(sysUser.getObjectId(),siteId).getData();
-
-                    Boolean b = t1.get(1);
-                    if (b){
-                        integers.add(siteId);
-                    }
-                }
-                siteIds = integers;
-            }
-        }
-        if (siteIds.isEmpty()){
+        boolean partnerUser = Objects.equals(roleType, 2);
+        Map<Integer, GetSiteListDTO> visibleSiteMap = getVisibleSiteMap(userid);
+        List<Integer> siteIds = filterParkingRecordSiteIds(sysUser, visibleSiteMap, query);
+        if (siteIds.isEmpty()) {
             siteIds.add(-1);
         }
-        List<TParkingLot> list = parkingLotService.lambdaQuery().in( TParkingLot::getSiteId, siteIds).list();
+
+        List<TParkingLot> list = parkingLotService.lambdaQuery().in(TParkingLot::getSiteId, siteIds).list();
         List<Integer> ids = new ArrayList<>();
         for (TParkingLot tParkingLot : list) {
             ids.add(tParkingLot.getId());
         }
-
-
-        String s1 = "";
-        String s2 = "";
-        if (query.getTimePeriod()!=null){
-             s1 = query.getTimePeriod().split(" - ")[0];
-             s2 = query.getTimePeriod().split(" - ")[1];
+        if (ids.isEmpty()) {
+            ids.add(-1);
         }
+
+        String startTime = "";
+        String endTime = "";
+        if (query.getTimePeriod() != null) {
+            String[] timeRange = query.getTimePeriod().split(" - ");
+            startTime = timeRange[0];
+            endTime = timeRange[1];
+        }
+        final String finalStartTime = startTime;
+        final String finalEndTime = endTime;
         Page<TParkingRecord> page = parkingRecordService.lambdaQuery()
-                .in(null != ids && ids.size() > 0, TParkingRecord::getParkingLotId,ids)
+                .in(TParkingRecord::getParkingLotId, ids)
                 .like(query.getLicensePlate() != null, TParkingRecord::getLicensePlate, query.getLicensePlate())
                 .eq(query.getStatus() != null, TParkingRecord::getStatus, query.getStatus())
                 .eq(query.getOutParkingType() != null, TParkingRecord::getOutParkingType, query.getOutParkingType())
-                .between(query.getTimePeriod()!=null,TParkingRecord::getInParkingTime,s1,s2)
-                .or()
-                .between(query.getTimePeriod()!=null,TParkingRecord::getOutParkingTime,s1,s2)
+                .and(query.getTimePeriod() != null, wrapper -> wrapper
+                        .between(TParkingRecord::getInParkingTime, finalStartTime, finalEndTime)
+                        .or()
+                        .between(TParkingRecord::getOutParkingTime, finalStartTime, finalEndTime))
                 .orderByDesc(TParkingRecord::getCreateTime)
                 .page(Page.of(query.getPageCurr(), query.getPageSize()));
 
         for (TParkingRecord record : page.getRecords()) {
             TParkingLot byId = parkingLotService.getById(record.getParkingLotId());
             record.setUid(record.getId().toString());
-            if (byId!=null) {
+            if (byId != null) {
                 record.setParkName(byId.getName());
-                if (roleType==2){
+                record.setSiteId(byId.getSiteId());
+                if (partnerUser) {
                     List<Boolean> data1 = partnerClient.parkingRecordListMenu(sysUser.getObjectId(), byId.getSiteId()).getData();
-                    record.setAuthInfo(data1.get(0));
-                    record.setAuthOut(data1.get(1));
+                    record.setAuthInfo(getMenuFlag(data1, 0));
+                    record.setAuthOut(getMenuFlag(data1, 1));
                 }
             }
         }
         return R.ok(page);
     }
-    
-    
-    @RequiresPermissions(value = {"/parkingPaymentOrder"}, logical = Logical.OR)
+
+    private Map<Integer, GetSiteListDTO> getVisibleSiteMap(Long userId) {
+        Map<Integer, GetSiteListDTO> siteMap = new HashMap<>();
+        if (userId == null) {
+            return siteMap;
+        }
+        List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
+        if (data != null) {
+            for (GetSiteListDTO datum : data) {
+                if (datum.getId() != null) {
+                    siteMap.put(datum.getId(), datum);
+                }
+            }
+        }
+        return siteMap;
+    }
+
+    private List<Integer> filterParkingRecordSiteIds(SysUser sysUser, Map<Integer, GetSiteListDTO> visibleSiteMap, ParkingRecordPageQuery query) {
+        List<Integer> siteIds = new ArrayList<>();
+        if (visibleSiteMap == null || visibleSiteMap.isEmpty()) {
+            return siteIds;
+        }
+        boolean partnerUser = sysUser != null && Objects.equals(sysUser.getRoleType(), 2);
+        for (GetSiteListDTO site : visibleSiteMap.values()) {
+            Integer siteId = site.getId();
+            if (siteId == null) {
+                continue;
+            }
+            if (query.getSiteId() != null && !query.getSiteId().equals(siteId)) {
+                continue;
+            }
+            if (query.getPartnerId() != null && !query.getPartnerId().equals(site.getPartnerId())) {
+                continue;
+            }
+            if (query.getSiteType() != null && !query.getSiteType().equals(site.getSiteType())) {
+                continue;
+            }
+            if (partnerUser) {
+                List<Boolean> menuFlags = partnerClient.parkingRecordListMenu(sysUser.getObjectId(), siteId).getData();
+                if (!getMenuFlag(menuFlags, 1)) {
+                    continue;
+                }
+            }
+            siteIds.add(siteId);
+        }
+        return siteIds;
+    }
+
+    private boolean getMenuFlag(List<Boolean> menuFlags, int index) {
+        return menuFlags != null && menuFlags.size() > index && Boolean.TRUE.equals(menuFlags.get(index));
+    }
+        @RequiresPermissions(value = {"/parkingPaymentOrder"}, logical = Logical.OR)
     @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "停车缴费订单列表")
     @PostMapping(value = "/pageList")
     public R<TParkingRecordPageInfoVO> pageList(@RequestBody ParkingRecordQuery query) {
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/ParkingRecordPageQuery.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/ParkingRecordPageQuery.java
index 023e84b..019c271 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/ParkingRecordPageQuery.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/ParkingRecordPageQuery.java
@@ -14,4 +14,7 @@
     String licensePlate;
     Integer status;
     Integer outParkingType;
+    Integer siteType;
+    Integer partnerId;
+    Integer siteId;
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/PartnerMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/PartnerMapper.java
index c5bd072..b31b854 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/PartnerMapper.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/PartnerMapper.java
@@ -22,4 +22,9 @@
 	 * @return
 	 */
 	List<PartnerListDTO> getPartnerList(PageInfo<PartnerListDTO> pageInfo, @Param("item") GetPartnerList partnerList);
+
+	/**
+	 * Query built-in role by partner type role name.
+	 */
+	Integer getDefaultPartnerRoleId(@Param("roleName") String roleName);
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java
index f85b500..f1e5203 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java
@@ -22,5 +22,5 @@
 	 * @param pageInfo
 	 * @return
 	 */
-	List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, @Param("siteIds") List<Integer> siteIds);
+	List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, @Param("siteIds") List<Integer> siteIds, @Param("partnerId") Integer partnerId, @Param("partnerType") Integer partnerType);
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java
index 4c72b29..8b2beb0 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java
@@ -30,5 +30,5 @@
      * @param siteId
      * @return
      */
-    List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, Integer siteId);
+    List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, Integer siteId, Integer partnerId, Integer partnerType, Integer alarmType);
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java
index 8abb955..1fafeec 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java
@@ -34,11 +34,6 @@
  */
 @Service
 public class PartnerServiceImpl extends ServiceImpl<PartnerMapper, Partner> implements IPartnerService {
-
-	/**
-	 * TODO 确认合作商默认角色ID,当前先使用通用角色占位。
-	 */
-	private static final Long PARTNER_DEFAULT_ROLE_ID = 2L;
 	
 	@Resource
 	private SysUserClient sysUserClient;
@@ -92,7 +87,7 @@
 		if(ajaxResult.isError()){
 			return ajaxResult;
 		}
-		partner.setRoleId(PARTNER_DEFAULT_ROLE_ID.intValue());
+		assignDefaultRole(partner);
 		Partner one = this.getOne(new LambdaQueryWrapper<Partner>()
 				.eq(Partner::getCode, partner.getCode())
 				.eq(Partner::getDelFlag, 0)
@@ -116,7 +111,7 @@
 		user.setPassword(partner.getPassword());
 		user.setStatus("0");
 		user.setDelFlag("0");
-		user.setRoleId(PARTNER_DEFAULT_ROLE_ID);
+		user.setRoleId(partner.getRoleId().longValue());
 		user.setRoleType(2);
 		user.setPassWordUpdate(new Date());
 		R<Long> r = sysUserClient.addSysUser(user);
@@ -143,6 +138,9 @@
 		}
 		if(StringUtils.isEmpty(partner.getName())){
 			return AjaxResult.error("合作商名称不能为空");
+		}
+		if(null == partner.getPartnerType()){
+			return AjaxResult.error("合作商类型不能为空");
 		}
 		if(StringUtils.isEmpty(partner.getPhoneOne())){
 			return AjaxResult.error("合作商电话1不能为空");
@@ -180,7 +178,7 @@
 		if(ajaxResult.isError()){
 			return ajaxResult;
 		}
-		partner.setRoleId(PARTNER_DEFAULT_ROLE_ID.intValue());
+		assignDefaultRole(partner);
 		Partner one = this.getOne(new LambdaQueryWrapper<Partner>()
 				.eq(Partner::getCode, partner.getCode())
 				.eq(Partner::getDelFlag, 0)
@@ -210,7 +208,7 @@
 			user.setNickName(partner.getName());
 			user.setAvatar(partner.getLogoUrl());
 			user.setPassword(partner.getPassword());
-			user.setRoleId(PARTNER_DEFAULT_ROLE_ID);
+			user.setRoleId(partner.getRoleId().longValue());
 			user.setRoleType(2);
 			user.setObjectId(partner.getId());
 			user.setPassWordUpdate(new Date());
@@ -227,7 +225,7 @@
 				user.setPassword(partner.getPassword());
 				user.setPassWordUpdate(new Date());
 			}
-			user.setRoleId(PARTNER_DEFAULT_ROLE_ID);
+			user.setRoleId(partner.getRoleId().longValue());
 			R r = sysUserClient.updateSysUser(user);
 			if(200 != r.getCode()){
 				throw new RuntimeException(r.getMsg());
@@ -240,6 +238,24 @@
 	}
 	
 	
+	private void assignDefaultRole(Partner partner) {
+		String roleName = partnerTypeRoleName(partner.getPartnerType());
+		Integer roleId = this.baseMapper.getDefaultPartnerRoleId(roleName);
+		if (roleId == null) {
+			throw new RuntimeException("系统内置角色【" + roleName + "】不存在,请先配置角色");
+		}
+		partner.setRoleId(roleId);
+	}
+
+	private String partnerTypeRoleName(Integer partnerType) {
+		if (Integer.valueOf(2).equals(partnerType)) {
+			return "场地方";
+		}
+		if (Integer.valueOf(3).equals(partnerType)) {
+			return "服务商";
+		}
+		return "合作商";
+	}
 	/**
 	 * 删除合作商
 	 * @param ids 合作商id
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
index 756d1f3..1397de1 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
@@ -203,16 +203,22 @@
 
     @Override
     public Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails) {
+        Map<Integer, BigDecimal> phaseToElectrovalence = new HashMap<>();
         Map<Integer, BigDecimal> phaseToServiceFee = new HashMap<>();
         Map<Integer, BigDecimal> phaseToCostServiceFee = new HashMap<>();
         for (TAccountingStrategyDetail detail : accountingStrategyDetails) {
             Integer type = detail.getType();
+            BigDecimal electrovalence = detail.getElectrovalence();
             BigDecimal serviceFee = detail.getServiceCharge();
             BigDecimal costServiceCharge = detail.getCostServiceCharge();
 
             if (phaseToServiceFee.containsKey(type)) {
+                BigDecimal existingElectrovalence = phaseToElectrovalence.get(type);
                 BigDecimal existingFee = phaseToServiceFee.get(type);
                 BigDecimal existingCostServiceCharge = phaseToCostServiceFee.get(type);
+                if (existingElectrovalence.compareTo(electrovalence) != 0) {
+                    return false;
+                }
                 if (existingFee.compareTo(serviceFee) != 0) {
                     return false; // 发现不一致的服务费
                 }
@@ -220,6 +226,7 @@
                     return false; // 发现不一致的原价服务费
                 }
             } else {
+                phaseToElectrovalence.put(type, electrovalence);
                 phaseToServiceFee.put(type, serviceFee);
                 phaseToCostServiceFee.put(type, costServiceCharge);
             }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
index 46a99af..942ec5b 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -500,8 +500,8 @@
 		}
 		List<TChargingGun> total = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getSiteId, siteIds).eq(TChargingGun::getDelFlag, 0));
 		List<TChargingGun> charging = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getSiteId, siteIds).eq(TChargingGun::getStatus, 4).eq(TChargingGun::getDelFlag, 0));
-		BigDecimal ratedPower = total.stream().map(TChargingGun::getRatedPower).reduce(BigDecimal.ZERO, BigDecimal::add);
-		BigDecimal realTimePower = charging.stream().map(TChargingGun::getChargingPower).reduce(BigDecimal.ZERO, BigDecimal::add);
+		BigDecimal ratedPower = sites.stream().map(Site::getRatedPower).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+		BigDecimal realTimePower = charging.stream().map(TChargingGun::getChargingPower).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
 		
 		ChargeMonitoring chargeMonitoring = new ChargeMonitoring();
 		chargeMonitoring.setPhone(sites.size() == 1 ? sites.get(0).getPhone() : "");
@@ -511,7 +511,7 @@
 		chargeMonitoring.setNotCharged(total.size() - charging.size());
 		chargeMonitoring.setRatedPower(ratedPower.setScale(4, RoundingMode.HALF_EVEN));
 		chargeMonitoring.setRealTimePower(realTimePower.setScale(4, RoundingMode.HALF_EVEN));
-		if(ratedPower.equals(BigDecimal.ZERO)){
+		if(ratedPower.compareTo(BigDecimal.ZERO) == 0){
 			chargeMonitoring.setDemandPowerSatisfactionRate(BigDecimal.ZERO);
 		}else{
 			chargeMonitoring.setDemandPowerSatisfactionRate(realTimePower.divide(ratedPower, new MathContext(2, RoundingMode.HALF_EVEN))
@@ -531,14 +531,12 @@
 		chargeTrend.put("value", value1);
 		chargeMonitoring.setChargeTrend(chargeTrend);
 		
-		//每日利用率=当日充电度数/(桩总功率*24小时)
-		List<TChargingPile> list = this.list(new LambdaQueryWrapper<TChargingPile>().in(TChargingPile::getSiteId, siteIds).eq(TChargingPile::getDelFlag, 0));
-		BigDecimal v = list.stream().map(TChargingPile::getRatedPower).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(4, RoundingMode.HALF_EVEN);
+		// 每日利用率=当日充电度数/(站点变压器额定功率*24小时)
 		List<Double> data = chargingOrderAccountingStrategyClient.getDailyChargingDegree(6, siteIds).getData();
 		List<Double> value2 = new ArrayList<>();
-		BigDecimal multiply = v.multiply(new BigDecimal(24));
+		BigDecimal multiply = ratedPower.multiply(new BigDecimal(24));
 		for (Double datum : data) {
-			if(list.size() == 0){
+			if(multiply.compareTo(BigDecimal.ZERO) == 0){
 				value2.add(0D);
 			}else{
 				Double datum1 = new BigDecimal(datum).divide(multiply, new MathContext(4, RoundingMode.HALF_EVEN))
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java
index 485546a..f80375a 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java
@@ -25,6 +25,7 @@
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -96,7 +97,10 @@
      * @return
      */
     @Override
-    public List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, Integer siteId) {
+    public List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, Integer siteId, Integer partnerId, Integer partnerType, Integer alarmType) {
+        if (alarmType != null && alarmType != 1) {
+            return Collections.emptyList();
+        }
         //校验合作商权限
         SysUser sysUser = sysUserClient.getSysUser(SecurityUtils.getUserId()).getData();
         Integer roleType = sysUser.getRoleType();
@@ -120,7 +124,7 @@
         }else{
             siteIds.add(siteId);
         }
-        List<TFaultMessage> faultMessageList = this.baseMapper.getFaultMessageList(pageInfo, siteIds);
+        List<TFaultMessage> faultMessageList = this.baseMapper.getFaultMessageList(pageInfo, siteIds, partnerId, partnerType);
         for (TFaultMessage faultMessage : faultMessageList) {
             faultMessage.setAuthDelete(roleType == 1 ? true : partnerService.authMenu(objectId, faultMessage.getSiteId(), SiteMenu.FAULT_INFORMATION_LIST_DEL));
         }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml
index ef3e6e3..9af10a6 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/PartnerMapper.xml
@@ -8,11 +8,13 @@
 		<result column="code" property="code" />
 		<result column="`name`" property="name" />
 		<result column="role_id" property="roleId" />
+		<result column="partner_type" property="partnerType" />
 		<result column="logo_url" property="logoUrl" />
 		<result column="rate" property="rate" />
 		<result column="icbc_partner_id" property="icbcPartnerId" />
 		<result column="electricity_share_ratio" property="electricityShareRatio" />
 		<result column="service_share_ratio" property="serviceShareRatio" />
+		<result column="venue_share_amount" property="venueShareAmount" />
 		<result column="address" property="address" />
 		<result column="phone_one" property="phoneOne" />
 		<result column="phone_two" property="phoneTwo" />
@@ -27,18 +29,37 @@
 	
 	<select id="getPartnerList" resultType="com.ruoyi.chargingPile.api.dto.PartnerListDTO">
 		select
-		id,
-		name,
-		phone_one as phoneOne,
-		address,
-		account,
-		remark,
-		electricity_share_ratio as electricityShareRatio,
-		service_share_ratio as serviceShareRatio
-		from t_partner where del_flag = 0
+		p.id,
+		p.name,
+		p.partner_type as partnerType,
+		p.role_id as roleId,
+		r.role_name as roleName,
+		p.phone_one as phoneOne,
+		p.address,
+		p.account,
+		p.remark,
+		p.electricity_share_ratio as electricityShareRatio,
+		p.service_share_ratio as serviceShareRatio,
+		p.venue_share_amount as venueShareAmount
+		from t_partner p
+		left join charging_pile_other.sys_role r on p.role_id = r.role_id
+		where p.del_flag = 0
 		<if test="null != item.name and '' != item.name">
-			and `name` like CONCAT('%', #{item.name}, '%')
+			and p.`name` like CONCAT('%', #{item.name}, '%')
 		</if>
-		order by create_time desc
+		<if test="null != item.partnerType">
+			and p.partner_type = #{item.partnerType}
+		</if>
+		order by p.create_time desc
+	</select>
+
+	<select id="getDefaultPartnerRoleId" resultType="java.lang.Integer">
+		select role_id
+		from charging_pile_other.sys_role
+		where del_flag = '0'
+		  and status = '0'
+		  and role_name = #{roleName}
+		order by role_id asc
+		limit 1
 	</select>
 </mapper>
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml
index a557970..1c7e24c 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml
@@ -6,6 +6,7 @@
     <resultMap id="BaseResultMap" type="com.ruoyi.chargingPile.api.model.TAccountingStrategy">
         <id column="id" property="id" />
         <result column="site_id" property="siteId" />
+        <result column="partner_id" property="partnerId" />
         <result column="`name`" property="name" />
         <result column="description" property="description" />
         <result column="discount" property="discount" />
@@ -23,48 +24,58 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, site_id, `name`, description, discount,first_user_id,two_user_id,first_remark,two_remark,audit_status,first_audit_time,two_audit_time, create_time, del_flag,parent_id
+        id, site_id, partner_id, `name`, description, discount,first_user_id,two_user_id,first_remark,two_remark,audit_status,first_audit_time,two_audit_time, create_time, del_flag,parent_id
     </sql>
     <select id="pageList" resultType="com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO">
         SELECT
-        id, site_id, `name`, description, discount,first_user_id,two_user_id,first_remark,two_remark,audit_status,first_audit_time,two_audit_time, create_time, del_flag,user_id,parent_id
-        FROM t_accounting_strategy
+        tas.id, tas.site_id, tas.partner_id as partnerId, tp.name as partnerName, tas.`name`, tas.description, tas.discount,tas.first_user_id,tas.two_user_id,tas.first_remark,tas.two_remark,tas.audit_status,tas.first_audit_time,tas.two_audit_time, tas.create_time, tas.del_flag,tas.user_id,tas.parent_id
+        FROM t_accounting_strategy tas
+        LEFT JOIN t_partner tp ON tas.partner_id = tp.id
         <where>
             <if test="query.name != null and query.name != ''">
-                AND `name` LIKE concat('%',#{query.name}, '%')
+                AND tas.`name` LIKE concat('%',#{query.name}, '%')
             </if>
             <if test="query.auditStatus != null">
-                AND audit_status = #{query.auditStatus}
+                AND tas.audit_status = #{query.auditStatus}
             </if>
-            AND site_id IS NULL
-            AND (parent_id IS NULL OR audit_status = 3 OR audit_status = 4)
-            AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
+            <if test="query.partnerId != null">
+                AND tas.partner_id = #{query.partnerId}
+            </if>
+            AND tas.site_id IS NULL
+            AND (tas.parent_id IS NULL OR tas.audit_status = 3 OR tas.audit_status = 4)
+            AND tas.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
         </where>
-        ORDER BY create_time DESC
+        ORDER BY tas.create_time DESC
     </select>
 
 
     <select id="pageList1" resultType="com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO">
         SELECT
-        id, site_id, `name`, description, discount,first_user_id,two_user_id,first_remark,two_remark,audit_status,first_audit_time,two_audit_time, create_time, del_flag,user_id,parent_id
-        FROM t_accounting_strategy
+        tas.id, tas.site_id, tas.partner_id as partnerId, tp.name as partnerName, tas.`name`, tas.description, tas.discount,tas.first_user_id,tas.two_user_id,tas.first_remark,tas.two_remark,tas.audit_status,tas.first_audit_time,tas.two_audit_time, tas.create_time, tas.del_flag,tas.user_id,tas.parent_id
+        FROM t_accounting_strategy tas
+        LEFT JOIN t_partner tp ON tas.partner_id = tp.id
         <where>
             <if test="query.name != null and query.name != ''">
-                AND `name` LIKE concat('%',#{query.name}, '%')
+                AND tas.`name` LIKE concat('%',#{query.name}, '%')
             </if>
             <if test="query.auditStatus != null">
-                AND audit_status = #{query.auditStatus}
+                AND tas.audit_status = #{query.auditStatus}
             </if>
-            AND site_id IS NULL
+            <if test="query.partnerId != null">
+                AND tas.partner_id = #{query.partnerId}
+            </if>
+            AND tas.site_id IS NULL
         </where>
-        ORDER BY create_time DESC
+        ORDER BY tas.create_time DESC
     </select>
 
     
     
     <select id="getPlatformAccountingStrategy" resultType="com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO">
         SELECT
-            id, site_id, `name`, description, discount,first_user_id,two_user_id,first_remark,two_remark,audit_status,first_audit_time,two_audit_time, create_time, del_flag,parent_id
-        FROM t_accounting_strategy where del_flag = 0 and site_id is not null order by create_time desc
+            tas.id, tas.site_id, tas.partner_id as partnerId, tp.name as partnerName, tas.`name`, tas.description, tas.discount,tas.first_user_id,tas.two_user_id,tas.first_remark,tas.two_remark,tas.audit_status,tas.first_audit_time,tas.two_audit_time, tas.create_time, tas.del_flag,tas.parent_id
+        FROM t_accounting_strategy tas
+        LEFT JOIN t_partner tp ON tas.partner_id = tp.id
+        where tas.del_flag = 0 and tas.site_id is not null order by tas.create_time desc
     </select>
 </mapper>
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml
index 538c633..f8e3e7e 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml
@@ -27,10 +27,14 @@
         select
         a.*,
         b.name as chargingPileName,
+        b.name as deviceName,
+        b.manufacturer as brand,
+        b.code as alarmCode,
         c.name as siteName
         from t_fault_message a
         left join t_charging_pile b on (a.charging_pile_id = b.id)
         left join t_site c on (a.site_id = c.id)
+        left join t_partner d on (c.partner_id = d.id)
         where a.del_flag = 0
         <if test="null != siteIds and siteIds.size() > 0">
             and a.site_id in
@@ -38,6 +42,12 @@
                 #{item}
             </foreach>
         </if>
+        <if test="partnerId != null">
+            and c.partner_id = #{partnerId}
+        </if>
+        <if test="partnerType != null">
+            and d.partner_type = #{partnerType}
+        </if>
         order by a.create_time desc
     </select>
 </mapper>
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingLotMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingLotMapper.xml
index 2d3f922..a03fa8b 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingLotMapper.xml
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingLotMapper.xml
@@ -5,6 +5,8 @@
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.ruoyi.chargingPile.api.model.TParkingLot">
         <id column="id" property="id" />
+        <result column="type" property="type" />
+        <result column="barrier_brand" property="barrierBrand" />
         <result column="`name`" property="name" />
         <result column="code" property="code" />
         <result column="site_id" property="siteId" />
@@ -21,7 +23,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, `name`, code, site_id, charge_free_duration, charge_capping, charge_rate, non_charge_free_duration, non_charge_capping, non_charge_rate, remark, create_time, del_flag
+        id, type, barrier_brand, `name`, code, site_id, charge_free_duration, charge_capping, charge_rate, non_charge_free_duration, non_charge_capping, non_charge_rate, remark, create_time, del_flag
     </sql>
     <select id="pageList" resultType="com.ruoyi.chargingPile.api.vo.TParkingLotVO">
         SELECT
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
index edce79f..fd39ada 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -1,8 +1,11 @@
 package com.ruoyi.order.controller;
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.DecimalFormat;
@@ -49,6 +52,7 @@
 import com.ruoyi.order.dto.MyChargingOrderList;
 import com.ruoyi.order.dto.OrderEvaluateVo;
 import com.ruoyi.order.dto.*;
+import com.ruoyi.order.export.PayOrderExport;
 import com.ruoyi.order.service.*;
 import com.ruoyi.order.util.PreviousSixMonths;
 import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
@@ -72,10 +76,17 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.List;
 import java.util.stream.Collectors;
+
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.WebUtils;
+import org.apache.poi.ss.usermodel.Workbook;
 
 /**
  * <p>
@@ -214,6 +225,82 @@
         return chargingOrderService.payOrderQuery(payOrderQueryDto);
     }
 
+    @RequiresPermissions(value = {"/invoiceManagement/select_order", "/invoiceManagement/export", "/paymentOrder/order"}, logical = Logical.OR)
+    @ResponseBody
+    @PutMapping(value = "/pay/order/export")
+    @ApiOperation(value = "导出查看订单列表", tags = {"管理后台-支付订单-订单信息"})
+    @Log(title = "发票管理查看订单导出", businessType = BusinessType.EXPORT)
+    public void exportPayOrder(@RequestBody PayOrderQueryDto payOrderQueryDto) {
+        payOrderQueryDto.setPageCurr(1);
+        payOrderQueryDto.setPageSize(10000);
+        R<PageInfo<PayOrderDto>> result = chargingOrderService.payOrderQuery(payOrderQueryDto);
+        List<PayOrderDto> records = result.getData() == null || result.getData().getRecords() == null
+                ? Collections.emptyList() : result.getData().getRecords();
+        List<PayOrderExport> exports = records.stream().map(this::buildPayOrderExport).collect(Collectors.toList());
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), PayOrderExport.class, exports);
+        HttpServletResponse response = WebUtils.response();
+        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+        response.setCharacterEncoding("utf-8");
+        response.setHeader("Pragma", "no-cache");
+        response.setHeader("Cache-Control", "no-cache");
+        try {
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("订单列表.xls", "utf-8"));
+            try (ServletOutputStream outputStream = response.getOutputStream()) {
+                workbook.write(outputStream);
+            }
+            workbook.close();
+        } catch (IOException e) {
+            log.error("导出查看订单列表失败", e);
+        }
+    }
+
+    private PayOrderExport buildPayOrderExport(PayOrderDto dto) {
+        PayOrderExport export = new PayOrderExport();
+        export.setCode(dto.getCode());
+        export.setType(formatPayOrderType(dto.getType()));
+        export.setTitle(dto.getTitle());
+        export.setPhone(dto.getPhone());
+        export.setOrderStatus(dto.getPayTime() != null ? "订单支付成功" : "订单完成");
+        export.setStatus(formatPayOrderStatus(dto.getType(), dto.getStatus()));
+        export.setRefundStatus(dto.getRefundStatus() != null && dto.getRefundStatus() == 1 ? "有退款" : "无退款");
+        export.setRechargeAmount(dto.getRechargeAmount());
+        export.setPaymentAmount(dto.getPaymentAmount());
+        export.setFinalAmount(dto.getFinalAmount());
+        export.setCreateTime(dto.getCreateTime() == null ? null : DateUtils.localDateTimeToString(dto.getCreateTime()));
+        export.setEndTime(dto.getEndTime() == null ? null : DateUtils.localDateTimeToString(dto.getEndTime()));
+        export.setPayTime(dto.getPayTime() == null ? null : DateUtils.localDateTimeToString(dto.getPayTime()));
+        return export;
+    }
+
+    private String formatPayOrderType(Integer type) {
+        if (type == null || type < 1 || type > 4) {
+            return "-";
+        }
+        return new String[]{"充电订单", "购物订单", "vip订单", "停车订单"}[type - 1];
+    }
+
+    private String formatPayOrderStatus(Integer type, Integer status) {
+        if (type == null) {
+            return "-";
+        }
+        if (type == 3) {
+            return "支付成功";
+        }
+        if (status == null) {
+            return "-";
+        }
+        if (type == 1 && status >= 0 && status <= 5) {
+            return new String[]{"未知", "等待中", "启动中", "充电中", "停止中", "已结束"}[status];
+        }
+        if (type == 2 && status >= 1 && status <= 4) {
+            return new String[]{"待发货", "待收货", "已完成", "已取消"}[status - 1];
+        }
+        if (type == 4 && status >= 1 && status <= 3) {
+            return new String[]{"已进场", "已出场", "已缴费出场"}[status - 1];
+        }
+        return "-";
+    }
+
 
 
     public static List<PayOrderDto> testing5(long total, long current, long size, List<PayOrderDto> str){
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java
index e74b2db..7765dba 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java
@@ -2,17 +2,14 @@
 
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.account.api.feignClient.AppUserClient;
 import com.ruoyi.account.api.model.TAppUser;
-import com.ruoyi.chargingPile.api.domain.SiteMenu;
 import com.ruoyi.chargingPile.api.dto.GetSiteListDTO;
 import com.ruoyi.chargingPile.api.feignClient.PartnerClient;
 import com.ruoyi.chargingPile.api.feignClient.SiteClient;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.web.domain.AjaxResult;
-import com.ruoyi.common.core.web.domain.BasePojo;
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
@@ -20,21 +17,14 @@
 import com.ruoyi.common.security.annotation.Logical;
 import com.ruoyi.common.security.annotation.RequiresPermissions;
 import com.ruoyi.common.security.service.TokenService;
-import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.order.api.model.*;
 import com.ruoyi.order.api.query.TOrderAppealQuery;
-import com.ruoyi.order.api.vo.ChargingOrderVO;
 import com.ruoyi.order.api.vo.TOrderAppealVO;
 import com.ruoyi.order.dto.ManageFeedbackDto;
 import com.ruoyi.order.dto.ManageOrderAppealQuery;
 import com.ruoyi.order.service.*;
-import com.ruoyi.other.api.feignClient.RoleSiteClient;
-import com.ruoyi.other.api.feignClient.UserSiteClient;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.feignClient.SysUserClient;
-import com.ruoyi.system.api.feignClient.SysUserRoleClient;
-import com.ruoyi.system.api.model.SysUserRoleVo;
-import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -72,17 +62,6 @@
     private SysUserClient sysUserClient;
     
     @Resource
-    private PartnerClient partnerService;
-    
-    @Resource
-    private UserSiteClient userSiteClient;
-    
-    @Resource
-    private RoleSiteClient roleSiteClient;
-    
-    @Resource
-    private SysUserRoleClient sysUserRoleClient;
-    @Resource
     private PartnerClient partnerClient;
 
     @Autowired
@@ -100,6 +79,9 @@
     public R<Page<TOrderAppeal>> managePageList(@RequestBody ManageOrderAppealQuery manageOrderAppealQuery) {
         Integer pageCurr = manageOrderAppealQuery.getPageCurr();
         Integer pageSize = manageOrderAppealQuery.getPageSize();
+        boolean hasSiteFilter = manageOrderAppealQuery.getSiteId() != null
+                || manageOrderAppealQuery.getPartnerId() != null
+                || manageOrderAppealQuery.getSiteType() != null;
         Page<TOrderAppeal> page = orderAppealService.lambdaQuery().eq(manageOrderAppealQuery.getStatus() != null, TOrderAppeal::getStatus, manageOrderAppealQuery.getStatus())
                 .like(manageOrderAppealQuery.getCode() != null, TOrderAppeal::getCode, manageOrderAppealQuery.getCode())
                 .like(manageOrderAppealQuery.getPhone() != null, TOrderAppeal::getPhone, manageOrderAppealQuery.getPhone())
@@ -109,56 +91,39 @@
                 .page(Page.of(1, 99999999));
         SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
         Integer roleType = sysUser.getRoleType();
+        boolean partnerUser = Objects.equals(roleType, 2);
+        Map<Integer, GetSiteListDTO> visibleSiteMap = partnerUser || hasSiteFilter ? getVisibleSiteMap(sysUser) : Collections.emptyMap();
+        Set<Integer> partnerSiteIds = partnerUser ? getManageAppealSiteIds(sysUser, visibleSiteMap.keySet()) : Collections.emptySet();
         List<TOrderAppeal> res = new ArrayList<>();
         for (TOrderAppeal record : page.getRecords()) {
-            record.setUid(record.getId()+"");
-            if (record.getOrderType()!=1){
-                res.add(record);
+            record.setUid(record.getId() + "");
+            if (!Objects.equals(record.getOrderType(), 1)) {
+                if (!partnerUser && !hasSiteFilter) {
+                    res.add(record);
+                }
                 continue;
             }
-            if(roleType!=2){
-                res.add(record);
-                continue;
-            }
-            if (roleType == 2 && record.getOrderType()==1){
-                List<Integer> siteIds = new ArrayList<>();
-                    if (sysUser.getUserId() != null){
-                        List<GetSiteListDTO> data = siteClient.getSiteListByUserId(sysUser.getUserId()).getData();
-                        for (GetSiteListDTO datum : data) {
-                            siteIds.add(datum.getId());
-                        }
-                    }
-                if (siteIds.isEmpty()){
-                    siteIds.add(-1);
-                }else{
-                    List<Integer> integers = new ArrayList<>();
-                    for (Integer siteId : siteIds) {
-                        // 校验有没有这个站点的权限
-                        List<Boolean> t1= partnerClient.managePageListMenu(sysUser.getObjectId(),siteId).getData();
 
-                        Boolean b = t1.get(2);
-                        if (b){
-                            integers.add(siteId);
-                        }
-                    }
-                    siteIds = integers;
-                }
-                if (siteIds.isEmpty()){
-                    siteIds.add(-1);
-                }
-                    TChargingOrder byId = chargingOrderService.getById(record.getOrderId());
-                    if (byId!=null&&siteIds.contains(byId.getSiteId())){
-                        res.add(record);
-                        // 校验有没有这个站点的权限
-                        List<Boolean> data = partnerClient.managePageListMenu(sysUser.getObjectId(), byId.getSiteId()).getData();
-                        record.setAuthInfo(data.get(0));
-                        record.setAuthHandle(data.get(1));
-                    }
-                    if (byId==null){
-                        record.setAuthInfo(false);
-                        record.setAuthHandle(false);
-                    }
+            TChargingOrder chargingOrder = chargingOrderService.getById(record.getOrderId());
+            if (chargingOrder == null) {
+                record.setAuthInfo(false);
+                record.setAuthHandle(false);
+                continue;
             }
+
+            Integer siteId = chargingOrder.getSiteId();
+            if (partnerUser && !partnerSiteIds.contains(siteId)) {
+                continue;
+            }
+            if (hasSiteFilter && !matchSiteFilter(siteId, visibleSiteMap, manageOrderAppealQuery)) {
+                continue;
+            }
+            if (partnerUser) {
+                List<Boolean> data = partnerClient.managePageListMenu(sysUser.getObjectId(), siteId).getData();
+                record.setAuthInfo(getMenuFlag(data, 0));
+                record.setAuthHandle(getMenuFlag(data, 1));
+            }
+            res.add(record);
         }
         List<TOrderAppeal> res1 = testing4(res.size(), pageCurr, pageSize, res);
         page.setCurrent(pageCurr);
@@ -167,6 +132,51 @@
         page.setRecords(res1);
         return R.ok(page);
     }
+
+    private Map<Integer, GetSiteListDTO> getVisibleSiteMap(SysUser sysUser) {
+        if (sysUser == null || sysUser.getUserId() == null) {
+            return Collections.emptyMap();
+        }
+        List<GetSiteListDTO> data = siteClient.getSiteListByUserId(sysUser.getUserId()).getData();
+        Map<Integer, GetSiteListDTO> siteMap = new HashMap<>();
+        if (data != null) {
+            for (GetSiteListDTO datum : data) {
+                if (datum.getId() != null) {
+                    siteMap.put(datum.getId(), datum);
+                }
+            }
+        }
+        return siteMap;
+    }
+
+    private Set<Integer> getManageAppealSiteIds(SysUser sysUser, Set<Integer> visibleSiteIds) {
+        Set<Integer> siteIds = new HashSet<>();
+        if (sysUser == null || sysUser.getObjectId() == null || visibleSiteIds == null) {
+            return siteIds;
+        }
+        for (Integer siteId : visibleSiteIds) {
+            List<Boolean> menuFlags = partnerClient.managePageListMenu(sysUser.getObjectId(), siteId).getData();
+            if (getMenuFlag(menuFlags, 2)) {
+                siteIds.add(siteId);
+            }
+        }
+        return siteIds;
+    }
+
+    private boolean matchSiteFilter(Integer siteId, Map<Integer, GetSiteListDTO> siteMap, ManageOrderAppealQuery query) {
+        if (query.getSiteId() != null && !query.getSiteId().equals(siteId)) {
+            return false;
+        }
+        GetSiteListDTO site = siteMap.get(siteId);
+        if (query.getPartnerId() != null && (site == null || !query.getPartnerId().equals(site.getPartnerId()))) {
+            return false;
+        }
+        return query.getSiteType() == null || (site != null && query.getSiteType().equals(site.getSiteType()));
+    }
+
+    private boolean getMenuFlag(List<Boolean> menuFlags, int index) {
+        return menuFlags != null && menuFlags.size() > index && Boolean.TRUE.equals(menuFlags.get(index));
+    }
     public static List<TOrderAppeal> testing4(long total, long current, long size, List<TOrderAppeal> str){
         List<TOrderAppeal> result = new ArrayList<>();
         //获取初始化分页结构
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
index cfb6986..d43bb3b 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
@@ -14,6 +14,7 @@
 import com.ruoyi.common.security.annotation.Logical;
 import com.ruoyi.common.security.annotation.RequiresPermissions;
 import com.ruoyi.common.security.service.TokenService;
+import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.order.api.model.TOrderInvoice;
 import com.ruoyi.order.api.query.TOrderInvoiceQuery;
 import com.ruoyi.order.api.vo.TOrderInvoiceVO;
@@ -37,7 +38,10 @@
 import java.io.*;
 import java.net.URL;
 import java.net.URLEncoder;
+import java.time.LocalDateTime;
 import java.util.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 /**
  * <p>
@@ -86,9 +90,29 @@
 		TOrderInvoice orderInvoice = orderInvoiceService.getById(dto.getId());
 		orderInvoice.setInvoiceUrl(dto.getInvoiceUrl());
 		orderInvoice.setStatus(3);
+		orderInvoice.setBillingTime(LocalDateTime.now());
+		Long userId = SecurityUtils.getUserId();
+		orderInvoice.setBillingUserId(userId == null ? null : userId.intValue());
 		orderInvoiceService.updateById(orderInvoice);
 		dto.setMailBox(orderInvoice.getMailbox());
 		appUserClient.uploadPdf(dto);
+		return AjaxResult.success();
+	}
+
+	@RequiresPermissions(value = {"/invoiceManagement/accept_hear_case"}, logical = Logical.OR)
+	@PostMapping("/cancel")
+	@ApiOperation(value = "取消开票申请", tags = {"管理后台-发票管理"})
+	public AjaxResult<String> cancel(@RequestBody TOrderInvoice dto){
+		TOrderInvoice orderInvoice = orderInvoiceService.getById(dto.getId());
+		if (orderInvoice == null) {
+			return AjaxResult.error("开票申请不存在");
+		}
+		if (Integer.valueOf(3).equals(orderInvoice.getStatus())) {
+			return AjaxResult.error("已完成开票不能取消");
+		}
+		orderInvoice.setStatus(4);
+		orderInvoice.setCancelTime(LocalDateTime.now());
+		orderInvoiceService.updateById(orderInvoice);
 		return AjaxResult.success();
 	}
 	
@@ -114,6 +138,9 @@
 		for (TOrderInvoiceVO orderInvoiceVO : list) {
 			OrderInvoiceExport orderInvoiceExport = new OrderInvoiceExport();
 			BeanUtils.copyProperties(orderInvoiceVO,orderInvoiceExport);
+			if (orderInvoiceVO.getCreateTime()!=null){
+				orderInvoiceExport.setApplyTime(DateUtils.localDateTimeToString(orderInvoiceVO.getCreateTime()));
+			}
 			if (orderInvoiceVO.getBillingTime()!=null){
 				orderInvoiceExport.setBillingTime(DateUtils.localDateTimeToString(orderInvoiceVO.getBillingTime()));
 			}
@@ -142,6 +169,71 @@
 			}
 		}
 	}
+
+	/**
+	 * 下载开票申请,单个返回 Excel,多个返回 zip。
+	 */
+	@RequiresPermissions(value = {"/invoiceManagement/export"}, logical = Logical.OR)
+	@ApiOperation(value = "下载开票申请", tags = {"管理后台-发票管理"})
+	@Log(title = "下载开票申请", businessType = BusinessType.EXPORT)
+	@PutMapping("/downloadApplication")
+	public void downloadApplication(@RequestBody TOrderInvoiceQuery query) {
+		List<TOrderInvoiceVO> list = orderInvoiceService.export(query);
+		HttpServletResponse response = WebUtils.response();
+		try {
+			if (list.size() == 1) {
+				writeInvoiceWorkbook(response, list.get(0), buildInvoiceFileName(list.get(0)));
+				return;
+			}
+			response.setCharacterEncoding("utf-8");
+			response.setContentType("application/zip");
+			response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("开票申请.zip", "utf-8"));
+			try (ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream())) {
+				for (TOrderInvoiceVO invoice : list) {
+					Workbook workbook = buildInvoiceWorkbook(invoice);
+					ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+					workbook.write(outputStream);
+					workbook.close();
+					zipOutputStream.putNextEntry(new ZipEntry(buildInvoiceFileName(invoice)));
+					zipOutputStream.write(outputStream.toByteArray());
+					zipOutputStream.closeEntry();
+				}
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private void writeInvoiceWorkbook(HttpServletResponse response, TOrderInvoiceVO invoice, String fileName) throws IOException {
+		response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+		response.setCharacterEncoding("utf-8");
+		response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
+		response.setHeader("Pragma", "no-cache");
+		response.setHeader("Cache-Control", "no-cache");
+		Workbook workbook = buildInvoiceWorkbook(invoice);
+		try (ServletOutputStream outputStream = response.getOutputStream()) {
+			workbook.write(outputStream);
+		}
+		workbook.close();
+	}
+
+	private Workbook buildInvoiceWorkbook(TOrderInvoiceVO invoice) {
+		OrderInvoiceExport export = new OrderInvoiceExport();
+		BeanUtils.copyProperties(invoice, export);
+		if (invoice.getCreateTime() != null) {
+			export.setApplyTime(DateUtils.localDateTimeToString(invoice.getCreateTime()));
+		}
+		if (invoice.getBillingTime() != null) {
+			export.setBillingTime(DateUtils.localDateTimeToString(invoice.getBillingTime()));
+		}
+		return ExcelExportUtil.exportExcel(new ExportParams(), OrderInvoiceExport.class, Collections.singletonList(export));
+	}
+
+	private String buildInvoiceFileName(TOrderInvoiceVO invoice) {
+		String title = invoice.getName() == null ? "开票申请" : invoice.getName();
+		String phone = invoice.getUserPhone() == null ? "" : invoice.getUserPhone();
+		return title + phone + ".xls";
+	}
 	
 	@ResponseBody
 	@GetMapping("/getMyOrderInvoiceList")
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java
index 5b5e7a3..82c5395 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.ruoyi.account.api.dto.GiveVipDto;
+import com.ruoyi.account.api.dto.UserListQueryDto;
 import com.ruoyi.account.api.feignClient.AppUserClient;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.DateUtils;
@@ -23,6 +24,7 @@
 import com.ruoyi.order.api.query.ShoppingOrderQuery;
 import com.ruoyi.order.api.query.VipShoppingOrderQuery;
 import com.ruoyi.order.dto.TEnterpriseExport;
+import com.ruoyi.order.export.TVipOrderExport;
 import com.ruoyi.order.service.TVipOrderRefundService;
 import com.ruoyi.order.service.TVipOrderService;
 import com.ruoyi.other.api.domain.TEnterpriseUserApplication;
@@ -79,6 +81,7 @@
             if (data.isEmpty()){
                 return AjaxResult.success(new PageInfo<TVipOrder>());
             }
+            query.setUserIds(data);
         }
         PageInfo<TVipOrder> res = vipOrderService.pageList(query);
         return AjaxResult.success(res);
@@ -206,6 +209,86 @@
     }
 
 
+    @RequiresPermissions(value = {"/vipOrder", "/vipOrder/export"}, logical = Logical.OR)
+    @ApiOperation(tags = {"管理后台-会员订单"}, value = "导出")
+    @PutMapping(value = "/exportVipOrder")
+    @Log(title = "会员订单导出", businessType = BusinessType.EXPORT)
+    public void exportVipOrder(@RequestBody VipShoppingOrderQuery query) {
+        if (StringUtils.hasLength(query.getPhone())) {
+            List<Long> data = appUserClient.getUserIdsByPhone(query.getPhone()).getData();
+            if (data.isEmpty()) {
+                writeVipOrderWorkbook(new ArrayList<>());
+                return;
+            }
+            query.setUserIds(data);
+        }
+        query.setPageCurr(1);
+        query.setPageSize(100000);
+        List<TVipOrder> list = vipOrderService.pageList(query).getRecords();
+        List<TVipOrderExport> exports = new ArrayList<>();
+        for (TVipOrder vipOrder : list) {
+            TVipOrderExport export = new TVipOrderExport();
+            BeanUtils.copyProperties(vipOrder, export);
+            export.setCreateTime(DateUtils.localDateTimeToString(vipOrder.getCreateTime()));
+            exports.add(export);
+        }
+        writeVipOrderWorkbook(exports);
+    }
+
+    @RequiresPermissions(value = {"/vipList", "/vipList/export"}, logical = Logical.OR)
+    @ApiOperation(tags = {"管理后台-会员列表"}, value = "导出会员充值订单")
+    @PutMapping(value = "/exportVipOrderByVipUser")
+    @Log(title = "会员列表导出会员充值订单", businessType = BusinessType.EXPORT)
+    public void exportVipOrderByVipUser(@RequestBody UserListQueryDto query) {
+        List<Long> userIds = appUserClient.getVipUserIds(query).getData();
+        if (userIds == null || userIds.isEmpty()) {
+            writeVipOrderWorkbook(new ArrayList<>());
+            return;
+        }
+        VipShoppingOrderQuery orderQuery = new VipShoppingOrderQuery();
+        orderQuery.setUserIds(userIds);
+        if (query != null) {
+            orderQuery.setVipId(query.getVipTypeId());
+        }
+        orderQuery.setPageCurr(1);
+        orderQuery.setPageSize(100000);
+        List<TVipOrder> list = vipOrderService.pageList(orderQuery).getRecords();
+        List<TVipOrderExport> exports = new ArrayList<>();
+        for (TVipOrder vipOrder : list) {
+            TVipOrderExport export = new TVipOrderExport();
+            BeanUtils.copyProperties(vipOrder, export);
+            export.setCreateTime(DateUtils.localDateTimeToString(vipOrder.getCreateTime()));
+            exports.add(export);
+        }
+        writeVipOrderWorkbook(exports);
+    }
+
+    private void writeVipOrderWorkbook(List<TVipOrderExport> exports) {
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TVipOrderExport.class, exports);
+        HttpServletResponse response = WebUtils.response();
+        response.setCharacterEncoding("utf-8");
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("会员订单导出.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                workbook.close();
+                if (outputStream != null) {
+                    outputStream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 
 
     }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ManageOrderAppealQuery.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ManageOrderAppealQuery.java
index a20b5f9..3fbc15a 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ManageOrderAppealQuery.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ManageOrderAppealQuery.java
@@ -6,10 +6,11 @@
 import lombok.Data;
 
 @Data
-public class ManageOrderAppealQuery  extends BasePage {
-    @ApiModelProperty(value = "申诉状态 (1=待处理,2=已处理)")
+public class ManageOrderAppealQuery extends BasePage {
+    @ApiModelProperty(value = "申诉状态(1=待处理,2=已处理)")
     @TableField("status")
     private Integer status;
+
     @ApiModelProperty(value = "订单编号")
     @TableField("code")
     private String code;
@@ -17,6 +18,15 @@
     @ApiModelProperty(value = "手机号")
     private String phone;
 
-    @ApiModelProperty(value = "订单类型(1=充电订单,2=购物订单")
+    @ApiModelProperty(value = "订单类型(1=充电订单,2=购物订单)")
     private Integer orderType;
+
+    @ApiModelProperty(value = "站点类型")
+    private Integer siteType;
+
+    @ApiModelProperty(value = "合作商id")
+    private Integer partnerId;
+
+    @ApiModelProperty(value = "站点id")
+    private Integer siteId;
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java
index 9434e69..ff8bbfd 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java
@@ -11,69 +11,78 @@
 @ApiModel(value = "导出发票")
 public class OrderInvoiceExport implements Serializable {
 
-    @Excel(name = "申请单编号",width = 30)
+    @Excel(name = "申请单编号", width = 30)
     private String code;
 
-    @Excel(name  = "申请日期",width = 30)
+    @Excel(name = "申请日期", width = 30)
+    private String applyTime;
+
+    @Excel(name = "开票日期", width = 30)
     private String billingTime;
 
-    @Excel(name  = "开票公司",width = 30)
+    @Excel(name = "归属电站", width = 30)
+    private String siteName;
+
+    @Excel(name = "归属合作商", width = 30)
+    private String partnerName;
+
+    @Excel(name = "开票公司", width = 30)
     private String invoicingCompany;
 
-    @Excel(name  = "发票类型",width = 30)
+    @Excel(name = "发票类型", width = 30)
     private String invoiceType;
 
-    @Excel(name  = "发票种类",replace = {"纸质发票_1","电子发票_2"},width = 30)
+    @Excel(name = "发票种类", replace = {"纸质发票_1", "电子发票_2"}, width = 30)
     private Integer invoiceMaterial;
 
-    @Excel(name  = "开票方式",replace = {"人工_1","自动_2"},width = 30)
+    @Excel(name = "开票方式", replace = {"人工_1", "自动_2"}, width = 30)
     private Integer invoicingMethod;
 
-    @Excel(name  = "开票总金额",width = 30)
+    @Excel(name = "开票总金额", width = 30)
     private BigDecimal totalAmount;
 
-    @Excel(name  = "服务费",width = 30)
+    @Excel(name = "服务费", width = 30)
     private BigDecimal serviceCharge;
 
-    @Excel(name  = "服务费税率",width = 30)
+    @Excel(name = "服务费税率", width = 30)
     private BigDecimal serviceTariff;
 
-    @Excel(name  = "增值服务费",width = 30)
+    @Excel(name = "增值服务费", width = 30)
     private BigDecimal addedService;
 
-    @Excel(name  = "增值服务费税率",width = 30)
+    @Excel(name = "增值服务费税率", width = 30)
     private BigDecimal addedServiceTariff;
 
-//    @Excel(name  = "开票订单类型",replace = {"充电订单_1","购物订单_2","兑换订单_3","会员订单_4"},width = 30)
-//    private Integer orderType;
-
-    @Excel(name  = "抬头类型",replace = {"个人_1","企业_2"},width = 30)
+    @Excel(name = "抬头类型", replace = {"个人_1", "企业_2"}, width = 30)
     private Integer invoicingObjectType;
 
-    @Excel(name  = "发票抬头",width = 30)
+    @Excel(name = "发票抬头", width = 30)
     private String name;
 
-    @Excel(name  = "开户银行",width = 30)
+    @Excel(name = "开户银行", width = 30)
     private String depositBank;
 
-    @Excel(name  = "银行账户",width = 30)
+    @Excel(name = "银行账号", width = 30)
     private String bankAccount;
 
-    @Excel(name  = "公司电话",width = 30)
+    @Excel(name = "公司电话", width = 30)
     private String companyPhone;
 
-    @Excel(name  = "纳税识别号",width = 30)
+    @Excel(name = "纳税识别号", width = 30)
     private String taxIdentificationNumber;
 
-    @Excel(name  = "公司地址",width = 30)
+    @Excel(name = "公司地址", width = 30)
     private String companyAddress;
 
-    @Excel(name  = "邮箱",width = 30)
+    @Excel(name = "邮箱", width = 30)
     private String mailbox;
 
-    @Excel(name  = "状态",replace = {"待开票_1","开票中_2","已开票_3"},width = 30)
+    @Excel(name = "备注", width = 30)
+    private String remark;
+
+    @Excel(name = "状态", replace = {"待开票_1", "开票中_2", "已开票_3", "已取消_4"}, width = 30)
     private Integer status;
 
-    @Excel(name  = "用户电话",width = 30)
+    @Excel(name = "用户电话", width = 30)
     private String userPhone;
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/PayOrderExport.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/PayOrderExport.java
new file mode 100644
index 0000000..a4e55dc
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/PayOrderExport.java
@@ -0,0 +1,49 @@
+package com.ruoyi.order.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class PayOrderExport implements Serializable {
+
+    @Excel(name = "订单编号", width = 30)
+    private String code;
+
+    @Excel(name = "订单类型", width = 20)
+    private String type;
+
+    @Excel(name = "订单标题", width = 30)
+    private String title;
+
+    @Excel(name = "手机号", width = 20)
+    private String phone;
+
+    @Excel(name = "订单状态", width = 20)
+    private String orderStatus;
+
+    @Excel(name = "订单子状态", width = 20)
+    private String status;
+
+    @Excel(name = "有无退款", width = 20)
+    private String refundStatus;
+
+    @Excel(name = "应付金额", width = 20)
+    private Double rechargeAmount;
+
+    @Excel(name = "实付金额", width = 20)
+    private Double paymentAmount;
+
+    @Excel(name = "最终金额", width = 20)
+    private Double finalAmount;
+
+    @Excel(name = "下单时间", width = 30)
+    private String createTime;
+
+    @Excel(name = "订单完成时间", width = 30)
+    private String endTime;
+
+    @Excel(name = "最后支付时间", width = 30)
+    private String payTime;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TVipOrderExport.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TVipOrderExport.java
new file mode 100644
index 0000000..0087e9d
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TVipOrderExport.java
@@ -0,0 +1,34 @@
+package com.ruoyi.order.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "会员订单导出")
+public class TVipOrderExport implements Serializable {
+
+    @Excel(name = "订单号", width = 30)
+    private String code;
+
+    @Excel(name = "购买用户", width = 30)
+    private String userPhone;
+
+    @Excel(name = "会员类型", width = 30)
+    private String name;
+
+    @Excel(name = "会员时长", replace = {"月卡_1", "季卡_2", "年卡_3"}, width = 30)
+    private Integer vipType;
+
+    @Excel(name = "订单金额", width = 30)
+    private BigDecimal orderAmount;
+
+    @Excel(name = "实付", width = 30)
+    private BigDecimal paymentAmount;
+
+    @Excel(name = "购买时间", width = 30)
+    private String createTime;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
index 6756bd9..dfd718e 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -776,25 +776,29 @@
 		}
 		TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData();
 		
-		//直营站点才可以享受会员折扣
-		if (!whitelistMatched && !isBalancePayMode(payMethod) && null != appUser.getVipId() && 1 == site.getBusinessCategory()) {
+		//会员折扣支持直营网点和加盟商站点
+		if (!whitelistMatched && !isBalancePayMode(payMethod) && null != appUser.getVipId()) {
 			TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
-			BigDecimal discount = null;
-			if (1 == vip.getType()) {
-				//普通会员折扣使用积分策略上的折扣,且有最高优惠金额
-				discount = accountingStrategy.getDiscount();
-			} else {
-				//内部会员使用会员信息设置的折扣,没有最高优惠金额
-				discount = vip.getDiscount();
-			}
-			GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
-			getAppUserVipDetail.setAppUserId(appUser.getId());
-			getAppUserVipDetail.setVipId(appUser.getVipId());
-			TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
-			if (null != vipDetail) {
-				Integer chargeNum = vipDetail.getChargeNum();
-				if (0 < chargeNum) {
-					chargingOrder.setVipDiscount(discount);
+			if (null != vip) {
+				BigDecimal discount = null;
+				if (Integer.valueOf(1).equals(vip.getType())) {
+					//普通会员折扣使用积分策略上的折扣,且有最高优惠金额
+					discount = accountingStrategy.getDiscount();
+				} else {
+					//内部会员使用会员信息设置的折扣,没有最高优惠金额
+					discount = vip.getDiscount();
+				}
+				if (null != discount) {
+					GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
+					getAppUserVipDetail.setAppUserId(appUser.getId());
+					getAppUserVipDetail.setVipId(appUser.getVipId());
+					TAppUserVipDetail vipDetail = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
+					if (null != vipDetail) {
+						Integer chargeNum = vipDetail.getChargeNum();
+						if (null != chargeNum && 0 < chargeNum) {
+							chargingOrder.setVipDiscount(discount);
+						}
+					}
 				}
 			}
 		}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
index 36779b8..f4f4c98 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -11,6 +11,7 @@
 import com.ruoyi.account.api.model.TAppUserCar;
 import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
 import com.ruoyi.chargingPile.api.feignClient.SiteClient;
+import com.ruoyi.chargingPile.api.model.Partner;
 import com.ruoyi.chargingPile.api.model.Site;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -138,6 +139,11 @@
 				addOrderInvoice.setCode(code);
 				addOrderInvoice.setStatus(1);
 				addOrderInvoice.setCreateTime(LocalDateTime.now());
+				fillInvoiceSite(addOrderInvoice, orderIds);
+				if (Integer.valueOf(2).equals(addOrderInvoice.getInvoicingMethod())) {
+					addOrderInvoice.setStatus(3);
+					addOrderInvoice.setBillingTime(LocalDateTime.now());
+				}
 				this.save(addOrderInvoice);
 				for (Long orderId : orderIds) {
 					List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
@@ -166,6 +172,29 @@
 			lock.unlock();
 		}
 		return AjaxResult.success();
+	}
+
+	private void fillInvoiceSite(TOrderInvoice invoice, List<Long> orderIds) {
+		if (!Integer.valueOf(1).equals(invoice.getOrderType()) || CollectionUtils.isEmpty(orderIds)) {
+			return;
+		}
+		List<TChargingOrder> chargingOrders = chargingOrderService.listByIds(orderIds);
+		if (CollectionUtils.isEmpty(chargingOrders)) {
+			return;
+		}
+		Integer siteId = chargingOrders.get(0).getSiteId();
+		invoice.setSiteId(siteId);
+		List<Site> sites = siteClient.getSiteByIds(Collections.singletonList(siteId)).getData();
+		if (!CollectionUtils.isEmpty(sites)) {
+			Site site = sites.get(0);
+			invoice.setPartnerId(site.getPartnerId());
+			if (!Integer.valueOf(1).equals(site.getBusinessCategory()) && site.getPartnerId() != null) {
+				Partner partner = siteClient.getPartnerR(site.getPartnerId()).getData();
+				if (partner != null && org.springframework.util.StringUtils.hasLength(partner.getName())) {
+					invoice.setInvoicingCompany(partner.getName());
+				}
+			}
+		}
 	}
 	
 	
@@ -291,10 +320,33 @@
 			tOrderInvoiceVO.setUid(tOrderInvoiceVO.getId().toString());
 			List<Long> collect = orderInvoiceDetailService.lambdaQuery().eq(TOrderInvoiceDetail::getOrderInvoiceId, tOrderInvoiceVO.getId()).list().stream()
 					.map(TOrderInvoiceDetail::getOrderId).collect(Collectors.toList());
-            Integer siteId = chargingOrderService.listByIds(collect).get(0).getSiteId();
-            Site site = siteList.stream().filter(o -> o.getId().equals(siteId)).findFirst().orElse(null);
+			Integer siteId = tOrderInvoiceVO.getSiteId();
+			if (siteId == null && !CollectionUtils.isEmpty(collect) && Integer.valueOf(1).equals(tOrderInvoiceVO.getOrderType())) {
+				List<TChargingOrder> chargingOrders = chargingOrderService.listByIds(collect);
+				if (!CollectionUtils.isEmpty(chargingOrders)) {
+					siteId = chargingOrders.get(0).getSiteId();
+					tOrderInvoiceVO.setSiteId(siteId);
+				}
+			}
+            Site site = null;
+            if (!CollectionUtils.isEmpty(siteList) && siteId != null) {
+                for (Site item : siteList) {
+                    if (siteId.equals(item.getId())) {
+                        site = item;
+                        break;
+                    }
+                }
+            }
             if(null != site){
                 tOrderInvoiceVO.setSiteName(site.getName());
+				tOrderInvoiceVO.setPartnerId(site.getPartnerId());
+				tOrderInvoiceVO.setBusinessCategory(site.getBusinessCategory());
+				if (site.getPartnerId() != null) {
+					try {
+						tOrderInvoiceVO.setPartnerName(siteClient.getPartnerR(site.getPartnerId()).getData().getName());
+					} catch (Exception ignored) {
+					}
+				}
             }
             // 将其全部转化为String
 			tOrderInvoiceVO.setIds(collect.stream().map(String::valueOf).collect(Collectors.toList()));
@@ -313,18 +365,7 @@
 					.in(TOrderInvoiceDetail::getOrderInvoiceId, ids));
 
 			List<TAppUser> finalTAppUsers = tAppUsers;
-			list.forEach(e->{
-				if (e.getOrderType()!=null&&e.getOrderType()==1){
-					e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff());
-				}else{
-					e.setServiceTariff(new BigDecimal("0"));
-				}
-				e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff());
-				e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff());
-				e.setAddedService(orderInvoiceDetailList.stream().filter(t->t.getOrderInvoiceId().equals(e.getId()) &&t.getAddedService()!=null).map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get());
-				e.setElectrovalence(orderInvoiceDetailList.stream().filter(t->t.getOrderInvoiceId().equals(e.getId()) &&t.getElectrovalence()!=null).map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get());
-				e.setServiceCharge(orderInvoiceDetailList.stream().filter(t->t.getOrderInvoiceId().equals(e.getId()) && t.getServiceCharge()!=null).map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get());
-			});
+			list.forEach(e -> fillInvoiceDetailAmount(e, orderInvoiceDetailList));
 		}
 
 
@@ -365,21 +406,63 @@
 		query.setUserIds(tAppUsers.stream().map(TAppUser::getId).collect(Collectors.toList()));
 		PageInfo<TOrderInvoiceVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
 		List<TOrderInvoiceVO> list = this.baseMapper.export(query);
+		if (CollectionUtils.isEmpty(list)) {
+			return list;
+		}
 		List<Long> ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList());
 		List<TOrderInvoiceDetail> orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper<TOrderInvoiceDetail>()
 				.in(TOrderInvoiceDetail::getOrderInvoiceId, ids));
 		List<TAppUser> finalTAppUsers = tAppUsers;
 		list.forEach(e->{
-			e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff());
-			e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff());
-			e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff());
-			e.setAddedService(orderInvoiceDetailList.stream().filter(t->t.getAddedService()!=null).map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get());
-			e.setElectrovalence(orderInvoiceDetailList.stream().filter(t->t.getElectrovalence()!=null).map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get());
-			e.setServiceCharge(orderInvoiceDetailList.stream().filter(t->t.getServiceCharge()!=null).map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get());
-			if (e.getBillingUserId()!=null){
-				e.setUserPhone(finalTAppUsers.stream().filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone());
+			fillInvoiceDetailAmount(e, orderInvoiceDetailList);
+			TAppUser appUser = appUserClient.getUserById(e.getAppUserId()).getData();
+			if (appUser != null) {
+				e.setUserPhone(appUser.getPhone());
 			}
+			fillInvoiceSiteName(e);
 		});
 		return list;
 	}
+
+	private void fillInvoiceDetailAmount(TOrderInvoiceVO invoice, List<TOrderInvoiceDetail> details) {
+		List<TOrderInvoiceDetail> currentDetails = details.stream()
+				.filter(t -> t.getOrderInvoiceId().equals(invoice.getId()))
+				.collect(Collectors.toList());
+		if (CollectionUtils.isEmpty(currentDetails)) {
+			invoice.setServiceTariff(BigDecimal.ZERO);
+			invoice.setElectricityTariff(BigDecimal.ZERO);
+			invoice.setAddedServiceTariff(BigDecimal.ZERO);
+			invoice.setAddedService(BigDecimal.ZERO);
+			invoice.setElectrovalence(BigDecimal.ZERO);
+			invoice.setServiceCharge(BigDecimal.ZERO);
+			return;
+		}
+		TOrderInvoiceDetail first = currentDetails.get(0);
+		invoice.setServiceTariff(Integer.valueOf(1).equals(invoice.getOrderType()) ? first.getServiceTariff() : BigDecimal.ZERO);
+		invoice.setElectricityTariff(first.getElectricityTariff());
+		invoice.setAddedServiceTariff(first.getAddedServiceTariff());
+		invoice.setAddedService(currentDetails.stream().filter(t -> t.getAddedService() != null).map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal.ZERO, BigDecimal::add));
+		invoice.setElectrovalence(currentDetails.stream().filter(t -> t.getElectrovalence() != null).map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal.ZERO, BigDecimal::add));
+		invoice.setServiceCharge(currentDetails.stream().filter(t -> t.getServiceCharge() != null).map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal.ZERO, BigDecimal::add));
+	}
+
+	private void fillInvoiceSiteName(TOrderInvoiceVO invoice) {
+		if (invoice.getSiteId() == null) {
+			return;
+		}
+		List<Site> sites = siteClient.getSiteByIds(Collections.singletonList(invoice.getSiteId())).getData();
+		if (CollectionUtils.isEmpty(sites)) {
+			return;
+		}
+		Site site = sites.get(0);
+		invoice.setSiteName(site.getName());
+		invoice.setPartnerId(site.getPartnerId());
+		invoice.setBusinessCategory(site.getBusinessCategory());
+		if (site.getPartnerId() != null) {
+			try {
+				invoice.setPartnerName(siteClient.getPartnerR(site.getPartnerId()).getData().getName());
+			} catch (Exception ignored) {
+			}
+		}
+	}
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
index 88cea85..e8eec4c 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
@@ -7,6 +7,8 @@
         <id column="id" property="id" />
         <result column="code" property="code" />
         <result column="app_user_id" property="appUserId" />
+        <result column="site_id" property="siteId" />
+        <result column="partner_id" property="partnerId" />
         <result column="order_type" property="orderType" />
         <result column="invoicing_company" property="invoicingCompany" />
         <result column="invoice_type_id" property="invoiceTypeId"/>
@@ -23,23 +25,28 @@
         <result column="total_amount" property="totalAmount" />
         <result column="invoice_url" property="invoiceUrl" />
         <result column="mailbox" property="mailbox" />
+        <result column="remark" property="remark" />
         <result column="status" property="status" />
         <result column="create_time" property="createTime" />
         <result column="billing_time" property="billingTime" />
         <result column="billing_user_id" property="billingUserId" />
+        <result column="cancel_time" property="cancelTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, code, app_user_id, order_type, invoicing_company, invoice_type_id, invoice_type, invoice_material, invoicing_method, invoicing_object_type, name, tax_identification_number, company_address, company_phone, deposit_bank, bank_account, total_amount, invoice_url, mailbox, status, create_time, billing_time, billing_user_id
+        id, code, app_user_id, site_id, partner_id, order_type, invoicing_company, invoice_type_id, invoice_type, invoice_material, invoicing_method, invoicing_object_type, name, tax_identification_number, company_address, company_phone, deposit_bank, bank_account, total_amount, invoice_url, mailbox, remark, status, create_time, billing_time, billing_user_id, cancel_time
     </sql>
     <select id="pageList" resultType="com.ruoyi.order.api.vo.TOrderInvoiceVO">
-        select toi.id, toi.code, toi.app_user_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material,
+        select toi.id, toi.code, toi.app_user_id, toi.site_id, toi.partner_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material,
                toi.invoicing_method, toi.invoicing_object_type, toi.name, toi.tax_identification_number, toi.company_address, toi.company_phone,
-               toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.status, toi.create_time, toi.billing_time,
-               toi.billing_user_id
+               toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.remark, toi.status, toi.create_time, toi.billing_time,
+               toi.billing_user_id, toi.cancel_time
         from t_order_invoice toi
         <where>
+            <if test="query.id != null">
+                AND toi.id = #{query.id}
+            </if>
             <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
                 AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
             </if>
@@ -70,6 +77,17 @@
                     #{userId}
                 </foreach>
             </if>
+            <if test="query.siteId != null">
+                AND toi.site_id = #{query.siteId}
+            </if>
+            <if test="query.partnerId != null">
+                AND toi.partner_id = #{query.partnerId}
+            </if>
+            <if test="query.directOnly != null and query.directOnly == 1">
+                AND toi.site_id IN (
+                    SELECT id FROM charging_pile_service.t_site WHERE business_category = 1
+                )
+            </if>
         </where>
         ORDER BY toi.create_time DESC
     </select>
@@ -77,9 +95,13 @@
         select
             COUNT(CASE WHEN status = 1 THEN 1 END) AS `notAccepted`,
             COUNT(CASE WHEN status = 2 THEN 1 END) AS `processing`,
-            COUNT(CASE WHEN status = 3 THEN 1 END) AS `finished`
+            COUNT(CASE WHEN status = 3 THEN 1 END) AS `finished`,
+            COUNT(CASE WHEN status = 4 THEN 1 END) AS `cancelled`
         from t_order_invoice toi
         <where>
+            <if test="query.id != null">
+                AND toi.id = #{query.id}
+            </if>
             <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
                 AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
             </if>
@@ -99,23 +121,37 @@
                 AND toi.name LIKE concat('%',#{query.name},'%')
             </if>
             <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
-                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
+                AND toi.create_time BETWEEN #{query.startTime} AND #{query.endTime}
             </if>
             <if test="query.userIds != null and query.userIds.size()>0">
                 AND toi.app_user_id IN
                 <foreach collection="query.userIds" close=")" open="(" item="userId" separator=",">
                     #{userId}
                 </foreach>
+            </if>
+            <if test="query.siteId != null">
+                AND toi.site_id = #{query.siteId}
+            </if>
+            <if test="query.partnerId != null">
+                AND toi.partner_id = #{query.partnerId}
+            </if>
+            <if test="query.directOnly != null and query.directOnly == 1">
+                AND toi.site_id IN (
+                    SELECT id FROM charging_pile_service.t_site WHERE business_category = 1
+                )
             </if>
         </where>
     </select>
     <select id="export" resultType="com.ruoyi.order.api.vo.TOrderInvoiceVO">
-        select toi.id, toi.code, toi.app_user_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material,
+        select toi.id, toi.code, toi.app_user_id, toi.site_id, toi.partner_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material,
         toi.invoicing_method, toi.invoicing_object_type, toi.name, toi.tax_identification_number, toi.company_address, toi.company_phone,
-        toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.status, toi.create_time, toi.billing_time,
-        toi.billing_user_id
+        toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.remark, toi.status, toi.create_time, toi.billing_time,
+        toi.billing_user_id, toi.cancel_time
         from t_order_invoice toi
         <where>
+            <if test="query.id != null">
+                AND toi.id = #{query.id}
+            </if>
             <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
                 AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
             </if>
@@ -124,6 +160,9 @@
             </if>
             <if test="query.invoicingObjectType != null">
                 AND toi.invoicing_object_type = #{query.invoicingObjectType}
+            </if>
+            <if test="query.status != null">
+                AND toi.status = #{query.status}
             </if>
             <if test="query.invoiceMaterial != null">
                 AND toi.invoice_material = #{query.invoiceMaterial}
@@ -135,7 +174,7 @@
                 AND toi.name LIKE concat('%',#{query.name},'%')
             </if>
             <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
-                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
+                AND toi.create_time BETWEEN #{query.startTime} AND #{query.endTime}
             </if>
             <if test="query.userIds != null and query.userIds.size()>0">
                 AND toi.app_user_id IN
@@ -143,8 +182,19 @@
                     #{userId}
                 </foreach>
             </if>
+            <if test="query.siteId != null">
+                AND toi.site_id = #{query.siteId}
+            </if>
+            <if test="query.partnerId != null">
+                AND toi.partner_id = #{query.partnerId}
+            </if>
+            <if test="query.directOnly != null and query.directOnly == 1">
+                AND toi.site_id IN (
+                    SELECT id FROM charging_pile_service.t_site WHERE business_category = 1
+                )
+            </if>
         </where>
-        ORDER BY toi.billing_time DESC
+        ORDER BY toi.create_time DESC
     </select>
 
 </mapper>
diff --git a/sql/20260616_parking_lot_barrier_brand.sql b/sql/20260616_parking_lot_barrier_brand.sql
new file mode 100644
index 0000000..f2d7b07
--- /dev/null
+++ b/sql/20260616_parking_lot_barrier_brand.sql
@@ -0,0 +1,21 @@
+SET @column_exists := (
+    SELECT COUNT(1)
+    FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 't_parking_lot'
+      AND COLUMN_NAME = 'barrier_brand'
+);
+
+SET @ddl := IF(
+    @column_exists = 0,
+    'ALTER TABLE `t_parking_lot` ADD COLUMN `barrier_brand` int NULL DEFAULT NULL COMMENT ''barrier brand: 1=shunjie, 2=jilian'' AFTER `type`',
+    'SELECT 1'
+);
+
+PREPARE stmt FROM @ddl;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+UPDATE `t_parking_lot`
+SET `barrier_brand` = 2
+WHERE `barrier_brand` IS NULL;
diff --git a/sql/20260616_partner_type.sql b/sql/20260616_partner_type.sql
new file mode 100644
index 0000000..2b2e5ce
--- /dev/null
+++ b/sql/20260616_partner_type.sql
@@ -0,0 +1,21 @@
+SET @column_exists := (
+    SELECT COUNT(1)
+    FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 't_partner'
+      AND COLUMN_NAME = 'partner_type'
+);
+
+SET @ddl := IF(
+    @column_exists = 0,
+    'ALTER TABLE `t_partner` ADD COLUMN `partner_type` int NULL DEFAULT NULL COMMENT ''partner type: 1=partner, 2=site owner, 3=service provider'' AFTER `role_id`',
+    'SELECT 1'
+);
+
+PREPARE stmt FROM @ddl;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+
+UPDATE `t_partner`
+SET `partner_type` = 1
+WHERE `partner_type` IS NULL;
diff --git a/sql/20260617_accounting_strategy_partner.sql b/sql/20260617_accounting_strategy_partner.sql
new file mode 100644
index 0000000..3112ea4
--- /dev/null
+++ b/sql/20260617_accounting_strategy_partner.sql
@@ -0,0 +1,17 @@
+SET @column_exists := (
+    SELECT COUNT(1)
+    FROM information_schema.COLUMNS
+    WHERE TABLE_SCHEMA = DATABASE()
+      AND TABLE_NAME = 't_accounting_strategy'
+      AND COLUMN_NAME = 'partner_id'
+);
+
+SET @ddl := IF(
+    @column_exists = 0,
+    'ALTER TABLE `t_accounting_strategy` ADD COLUMN `partner_id` int NULL DEFAULT NULL COMMENT ''归属合作商id'' AFTER `site_id`',
+    'SELECT 1'
+);
+
+PREPARE stmt FROM @ddl;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
diff --git a/sql/20260618_order_invoice_v2.sql b/sql/20260618_order_invoice_v2.sql
new file mode 100644
index 0000000..1470bc2
--- /dev/null
+++ b/sql/20260618_order_invoice_v2.sql
@@ -0,0 +1,69 @@
+ALTER TABLE `charging_pile_order`.`t_order_invoice`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;
+
+CREATE INDEX `idx_order_invoice_site_id` ON `charging_pile_order`.`t_order_invoice` (`site_id`);
+CREATE INDEX `idx_order_invoice_partner_id` ON `charging_pile_order`.`t_order_invoice` (`partner_id`);
+CREATE INDEX `idx_order_invoice_status` ON `charging_pile_order`.`t_order_invoice` (`status`);
+
+ALTER TABLE `charging_pile_order`.`t_order_invoice_0`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;
+
+ALTER TABLE `charging_pile_order`.`t_order_invoice_1`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;
+
+ALTER TABLE `charging_pile_order`.`t_order_invoice_2`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;
+
+ALTER TABLE `charging_pile_order`.`t_order_invoice_3`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;
+
+ALTER TABLE `charging_pile_order`.`t_order_invoice_4`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;
+
+ALTER TABLE `charging_pile_order`.`t_order_invoice_5`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;
+
+ALTER TABLE `charging_pile_order`.`t_order_invoice_6`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;
+
+ALTER TABLE `charging_pile_order`.`t_order_invoice_7`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;
+
+ALTER TABLE `charging_pile_order`.`t_order_invoice_8`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;
+
+ALTER TABLE `charging_pile_order`.`t_order_invoice_9`
+    ADD COLUMN `site_id` int NULL COMMENT '归属电站id' AFTER `app_user_id`,
+    ADD COLUMN `partner_id` int NULL COMMENT '归属合作商id' AFTER `site_id`,
+    ADD COLUMN `remark` varchar(500) NULL COMMENT '备注' AFTER `mailbox`,
+    ADD COLUMN `cancel_time` datetime NULL COMMENT '取消时间' AFTER `billing_user_id`;

--
Gitblit v1.7.1